qtoctave-0.10.1/0000755000175000017500000000000011511434501012412 5ustar lucaslucasqtoctave-0.10.1/qtoctave_pkg/0000755000175000017500000000000011511434254015106 5ustar lucaslucasqtoctave-0.10.1/qtoctave-info-reader/0000755000175000017500000000000011511434254016436 5ustar lucaslucasqtoctave-0.10.1/qtoctave/0000755000175000017500000000000011511434254014245 5ustar lucaslucasqtoctave-0.10.1/easy_plot/0000755000175000017500000000000011511434253014415 5ustar lucaslucasqtoctave-0.10.1/simple_rcs/0000755000175000017500000000000011511434253014556 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/0000755000175000017500000000000011511434252014421 5ustar lucaslucasqtoctave-0.10.1/qtjs/0000755000175000017500000000000011511434252013376 5ustar lucaslucasqtoctave-0.10.1/widgetserver/0000755000175000017500000000000011511434254015131 5ustar lucaslucasqtoctave-0.10.1/install_scripts/0000755000175000017500000000000011511434252015632 5ustar lucaslucasqtoctave-0.10.1/qtoctave_pkg/src/0000755000175000017500000000000011511434254015675 5ustar lucaslucasqtoctave-0.10.1/qtoctave-info-reader/images/0000755000175000017500000000000011511434254017703 5ustar lucaslucasqtoctave-0.10.1/qtoctave-info-reader/test/0000755000175000017500000000000011511434254017415 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/0000755000175000017500000000000011511434253015033 5ustar lucaslucasqtoctave-0.10.1/qtoctave/cmake-modules/0000755000175000017500000000000011511434253016772 5ustar lucaslucasqtoctave-0.10.1/easy_plot/src/0000755000175000017500000000000011511434253015204 5ustar lucaslucasqtoctave-0.10.1/simple_rcs/src/0000755000175000017500000000000011511434253015345 5ustar lucaslucasqtoctave-0.10.1/simple_rcs/design/0000755000175000017500000000000011511434253016027 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/examples/0000755000175000017500000000000011511434253016240 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/qt4/0000755000175000017500000000000011511434253015132 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/doc/0000755000175000017500000000000011511434252015166 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/gtk2/0000755000175000017500000000000011511434252015270 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/0000755000175000017500000000000011511434252014143 5ustar lucaslucasqtoctave-0.10.1/qtjs/src/0000755000175000017500000000000011511434252014165 5ustar lucaslucasqtoctave-0.10.1/qtjs/qtjs/0000755000175000017500000000000011511434252014357 5ustar lucaslucasqtoctave-0.10.1/widgetserver/doc/0000755000175000017500000000000011511434254015676 5ustar lucaslucasqtoctave-0.10.1/widgetserver/widgetserver/0000755000175000017500000000000011511434254017643 5ustar lucaslucasqtoctave-0.10.1/qtoctave_pkg/src/images/0000755000175000017500000000000011511434254017142 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/scripts_octave/0000755000175000017500000000000011511434254020064 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/svgcanvas/0000755000175000017500000000000011511434254017027 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/images/0000755000175000017500000000000011511434254016301 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/projects/0000755000175000017500000000000011511434254016665 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/config_files/0000755000175000017500000000000011511434254017463 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/octave_doc/0000755000175000017500000000000011511434254017142 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/scripts/0000755000175000017500000000000011511434253016522 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/doc/0000755000175000017500000000000011511434253015600 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/dynamic_help/0000755000175000017500000000000011511434253017467 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/0000755000175000017500000000000011511434253016162 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/lang/0000755000175000017500000000000011511434253015754 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/operations/0000755000175000017500000000000011511434253017216 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/qtoctave_doc/0000755000175000017500000000000011511434253017506 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/syntax_files/0000755000175000017500000000000011511434253017543 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/examples/octave/0000755000175000017500000000000011511434253017521 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/examples/python/0000755000175000017500000000000011511434253017561 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/qt4/src/0000755000175000017500000000000011511434253015721 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/images/0000755000175000017500000000000011511434252015410 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/espanol/0000755000175000017500000000000011511434252015604 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/ejemplos/0000755000175000017500000000000011511434252015761 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/english/0000755000175000017500000000000011511434252015574 5ustar lucaslucasqtoctave-0.10.1/widgetserver/doc/doc_api/0000755000175000017500000000000011511434254017274 5ustar lucaslucasqtoctave-0.10.1/widgetserver/doc/tutorial/0000755000175000017500000000000011511434254017541 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/doc/images/0000755000175000017500000000000011511434253017045 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Analysis/0000755000175000017500000000000011511434253017745 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Data/0000755000175000017500000000000011511434253017033 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Equations/0000755000175000017500000000000011511434253020132 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Help/0000755000175000017500000000000011511434253017052 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Statistics/0000755000175000017500000000000011511434253020314 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Plot/0000755000175000017500000000000011511434253017100 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Matrix/0000755000175000017500000000000011511434253017426 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/examples/octave/hook/0000755000175000017500000000000011511434253020461 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/examples/octave/window_button/0000755000175000017500000000000011511434253022423 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/examples/python/xrcs/0000755000175000017500000000000011511434253020540 5ustar lucaslucasqtoctave-0.10.1/xmlwidget/qt4/src/widgets/0000755000175000017500000000000011511434252017366 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/espanol/images/0000755000175000017500000000000011511434252017051 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/espanol/ejemplos/0000755000175000017500000000000011511434252017422 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/ejemplos/sombrero/0000755000175000017500000000000011511434252017611 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/english/examples/0000755000175000017500000000000011511434252017412 5ustar lucaslucasqtoctave-0.10.1/widgetserver/doc/tutorial/html/0000755000175000017500000000000011511434254020505 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Analysis/Integrate function/0000755000175000017500000000000011511434253023475 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Analysis/Ordinary Differential Equations/0000755000175000017500000000000011511434253026042 5ustar lucaslucasqtoctave-0.10.1/qtoctave/src/menus/Plot/Export/0000755000175000017500000000000011511434253020361 5ustar lucaslucasqtoctave-0.10.1/qtjs/doc/espanol/ejemplos/sombrero/0000755000175000017500000000000011511434252021252 5ustar lucaslucasqtoctave-0.10.1/install.sh0000755000175000017500000000064211511434230014420 0ustar lucaslucas cmake "-DCMAKE_INSTALL_PREFIX:PATH=/usr/local" . #cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -s -march=pentium4 -mtune=pentium4 -Wall -pipe" "-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/opt/binaries/qtoctave-0.8.2" "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" . #cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -s -Wall -pipe" '-DCMAKE_INSTALL_PREFIX:PATH=./qtoctave-0.9.1' "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" . make make install qtoctave-0.10.1/clean.sh0000755000175000017500000000055211511434230014034 0ustar lucaslucas#!/bin/bash function clean_files() { for p in "$@" ; do echo "Cleaning " "$p" for a in `find . -name "$p"`; do echo $a rm -Rf $a done done } echo "Cleaning files" make clean clean_files CMakeFiles _CPack_Packages CMakeCache.txt cmake_install.cmake install_manifest.txt CPackConfig.cmake CPackSourceConfig.cmake '*~' clean Makefile rm -Rf src qtoctave-0.10.1/CMakeLists.txt0000644000175000017500000000260711511434230015156 0ustar lucaslucasCMAKE_MINIMUM_REQUIRED(VERSION 2.4) # The name of our project is "QTOCTAVE". CMakeLists files in this project can # refer to the root source directory of the project as ${QTOCTAVE_SOURCE_DIR} and # to the root binary directory of the project as ${QTOCTAVE_BINARY_DIR}. project (qtoctave) #include ("options.txt") #SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/qtoctave/cmake-modules/) IF (NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE Release) ENDIF (NOT CMAKE_BUILD_TYPE) #Uncoment to Verbose mode #set(CMAKE_VERBOSE_MAKEFILE TRUE) ADD_DEFINITIONS(-DUSER_CONFIG) FIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") MESSAGE (STATUS "Qt version : ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}") SET(QT_USE_QTXML 1) include(UseQt4) if( NOT ${QT_VERSION_MAJOR} EQUAL 4 OR NOT ${QT_VERSION_MINOR} GREATER 5 ) MESSAGE (FATAL_ERROR "Qt version 4.6 or 4.7 required.\n" "Qt version installed is: ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}\n" "Please install required version.\n" ) endif( NOT ${QT_VERSION_MAJOR} EQUAL 4 OR NOT ${QT_VERSION_MINOR} GREATER 5 ) add_subdirectory (qtoctave_pkg/src) add_subdirectory (xmlwidget/qt4) add_subdirectory (easy_plot) add_subdirectory (simple_rcs) add_subdirectory (qtjs) add_subdirectory (qtoctave-info-reader) add_subdirectory (qtoctave) # install ( # TARGETS src/config_files/qtoctave # RUNTIME DESTINATION bin # ) qtoctave-0.10.1/leeme.txt0000644000175000017500000000123011511434226014242 0ustar lucaslucasInstrucciones de instalación de QtOctave. Para compilar QtOctave será necesario tener instalados: * La biblioteca Qt 4, con sus paquetes de desarrollo. Se necesita la versión 4.6.0 o superior. * El programa Octave. Versión 3.2.0 o superior. * El programa cmake. Para realizar la instalación ejecutar: tar xvzf qtoctave-xxx.tar.gz cd qtoctave-xxx mkdir build cd build cmake .. # si deseas especificar el directorio de instalación (por ejemplo tu $HOME, si no eres root), # Se puede escribir: "cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/algún/path" make make install Posiblemente se deba hacer como usuario root (depende del directorio de instalación). qtoctave-0.10.1/build.sh0000755000175000017500000000036111511434226014054 0ustar lucaslucas #cmake "-DCMAKE_INSTALL_PREFIX:PATH=/tmp/qtoctave-0.9.1" . cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -s -march=i686 -mtune=i686 -Wall -pipe" "-DCMAKE_INSTALL_PREFIX:PATH=/opt/qtoctave" "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" . #make install qtoctave-0.10.1/LICENSE_GPL.txt0000644000175000017500000004367011511434226014755 0ustar lucaslucas The QtOctave is Copyright (C) 2006, 2007, 2008, 2009 P.L. Lucas You may use, distribute and copy the QtOctave under the terms of GNU General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ------------------------------------------------------------------------- qtoctave-0.10.1/readme.txt0000644000175000017500000000121611511434226014414 0ustar lucaslucasINSTALL. QtOctave requires: * Qt4 library and Qt4 devel packages. Version 4.6.0 or better. * Octave program. Version 3.2.0 or better. (http://www.gnu.org/software/octave/) * cmake program. (http://www.cmake.org/) * a C++ - compiler, eg. the GNU compiler (http://gcc.gnu.org/) For building QtOctave from source execute: tar xvzf qtoctave-xxx.tar.gz cd qtoctave-xxx mkdir build cd build cmake .. # if you want a specific install-path (for example your $HOME directory, if you are not root), # you can do "cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/some/path" make make install Maybe you should be root user when installing (it depends on install path). qtoctave-0.10.1/qtoctave_pkg/octave-forge.xml0000644000175000017500000015673211511434231020222 0ustar lucaslucas Octave-Forge Octave-Forge is a central location for the collaborative development of packages for GNU Octave. The Octave-forge packages contains the source for all the functions and are designed to work with the Octave package system. In general the packages are designed to work with the latest development version of Octave, but it should be possible to use most packages with earlier versions. http://octave.sourceforge.net/ Actuarial 1.1.0 http://downloads.sourceforge.net/octave/actuarial-1.1.0.tar.gz?download Name: Actuarial Version: 1.1.0<br> Date: 2009-07-23<br> Author: Act. Esteban Cervetto ARG <estebancster@gmail.com><br> Maintainer: Act. Esteban Cervetto ARG <estebancster@gmail.com><br> Title: Actuarial.<br> Description: Actuarial functions for Casualty and Property lines.<br> Depends: octave (>= 3.0.1)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> #I am an Actuary from Argentina. <br> #If you are looking for an Actuary<br> #If you are an idea to develop<br> #if you only want to talk about the actuarial career<br> #email me please.<br> #Actually, I speak Spanish.<br> AD 1.0.6 http://downloads.sourceforge.net/octave/ad-1.0.6.tar.gz?download Name: AD Version: 1.0.6<br> Date: 2009-05-03<br> Author: Thomas Kasper<br> Maintainer: Thomas Kasper<br> Title: AD.<br> Description: Automatic Forward Differentiation<br> Categories: Calculus<br> Depends: octave (>= 3.0)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://home.cs.tum.edu/~kasper/ad<br> Calculus Audio 1.1.4 http://downloads.sourceforge.net/octave/audio-1.1.4.tar.gz?download Name: Audio Version: 1.1.4<br> Date: 2009-05-03<br> Author: Paul Kienzle<br> Maintainer: Paul Kienzle<br> Title: Audio<br> Description: Audio recording, processing and playing tools.<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> benchmark 1.1.1 http://downloads.sourceforge.net/octave/benchmark-1.1.1.tar.gz?download Name: benchmark Version: 1.1.1<br> Date: 2009-04-15<br> Author: Octave community<br> Title: Benchmarks for Octave<br> Maintainer: Jaroslav Hajek (highegg@gmail.com)<br> Description: The package contains code used to benchmark speed of Octave.<br> License: GPL v2<br> Depends: octave (>= 2.9.7)<br> bim 1.0.0 http://downloads.sourceforge.net/octave/bim-1.0.0.tar.gz?download Name: bim Version: 1.0.0<br> Date: 2010-02-09<br> Author: Carlo de Falco, Culpo Massimiliano<br> Maintainer: Culpo Massimiliano<br> Title: PDE Solver using a Finite Element/Finite Volume approach<br> Description: Package for solving Diffusion Advection Reaction (DAR) Partial Differential Equations based on the Finite Volume Scharfetter-Gummel (FVSG) method a.k.a Box Integration Method (BIM)<br> Depends: octave (>= 3.0.0), fpl, msh <br> Autoload: no<br> License: GPL version 2 or later<br> SVNRelease: 6866<br> bioinfo 0.1.2 http://downloads.sourceforge.net/octave/bioinfo-0.1.2.tar.gz?download Name: bioinfo Version: 0.1.2<br> Date: 2009-05-06<br> Author: Bill Denney <bill@denney.ws><br> Maintainer: Bill Denney <bill@denney.ws><br> Title: Bioinformatics<br> Description: Bioinformatics manipulation<br> Categories: Bioinformatics<br> Depends: octave (>= 3.0.0)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Bioinformatics Civil-Engineering 1.0.7 http://downloads.sourceforge.net/octave/civil-engineering-1.0.7.tar.gz?download Name: Civil-Engineering Version: 1.0.7<br> Date: 2008-08-23<br> Author: Matthew W. Roberts<br> Maintainer: The Octave Community<br> Title: Civil Engineering<br> Description: Functions to solution some ODE's in Civil Engineering.<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Combinatorics 1.0.9 http://downloads.sourceforge.net/octave/combinatorics-1.0.9.tar.gz?download Name: Combinatorics Version: 1.0.9<br> Date: 2009-05-18<br> Author: Torsten Finke <fi@igh-essen.com><br> Maintainer: Torsten Finke <fi@igh-essen.com><br> Title: Combinatorics.<br> Description: Combinatorics functions, incuding partitioning.<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Communications 1.0.10 http://downloads.sourceforge.net/octave/communications-1.0.10.tar.gz?download Name: Communications Version: 1.0.10<br> Date: 2009-05-14<br> Author: David Bateman<br> Maintainer: David Bateman<br> Title: Communications.<br> Description: Digital Communications, Error Correcting Codes (Channel Code), Source Code functions, Modulation and Galois Fields<br> Depends: octave (> 3.1.54), signal (>= 1.0.0)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Control 1.0.11 http://downloads.sourceforge.net/octave/control-1.0.11.tar.gz?download Name: Control Version: 1.0.11<br> Date: 2009-02-11<br> Author: Ben Sapp<br> Maintainer: Luca Favatella <slackydeb@gmail.com><br> Title: Control.<br> Description: Additional Octave Control tools<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> data-smoothing 1.2.0 http://downloads.sourceforge.net/octave/data-smoothing-1.2.0.tar.gz?download Name: data-smoothing Version: 1.2.0<br> Date: 2009-04-28<br> Author: Jonathan Stickel<br> Maintainer: Jonathan Stickel<br> Title: Data smoothing<br> Description: Algorithms for smoothing noisy data<br> Categories: Data-smoothing<br> Depends: octave (>= 2.9.7), optim (>= 1.0.3)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Data-smoothing database 1.0.4 http://downloads.sourceforge.net/octave/database-1.0.4.tar.gz?download Name: database Version: 1.0.4<br> Date: 2009-01-09<br> Author: Xavier Delacour<br> Maintainer: Xavier Delacour<br> Title: Bindings for postgres, mysql, sqlite, and standard ODBC<br> Description: These are bindings that allow SQL queries and other database operations on postgres, mysql, sqlite, and standard ODBC databases from within Octave. A simplified interface that is uniform across all database types is provided, as well as the entire C client API for each database (libpq, libmysqlclient, etc).<br> Depends: octave (>= 2.9.12)<br> Autoload: yes<br> SystemRequirements: swig, postgresql-8.2, postgresql-client-8.2, mysql-common, mysql-client-5.0, mysql-server-5.0, libmysqlclient15-dev, sqlite3, libsqlite3-dev, unixodbc-bin, unixodbc-dev, odbc-postgresql.<br> License: BSD, GPL2<br> Url: http://octave.sf.net<br> Econometrics 1.0.8 http://downloads.sourceforge.net/octave/econometrics-1.0.8.tar.gz?download Name: Econometrics Version: 1.0.8<br> Date: 2009-05-03<br> Author: Michael Creel <michael.creel@uab.es><br> Maintainer: Michael Creel <michael.creel@uab.es><br> Title: Econometrics.<br> Description: Econometrics functions including MLE and GMM based techniques.<br> Depends: octave (>= 2.9.7), optim<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Engine 1.0.9 http://downloads.sourceforge.net/octave/engine-1.0.9.tar.gz?download Name: Engine Version: 1.0.9<br> Date: 2009-05-03<br> Author: Jesse Bennett <jesse@seas.smu.edu><br> Maintainer: Paul Kienzle<br> Title: Engine<br> Description: An external interface library for Octave<br> Categories: engine, External<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> engine, External es 0.0.4 http://downloads.sourceforge.net/octave/es-0.0.4.tar.gz?download Name: es Version: 0.0.4<br> Date: 2010-04-25<br> Author: Javier Enciso<br> Maintainer: Edwin Moreno, Javier Enciso<br> Title: Spanish translation package<br> Description: Spanish package for the construction of native language<br> translations of Octave functions.<br> Categories: languages<br> License: GPL version 2 or later<br> Url: http://octave.sourceforge.net/<br> Autoload: yes<br> Depends: octave (> 2.9.9)<br> SVNRelease: 7242<br> languages fenv 0.1.0 http://downloads.sourceforge.net/octave/fenv-0.1.0.tar.gz?download Name: fenv Version: 0.1.0<br> Date: 2008-10-10<br> Author: Grzegorz Timoszuk (gtimoszuk@gmail.com)<br> Maintainer: Grzegorz Timoszuk (gtimoszuk@gmail.com)<br> Title: Floating point environment<br> Description: On supported architectures, change the rounding mode of the floating point arithmetics (to nearest, up, down, to zero) or change the precision of the arithmetical operations (single, double, double extended). Experimentally test the properties of the floating point arithmetics.<br> Categories: floating point environment<br> Depends: octave (>= 3.0.0)<br> Autoload: yes<br> License: GPL version 3<br> Url: http://octave.sf.net<br> floating point environment financial 0.3.2 http://downloads.sourceforge.net/octave/financial-0.3.2.tar.gz?download Name: financial Version: 0.3.2<br> Date: 2008-08-17<br> Author: Bill Denney <bill@denney.ws>, Kurt Hornik <Kurt.Hornik@wu-wien.ac.at><br> Maintainer: Bill Denney <bill@denney.ws><br> Title: Financial<br> Description: Financial manipulation and plotting functions<br> Categories: Financial<br> Depends: octave (>= 3.0.0), time (>= 1.0.5), miscellaneous (>= 1.0.6)<br> Autoload: yes<br> License: GPL version 3 and GPL version 2 or later<br> Url: http://octave.sf.net<br> Financial fpl 1.2.0 http://downloads.sourceforge.net/octave/fpl-1.2.0.tar.gz?download Name: fpl Version: 1.2.0<br> Date: 2010-06-12<br> Author: Carlo de Falco, Massimiliano Culpo<br> Maintainer: Carlo de Falco, Massimiliano Culpo<br> Title: Fem PLotting<br> Description: Collection of routines to save data in different graphical formats.<br> Categories: Graphics<br> Depends: octave ( >= 3.0.0 )<br> License: GNU/GPL <br> SystemRequirements: dx ( >= 4.3.2), sed, bash<br> SVNRelease: 7425<br> Graphics ga 0.9.8 http://downloads.sourceforge.net/octave/ga-0.9.8.tar.gz?download Name: ga Version: 0.9.8<br> Date: 2010-06-24<br> Author: Luca Favatella <slackydeb@gmail.com><br> Maintainer: Luca Favatella <slackydeb@gmail.com><br> Title: Genetic Algorithm and Direct Search<br> Description: Genetic optimization code<br> Categories: Optimization<br> Depends: octave (>= 2.9.7), communications (>= 1.0.0)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Optimization General 1.2.1 http://downloads.sourceforge.net/octave/general-1.2.1.tar.gz?download Name: General Version: 1.2.1<br> Date: 2010-03-12<br> Author: Jaroslav Hajek<br> Maintainer: Jaroslav Hajek<br> Title: General<br> Description: General tools for octave. String dictionary, parallel computing.<br> Categories: General<br> Depends: octave (>= 3.2.4)<br> Autoload: yes<br> License: GPL version 3 or later<br> Url: http://octave.sf.net<br> General generate_html 0.1.3 http://downloads.sourceforge.net/octave/generate_html-0.1.3.tar.gz?download Name: generate_html Version: 0.1.3<br> Date: 2010-02-25<br> Author: Søren Hauberg<br> Maintainer: Søren Hauberg<br> Title: Generate HTML web page from help texts<br> Description: This package provides functions for generating HTML pages that<br> contain the help texts for a set of functions. The package is designed to be<br> as general as possible, but also contains convenience functions for generating<br> a set of pages for entire packages.<br> Depends: octave (>= 3.2.0)<br> SystemRequirements: makeinfo<br> License: GPL version 3 or later<br> Gnuplot 1.0.1 http://downloads.sourceforge.net/octave/gnuplot-1.0.1.tar.gz?download Name: Gnuplot Version: 1.0.1<br> Date: 2010-02-07<br> Author: Etienne Grossmann<br> Maintainer: Etienne Grossmann<br> Title: Gnuplot wrappers for octave<br> Description: Scripts to save data in gnuplot-readable formats,<br> specify gnuplot commands that will be used to produce graphics, and<br> call gnuplot. See help g_ez quickly produce the most common plots.<br> Categories: graphics<br> Depends: octave (>= 3.0.0)<br> SystemRequirements: gnuplot (>= 4.0)<br> BuildRequires: gnuplot (>= 4.0)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> graphics GPC 0.1.7 http://downloads.sourceforge.net/octave/gpc-0.1.7.tar.gz?download Name: GPC Version: 0.1.7<br> Date: 2006-08-05<br> Author: Rafael Laboissiere <rafael@laboissiere.net><br> Maintainer: Rafael Laboissiere <rafael@laboissiere.net><br> Title: General Polygon Clipper<br> Description: Add a description to this package!<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later (Underlying library Non Distributable!!!!)<br> Url: http://octave.sf.net<br> GSL 1.0.8 http://downloads.sourceforge.net/octave/gsl-1.0.8.tar.gz?download Name: GSL Version: 1.0.8<br> Date: 2009-05-03<br> Author: Teemu Ikonen <tpikonen@pcu.helsinki.fi><br> Maintainer: Teemu Ikonen <tpikonen@pcu.helsinki.fi><br> Title: GNU Scientific Library.<br> Description: Octave bindings to the GNU Scientific Library<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> BuildRequires: gsl-devel<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> # Version 1.0.5 -> Version 1.0.6 Ray Rogers rrogers@@plaidheron.com<br> Ident 1.0.7 http://downloads.sourceforge.net/octave/ident-1.0.7.tar.gz?download Name: Ident Version: 1.0.7<br> Date: 2009-05-06<br> Author: Paul Kienzle<br> Maintainer: Paul Kienzle<br> Title: System Indentification.<br> Description: Addition System Indentification Control functions.<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Image 1.0.13 http://downloads.sourceforge.net/octave/image-1.0.13.tar.gz?download Name: Image Version: 1.0.13<br> Date: 2010-05-22<br> Author: Various Authors<br> Maintainer: Soren Hauberg<br> Title: Image Processing<br> Description: The Octave-forge Image package provides functions for<br> processing images.<br> The package also provides functions for feature extraction, image<br> statistics, spatial and geometric transformations, morphological<br> operations, linear filtering, and much more.<br> Depends: octave (>= 3.2.0)<br> Autoload: yes<br> BuildRequires: png-devel<br> BuildRequires: jpeg-devel<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> InformationTheory 0.1.8 http://downloads.sourceforge.net/octave/informationtheory-0.1.8.tar.gz?download Name: InformationTheory Version: 0.1.8<br> Date: 2009-05-03<br> Author: Muthiah Annamalai<br> Maintainer: Muthiah Annamalai<br> Title: Information Theory<br> Description: Functions and routines for basic Information Theory definitions, and source coding.<br> Categories: Information Theory<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Information Theory Integration 1.0.7 http://downloads.sourceforge.net/octave/integration-1.0.7.tar.gz?download Name: Integration Version: 1.0.7<br> Date: 2009-05-03<br> Author: Howard Wilson & Bryce Gardner<br> Maintainer: The Octave Community<br> Title: Numerical Integration Toolbox<br> Description: Toolbox for 1-D, 2-D, and n-D Numerical Integration<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> io 1.0.12 http://downloads.sourceforge.net/octave/io-1.0.12.tar.gz?download Name: io Version: 1.0.12<br> Date: 2010-04-13<br> Author: Various Authors<br> Maintainer: The Octave Community<br> Title: Input/Output<br> Description: Input/Output in external formats.<br> Categories: IO<br> Depends: octave (>= 3.2.0)<br> Suggested: java-1.2.7+ f Windows, windows-1.0.8+ f Windows, java-1.2.5 f linux<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> IO IRSA 1.0.7 http://downloads.sourceforge.net/octave/irsa-1.0.7.tar.gz?download Name: IRSA Version: 1.0.7<br> Date: 2009-05-06<br> Author: Joerg Huber<br> Maintainer: Joerg Huber<br> Title: Irregular sampling analysis.<br> Description: Irregular sampling analysis.<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Java 1.2.7 http://downloads.sourceforge.net/octave/java-1.2.7.tar.gz?download Name: Java Version: 1.2.7<br> Date: 2010-03-04<br> Author: Michael Goffioul <michael.goffioul@gmail.com><br> Maintainer: Michael Goffioul <michael.goffioul@gmail.com><br> Title: Java Interface<br> Description: Provides Java interface with OO-like Java objects manipulation<br> Categories: Java<br> Depends: octave (>= 3.2.0)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Java Linear-Algebra 2.0.0 http://downloads.sourceforge.net/octave/linear-algebra-2.0.0.tar.gz?download Name: Linear-Algebra Version: 2.0.0<br> Date: 2009-05-18<br> Author: Various Authors<br> Maintainer: Jaroslav Hajek<br> Title: Linear Algebra.<br> Description: Additional linear algebra code, including general SVD and matrix functions.<br> Categories: Linear-Algebra<br> Depends: octave (>= 3.2.3)<br> Autoload: yes<br> License: GPL version 3 or later<br> Url: http://octave.sf.net<br> Linear-Algebra Mapping 1.0.7 http://downloads.sourceforge.net/octave/mapping-1.0.7.tar.gz?download Name: Mapping Version: 1.0.7<br> Date: 2009-05-06<br> Author: Andrew Collier <abcollier@users.sourceforge.net><br> Maintainer: The Octave Community<br> Title: Mapping Functions<br> Description: Simple Mapping functions. <br> Categories: Mathematics<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Mathematics Miscellaneous 1.0.9 http://downloads.sourceforge.net/octave/miscellaneous-1.0.9.tar.gz?download Name: Miscellaneous Version: 1.0.9<br> Date: 2009-05-03<br> Author: Various Authors<br> Maintainer: The Octave Community<br> Title: Miscellaneous functions<br> Description: Miscellaneous tools including waitbar, xml tools, etc<br> Categories: Miscellaneous<br> Depends: octave (>= 2.9.16)<br> Autoload: yes<br> SystemRequirements: units<br> BuildRequires: termcap-devel<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Miscellaneous missing-functions 1.0.2 http://downloads.sourceforge.net/octave/missing-functions-1.0.2.tar.gz?download Name: missing-functions Version: 1.0.2<br> Date: 2009-05-06<br> Author: Bill Denney <bill@denney.ws><br> Maintainer: Bill Denney <bill@denney.ws><br> Title: Missing Functions<br> Description: Find functions that are in Matlab but not in Octave.<br> Categories: Missing<br> Depends: octave (>= 3.0.0)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Missing msh 1.0.1 http://downloads.sourceforge.net/octave/msh-1.0.1.tar.gz?download Name: msh Version: 1.0.1<br> Date: 2010-03-30<br> Author: Carlo de Falco, Massimiliano Culpo<br> Maintainer: Carlo de Falco, Massimiliano Culpo<br> Title: MeSHing software package for octave<br> Description: Create and manage triangular and tetrahedral meshes for Finite Element or Finite Volume PDE solvers. Use a mesh data structure compatible with PDEtool. Rely on gmsh for unstructured mesh generation.<br> Depends: octave (>= 3.0), splines<br> SystemRequirements: gmsh (>= 1.6.5), awk<br> Autoload: no<br> License: GPL version 2 or later<br> Url: http://www.geuz.org/gmsh<br> SVNRelease: 7141<br> Multicore 0.2.15 http://downloads.sourceforge.net/octave/multicore-0.2.15.tar.gz?download Name: Multicore Version: 0.2.15<br> Date: 2009-05-06<br> Author: Markus Buehren <mb_matlab@gmx.de><br> Maintainer: Markus Buehren, Chuong Nguyen and the Octave Community<br> Title: Parallel Processing on Multiple Cores<br> Description: An Octave-forge package providing functions for<br> parallel processing on multiple cores.<br> Categories: parallel processing<br> Depends: octave (>= 2.9.12)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> parallel processing NaN 1.0.9 http://downloads.sourceforge.net/octave/nan-1.0.9.tar.gz?download Name: NaN Version: 1.0.9<br> Date: 2009-05-03<br> Author: Alois Schloegl <a.schloegl@ieee.org><br> Maintainer: Matthew W. Roberts<br> Title: NaN statisical toolbox<br> Description: Missing value statistical toolbox<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later<br> Url: http://www.dpmi.tu-graz.ac.at/~schloegl/matlab/NaN<br> NLWing2 1.2.0 http://downloads.sourceforge.net/octave/nlwing2-1.2.0.tar.gz?download Name: NLWing2 Version: 1.2.0<br> Date: 2009-03-02<br> Author: Jaroslav Hajek <highegg@gmail.com><br> Title: Nonlinear Lifting Line for Wings <br> Maintainer: Jaroslav Hajek <highegg@gmail.com><br> Description: This package allows efficient computation of nonlinear aerodynamic<br> properties of a wing. It employs 2D section data to build a 3D potential vortex<br> model of the flow. It uses a robust Euler-Newton method to track the change of<br> flow vorticity quantities as the angle of attack progresses.<br> License: GPL v3<br> Depends: octave (>= 3.0.0)<br> nnet 0.1.12 http://downloads.sourceforge.net/octave/nnet-0.1.12.tar.gz?download Name: nnet Version: 0.1.12<br> Date: 2010-04-11<br> Author: Michael Schmid<br> Maintainer: Michael Schmid<br> Title: Neural Networks<br> Description: A feed forward multi-layer neural network.<br> Depends: octave (>= 3.0.0)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Url: http://octnnettb.sourceforge.net<br> Nurbs 1.2.0 http://downloads.sourceforge.net/octave/nurbs-1.2.0.tar.gz?download Name: Nurbs Version: 1.2.0<br> Date: 2010-06-13<br> Author: Mark Spink, Daniel Claxton, Carlo de Falco, Rafael Vazquez<br> Maintainer: Carlo de Falco<br> Title: Nurbs.<br> Description: Collection of routines for the creation, and manipulation of Non-Uniform Rational B-Splines (NURBS).<br> Categories: splines<br> Depends: octave (>= 3.2)<br> Autoload: no<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> SVNRelease: 7427<br> splines OCS 0.1.0 http://downloads.sourceforge.net/octave/ocs-0.1.0.tar.gz?download Name: OCS Version: 0.1.0<br> Date: 2010-02-09<br> Author: Carlo de Falco, Culpo Massimiliano<br> Maintainer: Culpo Massimiliano<br> Title: Octave Circuit Simulator<br> Description: Package for solving DC and transient electrical circuit equations <br> Depends: octave (>= 3.0.0), odepkg<br> Autoload: no<br> License: GPL version 2 or later<br> SVNRelease: 6866<br> Oct2Mat 1.0.7 http://downloads.sourceforge.net/octave/oct2mat-1.0.7.tar.gz?download Name: Oct2Mat Version: 1.0.7<br> Date: 2008-08-23<br> Author: Paul Kienzle<br> Maintainer: Alois Schloegl<br> Title: Oct2Mat<br> Description: convert m-file into matlab-compatible coding style<br> Categories: graphics<br> Depends: octave (>= 2.9.7), io (>= 1.0.0)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> graphics octcdf 1.1.0 http://downloads.sourceforge.net/octave/octcdf-1.1.0.tar.gz?download Name: octcdf Version: 1.1.0<br> Date: 2010-04-27<br> Author: Alexander Barth <barth.alexander@gmail.com><br> Maintainer: Alexander Barth <barth.alexander@gmail.com><br> Title: octcdf<br> Description: A NetCDF interface for octave<br> Depends: octave (>= 3.3.51)<br> Autoload: yes<br> BuildRequires: netcdf-devel<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> OctGPR 1.1.5 http://downloads.sourceforge.net/octave/octgpr-1.1.5.tar.gz?download Name: OctGPR Version: 1.1.5<br> Date: 2008-04-29<br> Author: Jaroslav Hajek (highegg@gmail.com)<br> Title: Package for full dense Gaussian Process Regression<br> Maintainer: Jaroslav Hajek (highegg@gmail.com)<br> Description: The package allows interpolating and smoothing scattered <br> multidimensional data using Gaussian Process Regression (also known<br> as Kriging). <br> License: GPL v2<br> Depends: octave (>= 2.9.7)<br> OctPROJ 1.0.0 http://downloads.sourceforge.net/octave/octproj-1.0.0.tar.gz?download Name: OctPROJ Version: 1.0.0<br> Date: 2010-02-06<br> Author: José Luis García Pallero, <jgpallero@gmail.com><br> Maintainer: José Luis García Pallero, <jgpallero@gmail.com><br> Title: GNU Octave bindings to PROJ.4<br> Description: This package allows to call functions of PROJ.4 library for<br> cartographic projections transformations.<br> Depends: Octave (>= 2.9.7)<br> Url: http://trac.osgeo.org/proj/ http://octave.sourceforge.net/index.html<br> Autoload: yes<br> License: GPL version 3 or later (PROJ.4 is under MIT license)<br> SystemRequirements: libproj-dev (>= 4.7.0) (Debian system)<br> odebvp 1.0.6 http://downloads.sourceforge.net/octave/odebvp-1.0.6.tar.gz?download Name: odebvp Version: 1.0.6<br> Date: 2009-05-06<br> Author: Tiago Charters de Azevedo<br> Maintainer: Tiago Charters de Azevedo<br> Title: Linear-difference method for linear odes - boundary-value problem<br> Description: To approximate the solution of the boundary-value problem y''=p(x)*y' + q(x)*y + r(x), a<=x<=b, y(a)=alpha, y(b)=beta by the linear finite-diffence method.<br> Categories: Ordinary Differential Equations<br> Autoload: yes<br> Depends: octave (>= 2.9.9)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Ordinary Differential Equations OdePkg 0.6.10 http://downloads.sourceforge.net/octave/odepkg-0.6.10.tar.gz?download Name: OdePkg Version: 0.6.10<br> Date: 2010-02-14<br> Author: Thomas Treichl<br> Maintainer: Thomas Treichl<br> Title: OdePkg.<br> Description: A package for solving ordinary differential equations and more. <br> Categories: Differential Equations<br> Depends: octave (>= 3.2.0)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Differential Equations openmpi_ext 1.0.2 http://downloads.sourceforge.net/octave/openmpi_ext-1.0.2.tar.gz?download Name: openmpi_ext Version: 1.0.2<br> Date: 2010-6-17<br> Author: Riccardo Corradini <riccardocorradini@yahoo.it> and the Octave Community<br> Maintainer: Riccardo Corradini <riccardocorradini@yahoo.it><br> Title: openmpi_ext<br> Description: MPI functions for parallel computing using simple MPI Derived Datatypes.<br> Depends: octave (>= 3.2.4)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Optim 1.0.12 http://downloads.sourceforge.net/octave/optim-1.0.12.tar.gz?download Name: Optim Version: 1.0.12<br> Date: 2009-09-21<br> Author: Various Authors<br> Maintainer: The Octave Community<br> Title: Optimzation.<br> Description: Non-linear optimization toolkit.<br> Depends: octave (>= 2.9.7), miscellaneous (>= 1.0.0)<br> Autoload: yes<br> License: GPL version 2 or later and GFDL<br> Url: http://octave.sf.net<br> optiminterp 0.3.2 http://downloads.sourceforge.net/octave/optiminterp-0.3.2.tar.gz?download Name: optiminterp Version: 0.3.2<br> Date: 2009-05-03<br> Author: Alexander Barth <abarth@marine.usf.edu>, Aida Alvera-Azcrate <aalvera@marine.usf.edu><br> Maintainer: Alexander Barth <abarth@marine.usf.edu><br> Title: optiminterp<br> Description: An optimal interpolation toolbox for octave. This package provides functions to perform a n-dimensional optimal interpolations of arbitrarily distributed data points.<br> Depends: octave (>= 2.9.9)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Outliers 0.13.9 http://downloads.sourceforge.net/octave/outliers-0.13.9.tar.gz?download Name: Outliers Version: 0.13.9<br> Date: 2009-05-06<br> Author: Lukasz Komsta<br> Maintainer: Lukasz Komsta<br> Title: Outlier Detection<br> Description: Grubbs, Dixon and Cochran tests for outlier detection<br> and p-value approximating routines.<br> Categories: outlier detection, statistics<br> Depends: octave (>= 2.9.9)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://www.komsta.net/<br> outlier detection, statistics Parallel 2.0.1 http://downloads.sourceforge.net/octave/parallel-2.0.1.tar.gz?download Name: Parallel Version: 2.0.1<br> Date: 2010-02-09<br> Author: Hayato Fujiwara and Olaf Till <olaf.till@uni-jena.de><br> Maintainer: Hayato Fujiwara and Olaf Till <olaf.till@uni-jena.de><br> Title: Parallel Computing.<br> Description: Parallel execution package for cluster computers. For<br> parallel execution on a single machine see e.g. function parcellfun<br> (author: Jaroslav Hajek) in package general.<br> Depends: octave (>= 3.0.0)<br> Autoload: yes<br> License: GPL, see individual files for GPL version<br> Url: http://octave.sf.net<br> PDB 1.0.7 http://downloads.sourceforge.net/octave/pdb-1.0.7.tar.gz?download Name: PDB Version: 1.0.7<br> Date: 2009-05-06<br> Author: Teemu Ikonen<br> Maintainer: Teemu Ikonen<br> Title: PDB protien database<br> Description: Reads and display PDB-files from the Brookhaven protein databank<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> PhysicalConstants 0.1.7 http://downloads.sourceforge.net/octave/physicalconstants-0.1.7.tar.gz?download Name: PhysicalConstants Version: 0.1.7<br> Date: 2009-05-06<br> Author: Muthiah Annamalai<br> Maintainer: Muthiah Annamalai<br> Title: Physical Constants<br> Description: Physical Constants from Atomic & Molecular Physics, taken from NIST database<br> Categories: Physics<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Physics Plot 1.0.8 http://downloads.sourceforge.net/octave/plot-1.0.8.tar.gz?download Name: Plot Version: 1.0.8<br> Date: 2010-03-04<br> Author: Various Authors<br> Maintainer: The Octave Community<br> Title: Plotting.<br> Description: Additional ploting tools for Octave.<br> Categories: Plotting<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Plotting pt_br 1.0.9 http://downloads.sourceforge.net/octave/pt_br-1.0.9.tar.gz?download Name: pt_br Version: 1.0.9<br> Date: 2010-02-08<br> Author: Jorge Barros de Abreu <ficmatin01 at skipthis solar dot com dot br><br> Maintainer: Jorge Barros de Abreu <ficmatin01 at skipthis solar dot com dot br><br> Title: Brazilian Portuguese<br> Description: Brazilian Portuguese translations of the help strings of the<br> Octave functions. <br> Categories: languages<br> Depends: octave (> 2.9.9)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> languages quaternion 1.0.0 http://downloads.sourceforge.net/octave/quaternion-1.0.0.tar.gz?download Name: quaternion Version: 1.0.0<br> Date: 2008-07-17<br> Author: A. S. Hodel <a.s.hodel@eng.auburn.edu><br> Maintainer: The Octave-Forge Community<br> Title: Quaternion Package<br> Description: Package for the manipulation of Quaternion's used for<br> frame transformation<br> Categories: Mathematics<br> Depends: octave (>= 3.1.0)<br> Autoload: yes<br> License: GPL version 3 or later<br> Url: http://octave.sf.net<br> Mathematics SECS1D 0.0.8 http://downloads.sourceforge.net/octave/secs1d-0.0.8.tar.gz?download Name: SECS1D Version: 0.0.8<br> Date: 2008-08-23<br> Author: Carlo de Falco<br> Maintainer: Carlo de Falco<br> Title: SEmi Conductor Simulator in 1D <br> Description: A Drift-Diffusion simulator for 1d semiconductor devices<br> Categories: Electrical Engineering<br> Depends: octave (>= 2.9.17)<br> Autoload: no<br> License: GPL version 2 or later<br> Url: http://www.comson.org/dem <br> Electrical Engineering SECS2D 0.0.8 http://downloads.sourceforge.net/octave/secs2d-0.0.8.tar.gz?download Name: SECS2D Version: 0.0.8<br> Date: 2009-05-06<br> Author: Carlo de Falco<br> Maintainer: Carlo de Falco<br> Title: SEmi Conductor Simulator in 2D <br> Description: A Drift-Diffusion simulator for 2d semiconductor devices<br> Categories: Electrical Engineering<br> Depends: octave (>= 2.9.17)<br> Autoload: no<br> License: GPL version 2 or later<br> Url: http://www.comson.org/dem <br> Electrical Engineering Signal 1.0.11 http://downloads.sourceforge.net/octave/signal-1.0.11.tar.gz?download Name: Signal Version: 1.0.11<br> Date: 2010-03-10<br> Author: Various Authors<br> Maintainer: The Octave Community<br> Title: Signal Processing.<br> Description: Signal processing tools, including filtering, windowing and display functions.<br> Depends: octave (> 2.9.9), optim (>= 1.0.0), specfun<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> simp 1.1.0 http://downloads.sourceforge.net/octave/simp-1.1.0.tar.gz?download Name: simp Version: 1.1.0<br> Date: 2/1/2009<br> Author: Simone Pernice<br> Maintainer: Simone Pernice<br> Title: Single Interval Mathematics Package for Octave<br> Description: This package define the basic operations on intervals. It is useful when some values for a computation are incerte.<br> Categories: Interval Mathematics<br> Url: simonepernice.freehostia.com<br> Autoload: yes<br> License: GPL version 3<br> Interval Mathematics sockets 1.0.6 http://downloads.sourceforge.net/octave/sockets-1.0.6.tar.gz?download Name: sockets Version: 1.0.6<br> Date: 2009-11-16<br> Author: John Swensen <jpswensen@comcast.net><br> Maintainer: Tom Holroyd <tomh@kurage.nimh.nih.gov><br> Title: Sockets<br> Description: Socket functions for networking from within octave.<br> Categories: Sockets<br> Depends: octave (>= 2.9.10)<br> Autoload: no<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Sockets Specfun 1.0.9 http://downloads.sourceforge.net/octave/specfun-1.0.9.tar.gz?download Name: Specfun Version: 1.0.9<br> Date: 2010-02-04<br> Author: Various Authors<br> Maintainer: The Octave Community<br> Title: Specfun<br> Description: Special functions including ellipitic functions, etc<br> Categories: Specfun<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Specfun special-matrix 1.0.7 http://downloads.sourceforge.net/octave/special-matrix-1.0.7.tar.gz?download Name: special-matrix Version: 1.0.7<br> Date: 2009-05-06<br> Author: Paul Kienzle <pkienzle@users.sf.net><br> Maintainer: Paul Kienzle <pkienzle@users.sf.net><br> Title: Special Matrices<br> Description: Additional Special Matrices for Octave.<br> Categories: Special Matrices<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Special Matrices spline-gcvspl 1.0.8 http://downloads.sourceforge.net/octave/spline-gcvspl-1.0.8.tar.gz?download Name: spline-gcvspl Version: 1.0.8<br> Date: 2009-05-03<br> Author: Joerg Specht<br> Maintainer: Joerg Specht<br> Title: Spline function based on GCVSPL package<br> Description: B-spline data smoothing using generalized cross-validation and mean squared prediction or explicit user smoothing<br> Categories: Interpolation<br> Depends: octave (>= 2.9.7)<br> License: Non Commercial Use Only<br> Url: http://octave.sf.net<br> Interpolation splines 1.0.7 http://downloads.sourceforge.net/octave/splines-1.0.7.tar.gz?download Name: splines Version: 1.0.7<br> Date: 2009-05-06<br> Author: Kai Habel and Paul Kienzle<br> Maintainer: Kai Habel and Paul Kienzle<br> Title: Splines.<br> Description: Additional Cubic spline functions.<br> Categories: Splines<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL v2 or later, and Public Domain<br> Url: http://octave.sf.net<br> Splines Statistics 1.0.10 http://downloads.sourceforge.net/octave/statistics-1.0.10.tar.gz?download Name: Statistics Version: 1.0.10<br> Date: 2010-03-27<br> Author: Various Authors<br> Maintainer: Arno Onken <asnelt@asnelt.org><br> Title: Statistics<br> Description: Additional statistics functions for Octave.<br> Categories: Statistics<br> Depends: octave (>= 2.9.7), miscellaneous<br> Autoload: yes<br> License: See individual files<br> Url: http://octave.sf.net<br> Statistics strings 1.0.7 http://downloads.sourceforge.net/octave/strings-1.0.7.tar.gz?download Name: strings Version: 1.0.7<br> Date: 2009-05-03<br> Author: Various Authors<br> Maintainer: The Octave Community<br> Title: String Handling.<br> Description: Additional manipulation functions<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> BuildRequires: pcre-devel<br> License: See individual files<br> Url: http://octave.sf.net<br> Struct 1.0.7 http://downloads.sourceforge.net/octave/struct-1.0.7.tar.gz?download Name: Struct Version: 1.0.7<br> Date: 2009-05-03<br> Author: Etienne Grossmann<br> Maintainer: Etienne Grossmann<br> Title: Structure Handling.<br> Description: Additional Structure manipulations functions.<br> Categories: Structs<br> Depends: octave (>= 2.9.7)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Structs SymBand 1.0.10 http://downloads.sourceforge.net/octave/symband-1.0.10.tar.gz?download Name: SymBand Version: 1.0.10<br> Date: 2009-05-06<br> Author: Andreas Stahel <Andreas.Stahel@hta-bi.bfh.ch><br> Maintainer: The Octave Community<br> Title: Symmetric Banded Matrices<br> Description: Linear Algebra for Symmetric Banded Matrices.<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Symbolic 1.0.9 http://downloads.sourceforge.net/octave/symbolic-1.0.9.tar.gz?download Name: Symbolic Version: 1.0.9<br> Date: 2009-05-03<br> Author: Various Authors<br> Maintainer: The Octave Community<br> Title: Symbolic Computations.<br> Description: Symbolic toolbox based on GiNaC and CLN.<br> BuildRequires: ginac-devel<br> Depends: octave (>= 3.1.55)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Tcl-Octave 0.1.8 http://downloads.sourceforge.net/octave/tcl-octave-0.1.8.tar.gz?download Name: Tcl-Octave Version: 0.1.8<br> Date: 2009-05-03<br> Author: Paul Kienzle<br> Maintainer: Paul Kienzle<br> Title: Tcl Interface to Octave<br> Description: socket implementation of a tcl-octave connection<br> Depends: octave (>= 2.9.7)<br> Systemrequirements: tcl<br> License: Public Domain<br> Url: http://octave.sf.net<br> time 1.0.9 http://downloads.sourceforge.net/octave/time-1.0.9.tar.gz?download Name: time Version: 1.0.9<br> Date: 2009-05-03<br> Author: Bill Denney <bill@denney.ws><br> Maintainer: Bill Denney <bill@denney.ws><br> Title: Time and Dates<br> Description: Additional date manipulation tools.<br> Categories: Time<br> Depends: octave (>= 3.0.1)<br> Autoload: yes<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Time TSA 4.0.1 http://downloads.sourceforge.net/octave/tsa-4.0.1.tar.gz?download Name: TSA Version: 4.0.1<br> Date: 2009-05-03<br> Author: Alois Schloegl <a.schloegl@ieee.org><br> Maintainer: Alois Schloegl <a.schloegl@ieee.org><br> Title: Time Series Analysis Toolbox <br> Description: Stochastic concepts and maximum entropy methods for time series analysis<br> Depends: octave (>= 2.9.7) <br> Depends: NaN (>= 1.0.0)<br> License: GPL version 3 or later<br> Url: http://hci.tugraz.at/~schloegl/matlab/tsa<br> video 1.0.2 http://downloads.sourceforge.net/octave/video-1.0.2.tar.gz?download Name: video Version: 1.0.2<br> Date: 2009-05-03<br> Author: Stefan van der Walt, Roman Stanchak<br> Maintainer: Xavier Delacour<br> Title: Video functions<br> Description: Implements addframe, avifile, aviinfo, and aviread, using ffmpeg. (and approximately conforms to Matlab interface)<br> Depends: octave (>= 2.9.12)<br> Autoload: yes<br> SystemRequirements: ffmpeg<br> License: BSD<br> Url: http://octave.sf.net<br> Vrml 1.0.11 http://downloads.sourceforge.net/octave/vrml-1.0.11.tar.gz?download Name: Vrml Version: 1.0.11<br> Date: 2010-02-07<br> Author: Etienne Grossmann<br> Maintainer: Etienne Grossmann<br> Title: VRML.<br> Description: 3D graphics using VRML<br> Depends: octave (>= 2.9.7), miscellaneous, struct, statistics<br> Autoload: yes<br> SystemRequirements: freewrl<br> License: GPL version 2 or later and GFDL<br> Url: http://octave.sf.net<br> Windows 1.0.8 http://downloads.sourceforge.net/octave/windows-1.0.8.tar.gz?download Name: Windows Version: 1.0.8<br> Date: 2009-05-03<br> Author: Andy Adler <alder@ncf.ca><br> Maintainer: Andy Adler <alder@ncf.ca><br> Title: Windows functions<br> Description: Provides COM interface and additional functionality on Windows<br> Categories: Windows<br> Depends: octave (>= 2.9.7)<br> License: GPL version 2 or later<br> Url: http://octave.sf.net<br> Windows Xraylib 1.0.8 http://downloads.sourceforge.net/octave/xraylib-1.0.8.tar.gz?download Name: Xraylib Version: 1.0.8<br> Date: 2009-05-06<br> Author: Teemu Ikonen <tpikonen@gmail.com><br> Maintainer: Teemu Ikonen <tpikonen@gmail.com><br> Title: GNU Scientific Library<br> Description: Bindings to the Xraylib functions<br> Categories: X-raydata<br> License: GPL version 2<br> Url: http://ftp.esrf.fr/pub/scisoft/xraylib/<br> X-raydata Zenity 0.5.7 http://downloads.sourceforge.net/octave/zenity-0.5.7.tar.gz?download Name: Zenity Version: 0.5.7<br> Date: 2009-05-06<br> Author: Sren Hauberg<br> Maintainer: Sren Hauberg<br> Title: Zenity<br> Description: A set of functions for creating simple graphical<br> user interfaces. It is currently possible to create<br> calendar windows, text entries, file selection dialogs,<br> lists, message windows, icons in the notification area,<br> and windows for large amount of text.<br> License: GPL version 2 or later<br> SystemRequirements: zenity (>= 2.16)<br> Url: http://octave.sf.net<br> SvgPlot 0.0.1 http://forja.rediris.es/frs/download.php/1404/svgplot-0.0.1.tar.gz Name: SvgPlot Version: 0.0.1<br> Date: 2009-07-16<br> Author: P. L. Lucas <selairi _put_at_here gmail.com ><br> Maintainer: P. L. Lucas <selairi _put_at_here gmail.com ><br> Title: SvgPlot<br> Description: This is a simple library with tools for drawing in SVG file format. You don't need know SVG file format to draw your figures.<br> License: GPL version 3 or later<br> Categories: Plotting<br> Plotting qtoctave-0.10.1/qtoctave_pkg/octave-forge.list0000644000175000017500000005143511511434231020367 0ustar lucaslucas Octave-Forge Octave-Forge is a central location for the collaborative development of packages for GNU Octave. The Octave-forge packages contains the source for all the functions and are designed to work with the Octave package system. In general the packages are designed to work with the latest development version of Octave, but it should be possible to use most packages with earlier versions. http://octave.sourceforge.net/ Main repository ANN 1.0.2 http://downloads.sourceforge.net/octave/ann-1.0.2.tar.gz?download The Octave-forge ANN package wraps the ANN library, which provides data structures and functions for computing exact and approximate nearest neighbors on an arbitrarily high dimensional point set. Audio 1.1.4 http://downloads.sourceforge.net/octave/audio-1.1.4.tar.gz?download Audio recording, processing and playing tools. benchmark 1.1.1 http://downloads.sourceforge.net/octave/benchmark-1.1.1.tar.gz?download The package contains code used to benchmark speed of Octave. bioinfo 0.1.2 http://downloads.sourceforge.net/octave/bioinfo-0.1.2.tar.gz?download Bioinformatics manipulation Combinatorics http://downloads.sourceforge.net/octave/combinatorics-1.0.9.tar.gz?download Combinatorics functions, incuding partitioning. Communications http://downloads.sourceforge.net/octave/communications-1.0.10.tar.gz?download Digital Communications, Error Correcting Codes (Channel Code), Source Code functions, Modulation and Galois Fields Control http://downloads.sourceforge.net/octave/control-1.0.7.tar.gz?download Additional Octave Control tools data-smoothing http://downloads.sourceforge.net/octave/data-smoothing-1.1.1.tar.gz?download Algorithms for smoothing noisy data database http://downloads.sourceforge.net/octave/database-1.0.1.tar.gz?download These are bindings that allow SQL queries and other database operations on postgres, mysql, sqlite, and standard ODBC databases from within Octave. A simplified interface that is uniform across all database types is provided, as well as the entire C client API for each database (libpq, libmysqlclient, etc). Econometrics http://downloads.sourceforge.net/octave/econometrics-1.0.7.tar.gz?download Econometrics functions including MLE and GMM based techniques. financial http://downloads.sourceforge.net/octave/financial-0.3.0.tar.gz?download Financial manipulation and plotting functions Fixed http://downloads.sourceforge.net/octave/fixed-0.7.8.tar.gz?download Fixed point real and complex matrix toolbox ftp http://downloads.sourceforge.net/octave/ftp-1.0.1.tar.gz?download These are bindings for ftplib, and MATLAB compatible APIs. ga http://downloads.sourceforge.net/octave/ga-0.9.4.tar.gz?download Genetic optimization code General http://downloads.sourceforge.net/octave/general-1.0.7.tar.gz?download General tools for octave. GSL http://downloads.sourceforge.net/octave/gsl-1.0.7.tar.gz?download Octave bindings to the GNU Scientific Library Ident http://downloads.sourceforge.net/octave/ident-1.0.6.tar.gz?download Addition System Indentification Control functions. Image http://downloads.sourceforge.net/octave/image-1.0.8.tar.gz?download The Octave-forge Image package provides functions for reading, writing, and processing images. The package supports almost all image formats through the use of ImageMagick. The package also provides functions for feature extraction, image statistics, spatial and geometric transformations, morphological operations, linear filtering, and much more. InformationTheory http://downloads.sourceforge.net/octave/informationtheory-0.1.6.tar.gz?download Functions and routines for basic Information Theory definitions, and source coding. io http://downloads.sourceforge.net/octave/io-1.0.7.tar.gz?download Input/Output in external formats. IRSA http://downloads.sourceforge.net/octave/irsa-1.0.6.tar.gz?download Irregular sampling analysis. Linear-Algebra http://downloads.sourceforge.net/octave/linear-algebra-1.0.6.tar.gz?download Additional linear algebra code, including general SVD and matrix functions. Miscellaneous http://downloads.sourceforge.net/octave/miscellaneous-1.0.7.tar.gz?download Miscellaneous tools including waitbar, xml tools, etc missing-functions http://downloads.sourceforge.net/octave/missing-functions-1.0.1.tar.gz?download Find functions that are in Matlab but not in Octave. nnet http://downloads.sourceforge.net/octave/nnet-0.1.8.tar.gz?download A feed forward multi-layer neural network. octcdf http://downloads.sourceforge.net/octave/octcdf-1.0.11.tar.gz?download A NetCDF interface for octave OctGPR http://downloads.sourceforge.net/octave/octgpr-1.1.4.tar.gz?download The package allows interpolating and smoothing scattered multidimensional data using Gaussian Process Regression (also known as Kriging). odebvp http://downloads.sourceforge.net/octave/odebvp-1.0.5.tar.gz?download To approximate the solution of the boundary-value problem y''=p(x)*y' + q(x)*y + r(x), a<=x<=b, y(a)=alpha, y(b)=beta by the linear finite-diffence method. OdePkg http://downloads.sourceforge.net/octave/odepkg-0.6.4.tar.gz?download A package for solving ordinary differential equations and more. Optim http://downloads.sourceforge.net/octave/optim-1.0.4.tar.gz?download Unconstrained Non-linear Optimization toolkit. optiminterp http://downloads.sourceforge.net/octave/optiminterp-0.3.1.tar.gz?download An optimal interpolation toolbox for octave. This package provides functions to perform a n-dimensional optimal interpolations of arbitrarily distributed data points. Outliers http://downloads.sourceforge.net/octave/outliers-0.13.8.tar.gz?download Grubbs, Dixon and Cochran tests for outlier detection and p-value approximating routines. Parallel http://downloads.sourceforge.net/octave/parallel-1.0.7.tar.gz?download Parallel execution package for cluster computers PhysicalConstants http://downloads.sourceforge.net/octave/physicalconstants-0.1.6.tar.gz?download Physical Constants from Atomic & Molecular Physics, taken from NIST database Plot http://downloads.sourceforge.net/octave/plot-1.0.6.tar.gz?download Additional ploting tools for Octave. Signal http://downloads.sourceforge.net/octave/signal-1.0.8.tar.gz?download Signal processing tools, including filtering, windowing and display functions. sockets http://downloads.sourceforge.net/octave/sockets-1.0.5.tar.gz?download Socket functions Specfun http://downloads.sourceforge.net/octave/specfun-1.0.7.tar.gz?download Special functions including ellipitic functions, etc special-matrix http://downloads.sourceforge.net/octave/special-matrix-1.0.6.tar.gz?download Additional Special Matrices for Octave. splines http://downloads.sourceforge.net/octave/splines-1.0.6.tar.gz?download Additional Cubic spline functions. Statistics http://downloads.sourceforge.net/octave/statistics-1.0.7.tar.gz?download Additional statistics functions for Octave. strings http://downloads.sourceforge.net/octave/strings-1.0.6.tar.gz?download Additional manipulation functions Struct http://downloads.sourceforge.net/octave/struct-1.0.6.tar.gz?download Additional Structure manipulations functions. Symbolic http://downloads.sourceforge.net/octave/symbolic-1.0.7.tar.gz?download Symbolic toolbox based on GiNaC and CLN. time http://downloads.sourceforge.net/octave/time-1.0.8.tar.gz?download Additional date manipulation tools. video http://downloads.sourceforge.net/octave/video-1.0.1.tar.gz?download Implements addframe, avifile, aviinfo, and aviread, using ffmpeg. (and approximately conforms to Matlab interface) Vrml http://downloads.sourceforge.net/octave/vrml-1.0.8.tar.gz?download 3D graphics using VRML Zenity http://downloads.sourceforge.net/octave/zenity-0.5.6.tar.gz?download A set of functions for creating simple graphical user interfaces. It is currently possible to create calendar windows, text entries, file selection dialogs, lists, message windows, icons in the notification area, and windows for large amount of text. Extra packages AD http://downloads.sourceforge.net/octave/ad-1.0.4.tar.gz?download Automatic Forward Differentiation BIM http://downloads.sourceforge.net/octave/bim-0.0.7.tar.gz?download Package for solving Diffusion Advection Reaction (DAR) Partial Differential Equaltions based on the Finite Volume Scharfetter-Gummel (FVSG) method a.k.a Box Integration Method (BIM) Civil-Engineering http://downloads.sourceforge.net/octave/civil-engineering-1.0.6.tar.gz?download Functions to solution some ODE's in Civil Engineering. Engine http://downloads.sourceforge.net/octave/engine-1.0.7.tar.gz?download An external interface library for Octave FPL http://downloads.sourceforge.net/octave/fpl-0.1.3.tar.gz?download Collection of routines to plot data on unstructured triangular and tetrahedral meshes Graceplot http://downloads.sourceforge.net/octave/graceplot-1.0.6.tar.gz?download Graceplot bindings for octave. Integration http://downloads.sourceforge.net/octave/integration-1.0.6.tar.gz?download Toolbox for 1-D, 2-D, and n-D Numerical Integration Java http://downloads.sourceforge.net/octave/java-1.2.5.tar.gz?download Provides Java interface with OO-like Java objects manipulation JHandles http://downloads.sourceforge.net/octave/jhandles-0.3.4.tar.gz?download JHandles is a java- and openGL-based alternative graphics package for octave, providing a handle-based mechanism similar to Matlab. Mapping http://downloads.sourceforge.net/octave/mapping-1.0.6.tar.gz?download Simple Mapping functions. MSH http://downloads.sourceforge.net/octave/msh-0.0.7.tar.gz?download Package for creating and managing triangular and tetrahedral meshes for Finite Element or Finite Volume PDE solvers. Uses a mesh data structure compatible with pdetool. Relies on gmsh for unstructured mesh generation. Multicore http://downloads.sourceforge.net/octave/multicore-0.2.13.tar.gz?download An Octave-forge package providing functions for parallel processing on multiple cores. NaN http://downloads.sourceforge.net/octave/nan-1.0.7.tar.gz?download Missing value statistical toolbox NLWing2 http://downloads.sourceforge.net/octave/nlwing2-1.0.1.tar.gz?download This package allows efficient computation of nonlinear aerodynamic OCS http://downloads.sourceforge.net/octave/ocs-0.0.2.tar.gz?download Package for solving DC and transient MNA equation stemming from electrical circuit PDB http://downloads.sourceforge.net/octave/pdb-1.0.6.tar.gz?download Reads and display PDB-files from the Brookhaven protein databank SECS1D http://downloads.sourceforge.net/octave/secs1d-0.0.7.tar.gz?download A Drift-Diffusion simulator for 1d semiconductor devices SECS2D http://downloads.sourceforge.net/octave/secs2d-0.0.7.tar.gz?download A Drift-Diffusion simulator for 2d semiconductor devices Tcl-Octave http://downloads.sourceforge.net/octave/tcl-octave-0.1.7.tar.gz?download socket implementation of a tcl-octave connection SymBand http://downloads.sourceforge.net/octave/symband-1.0.8.tar.gz?download Linear Algebra for Symmetric Banded Matrices. Triangular http://downloads.sourceforge.net/octave/triangular-1.0.4.tar.gz?download Simple example of a user type implementing a simple matrix type for triangular matrices. TSA http://downloads.sourceforge.net/octave/tsa-4.0.0.tar.gz?download Stochastic concepts and maximum entropy methods for time series analysis Windows http://downloads.sourceforge.net/octave/windows-1.0.6.tar.gz?download Provides COM interface and additional functionality on Windows Xraylib http://downloads.sourceforge.net/octave/xraylib-1.0.7.tar.gz?download Bindings to the Xraylib functions SvgPlot 0.0.1 http://forja.rediris.es/frs/download.php/1404/svgplot-0.0.1.tar.gz This is a simple library with tools for drawing in SVG file format. You don't need know SVG file format to draw your figures. Native Translations pt_BR http://downloads.sourceforge.net/octave/pt_br-1.0.7.tar.gz?download Brazilian Portuguese translations of the help strings of the Octave functions. Non-free packages Arpack http://downloads.sourceforge.net/octave/arpack-1.0.6.tar.gz?download Octave bindings to ARPACK, including the eigs and svds function. spline-gcvspl http://downloads.sourceforge.net/octave/spline-gcvspl-1.0.6.tar.gz?download B-spline data smoothing using generalized cross-validation and mean squared prediction or explicit user smoothing qtoctave-0.10.1/qtoctave-info-reader/qtoctave-info-reader.pro0000644000175000017500000000063211511434231023173 0ustar lucaslucas###################################################################### # Automatically generated by qmake (2.01a) mar jun 1 09:26:44 2010 ###################################################################### TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += infomainwindow.h parser.h webinfo.h SOURCES += infomainwindow.cpp main.cpp parser.cpp webinfo.cpp RESOURCES += images.qrc qtoctave-0.10.1/qtoctave-info-reader/infomainwindow.h0000644000175000017500000000170611511434231021636 0ustar lucaslucas/* Copyright (C) 2009 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "webinfo.h" class InfoMainWindow:public QMainWindow { Q_OBJECT WebInfo *web; public: InfoMainWindow(QWidget *parent = 0); void setInfoPath(QString infoPath); }; qtoctave-0.10.1/qtoctave-info-reader/parser.h0000644000175000017500000000630211511434231020077 0ustar lucaslucas/* Copyright (C) 2009 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include /**Position of node in info files. */ struct RefMapItem { /**Node name.*/ QString node; int pos; }; struct NodeMapItem { //QFileInfo fileInfo; int pos; }; struct InfoFileItem { QFileInfo fileInfo; int realSize; }; /**This class gets nodes and searchs inside of `info files'. *

Each info file has nodes. Every node has the documentation. * Info files contains a map with position of each node.

*

What is position? * There is a simple answer: * If you make a queue with info files, position will be the number of bytes * from begining to node position.

*

* But is not so easy. There is headers, and qtinfo must not take these headers into account. *

*

* This class also translates info files to html. *

*/ class Parser:public QObject { Q_OBJECT QString infoPath; QFileInfoList infoFiles; QString searchNode(QString node, QIODevice * io); QString getNextNode(QIODevice * io); QString getNodeName(QString text); QString getNodeUp(QString text); QString getNodeNext(QString text); QString getNodePrev(QString text); QHash nodeMap; QHash refMap; QList infoFileRealSizeList; /**List of suported compressor and commands to uncompress files to stdout with them.*/ QHash compilersMap; /**Parses info files and gets map of node positions. */ void parseInfoMap(); /**Open info files and uncompress them. */ QIODevice *openFile(QFileInfo & fileInfo); /**Calculates real position of nodes. * \param pos position from info file. * \param fileInfo returns file what contains that position. * \param realPos returns real position inside of fileInfo. */ void realPosition(int pos, QFileInfo & fileInfo, int & realPos); /**Seeks to position pos. */ void seek(QIODevice *io, int pos); public: Parser(QObject *parent = 0); void setInfoPath(QString infoPath); QString getInfoPath(); QString searchNode(QString node); QString globalSearch(QString text, int maxFounds); /**Checks if this node is reference. If node is reference, it will be returned its position * in text, else it will be returned -1. */ int isRef(QString node); /**Translates text of node to Html. If anchorPos is not -1, then anchor is inserted in that * position. */ QString nodeTextToHtml(QString text, int anchorPos=-1, QString anchor=QString()); };qtoctave-0.10.1/qtoctave-info-reader/main.cpp0000644000175000017500000000270611511434231020066 0ustar lucaslucas/* Copyright (C) 2009 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "infomainwindow.h" /*! \mainpage QtInfo * * \section intro_sec Introduction * *

This tool is a simple reaer for info files. UNIX tools has their documentation in * info format. This files can be read with info tool. * Help of Octave is in info format.

*

This tool helps you to read info files easyly.

* */ int main(int argn, char *argv[]) { QApplication app(argn,argv); if(argn<2) { printf("\nQtInfo. This tool is a info file reader.\n" "%s info_file_path\n\n" ,argv[0]); return 0; } InfoMainWindow mainWindow; mainWindow.setInfoPath(argv[1]); mainWindow.show(); app.exec(); } qtoctave-0.10.1/qtoctave-info-reader/Doxyfile0000644000175000017500000017371111511434231020151 0ustar lucaslucas# Doxyfile 1.5.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = QtInfo # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.0.1 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ./html # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, # Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to FRAME, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. Other possible values # for this tag are: HIERARCHIES, which will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list; # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which # disables this behavior completely. For backwards compatibility with previous # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = NONE # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Options related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO qtoctave-0.10.1/qtoctave-info-reader/qtinfo.pro0000644000175000017500000000063311511434231020455 0ustar lucaslucas###################################################################### # Automatically generated by qmake (2.01a) lun oct 19 09:42:49 2009 ###################################################################### TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += infomainwindow.h parser.h webinfo.h SOURCES += infomainwindow.cpp main.cpp parser.cpp webinfo.cpp RESOURCES += images.qrc qtoctave-0.10.1/qtoctave-info-reader/webinfo.h0000644000175000017500000000311511511434231020233 0ustar lucaslucas/* Copyright (C) 2009 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "parser.h" #include #include #include #include #include #include class WebInfo:public QWidget { Q_OBJECT QTextBrowser *web; Parser parser; QStackedWidget *stack; QTabBar *tabs; QPushButton *closeTabButton; QPushButton *searchButton; QLineEdit *searchLineEdit; QCheckBox *searchCheckBox; QToolButton *zoomInButton; QToolButton *zoomOutButton; QFont fontWeb; QTextBrowser *addNewTab(QString name); void closeTab(int index); public: WebInfo(QWidget *parent = 0); void setInfoPath(QString infoPath); void loadNode(QString nodeName); public slots: void linkClicked_cb( const QUrl & link ); void currentTabChanged_cb( int index ); void closeTab_cb(); void search_cb(); void zoomIn_cb(); void zoomOut_cb(); };qtoctave-0.10.1/qtoctave-info-reader/CMakeLists.txt0000644000175000017500000000256511511434230021200 0ustar lucaslucasFIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") include(UseQt4) include_directories(${QT_INCLUDE_DIR}) include_directories(${QT_QT_INCLUDE_DIR}) include_directories(${QT_QTCORE_INCLUDE_DIR}) include_directories(${QT_QTGUI_INCLUDE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) FILE(GLOB_RECURSE qtoctave_info_reader_moc_headers *.h ) FILE(GLOB_RECURSE qtoctave_info_reader_sources *.cpp ) FILE(GLOB_RECURSE qtoctave_info_reader_ui *.ui ) FILE(GLOB_RECURSE qtoctave_info_reader_qrc *.qrc ) # run uic on .ui files: QT4_WRAP_UI( qtoctave_info_reader_ui_headers ${qtoctave_info_reader_ui} ) # run moc on these files: QT4_WRAP_CPP( qtoctave_info_reader_moc_sources ${qtoctave_info_reader_moc_headers} ) # run rcc on these files: QT4_ADD_RESOURCES ( qtoctave_info_reader_qrc_sources ${qtoctave_info_reader_qrc} ) add_executable(qtoctave-info-reader ${qtoctave_info_reader_sources} ${qtoctave_info_reader_moc_sources} ${qtoctave_info_reader_ui_headers} ${qtoctave_info_reader_moc_headers} ${qtoctave_info_reader_qrc_sources} ) SET_TARGET_PROPERTIES(qtoctave-info-reader PROPERTIES INSTALL_RPATH ":usr/lib" BUILD_WITH_INSTALL_RPATH true INSTALL_RPATH_USE_LINK_PATH true ) TARGET_LINK_LIBRARIES(qtoctave-info-reader ${Qt4_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ) install ( TARGETS qtoctave-info-reader RUNTIME DESTINATION bin ) qtoctave-0.10.1/qtoctave-info-reader/webinfo.cpp0000644000175000017500000001210711511434230020566 0ustar lucaslucas/* Copyright (C) 2009 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "webinfo.h" #include #include WebInfo::WebInfo(QWidget *parent):QWidget(parent) { fontWeb=font(); QVBoxLayout *layout=new QVBoxLayout(this); setLayout(layout); QHBoxLayout *hboxLayout=new QHBoxLayout(); layout->addLayout(hboxLayout); closeTabButton=new QPushButton(this); closeTabButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); closeTabButton->setIcon(QIcon(":/images/stop.png")); hboxLayout->addWidget(closeTabButton); connect(closeTabButton, SIGNAL(clicked()), this, SLOT(closeTab_cb())); tabs=new QTabBar(this); tabs->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred); tabs->setExpanding(false); hboxLayout->addWidget(tabs); connect(tabs, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged_cb(int))); zoomInButton=new QToolButton(this); zoomInButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); zoomInButton->setIcon(QIcon(":/images/zoom-in.png")); hboxLayout->addWidget(zoomInButton); connect(zoomInButton, SIGNAL(clicked()), this, SLOT(zoomIn_cb())); zoomOutButton=new QToolButton(this); zoomOutButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); zoomOutButton->setIcon(QIcon(":/images/zoom-out.png")); hboxLayout->addWidget(zoomOutButton); connect(zoomOutButton, SIGNAL(clicked()), this, SLOT(zoomOut_cb())); stack=new QStackedWidget(this); layout->addWidget(stack); hboxLayout=new QHBoxLayout(); layout->addLayout(hboxLayout); searchButton=new QPushButton(this); searchButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); searchButton->setIcon(QIcon(":/images/question.png")); hboxLayout->addWidget(searchButton); connect(searchButton, SIGNAL(clicked()), this, SLOT(search_cb())); searchLineEdit=new QLineEdit(this); hboxLayout->addWidget(searchLineEdit); connect(searchLineEdit, SIGNAL(returnPressed()), this, SLOT(search_cb())); searchCheckBox=new QCheckBox(tr("Global search")); hboxLayout->addWidget(searchCheckBox); resize(600,600); } void WebInfo::setInfoPath(QString infoPath) { parser.setInfoPath(infoPath); loadNode("Top"); } void WebInfo::loadNode(QString nodeName) { //Check if node has been already opened. for(int i=0;icount();i++) { if(nodeName==tabs->tabText(i)) { tabs->setCurrentIndex(i); return; } } QString text=parser.searchNode(nodeName); int i=parser.isRef(nodeName); web=addNewTab(nodeName); // web->setPlainText( text ); web->setHtml( parser.nodeTextToHtml(text, i-1, "anchor") ); if(i!=-1) { web->scrollToAnchor("anchor"); } } void WebInfo::linkClicked_cb(const QUrl & link) { QString node=link.toString(); loadNode(node); } void WebInfo::currentTabChanged_cb( int index ) { QVariant data=tabs->tabData(index); web=(QTextBrowser*)(data.value()); stack->setCurrentIndex( stack->indexOf(web) ); if(web->font()!=fontWeb) web->setFont(fontWeb); } QTextBrowser *WebInfo::addNewTab(QString name) { web=new QTextBrowser(this); web->setOpenLinks(false); web->show(); connect(web, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(linkClicked_cb(const QUrl &)) ); disconnect(tabs, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged_cb(int))); int ns=stack->addWidget(web); stack->setCurrentIndex(ns); int nt=tabs->addTab(name); tabs->setCurrentIndex(nt); QVariant data; data.setValue((void*)web); tabs->setTabData( nt, data ); connect(tabs, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged_cb(int))); if(web->font()!=fontWeb) web->setFont(fontWeb); return web; } void WebInfo::closeTab_cb() { int index=tabs->currentIndex(); if(tabs->tabText(index)!="Top") closeTab(index); } void WebInfo::closeTab(int index) { QVariant data=tabs->tabData(index); QWidget *w=(QWidget*)(data.value()); stack->removeWidget(w); delete w; tabs->removeTab(index); } void WebInfo::search_cb() { if(searchCheckBox->isChecked()) { // Global search QString results=parser.globalSearch(searchLineEdit->text(), 5); web=addNewTab("Results for: "+searchLineEdit->text()); // web->setPlainText( results ); web->setHtml( results ); } else { // Local search web->find(searchLineEdit->text()); } } void WebInfo::zoomIn_cb() { fontWeb.setPointSize(fontWeb.pointSize()+1); web->setFont(fontWeb); } void WebInfo::zoomOut_cb() { fontWeb.setPointSize(fontWeb.pointSize()-1); web->setFont(fontWeb); } qtoctave-0.10.1/qtoctave-info-reader/infomainwindow.cpp0000644000175000017500000000200611511434230022162 0ustar lucaslucas/* Copyright (C) 2009 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "infomainwindow.h" InfoMainWindow::InfoMainWindow(QWidget *parent):QMainWindow(parent) { web=new WebInfo(this); setCentralWidget(web); web->show(); } void InfoMainWindow::setInfoPath(QString infoPath) { web->setInfoPath(infoPath); } qtoctave-0.10.1/qtoctave-info-reader/images.qrc0000644000175000017500000000037511511434230020411 0ustar lucaslucas images/bookmark.png images/question.png images/star.png images/stop.png images/zoom-in.png images/zoom-out.png qtoctave-0.10.1/qtoctave-info-reader/build.sh0000755000175000017500000000031611511434230020066 0ustar lucaslucas#!/bin/bash echo '' > images.qrc for a in images/*; do printf '%s\n' $a >> images.qrc done echo '' >> images.qrc qmake -project qtoctave-0.10.1/qtoctave-info-reader/parser.cpp0000644000175000017500000003045111511434230020433 0ustar lucaslucas/* Copyright (C) 2009 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "parser.h" #include #include #include #include #include #include #include Parser::Parser(QObject *parent):QObject(parent) { compilersMap.insert("bz2", "bzip2 -dc \"%1\""); compilersMap.insert("gz", "gzip -dc \"%1\""); compilersMap.insert("lzma", "lzma -dc \"%1\""); compilersMap.insert("xz", "xz -dc \"%1\""); compilersMap.insert("Z", "gunzip -c \"%1\""); } void Parser::setInfoPath(QString infoPath) { this->infoPath=infoPath; infoFiles.clear(); QFileInfo info(infoPath); QString path=info.absolutePath(); QString fileName=info.fileName(); QDir infoDir(path); QStringList filter; filter.append(fileName+"*"); infoFiles=infoDir.entryInfoList(filter, QDir::Files); for(int i=0;isetData(result); if (!io->open(QIODevice::ReadOnly | QIODevice::Text)) return NULL; iodevice=io; } else { QFile *io=new QFile(fileInfo.absoluteFilePath()); if (!io->open(QIODevice::ReadOnly | QIODevice::Text)) return NULL; iodevice=io; } return iodevice; } int Parser::isRef(QString node) { if(refMap.contains(node)) { RefMapItem ref=refMap[node]; return ref.pos-nodeMap[ref.node].pos; } return -1; } QString Parser::searchNode(QString node) { QFileInfo fileInfo; QString ref; printf("[Parser::searchNode] Nodo >%s<\n", node.toLocal8Bit().data()); if(refMap.contains(node)) { ref=node; node=refMap[ref].node; } if(nodeMap.contains(node)) { printf("Nodo %s encontrado\n", node.toLocal8Bit().data()); int pos=nodeMap[node].pos; int realPos; realPosition(pos, fileInfo, realPos); printf("Archivo: %s\nPosición: %d\nPosición real: %d\n", fileInfo.absoluteFilePath().toLocal8Bit().data(), pos, realPos); QIODevice *io=openFile(fileInfo); if(io==NULL) return QString(); seek(io, realPos); QString text=getNextNode(io); if( !text.isEmpty() ) return text; io->close(); delete io; } return QString(); } QString Parser::searchNode(QString node, QIODevice * io) { while(!io->atEnd()) { QString text=getNextNode(io); if( node == getNodeName(text) ) { return text; } } return QString(); } QString Parser::getNextNode(QIODevice * io) { QString text; while (!io->atEnd()) { QByteArray line = io->readLine(); if(line.at(0) == 31) break; else text.append(line); } printf("[Parser::getNextNode] Node: %s\n", text.toLocal8Bit().data()); return text; } static QString get1stLine(QString text) { int n=text.indexOf("\n"); if(n<0) return QString(); QString firstLine=text.left(n); return firstLine; } static QString parserNode(QString text, QString nodeName) { QString firstLine=get1stLine(text); QStringList nodes=firstLine.split(","); for(int i=0;i%s< >%s< >%s< >%s<\n", re.cap(0).trimmed().toLocal8Bit().data(),type.trimmed().toLocal8Bit().data(), note.toLocal8Bit().data(), link.toLocal8Bit().data()); if(urlLink.isEmpty()) urlLink=note; urlLink=urlLink.trimmed(); urlLink.replace("\n"," "); urlLink.replace(QRegExp(" +")," "); urlLink.replace("",""); urlLink.replace("",""); urlLink=QUrl::toPercentEncoding(urlLink,"","'"); QString href; if(type=="\n*") href="\n"; else href="";//type==*note href+=re.cap(2)+""+note+":"+link+re.cap(5)+""; f = re.matchedLength(); text.replace(i,f,href); //printf("[replaceLinks] replaced=%d original=%d\n", (note+":"+link+re.cap(5)).size(), re.cap(0).size()); i+=href.size(); } } static void replaceColons(QString &text) { QRegExp re("`([^']+)'"); int i=0, f; while( ( i=re.indexIn(text,i) ) != -1 ) { QString t=re.cap(1); QString bold="`"+t+"'"; f = re.matchedLength(); text.replace(i,f,bold); i+=bold.size(); } } static void infoToHtml(QString &text) { text.replace("&", "&"); text.replace("<", "<"); text.replace(">", ">"); text.replace("\n* Menu:", "\nMenu:"); text.replace("*See also:*", "*See also:*"); replaceColons(text); replaceLinks(text); } QString Parser::nodeTextToHtml(QString text, int anchorPos, QString anchor) { QString nodeName=getNodeName(text); QString nodeUp=getNodeUp(text); QString nodeNext=getNodeNext(text); QString nodePrev=getNodePrev(text); if(anchorPos>-1) { QString text1=text.left(anchorPos); QString text2=text.mid(anchorPos); int n=text1.indexOf("\n"); text1.remove(0,n); infoToHtml(text1); infoToHtml(text2); text=text1+""+text2; } else { int n=text.indexOf("\n"); text.remove(0,n); infoToHtml(text); } QString navigationLinks= QString( " Node: %1
" "Prev:
%3
" "Next: %5
" "Up: %7
\n" ) .arg(nodeName) .arg(QString(QUrl::toPercentEncoding(nodePrev,"","'"))) .arg(nodePrev) .arg(QString(QUrl::toPercentEncoding(nodeNext,"","'"))) .arg(nodeNext) .arg(QString(QUrl::toPercentEncoding(nodeUp,"","'"))) .arg(nodeUp); text.prepend("
\n
");
	text.append("
\n

\n"); text.prepend(navigationLinks); text.append(navigationLinks); text.prepend("\n"); text.append("\n"); return text; } void Parser::parseInfoMap() { QRegExp re("(Node|Ref): ([^\\0177]+)\\0177(\\d+)\n"); QRegExp reFiles("([^:]+): (\\d+)\n"); int foundCount=0; for(int i=0;i%s< >%d<\n",type.toLocal8Bit().data(), node.toLocal8Bit().data(), index); if(type=="Node") { NodeMapItem item; //item.fileInfo=fileInfo; item.pos=index; nodeMap[node]=item; lastNode=node; } else if(type=="Ref") { RefMapItem item; item.node=lastNode; item.pos=index; refMap[node]=item; } pos += re.matchedLength(); } break; } else if( firstLine.startsWith("Indirect:") ) { foundCount++; int pos = 0; QString lastNode; while ((pos = reFiles.indexIn(nodeText, pos)) != -1) { QString fileCap=reFiles.cap(1).trimmed(); int index=reFiles.cap(2).toInt(); printf(">%s<: >%d<\n",fileCap.toLocal8Bit().data(), index); printf("%s: >%d<\n",fileCap.toLocal8Bit().data(), index); InfoFileItem item; for(int j=0;j> %s\n",info.fileName().toLocal8Bit().data()); break; } } item.realSize=index; infoFileRealSizeList.append(item); pos += reFiles.matchedLength(); } } } io->close(); delete io; } } void Parser::realPosition(int pos, QFileInfo & fileInfo, int & realPos) { int header=-1, sum=0; for(int i=0;iatEnd() && pos>0) { io->getChar(&ch); pos--; } } static void replace(QString &text, QRegExp re, QString after) { int pos = 0; while ((pos = re.indexIn(text, pos)) != -1) { QString cap=text.mid(pos,re.matchedLength()); QString a(after); a=a.arg(cap); text.remove(pos,re.matchedLength()); text.insert(pos,a); pos += a.size(); } } QString Parser::globalSearch(QString text, int maxFounds) { QString results; QStringList words=text.split(" ",QString::SkipEmptyParts); QString reProgram("("+words.at(0)); for(int i=1;i\n

Search results

\nResults for: "); results.append(text); results.append("
\n"); for(int i=0;i=0;founds++) {} if(founds\n "); results.append(node); results.append( "
\n"); } replace(line, re, "%1"); results.append(line); results.append( "
\n"); founds++; pos += re.matchedLength(); } } io->close(); delete io; } results.append( ""); return results; } qtoctave-0.10.1/qtoctave/clean.sh0000755000175000017500000000064411511434230015664 0ustar lucaslucasrm *~ make clean rm -Rf CMakeFiles/ _CPack_Packages/ rm -f CMakeCache.txt rm -f cmake_install.cmake install_manifest.txt rm -f CPackConfig.cmake CPackSourceConfig.cmake for a in `find . -regex '.*~'`; do echo $a rm -f $a done cd src #make clean rm -Rf CMakeFiles/ rm -f CMakeCache.txt rm -f cmake_install.cmake install_manifest.txt rm -f *~ rm -f qtoctave configure.h rm -f Makefile clean cd .. rm -f Makefile clean qtoctave-0.10.1/qtoctave/CMakeLists.txt0000644000175000017500000000305611511434230017003 0ustar lucaslucasCMAKE_MINIMUM_REQUIRED(VERSION 2.4) # The name of our project is "QTOCTAVE". CMakeLists files in this project can # refer to the root source directory of the project as ${QTOCTAVE_SOURCE_DIR} and # to the root binary directory of the project as ${QTOCTAVE_BINARY_DIR}. project (qtoctave) #include ("options.txt") SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake-modules/) #Uncoment to Verbose mode #set(CMAKE_VERBOSE_MAKEFILE TRUE) ADD_DEFINITIONS(-DUSER_CONFIG) add_subdirectory (src) # install ( # TARGETS src/config_files/qtoctave # RUNTIME DESTINATION bin # ) IF (UNIX) SET(CPACK_CMAKE_GENERATOR "Unix Makefiles") SET(CPACK_SOURCE_GENERATOR "TGZ") SET(CPACK_GENERATOR "TGZ") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "qtoctave - a frontend for GNU octave") SET(CPACK_PACKAGE_VENDOR "The qtoctave team") SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/readme.txt") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE_GPL.txt") SET(CPACK_PACKAGE_NAME qtoctave) SET(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}) SET(CPACK_PACKAGE_VERSION_MAJOR "0") SET(CPACK_PACKAGE_VERSION_MINOR "8.2") SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}") SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}") SET(CPACK_SOURCE_IGNORE_FILES "/.svn/;/cmake-build/") INCLUDE(CPack) INCLUDE(UseRPMTools OPTIONAL) IF(RPMTools_FOUND) RPMTools_ADD_RPM_TARGETS(${PROJECT_NAME} ${PROJECT_NAME}.spec.in) ENDIF(RPMTools_FOUND) ENDIF (UNIX) qtoctave-0.10.1/qtoctave/build.sh0000755000175000017500000000076211511434226015707 0ustar lucaslucas #cmake "-DCMAKE_INSTALL_PREFIX:PATH=/usr/local" . #cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -s -march=native -mtune=native -Wall -pipe" "-DCMAKE_INSTALL_PREFIX:PATH=/opt/qtoctave-0.9.1" "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" . #cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O0 -s -Wall -pipe" "-DCMAKE_INSTALL_PREFIX:PATH=/home/lucas/usr" . cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -s -Wall -pipe" "-DCMAKE_INSTALL_PREFIX:PATH=/tmp/qtoctave" "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" . #make install qtoctave-0.10.1/qtoctave/LICENSE_GPL.txt0000644000175000017500000004366211511434226016604 0ustar lucaslucas The QtOctave is Copyright (C) 2006, 2007, 2008 P.L. Lucas You may use, distribute and copy the QtOctave under the terms of GNU General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ------------------------------------------------------------------------- qtoctave-0.10.1/qtoctave/qtoctave.spec.in0000644000175000017500000000221711511434226017355 0ustar lucaslucas %define version @CPACK_PACKAGE_VERSION_MAJOR@.@CPACK_PACKAGE_VERSION_MINOR@ %define release @CPACK_PACKAGE_VERSION_PATCH@ Name: @PROJECT_NAME@ Version: %{version} Release: %{release} License: GPL Group: Applications/Engineering URL: http://qtoctave.wordpress.com/ Packager: Wolfgang Dautermann # source + patches Source: @CPACK_SOURCE_PACKAGE_FILE_NAME@.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot BuildRequires: cmake %define srcdirname %{name}-%{version} %define builddirname %{_tmppath}/%{name}.build Summary: Qtoctave - a frontend for GNU octave %description qtoctave is a frontend for GNU octave based on QT4 %prep -n%{name}-%{version} %setup -q -n %{srcdirname} %build rm -rf %{builddirname} mkdir %{builddirname} cd %{builddirname} cmake @CMAKE_SOURCE_DIR@ -DCMAKE_INSTALL_PREFIX:PATH=/usr make %install rm -rf %{buildroot} cd %{builddirname} %makeinstall #%pre #%post #%preun #%postun %clean rm -rf %{buildroot} rm -rf %{builddirname} %files %defattr(-,root,root,-) %{_bindir}/* %{_datadir}/qtoctave %changelog * Sun May 22 2008 Wolfgang Dautermann - First RPM Build qtoctave-0.10.1/qtoctave/readme.txt0000644000175000017500000000122211511434226016237 0ustar lucaslucasINSTALL. QtOctave requires: * Qt4 library and Qt4 devel packages. Version 4.3.1 or better. * Octave program. Version 3.0.0 or better. (http://www.gnu.org/software/octave/) * cmake program. (http://www.cmake.org/) * a C++ - compiler, eg. the GNU compiler (http://gcc.gnu.org/) For building QtOctave from source execute: tar xvzf qtoctave-0.7.4.tar.gz cd qtoctave-0.7.4 mkdir build cd build cmake .. # if you want a specific install-path (for example your $HOME directory, if you are not root), # you can do "cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/some/path" make make install Maybe you should be root user when installing (it depends on install path). qtoctave-0.10.1/qtoctave/qtoctave.nsi0000644000175000017500000000306011511434226016604 0ustar lucaslucas; example1.nsi ; ; This script is perhaps one of the simplest NSIs you can make. All of the ; optional settings are left to their default settings. The installer simply ; prompts the user asking them where to install, and drops a copy of example1.nsi ; there. ;-------------------------------- ; The name of the installer Name "QtOctave" ; The file to write OutFile "qtoctave.exe" ; The default installation directory InstallDir $PROGRAMFILES\QtOctave ;-------------------------------- ; Pages Page directory Page instfiles ;-------------------------------- ; The stuff to install Section "" ;No components page, name is not important ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put file there File /r qtoctave WriteUninstaller "uninstall.exe" SectionEnd ; end the section Section "Start Menu Shortcuts" CreateDirectory "$SMPROGRAMS\QtOctave" SetOutPath "$INSTDIR\qtoctave\" CreateShortCut "$SMPROGRAMS\QtOctave\QtOctave.lnk" "$INSTDIR\qtoctave\qtoctave.exe" CreateShortCut "$SMPROGRAMS\QtOctave\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 SectionEnd ;-------------------------------- ; Uninstaller Section "Uninstall" ; Remove registry keys ; Remove files and uninstaller ;Delete "$INSTDIR\qtoctave\*.*" ;RMDir "$INSTDIR\qtoctave\" ; Remove shortcuts, if any Delete "$SMPROGRAMS\QtOctave\*.*" ; Remove directories used RMDir "$SMPROGRAMS\QtOctave" RMDir /r "$INSTDIR" SectionEnd qtoctave-0.10.1/easy_plot/clean.sh0000755000175000017500000000021411511434226016033 0ustar lucaslucasmake clean rm -Rf CMakeFiles/ rm -f CMakeCache.txt rm -f cmake_install.cmake install_manifest.txt rm -f Makefile rm -f *~ cd src sh clean.shqtoctave-0.10.1/easy_plot/CMakeLists.txt0000755000175000017500000000057311511434226017165 0ustar lucaslucasCMAKE_MINIMUM_REQUIRED(VERSION 2.4) # The name of our project is "EASY_PLOT". CMakeLists files in this project can # refer to the root source directory of the project as ${EASY_PLOT_SOURCE_DIR} and # to the root binary directory of the project as ${EASY_PLOT_BINARY_DIR}. project (easy_plot) #include ("options.txt") set(CMAKE_VERBOSE_MAKEFILE TRUE) add_subdirectory (src) qtoctave-0.10.1/easy_plot/leeme.txt0000755000175000017500000000055111511434226016251 0ustar lucaslucasEasy Plot. ---------- Es una aplicación que usa el "driver" svg de Gnuplot para mostrar gráficos y menús para manipularlos de forma sencilla. Instalación. ------------ Los requisitos para instalarlo son: -Tener las bibliotecas Qt 4.3 ó superior. -Tener instalado Gnuplot. -Tener instalado CMake. Para instalarlo, teclee: cmake . make make install qtoctave-0.10.1/easy_plot/build.sh0000755000175000017500000000031611511434226016053 0ustar lucaslucas cmake "-DCMAKE_INSTALL_PREFIX:PATH=/home/usr/local" . #cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -s -march=pentium4 -mtune=pentium4 -Wall" "-DCMAKE_INSTALL_PREFIX:PATH=/home/lucas/usr" . make install qtoctave-0.10.1/easy_plot/LICENSE_GPL.txt0000755000175000017500000004364611511434226016762 0ustar lucaslucas The EasyPlot is Copyright (C) 2008 P.L. Lucas You may use, distribute and copy the QtOctave under the terms of GNU General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ------------------------------------------------------------------------- qtoctave-0.10.1/easy_plot/readme.txt0000755000175000017500000000036511511434226016422 0ustar lucaslucasEasy Plot. ---------- It's an application for plotting. It uses Gnuplot's svg driver. You can change your plots using menus. Install. -------- It requires: -Qt 4.3 or better. -Gnuplot. -CMake. To install execute: cmake . make make install qtoctave-0.10.1/simple_rcs/clean.sh0000755000175000017500000000063111511434226016177 0ustar lucaslucasrm *~ make clean rm -Rf CMakeFiles/ _CPack_Packages/ rm -f CMakeCache.txt rm -f cmake_install.cmake install_manifest.txt rm -f CPackConfig.cmake CPackSourceConfig.cmake for a in `find . -regex '.*~'`; do echo $a rm -f $a done cd src #make clean rm -Rf CMakeFiles/ rm -f CMakeCache.txt rm -f cmake_install.cmake install_manifest.txt rm -f *~ rm -f simplercs rm -f Makefile clean cd .. rm -f Makefile clean qtoctave-0.10.1/simple_rcs/CMakeLists.txt0000644000175000017500000000103511511434226017315 0ustar lucaslucasCMAKE_MINIMUM_REQUIRED(VERSION 2.4) # The name of our project is "SIMPLERCS". CMakeLists files in this project can # refer to the root source directory of the project as ${SIMPLERCS_SOURCE_DIR} and # to the root binary directory of the project as ${SIMPLERCS_BINARY_DIR}. project (simplercs) #include ("options.txt") #Uncoment to Verbose mode #set(CMAKE_VERBOSE_MAKEFILE TRUE) #ADD_DEFINITIONS(-DUSER_CONFIG) add_subdirectory (src) install( DIRECTORY design DESTINATION share/doc/qtoctave-utils/simple_rcs PATTERN ".svn" EXCLUDE )qtoctave-0.10.1/simple_rcs/build.sh0000755000175000017500000000054211511434226016215 0ustar lucaslucas #cmake "-DCMAKE_INSTALL_PREFIX:PATH=/usr/local" . cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -s -march=pentium4 -mtune=pentium4 -Wall -pipe" "-DCMAKE_INSTALL_PREFIX:PATH=/home/lucas/usr" "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" . #cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O0 -s -Wall -pipe" "-DCMAKE_INSTALL_PREFIX:PATH=/home/lucas/usr" . #make install qtoctave-0.10.1/simple_rcs/LICENSE_GPL.txt0000644000175000017500000004366311511434226017117 0ustar lucaslucas The SimpleRcs is Copyright (C) 2006, 2007, 2008 P.L. Lucas You may use, distribute and copy the QtOctave under the terms of GNU General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ------------------------------------------------------------------------- qtoctave-0.10.1/xmlwidget/CMakeLists.txt0000644000175000017500000000026011511434226017160 0ustar lucaslucasadd_subdirectory(qt4) install( DIRECTORY doc DESTINATION share/doc/qtoctave-utils/xmlwidget ) install( DIRECTORY examples DESTINATION share/doc/qtoctave-utils/xmlwidget )qtoctave-0.10.1/xmlwidget/LICENSE_GPL.txt0000755000175000017500000004366211511434226016765 0ustar lucaslucas The QtOctave is Copyright (C) 2006, 2007, 2008 P.L. Lucas You may use, distribute and copy the QtOctave under the terms of GNU General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ------------------------------------------------------------------------- qtoctave-0.10.1/xmlwidget/readme.txt0000755000175000017500000000037111511434226016424 0ustar lucaslucasXmlWidget can create windows using XML languaje. XML window description is sended to XmlWidget using standard input. Events are returned using standard output. There are two versions. Qt4 version in qt4 directory and Gtk2 version in gtk2 directory.qtoctave-0.10.1/qtjs/install.txt0000644000175000017500000000030111511434226015600 0ustar lucaslucasTo install qtjs: You must install Qt4.4, and Qt4.4-devel. In directory qtjs, you can read file "qtjs.pro". Write in your terminal: qmake make Finally copy executable file to /usr/local/bin qtoctave-0.10.1/qtjs/instalar.txt0000644000175000017500000000046511511434225015761 0ustar lucaslucasPara instalar qtjs: Debes tener instalada Qt4.4, así como los paquetes de desarrollo (las distribuciones de Linux normalmente llaman a estos paquetes qt4-dev). Entra en el directorio qtjs, verás el archivo "qtjs.pro". Entonces teclea: qmake make Finalmente copia el ejecutable generado a /usr/local/bin qtoctave-0.10.1/qtjs/CMakeLists.txt0000644000175000017500000000026711511434225016143 0ustar lucaslucasadd_subdirectory (src) install( DIRECTORY doc DESTINATION share/doc/qtoctave-utils/qtjs ) install( FILES "instalar.txt" "install.txt" DESTINATION share/doc/qtoctave-utils/qtjs )qtoctave-0.10.1/qtjs/LICENSE_GPL.txt0000644000175000017500000004363611511434225015737 0ustar lucaslucas The qtjs is Copyright (C) 2009 P.L. Lucas You may use, distribute and copy the qtjs under the terms of GNU General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ------------------------------------------------------------------------- qtoctave-0.10.1/widgetserver/leeme.txt0000755000175000017500000000117511511434230016762 0ustar lucaslucasWidgetServer es un programa para hacer ventanas. Para ello usa un lenguaje muy sencillo. Los programas pueden comunicarse con el WidgetServer usando la entrada estándar y los eventos son enviados a la salida estándar. Así se pueden crear ventanas desde C, Python, Java, Perl, Bash,... INSTALACIÓN Hay que abrir una sesión de terminal y entrar en el directorio widgetserver dentro de los fuentes. Allí verás el fichero widgetserver.pro. Una vez allí hay que teclear: qmake make La compilación se iniciará y finalmente aparecerá el ejecutable. Dicho ejecutable se debe copiar al directorio donde el usuario desee instalarlo.qtoctave-0.10.1/widgetserver/LICENSE_GPL.txt0000755000175000017500000004364611511434230017470 0ustar lucaslucas The QtOctave is Copyright (C) 2006 P.L. Lucas You may use, distribute and copy the QtOctave under the terms of GNU General Public License version 2, which is displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ------------------------------------------------------------------------- qtoctave-0.10.1/widgetserver/readme.txt0000755000175000017500000000122411511434230017123 0ustar lucaslucasWidgetServer can make windows. In this work, it uses a very easy language. Programs can deal with WidgetServer using standard input and they can get widgets events in standar output. WidgetServer is independent of programming languaje. It can create windows from C, Python, Java, Perl, Bash,... INSTALL You need install Qt4 and Qt4-dev package in your system. Then open a terminal session and enter in widgetserver directory (inside of source directory): cd widgetserver There you will see "widgetserver.pro" file. Then write: qmake make Compilation starts. When it finishs, "widgetserver" executable appeared. You can copy "widgetserver" to final path. qtoctave-0.10.1/install_scripts/build_installer.c0000755000175000017500000002356511511434226021171 0ustar lucaslucas#include #include #include #include #include #include #include #include #include #include #include /*****************************************************************/ /*****************************************************************/ /** String TDA. */ typedef struct { char *str; int len; } String; String *new_string() { String *s=(String*)malloc(sizeof(String)); if(s==NULL) { printf("Memoria agotada\n"); exit(0); } s->len=0; s->str=NULL; return s; } void delete_string(String *s) { free(s->str); free(s); } void string_append(String *s, char *text) { if(text==NULL) return; int len=strlen(text)+1; s->len+=len; if(s->str==NULL) {s->str=(char*)malloc(sizeof(char)*s->len);*s->str='\0';} else s->str=(char*)realloc(s->str,sizeof(char)*s->len); strcat(s->str, text); } void string_replace(String *s, char *label, char *text) { char *l=strstr(s->str, label); String *result=new_string(); if(l==NULL) return; *l='\0'; string_append(result, s->str); if(text!=NULL) string_append(result, text); string_append(result, l+strlen(label)); //puts(result->str); free(s->str); s->str=result->str; free(result); s->len=strlen(s->str); } void string_clear(String *s) { free(s->str); s->len=0; s->str=NULL; } /*****************************************************************/ /*****************************************************************/ /**Crea una expresión regular.*/ void create_reg_exp(regex_t *cre, const char *re) { int errcode; if( ( errcode=regcomp(cre , re, REG_EXTENDED) ) ) { size_t length = regerror (errcode, cre, NULL, 0); char *buffer = (char*) malloc (length+1); regerror (errcode, cre, buffer, length); printf("Error in regular expression: %s\nError # %d: %s\n", re, errcode, buffer); free(buffer); exit(0); } } /**Copy matched substring to str*/ void reg_exp_match(char *line, char *str, regmatch_t match) { int i; for(i=match.rm_so;i< match.rm_eo;i++) { *str=line[i]; str++; } *str='\0'; } /*****************************************************************/ /*****************************************************************/ void append_char_str(char ***array, char *str) { int len=0; if(*array!=NULL) { while((*array)[len]!=NULL) { //puts((*array)[len]); len++; } } *array=(char**)realloc(*array, (len+2)*sizeof(char*)); (*array)[len]=str; (*array)[++len]=NULL; } /*****************************************************************/ /*****************************************************************/ String *load_base_cmake_file(char *cmake_file) { String *base_str=new_string(); char buf[512]; FILE *in=fopen(cmake_file, "r" ); if(in==NULL) { printf("No se puede leer %s\n", cmake_file); exit(0); } while(!feof(in)) { //*buf='\0'; if( fgets(buf, sizeof(buf), in)==NULL ) break; //puts(buf); string_append(base_str, buf); } fclose(in); return base_str; } /*****************************************************************/ /*****************************************************************/ void find_files(char ***files, char *directorio, regex_t *re) { struct dirent *ep; int len; regmatch_t match[2]; String *dir_name=new_string(); string_append(dir_name, directorio); //printf("Directorio %s\n", dir_name->str); if(*files==NULL) { len=1; } DIR *dir=opendir(directorio); if(dir==NULL) { printf("No se puede abrir el directorio %s\n", directorio); exit(0); } while ( (ep = readdir (dir)) ) { struct stat buf; String *file=new_string(); string_append(file, dir_name->str); string_append(file, "/"); string_append(file, ep->d_name); //printf("Procesando %s\n", ep->d_name); //printf("Procesando %s\n", file->str); stat(file->str, &buf); if( 0!=strcmp(ep->d_name,".") && 0!=strcmp(ep->d_name,"..") && S_ISDIR( buf.st_mode ) ) { find_files(files, file->str, re); } else if( !regexec(re, ep->d_name, 2, match, 0)) { //printf("Procesando %s\n", ep->d_name); append_char_str(files, strdup(file->str) ); } delete_string(file); } closedir(dir); } /*****************************************************************/ /*****************************************************************/ char *file_name(char *path) { char *p=strrchr(path,'/'); if(p==NULL) return strdup(path); else return strdup(++p); } char *file_path(char *path) { char *p=strrchr(path,'/'); if(p==NULL) return p; else { char *d=strdup(path); p=strrchr(d,'/'); *(++p)='\0'; return d; } } /*****************************************************************/ /*****************************************************************/ int grep(char *name, char *world) { FILE *in=fopen(name,"r"); if(in==NULL) return 0; char line[1024]; while(!feof(in)) { if(NULL!=fgets(line, sizeof(line), in) ) { if( NULL!=strstr(line, world) ) return 1; } } fclose(in); return 0; } /*****************************************************************/ /**Crea un proyecto de CMake a partir de un directorio dado.*/ /*****************************************************************/ int build_cmake_project(char *directorio, char *directorio_src, char *cmake_file) { String *base_str=load_base_cmake_file(cmake_file), *aux; char **ui_files=NULL, **cpp_files=NULL, **h_files=NULL; int i; regex_t re; String *command=new_string(); string_append(command, "cd "); string_append(command, directorio); string_append(command, "; sh clean.sh"); printf("Ejecutando: %s\n", command->str); system(command->str); create_reg_exp(&re, ".*\\.ui$"); find_files(&ui_files, directorio_src, &re); regfree(&re); create_reg_exp(&re, ".*\\.cpp$"); find_files(&cpp_files, directorio_src, &re); regfree(&re); create_reg_exp(&re, ".*\\.h$"); find_files(&h_files, directorio_src, &re); regfree(&re); /*Se quitan las extensiones y el directorio a los archivos*/ for(i=0;h_files!=NULL && h_files[i]!=NULL;i++) { h_files[i]=h_files[i]+strlen(directorio_src)+1; h_files[i][strlen(h_files[i])-2]='\0'; printf("Encontrado: %s.h\n", h_files[i]); } for(i=0;cpp_files!=NULL && cpp_files[i]!=NULL;i++) { cpp_files[i]=cpp_files[i]+strlen(directorio_src)+1; cpp_files[i][strlen(cpp_files[i])-4]='\0'; printf("Encontrado: %s.cpp\n", cpp_files[i]); } for(i=0;ui_files!=NULL && ui_files[i]!=NULL;i++) { ui_files[i]=ui_files[i]+strlen(directorio_src)+1; ui_files[i][strlen(ui_files[i])-3]='\0'; printf("Encontrado: %s.ui\n", ui_files[i]); } /*Se procesan los ficheros ui*/ aux=new_string(); for(i=0;ui_files!=NULL && ui_files[i]!=NULL;i++) { char *path=file_path(ui_files[i]); char *name=file_name(ui_files[i]); string_append(aux, "QT4_WRAP_UI("); //string_append(aux, path); string_append(aux, "ui_"); string_append(aux, name); string_append(aux, ".h "); string_append(aux, path); string_append(aux, name); string_append(aux, ".ui)\n"); free(path); free(name); } if(aux->len!=0) string_replace(base_str, "#wrap_ui#",aux->str); else string_replace(base_str, "#wrap_ui#", ""); delete_string(aux); /*Se procesan los ficheros moc*/ aux=new_string(); for(i=0;h_files!=NULL && h_files[i]!=NULL;i++) { char *path=file_path(h_files[i]); char *name=file_name(h_files[i]); String *_file=new_string(); string_append(_file, directorio_src); string_append(_file, "/"); string_append(_file, path); string_append(_file, name); string_append(_file, ".h"); if( grep(_file->str, "Q_OBJECT") ) { string_append(aux, "QT4_WRAP_CPP("); string_append(aux, "moc_"); string_append(aux, name); string_append(aux, " "); string_append(aux, path); string_append(aux, name); string_append(aux, ".h)\n"); } free(path); free(name); delete_string(_file); } if(aux->len!=0) string_replace(base_str, "#wrap_cpp#",aux->str); else string_replace(base_str, "#wrap_cpp#",""); delete_string(aux); /*Se añaden las dependencias*/ aux=new_string(); for(i=0;h_files!=NULL && h_files[i]!=NULL;i++) { char *path=file_path(h_files[i]); char *name=file_name(h_files[i]); String *_file=new_string(); string_append(aux, "\t"); string_append(aux, path); string_append(aux, name); string_append(aux, ".h\n"); string_append(_file, directorio_src); string_append(_file, "/"); string_append(_file, path); string_append(_file, name); string_append(_file, ".h"); if( grep(_file->str, "Q_OBJECT") ) { string_append(aux, "\tmoc_"); string_append(aux, name); string_append(aux, ".cxx\n"); } delete_string(_file); free(path); free(name); } for(i=0;cpp_files!=NULL && cpp_files[i]!=NULL;i++) { char *path=file_path(cpp_files[i]); char *name=file_name(cpp_files[i]); string_append(aux, "\t"); string_append(aux, path); string_append(aux, name); string_append(aux, ".cpp\n"); free(path); free(name); } for(i=0;ui_files!=NULL && ui_files[i]!=NULL;i++) { char *path=file_path(ui_files[i]); char *name=file_name(ui_files[i]); string_append(aux, "\t"); //string_append(aux, path); string_append(aux, "ui_"); string_append(aux, name); string_append(aux, ".h\n"); free(path); free(name); } string_replace(base_str, "#dependencias#",aux->str); delete_string(aux); string_clear(command); string_append(command, directorio_src); string_append(command, "/CMakeLists.txt"); FILE *out=fopen(command->str,"w"); fputs(base_str->str,out); fclose(out); delete_string(base_str); delete_string(command); return 0; } /*****************************************************************/ /**Función principal.*/ /*****************************************************************/ int main(int argn, char *argv[]) { printf("\nProcesando QtOctave\n"); build_cmake_project("qtoctave", "qtoctave/src", "build_qtoctave_installer.txt"); printf("\n\nProcesando xmlwidget\n\n"); build_cmake_project("xmlwidget/qt4", "xmlwidget/qt4/src", "build_xmlwidget_installer.txt"); } qtoctave-0.10.1/install_scripts/libs_copy.c0000644000175000017500000000614711511434226017772 0ustar lucaslucas#include #include #include #include #include void copy_file(char *origin, char *dest) { FILE *in=fopen(origin, "r"), *out; char *buf[1024]; struct stat file_stat; if(in==NULL) { printf("Error: Origin file %s can't be opened\n", origin); return; } stat(origin, &file_stat); out=fopen(dest, "w"); if(out==NULL) { printf("Error: Destination file %s can't be opened\n", dest); return; } printf("%s -> %s\n", origin, dest); while(!feof(in)) { int i=fread(buf, sizeof(char), sizeof(buf), in); if(i>0) fwrite(buf, sizeof(char), i, out); } fclose(in); fclose(out); chmod (dest, file_stat.st_mode); } enum State {FIND_LIBRARY_NAME, FIND_LIBRARY_NAME_END, FIND_LIBRARY_PATH, FIND_LIBRARY_PATH_END, END}; void process_line(char *line, char **library, char **library_path) { int i, len=strlen(line); char ch; enum State state=FIND_LIBRARY_NAME; *library=*library_path=NULL; printf("Entry: %s",line); for(i=0;i=0;i--) { ch=(*library)[i]; if(ch=='/') { *library_path=*library+i+1; break; } } aux=*library_path; *library_path=*library; *library=aux; } } int main(int argn, char *argv[]) { char *command; char *path; char *library, *library_path; char line[1024], ldd[1024], copy[1024]; FILE *in; if(argn<3) { printf("%s command path\n\nCopy 'command' library dependences obtained with ldd to 'path'\n", argv[0]); return 0; } command=argv[1]; path=argv[2]; puts(command); puts(path); puts("\n"); sprintf(ldd,"ldd \"%s\"", command); puts(ldd); /*Exec ldd*/ in=popen(ldd,"r"); if(in==NULL) { printf("Command %s not found\n", command); return 1; } while(!feof(in)) { if(NULL==fgets(line, sizeof(line), in)) break; library=library_path=NULL; process_line(line, &library, &library_path); printf("library: %s library_path: %s\n", library, library_path); if(library!=NULL) { if(library_path!=NULL) { //sprintf(copy,"cp -fv %s %s", library_path, path); sprintf(copy,"%s/%s", path, library); copy_file(library_path, copy); } else { //sprintf(copy,"cp -fv %s %s", library, path); sprintf(copy,"%s/%s", path, library); copy_file(library, copy); } //system(copy); } puts("\n"); } pclose(in); return 0; } qtoctave-0.10.1/install_scripts/build_xmlwidget_installer.txt0000755000175000017500000000132511511434226023640 0ustar lucaslucasFIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") SET(QT_USE_QTXML 1) include(UseQt4) include_directories(${QT_INCLUDE_DIR}) include_directories(${QT_QT_INCLUDE_DIR}) include_directories(${QT_QTCORE_INCLUDE_DIR}) include_directories(${QT_QTGUI_INCLUDE_DIR}) include_directories(${QT_QTXML_INCLUDE_DIR}) #include_directories(${QT_QTSVG_INCLUDE_DIR}) #QT4_WRAP_UI(ui_design_main_window.h design_main_window.ui) #wrap_ui# #QT4_WRAP_CPP(moc_gnuplot_connection gnuplot_connection.h) #wrap_cpp# add_executable(xmlwidget #dependencias# ) TARGET_LINK_LIBRARIES(xmlwidget ${Qt4_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY}) install ( PROGRAMS xmlwidget DESTINATION bin ) qtoctave-0.10.1/install_scripts/build_qtoctave_installer.txt0000755000175000017500000000314111511434226023460 0ustar lucaslucasFIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") SET(QT_USE_QTXML 1) include(UseQt4) include_directories(${QT_INCLUDE_DIR}) include_directories(${QT_QT_INCLUDE_DIR}) include_directories(${QT_QTCORE_INCLUDE_DIR}) include_directories(${QT_QTGUI_INCLUDE_DIR}) include_directories(${QT_QTXML_INCLUDE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${QT_QTSVG_INCLUDE_DIR}) FILE(GLOB_RECURSE qtoctave_moc_headers *.h ) FILE(GLOB_RECURSE qtoctave_sources *.cpp ) FILE(GLOB_RECURSE qtoctave_ui *.ui ) # run uic on .ui files: QT4_WRAP_UI( qtoctave_ui_headers ${qtoctave_ui} ) # run moc on these files: QT4_WRAP_CPP( qtoctave_moc_sources ${qtoctave_moc_headers} ) add_executable(qtoctave ${qtoctave_sources} ${qtoctave_moc_sources} ${qtoctave_ui_headers} ${qtoctave_moc_headers} ) SET_TARGET_PROPERTIES(qtoctave PROPERTIES INSTALL_RPATH ":usr/lib" BUILD_WITH_INSTALL_RPATH true INSTALL_RPATH_USE_LINK_PATH true ) TARGET_LINK_LIBRARIES(qtoctave ${Qt4_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTSVG_LIBRARY}) install ( DIRECTORY images octave_doc qtoctave_doc menus scripts lang DESTINATION share/qtoctave PATTERN ".svn" EXCLUDE ) install ( TARGETS qtoctave RUNTIME DESTINATION bin ) install ( FILES config_files/config.rc config_files/octave.xml DESTINATION share/qtoctave ) install ( FILES config_files/qtoctave.desktop DESTINATION share/applications ) install ( FILES config_files/qtoctave.png DESTINATION share/icons/hicolor/64x64/apps/ ) qtoctave-0.10.1/install_scripts/build_qtoctave_rpath_binary.sh0000755000175000017500000000734311511434226023750 0ustar lucaslucas#!/bin/bash if [[ -z $1 ]]; then cat< binaries/install.sh #!/bin/bash echo Installing... mkdir -p $install_path cp -R * $install_path EOF echo 'if [[ $? -ne 0 ]]; then' >> binaries/install.sh cat<> binaries/install.sh echo "Error: Files can not be copied to $install_path" echo "Maybe you will need be a root user" exit 1 fi cp --parents share/applications/qtoctave.desktop /usr/local/ cp --parents share/icons/hicolor/64x64/apps/qtoctave.png /usr/local/ EOF for file in `ls binaries/bin`; do cat<> binaries/install.sh cat< /usr/local/bin/$file #!/bin/bash exec $install_path/bin/ld-linux.so.2 --library-path $install_path/bin/ $install_path/bin/$file EOL chmod +x /usr/local/bin/$file EOF done cat<> binaries/install.sh echo echo Execute qtoctave to start QtOctave echo EOF chmod +x binaries/install.sh #################################################################### #Herramienta de desinstalación #################################################################### echo '#!/bin/bash' > binaries/uninstall-$version.sh echo 'echo Uninstallig' $version >> binaries/uninstall-$version.sh for file in `ls binaries/bin/`; do cat<> binaries/uninstall-$version.sh rm -f /usr/local/bin/$file rm -f /usr/local/share/applications/qtoctave.desktop rm -f /usr/local/share/icons/hicolor/64x64/apps/qtoctave.png EOL echo 'if [[ $? -ne 0 ]]; then' >> binaries/uninstall-$version.sh cat<> binaries/uninstall-$version.sh echo "Error: File /usr/local/bin/$file can not be removed" echo "Maybe you will need be a root user" fi EOL done echo "exec rm -Rf $install_path" >> binaries/uninstall-$version.sh chmod +x binaries/uninstall-$version.sh echo echo "Copiando bibliotecas" echo make ./libs_copy binaries/bin/qtoctave binaries/bin echo echo "Copiando licencias" echo cp qtoctave/LI* binaries/ echo echo "Creando ficheros readme.txt y leeme.txt" echo cat<> binaries/leeme.txt QtOctave es un front-end para Octave. Para realizar la instalación ejecutar el archivo "install.sh" como usuario root. En Ubuntu en un terminal habría que ejecutar: sudo install.sh En otras distribuciones: su install.sh Para realizar la desinstalación ejecutar el archivo "$install_path/uninstall-$version.sh" como usuario root. EOL cat<> binaries/readme.txt QtOctave is a simple front-end for Octave. To install execute "install.sh" as root user. In Ubuntu, write in terminal: sudo install.sh In others: su install.sh To uninstall execute as root user "$install_path/uninstall-$version.sh" EOL echo echo "Comprimiendo $version.tar.bz2" echo mv binaries $version rm -f $version.binaries.tar.bz2 tar -cf $version.binaries.tar $version bzip2 -9 $version.binaries.tar #gzip -9 $version.binaries.tar echo echo Finalizado echo qtoctave-0.10.1/qtoctave_pkg/src/pkg_manager.h0000644000175000017500000000314711511434231020321 0ustar lucaslucas/* * pkg_manager.h * */ #ifndef __PKG_MANAGER_H__ #define __PKG_MANAGER_H__ #include #include #include "ui_pkg_manager.h" #include "octave_bind.h" #include "download.h" class PkgManager: public QMainWindow, public Ui::MainWindow { Q_OBJECT private: //QMap > packageTree; QList packList; QString currentPackage; DownloadDialog download; QList installList, removeList; public: OctaveBind octaveBind; // Constructor PkgManager(QWidget *parent = 0, Qt::WindowFlags flags = 0); /* Loads repository info from a XML file * path: The path of the XML file * returns true if it could load the file, false otherwise */ bool loadRepositoryFile(QString path); /* Adds a group to the repository * name: The name of the group (i.e. 'Main repository') * children: The list of packages */ void addGroup(const QString &name/*, const QList &children*/); /* Adds a list of packages to the repository * name: The name of the group (i.e. 'Main repository') * children: The list of packages */ void addPackageList(const QList &children); /* Clears the tree */ void clear(); private slots: void help(); //void settings(); //void update(); void selectGroup(); void selectPackage(); void packageChanged(QTreeWidgetItem *item, int col = 0); void packageChangeInstallState(const QModelIndex &index); void downloadAndInstall(); void downloadReady(); void downloadError(QString msg); void search(); }; #endif qtoctave-0.10.1/qtoctave_pkg/src/qtoctave_pkg.pro0000644000175000017500000000077111511434231021106 0ustar lucaslucas###################################################################### # Automatically generated by qmake (2.01a) lun sep 8 11:58:25 2008 ###################################################################### TEMPLATE = app TARGET = qtoctave_pkg DEPENDPATH += . . INCLUDEPATH += . QT += xml network # Input HEADERS += config.h pkg_manager.h octave_bind.h download.h FORMS += about.ui pkg_manager.ui download.ui SOURCES += main.cpp pkg_manager.cpp octave_bind.cpp download.cpp RESOURCES += resources.qrc qtoctave-0.10.1/qtoctave_pkg/src/main.cpp0000644000175000017500000000341511511434231017323 0ustar lucaslucas#include #include #include #include #include #include "pkg_manager.h" #include "config.h" #include "octave_bind.h" #include "download.h" using namespace std; int main(int argn, char **argc) { try{ QApplication app(argn, argc); PkgManager manager; // Wait to get all information from Octave while(manager.octaveBind.getStatus() != OctaveBind::Ready) app.processEvents(); /** Download list **/ DownloadDialog *initDownload = new DownloadDialog(NULL); QString tmpFile = DEFAULT_REPOSITORY_FILE; tmpFile = QDir::tempPath()+ "/" + tmpFile.split("/").last(); initDownload->show(); if(argn==2) initDownload->get(argc[1], tmpFile); else if(argn==3) initDownload->get(argc[1], argc[2]); else initDownload->get(DEFAULT_REPOSITORY_FILE, tmpFile); //while(initDownload->isActive()) // app.processEvents(); initDownload->exec(); printf("[main] Files downloaded\n"); if(argn==3) return 0; if(QFile::exists(tmpFile)) { printf("[main] Loading repository file\n"); manager.loadRepositoryFile(tmpFile); } // Only for testing //manager.loadRepositoryFile("../octave-forge.xml"); delete initDownload; /* End of download */ manager.show(); if(getuid() == 0) { QMessageBox msgBox(QMessageBox::Warning, msgBox.tr("Superuser privileges"), msgBox.tr("It is not recommended to run this program as root." "Do it only if you know what are you doing."), QMessageBox::Ok | QMessageBox::Close); if(msgBox.exec() == QMessageBox::Close) return 0; } // Execute return app.exec(); }catch(QString e) { cerr << e.toLocal8Bit().constData() << endl; } } qtoctave-0.10.1/qtoctave_pkg/src/octave_bind.cpp0000644000175000017500000001554711511434231020665 0ustar lucaslucas/* * octave_bind.cpp * * This code is used to interact with Octave */ #include #include #include #include "octave_bind.h" const char *OctaveBind::OCTAVE_PROMPT = "octave$>"; // Constructor // Runs the Octave process OctaveBind::OctaveBind() throw (QString): octaveProcess(this) { // Start octave and ask for prefix path QStringList args; status = OctaveBind::WaitingPrefix | OctaveBind::Initializing; args << "-i" << "-q" << "--persist" << "--no-history" << "--eval" << QString("PS1('") + OCTAVE_PROMPT + "'); PS2(''); pkg prefix;"; octaveProcess.start("octave", args); if(!octaveProcess.waitForStarted()) throw QString("Can not start Octave. Maybe it is not installed or can not be found in PATH"); // Connections connect(&octaveProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(error(QProcess::ProcessError))); connect(&octaveProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus))); connect(&octaveProcess, SIGNAL(readyReadStandardError()), this, SLOT(readyStdErr())); connect(&octaveProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readyStdOut())); // Log std::cout << "[OctaveBind::OctaveBind()] Octave running. Initializing..." << std::endl; } // Destructor OctaveBind::~OctaveBind() { QString cmd = "quit\n"; octaveProcess.write(cmd.toLocal8Bit()); octaveProcess.waitForFinished(); octaveProcess.terminate(); octaveProcess.waitForFinished(); } // Get the status unsigned OctaveBind::getStatus() { return status; } // Wait void OctaveBind::wait() { while(status != OctaveBind::Ready) QCoreApplication::instance()->processEvents(); } // Install a package void OctaveBind::installPackage(QString path) { QString cmd = "pkg install -auto " + path + "\n"; wait(); status = OctaveBind::Installing; octaveProcess.write(cmd.toLocal8Bit()); } // Remove a package void OctaveBind::removePackage(QString name) { QString cmd = "pkg uninstall " + name + "\n"; wait(); status = OctaveBind::Removing; octaveProcess.write(cmd.toLocal8Bit()); } // Installed packages const QList *OctaveBind::getInstalledPackages(bool force) { // Force load if(force == true) { wait(); status = OctaveBind::WaitingPackages; if(octaveProcess.write("pkg list\n") == -1) { status = OctaveBind::Ready; std::cerr << "[OctaveBind::getInstalledPackages()] Error writting command" << std::endl; } } // Return return &installedPackages; } // Checks if a package is installed bool OctaveBind::checkIfInstalled(QString name) { for(QList::const_iterator i = installedPackages.begin(); i != installedPackages.end(); i++) { if(i->name.toLower() == name.toLower()) return true; } return false; } // Return the info of a package bool OctaveBind::getInstalledPackageInfo(QString name, OctaveBind::Package *pack) { for(QList::const_iterator i = installedPackages.begin(); i != installedPackages.end(); i++) { if(i->name.toLower() == name.toLower()) { *pack = *i; return true; } } return false; } // Read the standard error stream QByteArray OctaveBind::readStdErr() { QByteArray aux(stdError); stdError.clear(); return aux; } // Read the standard output stream QByteArray OctaveBind::readStdOut() { QByteArray aux(stdOutput); stdOutput.clear(); return aux; } /** SLOTS **/ // Error in the connection void OctaveBind::error(QProcess::ProcessError error) { QString msg; switch(error) { case QProcess::FailedToStart: msg = "Failed to start"; break; case QProcess::Crashed: msg = "Octave has crashed"; break; case QProcess::Timedout: msg = "Time out"; break; case QProcess::WriteError: msg = "Error while writing"; break; case QProcess::ReadError: msg = "Error while reading"; break; default: msg = "Unknown error"; } std::cout << "[OctaveBind::error()] " << msg.toLocal8Bit().constData() << std::endl; } // Octave died void OctaveBind::finished(int /*exitCode*/, QProcess::ExitStatus exitStatus) { if(exitStatus == QProcess::NormalExit) std::cout << "[OctaveBind::finished()] Octave process has finished" << std::endl; else std::cout << "[OctaveBind::finished()] Oooops!. Octave process has crashed" << std::endl; } // Data available in the error stream void OctaveBind::readyStdErr() { QByteArray aux; aux = octaveProcess.readAllStandardError(); stdError += aux; std::cout << "[OctaveBind::readyStdErr()] " << aux.constData() << std::endl; } // Data available in the standard stream void OctaveBind::readyStdOut() { QByteArray aux; aux = octaveProcess.readAllStandardOutput(); stdOutput += aux; buffer += aux; // Search for end of output (OCTAVE_PROMPT) if(buffer.trimmed().endsWith(OCTAVE_PROMPT)) { // Remove prompt buffer = buffer.trimmed(); buffer.chop(QString(OCTAVE_PROMPT).length()); buffer = buffer.trimmed(); // What we want depends of the status QRegExp regExp; int pos; switch(status) { // Installation prefix case OctaveBind::WaitingPrefix | OctaveBind::Initializing: case OctaveBind::WaitingPrefix: // Get prefix regExp.setPattern("Installation prefix:\\s+(\\S+)"); if(regExp.indexIn(buffer) > -1) { installPath = regExp.cap(1); std::cout << "[OctaveBind::readyStdOut()] Installation prefix: '" << installPath.toLocal8Bit().constData() << "'" << std::endl; }else std::cerr << "[OctaveBind::readyStdOut()] Wrong prefix format" << std::endl; // If we are initializing, ask for installed packages if(status == (OctaveBind::WaitingPrefix | OctaveBind::Initializing)) { status = OctaveBind::Ready; getInstalledPackages(true); }else status = OctaveBind::Ready; break; // Waiting packages case OctaveBind::WaitingPackages: installedPackages.clear(); regExp.setPattern("\\s*(\\w+)\\s*\\*?\\|\\s*(\\d+)\\.(\\d+)\\.(\\d+)\\s*\\|\\s*(\\S+)"); pos = 0; while((pos = regExp.indexIn(buffer, pos)) != -1) { Package pack; pack.name = regExp.cap(1); pack.vMajor = regExp.cap(2).toInt(); pack.vMinor = regExp.cap(3).toInt(); pack.vRevision = regExp.cap(4).toInt(); pack.url = regExp.cap(5); pack.installed = true; installedPackages.append(pack); pos += regExp.matchedLength(); } status = OctaveBind::Ready; break; // Install or remove case OctaveBind::Removing: case OctaveBind::Installing: status = OctaveBind::Ready; getInstalledPackages(true); break; // Unknown default: std::cerr << "[OctaveBind::readyStdOut()] Unknow or invalid status" << std::endl; status = OctaveBind::Ready; } // Signals emit stdOut(); emit success(); // Clear buffer.clear(); stdOutput.clear(); }else { // Signals emit stdOut(); } } qtoctave-0.10.1/qtoctave_pkg/src/resources.qrc0000644000175000017500000000100411511434231020404 0ustar lucaslucas images/ok.png images/package16.png images/cancel.png images/configure.png images/exit.png images/gear.png images/help.png images/package32.png images/reload.png qtoctave-0.10.1/qtoctave_pkg/src/pkg_manager.ui0000644000175000017500000003251111511434231020504 0ustar lucaslucas MainWindow 0 0 565 469 QtOctave Package Manager :/All/images/package16.png:/All/images/package16.png Qt::ToolButtonIconOnly false false QLayout::SetDefaultConstraint 0 &Search :/MainWindow/images/gear.png:/MainWindow/images/gear.png 0 0 250 16777215 10 75 true true 32 32 true 10 75 true QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed true QAbstractItemView::SingleSelection QAbstractItemView::SelectItems 32 32 false true true true true true false 1 1 true background: white; padding: 0.5em; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Liberation Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">This tool lets you install Octave packages.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">Please contribute to Octave writing packages and sharing them.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt;">You can find more information about packages in documentation of Octave:</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">http://www.gnu.org/software/octave/doc/interpreter/Packages.html</p></body></html> Qt::Horizontal 40 20 true &Apply changes :/About/images/ok.png:/About/images/ok.png &Exit :/MainWindow/images/cancel.png:/MainWindow/images/cancel.png 0 0 565 25 &File &Help &Tools ../../../../../../home/alejandro/.designer/backup../../../../../../home/alejandro/.designer/backup true :/MainWindow/images/exit.png:/MainWindow/images/exit.png &Quit Ctrl+Q Qt::ApplicationShortcut :/MainWindow/images/help.png:/MainWindow/images/help.png &Help F1 false :/MainWindow/images/configure.png:/MainWindow/images/configure.png &Settings Ctrl+S true :/About/images/ok.png:/About/images/ok.png &Apply changes Ctrl+I false :/MainWindow/images/reload.png:/MainWindow/images/reload.png &Update Ctrl+U pushDownload clicked() action_Install trigger() 469 495 -1 -1 pushCancel clicked() action_Quit trigger() 589 495 -1 -1 action_Quit triggered() MainWindow close() -1 -1 318 271 lineSearch returnPressed() pushSearch click() 239 52 513 52 qtoctave-0.10.1/qtoctave_pkg/src/CMakeLists.txt0000644000175000017500000000257611511434231020442 0ustar lucaslucasFIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") SET(QT_USE_QTXML 1) include(UseQt4) include_directories(${QT_INCLUDE_DIR}) include_directories(${QT_QT_INCLUDE_DIR}) include_directories(${QT_QTCORE_INCLUDE_DIR}) include_directories(${QT_QTGUI_INCLUDE_DIR}) include_directories(${QT_QTXML_INCLUDE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${QT_QTNETWORK_INCLUDE_DIR}) FILE(GLOB_RECURSE qtoctave_pkg_moc_headers *.h ) FILE(GLOB_RECURSE qtoctave_pkg_sources *.cpp ) FILE(GLOB_RECURSE qtoctave_pkg_ui *.ui ) FILE(GLOB_RECURSE qtoctave_pkg_qrc *.qrc ) # run uic on .ui files: QT4_WRAP_UI( qtoctave_pkg_ui_headers ${qtoctave_pkg_ui} ) # run moc on these files: QT4_WRAP_CPP( qtoctave_pkg_moc_sources ${qtoctave_pkg_moc_headers} ) # run rcc on these files: QT4_ADD_RESOURCES ( qtoctave_pkg_qrc_sources ${qtoctave_pkg_qrc} ) add_executable(qtoctave_pkg ${qtoctave_pkg_sources} ${qtoctave_pkg_moc_sources} ${qtoctave_pkg_ui_headers} ${qtoctave_pkg_moc_headers} ${qtoctave_pkg_qrc_sources} ) SET_TARGET_PROPERTIES(qtoctave_pkg PROPERTIES INSTALL_RPATH ":usr/lib" BUILD_WITH_INSTALL_RPATH true INSTALL_RPATH_USE_LINK_PATH true ) TARGET_LINK_LIBRARIES(qtoctave_pkg ${Qt4_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTNETWORK_LIBRARY} ) install ( TARGETS qtoctave_pkg RUNTIME DESTINATION bin ) qtoctave-0.10.1/qtoctave_pkg/src/download.h0000644000175000017500000000320511511434231017650 0ustar lucaslucas/* * download.h * * Download and progress dialog * */ #ifndef __DOWNLOAD_H__ #define __DOWNLOAD_H__ #include #include #include #include #include "ui_download.h" class DownloadDialog: public QDialog, protected Ui::frmDownload { Q_OBJECT public: /* Exception class */ class DownloadException : public std::exception { private: char message[128]; public: /* Constructor */ DownloadException(const char *msg); /* Message */ const char *what(); }; private: QHttp http; QFile file; int connectId, getId; QTimer timeout; public: /* Constructor */ DownloadDialog(QWidget *parent); /* Destructor */ ~DownloadDialog(); /* download() * Download a file to a specific path * Non-blocking */ void get(QString url, QString path) throw(DownloadException); /* Properties */ QString getUrl(); // Source QString getPath(); // Destination bool isActive(); // Is active /* Allow closing the window */ void enableClose(); void closeEvent(QCloseEvent *event); /* Set full progress bar */ void setProgress(int val, int min, int max); void setProgress(int value); int progress(); void downloadProgressBusy(bool busy = true); /* Log box */ void clearLog(); void addLogEntry(QString entry); private slots: void httpProgress(int done, int total); void httpDone(int id, bool error); void httpState(int state); void httpTimeout(); void sslErrors(const QList &errors); void displayError(QString msg); signals: void error(QString msg); void success(); }; #endif qtoctave-0.10.1/qtoctave_pkg/src/config.h0000644000175000017500000000076511511434231017316 0ustar lucaslucas/* * config.h * * Some configuration info * */ #ifndef __CONFIG_H__ #define __CONFIG_H__ #ifndef DEFAULT_REPOSITORY_FILE #define DEFAULT_REPOSITORY_FILE "https://forja.rediris.es/svn/csl-qtoctave/trunk/qtoctave_pkg/octave-forge.xml" #endif #ifndef USER_CONFIG_FILE #define USER_CONFIG_FILE (QDir::home().path() + "/.qtoctave/qtoctavepack.conf") #endif #ifndef TEMP_PATH #define TEMP_PATH "/tmp/qopm_packages/" #endif #ifndef CONNECTION_TIMEOUT #define CONNECTION_TIMEOUT 20000 #endif #endif qtoctave-0.10.1/qtoctave_pkg/src/about.ui0000644000175000017500000000702111511434231017341 0ustar lucaslucas frmAbout 0 0 370 256 About :/All/images/package16.png 10 10 241 22 11 75 true About QtOctave Package Manager 10 70 351 141 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"<span style=" font-weight:600;">QtOctave Package Manager</span>" is a tool from the "<span style=" font-weight:600;">QtOctave</span>" project.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Alejandro Álvarez Ayllón</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Pedro Luis Lucas Rosado </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This software is distributed under the GPL License.</p></body></html> 10 40 111 18 Version 0.1 (beta) 280 220 75 28 &OK :/About/images/ok.png btnOk clicked() frmAbout accept() 317 233 184 127 qtoctave-0.10.1/qtoctave_pkg/src/download.cpp0000644000175000017500000001313411511434231020205 0ustar lucaslucas/* * download.cpp * * Download and progress dialog */ #include #include #include #include #include #include #include "download.h" #include "config.h" /* Constructor */ DownloadDialog::DownloadDialog(QWidget *parent): QDialog(parent), http(this), file(this), connectId(-1), getId(-1), timeout(this) { setupUi(this); timeout.setSingleShot(true); timeout.setInterval(CONNECTION_TIMEOUT); // Signals and slots connect(&http, SIGNAL(dataReadProgress(int,int)), this, SLOT(httpProgress(int, int))); connect(&http, SIGNAL(requestFinished(int, bool)), this, SLOT(httpDone(int, bool))); connect(&http, SIGNAL(stateChanged(int)), this, SLOT(httpState(int))); connect(&timeout, SIGNAL(timeout()), this, SLOT(httpTimeout())); connect(&http, SIGNAL(sslErrors(const QList&)), this, SLOT(sslErrors(const QList&))); if(parent==NULL) { connect(this, SIGNAL(error(QString)), this, SLOT(displayError(QString))); connect(this, SIGNAL(success()), this, SLOT(close())); } } /* Destructor */ DownloadDialog::~DownloadDialog() { } /* Exception constructor */ DownloadDialog::DownloadException::DownloadException(const char *msg) { strcpy(message, msg); } /* Exception get message */ const char *DownloadDialog::DownloadException::what() { return message; } /* Download file */ void DownloadDialog::get(QString url, QString path) throw(DownloadDialog::DownloadException) { QUrl urlParser(url); file.setFileName(path); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) throw new DownloadException("Could not open the destination file"); progressCurrent->setValue(0); txtFrom->setText(url); txtTo->setText(path); if(urlParser.scheme() == "https") { if(urlParser.port() != -1) connectId = http.setHost(urlParser.host(), QHttp::ConnectionModeHttps, urlParser.port()); else connectId = http.setHost(urlParser.host(), QHttp::ConnectionModeHttps); } else if(urlParser.port() != -1) connectId = http.setHost(urlParser.host(), urlParser.port()); else connectId = http.setHost(urlParser.host()); btnOk->setEnabled(false); timeout.start(); } /* Properties */ QString DownloadDialog::getPath() { return txtTo->text(); } QString DownloadDialog::getUrl() { return txtFrom->text(); } bool DownloadDialog::isActive() { return getId != -1 || connectId != -1; } /* Progress */ void DownloadDialog::httpProgress(int done, int total) { progressCurrent->setMaximum(total); progressCurrent->setValue(done); timeout.stop(); } /* Done */ void DownloadDialog::httpDone(int id, bool errorB) { // Errors if(errorB) { const char *errStr = http.errorString().toLocal8Bit().constData(); std::cout << "[DownloadDialog::httpDone()] Error downloading file: " << errStr << std::endl; file.close(); enableClose(); connectId=-1; emit error(http.errorString()); return; } // Connecting has finished, download if(id == connectId) getId = http.get(txtFrom->text(), &file); // Downloading has finished else if(id == getId) { QHttpResponseHeader response = http.lastResponse(); file.close(); if(response.hasKey("Location")) { // Redirect QString newUrl = response.value("Location"); QUrl url(newUrl); addLogEntry("Moved to " + newUrl + ""); // Reopen file file.open(QIODevice::WriteOnly | QIODevice::Truncate); txtFrom->setText(newUrl); if(url.port() != -1) connectId = http.setHost(url.host(), url.port()); else connectId = http.setHost(url.host()); }else{ // Finish addLogEntry("Download finished"); connectId = getId = -1; emit success(); } } } /* Change state */ void DownloadDialog::httpState(int state) { switch(state){ case QHttp::HostLookup: addLogEntry("Resolving hostname"); break; case QHttp::Connecting: addLogEntry("Connecting"); break; case QHttp::Connected: addLogEntry("Downloading file"); break; } } /* Timeout */ void DownloadDialog::httpTimeout() { http.clearPendingRequests(); file.close(); emit error(QT_TR_NOOP("Connection timeout")); } /* SSL Errors */ void DownloadDialog::sslErrors(const QList &errors) { for(int i = 0; i < errors.size(); i++) { std::cerr << "[DownloadDialog::sslErrors()] " << errors[i].errorString().toLocal8Bit().constData() << std::endl; } http.ignoreSslErrors(); } /* Allow close */ void DownloadDialog::enableClose() { btnOk->setEnabled(true); } void DownloadDialog::closeEvent(QCloseEvent *event) { if(parent()!=NULL) event->setAccepted(btnOk->isEnabled()); else event->accept(); } /* Progress bar */ void DownloadDialog::setProgress(int val, int min, int max) { progressAll->setRange(min, max); progressAll->setValue(val); } void DownloadDialog::setProgress(int val) { progressAll->setValue(val); } int DownloadDialog::progress() { return progressAll->value(); } void DownloadDialog::downloadProgressBusy(bool busy) { if(busy) { progressCurrent->setRange(0, 0); progressCurrent->setValue(0); }else{ progressCurrent->setRange(0, 1); progressCurrent->setValue(1); } } /* Log box */ void DownloadDialog::clearLog() { txtLog->clear(); } void DownloadDialog::addLogEntry(QString entry) { QTextCursor cursor; txtLog->moveCursor(QTextCursor::End); cursor = txtLog->textCursor(); cursor.insertHtml(entry + "
\n"); } void DownloadDialog::displayError(QString msg) { QMessageBox::critical(this, "Error", msg); close(); } qtoctave-0.10.1/qtoctave_pkg/src/pkg_manager.cpp0000644000175000017500000003750611511434231020662 0ustar lucaslucas/* * pkg_manager.cpp * * Main application code */ #include #include #include #include #include #include #include #include "pkg_manager.h" #include "ui_pkg_manager.h" #include "ui_about.h" #include "download.h" #include "config.h" /** XML Handler **/ class PkgXmlHandler: public QXmlDefaultHandler { private: PkgManager *manager; OctaveBind::Package package; QString groupName; QList packList; QList stack; QString text; public: // Constructor PkgXmlHandler(PkgManager *m): QXmlDefaultHandler(), manager(m) { } // XML Tag Start () bool startElement(const QString &/*namespaceUri*/, const QString &/*localName*/, const QString &qname, const QXmlAttributes &/*atts*/) { stack.append(qname); text.clear(); return true; } // Just some characters bool characters(const QString &ch) { text += ch; return true; } // XML Tag End () bool endElement(const QString &/*namespaceUri*/, const QString &/*localName*/, const QString &qname) { if(stack.isEmpty()) return false; stack.removeLast(); // End of repository if(qname == "repository") { manager->addPackageList(packList); manager->addGroup("All"); return true; } // Insert new package else if(qname == "package") { package.group = groupName; // Installed? package.installed = manager->octaveBind.checkIfInstalled(package.name); // Add packList.append(package); } // Group //else if(qname == "group") //{ // manager->addGroup(groupName, packList); // packList.clear(); //} // Package info? else if(stack.last() == "package") { text = text.trimmed(); // Name if(qname == "name") package.name = text; // URL and File name else if(qname == "url") { package.url = text; package.fileName = QUrl(text).path().split("/").last(); // Description }else if(qname == "description") package.description = text; // Short description else if(qname == "short") package.shortDescription = text; // Version else if(qname == "version") { QStringList ver = text.split("."); if(ver.size()>0) package.vMajor = ver[0].toInt(); else package.vMajor=0; if(ver.size()>1) package.vMinor = ver[1].toInt(); else package.vMinor=0; if(ver.size()>2) package.vRevision = ver[2].toInt(); else package.vRevision=0; } else if(qname == "categories") { package.categories=text.toLower(); QStringList categories = package.categories.split(","); for(int i=0; iaddGroup(category); } } } } // Group info? else if(stack.last() == "group" and qname == "name") groupName = text; return true; } }; /** METHODS **/ // Constructor PkgManager::PkgManager(QWidget *parent, Qt::WindowFlags flags): QMainWindow(parent, flags), download(this) { setupUi(this); // Some adjustements listPackages->setHeaderLabel("Packages"); //listPackages->sortItems(0, Qt::AscendingOrder); // Signals / slots connect(listGroups, SIGNAL(itemSelectionChanged()), this, SLOT(selectGroup())); connect(listPackages, SIGNAL(itemSelectionChanged()), this, SLOT(selectPackage())); //connect(listPackages, SIGNAL(itemChanged(QTreeWidgetItem*, int)), // this, SLOT(packageChanged(QTreeWidgetItem*, int))); connect(listPackages, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(packageChangeInstallState(const QModelIndex &))); connect(action_Help, SIGNAL(triggered()), this, SLOT(help())); connect(action_Install, SIGNAL(triggered()), this, SLOT(downloadAndInstall())); connect(&download, SIGNAL(success()), this, SLOT(downloadReady())); connect(&download, SIGNAL(error(QString)), this, SLOT(downloadError(QString))); connect(pushSearch, SIGNAL(clicked()), this, SLOT(search())); } // Load XML File bool PkgManager::loadRepositoryFile(QString path) { QFile file(path); if(!file.open(QIODevice::ReadOnly)) { std::cerr << "[PkgManager::loadRepositoryFile()] Can not load the file'" << (path.toLocal8Bit().constData()) << "'" << std::endl; return false; } QXmlSimpleReader parser; QXmlInputSource source(&file); PkgXmlHandler handler(this); parser.setContentHandler(&handler); parser.setErrorHandler(&handler); if(!parser.parse(&source)) { std::cerr << "[PkgManager::loadRepositoryFile()] Error loading file" << std::endl; return false; }else { std::cout << "[PkgManager::loadRepositoryFile()] '" << (path.toLocal8Bit().constData()) << "' loaded" << std::endl; } file.close(); return true; } void PkgManager::addGroup(const QString &name /*, const QList &children*/) { // Internal tree //packageTree.insert(name, children); printf("[PkgManager::addGroup] %s\n", name.toLocal8Bit().data() ); if( listGroups->findItems(name, Qt::MatchExactly).size()!=0 ) return; // UI QListWidgetItem *item = new QListWidgetItem(QIcon(":/MainWindow/images/package32.png"), name, listGroups); listGroups->addItem(item); // Log std::cout << "[PkgManager::addGroup()] Group added: '" << name.toLocal8Bit().data() << "'" << std::endl; } void PkgManager::addPackageList(const QList &children) { packList=children; for(QList::const_iterator i = packList.begin(); i != packList.end(); i++) { QTreeWidgetItem *item; item = new QTreeWidgetItem(listPackages); item->setIcon(0, QIcon(":/MainWindow/images/gear.png")); item->setText(0, i->name); item->setFlags(Qt::ItemIsSelectable | /*Qt::ItemIsUserCheckable |*/ Qt::ItemIsEnabled); item->setData(0, Qt::UserRole, "all"); if(i->installed) item->setCheckState(0, Qt::Checked); else item->setCheckState(0, Qt::Unchecked); listPackages->addTopLevelItem(item); } } // Remove all the packages from the list void PkgManager::clear() { currentPackage.clear(); //packageTree.clear(); listGroups->clear(); listPackages->clear(); } /** SLOTS **/ // List packages from a group void PkgManager::selectGroup() { // Get group QList selectedList = listGroups->selectedItems(); if(selectedList.count()) { QListWidgetItem *selected = selectedList.first(); QString currentGroup = selected->text().toLower(); //QList packList = packageTree[currentGroup]; // GUI //listPackages->clear(); //textDescription->clear(); for(QList::const_iterator i = packList.begin(); i != packList.end(); i++) { bool inThisCategory=false; QStringList categories=i->categories.split(","); for(int n=0; n item=listPackages->findItems(i->name, Qt::MatchExactly); if(item.size()>0) item[0]->setHidden(!inThisCategory); } } } // Show package description void PkgManager::selectPackage() { // Get item QList selectedList = listPackages->selectedItems(); if(selectedList.count()) { QTreeWidgetItem *selected = selectedList.first(); QString currentGroup = selected->data(0, Qt::UserRole).toString(); //QList packList = packageTree[currentGroup]; currentPackage = selected->text(0); // Search for package info for(QList::const_iterator i = packList.begin(); i != packList.end(); i++) { if(currentPackage == i->name) { OctaveBind::Package auxPack; // Output QString text; text = "
"; text += "Categories: "; text += i->categories + "
"; text += "Name: " + currentPackage; text += "

" + i->description + "

"; text += "URL: " + i->url + "
"; text += "Candidate version: "; text += QString::number(i->vMajor) + "." + QString::number(i->vMinor) + "." + QString::number(i->vRevision); // Installed? if(octaveBind.getInstalledPackageInfo(currentPackage, &auxPack)) { text += "

Installed version: "; text += QString::number(auxPack.vMajor) + "." + QString::number(auxPack.vMinor) + "." + QString::number(auxPack.vRevision); text += "
Installed in: "; text += auxPack.url + "

"; if(!i->installed) text += "

Marked to remove

"; }else if(i->installed) text += "

Marked to install

"; // End text += "
"; textDescription->setText(text); return; } } } } // Help dialog void PkgManager::help() { Ui::frmAbout about; QDialog dialog(this); about.setupUi(&dialog); dialog.exec(); } // Search void PkgManager::search() { QString searchText(lineSearch->text()); listPackages->clear(); textDescription->clear(); // For each group //QList groupList = packageTree.keys(); //for(QList::const_iterator g = groupList.begin(); // g != groupList.end(); g ++) { //QList packList = packageTree[*g]; // For each package in each group for(QList::const_iterator p = packList.begin(); p != packList.end(); p++) { QList item=listPackages->findItems(p->name, Qt::MatchExactly); // Check if(p->name.contains(searchText, Qt::CaseInsensitive) || p->description.contains(searchText, Qt::CaseInsensitive)) { if(item.size()>0) item[0]->setHidden(false); } else if(item.size()>0) item[0]->setHidden(true); } } } // Item changed void PkgManager::packageChanged(QTreeWidgetItem *item, int) { QString name = item->text(0); if(item->checkState(0) == Qt::Checked) item->setIcon(0, QIcon(":/MainWindow/images/reload.png")); else item->setIcon(0, QIcon(":/MainWindow/images/gear.png")); // Set the status of the changed package QString currentGroup = item->data(0, Qt::UserRole).toString(); //QList *packList = &packageTree[currentGroup]; for(QList::iterator i = packList.begin(); i != packList.end(); i++) { if(name.toLower() == i->name.toLower()) { bool currentInstall = (item->checkState(0) == Qt::Checked); // Refresh status and display if(i->installed != currentInstall) { i->installed = currentInstall; selectPackage(); } return; } } } // Download and install void PkgManager::downloadAndInstall() { bool realInstalled; installList.clear(); removeList.clear(); // Iterate through all packages and get which ones // we must remove or install // for(QMap >::const_iterator i = packageTree.constBegin(); // i != packageTree.constEnd(); i++) { for(QList::const_iterator j = packList.begin(); j != packList.end(); j++) { realInstalled = octaveBind.checkIfInstalled(j->name); // Remove if(!j->installed && realInstalled) removeList.append(*j); else if(j->installed && !realInstalled) { OctaveBind::Package p = *j; p.installed = false; // Not yet :-P installList.append(p); } } } /* Now we have what we must remove and what we must install */ int installCount, removeCount, totalCount; installCount = installList.count(); removeCount = removeList.count(); totalCount = installCount + removeCount; std::cout << "[PkgManager::downloadAndInstall()] " << totalCount << " packages changed. " << installCount << " to install. " << removeCount << " to remove." << std::endl; // Dialog download.setModal(true); download.clearLog(); download.show(); // Remove if(removeCount) { download.setProgress(0, 0, removeCount); download.downloadProgressBusy(); for(QList::const_iterator i = removeList.begin(); i != removeList.end(); i++) { download.addLogEntry("Removing " + i->name + "..."); // Remove octaveBind.removePackage(i->name.toLower()); octaveBind.wait(); // Log download.setProgress(download.progress() + 1); } // Update list removeList.clear(); } // Install if(installCount) { OctaveBind::Package pack; QString tmpPath(TEMP_PATH); QDir dir; if(!dir.exists(tmpPath) and !dir.mkdir(tmpPath)) { std::cout << "[PkgManager::downloadAndInstall()] Temporary directory could not be created" << std::endl; download.addLogEntry(tr("Temporary directory could not be created")); download.enableClose(); return; } // Download first one download.setProgress(0, 0, installCount); pack = installList.first(); tmpPath += pack.fileName; download.get(pack.url, tmpPath); }else{ // Finish download.addLogEntry("Process finished"); download.enableClose(); download.downloadProgressBusy(false); } } /* Download ready. Install and download next if needed */ void PkgManager::downloadReady() { int pVal = download.progress(); OctaveBind::Package pack; // Mark as downloaded pack = installList.value(pVal); pack.installed = true; pack.url = download.getPath(); installList.replace(pVal, pack); // Update progress download.setProgress(++pVal); // Get next if(pVal < installList.count()) { QString tmpPath(TEMP_PATH); pack = installList.value(pVal); tmpPath += pack.fileName; download.get(pack.url, tmpPath); }else{ download.downloadProgressBusy(); download.setProgress(0); // Install downloaded packages for(QList::const_iterator i = installList.begin(); i != installList.end(); i++) { if(i->installed) { download.addLogEntry("Installing " + i->name + "..."); octaveBind.installPackage(i->url); octaveBind.wait(); } download.setProgress(download.progress() + 1); } // Ready :-) installList.clear(); download.addLogEntry("Process finished"); download.enableClose(); download.downloadProgressBusy(false); } } void PkgManager::downloadError(QString msg) { int pVal; OctaveBind::Package pack; QString tmpPath(TEMP_PATH); pVal = download.progress(); pack = installList.value(pVal); // Alert QMessageBox msgBox(QMessageBox::Critical, tr("Download error"), msg, QMessageBox::Retry | QMessageBox::Ignore | QMessageBox::Abort, this); // Action switch(msgBox.exec()) { case QMessageBox::Ignore: // Mark as not installed pack.installed = false; installList.replace(pVal, pack); // Continue downloadReady(); break; case QMessageBox::Retry: // Retry tmpPath += pack.fileName; download.get(pack.url, tmpPath); break; default: // Abort all download.enableClose(); download.addLogEntry(tr("Download aborted")); break; } } void PkgManager::packageChangeInstallState(const QModelIndex & index) { //QTreeWidgetItem *item=listPackages->itemFromIndex(index); QTreeWidgetItem *item=listPackages->currentItem(); Qt::CheckState state=item->checkState(0); if(state==Qt::Unchecked) item->setCheckState(0, Qt::Checked); else item->setCheckState(0, Qt::Unchecked); packageChanged(item); printf("[PkgManager::packageChangeInstallState] Item clicked\n"); } qtoctave-0.10.1/qtoctave_pkg/src/octave_bind.h0000644000175000017500000000532411511434231020322 0ustar lucaslucas/* * octave_bind.h * * Code to interact with octave * */ #ifndef __OCTAVE_BIND_H__ #define __OCTAVE_BIND_H__ #include #include #include #include class OctaveBind: protected QObject { Q_OBJECT public: enum Status{Ready = 0, Initializing = 1, WaitingPackages = 2, WaitingPrefix = 4, Installing = 8, Removing = 16}; struct Package { QString name; QString url; QString fileName; QString description, shortDescription; QString group; QString categories; int vMajor, vMinor, vRevision; // Version bool installed; }; private: static const char *OCTAVE_PROMPT; QList installedPackages; QString installPath; QProcess octaveProcess; QByteArray stdOutput, stdError; QString buffer; unsigned status; public: /* Constructor * Initialize the connection and ask for the prefix * and the installed packages. * Use getStatus() to know when this information is available */ OctaveBind() throw (QString); /* Destructor */ ~OctaveBind(); /* Get the status of the connection (see Status) */ unsigned getStatus(); /* Wait until the current process finish */ void wait(); /* Installs a package * path: The path of the tgz file * Doesn't block, unless the status isn't ready (then wait to be ready). * Use signals to handle errors and success */ void installPackage(QString path); /* Removes a package * name: The package name * Doesn't block, unless the status isn't ready (then wait to be ready). * Use signals to handle errors and sucess */ void removePackage(QString name); /* Returns the list of installed packages * If "force" is true, wait until you get the "success" signal * If "force" is false, it returns the "cached" list (usually this is enought to external use) */ const QList *getInstalledPackages(bool force = false); /* Tells if a package is installed * (Doesn't matter the version) */ bool checkIfInstalled(QString name); /* Gets the package with the name "name" * name: The name of the package * p : Where to put the data * Returns false if it doesn't exists */ bool getInstalledPackageInfo(QString name, Package *p); /* Reads the standard error stream of the * Octave process */ QByteArray readStdErr(); /* Reads the standard output stream of the * Octave process */ QByteArray readStdOut(); /** SLOTS AND SIGNALS **/ private slots: void error(QProcess::ProcessError error); void finished(int exitCode, QProcess::ExitStatus exitStatus); void readyStdErr(); void readyStdOut(); signals: void error(QString errMsg); void success(); void stdOut(); }; #endif qtoctave-0.10.1/qtoctave_pkg/src/download.ui0000644000175000017500000001116611511434231020043 0ustar lucaslucas frmDownload 0 0 602 368 300 300 680 500 Progress :/All/images/package16.png Copy from: true Copy to: true Current package QProgressBar{ font-weight: bold; text-align: center; padding: 1px; } QProgressBar:chunk{ background: #35c60e; width: 0.5em; margin: 1px; } 0 Full process false QProgressBar{ padding: 1px; font-weight: bold; text-align: center; } QProgressBar::chunk{ background: #9300c3; width: 0.5em; margin: 1px; } 0 true Qt::Horizontal false QProgressBar::TopToBottom %p% 1 true Qt::Horizontal 40 20 false &Ok :/About/images/ok.png btnOk clicked() frmDownload hide() 401 274 224 149 qtoctave-0.10.1/qtoctave-info-reader/images/bookmark.png0000644000175000017500000000126211511434231022212 0ustar lucaslucasPNG  IHDRsO/gAMA7tEXtSoftwareAdobe ImageReadyqe<DIDATxb`>U1_0b%A T:be lzZ0R@8 ``cgscrRfK@a5mC#cF  OD- u1A/Я9q3 "/cx>߿ _|d`` @= ƿ '0;Y%A}"@{N2~}Fo#P3Õi>[ha@}C|n+>L?ڼçmw2, J:x?Y"X Çw0l  JJ ~}'DR<?@(zȞ 1#ïMP f0=bO_93 oB :L @5pO4\`hՋv_  x NdP>05 :+Pρ'^&<ݐG6Ǐ{|'޾}tnD(<.B_~K0~I0K zDa>+bF;;ަCge-0H; uG2r>_C"!!d}=OXh<ⓧO㊥+4jNj; _/W=YDt jwOl*ݻ~,6zfk%>P̑_XV,g_)/r.5@X,a2@tttct.侳 W|eoH]yCkr#AR6*Cb 0x`~zid) @̌>8K.IBD!r'G6\G 2EVVV8WZݶuLfd)NEVڸ9 t==89 WW3=S$_] !R#qZgoc_>EsĿ57@͇3 ΋.e 2=rwy-MGSKIu됮TTVY  ??7^^^CSmYTncZ*c>TVQ{{D5pkkrqn^ZZZ]f ,m< !B|)4vvu 5 򬳳_hZRR D([&eǟp>}#b $''w^Ԗť8$$|̩`||| P^[ܿ A4.̼RR`0ǎ3rKWWtx񠴴< CV߶{챀!n޼7"h@>2 <k0?G {K$ANNP[[r}׬, {D@V#m*pl9Į]P8EPTt:'/ ^)@*cccmQBp(**p8D"F099 BCĉ6\=ኀ JE>>cR8 wa3ԇ3gΜI׿K8 qGIENDB`qtoctave-0.10.1/qtoctave-info-reader/images/stop.png0000644000175000017500000000054611511434231021376 0ustar lucaslucasPNG  IHDRabKGD pHYs  d_tIME *)0IDAT8œ1n0EQhbO 4t(A.@4KbF/Y{4PoIk`3oT-Jކ H%9E+ @ނbb:sbo ڰ)[x<Ŕ3 c ?E#e-0Wy| UZ]17E2z:TT;R3rcJn8dt&. LdK`H|1(N~+q=5}!@)+@`N]5rc`&@9es͐ХQZHgc$ѣPBqǞ[QW y6FEt`\_qœ8YD>Z07j‚l恹 SVbva $e)0q}sw1'>VXXXG 2HdyGi~Քg@!o6j. b_߆_ZMuõ:DwJv36iwG_ʸ}r>QKLjw9|0F4m߽ra)[hog/3'bf7ʄT?|tq . O幾A^(UZb_l9|!S*1ez1bҍ-(PzYDAUT-(USu)40QXԒGhzkaa_̇5-s=ٲw ݁nXxЏ+!j[5S<lIENDB`qtoctave-0.10.1/qtoctave-info-reader/images/zoom-out.png0000644000175000017500000000351211511434231022176 0ustar lucaslucasPNG  IHDR szz pHYs^tIME +(bKGDIDATx͗mh[ǟݖ%ےe[eKNl[MI7-l O[-lc_~ZXc&dM[ .fSd/u<ώ_//rӹs./X,Ƙ"uuNI zu.y1vY63b!waƌ(*\fJܕ|󍱓BP7nwt<>%ᾐV#!bzTk6"6VƱ̈́y ѣGv{sktY rυJ] ,m+D!RՈ(Z?ZkIއtZ>Q]ڭug,6Y E2 voh*Qe>;'P]+++\EQ7=^q\zXi p\.G5M{Q |6FuzW\}ii88edЉIDOOe茸H Éϝ{f esssf<@|bXG&Ɍ{z{z۟ޟ.>' ,O~ ksv mnn*_ &D!sW0w |7٧9 [^4h)/+3#] o3H>|mGn3;q'xY@; Qڐi>b`S~>vf&&ffF 01Yb( W S;O\X  @hwTc7Wf`g l!J€ ?B(,b 6a㗞[0jz}|'P,$ 3Q!n% 4#8f) 8!Jr j >`v GsK!ANȖ"шTbP8F\cxÕ GnM"0E'X03C}g[k A,G֋JLIV^[h(0, |[b'pQ,Gb`T-! PY*!L);#$d/٠ 3.%) ("g/$8F `>ML 2°@, ,~c' Ry 4@FB vh× d>H@A0(>^ȎiX3">>F翁@0p^__@ &P-$(@L18#),Au?0F@ =tA eqP @L|YM] LLp6fab`b66 f`V`Lh b A?^ӗSu^ ~ !@ŒXXu Tb4~eK7R@R?`qЩODYaB3#n` QRb֪JkO1^y#ߞ=~Jo;tWAQFAX~331$iXl)2m7ݗx YP_b9oO?%Tb}+Oy94*]٬ x Mw1ܺ}Ǜ~|(_RBw<\cSUhdb峕e(JC8 VNo`8~!É ?_Š/ZEo\z?a1@8@,£%[}n2412|ãg/!EoxyG9u P@`q?hן/? HGCO@.pa£ o߼ۛ+}~ǻ|P gP*ߐ! X4XM4`q>|0}q}gOh{7"du @ ˙`+˰-.3|&~)4!4Bi{YWR?‚:'% l@8C9; /(] WP_ XX\+hEJHſ}Cv2cqIENDB`qtoctave-0.10.1/qtoctave-info-reader/test/octave.info-60000644000175000017500000042115411511434231021720 0ustar lucaslucasThis is octave.info, produced by makeinfo version 4.11 from ./octave.texi. START-INFO-DIR-ENTRY * Octave: (octave). Interactive language for numerical computations. END-INFO-DIR-ENTRY Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2005, 2006, 2007 John W. Eaton. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.  File: octave.info, Node: Function Index, Next: Operator Index, Prev: Concept Index, Up: Top Function Index ************** [index] * Menu: * ( <1>: Controlling Subprocesses. (line 249) * (: Command Line Options. (line 173) * -all: Getting Help. (line 44) * = <1>: Sparse Linear Algebra. (line 342) * =: Nonlinear Equations. (line 17) * __go_drawnow__: Graphics Objects. (line 232) * abs: Complex Arithmetic. (line 10) * accumarray: Sums and Products. (line 79) * acos: Trigonometry. (line 57) * acosd: Trigonometry. (line 197) * acosh: Trigonometry. (line 120) * acot: Trigonometry. (line 77) * acotd: Trigonometry. (line 217) * acoth: Trigonometry. (line 140) * acsc: Trigonometry. (line 72) * acscd: Trigonometry. (line 212) * acsch: Trigonometry. (line 135) * addlistener: Object Groups. (line 104) * addpath: Manipulating the load path. (line 22) * addproperty: Object Groups. (line 37) * addtodate: Timing Utilities. (line 578) * airy: Special Functions. (line 7) * all: Finding Elements and Checking Conditions. (line 29) * allchild: Graphics Objects. (line 152) * amd: Mathematical Considerations. (line 168) * ancestor: Graphics Objects. (line 137) * angle: Complex Arithmetic. (line 19) * anova: Tests. (line 37) * any: Finding Elements and Checking Conditions. (line 12) * arch_fit: Signal Processing. (line 314) * arch_rnd: Signal Processing. (line 335) * arch_test: Signal Processing. (line 345) * area: Two-Dimensional Plots. (line 999) * arg: Complex Arithmetic. (line 18) * argnames: Inline Functions. (line 36) * argv: Command Line Options. (line 152) * arma_rnd: Signal Processing. (line 376) * arrayfun: Applying a Function to an Array. (line 7) * asctime: Timing Utilities. (line 153) * asec: Trigonometry. (line 67) * asecd: Trigonometry. (line 207) * asech: Trigonometry. (line 130) * asin: Trigonometry. (line 52) * asind: Trigonometry. (line 192) * asinh: Trigonometry. (line 115) * assert: Test Functions. (line 247) * assignin: Evaluation in a Different Context. (line 73) * atan: Trigonometry. (line 62) * atan2: Trigonometry. (line 145) * atand: Trigonometry. (line 202) * atanh: Trigonometry. (line 125) * atexit: Quitting Octave. (line 13) * autocor: Signal Processing. (line 390) * autocov: Signal Processing. (line 395) * autoload: Overloading and Autoloading. (line 58) * autoreg_matrix: Signal Processing. (line 400) * autumn: Representing Images. (line 91) * available_backends: Graphics backends. (line 18) * axes: Graphics Objects. (line 167) * axis: Two-Dimensional Plots. (line 1039) * backend: Graphics backends. (line 7) * balance: Basic Matrix Functions. (line 7) * bar: Two-Dimensional Plots. (line 228) * barh: Two-Dimensional Plots. (line 264) * bartlett: Signal Processing. (line 407) * bartlett_test: Tests. (line 61) * base2dec: String Conversions. (line 101) * beep: Raising Errors. (line 129) * beep_on_error: Raising Errors. (line 135) * besselh: Special Functions. (line 44) * besseli: Special Functions. (line 42) * besselj: Special Functions. (line 40) * besselk: Special Functions. (line 43) * bessely: Special Functions. (line 41) * beta: Special Functions. (line 96) * betacdf: Distributions. (line 47) * betainc: Special Functions. (line 101) * betainv: Distributions. (line 52) * betaln: Special Functions. (line 113) * betapdf: Distributions. (line 56) * betarnd: Random Number Generation. (line 41) * bicgstab: Specialized Solvers. (line 7) * bicubic: Multi-dimensional Interpolation. (line 180) * bin2dec: String Conversions. (line 14) * bincoeff: Special Functions. (line 121) * binocdf: Distributions. (line 60) * binoinv: Distributions. (line 64) * binopdf: Distributions. (line 68) * binornd: Random Number Generation. (line 50) * bitand: Bit Manipulations. (line 69) * bitcmp: Bit Manipulations. (line 98) * bitget: Bit Manipulations. (line 23) * bitmax: Bit Manipulations. (line 58) * bitor: Bit Manipulations. (line 77) * bitset: Bit Manipulations. (line 11) * bitshift: Bit Manipulations. (line 117) * bitxor: Bit Manipulations. (line 85) * blackman: Signal Processing. (line 414) * blanks: Creating Strings. (line 13) * blkdiag: Rearranging Matrices. (line 413) * bone: Representing Images. (line 98) * box: Plot Annotations. (line 133) * brighten: Representing Images. (line 75) * bsxfun: Applying a Function to an Array. (line 96) * bug_report <1>: Bug Lists. (line 6) * bug_report: Reporting Bugs. (line 20) * builtin: Overloading and Autoloading. (line 38) * bunzip2: File Archiving Utilities. (line 7) * byte_size: Matrices and Arrays in Oct-Files. (line 92) * bzip2: File Archiving Utilities. (line 96) * calendar: Timing Utilities. (line 586) * canonicalize_file_name: Filesystem Utilities. (line 300) * cart2pol: Coordinate Transformations. (line 7) * cart2sph: Coordinate Transformations. (line 27) * cast: Built-in Data Types. (line 28) * cat: Rearranging Matrices. (line 98) * cauchy_cdf: Distributions. (line 72) * cauchy_inv: Distributions. (line 78) * cauchy_pdf: Distributions. (line 84) * cauchy_rnd: Random Number Generation. (line 59) * caxis: Two-Dimensional Plots. (line 1125) * ccolamd: Mathematical Considerations. (line 198) * cd <1>: Current Working Directory. (line 7) * cd: A Sample Command Description. (line 13) * ceil: Utility Functions. (line 7) * cell: Creating Cell Arrays. (line 47) * cell2mat: Processing Data in Cell Arrays. (line 98) * cell2struct: Processing Data in Cell Arrays. (line 107) * celldisp: Cell Arrays. (line 60) * cellfun: Processing Data in Cell Arrays. (line 13) * cellidx: Cell Arrays of Strings. (line 48) * cellstr: Cell Arrays of Strings. (line 40) * center: Basic Statistical Functions. (line 14) * cgs: Specialized Solvers. (line 29) * char: Concatenating Strings. (line 89) * chdir <1>: Current Working Directory. (line 8) * chdir: A Sample Command Description. (line 14) * chi2cdf: Distributions. (line 90) * chi2inv: Distributions. (line 95) * chi2rnd: Random Number Generation. (line 68) * chisquare_pdf: Distributions. (line 99) * chisquare_test_homogeneity: Tests. (line 75) * chisquare_test_independence: Tests. (line 89) * chol: Matrix Factorizations. (line 7) * chol2inv: Matrix Factorizations. (line 53) * choldelete: Matrix Factorizations. (line 100) * cholinsert: Matrix Factorizations. (line 82) * cholinv: Matrix Factorizations. (line 47) * cholshift: Matrix Factorizations. (line 109) * cholupdate: Matrix Factorizations. (line 62) * circshift: Rearranging Matrices. (line 210) * cla: Graphics Objects. (line 312) * clabel: Plot Annotations. (line 97) * class: Built-in Data Types. (line 17) * clc: Cursor Motion. (line 57) * clear: Status of Variables. (line 152) * clf: Graphics Objects. (line 298) * clock: Timing Utilities. (line 324) * cloglog: Basic Statistical Functions. (line 143) * close: Graphics Objects. (line 333) * closereq: Graphics Objects. (line 343) * colamd: Mathematical Considerations. (line 278) * colloc: Orthogonal Collocation. (line 7) * colon: Indexing Objects. (line 173) * colorbar: Plot Annotations. (line 157) * colormap: Representing Images. (line 59) * colperm: Mathematical Considerations. (line 343) * columns: Object Sizes. (line 18) * comet: Two-Dimensional Plots. (line 1020) * COMMAND: Installing and Removing Packages. (line 58) * command_line_path: Manipulating the load path. (line 123) * common_size: Finding Elements and Checking Conditions. (line 140) * commutation_matrix: Special Functions. (line 141) * compan: Finding Roots. (line 30) * compass: Two-Dimensional Plots. (line 927) * complement: Set Operations. (line 90) * completion_append_char: Commands For Completion. (line 17) * completion_matches: Commands For Completion. (line 23) * complex: Numeric Data Types. (line 52) * computer: System Information. (line 7) * cond: Basic Matrix Functions. (line 40) * condest: Sparse Linear Algebra. (line 129) * confirm_recursive_rmdir: Filesystem Utilities. (line 83) * conj: Complex Arithmetic. (line 28) * contour: Two-Dimensional Plots. (line 557) * contour3: Two-Dimensional Plots. (line 650) * contourc: Two-Dimensional Plots. (line 620) * contourf: Two-Dimensional Plots. (line 585) * contrast: Representing Images. (line 214) * conv: Products of Polynomials. (line 7) * conv2: Products of Polynomials. (line 55) * convhull: Convex Hull. (line 12) * convhulln: Convex Hull. (line 24) * convn: Products of Polynomials. (line 19) * cool: Representing Images. (line 105) * copper: Representing Images. (line 112) * copyfile: Filesystem Utilities. (line 315) * cor: Descriptive Statistics. (line 202) * cor_test: Tests. (line 100) * corrcoef: Descriptive Statistics. (line 218) * cos: Trigonometry. (line 22) * cosd: Trigonometry. (line 164) * cosh: Trigonometry. (line 88) * cot: Trigonometry. (line 46) * cotd: Trigonometry. (line 187) * coth: Trigonometry. (line 110) * cov: Descriptive Statistics. (line 194) * cplxpair: Complex Arithmetic. (line 33) * cputime: Timing Utilities. (line 355) * crash_dumps_octave_core: Saving Data on Unexpected Exits. (line 13) * cross: Utility Functions. (line 17) * csc: Trigonometry. (line 40) * cscd: Trigonometry. (line 182) * csch: Trigonometry. (line 105) * cstrcat: Concatenating Strings. (line 154) * csvread: Simple File I/O. (line 353) * csvwrite: Simple File I/O. (line 344) * csymamd: Mathematical Considerations. (line 349) * ctime: Timing Utilities. (line 78) * cummax: Utility Functions. (line 263) * cummin: Utility Functions. (line 288) * cumprod: Sums and Products. (line 54) * cumsum: Sums and Products. (line 38) * cumtrapz: Functions of One Variable. (line 268) * cut: Basic Statistical Functions. (line 180) * cylinder: Three-dimensional Geometric Shapes. (line 7) * daspk: Differential-Algebraic Equations. (line 15) * daspk_options: Differential-Algebraic Equations. (line 80) * dasrt: Differential-Algebraic Equations. (line 370) * dasrt_options: Differential-Algebraic Equations. (line 470) * dassl: Differential-Algebraic Equations. (line 245) * dassl_options: Differential-Algebraic Equations. (line 312) * date: Timing Utilities. (line 334) * datenum: Timing Utilities. (line 432) * datestr: Timing Utilities. (line 473) * datetick: Timing Utilities. (line 623) * datevec: Timing Utilities. (line 556) * dbclear: Breakpoints. (line 53) * dbcont: Leaving Debug Mode. (line 9) * dbdown: Call Stack. (line 20) * dblquad: Functions of Multiple Variables. (line 42) * dbquit: Leaving Debug Mode. (line 17) * dbstack: Call Stack. (line 7) * dbstatus: Breakpoints. (line 41) * dbstep: Debug Mode. (line 37) * dbstop: Breakpoints. (line 10) * dbtype: Debug Mode. (line 18) * dbup: Call Stack. (line 14) * dbwhere: Debug Mode. (line 12) * deal: Variable-length Return Lists. (line 34) * deblank: Manipulating Strings. (line 21) * debug_on_error: Entering Debug Mode. (line 28) * debug_on_interrupt: Entering Debug Mode. (line 15) * debug_on_warning: Entering Debug Mode. (line 23) * dec2base: String Conversions. (line 78) * dec2bin: String Conversions. (line 28) * dec2hex: String Conversions. (line 45) * deconv: Products of Polynomials. (line 40) * default_save_options: Simple File I/O. (line 218) * del2: Utility Functions. (line 31) * delaunay: Delaunay Triangulation. (line 18) * delaunay3: Delaunay Triangulation. (line 47) * delaunayn: Delaunay Triangulation. (line 60) * delete: Graphics Objects. (line 329) * dellistener: Object Groups. (line 131) * demo: Demonstration Functions. (line 7) * det: Basic Matrix Functions. (line 50) * detrend: Signal Processing. (line 11) * diag: Rearranging Matrices. (line 397) * diary: Diary and Echo Commands. (line 11) * diff: Finding Elements and Checking Conditions. (line 56) * diffpara: Signal Processing. (line 420) * diffuse: Three-Dimensional Plotting. (line 179) * dims: Matrices and Arrays in Oct-Files. (line 95) * dir: Current Working Directory. (line 45) * discrete_cdf: Distributions. (line 103) * discrete_inv: Distributions. (line 108) * discrete_pdf: Distributions. (line 113) * discrete_rnd: Random Number Generation. (line 77) * disp: Terminal Output. (line 22) * dispatch: Overloading and Autoloading. (line 26) * display: Manipulating Classes. (line 14) * dlmread: Simple File I/O. (line 328) * dlmwrite: Simple File I/O. (line 278) * dmperm: Mathematical Considerations. (line 407) * dmult: Basic Matrix Functions. (line 55) * do_string_escapes: String Conversions. (line 273) * doc_cache_file: Getting Help. (line 120) * dos: Controlling Subprocesses. (line 61) * dot: Basic Matrix Functions. (line 59) * double: Numeric Data Types. (line 49) * dsearch: Identifying points in Triangulation. (line 101) * dsearchn: Identifying points in Triangulation. (line 110) * dup2: Controlling Subprocesses. (line 198) * duplication_matrix: Special Functions. (line 151) * durbinlevinson: Signal Processing. (line 436) * e: Mathematical Constants. (line 7) * echo: Diary and Echo Commands. (line 31) * echo_executing_commands: Diary and Echo Commands. (line 53) * edit: Function Files. (line 55) * edit_history: Commands For History. (line 76) * EDITOR: Commands For History. (line 164) * eig: Basic Matrix Functions. (line 65) * elem: Matrices and Arrays in Oct-Files. (line 77) * ellipsoid: Three-dimensional Geometric Shapes. (line 41) * empirical_cdf: Distributions. (line 118) * empirical_inv: Distributions. (line 123) * empirical_pdf: Distributions. (line 128) * empirical_rnd: Random Number Generation. (line 87) * endgrent: Group Database Functions. (line 42) * endpwent: Password Database Functions. (line 53) * eomday: Timing Utilities. (line 617) * eps: Mathematical Constants. (line 109) * erf: Special Functions. (line 159) * erfc: Special Functions. (line 170) * erfinv: Special Functions. (line 175) * errno: Catching Errors. (line 117) * errno_list: Catching Errors. (line 125) * error: Raising Errors. (line 21) * errorbar: Two-Dimensional Plots. (line 697) * etime: Timing Utilities. (line 341) * etree: Information. (line 144) * etreeplot: Information. (line 156) * eval: Evaluation. (line 15) * evalin: Evaluation in a Different Context. (line 69) * example: Demonstration Functions. (line 55) * exec: Controlling Subprocesses. (line 178) * EXEC_PATH: Controlling Subprocesses. (line 140) * exist: Status of Variables. (line 108) * exit: Quitting Octave. (line 7) * exp: Exponents and Logarithms. (line 7) * expcdf: Distributions. (line 133) * expinv: Distributions. (line 140) * expm: Functions of a Matrix. (line 7) * expm1: Exponents and Logarithms. (line 13) * exppdf: Distributions. (line 144) * exprnd: Random Number Generation. (line 96) * eye: Special Utility Matrices. (line 7) * ezcontour: Two-dimensional Function Plotting. (line 79) * ezcontourf: Two-dimensional Function Plotting. (line 107) * ezmesh: Three-dimensional Function Plotting. (line 32) * ezmeshc: Three-dimensional Function Plotting. (line 74) * ezplot: Two-dimensional Function Plotting. (line 39) * ezplot3: Three-dimensional Function Plotting. (line 7) * ezpolar: Two-dimensional Function Plotting. (line 135) * ezsurf: Three-dimensional Function Plotting. (line 110) * ezsurfc: Three-dimensional Function Plotting. (line 152) * f_test_regression: Tests. (line 142) * factor: Utility Functions. (line 59) * factorial: Utility Functions. (line 69) * fail: Test Functions. (line 279) * false: Logical Values. (line 53) * fcdf: Distributions. (line 148) * fclear: EOF and Errors. (line 40) * fclose: Opening and Closing Files. (line 111) * fcntl: Controlling Subprocesses. (line 362) * fdisp: Simple File I/O. (line 263) * feather: Two-Dimensional Plots. (line 949) * feof: EOF and Errors. (line 25) * ferror: EOF and Errors. (line 34) * feval: Calling a Function by its Name. (line 52) * fflush: Paging Screen Output. (line 66) * fft: Signal Processing. (line 21) * fft2: Signal Processing. (line 146) * fftconv: Signal Processing. (line 190) * fftfilt: Signal Processing. (line 199) * fftn: Signal Processing. (line 168) * fftshift: Signal Processing. (line 446) * fftw: Signal Processing. (line 52) * fgetl: Line-Oriented Input. (line 19) * fgets: Line-Oriented Input. (line 30) * FIELD: Function Files. (line 54) * fieldnames: Manipulating Structures. (line 10) * figure: Multiple Plot Windows. (line 18) * file_in_loadpath: Manipulating the load path. (line 98) * file_in_path: Filesystem Utilities. (line 264) * fileattrib: Filesystem Utilities. (line 191) * filemarker: Filesystem Utilities. (line 347) * fileparts: Filesystem Utilities. (line 328) * filesep: Filesystem Utilities. (line 334) * fill: Graphics Objects. (line 201) * filter: Signal Processing. (line 208) * filter2: Signal Processing. (line 247) * find: Finding Elements and Checking Conditions. (line 96) * find_dir_in_path: Manipulating the load path. (line 131) * findall: Searching Properties. (line 45) * findobj: Searching Properties. (line 7) * findstr: Manipulating Strings. (line 45) * finite: Finding Elements and Checking Conditions. (line 89) * finv: Distributions. (line 152) * fix: Utility Functions. (line 78) * fixed_point_format: Matrices. (line 167) * flag: Representing Images. (line 119) * flipdim: Rearranging Matrices. (line 36) * fliplr: Rearranging Matrices. (line 7) * flipud: Rearranging Matrices. (line 21) * floor: Utility Functions. (line 88) * fmod: Utility Functions. (line 98) * fnmatch: Filesystem Utilities. (line 256) * foo: A Sample Function Description. (line 14) * fopen: Opening and Closing Files. (line 20) * fork: Controlling Subprocesses. (line 158) * format: Terminal Output. (line 37) * formula: Inline Functions. (line 43) * fortran_vec: Matrices and Arrays in Oct-Files. (line 103) * fpdf: Distributions. (line 156) * fplot: Two-dimensional Function Plotting. (line 19) * fprintf: Formatted Output. (line 22) * fputs: Simple Output. (line 17) * fractdiff: Signal Processing. (line 469) * fread: Binary I/O. (line 14) * freport: EOF and Errors. (line 43) * freqz: Signal Processing. (line 267) * freqz_plot: Signal Processing. (line 300) * frewind: File Positioning. (line 46) * frnd: Random Number Generation. (line 105) * fscanf: Formatted Input. (line 12) * fseek: File Positioning. (line 17) * fsolve: Nonlinear Equations. (line 16) * fstat: Filesystem Utilities. (line 187) * ftell: File Positioning. (line 10) * full: Creating Sparse Matrices. (line 201) * fullfile: Filesystem Utilities. (line 364) * func2str: Function Handles. (line 41) * FUNCTION_NAME: Getting Help. (line 29) * functions: Function Handles. (line 37) * fwrite: Binary I/O. (line 175) * fzero: Nonlinear Equations. (line 172) * gamcdf: Distributions. (line 160) * gaminv: Distributions. (line 169) * gamma: Special Functions. (line 180) * gammainc: Special Functions. (line 191) * gammaln: Special Functions. (line 273) * gampdf: Distributions. (line 177) * gamrnd: Random Number Generation. (line 115) * gca: Graphics Objects. (line 70) * gcbf: Callbacks. (line 68) * gcbo: Callbacks. (line 54) * gcd: Utility Functions. (line 105) * gcf: Graphics Objects. (line 55) * genpath: Manipulating the load path. (line 34) * genvarname: Variables. (line 57) * geocdf: Distributions. (line 185) * geoinv: Distributions. (line 189) * geopdf: Distributions. (line 193) * geornd: Random Number Generation. (line 128) * get: Graphics Objects. (line 127) * getegid: Process ID Information. (line 22) * getenv: Environment Variables. (line 7) * geteuid: Process ID Information. (line 16) * getfield: Manipulating Structures. (line 20) * getgid: Process ID Information. (line 25) * getgrent: Group Database Functions. (line 25) * getgrgid: Group Database Functions. (line 29) * getgrnam: Group Database Functions. (line 34) * getpgrp: Process ID Information. (line 7) * getpid: Process ID Information. (line 10) * getppid: Process ID Information. (line 13) * getpwent: Password Database Functions. (line 34) * getpwnam: Password Database Functions. (line 44) * getpwuid: Password Database Functions. (line 39) * getrusage: System Information. (line 141) * getuid: Process ID Information. (line 19) * ginput: Interacting with plots. (line 11) * givens: Basic Matrix Functions. (line 77) * glob: Filesystem Utilities. (line 243) * glpk: Linear Programming. (line 16) * gls: Linear Least Squares. (line 38) * gmap40: Representing Images. (line 228) * gmtime: Timing Utilities. (line 87) * gnuplot_binary: Interaction with gnuplot. (line 7) * gplot: Information. (line 164) * gradient: Utility Functions. (line 133) * gray: Representing Images. (line 126) * gray2ind: Representing Images. (line 28) * grid: Plot Annotations. (line 141) * griddata: Interpolation on Scattered Data. (line 16) * griddata3: Interpolation on Scattered Data. (line 29) * griddatan: Interpolation on Scattered Data. (line 40) * gtext: Interacting with plots. (line 24) * gunzip: File Archiving Utilities. (line 28) * gzip: File Archiving Utilities. (line 16) * hadamard: Famous Matrices. (line 9) * hamming: Signal Processing. (line 473) * hankel: Famous Matrices. (line 30) * hanning: Signal Processing. (line 479) * hess: Matrix Factorizations. (line 120) * hex2dec: String Conversions. (line 62) * hex2num: String Conversions. (line 138) * hggroup: Object Groups. (line 13) * hidden: Three-Dimensional Plotting. (line 80) * hilb: Famous Matrices. (line 47) * hist: Two-Dimensional Plots. (line 292) * histc: Basic Statistical Functions. (line 49) * history: Commands For History. (line 51) * history_file: Commands For History. (line 127) * history_size: Commands For History. (line 139) * history_timestamp_format_string: Commands For History. (line 150) * hold: Graphics Objects. (line 269) * home: Cursor Motion. (line 58) * horzcat: Rearranging Matrices. (line 132) * hot: Representing Images. (line 131) * hotelling_test: Tests. (line 156) * hotelling_test_2: Tests. (line 171) * housh: Matrix Factorizations. (line 489) * hsv: Representing Images. (line 139) * hsv2rgb: Color Conversion. (line 23) * hurst: Signal Processing. (line 485) * hygecdf: Distributions. (line 197) * hygeinv: Distributions. (line 207) * hygepdf: Distributions. (line 214) * hygernd: Random Number Generation. (line 137) * hypot: Utility Functions. (line 172) * I: Mathematical Constants. (line 41) * idivide: Integer Arithmetic. (line 33) * ifft: Signal Processing. (line 126) * ifftn: Signal Processing. (line 179) * ifftshift: Signal Processing. (line 464) * ignore_function_time_stamp: Function Files. (line 175) * imag: Complex Arithmetic. (line 54) * image: Displaying Images. (line 44) * IMAGE_PATH: Loading and Saving Images. (line 49) * image_viewer: Displaying Images. (line 80) * imagesc: Displaying Images. (line 61) * imfinfo: Loading and Saving Images. (line 59) * imread: Loading and Saving Images. (line 20) * imshow: Displaying Images. (line 15) * imwrite: Loading and Saving Images. (line 32) * ind2gray: Representing Images. (line 33) * ind2rgb: Representing Images. (line 48) * ind2sub: Index Expressions. (line 136) * index: Manipulating Strings. (line 72) * Inf: Mathematical Constants. (line 60) * inferiorto: Precedence of Objects. (line 20) * info: Getting Help. (line 74) * info_file: Getting Help. (line 84) * info_program: Getting Help. (line 97) * inline: Inline Functions. (line 15) * inpolygon: Voronoi Diagrams. (line 106) * input: Terminal Input. (line 12) * inputname: Defining Functions. (line 158) * int16: Integer Data Types. (line 43) * int2str: Conversion of Numerical Data to Strings. (line 82) * int32: Integer Data Types. (line 49) * int64: Integer Data Types. (line 55) * int8: Integer Data Types. (line 37) * interp1: One-dimensional Interpolation. (line 12) * interp1q: One-dimensional Interpolation. (line 101) * interp2: Multi-dimensional Interpolation. (line 11) * interp3: Multi-dimensional Interpolation. (line 63) * interpft: One-dimensional Interpolation. (line 122) * interpn: Multi-dimensional Interpolation. (line 109) * intersect: Set Operations. (line 77) * intmax: Integer Data Types. (line 61) * intmin: Integer Data Types. (line 93) * intwarning: Integer Data Types. (line 125) * inv: Basic Matrix Functions. (line 94) * inverse: Basic Matrix Functions. (line 95) * invhilb: Famous Matrices. (line 57) * ipermute: Rearranging Matrices. (line 151) * iqr: Basic Statistical Functions. (line 172) * is_absolute_filename: Filesystem Utilities. (line 379) * is_duplicate_entry: Finding Elements and Checking Conditions. (line 53) * is_leap_year: Timing Utilities. (line 366) * is_rooted_relative_filename: Filesystem Utilities. (line 382) * isa: Built-in Data Types. (line 25) * isalnum: Character Class Functions. (line 16) * isalpha: Character Class Functions. (line 20) * isascii: Character Class Functions. (line 25) * iscell: Creating Cell Arrays. (line 56) * iscellstr: Cell Arrays of Strings. (line 44) * ischar: Character Arrays. (line 26) * iscntrl: Character Class Functions. (line 29) * iscommand: Commands. (line 47) * iscomplex: Predicates for Numeric Objects. (line 34) * isdebugmode: Debug Mode. (line 27) * isdefinite: Predicates for Numeric Objects. (line 75) * isdigit: Character Class Functions. (line 32) * isdir: Filesystem Utilities. (line 240) * isempty: Object Sizes. (line 69) * isequal: Comparison Ops. (line 44) * isequalwithequalnans: Comparison Ops. (line 49) * isfield: Manipulating Structures. (line 15) * isfigure: Graphics Objects. (line 47) * isfloat: Predicates for Numeric Objects. (line 31) * isglobal: Global Variables. (line 65) * isgraph: Character Class Functions. (line 35) * ishandle: Graphics Objects. (line 41) * ishghandle: Graphics Objects. (line 44) * ishold: Graphics Objects. (line 287) * isieee: System Information. (line 57) * isinf: Finding Elements and Checking Conditions. (line 75) * isinteger: Integer Data Types. (line 29) * isletter: Character Class Functions. (line 21) * islogical: Predicates for Numeric Objects. (line 83) * islower: Character Class Functions. (line 43) * ismac: System Information. (line 52) * ismatrix: Predicates for Numeric Objects. (line 37) * ismember: Set Operations. (line 18) * ismethod: Creating a Class. (line 110) * isna: Missing Data. (line 20) * isnan: Finding Elements and Checking Conditions. (line 82) * isnull: Object Sizes. (line 73) * isnumeric: Predicates for Numeric Objects. (line 25) * isobject: Creating a Class. (line 96) * ispc: System Information. (line 41) * isprime: Predicates for Numeric Objects. (line 86) * isprint: Character Class Functions. (line 46) * ispunct: Character Class Functions. (line 49) * israwcommand: Commands. (line 59) * isreal: Predicates for Numeric Objects. (line 28) * isscalar: Predicates for Numeric Objects. (line 47) * issorted: Rearranging Matrices. (line 315) * isspace: Character Class Functions. (line 52) * issparse: Information. (line 23) * issquare: Predicates for Numeric Objects. (line 54) * isstrprop: Character Class Functions. (line 62) * isstruct: Creating Structures. (line 63) * issymmetric: Predicates for Numeric Objects. (line 63) * isunix: System Information. (line 46) * isupper: Character Class Functions. (line 56) * isvarname: Variables. (line 54) * isvector: Predicates for Numeric Objects. (line 40) * isxdigit: Character Class Functions. (line 59) * jet: Representing Images. (line 151) * kbhit: Terminal Input. (line 64) * kendall: Basic Statistical Functions. (line 148) * keyboard: Breakpoints. (line 98) * kill: Controlling Subprocesses. (line 412) * kolmogorov_smirnov_cdf: Distributions. (line 223) * kolmogorov_smirnov_test: Tests. (line 191) * kolmogorov_smirnov_test_2: Tests. (line 220) * kron: Functions of a Matrix. (line 42) * kruskal_wallis_test: Tests. (line 244) * krylov: Matrix Factorizations. (line 515) * kurtosis: Descriptive Statistics. (line 230) * laplace_cdf: Distributions. (line 234) * laplace_inv: Distributions. (line 238) * laplace_pdf: Distributions. (line 242) * laplace_rnd: Random Number Generation. (line 150) * lasterr: Catching Errors. (line 81) * lasterror: Catching Errors. (line 40) * lastwarn: Issuing Warnings. (line 56) * lcm: Utility Functions. (line 178) * legend: Plot Annotations. (line 26) * legendre: Special Functions. (line 211) * length: Object Sizes. (line 39) * lgamma: Special Functions. (line 272) * license: System Information. (line 67) * lin2mu: Audio Processing. (line 28) * line: Graphics Objects. (line 172) * link: Filesystem Utilities. (line 19) * linkprop: Object Groups. (line 177) * linspace: Special Utility Matrices. (line 301) * list_primes: Utility Functions. (line 193) * load: Simple File I/O. (line 130) * loadaudio: Audio Processing. (line 51) * loadobj: Manipulating Classes. (line 162) * localtime: Timing Utilities. (line 113) * log: Exponents and Logarithms. (line 18) * log10: Exponents and Logarithms. (line 32) * log1p: Exponents and Logarithms. (line 26) * log2: Exponents and Logarithms. (line 38) * logical: Logical Values. (line 37) * logistic_cdf: Distributions. (line 246) * logistic_inv: Distributions. (line 250) * logistic_pdf: Distributions. (line 254) * logistic_regression: Models. (line 8) * logistic_rnd: Random Number Generation. (line 155) * logit: Basic Statistical Functions. (line 139) * loglog: Two-Dimensional Plots. (line 205) * loglogerr: Two-Dimensional Plots. (line 798) * logm: Functions of a Matrix. (line 28) * logncdf: Distributions. (line 258) * logninv: Distributions. (line 267) * lognpdf: Distributions. (line 276) * lognrnd: Random Number Generation. (line 160) * logspace: Special Utility Matrices. (line 313) * lookfor: Getting Help. (line 45) * lookup: One-dimensional Interpolation. (line 185) * lower: String Conversions. (line 252) * ls: Current Working Directory. (line 22) * ls_command: Current Working Directory. (line 38) * lsode: Ordinary Differential Equations. (line 15) * lsode_options: Ordinary Differential Equations. (line 86) * lsqnonneg: Linear Least Squares. (line 56) * lstat: Filesystem Utilities. (line 103) * lu: Matrix Factorizations. (line 132) * luinc: Iterative Techniques. (line 277) * magic: Famous Matrices. (line 85) * mahalanobis: Basic Statistical Functions. (line 9) * make_absolute_filename: Filesystem Utilities. (line 385) * makeinfo_program: Getting Help. (line 111) * manova: Tests. (line 271) * mark_as_command: Commands. (line 39) * mark_as_rawcommand: Commands. (line 51) * mat2cell: Creating Cell Arrays. (line 67) * mat2str: Conversion of Numerical Data to Strings. (line 16) * matrix_type: Basic Matrix Functions. (line 105) * max: Utility Functions. (line 201) * max_recursion_depth: Recursion. (line 29) * mcnemar_test: Tests. (line 285) * md5sum: Hashing Functions. (line 27) * mean: Descriptive Statistics. (line 9) * meansq: Descriptive Statistics. (line 131) * median: Descriptive Statistics. (line 33) * menu: Terminal Input. (line 39) * mesh: Three-Dimensional Plotting. (line 50) * meshc: Three-Dimensional Plotting. (line 60) * meshgrid: Three-Dimensional Plotting. (line 199) * meshz: Three-Dimensional Plotting. (line 70) * methods: Creating a Class. (line 102) * mex: Getting Started with Mex-Files. (line 12) * mexext: Getting Started with Mex-Files. (line 18) * mfilename: Function Files. (line 166) * min: Utility Functions. (line 232) * mislocked: Function Locking. (line 74) * mkdir: Filesystem Utilities. (line 59) * mkfifo: Filesystem Utilities. (line 89) * mkoctfile: Getting Started with Oct-Files. (line 10) * mkpp: Polynomial Interpolation. (line 76) * mkstemp: Temporary Files. (line 12) * mktime: Timing Utilities. (line 139) * mlock: Function Locking. (line 61) * mod: Utility Functions. (line 313) * mode: Descriptive Statistics. (line 183) * moment: Descriptive Statistics. (line 257) * more: Paging Screen Output. (line 26) * movefile: Filesystem Utilities. (line 303) * mpoles: Finding Roots. (line 53) * mu2lin: Audio Processing. (line 40) * munlock: Function Locking. (line 67) * NA: Missing Data. (line 13) * NAME <1>: Function Files. (line 53) * NAME: Getting Help. (line 15) * namelengthmax: Variables. (line 121) * NaN: Mathematical Constants. (line 83) * nargchk: Multiple Return Values. (line 97) * nargin: Defining Functions. (line 146) * nargout: Multiple Return Values. (line 75) * nargoutchk: Multiple Return Values. (line 110) * native_float_format: Simple File I/O. (line 247) * nbincdf: Distributions. (line 285) * nbininv: Distributions. (line 292) * nbinpdf: Distributions. (line 299) * nbinrnd: Random Number Generation. (line 170) * nchoosek: Basic Statistical Functions. (line 28) * ndgrid: Three-Dimensional Plotting. (line 212) * ndims: Object Sizes. (line 13) * nelem: Matrices and Arrays in Oct-Files. (line 89) * newplot: Graphics Objects. (line 264) * news: Getting Help. (line 71) * newtroot: Calling a Function by its Name. (line 16) * nextpow2: Exponents and Logarithms. (line 49) * nnz: Information. (line 26) * nonzeros: Information. (line 31) * norm: Basic Matrix Functions. (line 178) * normcdf: Distributions. (line 307) * normest: Sparse Linear Algebra. (line 90) * norminv: Distributions. (line 314) * normpdf: Distributions. (line 321) * normrnd: Random Number Generation. (line 180) * now: Timing Utilities. (line 63) * nthroot: Exponents and Logarithms. (line 57) * ntsc2rgb: Color Conversion. (line 33) * null: Basic Matrix Functions. (line 226) * num2cell: Creating Cell Arrays. (line 59) * num2hex: String Conversions. (line 122) * num2str: Conversion of Numerical Data to Strings. (line 44) * numel: Object Sizes. (line 34) * nzmax: Information. (line 34) * ocean: Representing Images. (line 159) * octave_config_info: System Information. (line 133) * octave_core_file_limit: Saving Data on Unexpected Exits. (line 49) * octave_core_file_name: Saving Data on Unexpected Exits. (line 65) * octave_core_file_options: Saving Data on Unexpected Exits. (line 36) * OCTAVE_HOME: System Information. (line 61) * OCTAVE_VERSION: System Information. (line 64) * ols: Linear Least Squares. (line 14) * onenormest: Sparse Linear Algebra. (line 100) * ones: Special Utility Matrices. (line 39) * operator (): Matrices and Arrays in Oct-Files. (line 76) * optimget: Linear Least Squares. (line 104) * optimset: Linear Least Squares. (line 98) * options: Status of Variables. (line 215) * orderfields: Creating Structures. (line 94) * orient: Printing Plots. (line 181) * orth: Basic Matrix Functions. (line 235) * output_max_field_width: Matrices. (line 115) * output_precision: Matrices. (line 123) * P_tmpdir: Filesystem Utilities. (line 375) * pack: File Archiving Utilities. (line 77) * page_output_immediately: Paging Screen Output. (line 59) * page_screen_output: Paging Screen Output. (line 51) * PAGER: Paging Screen Output. (line 33) * PAGER_FLAGS: Paging Screen Output. (line 44) * pareto: Two-Dimensional Plots. (line 498) * parseparams: Variable-length Argument Lists. (line 64) * pascal: Famous Matrices. (line 90) * patch: Graphics Objects. (line 182) * path: Manipulating the load path. (line 54) * pathdef: Manipulating the load path. (line 73) * pathsep: Manipulating the load path. (line 88) * pause: Timing Utilities. (line 411) * pcg: Iterative Techniques. (line 13) * pchip: Signal Processing. (line 490) * pclose: Controlling Subprocesses. (line 104) * pcolor: Two-Dimensional Plots. (line 971) * pcr: Iterative Techniques. (line 160) * peaks: Test Plotting Functions. (line 22) * periodogram: Signal Processing. (line 514) * perl: Controlling Subprocesses. (line 72) * perms: Basic Statistical Functions. (line 73) * permute: Rearranging Matrices. (line 144) * pi: Mathematical Constants. (line 24) * pie: Two-Dimensional Plots. (line 835) * pink: Representing Images. (line 163) * pinv: Basic Matrix Functions. (line 244) * pipe: Controlling Subprocesses. (line 191) * pkg: Packages. (line 23) * planerot: Basic Matrix Functions. (line 88) * playaudio: Audio Processing. (line 83) * plot: Two-Dimensional Plots. (line 23) * plot3: Three-Dimensional Plotting. (line 224) * plotmatrix: Two-Dimensional Plots. (line 464) * plotyy: Two-Dimensional Plots. (line 154) * poisscdf: Distributions. (line 328) * poissinv: Distributions. (line 333) * poisspdf: Distributions. (line 337) * poissrnd: Random Number Generation. (line 189) * pol2cart: Coordinate Transformations. (line 17) * polar: Two-Dimensional Plots. (line 827) * poly: Miscellaneous Functions. (line 7) * polyarea: Voronoi Diagrams. (line 68) * polyder: Derivatives and Integrals. (line 31) * polyderiv: Derivatives and Integrals. (line 17) * polyfit: Polynomial Interpolation. (line 16) * polygcd: Products of Polynomials. (line 72) * polyint: Derivatives and Integrals. (line 48) * polyinteg: Derivatives and Integrals. (line 36) * polyout: Miscellaneous Functions. (line 27) * polyreduce: Miscellaneous Functions. (line 39) * polyval: Evaluating Polynomials. (line 24) * polyvalm: Evaluating Polynomials. (line 45) * popen: Controlling Subprocesses. (line 80) * popen2: Controlling Subprocesses. (line 108) * pow2: Exponents and Logarithms. (line 67) * ppplot: Statistical Plots. (line 37) * ppval: Polynomial Interpolation. (line 68) * prctile: Descriptive Statistics. (line 114) * prepad: Rearranging Matrices. (line 381) * primes: Utility Functions. (line 328) * print: Printing Plots. (line 15) * print_empty_dimensions: Empty Matrices. (line 30) * print_usage: Raising Errors. (line 100) * printf: Formatted Output. (line 14) * prism: Representing Images. (line 170) * probit: Basic Statistical Functions. (line 135) * prod: Sums and Products. (line 28) * program_name: Command Line Options. (line 166) * prop_test_2: Tests. (line 300) * PS1: Customizing the Prompt. (line 57) * PS2: Customizing the Prompt. (line 75) * PS4: Customizing the Prompt. (line 86) * putenv: Environment Variables. (line 14) * puts: Simple Output. (line 30) * pwd: Current Working Directory. (line 72) * qp: Quadratic Programming. (line 15) * qqplot: Statistical Plots. (line 14) * qr: Matrix Factorizations. (line 196) * qrdelete: Matrix Factorizations. (line 310) * qrinsert: Matrix Factorizations. (line 286) * qrshift: Matrix Factorizations. (line 334) * qrupdate: Matrix Factorizations. (line 271) * quad: Functions of One Variable. (line 29) * quad_options: Functions of One Variable. (line 64) * quadgk: Functions of One Variable. (line 146) * quadl: Functions of One Variable. (line 122) * quadv: Functions of One Variable. (line 232) * quantile: Descriptive Statistics. (line 46) * quit: Quitting Octave. (line 8) * quiver: Two-Dimensional Plots. (line 856) * quiver3: Two-Dimensional Plots. (line 890) * qz: Matrix Factorizations. (line 344) * qzhess: Matrix Factorizations. (line 396) * rainbow: Representing Images. (line 178) * rand: Special Utility Matrices. (line 74) * rande: Special Utility Matrices. (line 150) * randg: Special Utility Matrices. (line 202) * randn: Special Utility Matrices. (line 133) * randp: Special Utility Matrices. (line 166) * randperm: Special Utility Matrices. (line 294) * range: Basic Statistical Functions. (line 126) * rank: Basic Matrix Functions. (line 254) * ranks: Basic Statistical Functions. (line 121) * rat: Rational Approximations. (line 7) * rats: Rational Approximations. (line 21) * rcond: Basic Matrix Functions. (line 265) * re_read_readline_init_file: Customizing readline. (line 24) * read_readline_init_file: Customizing readline. (line 16) * readdir: Filesystem Utilities. (line 50) * readlink: Filesystem Utilities. (line 35) * real: Complex Arithmetic. (line 59) * reallog: Exponents and Logarithms. (line 75) * realmax: Mathematical Constants. (line 130) * realmin: Mathematical Constants. (line 153) * realpow: Exponents and Logarithms. (line 82) * realsqrt: Exponents and Logarithms. (line 90) * record: Audio Processing. (line 92) * rectangle_lw: Signal Processing. (line 518) * rectangle_sw: Signal Processing. (line 522) * rectint: Voronoi Diagrams. (line 95) * refresh: Graphics Objects. (line 240) * refreshdata: Data sources in object groups. (line 12) * regexp: Manipulating Strings. (line 205) * regexpi: Manipulating Strings. (line 352) * regexprep: Manipulating Strings. (line 359) * regexptranslate: Manipulating Strings. (line 396) * rehash: Manipulating the load path. (line 95) * rem: Utility Functions. (line 341) * rename: Filesystem Utilities. (line 11) * repmat: Special Utility Matrices. (line 68) * reshape: Rearranging Matrices. (line 159) * residue: Products of Polynomials. (line 94) * resize <1>: Matrices and Arrays in Oct-Files. (line 98) * resize: Rearranging Matrices. (line 177) * restoredefaultpath: Manipulating the load path. (line 115) * rethrow: Catching Errors. (line 107) * return: Returning From a Function. (line 38) * rgb2hsv: Color Conversion. (line 10) * rgb2ind: Representing Images. (line 41) * rgb2ntsc: Color Conversion. (line 28) * ribbon: Three-Dimensional Plotting. (line 327) * rindex: Manipulating Strings. (line 90) * rmdir: Filesystem Utilities. (line 69) * rmfield: Creating Structures. (line 69) * rmpath: Manipulating the load path. (line 37) * roots: Finding Roots. (line 11) * rose: Two-Dimensional Plots. (line 529) * rosser: Famous Matrices. (line 106) * rot90: Rearranging Matrices. (line 46) * rotdim: Rearranging Matrices. (line 71) * round: Utility Functions. (line 352) * roundb: Utility Functions. (line 361) * rows: Object Sizes. (line 26) * rref: Basic Matrix Functions. (line 278) * run: Calling a Function by its Name. (line 71) * run_count: Basic Statistical Functions. (line 116) * run_history: Commands For History. (line 107) * run_test: Tests. (line 319) * rundemos: Demonstration Functions. (line 53) * save: Simple File I/O. (line 29) * save_header_format_string: Simple File I/O. (line 232) * save_precision: Simple File I/O. (line 227) * saveaudio: Audio Processing. (line 65) * saveobj: Manipulating Classes. (line 140) * savepath: Manipulating the load path. (line 44) * saving_history: Commands For History. (line 117) * scanf: Formatted Input. (line 54) * scatter: Two-Dimensional Plots. (line 401) * scatter3: Two-Dimensional Plots. (line 433) * schur: Matrix Factorizations. (line 413) * sec: Trigonometry. (line 34) * secd: Trigonometry. (line 177) * sech: Trigonometry. (line 100) * SEEK_CUR: File Positioning. (line 33) * SEEK_END: File Positioning. (line 34) * SEEK_SET: File Positioning. (line 32) * semilogx: Two-Dimensional Plots. (line 189) * semilogxerr: Two-Dimensional Plots. (line 770) * semilogy: Two-Dimensional Plots. (line 197) * semilogyerr: Two-Dimensional Plots. (line 784) * set: Graphics Objects. (line 133) * setaudio: Audio Processing. (line 102) * setdiff: Set Operations. (line 99) * setenv: Environment Variables. (line 15) * setfield: Creating Structures. (line 76) * setgrent: Group Database Functions. (line 39) * setpwent: Password Database Functions. (line 49) * setxor: Set Operations. (line 115) * shading: Three-Dimensional Plotting. (line 338) * shg: Graphics Objects. (line 323) * shift: Rearranging Matrices. (line 259) * shiftdim: Rearranging Matrices. (line 234) * SIG: Controlling Subprocesses. (line 431) * sighup_dumps_octave_core: Saving Data on Unexpected Exits. (line 24) * sign: Utility Functions. (line 368) * sign_test: Tests. (line 328) * sigterm_dumps_octave_core: Saving Data on Unexpected Exits. (line 30) * silent_functions: Defining Functions. (line 161) * sin: Trigonometry. (line 16) * sinc: Signal Processing. (line 303) * sind: Trigonometry. (line 158) * sinetone: Signal Processing. (line 526) * sinewave: Signal Processing. (line 533) * single: Single Precision Data Types. (line 12) * sinh: Trigonometry. (line 82) * size: Object Sizes. (line 44) * size_equal: Object Sizes. (line 88) * sizeof: Object Sizes. (line 85) * skewness: Descriptive Statistics. (line 239) * sleep: Timing Utilities. (line 422) * slice: Three-Dimensional Plotting. (line 278) * sombrero: Test Plotting Functions. (line 11) * sort: Rearranging Matrices. (line 267) * sortrows: Rearranging Matrices. (line 308) * source: Script Files. (line 92) * spalloc: Creating Sparse Matrices. (line 207) * sparse: Creating Sparse Matrices. (line 228) * sparse_auto_mutate: Return Types of Operators and Functions. (line 53) * spaugment: Sparse Linear Algebra. (line 301) * spconvert: Creating Sparse Matrices. (line 263) * spdiags: Creating Sparse Matrices. (line 48) * spearman: Basic Statistical Functions. (line 99) * spectral_adf: Signal Processing. (line 539) * spectral_xdf: Signal Processing. (line 549) * specular: Three-Dimensional Plotting. (line 188) * speed: Demonstration Functions. (line 69) * spencer: Signal Processing. (line 559) * speye: Creating Sparse Matrices. (line 75) * spfun: Creating Sparse Matrices. (line 87) * sph2cart: Coordinate Transformations. (line 36) * sphere: Three-dimensional Geometric Shapes. (line 29) * spinmap: Representing Images. (line 241) * spline: One-dimensional Interpolation. (line 155) * split_long_rows: Matrices. (line 136) * spmax: Creating Sparse Matrices. (line 92) * spmin: Creating Sparse Matrices. (line 96) * spones: Creating Sparse Matrices. (line 100) * spparms: Sparse Linear Algebra. (line 174) * sprand: Creating Sparse Matrices. (line 104) * sprandn: Creating Sparse Matrices. (line 118) * sprandsym: Creating Sparse Matrices. (line 133) * sprank: Sparse Linear Algebra. (line 242) * spring: Representing Images. (line 186) * sprintf: Formatted Output. (line 31) * spstats: Information. (line 44) * spy: Information. (line 134) * sqp: Nonlinear Programming. (line 11) * sqrt: Exponents and Logarithms. (line 97) * sqrtm: Functions of a Matrix. (line 33) * squeeze: Object Sizes. (line 95) * sscanf: Formatted Input. (line 63) * stairs: Two-Dimensional Plots. (line 316) * stat: Filesystem Utilities. (line 102) * statistics: Descriptive Statistics. (line 248) * std: Descriptive Statistics. (line 138) * stderr: C-Style I/O Functions. (line 34) * stdin: C-Style I/O Functions. (line 20) * stdout: C-Style I/O Functions. (line 27) * stem: Two-Dimensional Plots. (line 345) * stem3: Two-Dimensional Plots. (line 385) * stft: Signal Processing. (line 563) * STR: Getting Help. (line 43) * str2double: String Conversions. (line 153) * str2func: Function Handles. (line 45) * str2num: String Conversions. (line 223) * strcat: Concatenating Strings. (line 130) * strchr: Manipulating Strings. (line 61) * strcmp: Comparing Strings. (line 21) * strcmpi: Comparing Strings. (line 62) * strfind: Manipulating Strings. (line 103) * strftime: Timing Utilities. (line 162) * string_fill_char: Character Arrays. (line 48) * strjust: String Conversions. (line 210) * strmatch: Manipulating Strings. (line 133) * strncmp: Comparing Strings. (line 38) * strncmpi: Comparing Strings. (line 80) * strptime: Timing Utilities. (line 303) * strrep: Manipulating Strings. (line 179) * strsplit: Manipulating Strings. (line 171) * strtok: Manipulating Strings. (line 154) * strtrim: Manipulating Strings. (line 26) * strtrunc: Manipulating Strings. (line 38) * struct: Creating Structures. (line 51) * struct2cell: Processing Data in Structures. (line 55) * struct_levels_to_print: Data Structures. (line 93) * structfun: Processing Data in Structures. (line 12) * strvcat: Concatenating Strings. (line 109) * studentize: Basic Statistical Functions. (line 20) * sub2ind: Index Expressions. (line 122) * subplot: Multiple Plots on One Page. (line 23) * subsasgn: Indexing Objects. (line 85) * subsindex: Indexing Objects. (line 142) * subspace: Matrix Factorizations. (line 437) * subsref: Indexing Objects. (line 15) * substr: Manipulating Strings. (line 189) * substruct: Manipulating Structures. (line 38) * sum: Sums and Products. (line 7) * summer: Representing Images. (line 193) * sumsq: Sums and Products. (line 65) * superiorto: Precedence of Objects. (line 14) * suppress_verbose_help_message: Getting Help. (line 135) * surf: Three-Dimensional Plotting. (line 90) * surface: Graphics Objects. (line 209) * surfc: Three-Dimensional Plotting. (line 99) * surfl: Three-Dimensional Plotting. (line 109) * surfnorm: Three-Dimensional Plotting. (line 150) * svd: Matrix Factorizations. (line 441) * svds: Sparse Linear Algebra. (line 498) * swapbytes: Built-in Data Types. (line 50) * syl: Functions of a Matrix. (line 55) * sylvester_matrix: Famous Matrices. (line 116) * symamd: Mathematical Considerations. (line 425) * symbfact: Sparse Linear Algebra. (line 253) * symlink: Filesystem Utilities. (line 27) * symrcm: Mathematical Considerations. (line 488) * symvar: Inline Functions. (line 54) * synthesis: Signal Processing. (line 592) * system: Controlling Subprocesses. (line 17) * t_test: Tests. (line 348) * t_test_2: Tests. (line 366) * t_test_regression: Tests. (line 385) * table: Basic Statistical Functions. (line 92) * tan: Trigonometry. (line 28) * tand: Trigonometry. (line 170) * tanh: Trigonometry. (line 94) * tar: File Archiving Utilities. (line 39) * tcdf: Distributions. (line 341) * tempdir: Filesystem Utilities. (line 369) * tempname: Filesystem Utilities. (line 372) * test: Test Functions. (line 7) * text: Plot Annotations. (line 74) * tic: Timing Utilities. (line 374) * tilde_expand: Filesystem Utilities. (line 284) * time: Timing Utilities. (line 49) * tinv: Distributions. (line 346) * title: Plot Annotations. (line 22) * tmpfile: Temporary Files. (line 32) * tmpnam: Temporary Files. (line 45) * toascii: String Conversions. (line 242) * toc: Timing Utilities. (line 375) * toeplitz: Famous Matrices. (line 123) * tolower: String Conversions. (line 251) * toupper: String Conversions. (line 262) * tpdf: Distributions. (line 353) * trace: Basic Matrix Functions. (line 275) * trapz: Functions of One Variable. (line 257) * treelayout: Information. (line 188) * treeplot: Information. (line 179) * triangle_lw: Signal Processing. (line 601) * triangle_sw: Signal Processing. (line 605) * tril: Rearranging Matrices. (line 339) * trimesh: Plotting the Triangulation. (line 21) * triplequad: Functions of Multiple Variables. (line 60) * triplot: Plotting the Triangulation. (line 10) * triu: Rearranging Matrices. (line 340) * trnd: Random Number Generation. (line 197) * true: Logical Values. (line 46) * tsearch: Identifying points in Triangulation. (line 56) * tsearchn: Identifying points in Triangulation. (line 64) * typecast: Built-in Data Types. (line 36) * typeinfo: Data Types. (line 19) * u_test: Tests. (line 405) * uint16: Integer Data Types. (line 46) * uint32: Integer Data Types. (line 52) * uint64: Integer Data Types. (line 58) * uint8: Integer Data Types. (line 40) * umask: Filesystem Utilities. (line 95) * uname: System Information. (line 26) * undo_string_escapes: String Conversions. (line 276) * unidcdf: Distributions. (line 358) * unidinv: Distributions. (line 363) * unidpdf: Distributions. (line 368) * unidrnd: Random Number Generation. (line 206) * unifcdf: Distributions. (line 373) * unifinv: Distributions. (line 379) * unifpdf: Distributions. (line 385) * unifrnd: Random Number Generation. (line 217) * union: Set Operations. (line 54) * unique: Sets. (line 11) * unix: Controlling Subprocesses. (line 50) * unlink: Filesystem Utilities. (line 44) * unmark_command: Commands. (line 43) * unmark_rawcommand: Commands. (line 55) * unmkpp: Polynomial Interpolation. (line 95) * unpack: File Archiving Utilities. (line 81) * untar: File Archiving Utilities. (line 52) * unwrap: Signal Processing. (line 306) * unzip: File Archiving Utilities. (line 69) * upper: String Conversions. (line 263) * urlread: Networking Utilities. (line 7) * urlwrite: Networking Utilities. (line 36) * usage: Raising Errors. (line 108) * usleep: Timing Utilities. (line 426) * validatestring: Comparing Strings. (line 99) * values: Basic Statistical Functions. (line 85) * vander: Famous Matrices. (line 144) * var: Descriptive Statistics. (line 164) * var_test: Tests. (line 424) * vec: Rearranging Matrices. (line 372) * vech: Rearranging Matrices. (line 376) * vectorize: Inline Functions. (line 50) * ver: System Information. (line 104) * version: System Information. (line 100) * vertcat: Rearranging Matrices. (line 138) * view: Three-Dimensional Plotting. (line 273) * voronoi: Voronoi Diagrams. (line 16) * voronoin: Voronoi Diagrams. (line 39) * waitforbuttonpress: Interacting with plots. (line 17) * waitpid: Controlling Subprocesses. (line 205) * warning: Issuing Warnings. (line 31) * warranty: Getting Help. (line 77) * wavread: Audio Processing. (line 105) * wavwrite: Audio Processing. (line 126) * wblcdf: Distributions. (line 391) * wblinv: Distributions. (line 399) * wblpdf: Distributions. (line 403) * wblrnd: Random Number Generation. (line 226) * WCOREDUMP: Controlling Subprocesses. (line 257) * weekday: Timing Utilities. (line 604) * welch_test: Tests. (line 443) * WEXITSTATUS: Controlling Subprocesses. (line 270) * what: Status of Variables. (line 231) * which: Status of Variables. (line 225) * white: Representing Images. (line 200) * who: Status of Variables. (line 18) * whos: Status of Variables. (line 19) * whos_line_format: Status of Variables. (line 49) * wienrnd: Random Number Generation. (line 236) * WIFCONTINUED: Controlling Subprocesses. (line 281) * WIFEXITED: Controlling Subprocesses. (line 313) * WIFSIGNALED: Controlling Subprocesses. (line 291) * WIFSTOPPED: Controlling Subprocesses. (line 301) * wilcoxon_test: Tests. (line 462) * wilkinson: Famous Matrices. (line 162) * winter: Representing Images. (line 207) * WNOHANG: Controlling Subprocesses. (line 323) * WSTOPSIG: Controlling Subprocesses. (line 331) * WTERMSIG: Controlling Subprocesses. (line 342) * WUNTRACED: Controlling Subprocesses. (line 353) * xlabel: Plot Annotations. (line 84) * xlim: Two-Dimensional Plots. (line 1147) * xor: Finding Elements and Checking Conditions. (line 48) * yes_or_no: Terminal Input. (line 50) * ylabel: Plot Annotations. (line 85) * yulewalker: Signal Processing. (line 609) * z_test: Tests. (line 483) * z_test_2: Tests. (line 501) * zeros: Special Utility Matrices. (line 56) * zip: File Archiving Utilities. (line 60) * zlabel: Plot Annotations. (line 86)  File: octave.info, Node: Operator Index, Prev: Function Index, Up: Top Operator Index ************** [index] * Menu: * !: Element-by-element Boolean Operators. (line 37) * !=: Comparison Ops. (line 38) * " <1>: Strings. (line 6) * ": String Objects. (line 6) * &: Element-by-element Boolean Operators. (line 28) * &&: Short-circuit Boolean Operators. (line 14) * ' <1>: Arithmetic Ops. (line 85) * ' <2>: Strings. (line 6) * ': String Objects. (line 6) * (: Index Expressions. (line 6) * ): Index Expressions. (line 6) * *: Arithmetic Ops. (line 26) * **: Arithmetic Ops. (line 62) * *=: Assignment Ops. (line 125) * +: Arithmetic Ops. (line 10) * ++: Increment Ops. (line 26) * +=: Assignment Ops. (line 115) * ,: Matrices. (line 6) * -: Arithmetic Ops. (line 18) * --: Increment Ops. (line 31) * -=: Assignment Ops. (line 125) * .': Arithmetic Ops. (line 92) * .*: Arithmetic Ops. (line 30) * .**: Arithmetic Ops. (line 75) * .+: Arithmetic Ops. (line 15) * ./: Arithmetic Ops. (line 44) * .\: Arithmetic Ops. (line 57) * .^: Arithmetic Ops. (line 75) * /: Arithmetic Ops. (line 34) * /=: Assignment Ops. (line 125) * ;: Matrices. (line 6) * <: Comparison Ops. (line 22) * <=: Comparison Ops. (line 25) * =: Assignment Ops. (line 6) * ==: Comparison Ops. (line 28) * >: Comparison Ops. (line 34) * >=: Comparison Ops. (line 31) * [: Matrices. (line 6) * \: Arithmetic Ops. (line 47) * ]: Matrices. (line 6) * ^: Arithmetic Ops. (line 62) * colon: Ranges. (line 6) * |: Element-by-element Boolean Operators. (line 32) * ||: Short-circuit Boolean Operators. (line 28) * ~: Element-by-element Boolean Operators. (line 37) * ~=: Comparison Ops. (line 38) qtoctave-0.10.1/qtoctave-info-reader/test/octave.info-50000644000175000017500000107032611511434231021721 0ustar lucaslucasThis is octave.info, produced by makeinfo version 4.11 from ./octave.texi. START-INFO-DIR-ENTRY * Octave: (octave). Interactive language for numerical computations. END-INFO-DIR-ENTRY Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2005, 2006, 2007 John W. Eaton. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.  File: octave.info, Node: Process ID Information, Next: Environment Variables, Prev: Controlling Subprocesses, Up: System Utilities 34.6 Process, Group, and User IDs ================================= -- Built-in Function: pgid = getpgrp () Return the process group id of the current process. -- Built-in Function: pid = getpid () Return the process id of the current process. -- Built-in Function: pid = getppid () Return the process id of the parent process. -- Built-in Function: euid = geteuid () Return the effective user id of the current process. -- Built-in Function: uid = getuid () Return the real user id of the current process. -- Built-in Function: egid = getegid () Return the effective group id of the current process. -- Built-in Function: gid = getgid () Return the real group id of the current process.  File: octave.info, Node: Environment Variables, Next: Current Working Directory, Prev: Process ID Information, Up: System Utilities 34.7 Environment Variables ========================== -- Built-in Function: getenv (VAR) Return the value of the environment variable VAR. For example, getenv ("PATH") returns a string containing the value of your path. -- Built-in Function: putenv (VAR, VALUE) -- Built-in Function: setenv (VAR, VALUE) Set the value of the environment variable VAR to VALUE.  File: octave.info, Node: Current Working Directory, Next: Password Database Functions, Prev: Environment Variables, Up: System Utilities 34.8 Current Working Directory ============================== -- Command: cd dir -- Command: chdir dir Change the current working directory to DIR. If DIR is omitted, the current directory is changed to the user's home directory. For example, cd ~/octave Changes the current working directory to `~/octave'. If the directory does not exist, an error message is printed and the working directory is not changed. *See also:* *note mkdir: doc-mkdir, *note rmdir: doc-rmdir, *note dir: doc-dir. -- Command: ls options List directory contents. For example, ls -l -| total 12 -| -rw-r--r-- 1 jwe users 4488 Aug 19 04:02 foo.m -| -rw-r--r-- 1 jwe users 1315 Aug 17 23:14 bar.m The `dir' and `ls' commands are implemented by calling your system's directory listing command, so the available options may vary from system to system. *See also:* *note dir: doc-dir, *note stat: doc-stat, *note readdir: doc-readdir, *note glob: doc-glob, *note filesep: doc-filesep, *note ls_command: doc-ls_command. -- Function File: [OLD_CMD = ls_command (CMD) Set or return the shell command used by Octave's `ls' command. The value of CMD must be a character string. With no arguments, simply return the previous value. *See also:* *note ls: doc-ls. -- Function File: dir (DIRECTORY) -- Function File: [LIST] = dir (DIRECTORY) Display file listing for directory DIRECTORY. If a return value is requested, return a structure array with the fields name bytes date isdir statinfo in which `statinfo' is the structure returned from `stat'. If DIRECTORY is not a directory, return information about the named FILENAME. DIRECTORY may be a list of directories specified either by name or with wildcard characters (like * and ?) which will be expanded with glob. Note that for symbolic links, `dir' returns information about the file that a symbolic link points to instead of the link itself. However, if the link points to a nonexistent file, `dir' returns information about the link. *See also:* *note ls: doc-ls, *note stat: doc-stat, *note lstat: doc-lstat, *note readdir: doc-readdir, *note glob: doc-glob, *note filesep: doc-filesep. -- Built-in Function: pwd () Return the current working directory. *See also:* *note dir: doc-dir, *note ls: doc-ls.  File: octave.info, Node: Password Database Functions, Next: Group Database Functions, Prev: Current Working Directory, Up: System Utilities 34.9 Password Database Functions ================================ Octave's password database functions return information in a structure with the following fields. `name' The user name. `passwd' The encrypted password, if available. `uid' The numeric user id. `gid' The numeric group id. `gecos' The GECOS field. `dir' The home directory. `shell' The initial shell. In the descriptions of the following functions, this data structure is referred to as a PW_STRUCT. -- Loadable Function: PW_STRUCT = getpwent () Return a structure containing an entry from the password database, opening it if necessary. Once the end of the data has been reached, `getpwent' returns 0. -- Loadable Function: PW_STRUCT = getpwuid (UID). Return a structure containing the first entry from the password database with the user ID UID. If the user ID does not exist in the database, `getpwuid' returns 0. -- Loadable Function: PW_STRUCT = getpwnam (NAME) Return a structure containing the first entry from the password database with the user name NAME. If the user name does not exist in the database, `getpwname' returns 0. -- Loadable Function: setpwent () Return the internal pointer to the beginning of the password database. -- Loadable Function: endpwent () Close the password database.  File: octave.info, Node: Group Database Functions, Next: System Information, Prev: Password Database Functions, Up: System Utilities 34.10 Group Database Functions ============================== Octave's group database functions return information in a structure with the following fields. `name' The user name. `passwd' The encrypted password, if available. `gid' The numeric group id. `mem' The members of the group. In the descriptions of the following functions, this data structure is referred to as a GRP_STRUCT. -- Loadable Function: GRP_STRUCT = getgrent () Return an entry from the group database, opening it if necessary. Once the end of the data has been reached, `getgrent' returns 0. -- Loadable Function: GRP_STRUCT = getgrgid (GID). Return the first entry from the group database with the group ID GID. If the group ID does not exist in the database, `getgrgid' returns 0. -- Loadable Function: GRP_STRUCT = getgrnam (NAME) Return the first entry from the group database with the group name NAME. If the group name does not exist in the database, `getgrnam' returns 0. -- Loadable Function: setgrent () Return the internal pointer to the beginning of the group database. -- Loadable Function: endgrent () Close the group database.  File: octave.info, Node: System Information, Next: Hashing Functions, Prev: Group Database Functions, Up: System Utilities 34.11 System Information ======================== -- Function File: [C, MAXSIZE, ENDIAN] = computer () Print or return a string of the form CPU-VENDOR-OS that identifies the kind of computer Octave is running on. If invoked with an output argument, the value is returned instead of printed. For example, computer () -| i586-pc-linux-gnu x = computer () => x = "i586-pc-linux-gnu" If two output arguments are requested, also return the maximum number of elements for an array. If three output arguments are requested, also return the byte order of the current system as a character (`"B"' for big-endian or `"L"' for little-endian). -- Built-in Function: [UTS, ERR, MSG] = uname () Return system information in the structure. For example, uname () => { sysname = x86_64 nodename = segfault release = 2.6.15-1-amd64-k8-smp version = Linux machine = #2 SMP Thu Feb 23 04:57:49 UTC 2006 } If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. -- Function File: ispc () Return 1 if Octave is running on a Windows system and 0 otherwise. *See also:* *note ismac: doc-ismac, *note isunix: doc-isunix. -- Function File: isunix () Return 1 if Octave is running on a Unix-like system and 0 otherwise. *See also:* *note ismac: doc-ismac, *note ispc: doc-ispc. -- Function File: ismac () Return 1 if Octave is running on a Mac OS X system and 0 otherwise. *See also:* *note ispc: doc-ispc, *note isunix: doc-isunix. -- Built-in Function: isieee () Return 1 if your computer claims to conform to the IEEE standard for floating point calculations. -- Built-in Function: OCTAVE_HOME () Return the name of the top-level Octave installation directory. -- Built-in Function: OCTAVE_VERSION () Return the version number of Octave, as a string. -- Function File: license Display the license of Octave. -- Function File: license ("inuse") Display a list of packages currently being used. -- Function File: RETVAL = license ("inuse") Return a structure containing the fields `feature' and `user'. -- Function File: RETVAL = license ("test", FEATURE) Return 1 if a license exists for the product identified by the string FEATURE and 0 otherwise. The argument FEATURE is case insensitive and only the first 27 characters are checked. -- Function File: license ("test", FEATURE, TOGGLE) Enable or disable license testing for FEATURE, depending on TOGGLE, which may be one of: `"enable"' Future tests for the specified license of FEATURE are conducted as usual. `"disable"' Future tests for the specified license of FEATURE return 0. -- Function File: RETVAL = license ("checkout", FEATURE) Check out a license for FEATURE, returning 1 on success and 0 on failure. This function is provided for compatibility with MATLAB. *See also:* *note ver: doc-ver, *note version: doc-version. -- Function File: version () Return Octave's version number as a string. This is also the value of the built-in variable `OCTAVE_VERSION'. -- Function File: ver () Display a header containing the current Octave version number, license string and operating system, followed by the installed package names, versions, and installation directories. -- Function File: v = ver () Return a vector of structures, respecting Octave and each installed package. The structure includes the following fields. `Name' Package name. `Version' Version of the package. `Revision' Revision of the package. `Date' Date respecting the version/revision. -- Function File: v = ver (`"Octave"') Return version information for Octave only.. -- Function File: v = ver (PKG) Return version information for the specified package PKG. *See also:* *note license: doc-license, *note version: doc-version. -- Built-in Function: octave_config_info (OPTION) Return a structure containing configuration and installation information for Octave. if OPTION is a string, return the configuration information for the specified option. -- Loadable Function: getrusage () Return a structure containing a number of statistics about the current Octave process. Not all fields are available on all systems. If it is not possible to get CPU time statistics, the CPU time slots are set to zero. Other missing data are replaced by NaN. Here is a list of all the possible fields that can be present in the structure returned by `getrusage': `idrss' Unshared data size. `inblock' Number of block input operations. `isrss' Unshared stack size. `ixrss' Shared memory size. `majflt' Number of major page faults. `maxrss' Maximum data size. `minflt' Number of minor page faults. `msgrcv' Number of messages received. `msgsnd' Number of messages sent. `nivcsw' Number of involuntary context switches. `nsignals' Number of signals received. `nswap' Number of swaps. `nvcsw' Number of voluntary context switches. `oublock' Number of block output operations. `stime' A structure containing the system CPU time used. The structure has the elements `sec' (seconds) `usec' (microseconds). `utime' A structure containing the user CPU time used. The structure has the elements `sec' (seconds) `usec' (microseconds).  File: octave.info, Node: Hashing Functions, Prev: System Information, Up: System Utilities 34.12 Hashing Functions ======================= It is often necessary to find if two strings or files are identical. This might be done by comparing them character by character and looking for differences. However, this can be slow, and so comparing a hash of the string or file can be a rapid way of finding if the files differ. Another use of the hashing function is to check for file integrity. The user can check the hash of the file against a known value and find if the file they have is the same as the one that the original hash was produced with. Octave supplies the `md5sum' function to perform MD5 hashes on strings and files. An example of the use of `md5sum' function might be if exist (file, "file") hash = md5sum (file); else # Treat the variable "file" as a string hash = md5sum (file, true); endif -- Loadable Function: md5sum (FILE) -- Loadable Function: md5sum (STR, OPT) Calculates the MD5 sum of the file FILE. If the second parameter OPT exists and is true, then calculate the MD5 sum of the string STR.  File: octave.info, Node: Packages, Next: Dynamically Linked Functions, Prev: System Utilities, Up: Top 35 Packages *********** Since Octave is Free Software users are encouraged to share their programs amongst each other. To aid this sharing Octave supports the installation of extra packages. The `Octave-Forge' project is a community-maintained set of packages that can be downloaded and installed in Octave. At the time of writing the `Octave-Forge' project can be found on-line at `http://octave.sourceforge.net', but since the Internet is an ever-changing place this may not be true at the time of reading. Therefore it is recommended to see the Octave website for an updated reference. * Menu: * Installing and Removing Packages:: * Using Packages:: * Administrating Packages:: * Creating Packages::  File: octave.info, Node: Installing and Removing Packages, Next: Using Packages, Up: Packages 35.1 Installing and Removing Packages ===================================== Assuming a package is available in the file `image-1.0.0.tar.gz' it can be installed from the Octave prompt with the command pkg install image-1.0.0.tar.gz If the package is installed successfully nothing will be printed on the prompt, but if an error occurred during installation it will be reported. It is possible to install several packages at once by writing several package files after the `pkg install' command. If a different version of the package is already installed it will be removed prior to installing the new package. This makes it easy to upgrade and downgrade the version of a package, but makes it impossible to have several versions of the same package installed at once. To see which packages are installed type pkg list -| Package Name | Version | Installation directory -| --------------+---------+----------------------- -| image *| 1.0.0 | /home/jwe/octave/image-1.0.0 In this case only version 1.0.0 of the `image' package is installed. The '*' character next to the package name shows that the image package is loaded and ready for use. It is possible to remove a package from the system using the `pkg uninstall' command like this pkg uninstall image If the package is removed successfully nothing will be printed in the prompt, but if an error occurred it will be reported. It should be noted that the package file used for installation is not needed for removal, and that only the package name as reported by `pkg list' should be used when removing a package. It is possible to remove several packages at once by writing several package names after the `pkg uninstall' command. To minimize the amount of code duplication between packages it is possible that one package depends on another one. If a package depends on another, it will check if that package is installed during installation. If it is not, an error will be reported and the package will not be installed. This behavior can be disabled by passing the `-nodeps' flag to the `pkg install' command pkg install -nodeps my_package_with_dependencies.tar.gz Since the installed package expects its dependencies to be installed it may not function correctly. Because of this it is not recommended to disable dependency checking. -- Command: pkg COMMAND PKG_NAME -- Command: pkg COMMAND OPTION PKG_NAME This command interacts with the package manager. Different actions will be taken depending on the value of COMMAND. `install' Install named packages. For example, pkg install image-1.0.0.tar.gz installs the package found in the file `image-1.0.0.tar.gz'. The OPTION variable can contain options that affect the manner in which a package is installed. These options can be one or more of `-nodeps' The package manager will disable the dependency checking. That way it is possible to install a package even if it depends on another package that's not installed on the system. *Use this option with care.* `-noauto' The package manager will not automatically load the installed package when starting Octave, even if the package requests that it is. `-auto' The package manager will automatically load the installed package when starting Octave, even if the package requests that it isn't. `-local' A local installation is forced, even if the user has system privileges. `-global' A global installation is forced, even if the user doesn't normally have system privileges `-verbose' The package manager will print the output of all of the commands that are performed. `uninstall' Uninstall named packages. For example, pkg uninstall image removes the `image' package from the system. If another installed package depends on the `image' package an error will be issued. The package can be uninstalled anyway by using the `-nodeps' option. `load' Add named packages to the path. After loading a package it is possible to use the functions provided by the package. For example, pkg load image adds the `image' package to the path. It is possible to load all installed packages at once with the command pkg load all `unload' Removes named packages from the path. After unloading a package it is no longer possible to use the functions provided by the package. This command behaves like the `load' command. `list' Show a list of the currently installed packages. By requesting one or two output argument it is possible to get a list of the currently installed packages. For example, installed_packages = pkg list; returns a cell array containing a structure for each installed package. The command [USER_PACKAGES, SYSTEM_PACKAGES] = pkg list splits the list of installed packages into those who are installed by the current user, and those installed by the system administrator. `describe' Show a short description of the named installed packages, with the option '-verbose' also list functions provided by the package, e.g.: pkg describe -verbose all will describe all installed packages and the functions they provide. If one output is requested a cell of structure containing the description and list of functions of each package is returned as output rather than printed on screen: desc = pkg ("describe", "secs1d", "image") If any of the requested packages is not installed, pkg returns an error, unless a second output is requested: [ desc, flag] = pkg ("describe", "secs1d", "image") FLAG will take one of the values "Not installed", "Loaded" or "Not loaded" for each of the named packages. `prefix' Set the installation prefix directory. For example, pkg prefix ~/my_octave_packages sets the installation prefix to `~/my_octave_packages'. Packages will be installed in this directory. It is possible to get the current installation prefix by requesting an output argument. For example, p = pkg prefix The location in which to install the architecture dependent files can be independent specified with an addition argument. For example pkg prefix ~/my_octave_packages ~/my_arch_dep_pkgs `local_list' Set the file in which to look for information on the locally installed packages. Locally installed packages are those that are typically available only to the current user. For example pkg local_list ~/.octave_packages It is possible to get the current value of local_list with the following pkg local_list `global_list' Set the file in which to look for, for information on the globally installed packages. Globally installed packages are those that are typically available to all users. For example pkg global_list /usr/share/octave/octave_packages It is possible to get the current value of global_list with the following pkg global_list `rebuild' Rebuilds the package database from the installed directories. This can be used in cases where for some reason the package database is corrupted. It can also take the `-auto' and `-noauto' options to allow the autoloading state of a package to be changed. For example pkg rebuild -noauto image will remove the autoloading status of the image package. `build' Builds a binary form of a package or packages. The binary file produced will itself be an Octave package that can be installed normally with `pkg'. The form of the command to build a binary package is pkg build builddir image-1.0.0.tar.gz ... where `builddir' is the name of a directory where the temporary installation will be produced and the binary packages will be found. The options `-verbose' and `-nodeps' are respected, while the other options are ignored.  File: octave.info, Node: Using Packages, Next: Administrating Packages, Prev: Installing and Removing Packages, Up: Packages 35.2 Using Packages =================== By default installed packages are available from the Octave prompt, but it is possible to control this using the `pkg load' and `pkg unload' commands. The functions from a package can be removed from the Octave path by typing pkg unload package_name where `package_name' is the name of the package to be removed from the path. In much the same way a package can be added to the Octave path by typing pkg load package_name  File: octave.info, Node: Administrating Packages, Next: Creating Packages, Prev: Using Packages, Up: Packages 35.3 Administrating Packages ============================ On UNIX-like systems it is possible to make both per-user and system-wide installations of a package. If the user performing the installation is `root' the packages will be installed in a system-wide directory that defaults to `OCTAVE_HOME/share/octave/packages/'. If the user is not `root' the default installation directory is `~/octave/'. Packages will be installed in a subdirectory of the installation directory that will be named after the package. It is possible to change the installation directory by using the `pkg prefix' command pkg prefix new_installation_directory The current installation directory can be retrieved by typing current_installation_directory = pkg prefix To function properly the package manager needs to keep some information about the installed packages. For per-user packages this information is by default stored in the file `~/.octave_packages' and for system-wide installations it is stored in `OCTAVE_HOME/share/octave/octave_packages'. The path to the per-user file can be changed with the `pkg local_list' command pkg local_list /path/to/new_file For system-wide installations this can be changed in the same way using the `pkg global_list' command. If these commands are called without a new path, the current path will be returned.  File: octave.info, Node: Creating Packages, Prev: Administrating Packages, Up: Packages 35.4 Creating Packages ====================== Internally a package is simply a gzipped tar file that contains a top level directory of any given name. This directory will in the following be referred to as `package' and may contain the following files `package/DESCRIPTION' This is a required file containing information about the package. *Note The DESCRIPTION File::, for details on this file. `package/COPYING' This is a required file containing the license of the package. No restrictions is made on the license in general. If however the package contains dynamically linked functions the license must be compatible with the GNU General Public License. `package/INDEX' This is an optional file describing the functions provided by the package. If this file is not given then one with be created automatically from the functions in the package and the `Categories' keyword in the `DESCRIPTION' file. *Note The INDEX file::, for details on this file. `package/PKG_ADD' An optional file that includes commands that are run when the package is added to the users path. Note that `PKG_ADD' directives in the source code of the package will also be added to this file by the Octave package manager. Note that symbolic links are to be avoided in packages, as symbolic links do not exist on some file systems, and so a typical use for this file is the replacement of the symbolic link ln -s foo.oct bar.oct with an autoload directive like autoload ('bar', which ('foo')); *Note PKG_ADD and PKG_DEL directives::, for details on `PKG_ADD' directives. `package/PKG_DEL' An optional file that includes commands that are run when the package is removed from the users path. Note that `PKG_DEL' directives in the source code of the package will also be added to this file by the Octave package manager. *Note PKG_ADD and PKG_DEL directives::, for details on `PKG_DEL' directives. `package/pre_install.m' This is an optional script that is run prior to the installation of a package. `package/post_install.m' This is an optional script that is run after the installation of a package. `package/on_uninstall.m' This is an optional script that is run prior to the removal of a package. Besides the above mentioned files, a package can also contain on or more of the following directories `package/inst' An optional directory containing any files that are directly installed by the package. Typically this will include any `m'-files. `package/src' An optional directory containing code that must be built prior to the packages installation. The Octave package manager will execute `./configure' in this directory if this script exists, and will then call `make' if a file `Makefile' exists in this directory. `make install' will however not be called. If a file called `FILES' exist all files listed there will be copied to the `inst' directory, so they also will be installed. If the `FILES' file doesn't exist, `src/*.m' and `src/*.oct' will be copied to the `inst' directory. `package/doc' An optional directory containing documentation for the package. The files in this directory will be directly installed in a sub-directory of the installed package for future reference. `package/bin' An optional directory containing files that will be added to the Octave `EXEC_PATH' when the package is loaded. This might contain external scripts, etc., called by functions within the package. * Menu: * The DESCRIPTION File:: * The INDEX file:: * PKG_ADD and PKG_DEL directives::  File: octave.info, Node: The DESCRIPTION File, Next: The INDEX file, Up: Creating Packages 35.4.1 The DESCRIPTION File --------------------------- The `DESCRIPTION' file contains various information about the package, such as its name, author, and version. This file has a very simple format * Lines starting with `#' are comments. * Lines starting with a blank character are continuations from the previous line. * Everything else is of the form `NameOfOption: ValueOfOption'. The following is a simple example of a `DESCRIPTION' file Name: The name of my package Version: 1.0.0 Date: 2007-18-04 Author: The name (and possibly email) of the package author. Maintainer: The name (and possibly email) of the current package maintainer. Title: The title of the package Description: A short description of the package. If this description gets too long for one line it can continue on the next by adding a space to the beginning of the following lines. License: GPL version 3 or later The package manager currently recognizes the following keywords `Name' Name of the package. `Version' Version of the package. `Date' Date of last update. `Author' Original author of the package. `Maintainer' Maintainer of the package. `Title' A one line description of the package. `Description' A one paragraph description of the package. `Categories' Optional keyword describing the package (if no `INDEX' file is given this is mandatory). `Problems' Optional list of known problems. `Url' Optional list of homepages related to the package. `Autoload' Optional field that sets the default loading behavior for the package. If set to `yes', `true' or `on', then Octave will automatically load the package when starting. Otherwise the package must be manually loaded with the pkg load command. This default behavior can be overridden when the package is installed. `Depends' A list of other Octave packages that this package depends on. This can include dependencies on particular versions, with a format Depends: package (>= 1.0.0) Possible operators are `<', `<=', `==', `>=' or `>'. If the part of the dependency in `()' is missing, any version of the package is acceptable. Multiple dependencies can be defined either as a comma separated list or on separate `Depends' lines. `License' An optional short description of the used license (e.g., GPL version 3 or newer). This is optional since the file `COPYING' is mandatory. `SystemRequirements' These are the external install dependencies of the package and are not checked by the package manager. This is here as a hint to the distribution packager. They follow the same conventions as the `Depends' keyword. `BuildRequires' These are the external build dependencies of the package and are not checked by the package manager. This is here as a hint to the distribution packager. They follow the same conventions as the `Depends' keyword. Note that in general, packaging systems such as `rpm' or `deb' and autoprobe the install dependencies from the build dependencies, and therefore the often a `BuildRequires' dependency removes the need for a `SystemRequirements' dependency. The developer is free to add additional arguments to the `DESCRIPTION' file for their own purposes. One further detail to aid the packager is that the `SystemRequirements' and `BuildRequires' keywords can have a distribution dependent section, and the automatic build process will use these. An example of the format of this is BuildRequires: libtermcap-devel [Mandriva] libtermcap2-devel where the first package name will be used as a default and if the RPMs are built on a Mandriva distribution, then the second package name will be used instead.  File: octave.info, Node: The INDEX file, Next: PKG_ADD and PKG_DEL directives, Prev: The DESCRIPTION File, Up: Creating Packages 35.4.2 The INDEX file --------------------- The optional `INDEX' file provides a categorical view of the functions in the package. This file has a very simple format * Lines beginning with `#' are comments. * The first non-comment line should look like this toolbox >> Toolbox name * Lines beginning with an alphabetical character indicates a new category of functions. * Lines starting with a white space character indicate that the function names on the line belong to the last mentioned category. The format can be summarized with the following example # A comment toolbox >> Toolbox name Category Name 1 function1 function2 function3 function4 Category Name 2 function2 function5 If you wish to refer to a function that users might expect to find in your package but is not there, providing a work around or pointing out that the function is available elsewhere, you can use: fn = workaround description This workaround description will not appear when listing functions in the package with `pkg describe' but they will be published in the html documentation online. Workaround descriptions can use any html markup, but keep in mind that it will be enclosed in a bold-italic environment. For the special case of: fn = use alternate expression the bold-italic is automatically suppressed. You will need to use `' even in references: fn = use fn Sometimes functions are only partially compatible, in which case you can list the non-compatible cases separately. To refer to another function in the package, use `fn'. For example, eig (a, b) = use qz Since sites may have many missing functions, you can define a macro rather than typing the same link over and again. $id = expansion defines the macro id. You can use `$id' anywhere in the description and it will be expanded. For example, $TSA = see SPC Tools arcov = $TSA armcv id is any string of letters, numbers and `_'.  File: octave.info, Node: PKG_ADD and PKG_DEL directives, Prev: The INDEX file, Up: Creating Packages 35.4.3 PKG_ADD and PKG_DEL directives ------------------------------------- If the package contains files called `PKG_ADD' or `PKG_DEL' the commands in these files will be executed when the package is added or removed from the users path. In some situations such files are a bit cumbersome to maintain, so the package manager supports automatic creation of such files. If a source file in the package contains a `PKG_ADD' or `PKG_DEL' directive they will be added to either the `PKG_ADD' or `PKG_DEL' files. In `m'-files a `PKG_ADD' directive looks like this ## PKG_ADD: some_octave_command Such lines should be added before the `function' keyword. In C++ files a `PKG_ADD' directive looks like this // PKG_ADD: some_octave_command In both cases `some_octave_command' should be replaced by the command that should be placed in the `PKG_ADD' file. `PKG_DEL' directives work in the same way, except the `PKG_ADD' keyword is replaced with `PKG_DEL' and the commands get added to the `PKG_DEL' file.  File: octave.info, Node: Dynamically Linked Functions, Next: Test and Demo Functions, Prev: Packages, Up: Top Appendix A Dynamically Linked Functions *************************************** Octave has the possibility of including compiled code as dynamically linked extensions and then using these extensions as if they were part of Octave itself. Octave can call C++ code through its native oct-file interface or C code through its mex interface. It can also indirectly call functions written in any other language through a simple wrapper. The reasons to write code in a compiled language might be either to link to an existing piece of code and allow it to be used within Octave, or to allow improved performance for key pieces of code. Before going further, you should first determine if you really need to use dynamically linked functions at all. Before proceeding with writing any dynamically linked function to improve performance you should address ask yourself * Can I get the same functionality using the Octave scripting language only? * Is it thoroughly optimized Octave code? Vectorization of Octave code, doesn't just make it concise, it generally significantly improves its performance. Above all, if loops must be used, make sure that the allocation of space for variables takes place outside the loops using an assignment to a matrix of the right size, or zeros. * Does it make as much use as possible of existing built-in library routines? These are highly optimized and many do not carry the overhead of being interpreted. * Does writing a dynamically linked function represent useful investment of your time, relative to staying in Octave? Also, as oct- and mex-files are dynamically linked to Octave, they introduce the possibility of Octave crashing due to errors in the user code. For example a segmentation violation in the user's code will cause Octave to abort. * Menu: * Oct-Files:: * Mex-Files:: * Standalone Programs::  File: octave.info, Node: Oct-Files, Next: Mex-Files, Up: Dynamically Linked Functions A.1 Oct-Files ============= * Menu: * Getting Started with Oct-Files:: * Matrices and Arrays in Oct-Files:: * Character Strings in Oct-Files:: * Cell Arrays in Oct-Files:: * Structures in Oct-Files:: * Sparse Matrices in Oct-Files:: * Accessing Global Variables in Oct-Files:: * Calling Octave Functions from Oct-Files:: * Calling External Code from Oct-Files:: * Allocating Local Memory in Oct-Files:: * Input Parameter Checking in Oct-Files:: * Exception and Error Handling in Oct-Files:: * Documentation and Test of Oct-Files::  File: octave.info, Node: Getting Started with Oct-Files, Next: Matrices and Arrays in Oct-Files, Up: Oct-Files A.1.1 Getting Started with Oct-Files ------------------------------------ The basic command to build oct-files is `mkoctfile' and it can be call from within octave or from the command line. -- Function File: mkoctfile [-options] file ... The `mkoctfile' function compiles source code written in C, C++, or Fortran. Depending on the options used with `mkoctfile', the compiled code can be called within Octave or can be used as a stand-alone application. `mkoctfile' can be called from the shell prompt or from the Octave prompt. `mkoctfile' accepts the following options, all of which are optional except for the file name of the code you wish to compile: `-I DIR' Add the include directory DIR to compile commands. `-D DEF' Add the definition DEF to the compiler call. `-l LIB' Add the library LIB to the link command. `-L DIR' Add the library directory DIR to the link command. `-M' `--depend' Generate dependency files (.d) for C and C++ source files. `-c' Compile but do not link. `-g' Enable debugging options for compilers. `-o FILE' `--output FILE' Output file name. Default extension is .oct (or .mex if -mex is specified) unless linking a stand-alone executable. `-p VAR' `--print VAR' Print the configuration variable VAR. Recognized variables are: ALL_CFLAGS FFTW_LIBS ALL_CXXFLAGS FLIBS ALL_FFLAGS FPICFLAG ALL_LDFLAGS INCFLAGS BLAS_LIBS LDFLAGS CC LD_CXX CFLAGS LD_STATIC_FLAG CPICFLAG LFLAGS CPPFLAGS LIBCRUFT CXX LIBOCTAVE CXXFLAGS LIBOCTINTERP CXXPICFLAG LIBREADLINE DEPEND_EXTRA_SED_PATTERN LIBS DEPEND_FLAGS OCTAVE_LIBS DL_LD RDYNAMIC_FLAG DL_LDFLAGS RLD_FLAG F2C SED F2CFLAGS XTRA_CFLAGS F77 XTRA_CXXFLAGS FFLAGS `--link-stand-alone' Link a stand-alone executable file. `--mex' Assume we are creating a MEX file. Set the default output extension to ".mex". `-s' `--strip' Strip the output file. `-v' `--verbose' Echo commands as they are executed. `file' The file to compile or link. Recognized file types are .c C source .cc C++ source .C C++ source .cpp C++ source .f Fortran source .F Fortran source .o object file Consider the short example #include DEFUN_DLD (helloworld, args, nargout, "Hello World Help String") { int nargin = args.length (); octave_stdout << "Hello World has " << nargin << " input arguments and " << nargout << " output arguments.\n"; return octave_value_list (); } This example although short introduces the basics of writing a C++ function that can be dynamically linked to Octave. The easiest way to make available most of the definitions that might be necessary for an oct-file in Octave is to use the `#include ' header. The macro that defines the entry point into the dynamically loaded function is `DEFUN_DLD'. This macro takes four arguments, these being 1. The function name as it will be seen in Octave, 2. The list of arguments to the function of type `octave_value_list', 3. The number of output arguments, which can and often is omitted if not used, and 4. The string that will be seen as the help text of the function. The return type of functions defined with `DEFUN_DLD' is always `octave_value_list'. There are a couple of important considerations in the choice of function name. Firstly, it must be a valid Octave function name and so must be a sequence of letters, digits and underscores, not starting with a digit. Secondly, as Octave uses the function name to define the filename it attempts to find the function in, the function name in the `DEFUN_DLD' macro must match the filename of the oct-file. Therefore, the above function should be in a file `helloworld.cc', and it should be compiled to an oct-file using the command mkoctfile helloworld.cc This will create a file called `helloworld.oct', that is the compiled version of the function. It should be noted that it is perfectly acceptable to have more than one `DEFUN_DLD' function in a source file. However, there must either be a symbolic link to the oct-file for each of the functions defined in the source code with the `DEFUN_DLD' macro or the autoload (*note Function Files::) function should be used. The rest of this function then shows how to find the number of input arguments, how to print through the octave pager, and return from the function. After compiling this function as above, an example of its use is helloworld (1, 2, 3) -| Hello World has 3 input arguments and 0 output arguments.  File: octave.info, Node: Matrices and Arrays in Oct-Files, Next: Character Strings in Oct-Files, Prev: Getting Started with Oct-Files, Up: Oct-Files A.1.2 Matrices and Arrays in Oct-Files -------------------------------------- Octave supports a number of different array and matrix classes, the majority of which are based on the Array class. The exception is the sparse matrix types discussed separately below. There are three basic matrix types `Matrix' A double precision matrix class defined in dMatrix.h, `ComplexMatrix' A complex matrix class defined in CMatrix.h, and `BoolMatrix' A boolean matrix class defined in boolMatrix.h. These are the basic two-dimensional matrix types of octave. In additional there are a number of multi-dimensional array types, these being `NDArray' A double precision array class defined in `dNDArray.h' `ComplexNDarray' A complex array class defined in `CNDArray.h' `boolNDArray' A boolean array class defined in `boolNDArray.h' `int8NDArray' `int16NDArray' `int32NDArray' `int64NDArray' 8, 16, 32 and 64-bit signed array classes defined in `int8NDArray.h', `int16NDArray.h', etc. `uint8NDArray' `uint16NDArray' `uint32NDArray' `uint64NDArray' 8, 16, 32 and 64-bit unsigned array classes defined in `uint8NDArray.h', `uint16NDArray.h', etc. There are several basic means of constructing matrices of multi-dimensional arrays. Considering the `Matrix' type as an example * We can create an empty matrix or array with the empty constructor. For example Matrix a; This can be used on all matrix and array types * Define the dimensions of the matrix or array with a dim_vector. For example dim_vector dv (2); dv(0) = 2; dv(1) = 2; Matrix a (dv); This can be used on all matrix and array types * Define the number of rows and columns in the matrix. For example Matrix a (2, 2) However, this constructor can only be used with the matrix types. These types all share a number of basic methods and operators, a selection of which include -- Method: T& operator () (octave_idx_type) -- Method: T& elem (octave_idx_type) The `()' operator or `elem' method allow the values of the matrix or array to be read or set. These can take a single argument, which is of type `octave_idx_type', that is the index into the matrix or array. Additionally, the matrix type allows two argument versions of the `()' operator and elem method, giving the row and column index of the value to obtain or set. Note that these functions do significant error checking and so in some circumstances the user might prefer to access the data of the array or matrix directly through the fortran_vec method discussed below. -- Method: octave_idx_type nelem (void) const The total number of elements in the matrix or array. -- Method: size_t byte_size (void) const The number of bytes used to store the matrix or array. -- Method: dim_vector dims (void) const The dimensions of the matrix or array in value of type dim_vector. -- Method: void resize (const dim_vector&) A method taking either an argument of type `dim_vector', or in the case of a matrix two arguments of type `octave_idx_type' defining the number of rows and columns in the matrix. -- Method: T* fortran_vec (void) This method returns a pointer to the underlying data of the matrix or a array so that it can be manipulated directly, either within Octave or by an external library. Operators such an `+', `-', or `*' can be used on the majority of the above types. In addition there are a number of methods that are of interest only for matrices such as `transpose', `hermitian', `solve', etc. The typical way to extract a matrix or array from the input arguments of `DEFUN_DLD' function is as follows #include DEFUN_DLD (addtwomatrices, args, , "Add A to B") { int nargin = args.length (); if (nargin != 2) print_usage (); else { NDArray A = args(0).array_value (); NDArray B = args(1).array_value (); if (! error_state) return octave_value (A + B); } return octave_value_list (); } To avoid segmentation faults causing Octave to abort, this function explicitly checks that there are sufficient arguments available before accessing these arguments. It then obtains two multi-dimensional arrays of type `NDArray' and adds these together. Note that the array_value method is called without using the `is_matrix_type' type, and instead the error_state is checked before returning `A + B'. The reason to prefer this is that the arguments might be a type that is not an `NDArray', but it would make sense to convert it to one. The `array_value' method allows this conversion to be performed transparently if possible, and sets `error_state' if it is not. `A + B', operating on two `NDArray''s returns an `NDArray', which is cast to an `octave_value' on the return from the function. An example of the use of this demonstration function is addtwomatrices (ones (2, 2), ones (2, 2)) => 2 2 2 2 A list of the basic `Matrix' and `Array' types, the methods to extract these from an `octave_value' and the associated header is listed below. `RowVector' `row_vector_value' `dRowVector.h' `ComplexRowVector' `complex_row_vector_value' `CRowVector.h' `ColumnVector' `column_vector_value' `dColVector.h' `ComplexColumnVector' `complex_column_vector_value' `CColVector.h' `Matrix' `matrix_value' `dMatrix.h' `ComplexMatrix' `complex_matrix_value' `CMatrix.h' `boolMatrix' `bool_matrix_value' `boolMatrix.h' `charMatrix' `char_matrix_value' `chMatrix.h' `NDArray' `array_value' `dNDArray.h' `ComplexNDArray' `complex_array_value' `CNDArray.h' `boolNDArray' `bool_array_value' `boolNDArray.h' `charNDArray' `char_array_value' `charNDArray.h' `int8NDArray' `int8_array_value' `int8NDArray.h' `int16NDArray' `int16_array_value' `int16NDArray.h' `int32NDArray' `int32_array_value' `int32NDArray.h' `int64NDArray' `int64_array_value' `int64NDArray.h' `uint8NDArray' `uint8_array_value' `uint8NDArray.h' `uint16NDArray' `uint16_array_value' `uint16NDArray.h' `uint32NDArray' `uint32_array_value' `uint32NDArray.h' `uint64NDArray' `uint64_array_value' `uint64NDArray.h'  File: octave.info, Node: Character Strings in Oct-Files, Next: Cell Arrays in Oct-Files, Prev: Matrices and Arrays in Oct-Files, Up: Oct-Files A.1.3 Character Strings in Oct-Files ------------------------------------ In Octave a character string is just a special `Array' class. Consider the example #include DEFUN_DLD (stringdemo, args, , "String Demo") { int nargin = args.length(); octave_value_list retval; if (nargin != 1) print_usage (); else { charMatrix ch = args(0).char_matrix_value (); if (! error_state) { if (args(0).is_sq_string ()) retval(1) = octave_value (ch, true); else retval(1) = octave_value (ch, true, '\''); octave_idx_type nr = ch.rows(); for (octave_idx_type i = 0; i < nr / 2; i++) { std::string tmp = ch.row_as_string (i); ch.insert (ch.row_as_string(nr-i-1).c_str(), i, 0); ch.insert (tmp.c_str(), nr-i-1, 0); } retval(0) = octave_value (ch, true); } } return retval; } An example of the use of this function is s0 = ["First String"; "Second String"]; [s1,s2] = stringdemo (s0) => s1 = Second String First String => s2 = First String Second String typeinfo (s2) => sq_string typeinfo (s1) => string One additional complication of strings in Octave is the difference between single quoted and double quoted strings. To find out if an `octave_value' contains a single or double quoted string an example is if (args(0).is_sq_string ()) octave_stdout << "First argument is a singularly quoted string\n"; else if (args(0).is_dq_string ()) octave_stdout << "First argument is a doubly quoted string\n"; Note however, that both types of strings are represented by the `charNDArray' type, and so when assigning to an `octave_value', the type of string should be specified. For example octave_value_list retval; charNDArray c; ... // Create single quoted string retval(1) = octave_value (ch, true, '\''); // Create a double quoted string retval(0) = octave_value (ch, true);  File: octave.info, Node: Cell Arrays in Oct-Files, Next: Structures in Oct-Files, Prev: Character Strings in Oct-Files, Up: Oct-Files A.1.4 Cell Arrays in Oct-Files ------------------------------ Octave's cell type is equally accessible within oct-files. A cell array is just an array of `octave_value's, and so each element of the cell array can then be treated just like any other `octave_value'. A simple example is #include #include DEFUN_DLD (celldemo, args, , "Cell Demo") { octave_value_list retval; int nargin = args.length (); if (nargin != 1) print_usage (); else { Cell c = args (0).cell_value (); if (! error_state) for (octave_idx_type i = 0; i < c.nelem (); i++) retval(i) = c.elem (i); } return retval; } Note that cell arrays are used less often in standard oct-files and so the `Cell.h' header file must be explicitly included. The rest of this example extracts the `octave_value's one by one from the cell array and returns be as individual return arguments. For example consider [b1, b2, b3] = celldemo ({1, [1, 2], "test"}) => b1 = 1 b2 = 1 2 b3 = test  File: octave.info, Node: Structures in Oct-Files, Next: Sparse Matrices in Oct-Files, Prev: Cell Arrays in Oct-Files, Up: Oct-Files A.1.5 Structures in Oct-Files ----------------------------- A structure in Octave is map between a number of fields represented and their values. The Standard Template Library `map' class is used, with the pair consisting of a `std::string' and an octave `Cell' variable. A simple example demonstrating the use of structures within oct-files is #include #include DEFUN_DLD (structdemo, args, , "Struct demo.") { int nargin = args.length (); octave_value retval; if (nargin != 2) print_usage (); else { Octave_map arg0 = args(0).map_value (); std::string arg1 = args(1).string_value (); if (! error_state && arg0.contains (arg1)) { // The following two lines might be written as // octave_value tmp; // for (Octave_map::iterator p0 = // arg0.begin(); // p0 != arg0.end(); p0++ ) // if (arg0.key (p0) == arg1) // { // tmp = arg0.contents (p0) (0); // break; // } // though using seek is more concise. Octave_map::const_iterator p1 = arg0.seek (arg1); octave_value tmp = arg0.contents(p1)(0); Octave_map st; st.assign ("selected", tmp); retval = octave_value (st); } } return retval; } An example of its use is x.a = 1; x.b = "test"; x.c = [1, 2]; structdemo (x, "b") => selected = test The commented code above demonstrates how to iterate over all of the fields of the structure, where as the following code demonstrates finding a particular field in a more concise manner. As can be seen the `contents' method of the `Octave_map' class returns a `Cell' which allows structure arrays to be represented. Therefore, to obtain the underlying `octave_value' we write octave_value tmp = arg0.contents (p1) (0); where the trailing (0) is the () operator on the `Cell' object. We can equally iterate of the elements of the Cell array to address the elements of the structure array.  File: octave.info, Node: Sparse Matrices in Oct-Files, Next: Accessing Global Variables in Oct-Files, Prev: Structures in Oct-Files, Up: Oct-Files A.1.6 Sparse Matrices in Oct-Files ---------------------------------- There are three classes of sparse objects that are of interest to the user. `SparseMatrix' A double precision sparse matrix class `SparseComplexMatrix' A complex sparse matrix class `SparseBoolMatrix' A boolean sparse matrix class All of these classes inherit from the `Sparse' template class, and so all have similar capabilities and usage. The `Sparse' class was based on Octave `Array' class, and so users familiar with Octave's `Array' classes will be comfortable with the use of the sparse classes. The sparse classes will not be entirely described in this section, due to their similarity with the existing `Array' classes. However, there are a few differences due the different nature of sparse objects, and these will be described. Firstly, although it is fundamentally possible to have N-dimensional sparse objects, the Octave sparse classes do not allow them at this time. So all operations of the sparse classes must be 2-dimensional. This means that in fact `SparseMatrix' is similar to Octave's `Matrix' class rather than its `NDArray' class. * Menu: * Array and Sparse Differences:: * Creating Sparse Matrices in Oct-Files:: * Using Sparse Matrices in Oct-Files::  File: octave.info, Node: Array and Sparse Differences, Next: Creating Sparse Matrices in Oct-Files, Up: Sparse Matrices in Oct-Files A.1.6.1 The Differences between the Array and Sparse Classes ............................................................ The number of elements in a sparse matrix is considered to be the number of non-zero elements rather than the product of the dimensions. Therefore SparseMatrix sm; ... int nel = sm.nelem (); returns the number of non-zero elements. If the user really requires the number of elements in the matrix, including the non-zero elements, they should use `numel' rather than `nelem'. Note that for very large matrices, where the product of the two dimensions is larger than the representation of an unsigned int, then `numel' can overflow. An example is `speye(1e6)' which will create a matrix with a million rows and columns, but only a million non-zero elements. Therefore the number of rows by the number of columns in this case is more than two hundred times the maximum value that can be represented by an unsigned int. The use of `numel' should therefore be avoided useless it is known it won't overflow. Extreme care must be take with the elem method and the "()" operator, which perform basically the same function. The reason is that if a sparse object is non-const, then Octave will assume that a request for a zero element in a sparse matrix is in fact a request to create this element so it can be filled. Therefore a piece of code like SparseMatrix sm; ... for (int j = 0; j < nc; j++) for (int i = 0; i < nr; i++) std::cerr << " (" << i << "," << j << "): " << sm(i,j) << std::endl; is a great way of turning the sparse matrix into a dense one, and a very slow way at that since it reallocates the sparse object at each zero element in the matrix. An easy way of preventing the above from happening is to create a temporary constant version of the sparse matrix. Note that only the container for the sparse matrix will be copied, while the actual representation of the data will be shared between the two versions of the sparse matrix. So this is not a costly operation. For example, the above would become SparseMatrix sm; ... const SparseMatrix tmp (sm); for (int j = 0; j < nc; j++) for (int i = 0; i < nr; i++) std::cerr << " (" << i << "," << j << "): " << tmp(i,j) << std::endl; Finally, as the sparse types aren't just represented as a contiguous block of memory, the `fortran_vec' method of the `Array' is not available. It is however replaced by three separate methods `ridx', `cidx' and `data', that access the raw compressed column format that the Octave sparse matrices are stored in. Additionally, these methods can be used in a manner similar to `elem', to allow the matrix to be accessed or filled. However, in that case it is up to the user to respect the sparse matrix compressed column format discussed previous.  File: octave.info, Node: Creating Sparse Matrices in Oct-Files, Next: Using Sparse Matrices in Oct-Files, Prev: Array and Sparse Differences, Up: Sparse Matrices in Oct-Files A.1.6.2 Creating Sparse Matrices in Oct-Files ............................................. You have several alternatives for creating a sparse matrix. You can first create the data as three vectors representing the row and column indexes and the data, and from those create the matrix. Or alternatively, you can create a sparse matrix with the appropriate amount of space and then fill in the values. Both techniques have their advantages and disadvantages. Here is an example of how to create a small sparse matrix with the first technique int nz = 4, nr = 3, nc = 4; ColumnVector ridx (nz); ColumnVector cidx (nz); ColumnVector data (nz); ridx(0) = 0; ridx(1) = 0; ridx(2) = 1; ridx(3) = 2; cidx(0) = 0; cidx(1) = 1; cidx(2) = 3; cidx(3) = 3; data(0) = 1; data(1) = 2; data(2) = 3; data(3) = 4; SparseMatrix sm (data, ridx, cidx, nr, nc); which creates the matrix given in section *note Storage of Sparse Matrices::. Note that the compressed matrix format is not used at the time of the creation of the matrix itself, however it is used internally. As previously mentioned, the values of the sparse matrix are stored in increasing column-major ordering. Although the data passed by the user does not need to respect this requirement, the pre-sorting the data significantly speeds up the creation of the sparse matrix. The disadvantage of this technique of creating a sparse matrix is that there is a brief time where two copies of the data exists. Therefore for extremely memory constrained problems this might not be the right technique to create the sparse matrix. The alternative is to first create the sparse matrix with the desired number of non-zero elements and then later fill those elements in. The easiest way to do this is int nz = 4, nr = 3, nc = 4; SparseMatrix sm (nr, nc, nz); sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4; That creates the same matrix as previously. Again, although it is not strictly necessary, it is significantly faster if the sparse matrix is created in this manner that the elements are added in column-major ordering. The reason for this is that if the elements are inserted at the end of the current list of known elements then no element in the matrix needs to be moved to allow the new element to be inserted. Only the column indexes need to be updated. There are a few further points to note about this technique of creating a sparse matrix. Firstly, it is possible to create a sparse matrix with fewer elements than are actually inserted in the matrix. Therefore int nz = 4, nr = 3, nc = 4; SparseMatrix sm (nr, nc, 0); sm(0,0) = 1; sm(0,1) = 2; sm(1,3) = 3; sm(2,3) = 4; is perfectly valid. However it is a very bad idea. The reason is that as each new element is added to the sparse matrix the space allocated to it is increased by reallocating the memory. This is an expensive operation, that will significantly slow this means of creating a sparse matrix. Furthermore, it is possible to create a sparse matrix with too much storage, so having NZ above equaling 6 is also valid. The disadvantage is that the matrix occupies more memory than strictly needed. It is not always easy to know the number of non-zero elements prior to filling a matrix. For this reason the additional storage for the sparse matrix can be removed after its creation with the "maybe_compress" function. Furthermore, the maybe_compress can deallocate the unused storage, but it can equally remove zero elements from the matrix. The removal of zero elements from the matrix is controlled by setting the argument of the "maybe_compress" function to be `true'. However, the cost of removing the zeros is high because it implies resorting the elements. Therefore, if possible it is better is the user doesn't add the zeros in the first place. An example of the use of "maybe_compress" is int nz = 6, nr = 3, nc = 4; SparseMatrix sm1 (nr, nc, nz); sm1(0,0) = 1; sm1(0,1) = 2; sm1(1,3) = 3; sm1(2,3) = 4; sm1.maybe_compress (); // No zero elements were added SparseMatrix sm2 (nr, nc, nz); sm2(0,0) = 1; sm2(0,1) = 2; sm(0,2) = 0; sm(1,2) = 0; sm1(1,3) = 3; sm1(2,3) = 4; sm2.maybe_compress (true); // Zero elements were added The use of the "maybe_compress" function should be avoided if possible, as it will slow the creation of the matrices. A third means of creating a sparse matrix is to work directly with the data in compressed row format. An example of this technique might be octave_value arg; ... int nz = 6, nr = 3, nc = 4; // Assume we know the max no nz SparseMatrix sm (nr, nc, nz); Matrix m = arg.matrix_value (); int ii = 0; sm.cidx (0) = 0; for (int j = 1; j < nc; j++) { for (int i = 0; i < nr; i++) { double tmp = foo (m(i,j)); if (tmp != 0.) { sm.data(ii) = tmp; sm.ridx(ii) = i; ii++; } } sm.cidx(j+1) = ii; } sm.maybe_compress (); // If don't know a-priori // the final no of nz. which is probably the most efficient means of creating the sparse matrix. Finally, it might sometimes arise that the amount of storage initially created is insufficient to completely store the sparse matrix. Therefore, the method `change_capacity' exists to reallocate the sparse memory. The above example would then be modified as octave_value arg; ... int nz = 6, nr = 3, nc = 4; // Assume we know the max no nz SparseMatrix sm (nr, nc, nz); Matrix m = arg.matrix_value (); int ii = 0; sm.cidx (0) = 0; for (int j = 1; j < nc; j++) { for (int i = 0; i < nr; i++) { double tmp = foo (m(i,j)); if (tmp != 0.) { if (ii == nz) { nz += 2; // Add 2 more elements sm.change_capacity (nz); } sm.data(ii) = tmp; sm.ridx(ii) = i; ii++; } } sm.cidx(j+1) = ii; } sm.maybe_mutate (); // If don't know a-priori // the final no of nz. Note that both increasing and decreasing the number of non-zero elements in a sparse matrix is expensive, as it involves memory reallocation. Also as parts of the matrix, though not its entirety, exist as the old and new copy at the same time, additional memory is needed. Therefore if possible this should be avoided.  File: octave.info, Node: Using Sparse Matrices in Oct-Files, Prev: Creating Sparse Matrices in Oct-Files, Up: Sparse Matrices in Oct-Files A.1.6.3 Using Sparse Matrices in Oct-Files .......................................... Most of the same operators and functions on sparse matrices that are available from the Octave are equally available with oct-files. The basic means of extracting a sparse matrix from an `octave_value' and returning them as an `octave_value', can be seen in the following example octave_value_list retval; SparseMatrix sm = args(0).sparse_matrix_value (); SparseComplexMatrix scm = args(1).sparse_complex_matrix_value (); SparseBoolMatrix sbm = args(2).sparse_bool_matrix_value (); ... retval(2) = sbm; retval(1) = scm; retval(0) = sm; The conversion to an octave-value is handled by the sparse `octave_value' constructors, and so no special care is needed.  File: octave.info, Node: Accessing Global Variables in Oct-Files, Next: Calling Octave Functions from Oct-Files, Prev: Sparse Matrices in Oct-Files, Up: Oct-Files A.1.7 Accessing Global Variables in Oct-Files --------------------------------------------- Global variables allow variables in the global scope to be accessed. Global variables can easily be accessed with oct-files using the support functions `get_global_value' and `set_global_value'. `get_global_value' takes two arguments, the first is a string representing the variable name to obtain. The second argument is a boolean argument specifying what to do in the case that no global variable of the desired name is found. An example of the use of these two functions is #include DEFUN_DLD (globaldemo, args, , "Global demo.") { int nargin = args.length (); octave_value retval; if (nargin != 1) print_usage (); else { std::string s = args(0).string_value (); if (! error_state) { octave_value tmp = get_global_value (s, true); if (tmp.is_defined ()) retval = tmp; else retval = "Global variable not found"; set_global_value ("a", 42.0); } } return retval; } An example of its use is global a b b = 10; globaldemo ("b") => 10 globaldemo ("c") => "Global variable not found" num2str (a) => 42  File: octave.info, Node: Calling Octave Functions from Oct-Files, Next: Calling External Code from Oct-Files, Prev: Accessing Global Variables in Oct-Files, Up: Oct-Files A.1.8 Calling Octave Functions from Oct-Files --------------------------------------------- There is often a need to be able to call another octave function from within an oct-file, and there are many examples of such within octave itself. For example the `quad' function is an oct-file that calculates the definite integral by quadrature over a user supplied function. There are also many ways in which a function might be passed. It might be passed as one of 1. Function Handle 2. Anonymous Function Handle 3. Inline Function 4. String The example below demonstrates an example that accepts all four means of passing a function to an oct-file. #include #include DEFUN_DLD (funcdemo, args, nargout, "Function Demo") { int nargin = args.length(); octave_value_list retval; if (nargin < 2) print_usage (); else { octave_value_list newargs; for (octave_idx_type i = nargin - 1; i > 0; i--) newargs (i - 1) = args(i); if (args(0).is_function_handle () || args(0).is_inline_function ()) { octave_function *fcn = args(0).function_value (); if (! error_state) retval = feval (fcn, newargs, nargout); } else if (args(0).is_string ()) { std::string fcn = args (0).string_value (); if (! error_state) retval = feval (fcn, newargs, nargout); } else error ("funcdemo: expected string,", " inline or function handle"); } return retval; } The first argument to this demonstration is the user supplied function and the following arguments are all passed to the user function. funcdemo (@sin,1) => 0.84147 funcdemo (@(x) sin(x), 1) => 0.84147 funcdemo (inline ("sin(x)"), 1) => 0.84147 funcdemo ("sin",1) => 0.84147 funcdemo (@atan2, 1, 1) => 0.78540 When the user function is passed as a string, the treatment of the function is different. In some cases it is necessary to always have the user supplied function as an `octave_function' object. In that case the string argument can be used to create a temporary function like std::octave fcn_name = unique_symbol_name ("__fcn__"); std::string fname = "function y = "; fname.append (fcn_name); fname.append ("(x) y = "); fcn = extract_function (args(0), "funcdemo", fcn_name, fname, "; endfunction"); ... if (fcn_name.length ()) clear_function (fcn_name); There are two important things to know in this case. The number of input arguments to the user function is fixed, and in the above is a single argument, and secondly to avoid leaving the temporary function in the Octave symbol table it should be cleared after use.  File: octave.info, Node: Calling External Code from Oct-Files, Next: Allocating Local Memory in Oct-Files, Prev: Calling Octave Functions from Oct-Files, Up: Oct-Files A.1.9 Calling External Code from Oct-Files ------------------------------------------ Linking external C code to Octave is relatively simple, as the C functions can easily be called directly from C++. One possible issue is the declarations of the external C functions might need to be explicitly defined as C functions to the compiler. If the declarations of the external C functions are in the header `foo.h', then the manner in which to ensure that the C++ compiler treats these declarations as C code is #ifdef __cplusplus extern "C" { #endif #include "foo.h" #ifdef __cplusplus } /* end extern "C" */ #endif Calling Fortran code however can pose some difficulties. This is due to differences in the manner in compilers treat the linking of Fortran code with C or C++ code. Octave supplies a number of macros that allow consistent behavior across a number of compilers. The underlying Fortran code should use the `XSTOPX' function to replace the Fortran `STOP' function. `XSTOPX' uses the Octave exception handler to treat failing cases in the fortran code explicitly. Note that Octave supplies its own replacement BLAS `XERBLA' function, which uses `XSTOPX'. If the underlying code calls `XSTOPX', then the `F77_XFCN' macro should be used to call the underlying fortran function. The Fortran exception state can then be checked with the global variable `f77_exception_encountered'. If `XSTOPX' will not be called, then the `F77_FCN' macro should be used instead to call the Fortran code. There is no harm in using `F77_XFCN' in all cases, except that for Fortran code that is short running and executes a large number of times, there is potentially an overhead in doing so. However, if `F77_FCN' is used with code that calls `XSTOP', Octave can generate a segmentation fault. An example of the inclusion of a Fortran function in an oct-file is given in the following example, where the C++ wrapper is #include #include extern "C" { F77_RET_T F77_FUNC (fortsub, FORTSUB) (const int&, double*, F77_CHAR_ARG_DECL F77_CHAR_ARG_LEN_DECL); } DEFUN_DLD (fortdemo , args , , "Fortran Demo.") { octave_value_list retval; int nargin = args.length(); if (nargin != 1) print_usage (); else { NDArray a = args(0).array_value (); if (! error_state) { double *av = a.fortran_vec (); octave_idx_type na = a.nelem (); OCTAVE_LOCAL_BUFFER (char, ctmp, 128); F77_XFCN (fortsub, FORTSUB, (na, av, ctmp F77_CHAR_ARG_LEN (128))); retval(1) = std::string (ctmp); retval(0) = a; } } return retval; } and the fortran function is subroutine fortsub (n, a, s) implicit none character*(*) s real*8 a(*) integer*4 i, n, ioerr do i = 1, n if (a(i) .eq. 0d0) then call xstopx ('fortsub: divide by zero') else a(i) = 1d0 / a(i) endif enddo write (unit = s, fmt = '(a,i3,a,a)', iostat = ioerr) $ 'There are ', n, $ ' values in the input vector', char(0) if (ioerr .ne. 0) then call xstopx ('fortsub: error writing string') endif return end This example demonstrates most of the features needed to link to an external Fortran function, including passing arrays and strings, as well as exception handling. An example of the behavior of this function is [b, s] = fortdemo (1:3) => b = 1.00000 0.50000 0.33333 s = There are 3 values in the input vector [b, s] = fortdemo(0:3) error: fortsub:divide by zero error: exception encountered in Fortran subroutine fortsub_ error: fortdemo: error in fortran  File: octave.info, Node: Allocating Local Memory in Oct-Files, Next: Input Parameter Checking in Oct-Files, Prev: Calling External Code from Oct-Files, Up: Oct-Files A.1.10 Allocating Local Memory in Oct-Files ------------------------------------------- Allocating memory within an oct-file might seem easy as the C++ new/delete operators can be used. However, in that case care must be taken to avoid memory leaks. The preferred manner in which to allocate memory for use locally is to use the `OCTAVE_LOCAL_BUFFER' macro. An example of its use is OCTAVE_LOCAL_BUFFER (double, tmp, len) that returns a pointer `tmp' of type `double *' of length `len'.  File: octave.info, Node: Input Parameter Checking in Oct-Files, Next: Exception and Error Handling in Oct-Files, Prev: Allocating Local Memory in Oct-Files, Up: Oct-Files A.1.11 Input Parameter Checking in Oct-Files -------------------------------------------- As oct-files are compiled functions they have the possibility of causing Octave to abort abnormally. It is therefore important that each and every function has the minimum of parameter checking needed to ensure that Octave behaves well. The minimum requirement, as previously discussed, is to check the number of input arguments before using them to avoid referencing a non existent argument. However, it some case this might not be sufficient as the underlying code imposes further constraints. For example an external function call might be undefined if the input arguments are not integers, or if one of the arguments is zero. Therefore, oct-files often need additional input parameter checking. There are several functions within Octave that might be useful for the purposes of parameter checking. These include the methods of the octave_value class like `is_real_matrix', etc., but equally include more specialized functions. Some of the more common ones are demonstrated in the following example #include DEFUN_DLD (paramdemo, args, nargout, "Parameter Check Demo.") { int nargin = args.length (); octave_value retval; if (nargin != 1) print_usage(); else if (nargout != 0) error ("paramdemo: function has no output arguments"); else { NDArray m = args(0).array_value(); double min_val = -10.0; double max_val = 10.0; octave_stdout << "Properties of input array:\n"; if (m.any_element_is_negative ()) octave_stdout << " includes negative values\n"; if (m.any_element_is_inf_or_nan()) octave_stdout << " includes Inf or NaN values\n"; if (m.any_element_not_one_or_zero()) octave_stdout << " includes other values than 1 and 0\n"; if (m.all_elements_are_int_or_inf_or_nan()) octave_stdout << " includes only int, Inf or NaN values\n"; if (m.all_integers (min_val, max_val)) octave_stdout << " includes only integers in [-10,10]\n"; } return retval; } and an example of its use is paramdemo ([1, 2, NaN, Inf]) => Properties of input array: includes Inf or NaN values includes other values than 1 and 0 includes only int, Inf or NaN values  File: octave.info, Node: Exception and Error Handling in Oct-Files, Next: Documentation and Test of Oct-Files, Prev: Input Parameter Checking in Oct-Files, Up: Oct-Files A.1.12 Exception and Error Handling in Oct-Files ------------------------------------------------ Another important feature of Octave is its ability to react to the user typing `Control-C' even during calculations. This ability is based on the C++ exception handler, where memory allocated by the C++ new/delete methods are automatically released when the exception is treated. When writing an oct-file, to allow Octave to treat the user typing `Control-C', the `OCTAVE_QUIT' macro is supplied. For example for (octave_idx_type i = 0; i < a.nelem (); i++) { OCTAVE_QUIT; b.elem(i) = 2. * a.elem(i); } The presence of the `OCTAVE_QUIT' macro in the inner loop allows Octave to treat the user request with the `Control-C'. Without this macro, the user must either wait for the function to return before the interrupt is processed, or press `Control-C' three times to force Octave to exit. The `OCTAVE_QUIT' macro does impose a very small speed penalty, and so for loops that are known to be small it might not make sense to include `OCTAVE_QUIT'. When creating an oct-file that uses an external libraries, the function might spend a significant portion of its time in the external library. It is not generally possible to use the `OCTAVE_QUIT' macro in this case. The alternative in this case is BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; ... some code that calls a "foreign" function ... END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; The disadvantage of this is that if the foreign code allocates any memory internally, then this memory might be lost during an interrupt, without being deallocated. Therefore, ideally Octave itself should allocate any memory that is needed by the foreign code, with either the fortran_vec method or the `OCTAVE_LOCAL_BUFFER' macro. The Octave unwind_protect mechanism (*note The `unwind_protect' Statement::) can also be used in oct-files. In conjunction with the exception handling of Octave, it is important to enforce that certain code is run to allow variables, etc. to be restored even if an exception occurs. An example of the use of this mechanism is #include #include void err_hand (const char *fmt, ...) { // Do nothing!! } DEFUN_DLD (unwinddemo, args, nargout, "Unwind Demo") { int nargin = args.length(); octave_value retval; if (nargin < 2) print_usage (); else { NDArray a = args(0).array_value (); NDArray b = args(1).array_value (); if (! error_state) { unwind_protect::begin_frame ("Funwinddemo"); unwind_protect_ptr (current_liboctave_warning_handler); set_liboctave_warning_handler(err_hand); retval = octave_value (quotient (a, b)); unwind_protect::run_frame ("Funwinddemo"); } } return retval; } As can be seen in the example unwinddemo (1, 0) => Inf 1 / 0 => warning: division by zero Inf The division by zero (and in fact all warnings) is disabled in the `unwinddemo' function.  File: octave.info, Node: Documentation and Test of Oct-Files, Prev: Exception and Error Handling in Oct-Files, Up: Oct-Files A.1.13 Documentation and Test of Oct-Files ------------------------------------------ The documentation of an oct-file is the fourth string parameter of the `DEFUN_DLD' macro. This string can be formatted in the same manner as the help strings for user functions (*note Documentation Tips::), however there are some issue that are particular to the formatting of help strings within oct-files. The major issue is that the help string will typically be longer than a single line of text, and so the formatting of long help strings need to be taken into account. There are several manners in which to treat this issue, but the most common is illustrated in the following example DEFUN_DLD (do_what_i_want, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Function File} {} do_what_i_say (@var{n})\n\ A function that does what the user actually wants rather\n\ than what they requested.\n\ @end deftypefn") { ... } where, as can be seen, end line of text within the help string is terminated by `\n\' which is an embedded new-line in the string together with a C++ string continuation character. Note that the final `\' must be the last character on the line. Octave also includes the ability to embed the test and demonstration code for a function within the code itself (*note Test and Demo Functions::). This can be used from within oct-files (or in fact any file) with certain provisos. Firstly, the test and demo functions of Octave look for a `%!' as the first characters on a new-line to identify test and demonstration code. This is equally a requirement for oct-files. Furthermore the test and demonstration code must be included in a comment block of the compiled code to avoid it being interpreted by the compiler. Finally, the Octave test and demonstration code must have access to the source code of the oct-file and not just the compiled code as the tests are stripped from the compiled code. An example in an oct-file might be /* %!error (sin()) %!error (sin(1,1)) %!assert (sin([1,2]),[sin(1),sin(2)]) */  File: octave.info, Node: Mex-Files, Next: Standalone Programs, Prev: Oct-Files, Up: Dynamically Linked Functions A.2 Mex-Files ============= Octave includes an interface to allow legacy mex-files to be compiled and used with Octave. This interface can also be used to share code between Octave and non Octave users. However, as mex-files expose the internal API of an alternative product to Octave, and the internal structure of Octave is different to this product, a mex-file can never have the same performance in Octave as the equivalent oct-file. In particular to support the manner in which mex-files access the variables passed to mex functions, there are a significant number of additional copies of memory when calling or returning from a mex function. For this reason, new code should be written using the oct-file interface discussed above if possible. * Menu: * Getting Started with Mex-Files:: * Working with Matrices and Arrays in Mex-Files:: * Character Strings in Mex-Files:: * Cell Arrays with Mex-Files:: * Structures with Mex-Files:: * Sparse Matrices with Mex-Files:: * Calling Other Functions in Mex-Files::  File: octave.info, Node: Getting Started with Mex-Files, Next: Working with Matrices and Arrays in Mex-Files, Up: Mex-Files A.2.1 Getting Started with Mex-Files ------------------------------------ The basic command to build a mex-file is either `mkoctfile --mex' or `mex'. The first can either be used from within Octave or from the command line. However, to avoid issues with the installation of other products, the use of the command `mex' is limited to within Octave. -- Function File: mex [options] file ... Compile source code written in C, C++, or Fortran, to a MEX file. This is equivalent to `mkoctfile --mex [options] file'. *See also:* *note mkoctfile: doc-mkoctfile. -- Function File: mexext () Return the filename extension used for MEX files. One important difference between the use of mex with other products and with Octave is that the header file "matrix.h" is implicitly included through the inclusion of "mex.h". This is to avoid a conflict with the Octave file "Matrix.h" with operating systems and compilers that don't distinguish between filenames in upper and lower case Consider the short example #include "mex.h" void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mxArray *v = mxCreateDoubleMatrix (1, 1, mxREAL); double *data = mxGetPr (v); *data = 1.23456789; plhs[0] = v; } This simple example demonstrates the basics of writing a mex-file. The entry point into the mex-file is defined by `mexFunction'. Note that the function name is not explicitly included in the `mexFunction' and so there can only be a single `mexFunction' entry point per-file. Also the name of the function is determined by the name of the mex-file itself. Therefore if the above function is in the file `firstmexdemo.c', it can be compiled with mkoctfile --mex firstmexdemo.c which creates a file `firstmexdemo.mex'. The function can then be run from Octave as firstmexdemo() => 1.2346 It should be noted that the mex-file contains no help string for the functions it contains. To document mex-files, there should exist an m-file in the same directory as the mex-file itself. Taking the above as an example, we would therefore have a file `firstmexdemo.m' that might contain the text %FIRSTMEXDEMO Simple test of the functionality of a mex-file. In this case, the function that will be executed within Octave will be given by the mex-file, while the help string will come from the m-file. This can also be useful to allow a sample implementation of the mex-file within the Octave language itself for testing purposes. Although we cannot have multiple entry points into a single mex-file, we can use the `mexFunctionName' function to determine what name the mex-file was called with. This can be used to alter the behavior of the mex-file based on the function name. For example if #include "mex.h" void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { const char *nm; nm = mexFunctionName (); mexPrintf ("You called function: %s\n", nm); if (strcmp (nm, "myfunc") == 0) mexPrintf ("This is the principal function\n", nm); return; } is in file `myfunc.c', and it is compiled with mkoctfile --mex myfunc.c ln -s myfunc.mex myfunc2.mex Then as can be seen by myfunc() => You called function: myfunc This is the principal function myfunc2() => You called function: myfunc2 the behavior of the mex-file can be altered depending on the functions name. Allow the user should only include `mex.h' in their code, Octave declares additional functions, typedefs, etc., available to the user to write mex-files in the headers `mexproto.h' and `mxarray.h'.  File: octave.info, Node: Working with Matrices and Arrays in Mex-Files, Next: Character Strings in Mex-Files, Prev: Getting Started with Mex-Files, Up: Mex-Files A.2.2 Working with Matrices and Arrays in Mex-Files --------------------------------------------------- The basic mex type of all variables is `mxArray'. All variables, such as matrices, cell arrays or structures are all stored in this basic type, and this type serves basically the same purpose as the octave_value class in oct-files. That is it acts as a container for the more specialized types. The `mxArray' structure contains at a minimum, the variable it represents name, its dimensions, its type and whether the variable is real or complex. It can however contain a number of additional fields depending on the type of the `mxArray'. There are a number of functions to create `mxArray' structures, including `mxCreateCellArray', `mxCreateSparse' and the generic `mxCreateNumericArray'. The basic functions to access the data contained in an array is `mxGetPr'. As the mex interface assumes that the real and imaginary parts of a complex array are stored separately, there is an equivalent function `mxGetPi' that get the imaginary part. Both of these functions are for use only with double precision matrices. There also exists the generic function `mxGetData' and `mxGetImagData' that perform the same operation on all matrix types. For example mxArray *m; mwSize *dims; UINT32_T *pr; dims = (mwSize *) mxMalloc (2 * sizeof(mwSize)); dims[0] = 2; dims[1] = 2; m = mxCreateNumericArray (2, dims, mxUINT32_CLASS, mxREAL); pr = = (UINT32_T *) mxGetData (m); There are also the functions `mxSetPr', etc., that perform the inverse, and set the data of an Array to use the block of memory pointed to by the argument of `mxSetPr'. Note the type `mwSize' used above, and `mwIndex' are defined as the native precision of the indexing in Octave on the platform on which the mex-file is built. This allows both 32- and 64-bit platforms to support mex-files. `mwSize' is used to define array dimension and maximum number or elements, while `mwIndex' is used to define indexing into arrays. An example that demonstration how to work with arbitrary real or complex double precision arrays is given by the file `mypow2.c' as given below. #include "mex.h" void mexFunction (int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { mwIndex i; mwSize n; double *vri, *vro; if (nrhs != 1 || ! mxIsNumeric (prhs[0])) mexErrMsgTxt ("expects matrix"); n = mxGetNumberOfElements (prhs[0]); plhs[0] = (mxArray *) mxCreateNumericArray (mxGetNumberOfDimensions (prhs[0]), mxGetDimensions (prhs[0]), mxGetClassID (prhs[0]), mxIsComplex (prhs[0])); vri = mxGetPr (prhs[0]); vro = mxGetPr (plhs[0]); if (mxIsComplex (prhs[0])) { double *vii, *vio; vii = mxGetPi (prhs[0]); vio = mxGetPi (plhs[0]); for (i = 0; i < n; i++) { vro [i] = vri [i] * vri [i] - vii [i] * vii [i]; vio [i] = 2 * vri [i] * vii [i]; } } else { for (i = 0; i < n; i++) vro [i] = vri [i] * vri [i]; } } with an example of its use b = randn(4,1) + 1i * randn(4,1); all(b.^2 == mypow2(b)) => 1 The example above uses the functions `mxGetDimensions', `mxGetNumberOfElements', and `mxGetNumberOfDimensions' to work with the dimensions of multi-dimensional arrays. The functions `mxGetM', and `mxGetN' are also available to find the number of rows and columns in a matrix.  File: octave.info, Node: Character Strings in Mex-Files, Next: Cell Arrays with Mex-Files, Prev: Working with Matrices and Arrays in Mex-Files, Up: Mex-Files A.2.3 Character Strings in Mex-Files ------------------------------------ As mex-files do not make the distinction between single and double quoted strings within Octave, there is perhaps less complexity in the use of strings and character matrices in mex-files. An example of their use, that parallels the demo in `stringdemo.cc', is given in the file `mystring.c', as seen below. #include #include "mex.h" void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mwIndex i, j; mwSize m, n; mxChar *pi, *po; if (nrhs != 1 || ! mxIsChar (prhs[0]) || mxGetNumberOfDimensions (prhs[0]) > 2) mexErrMsgTxt ("expecting char matrix"); m = mxGetM (prhs[0]); n = mxGetN (prhs[0]); pi = mxGetChars (prhs[0]); plhs[0] = mxCreateNumericMatrix (m, n, mxCHAR_CLASS, mxREAL); po = mxGetChars (plhs[0]); for (j = 0; j < n; j++) for (i = 0; i < m; i++) po [j*m + m - 1 - i] = pi [j*m + i]; } An example of its expected output is mystring(["First String"; "Second String"]) => s1 = Second String First String Other functions in the mex interface for handling character strings are `mxCreateString', `mxArrayToString', and `mxCreateCharMatrixFromStrings'. In a mex-file, a character string is considered to be a vector rather than a matrix. This is perhaps an arbitrary distinction as the data in the mxArray for the matrix is consecutive in any case.  File: octave.info, Node: Cell Arrays with Mex-Files, Next: Structures with Mex-Files, Prev: Character Strings in Mex-Files, Up: Mex-Files A.2.4 Cell Arrays with Mex-Files -------------------------------- We can perform exactly the same operations in Cell arrays in mex-files as we can in oct-files. An example that reduplicates the functional of the `celldemo.cc' oct-file in a mex-file is given by `mycell.c' as below #include "mex.h" void mexFunction (int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { mwSize n; mwIndex i; if (nrhs != 1 || ! mxIsCell (prhs[0])) mexErrMsgTxt ("expects cell"); n = mxGetNumberOfElements (prhs[0]); n = (n > nlhs ? nlhs : n); for (i = 0; i < n; i++) plhs[i] = mxDuplicateArray (mxGetCell (prhs[0], i)); } which as can be seen below has exactly the same behavior as the oct-file version. [b1, b2, b3] = mycell ({1, [1, 2], "test"}) => b1 = 1 b2 = 1 2 b3 = test Note in the example the use of the `mxDuplicateArray' function. This is needed as the `mxArray' pointer returned by `mxGetCell' might be deallocated. The inverse function to `mxGetCell' is `mcSetCell' and is defined as void mxSetCell (mxArray *ptr, int idx, mxArray *val); Finally, to create a cell array or matrix, the appropriate functions are mxArray *mxCreateCellArray (int ndims, const int *dims); mxArray *mxCreateCellMatrix (int m, int n);  File: octave.info, Node: Structures with Mex-Files, Next: Sparse Matrices with Mex-Files, Prev: Cell Arrays with Mex-Files, Up: Mex-Files A.2.5 Structures with Mex-Files ------------------------------- The basic function to create a structure in a mex-file is `mxCreateStructMatrix', which creates a structure array with a two dimensional matrix, or `mxCreateStructArray'. mxArray *mxCreateStructArray (int ndims, int *dims, int num_keys, const char **keys); mxArray *mxCreateStructMatrix (int rows, int cols, int num_keys, const char **keys); Accessing the fields of the structure can then be performed with the `mxGetField' and `mxSetField' or alternatively with the `mxGetFieldByNumber' and `mxSetFieldByNumber' functions. mxArray *mxGetField (const mxArray *ptr, mwIndex index, const char *key); mxArray *mxGetFieldByNumber (const mxArray *ptr, mwIndex index, int key_num); void mxSetField (mxArray *ptr, mwIndex index, const char *key, mxArray *val); void mxSetFieldByNumber (mxArray *ptr, mwIndex index, int key_num, mxArray *val); A difference between the oct-file interface to structures and the mex-file version is that the functions to operate on structures in mex-files directly include an `index' over the elements of the arrays of elements per `field'. Whereas the oct-file structure includes a Cell Array per field of the structure. An example that demonstrates the use of structures in mex-file can be found in the file `mystruct.c', as seen below #include "mex.h" void mexFunction (int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { int i; mwIndex j; mxArray *v; const char *keys[] = { "this", "that" }; if (nrhs != 1 || ! mxIsStruct (prhs[0])) mexErrMsgTxt ("expects struct"); for (i = 0; i < mxGetNumberOfFields (prhs[0]); i++) for (j = 0; j < mxGetNumberOfElements (prhs[0]); j++) { mexPrintf ("field %s(%d) = ", mxGetFieldNameByNumber (prhs[0], i), j); v = mxGetFieldByNumber (prhs[0], j, i); mexCallMATLAB (0, 0, 1, &v, "disp"); } v = mxCreateStructMatrix (2, 2, 2, keys); mxSetFieldByNumber (v, 0, 0, mxCreateString ("this1")); mxSetFieldByNumber (v, 0, 1, mxCreateString ("that1")); mxSetFieldByNumber (v, 1, 0, mxCreateString ("this2")); mxSetFieldByNumber (v, 1, 1, mxCreateString ("that2")); mxSetFieldByNumber (v, 2, 0, mxCreateString ("this3")); mxSetFieldByNumber (v, 2, 1, mxCreateString ("that3")); mxSetFieldByNumber (v, 3, 0, mxCreateString ("this4")); mxSetFieldByNumber (v, 3, 1, mxCreateString ("that4")); if (nlhs) plhs[0] = v; } An example of the behavior of this function within Octave is then a(1).f1 = "f11"; a(1).f2 = "f12"; a(2).f1 = "f21"; a(2).f2 = "f22"; b = mystruct(a) => field f1(0) = f11 field f1(1) = f21 field f2(0) = f12 field f2(1) = f22 b = { this = (, [1] = this1 [2] = this2 [3] = this3 [4] = this4 ,) that = (, [1] = that1 [2] = that2 [3] = that3 [4] = that4 ,) }  File: octave.info, Node: Sparse Matrices with Mex-Files, Next: Calling Other Functions in Mex-Files, Prev: Structures with Mex-Files, Up: Mex-Files A.2.6 Sparse Matrices with Mex-Files ------------------------------------ The Octave format for sparse matrices is identical to the mex format in that it is a compressed column sparse format. Also in both, sparse matrices are required to be two-dimensional. The only difference is that the real and imaginary parts of the matrix are stored separately. The mex-file interface, as well as using `mxGetM', `mxGetN', `mxSetM', `mxSetN', `mxGetPr', `mxGetPi', `mxSetPr' and `mxSetPi', the mex-file interface supplies the functions mwIndex *mxGetIr (const mxArray *ptr); mwIndex *mxGetJc (const mxArray *ptr); mwSize mxGetNzmax (const mxArray *ptr); void mxSetIr (mxArray *ptr, mwIndex *ir); void mxSetJc (mxArray *ptr, mwIndex *jc); void mxSetNzmax (mxArray *ptr, mwSize nzmax); `mxGetNzmax' gets the maximum number of elements that can be stored in the sparse matrix. This is not necessarily the number of non-zero elements in the sparse matrix. `mxGetJc' returns an array with one additional value than the number of columns in the sparse matrix. The difference between consecutive values of the array returned by `mxGetJc' define the number of non-zero elements in each column of the sparse matrix. Therefore mwSize nz, n; mwIndex *Jc; mxArray *m; ... n = mxGetN (m); Jc = mxGetJc (m); nz = Jc[n]; returns the actual number of non-zero elements stored in the matrix in `nz'. As the arrays returned by `mxGetPr' and `mxGetPi' only contain the non-zero values of the matrix, we also need a pointer to the rows of the non-zero elements, and this is given by `mxGetIr'. A complete example of the use of sparse matrices in mex-files is given by the file `mysparse.c' as seen below #include "mex.h" void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mwSize n, m, nz; mxArray *v; mwIndex i; double *pr, *pi; double *pr2, *pi2; mwIndex *ir, *jc; mwIndex *ir2, *jc2; if (nrhs != 1 || ! mxIsSparse (prhs[0])) mexErrMsgTxt ("expects sparse matrix"); m = mxGetM (prhs [0]); n = mxGetN (prhs [0]); nz = mxGetNzmax (prhs [0]); if (mxIsComplex (prhs[0])) { mexPrintf ("Matrix is %d-by-%d complex", " sparse matrix", m, n); mexPrintf (" with %d elements\n", nz); pr = mxGetPr (prhs[0]); pi = mxGetPi (prhs[0]); ir = mxGetIr (prhs[0]); jc = mxGetJc (prhs[0]); i = n; while (jc[i] == jc[i-1] && i != 0) i--; mexPrintf ("last non-zero element (%d, %d) =", ir[nz-1]+ 1, i); mexPrintf (" (%g, %g)\n", pr[nz-1], pi[nz-1]); v = mxCreateSparse (m, n, nz, mxCOMPLEX); pr2 = mxGetPr (v); pi2 = mxGetPi (v); ir2 = mxGetIr (v); jc2 = mxGetJc (v); for (i = 0; i < nz; i++) { pr2[i] = 2 * pr[i]; pi2[i] = 2 * pi[i]; ir2[i] = ir[i]; } for (i = 0; i < n + 1; i++) jc2[i] = jc[i]; if (nlhs > 0) plhs[0] = v; } else if (mxIsLogical (prhs[0])) { bool *pbr, *pbr2; mexPrintf ("Matrix is %d-by-%d logical", " sparse matrix", m, n); mexPrintf (" with %d elements\n", nz); pbr = mxGetLogicals (prhs[0]); ir = mxGetIr (prhs[0]); jc = mxGetJc (prhs[0]); i = n; while (jc[i] == jc[i-1] && i != 0) i--; mexPrintf ("last non-zero element (%d, %d) = %d\n", ir[nz-1]+ 1, i, pbr[nz-1]); v = mxCreateSparseLogicalMatrix (m, n, nz); pbr2 = mxGetLogicals (v); ir2 = mxGetIr (v); jc2 = mxGetJc (v); for (i = 0; i < nz; i++) { pbr2[i] = pbr[i]; ir2[i] = ir[i]; } for (i = 0; i < n + 1; i++) jc2[i] = jc[i]; if (nlhs > 0) plhs[0] = v; } else { mexPrintf ("Matrix is %d-by-%d real", " sparse matrix", m, n); mexPrintf (" with %d elements\n", nz); pr = mxGetPr (prhs[0]); ir = mxGetIr (prhs[0]); jc = mxGetJc (prhs[0]); i = n; while (jc[i] == jc[i-1] && i != 0) i--; mexPrintf ("last non-zero element (%d, %d) = %g\n", ir[nz-1]+ 1, i, pr[nz-1]); v = mxCreateSparse (m, n, nz, mxREAL); pr2 = mxGetPr (v); ir2 = mxGetIr (v); jc2 = mxGetJc (v); for (i = 0; i < nz; i++) { pr2[i] = 2 * pr[i]; ir2[i] = ir[i]; } for (i = 0; i < n + 1; i++) jc2[i] = jc[i]; if (nlhs > 0) plhs[0] = v; } }  File: octave.info, Node: Calling Other Functions in Mex-Files, Prev: Sparse Matrices with Mex-Files, Up: Mex-Files A.2.7 Calling Other Functions in Mex-Files ------------------------------------------ It is also possible call other Octave functions from within a mex-file using `mexCallMATLAB'. An example of the use of `mexCallMATLAB' can be see in the example below #include "mex.h" void mexFunction (int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) { char *str; mexPrintf ("Hello, World!\n"); mexPrintf ("I have %d inputs and %d outputs\n", nrhs, nlhs); if (nrhs < 1 || ! mxIsString (prhs[0])) mexErrMsgTxt ("function name expected"); str = mxArrayToString (prhs[0]); mexPrintf ("I'm going to call the function %s\n", str); mexCallMATLAB (nlhs, plhs, nrhs-1, prhs+1, str); mxFree (str); } If this code is in the file `myfeval.c', and is compiled to `myfeval.mex', then an example of its use is myfeval("sin", 1) a = myfeval("sin", 1) => Hello, World! I have 2 inputs and 1 outputs I'm going to call the interpreter function sin a = 0.84147 Note that it is not possible to use function handles or inline functions within a mex-file.  File: octave.info, Node: Standalone Programs, Prev: Mex-Files, Up: Dynamically Linked Functions A.3 Standalone Programs ======================= The libraries Octave itself uses, can be utilized in standalone applications. These applications then have access, for example, to the array and matrix classes as well as to all the Octave algorithms. The following C++ program, uses class Matrix from liboctave.a or liboctave.so. #include #include int main (void) { std::cout << "Hello Octave world!\n"; int n = 2; Matrix a_matrix = Matrix (n, n); for (octave_idx_type i = 0; i < n; i++) { for (octave_idx_type j = 0; j < n; j++) { a_matrix (i, j) = (i + 1) * 10 + (j + 1); } } std::cout << a_matrix; return 0; } mkoctfile can then be used to build a standalone application with a command like $ mkoctfile --link-stand-alone standalone.cc -o standalone $ ./standalone Hello Octave world! 11 12 21 22 $ Note that the application `hello' will be dynamically linked against the octave libraries and any octave support libraries. The above allows the Octave math libraries to be used by an application. It does not however allow the script files, oct-files or builtin functions of Octave to be used by the application. To do that the Octave interpreter needs to be initialized first. An example of how to do this can then be seen in the code #include #include #include #include int main (void) { string_vector argv (2); argv(0) = "embedded"; argv(1) = "-q"; octave_main (2, argv.c_str_vec(), 1); octave_idx_type n = 2; Matrix a_matrix = Matrix (1, 2); std::cout << "GCD of ["; for (octave_idx_type i = 0; i < n; i++) { a_matrix (i) = 5 * (i + 1); if (i != 0) std::cout << ", " << 5 * (i + 2); else std::cout << 5 * (i + 2); } std::cout << "] is "; octave_value_list in = octave_value (a_matrix); octave_value_list out = feval ("gcd", in, 1); if (!error_state && out.length () > 0) { a_matrix = out(0).matrix_value (); if (a_matrix.numel () == 1) std::cout << a_matrix(0) << "\n"; else std::cout << "invalid\n"; } else std::cout << "invalid\n"; return 0; } which is compiled and run as before as a standalone application with $ mkoctfile --link-stand-alone embedded.cc -o embedded $ ./embedded GCD of [10, 15] is 5 $  File: octave.info, Node: Test and Demo Functions, Next: Tips and Standards, Prev: Dynamically Linked Functions, Up: Top Appendix B Test and Demo Functions ********************************** Octave includes a number of functions to allow the integration of testing and demonstration code in the source code of the functions themselves. * Menu: * Test Functions:: * Demonstration Functions::  File: octave.info, Node: Test Functions, Next: Demonstration Functions, Up: Test and Demo Functions B.1 Test Functions ================== -- Function File: test NAME -- Function File: test NAME quiet|normal|verbose -- Function File: test ('NAME', 'quiet|normal|verbose', FID) -- Function File: test ([], 'explain', FID) -- Function File: SUCCESS = test (...) -- Function File: [N, MAX] = test (...) -- Function File: [CODE, IDX] = test ('NAME','grabdemo') Perform tests from the first file in the loadpath matching NAME. `test' can be called as a command or as a function. Called with a single argument NAME, the tests are run interactively and stop after the first error is encountered. With a second argument the tests which are performed and the amount of output is selected. 'quiet' Don't report all the tests as they happen, just the errors. 'normal' Report all tests as they happen, but don't do tests which require user interaction. 'verbose' Do tests which require user interaction. The argument FID can be used to allow batch processing. Errors can be written to the already open file defined by FID, and hopefully when Octave crashes this file will tell you what was happening when it did. You can use `stdout' if you want to see the results as they happen. You can also give a file name rather than an FID, in which case the contents of the file will be replaced with the log from the current test. Called with a single output argument SUCCESS, `test' returns true if all of the tests were successful. Called with two output arguments N and MAX, the number of successful tests and the total number of tests in the file NAME are returned. If the second argument is the string 'grabdemo', the contents of the demo blocks are extracted but not executed. Code for all code blocks is concatenated and returned as CODE with IDX being a vector of positions of the ends of the demo blocks. If the second argument is 'explain', then NAME is ignored and an explanation of the line markers used is written to the file FID. *See also:* *note error: doc-error, *note assert: doc-assert, *note fail: doc-fail, *note demo: doc-demo, *note example: doc-example. `test' scans the named script file looking for lines which start with `%!'. The prefix is stripped off and the rest of the line is processed through the Octave interpreter. If the code generates an error, then the test is said to fail. Since `eval()' will stop at the first error it encounters, you must divide your tests up into blocks, with anything in a separate block evaluated separately. Blocks are introduced by the keyword `test' immediately following the `%!'. For example, %!test error ("this test fails!"); %!test "test doesn't fail. it doesn't generate an error"; When a test fails, you will see something like: ***** test error ('this test fails!') !!!!! test failed this test fails! Generally, to test if something works, you want to assert that it produces a correct value. A real test might look something like %!test %! A = [1, 2, 3; 4, 5, 6]; B = [1; 2]; %! expect = [ A ; 2*A ]; %! get = kron (B, A); %! if (any(size(expect) != size(get))) %! error ("wrong size: expected %d,%d but got %d,%d", %! size(expect), size(get)); %! elseif (any(any(expect!=get))) %! error ("didn't get what was expected."); %! endif To make the process easier, use the `assert' function. For example, with `assert' the previous test is reduced to: %!test %! A = [1, 2, 3; 4, 5, 6]; B = [1; 2]; %! assert (kron (B, A), [ A; 2*A ]); `assert' can accept a tolerance so that you can compare results absolutely or relatively. For example, the following all succeed: %!test assert (1+eps, 1, 2*eps) # absolute error %!test assert (100+100*eps, 100, -2*eps) # relative error You can also do the comparison yourself, but still have assert generate the error: %!test assert (isempty([])) %!test assert ([ 1,2; 3,4 ] > 0) Because `assert' is so frequently used alone in a test block, there is a shorthand form: %!assert (...) which is equivalent to: %!test assert (...) Sometimes during development there is a test that should work but is known to fail. You still want to leave the test in because when the final code is ready the test should pass, but you may not be able to fix it immediately. To avoid unnecessary bug reports for these known failures, mark the block with `xtest' rather than `test': %!xtest assert (1==0) %!xtest fail ('success=1','error')) Another use of `xtest' is for statistical tests which should pass most of the time but are known to fail occasionally. Each block is evaluated in its own function environment, which means that variables defined in one block are not automatically shared with other blocks. If you do want to share variables, then you must declare them as `shared' before you use them. For example, the following declares the variable A, gives it an initial value (default is empty), then uses it in several subsequent tests. %!shared A %! A = [1, 2, 3; 4, 5, 6]; %!assert (kron ([1; 2], A), [ A; 2*A ]); %!assert (kron ([1, 2], A), [ A, 2*A ]); %!assert (kron ([1,2; 3,4], A), [ A,2*A; 3*A,4*A ]); You can share several variables at the same time: %!shared A, B You can also share test functions: %!function A = fn(B) %! A = 2*B; %!assert (A(2),4); Note that all previous variables and values are lost when a new shared block is declared. Error and warning blocks are like test blocks, but they only succeed if the code generates an error. You can check the text of the error is correct using an optional regular expression `'. For example: %!error error('this test passes!'); If the code doesn't generate an error, the test fails. For example, %!error "this is an error because it succeeds."; produces ***** error "this is an error because it succeeds."; !!!!! test failed: no error It is important to automate the tests as much as possible, however some tests require user interaction. These can be isolated into demo blocks, which if you are in batch mode, are only run when called with `demo' or `verbose'. The code is displayed before it is executed. For example, %!demo %! T=[0:0.01:2*pi]; X=sin(T); %! plot(T,X); %! you should now see a sine wave in your figure window produces > T=[0:0.01:2*pi]; X=sin(T); > plot(T,X); > you should now see a sine wave in your figure window Press to continue: Note that demo blocks cannot use any shared variables. This is so that they can be executed by themselves, ignoring all other tests. If you want to temporarily disable a test block, put `#' in place of the block type. This creates a comment block which is echoed in the log file, but is not executed. For example: %!#demo %! T=[0:0.01:2*pi]; X=sin(T); %! plot(T,X); %! you should now see a sine wave in your figure window Block type summary: `%!test' check that entire block is correct `%!error' check for correct error message `%!warning' check for correct warning message `%!demo' demo only executes in interactive mode `%!#' comment: ignore everything within the block `%!shared x,y,z' declares variables for use in multiple tests `%!function' defines a function value for a shared variable `%!assert (x, y, tol)' shorthand for %!test assert (x, y, tol) You can also create test scripts for builtins and your own C++ functions. Just put a file of the function name on your path without any extension and it will be picked up by the test procedure. You can even embed tests directly in your C++ code: #if 0 %!test disp('this is a test') #endif or /* %!test disp('this is a test') */ but then the code will have to be on the load path and the user will have to remember to type test('name.cc'). Conversely, you can separate the tests from normal Octave script files by putting them in plain files with no extension rather than in script files. -- Function File: assert (COND) -- Function File: assert (COND, ERRMSG, ...) -- Function File: assert (COND, {varmsg_id, ERRMSG, ...) -- Function File: assert (OBSERVED,EXPECTED) -- Function File: assert (OBSERVED,EXPECTED,TOL) Produces an error if the condition is not met. `assert' can be called in three different ways. `assert (COND)' `assert (COND, ERRMSG, ...)' `assert (COND, MSG_ID, ERRMSG, ...)' Called with a single argument COND, `assert' produces an error if COND is zero. If called with a single argument a generic error message. With more than one argument, the additional arguments are passed to the `error' function. `assert (OBSERVED, EXPECTED)' Produce an error if observed is not the same as expected. Note that observed and expected can be strings, scalars, vectors, matrices, lists or structures. `assert(OBSERVED, EXPECTED, TOL)' Accept a tolerance when comparing numbers. If TOL is positive use it as an absolute tolerance, will produce an error if `abs(OBSERVED - EXPECTED) > abs(TOL)'. If TOL is negative use it as a relative tolerance, will produce an error if `abs(OBSERVED - EXPECTED) > abs(TOL * EXPECTED)'. If EXPECTED is zero TOL will always be used as an absolute tolerance. *See also:* *note test: doc-test. -- Function File: fail (CODE,PATTERN) -- Function File: fail (CODE,'warning',PATTERN) Return true if CODE fails with an error message matching PATTERN, otherwise produce an error. Note that CODE is a string and if CODE runs successfully, the error produced is: expected error but got none If the code fails with a different error, the message produced is: expected but got The angle brackets are not part of the output. Called with three arguments, the behavior is similar to `fail(CODE, PATTERN)', but produces an error if no warning is given during code execution or if the code fails.  File: octave.info, Node: Demonstration Functions, Prev: Test Functions, Up: Test and Demo Functions B.2 Demonstration Functions =========================== -- Function File: demo ('NAME',N) Runs any examples associated with the function 'NAME'. Examples are stored in the script file, or in a file with the same name but no extension somewhere on your path. To keep them separate from the usual script code, all lines are prefixed by `%!'. Each example is introduced by the keyword 'demo' flush left to the prefix, with no intervening spaces. The remainder of the example can contain arbitrary Octave code. For example: %!demo %! t=0:0.01:2*pi; x = sin(t); %! plot(t,x) %! %------------------------------------------------- %! % the figure window shows one cycle of a sine wave Note that the code is displayed before it is executed, so a simple comment at the end suffices. It is generally not necessary to use disp or printf within the demo. Demos are run in a function environment with no access to external variables. This means that all demos in your function must use separate initialization code. Alternatively, you can combine your demos into one huge demo, with the code: %! input("Press to continue: ","s"); between the sections, but this is discouraged. Other techniques include using multiple plots by saying figure between each, or using subplot to put multiple plots in the same window. Also, since demo evaluates inside a function context, you cannot define new functions inside a demo. Instead you will have to use `eval(example('function',n))' to see them. Because eval only evaluates one line, or one statement if the statement crosses multiple lines, you must wrap your demo in "if 1 endif" with the 'if' on the same line as 'demo'. For example, %!demo if 1 %! function y=f(x) %! y=x; %! endfunction %! f(3) %! endif *See also:* *note test: doc-test, *note example: doc-example. -- Function File: rundemos (DIRECTORY) -- Function File: example ('NAME',N) -- Function File: [X, IDX] = example ('NAME',N) Display the code for example N associated with the function 'NAME', but do not run it. If N is not given, all examples are displayed. Called with output arguments, the examples are returned in the form of a string X, with IDX indicating the ending position of the various examples. See `demo' for a complete explanation. *See also:* *note demo: doc-demo, *note test: doc-test. -- Function File: speed (F, INIT, MAX_N, F2, TOL) -- Function File: [ORDER, N, T_F, T_F2] = speed (...) Determine the execution time of an expression for various N. The N are log-spaced from 1 to MAX_N. For each N, an initialization expression is computed to create whatever data are needed for the test. If a second expression is given, the execution times of the two expressions will be compared. Called without output arguments the results are presented graphically. `F' The expression to evaluate. `MAX_N' The maximum test length to run. Default value is 100. Alternatively, use `[min_n,max_n]' or for complete control, `[n1,n2,...,nk]'. `INIT' Initialization expression for function argument values. Use K for the test number and N for the size of the test. This should compute values for all variables listed in args. Note that init will be evaluated first for k = 0, so things which are constant throughout the test can be computed then. The default value is `X = randn (N, 1);'. `F2' An alternative expression to evaluate, so the speed of the two can be compared. Default is `[]'. `TOL' If TOL is `Inf', then no comparison will be made between the results of expression F and expression F2. Otherwise, expression F should produce a value V and expression F2 should produce a value V2, and these shall be compared using `assert(V,V2,TOL)'. If TOL is positive, the tolerance is assumed to be absolute. If TOL is negative, the tolerance is assumed to be relative. The default is `eps'. `ORDER' The time complexity of the expression `O(a n^p)'. This is a structure with fields `a' and `p'. `N' The values N for which the expression was calculated and the execution time was greater than zero. `T_F' The nonzero execution times recorded for the expression F in seconds. `T_F2' The nonzero execution times recorded for the expression F2 in seconds. If it is needed, the mean time ratio is just `mean(T_f./T_f2)'. The slope of the execution time graph shows the approximate power of the asymptotic running time `O(n^p)'. This power is plotted for the region over which it is approximated (the latter half of the graph). The estimated power is not very accurate, but should be sufficient to determine the general order of your algorithm. It should indicate if for example your implementation is unexpectedly `O(n^2)' rather than `O(n)' because it extends a vector each time through the loop rather than preallocating one which is big enough. For example, in the current version of Octave, the following is not the expected `O(n)': speed ("for i = 1:n, y{i} = x(i); end", "", [1000,10000]) but it is if you preallocate the cell array `y': speed ("for i = 1:n, y{i} = x(i); end", ... "x = rand (n, 1); y = cell (size (x));", [1000, 10000]) An attempt is made to approximate the cost of the individual operations, but it is wildly inaccurate. You can improve the stability somewhat by doing more work for each `n'. For example: speed ("airy(x)", "x = rand (n, 10)", [10000, 100000]) When comparing a new and original expression, the line on the speedup ratio graph should be larger than 1 if the new expression is faster. Better algorithms have a shallow slope. Generally, vectorizing an algorithm will not change the slope of the execution time graph, but it will shift it relative to the original. For example: speed ("v = sum (x)", "", [10000, 100000], ... "v = 0; for i = 1:length (x), v += x(i); end") A more complex example, if you had an original version of `xcorr' using for loops and another version using an FFT, you could compare the run speed for various lags as follows, or for a fixed lag with varying vector lengths as follows: speed ("v = xcorr (x, n)", "x = rand (128, 1);", 100, "v2 = xcorr_orig (x, n)", -100*eps) speed ("v = xcorr (x, 15)", "x = rand (20+n, 1);", 100, "v2 = xcorr_orig (x, n)", -100*eps) Assuming one of the two versions is in XCORR_ORIG, this would compare their speed and their output values. Note that the FFT version is not exact, so we specify an acceptable tolerance on the comparison `100*eps', and the errors should be computed relatively, as `abs((X - Y)./Y)' rather than absolutely as `abs(X - Y)'. Type `example('speed')' to see some real examples. Note for obscure reasons, you can't run examples 1 and 2 directly using `demo('speed')'. Instead use, `eval(example('speed',1))' and `eval(example('speed',2))'.  File: octave.info, Node: Tips and Standards, Next: Contributing Guidelines, Prev: Test and Demo Functions, Up: Top Appendix C Tips and Standards ***************************** This chapter describes no additional features of Octave. Instead it gives advice on making effective use of the features described in the previous chapters. * Menu: * Style Tips:: Writing clean and robust programs. * Coding Tips:: Making code run faster. * Comment Tips:: Conventions for writing comments. * Function Headers:: Standard headers for functions. * Documentation Tips:: Writing readable documentation strings.  File: octave.info, Node: Style Tips, Next: Coding Tips, Up: Tips and Standards C.1 Writing Clean Octave Programs ================================= Here are some tips for avoiding common errors in writing Octave code intended for widespread use: * Since all global variables share the same name space, and all functions share another name space, you should choose a short word to distinguish your program from other Octave programs. Then take care to begin the names of all global variables, constants, and functions with the chosen prefix. This helps avoid name conflicts. If you write a function that you think ought to be added to Octave under a certain name, such as `fiddle_matrix', don't call it by that name in your program. Call it `mylib_fiddle_matrix' in your program, and send mail to suggesting that it be added to Octave. If and when it is, the name can be changed easily enough. If one prefix is insufficient, your package may use two or three alternative common prefixes, so long as they make sense. Separate the prefix from the rest of the symbol name with an underscore `_'. This will be consistent with Octave itself and with most Octave programs. * When you encounter an error condition, call the function `error' (or `usage'). The `error' and `usage' functions do not return. *Note Errors::. * Please put a copyright notice on the file if you give copies to anyone. Use the same lines that appear at the top of the function files distributed with Octave. If you have not signed papers to assign the copyright to anyone else, then place your name in the copyright notice.  File: octave.info, Node: Coding Tips, Next: Comment Tips, Prev: Style Tips, Up: Tips and Standards C.2 Tips for Making Code Run Faster. ==================================== Here are some ways of improving the execution speed of Octave programs. * Avoid looping wherever possible. * Use iteration rather than recursion whenever possible. Function calls are slow in Octave. * Avoid resizing matrices unnecessarily. When building a single result matrix from a series of calculations, set the size of the result matrix first, then insert values into it. Write result = zeros (big_n, big_m) for i = over:and_over r1 = ... r2 = ... result (r1, r2) = new_value (); endfor instead of result = []; for i = ever:and_ever result = [ result, new_value() ]; endfor * Avoid calling `eval' or `feval' whenever possible, because they require Octave to parse input or look up the name of a function in the symbol table. If you are using `eval' as an exception handling mechanism and not because you need to execute some arbitrary text, use the `try' statement instead. *Note The `try' Statement::. * If you are calling lots of functions but none of them will need to change during your run, set the variable `ignore_function_time_stamp' to `"all"' so that Octave doesn't waste a lot of time checking to see if you have updated your function files.  File: octave.info, Node: Comment Tips, Next: Function Headers, Prev: Coding Tips, Up: Tips and Standards C.3 Tips on Writing Comments ============================ Here are the conventions to follow when writing comments. `#' Comments that start with a single sharp-sign, `#', should all be aligned to the same column on the right of the source code. Such comments usually explain how the code on the same line does its job. In the Emacs mode for Octave, the `M-;' (`indent-for-comment') command automatically inserts such a `#' in the right place, or aligns such a comment if it is already present. `##' Comments that start with a double sharp-sign, `##', should be aligned to the same level of indentation as the code. Such comments usually describe the purpose of the following lines or the state of the program at that point. The indentation commands of the Octave mode in Emacs, such as `M-;' (`indent-for-comment') and `TAB' (`octave-indent-line') automatically indent comments according to these conventions, depending on the number of semicolons. *Note Manipulating Comments: (emacs)Comments.  File: octave.info, Node: Function Headers, Next: Documentation Tips, Prev: Comment Tips, Up: Tips and Standards C.4 Conventional Headers for Octave Functions ============================================= Octave has conventions for using special comments in function files to give information such as who wrote them. This section explains these conventions. The top of the file should contain a copyright notice, followed by a block of comments that can be used as the help text for the function. Here is an example: ## Copyright (C) 1996, 1997, 2007 John W. Eaton ## ## This file is part of Octave. ## ## Octave is free software; you can 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. ## ## Octave is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied ## warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ## PURPOSE. See the GNU General Public License for more ## details. ## ## You should have received a copy of the GNU General Public ## License along with Octave; see the file COPYING. If not, ## see . ## usage: [IN, OUT, PID] = popen2 (COMMAND, ARGS) ## ## Start a subprocess with two-way communication. COMMAND ## specifies the name of the command to start. ARGS is an ## array of strings containing options for COMMAND. IN and ## OUT are the file ids of the input and streams for the ## subprocess, and PID is the process id of the subprocess, ## or -1 if COMMAND could not be executed. ## ## Example: ## ## [in, out, pid] = popen2 ("sort", "-nr"); ## fputs (in, "these\nare\nsome\nstrings\n"); ## fclose (in); ## while (ischar (s = fgets (out))) ## fputs (stdout, s); ## endwhile ## fclose (out); Octave uses the first block of comments in a function file that do not appear to be a copyright notice as the help text for the file. For Octave to recognize the first comment block as a copyright notice, it must start with the word `Copyright' after stripping the leading comment characters. After the copyright notice and help text come several "header comment" lines, each beginning with `## HEADER-NAME:'. For example, ## Author: jwe ## Keywords: subprocesses input-output ## Maintainer: jwe Here is a table of the conventional possibilities for HEADER-NAME: `Author' This line states the name and net address of at least the principal author of the library. ## Author: John W. Eaton `Maintainer' This line should contain a single name/address as in the Author line, or an address only, or the string `jwe'. If there is no maintainer line, the person(s) in the Author field are presumed to be the maintainers. The example above is mildly bogus because the maintainer line is redundant. The idea behind the `Author' and `Maintainer' lines is to make possible a function to "send mail to the maintainer" without having to mine the name out by hand. Be sure to surround the network address with `<...>' if you include the person's full name as well as the network address. `Created' This optional line gives the original creation date of the file. For historical interest only. `Version' If you wish to record version numbers for the individual Octave program, put them in this line. `Adapted-By' In this header line, place the name of the person who adapted the library for installation (to make it fit the style conventions, for example). `Keywords' This line lists keywords. Eventually, it will be used by an apropos command to allow people will find your package when they're looking for things by topic area. To separate the keywords, you can use spaces, commas, or both. Just about every Octave function ought to have the `Author' and `Keywords' header comment lines. Use the others if they are appropriate. You can also put in header lines with other header names--they have no standard meanings, so they can't do any harm.  File: octave.info, Node: Documentation Tips, Prev: Function Headers, Up: Tips and Standards C.5 Tips for Documentation Strings ================================== As noted above, documentation is typically in a commented header block on an Octave function following the copyright statement. The help string shown above is an unformatted string and will be displayed as is by Octave. Here are some tips for the writing of documentation strings. * Every command, function, or variable intended for users to know about should have a documentation string. * An internal variable or subroutine of an Octave program might as well have a documentation string. * The first line of the documentation string should consist of one or two complete sentences that stand on their own as a summary. The documentation string can have additional lines that expand on the details of how to use the function or variable. The additional lines should also be made up of complete sentences. * For consistency, phrase the verb in the first sentence of a documentation string as an infinitive with "to" omitted. For instance, use "Return the frob of A and B." in preference to "Returns the frob of A and B." Usually it looks good to do likewise for the rest of the first paragraph. Subsequent paragraphs usually look better if they have proper subjects. * Write documentation strings in the active voice, not the passive, and in the present tense, not the future. For instance, use "Return a list containing A and B." instead of "A list containing A and B will be returned." * Avoid using the word "cause" (or its equivalents) unnecessarily. Instead of, "Cause Octave to display text in boldface," write just "Display text in boldface." * Do not start or end a documentation string with whitespace. * Format the documentation string so that it fits in an Emacs window on an 80-column screen. It is a good idea for most lines to be no wider than 60 characters. However, rather than simply filling the entire documentation string, you can make it much more readable by choosing line breaks with care. Use blank lines between topics if the documentation string is long. * *Do not* indent subsequent lines of a documentation string so that the text is lined up in the source code with the text of the first line. This looks nice in the source code, but looks bizarre when users view the documentation. Remember that the indentation before the starting double-quote is not part of the string! * The documentation string for a variable that is a yes-or-no flag should start with words such as "Nonzero means...", to make it clear that all nonzero values are equivalent and indicate explicitly what zero and nonzero mean. * When a function's documentation string mentions the value of an argument of the function, use the argument name in capital letters as if it were a name for that value. Thus, the documentation string of the operator `/' refers to its second argument as `DIVISOR', because the actual argument name is `divisor'. Also use all caps for meta-syntactic variables, such as when you show the decomposition of a list or vector into subunits, some of which may vary. Octave also allows extensive formatting of the help string of functions using Texinfo. The effect on the online documentation is relatively small, but makes the help string of functions conform to the help of Octave's own functions. However, the effect on the appearance of printed or online documentation will be greatly improved. The fundamental building block of Texinfo documentation strings is the Texinfo-macro `@deftypefn', which takes three arguments: The class the function is in, its output arguments, and the function's signature. Typical classes for functions include `Function File' for standard Octave functions, and `Loadable Function' for dynamically linked functions. A skeletal Texinfo documentation string therefore looks like this -*- texinfo -*- @deftypefn{Function File} {@var{ret} =} fn (...) @cindex index term Help text in Texinfo format. Code samples should be marked like @code{sample of code} and variables should be marked as @var{variable}. @seealso{fn2} @end deftypefn This help string must be commented in user functions, or in the help string of the `DEFUN_DLD' macro for dynamically loadable functions. The important aspects of the documentation string are -*- texinfo -*- This string signals Octave that the following text is in Texinfo format, and should be the first part of any help string in Texinfo format. @deftypefn{class} ... @end deftypefn The entire help string should be enclosed within the block defined by deftypefn. @cindex index term This generates an index entry, and can be useful when the function is included as part of a larger piece of documentation. It is ignored within Octave's help viewer. Only one index term may appear per line but multiple @cindex lines are valid if the function should be filed under different terms. @var{variable} All variables should be marked with this macro. The markup of variables is then changed appropriately for display. @code{sample of code} All samples of code should be marked with this macro for the same reasons as the @var macro. @seealso{function2} This is a comma separated list of function names that allows cross referencing from one function documentation string to another. Texinfo format has been designed to generate output for online viewing with text terminals as well as generating high-quality printed output. To these ends, Texinfo has commands which control the diversion of parts of the document into a particular output processor. Three formats are of importance: info, html and TeX. These are selected with @ifinfo Text area for info only @end ifinfo @ifhtml Text area for HTML only @end ifhtml @tex Text area for TeX only @end tex Note that often TeX output can be used in html documents and so often the `@ifhtml' blocks are unnecessary. If no specific output processor is chosen, by default, the text goes into all output processors. It is usual to have the above blocks in pairs to allow the same information to be conveyed in all output formats, but with a different markup. Currently, most Octave documentation only makes a distinction between TeX and all other formats. Therefore, the following construct is seen repeatedly. @tex text for TeX only @end tex @ifnottex text for info, HTML, plaintext @end ifnottex Another important feature of Texinfo that is often used in Octave help strings is the `@example' environment. An example of its use is @example @group @code{2 * 2} @result{} 4 @end group @end example which produces `2 * 2' => 4 The `@group' block prevents the example from being split across a page boundary, while the `@result{}' macro produces a right arrow signifying the result of a command. If your example is larger than 20 lines it is better NOT to use grouping so that a reasonable page boundary can be calculated. In many cases a function has multiple ways in which it can be called, and the `@deftypefnx' macro can be used to give alternatives. For example -*- texinfo -*- @deftypefn{Function File} {@var{a} =} fn (@var{x}, ...) @deftypefnx{Function File} {@var{a} =} fn (@var{y}, ...) Help text in Texinfo format. @end deftypefn Many complete examples of Texinfo documentation can be taken from the help strings for the Octave functions themselves. A relatively complete example of which is the `nchoosek' function. The Texinfo documentation string for `nchoosek' is -*- texinfo -*- @deftypefn {Function File} {} nchoosek (@var{n}, @var{k}) Compute the binomial coefficient or all combinations of @var{n}. If @var{n} is a scalar then, calculate the binomial coefficient of @var{n} and @var{k}, defined as @tex $$ {n \choose k} = {n (n-1) (n-2) \cdots (n-k+1) \over k!} $$ @end tex @ifnottex @example @group / \ | n | n (n-1) (n-2) ... (n-k+1) | | = ------------------------- | k | k! \ / @end group @end example @end ifnottex If @var{n} is a vector, this generates all combinations of the elements of @var{n}, taken @var{k} at a time, one row per combination. The resulting @var{c} has size @code{[nchoosek (length (@var{n}),@var{k}), @var{k}]}. @code{nchoosek} works only for non-negative integer arguments; use @code{bincoeff} for non-integer scalar arguments and for using vector arguments to compute many coefficients at once. @seealso{bincoeff} @end deftypefn which demonstrates most of the concepts discussed above.  File: octave.info, Node: Contributing Guidelines, Next: Trouble, Prev: Tips and Standards, Up: Top Appendix D Contributing Guidelines ********************************** This chapter is dedicated to those who wish to contribute code to Octave. * Menu: * How to Contribute:: * General Guidelines:: * Octave Sources (m-files):: * C++ Sources:: * Other Sources::  File: octave.info, Node: How to Contribute, Next: General Guidelines, Up: Contributing Guidelines D.1 How to Contribute ===================== The mailing list for Octave development discussion and sending contributions is . This concerns the development of Octave core, i.e., code that goes to Octave directly. You may consider developing and publishing a package instead; a great place for this is the allied Octave-Forge project (`http://octave.sf.net'). Note that the Octave project is inherently more conservative and follows narrower rules. The preferable form of contribution is creating a Mercurial changeset and sending it via e-mail to the octave-maintainers mailing list. Mercurial is the source code management system currently used to develop Octave. Other forms of contributions (e.g., simple diff patches) are also acceptable, but they slow down the review process. If you want to make more contributions, you should really get familiar with Mercurial. A good place to start is `http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial'. There you will also find help how to install Mercurial. A simple contribution sequence could look like this: hg clone http://www.octave.org/hg/octave # make a local copy of the octave # source repository cd octave # change some sources... hg commit -m "make Octave the coolest software ever" # commit the changeset into your # local repository hg export -o ../cool.diff tip # export the changeset to a diff # file # send ../cool.diff via email You may want to get familiar with Mercurial queues to manage your changesets. Here is a slightly less simple example using Mercurial queues, where you work on two unrelated changesets in parallel and update one of the changesets after discussion in the maintainers mailing list: hg qnew nasty_bug # create a new patch # change sources... hg qref # save the changes into the patch # change even more... hg qref -m "solution to nasty bug!" # save again with commit message hg export -o ../nasty.diff tip # export the patch # send ../nasty.diff via email hg qpop # undo the application of the patch # and remove the changes from the # source tree hg qnew doc_improvements # create an unrelated patch # change doc sources... hg qref -m "could not find myfav.m in the doc" # save the changes into the patch hg export -o ../doc.diff tip # export the second patch # send ../doc.diff tip via email hg qpop # discussion in the maintainers mailing list ... hg qpush nasty_bug # apply the patch again # change sources yet again ... hg qref hg export -o ../nasty2.diff tip # send ../nasty2.diff via email  File: octave.info, Node: General Guidelines, Next: Octave Sources (m-files), Prev: How to Contribute, Up: Contributing Guidelines D.2 General Guidelines ====================== All Octave's sources are distributed under the General Public License (GPL). Currently, Octave uses GPL version 3. For details about this license, see `http://www.gnu.org/licenses/gpl.html'. Therefore, whenever you create a new source file, it should have the following comment header (use appropriate year, name and comment marks): ## Copyright (C) 1996, 1997, 2007 John W. Eaton ## ## This file is part of Octave. ## ## Octave is free software; you can 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. ## ## Octave is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied ## warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ## PURPOSE. See the GNU General Public License for more ## details. ## ## You should have received a copy of the GNU General Public ## License along with Octave; see the file COPYING. If not, ## see . Always include ChangeLog entries in changesets. After making your source changes, record and briefly describe the changes in the nearest ChangeLog file upwards in the directory tree. Use the previous entries as a template. Your entry should contain your name and email, and the path to the modified source file relative to the parent directory of the ChangeLog file. If there are more functions in the file, you should also include the name of the modified function (in parentheses after file path). Example: 2008-04-02 David Bateman * graphics.cc (void gnuplot_backend::close_figure (const octave_value&) const): Allow for an input and output stream. The ChangeLog entries should describe what is changed, not why. Any explanation of why a change is needed should appear as comments in the code, particularly if there is something that might not be obvious to someone reading it later. The preferred comment mark for places that may need further attention is FIXME.  File: octave.info, Node: Octave Sources (m-files), Next: C++ Sources, Prev: General Guidelines, Up: Contributing Guidelines D.3 Octave Sources (m-files) ============================ Don't use tabs. Tabs cause trouble. If you are used to them, set up your editor so that it converts tabs to spaces. Indent the bodies of the statement blocks. Recommended indent is 2 spaces. When calling functions, put spaces after commas and before the calling parentheses, like this: x = max (sin (y+3), 2); An exception are matrix and vector constructors: [sin(x), cos(x)] Here, putting spaces after `sin', `cos' would result in a parse error. In indexing expression, do not put a space after the identifier (this differentiates indexing and function calls nicely). The space after comma is not necessary if index expressions are simple, i.e., you may write A(:,i,j) but A([1:i-1;i+1:n], XI(:,2:n-1)) Use lowercase names if possible. Uppercase is acceptable for variable names consisting of 1-2 letters. Do not use mixed case names. Function names must be lowercase. Function names are global, so choose them wisely. Always use a specific end-of-block statement (like `endif', `endswitch') rather than generic `end'. Enclose the `if', `while', `until' and `switch' conditions in parentheses, like in C: if (isvector (a)) s = sum(a); endif Do not do this, however, with `for': for i = 1:n b(i) = sum (a(:,i)); endfor  File: octave.info, Node: C++ Sources, Next: Other Sources, Prev: Octave Sources (m-files), Up: Contributing Guidelines D.4 C++ Sources =============== Don't use tabs. Tabs cause trouble. If you are used to them, set up your editor so that it converts tabs to spaces. Format function headers like this: static bool matches_patterns (const string_vector& patterns, int pat_idx, int num_pat, const std::string& name) The function name should start in column 1, and multi-line argument lists should be aligned on the first char after the open parenthesis. You should put a space after the left open parenthesis and after commas, for both function definitions and function calls. Recommended indent is 2 spaces. When indenting, indent the statement after control structures (like `if', `while', etc.). If there is a compound statement, indent both the curly braces and the body of the statement (so that the body gets indented by two indents). Example: if (have_args) { idx.push_back (first_args); have_args = false; } else idx.push_back (make_value_list (*p_args, *p_arg_nm, &tmp)); If you have nested `if' statements, use extra braces for extra clarification. Split long expressions in such a way that a continuation line starts with an operator rather than identifier. If the split occurs inside braces, continuation should be aligned with the first char after the innermost braces enclosing the split. Example: SVD::type type = ((nargout == 0 || nargout == 1) ? SVD::sigma_only : (nargin == 2) ? SVD::economy : SVD::std); Consider putting extra braces around a multiline expression to make it more readable, even if they are not necessary. Also, do not hesitate to put extra braces anywhere if it improves clarity. Try declaring variables just before they're needed. Use local variables of blocks - it helps optimization. Don't write multi-line variable declaration with a single type specification and multiple variables. If the variables don't fit on single line, repeat the type specification. Example: octave_value retval; octave_idx_type nr = b.rows (); octave_idx_type nc = b.cols (); double d1, d2; Use lowercase names if possible. Uppercase is acceptable for variable names consisting of 1-2 letters. Do not use mixed case names. Try to use Octave's types and classes if possible. Otherwise, try to use C++ standard library. Use of STL containers and algorithms is encouraged. Use templates wisely to reduce code duplication. Avoid comma expressions, labels and gotos, and explicit typecasts. If you need to typecast, use the modern C++ casting operators. In functions, try to reduce the number of `return' statements - use nested `if' statements if possible.  File: octave.info, Node: Other Sources, Prev: C++ Sources, Up: Contributing Guidelines D.5 Other Sources ================= Apart from C++ and Octave language (m-files), Octave's sources include files written in C, Fortran, M4, perl, unix shell, AWK, texinfo and TeX. There are not many rules to follow when using these other languages; some of them are summarized below. In any case, the golden rule is: if you modify a source file, try to follow any conventions you can detect in the file or other similar files. For C you should obviously follow all C++ rules that can apply. If you happen to modify a Fortran file, you should stay within Fortran 77 with common extensions like `END DO'. Currently, we want all sources to be compilable with the f2c and g77 compilers, without special flags if possible. This usually means that non-legacy compilers also accept the sources. The M4 macro language is mainly used for autoconf configuration files. You should follow normal M4 rules when contributing to these files. Some M4 files come from external source, namely the Autoconf archive `http://autoconf-archive.cryp.to'. If you give a code example in the documentation written in texinfo with the `@example' environment, you should be aware that the text within such an environment will not be wrapped. It is recommended that you keep the lines short enough to fit on pages in the generated pdf or ps documents. Here is a ruler (in an `@example' environment) for finding the appropriate line width: 1 2 3 4 5 6 123456789012345678901234567890123456789012345678901234567890  File: octave.info, Node: Trouble, Next: Installation, Prev: Contributing Guidelines, Up: Top Appendix E Known Causes of Trouble ********************************** This section describes known problems that affect users of Octave. Most of these are not Octave bugs per se--if they were, we would fix them. But the result for a user may be like the result of a bug. Some of these problems are due to bugs in other software, some are missing features that are too much work to add, and some are places where people's opinions differ as to what is best. * Menu: * Actual Bugs:: Bugs we will fix later. * Reporting Bugs:: * Bug Criteria:: * Bug Lists:: * Bug Reporting:: * Sending Patches:: * Service::  File: octave.info, Node: Actual Bugs, Next: Reporting Bugs, Up: Trouble E.1 Actual Bugs We Haven't Fixed Yet ==================================== * Output that comes directly from Fortran functions is not sent through the pager and may appear out of sequence with other output that is sent through the pager. One way to avoid this is to force pending output to be flushed before calling a function that will produce output from within Fortran functions. To do this, use the command fflush (stdout) Another possible workaround is to use the command page_screen_output (false); to turn the pager off. A list of ideas for future enhancements is distributed with Octave. See the file `PROJECTS' in the top level directory in the source distribution.  File: octave.info, Node: Reporting Bugs, Next: Bug Criteria, Prev: Actual Bugs, Up: Trouble E.2 Reporting Bugs ================== Your bug reports play an essential role in making Octave reliable. When you encounter a problem, the first thing to do is to see if it is already known. *Note Trouble::. If it isn't known, then you should report the problem. Reporting a bug may help you by bringing a solution to your problem, or it may not. In any case, the principal function of a bug report is to help the entire community by making the next version of Octave work better. Bug reports are your contribution to the maintenance of Octave. In order for a bug report to serve its purpose, you must include the information that makes it possible to fix the bug. If you have Octave working at all, the easiest way to prepare a complete bug report is to use the Octave function `bug_report'. When you execute this function, Octave will prompt you for a subject and then invoke the editor on a file that already contains all the configuration information. When you exit the editor, Octave will mail the bug report for you. -- Function File: bug_report () Have Octave create a bug report template file, invoke your favorite editor, and submit the report to the bug-octave mailing list when you are finished editing. * Menu: * Bug Criteria:: * Where: Bug Lists. Where to send your bug report. * Reporting: Bug Reporting. How to report a bug effectively. * Patches: Sending Patches. How to send a patch for Octave.  File: octave.info, Node: Bug Criteria, Next: Bug Lists, Prev: Reporting Bugs, Up: Trouble E.3 Have You Found a Bug? ========================= If you are not sure whether you have found a bug, here are some guidelines: * If Octave gets a fatal signal, for any input whatever, that is a bug. Reliable interpreters never crash. * If Octave produces incorrect results, for any input whatever, that is a bug. * Some output may appear to be incorrect when it is in fact due to a program whose behavior is undefined, which happened by chance to give the desired results on another system. For example, the range operator may produce different results because of differences in the way floating point arithmetic is handled on various systems. * If Octave produces an error message for valid input, that is a bug. * If Octave does not produce an error message for invalid input, that is a bug. However, you should note that your idea of "invalid input" might be my idea of "an extension" or "support for traditional practice". * If you are an experienced user of programs like Octave, your suggestions for improvement are welcome in any case.  File: octave.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Trouble E.4 Where to Report Bugs ======================== If you have Octave working at all, the easiest way to prepare a complete bug report is to use the Octave function `bug_report'. When you execute this function, Octave will prompt you for a subject and then invoke the editor on a file that already contains all the configuration information. When you exit the editor, Octave will mail the bug report for you. If for some reason you cannot use Octave's `bug_report' function, send bug reports for Octave to . *Do not send bug reports to `help-octave'*. Most users of Octave do not want to receive bug reports. Those that do have asked to be on the mailing list. As a last resort, send bug reports on paper to: Octave Bugs c/o John W. Eaton University of Wisconsin-Madison Department of Chemical Engineering 1415 Engineering Drive Madison, Wisconsin 53706 USA  File: octave.info, Node: Bug Reporting, Next: Sending Patches, Prev: Bug Lists, Up: Trouble E.5 How to Report Bugs ====================== Send bug reports for Octave to one of the addresses listed in *note Bug Lists::. The fundamental principle of reporting bugs usefully is this: *report all the facts*. If you are not sure whether to state a fact or leave it out, state it! Often people omit facts because they think they know what causes the problem and they conclude that some details don't matter. Thus, you might assume that the name of the variable you use in an example does not matter. Well, probably it doesn't, but one cannot be sure. Perhaps the bug is a stray memory reference which happens to fetch from the location where that name is stored in memory; perhaps, if the name were different, the contents of that location would fool the interpreter into doing the right thing despite the bug. Play it safe and give a specific, complete example. Keep in mind that the purpose of a bug report is to enable someone to fix the bug if it is not known. Always write your bug reports on the assumption that the bug is not known. Sometimes people give a few sketchy facts and ask, "Does this ring a bell?" This cannot help us fix a bug. It is better to send a complete bug report to begin with. Try to make your bug report self-contained. If we have to ask you for more information, it is best if you include all the previous information in your response, as well as the information that was missing. To enable someone to investigate the bug, you should include all these things: * The version of Octave. You can get this by noting the version number that is printed when Octave starts, or running it with the `-v' option. * A complete input file that will reproduce the bug. A single statement may not be enough of an example--the bug might depend on other details that are missing from the single statement where the error finally occurs. * The command arguments you gave Octave to execute that example and observe the bug. To guarantee you won't omit something important, list all the options. If we were to try to guess the arguments, we would probably guess wrong and then we would not encounter the bug. * The type of machine you are using, and the operating system name and version number. * The command-line arguments you gave to the `configure' command when you installed the interpreter. * A complete list of any modifications you have made to the interpreter source. Be precise about these changes--show a context diff for them. * Details of any other deviations from the standard procedure for installing Octave. * A description of what behavior you observe that you believe is incorrect. For example, "The interpreter gets a fatal signal," or, "The output produced at line 208 is incorrect." Of course, if the bug is that the interpreter gets a fatal signal, then one can't miss it. But if the bug is incorrect output, we might not notice unless it is glaringly wrong. Even if the problem you experience is a fatal signal, you should still say so explicitly. Suppose something strange is going on, such as, your copy of the interpreter is out of synch, or you have encountered a bug in the C library on your system. Your copy might crash and the copy here would not. If you said to expect a crash, then when the interpreter here fails to crash, we would know that the bug was not happening. If you don't say to expect a crash, then we would not know whether the bug was happening. We would not be able to draw any conclusion from our observations. Often the observed symptom is incorrect output when your program is run. Unfortunately, this is not enough information unless the program is short and simple. It is very helpful if you can include an explanation of the expected output, and why the actual output is incorrect. * If you wish to suggest changes to the Octave source, send them as context diffs. If you even discuss something in the Octave source, refer to it by context, not by line number, because the line numbers in the development sources probably won't match those in your sources. Here are some things that are not necessary: * A description of the envelope of the bug. Often people who encounter a bug spend a lot of time investigating which changes to the input file will make the bug go away and which changes will not affect it. Such information is usually not necessary to enable us to fix bugs in Octave, but if you can find a simpler example to report _instead_ of the original one, that is a convenience. Errors in the output will be easier to spot, running under the debugger will take less time, etc. Most Octave bugs involve just one function, so the most straightforward way to simplify an example is to delete all the function definitions except the one in which the bug occurs. However, simplification is not vital; if you don't want to do this, report the bug anyway and send the entire test case you used. * A patch for the bug. Patches can be helpful, but if you find a bug, you should report it, even if you cannot send a fix for the problem.  File: octave.info, Node: Sending Patches, Next: Service, Prev: Bug Reporting, Up: Trouble E.6 Sending Patches for Octave ============================== If you would like to write bug fixes or improvements for Octave, that is very helpful. When you send your changes, please follow these guidelines to avoid causing extra work for us in studying the patches. If you don't follow these guidelines, your information might still be useful, but using it will take extra work. Maintaining Octave is a lot of work in the best of circumstances, and we can't keep up unless you do your best to help. * Send an explanation with your changes of what problem they fix or what improvement they bring about. For a bug fix, just include a copy of the bug report, and explain why the change fixes the bug. * Always include a proper bug report for the problem you think you have fixed. We need to convince ourselves that the change is right before installing it. Even if it is right, we might have trouble judging it if we don't have a way to reproduce the problem. * Include all the comments that are appropriate to help people reading the source in the future understand why this change was needed. * Don't mix together changes made for different reasons. Send them _individually_. If you make two changes for separate reasons, then we might not want to install them both. We might want to install just one. * Use `diff -c' to make your diffs. Diffs without context are hard for us to install reliably. More than that, they make it hard for us to study the diffs to decide whether we want to install them. Unidiff format is better than contextless diffs, but not as easy to read as `-c' format. If you have GNU diff, use `diff -cp', which shows the name of the function that each change occurs in. * Write the change log entries for your changes. Read the `ChangeLog' file to see what sorts of information to put in, and to learn the style that we use. The purpose of the change log is to show people where to find what was changed. So you need to be specific about what functions you changed; in large functions, it's often helpful to indicate where within the function the change was made. On the other hand, once you have shown people where to find the change, you need not explain its purpose. Thus, if you add a new function, all you need to say about it is that it is new. If you feel that the purpose needs explaining, it probably does--but the explanation will be much more useful if you put it in comments in the code. If you would like your name to appear in the header line for who made the change, send us the header line.  File: octave.info, Node: Service, Prev: Sending Patches, Up: Trouble E.7 How To Get Help with Octave =============================== The mailing list exists for the discussion of matters related to using and installing Octave. If would like to join the discussion, please send a short note to . *Please do not* send requests to be added or removed from the mailing list, or other administrative trivia to the list itself. If you think you have found a bug in the installation procedure, however, you should send a complete bug report for the problem to . *Note Bug Reporting::, for information that will help you to submit a useful report.  File: octave.info, Node: Installation, Next: Emacs Octave Support, Prev: Trouble, Up: Top Appendix F Installing Octave **************************** Here is the procedure for installing Octave from scratch on a Unix system. * Run the shell script `configure'. This will determine the features your system has (or doesn't have) and create a file named `Makefile' from each of the files named `Makefile.in'. Here is a summary of the configure options that are most frequently used when building Octave: `--prefix=PREFIX' Install Octave in subdirectories below PREFIX. The default value of PREFIX is `/usr/local'. `--srcdir=DIR' Look for Octave sources in the directory DIR. `--enable-bounds-check' Enable bounds checking for indexing operators in the internal array classes. This option is primarily used for debugging Octave. Building Octave with this option has a negative impact on performance and is not recommended for general use. `--enable-64' This is an *experimental* option to enable Octave to use 64-bit integers for array dimensions and indexing on 64-bit platforms. You probably don't want to use this option unless you know what you are doing. If you use `--enable-64', you must ensure that your Fortran compiler generates code with 8 byte signed `INTEGER' values, and that your BLAS and LAPACK libraries are compiled to use 8 byte signed integers for array dimensions and indexing. `--enable-shared' Create shared libraries (this is the default). If you are planning to use the dynamic loading features, you will probably want to use this option. It will make your `.oct' files much smaller and on some systems it may be necessary to build shared libraries in order to use dynamically linked functions. You may also want to build a shared version of `libstdc++', if your system doesn't already have one. `--enable-dl' Use `dlopen' and friends to make Octave capable of dynamically linking externally compiled functions (this is the default if `--enable-shared' is specified). This option only works on systems that actually have these functions. If you plan on using this feature, you should probably also use `--enable-shared' to reduce the size of your `.oct' files. `--without-blas' Compile and use the generic BLAS and LAPACK versions included with Octave. By default, configure first looks for BLAS and LAPACK matrix libraries on your system, including optimized BLAS implementations such as the free ATLAS 3.0, as well as vendor-tuned libraries. (The use of an optimized BLAS will generally result in several-times faster matrix operations.) Only use this option if your system has BLAS/LAPACK libraries that cause problems for some reason. You can also use `--with-blas=lib' to specify a particular BLAS library that configure doesn't check for automatically. `--without-ccolamd' Don't use CCOLAMD, disable some sparse matrix functionality. `--without-colamd' Don't use COLAMD, disable some sparse matrix functionality. `--without-curl' Don't use the cURL, disable the `urlread' and `urlwrite' functions. `--without-cxsparse' Don't use CXSPARSE, disable some sparse matrix functionality. `--without-umfpack' Don't use UMFPACK, disable some sparse matrix functionality. `--without-fftw' Use the included FFTPACK library instead of the FFTW library. `--without-glpk' Don't use the GLPK library for linear programming. `--without-hdf5' Don't use the HDF5 library for reading and writing HDF5 files. `--without-zlib' Don't use the zlib library, disable data file compression and support for recent MAT file formats. `--without-lapack' Compile and use the generic BLAS and LAPACK versions included with Octave. By default, configure first looks for BLAS and LAPACK matrix libraries on your system, including optimized BLAS implementations such as the free ATLAS 3.0, as well as vendor-tuned libraries. (The use of an optimized BLAS will generally result in several-times faster matrix operations.) Only use this option if your system has BLAS/LAPACK libraries that cause problems for some reason. You can also use `--with-blas=lib' to specify a particular BLAS library that configure doesn't check for automatically. `--without-framework-carbon' Don't use framework Carbon headers, libraries and specific source code for compilation even if the configure test succeeds (the default value is `--with-framework-carbon'). This is a platform specific configure option for Mac systems. `--without-framework-opengl' Don't use framework OpenGL headers, libraries and specific source code for compilation even if the configure test succeeds. If this option is given then OpenGL headers and libraries in standard system locations are tested (the default value is `--with-framework-opengl'). This is a platform specific configure option for Mac systems. `--help' Print a summary of the options recognized by the configure script. See the file `INSTALL' for more general information about the command line options used by configure. That file also contains instructions for compiling in a directory other than where the source is located. * Run make. You will need a recent version of GNU Make. Modifying Octave's makefiles to work with other make programs is probably not worth your time. We recommend you get and compile GNU Make instead. For plotting, you will need to have gnuplot installed on your system. Gnuplot is a command-driven interactive function plotting program. Gnuplot is copyrighted, but freely distributable. The `gnu' in gnuplot is a coincidence--it is not related to the GNU project or the FSF in any but the most peripheral sense. To compile Octave, you will need a recent version of GNU Make. You will also need a recent version of `g++' or other ANSI C++ compiler. You will also need a Fortran 77 compiler or `f2c'. If you use `f2c', you will need a script like `fort77' that works like a normal Fortran compiler by combining `f2c' with your C compiler in a single script. If you plan to modify the parser you will also need GNU `bison' and `flex'. If you modify the documentation, you will need GNU Texinfo, along with the patch for the `makeinfo' program that is distributed with Octave. GNU Make, `gcc', and `libstdc++', `gnuplot', `bison', `flex', and Texinfo are all available from many anonymous ftp archives. The primary site is `ftp.gnu.org', but it is often very busy. A list of sites that mirror the software on `ftp.gnu.org' is available by anonymous ftp from `ftp://ftp.gnu.org/pub/gnu/GNUinfo/FTP'. You will need about 1 gigabyte of disk storage to work with when building Octave from source (considerably less if you don't compile with debugging symbols). To do that, use the command make CFLAGS=-O CXXFLAGS=-O LDFLAGS= instead of just `make'. * If you encounter errors while compiling Octave, first check the list of known problems below to see if there is a workaround or solution for your problem. If not, see *note Trouble::, for information about how to report bugs. * Once you have successfully compiled Octave, run `make install'. This will install a copy of Octave, its libraries, and its documentation in the destination directory. As distributed, Octave is installed in the following directories. In the table below, PREFIX defaults to `/usr/local', VERSION stands for the current version number of the interpreter, and ARCH is the type of computer on which Octave is installed (for example, `i586-unknown-gnu'). `PREFIX/bin' Octave and other binaries that people will want to run directly. `PREFIX/lib' Libraries like libcruft.a and liboctave.a. `PREFIX/share' Architecture-independent data files. `PREFIX/include/octave' Include files distributed with Octave. `PREFIX/man/man1' Unix-style man pages describing Octave. `PREFIX/info' Info files describing Octave. `PREFIX/share/octave/VERSION/m' Function files distributed with Octave. This includes the Octave version, so that multiple versions of Octave may be installed at the same time. `PREFIX/lib/octave/VERSION/exec/ARCH' Executables to be run by Octave rather than the user. `PREFIX/lib/octave/VERSION/oct/ARCH' Object files that will be dynamically loaded. `PREFIX/share/octave/VERSION/imagelib' Image files that are distributed with Octave. * Menu: * Installation Problems::  File: octave.info, Node: Installation Problems, Up: Installation F.1 Installation Problems ========================= This section contains a list of problems (and some apparent problems that don't really mean anything is wrong) that may show up during installation of Octave. * On some SCO systems, `info' fails to compile if `HAVE_TERMIOS_H' is defined in `config.h'. Simply removing the definition from `info/config.h' should allow it to compile. * If `configure' finds `dlopen', `dlsym', `dlclose', and `dlerror', but not the header file `dlfcn.h', you need to find the source for the header file and install it in the directory `usr/include'. This is reportedly a problem with Slackware 3.1. For Linux/GNU systems, the source for `dlfcn.h' is in the `ldso' package. * Building `.oct' files doesn't work. You should probably have a shared version of `libstdc++'. A patch is needed to build shared versions of version 2.7.2 of `libstdc++' on the HP-PA architecture. You can find the patch at `ftp://ftp.cygnus.com/pub/g++/libg++-2.7.2-hppa-gcc-fix'. * On some alpha systems there may be a problem with the `libdxml' library, resulting in floating point errors and/or segmentation faults in the linear algebra routines called by Octave. If you encounter such problems, then you should modify the configure script so that `SPECIAL_MATH_LIB' is not set to `-ldxml'. * On FreeBSD systems Octave may hang while initializing some internal constants. The fix appears to be to use options GPL_MATH_EMULATE rather than options MATH_EMULATE in the kernel configuration files (typically found in the directory `/sys/i386/conf'. After making this change, you'll need to rebuild the kernel, install it, and reboot. * If you encounter errors like passing `void (*)()' as argument 2 of `octave_set_signal_handler(int, void (*)(int))' or warning: ANSI C++ prohibits conversion from `(int)' to `(...)' while compiling `sighandlers.cc', you may need to edit some files in the `gcc' include subdirectory to add proper prototypes for functions there. For example, Ultrix 4.2 needs proper declarations for the `signal' function and the `SIG_IGN' macro in the file `signal.h'. On some systems the `SIG_IGN' macro is defined to be something like this: #define SIG_IGN (void (*)())1 when it should really be something like: #define SIG_IGN (void (*)(int))1 to match the prototype declaration for the `signal' function. This change should also be made for the `SIG_DFL' and `SIG_ERR' symbols. It may be necessary to change the definitions in `sys/signal.h' as well. The `gcc' `fixincludes' and `fixproto' scripts should probably fix these problems when `gcc' installs its modified set of header files, but I don't think that's been done yet. *You should not change the files in `/usr/include'*. You can find the `gcc' include directory tree by running the command gcc -print-libgcc-file-name The directory of `gcc' include files normally begins in the same directory that contains the file `libgcc.a'. * Some of the Fortran subroutines may fail to compile with older versions of the Sun Fortran compiler. If you get errors like zgemm.f: zgemm: warning: unexpected parent of complex expression subtree zgemm.f, line 245: warning: unexpected parent of complex expression subtree warning: unexpected parent of complex expression subtree zgemm.f, line 304: warning: unexpected parent of complex expression subtree warning: unexpected parent of complex expression subtree zgemm.f, line 327: warning: unexpected parent of complex expression subtree pcc_binval: missing IR_CONV in complex op make[2]: *** [zgemm.o] Error 1 when compiling the Fortran subroutines in the `libcruft' subdirectory, you should either upgrade your compiler or try compiling with optimization turned off. * On NeXT systems, if you get errors like this: /usr/tmp/cc007458.s:unknown:Undefined local symbol LBB7656 /usr/tmp/cc007458.s:unknown:Undefined local symbol LBE7656 when compiling `Array.cc' and `Matrix.cc', try recompiling these files without `-g'. * Some people have reported that calls to shell_cmd and the pager do not work on SunOS systems. This is apparently due to having `G_HAVE_SYS_WAIT' defined to be 0 instead of 1 when compiling `libg++'. * On NeXT systems, linking to `libsys_s.a' may fail to resolve the following functions _tcgetattr _tcsetattr _tcflow which are part of `libposix.a'. Unfortunately, linking Octave with `-posix' results in the following undefined symbols. .destructors_used .constructors_used _objc_msgSend _NXGetDefaultValue _NXRegisterDefaults .objc_class_name_NXStringTable .objc_class_name_NXBundle One kluge around this problem is to extract `termios.o' from `libposix.a', put it in Octave's `src' directory, and add it to the list of files to link together in the makefile. Suggestions for better ways to solve this problem are welcome! * If Octave crashes immediately with a floating point exception, it is likely that it is failing to initialize the IEEE floating point values for infinity and NaN. If your system actually does support IEEE arithmetic, you should be able to fix this problem by modifying the function `octave_ieee_init' in the file `lo-ieee.cc' to correctly initialize Octave's internal infinity and NaN variables. If your system does not support IEEE arithmetic but Octave's configure script incorrectly determined that it does, you can work around the problem by editing the file `config.h' to not define `HAVE_ISINF', `HAVE_FINITE', and `HAVE_ISNAN'. In any case, please report this as a bug since it might be possible to modify Octave's configuration script to automatically determine the proper thing to do. * If Octave is unable to find a header file because it is installed in a location that is not normally searched by the compiler, you can add the directory to the include search path by specifying (for example) `CPPFLAGS=-I/some/nonstandard/directory' as an argument to `configure'. Other variables that can be specified this way are `CFLAGS', `CXXFLAGS', `FFLAGS', and `LDFLAGS'. Passing them as options to the configure script also records them in the `config.status' file. By default, `CPPFLAGS' and `LDFLAGS' are empty, `CFLAGS' and `CXXFLAGS' are set to `"-g -O"' and `FFLAGS' is set to `"-O"'.  File: octave.info, Node: Emacs Octave Support, Next: Copying, Prev: Installation, Up: Top Appendix G Emacs Octave Support ******************************* The development of Octave code can greatly be facilitated using Emacs with Octave mode, a major mode for editing Octave files which can e.g. automatically indent the code, do some of the typing (with Abbrev mode) and show keywords, comments, strings, etc. in different faces (with Font-lock mode on devices that support it). It is also possible to run Octave from within Emacs, either by directly entering commands at the prompt in a buffer in Inferior Octave mode, or by interacting with Octave from within a file with Octave code. This is useful in particular for debugging Octave code. Finally, you can convince Octave to use the Emacs info reader for `help -i'. All functionality is provided by the Emacs Lisp package EOS (for "Emacs Octave Support"). This chapter describes how to set up and use this package. Please contact if you have any questions or suggestions on using EOS. * Menu: * Installing EOS:: * Using Octave Mode:: * Running Octave From Within Emacs:: * Using the Emacs Info Reader for Octave::  File: octave.info, Node: Installing EOS, Next: Using Octave Mode, Up: Emacs Octave Support G.1 Installing EOS ================== The Emacs package EOS consists of the three files `octave-mod.el', `octave-inf.el', and `octave-hlp.el'. These files, or better yet their byte-compiled versions, should be somewhere in your Emacs load-path. If you have GNU Emacs with a version number at least as high as 19.35, you are all set up, because EOS is respectively will be part of GNU Emacs as of version 19.35. Otherwise, copy the three files from the `emacs' subdirectory of the Octave distribution to a place where Emacs can find them (this depends on how your Emacs was installed). Byte-compile them for speed if you want.  File: octave.info, Node: Using Octave Mode, Next: Running Octave From Within Emacs, Prev: Installing EOS, Up: Emacs Octave Support G.2 Using Octave Mode ===================== If you are lucky, your sysadmins have already arranged everything so that Emacs automatically goes into Octave mode whenever you visit an Octave code file as characterized by its extension `.m'. If not, proceed as follows. 1. To begin using Octave mode for all `.m' files you visit, add the following lines to a file loaded by Emacs at startup time, typically your `~/.emacs' file: (autoload 'octave-mode "octave-mod" nil t) (setq auto-mode-alist (cons '("\\.m$" . octave-mode) auto-mode-alist)) 2. Finally, to turn on the abbrevs, auto-fill and font-lock features automatically, also add the following lines to one of the Emacs startup files: (add-hook 'octave-mode-hook (lambda () (abbrev-mode 1) (auto-fill-mode 1) (if (eq window-system 'x) (font-lock-mode 1)))) See the Emacs manual for more information about how to customize Font-lock mode. In Octave mode, the following special Emacs commands can be used in addition to the standard Emacs commands. `C-h m' Describe the features of Octave mode. `LFD' Reindent the current Octave line, insert a newline and indent the new line (`octave-reindent-then-newline-and-indent'). An abbrev before point is expanded if `abbrev-mode' is non-`nil'. `TAB' Indents current Octave line based on its contents and on previous lines (`indent-according-to-mode'). `;' Insert an "electric" semicolon (`octave-electric-semi'). If `octave-auto-indent' is non-`nil', reindent the current line. If `octave-auto-newline' is non-`nil', automagically insert a newline and indent the new line. ``' Start entering an abbreviation (`octave-abbrev-start'). If Abbrev mode is turned on, typing ``C-h' or ``?' lists all abbrevs. Any other key combination is executed normally. Note that all Octave abbrevs start with a grave accent. `M-LFD' Break line at point and insert continuation marker and alignment (`octave-split-line'). `M-TAB' Perform completion on Octave symbol preceding point, comparing that symbol against Octave's reserved words and built-in variables (`octave-complete-symbol'). `M-C-a' Move backward to the beginning of a function (`octave-beginning-of-defun'). With prefix argument N, do it that many times if N is positive; otherwise, move forward to the N-th following beginning of a function. `M-C-e' Move forward to the end of a function (`octave-end-of-defun'). With prefix argument N, do it that many times if N is positive; otherwise, move back to the N-th preceding end of a function. `M-C-h' Puts point at beginning and mark at the end of the current Octave function, i.e., the one containing point or following point (`octave-mark-defun'). `M-C-q' Properly indents the Octave function which contains point (`octave-indent-defun'). `M-;' If there is no comment already on this line, create a code-level comment (started by two comment characters) if the line is empty, or an in-line comment (started by one comment character) otherwise (`octave-indent-for-comment'). Point is left after the start of the comment which is properly aligned. `C-c ;' Puts the comment character `#' (more precisely, the string value of `octave-comment-start') at the beginning of every line in the region (`octave-comment-region'). With just `C-u' prefix argument, uncomment each line in the region. A numeric prefix argument N means use N comment characters. `C-c :' Uncomments every line in the region (`octave-uncomment-region'). `C-c C-p' Move one line of Octave code backward, skipping empty and comment lines (`octave-previous-code-line'). With numeric prefix argument N, move that many code lines backward (forward if N is negative). `C-c C-n' Move one line of Octave code forward, skipping empty and comment lines (`octave-next-code-line'). With numeric prefix argument N, move that many code lines forward (backward if N is negative). `C-c C-a' Move to the `real' beginning of the current line (`octave-beginning-of-line'). If point is in an empty or comment line, simply go to its beginning; otherwise, move backwards to the beginning of the first code line which is not inside a continuation statement, i.e., which does not follow a code line ending in `...' or `\', or is inside an open parenthesis list. `C-c C-e' Move to the `real' end of the current line (`octave-end-of-line'). If point is in a code line, move forward to the end of the first Octave code line which does not end in `...' or `\' or is inside an open parenthesis list. Otherwise, simply go to the end of the current line. `C-c M-C-n' Move forward across one balanced begin-end block of Octave code (`octave-forward-block'). With numeric prefix argument N, move forward across N such blocks (backward if N is negative). `C-c M-C-p' Move back across one balanced begin-end block of Octave code (`octave-backward-block'). With numeric prefix argument N, move backward across N such blocks (forward if N is negative). `C-c M-C-d' Move forward down one begin-end block level of Octave code (`octave-down-block'). With numeric prefix argument, do it that many times; a negative argument means move backward, but still go down one level. `C-c M-C-u' Move backward out of one begin-end block level of Octave code (`octave-backward-up-block'). With numeric prefix argument, do it that many times; a negative argument means move forward, but still to a less deep spot. `C-c M-C-h' Put point at the beginning of this block, mark at the end (`octave-mark-block'). The block marked is the one that contains point or follows point. `C-c ]' Close the current block on a separate line (`octave-close-block'). An error is signaled if no block to close is found. `C-c f' Insert a function skeleton, prompting for the function's name, arguments and return values which have to be entered without parentheses (`octave-insert-defun'). `C-c C-h' Search the function, operator and variable indices of all info files with documentation for Octave for entries (`octave-help'). If used interactively, the entry is prompted for with completion. If multiple matches are found, one can cycle through them using the standard `,' (`Info-index-next') command of the Info reader. The variable `octave-help-files' is a list of files to search through and defaults to `'("octave")'. If there is also an Octave Local Guide with corresponding info file, say, `octave-LG', you can have `octave-help' search both files by (setq octave-help-files '("octave" "octave-LG")) in one of your Emacs startup files. A common problem is that the key does _not_ indent the line to where the new text should go after inserting the newline. This is because the standard Emacs convention is that (aka `C-m') just adds a newline, whereas (aka `C-j') adds a newline and indents it. This is particularly inconvenient for users with keyboards which do not have a special key at all; in such cases, it is typically more convenient to use as the key (rather than typing `C-j'). You can make do this by adding (define-key octave-mode-map "\C-m" 'octave-reindent-then-newline-and-indent) to one of your Emacs startup files. Another, more generally applicable solution is (defun RET-behaves-as-LFD () (let ((x (key-binding "\C-j"))) (local-set-key "\C-m" x))) (add-hook 'octave-mode-hook 'RET-behaves-as-LFD) (this works for all modes by adding to the startup hooks, without having to know the particular binding of in that mode!). Similar considerations apply for using as . As Barry A. Warsaw says in the documentation for his `cc-mode', "This is a very common question. `:-)' If you want this to be the default behavior, don't lobby me, lobby RMS!" The following variables can be used to customize Octave mode. `octave-auto-indent' Non-`nil' means auto-indent the current line after a semicolon or space. Default is `nil'. `octave-auto-newline' Non-`nil' means auto-insert a newline and indent after semicolons are typed. The default value is `nil'. `octave-blink-matching-block' Non-`nil' means show matching begin of block when inserting a space, newline or `;' after an else or end keyword. Default is `t'. This is an extremely useful feature for automatically verifying that the keywords match--if they don't, an error message is displayed. `octave-block-offset' Extra indentation applied to statements in block structures. Default is 2. `octave-continuation-offset' Extra indentation applied to Octave continuation lines. Default is 4. `octave-continuation-string' String used for Octave continuation lines. Normally `\'. `octave-mode-startup-message' If `t' (default), a startup message is displayed when Octave mode is called. If Font Lock mode is enabled, Octave mode will display * strings in `font-lock-string-face' * comments in `font-lock-comment-face' * the Octave reserved words (such as all block keywords) and the text functions (such as `cd' or `who') which are also reserved using `font-lock-keyword-face' * the built-in operators (`&&', `==', ...) using `font-lock-reference-face' * and the function names in function declarations in `font-lock-function-name-face'. There is also rudimentary support for Imenu (currently, function names can be indexed). You can generate TAGS files for Emacs from Octave `.m' files using the shell script `octave-tags' that is installed alongside your copy of Octave. Customization of Octave mode can be performed by modification of the variable `octave-mode-hook'. If the value of this variable is non-`nil', turning on Octave mode calls its value. If you discover a problem with Octave mode, you can conveniently send a bug report using `C-c C-b' (`octave-submit-bug-report'). This automatically sets up a mail buffer with version information already added. You just need to add a description of the problem, including a reproducible test case and send the message.  File: octave.info, Node: Running Octave From Within Emacs, Next: Using the Emacs Info Reader for Octave, Prev: Using Octave Mode, Up: Emacs Octave Support G.3 Running Octave From Within Emacs ==================================== The package `octave' provides commands for running an inferior Octave process in a special Emacs buffer. Use M-x run-octave to directly start an inferior Octave process. If Emacs does not know about this command, add the line (autoload 'run-octave "octave-inf" nil t) to your `.emacs' file. This will start Octave in a special buffer the name of which is specified by the variable `inferior-octave-buffer' and defaults to `"*Inferior Octave*"'. From within this buffer, you can interact with the inferior Octave process `as usual', i.e., by entering Octave commands at the prompt. The buffer is in Inferior Octave mode, which is derived from the standard Comint mode, a major mode for interacting with an inferior interpreter. See the documentation for `comint-mode' for more details, and use `C-h b' to find out about available special keybindings. You can also communicate with an inferior Octave process from within files with Octave code (i.e., buffers in Octave mode), using the following commands. `C-c i l' Send the current line to the inferior Octave process (`octave-send-line'). With positive prefix argument N, send that many lines. If `octave-send-line-auto-forward' is non-`nil', go to the next unsent code line. `C-c i b' Send the current block to the inferior Octave process (`octave-send-block'). `C-c i f' Send the current function to the inferior Octave process (`octave-send-defun'). `C-c i r' Send the region to the inferior Octave process (`octave-send-region'). `C-c i s' Make sure that `inferior-octave-buffer' is displayed (`octave-show-process-buffer'). `C-c i h' Delete all windows that display the inferior Octave buffer (`octave-hide-process-buffer'). `C-c i k' Kill the inferior Octave process and its buffer (`octave-kill-process'). The effect of the commands which send code to the Octave process can be customized by the following variables. `octave-send-echo-input' Non-`nil' means echo input sent to the inferior Octave process. Default is `t'. `octave-send-show-buffer' Non-`nil' means display the buffer running the Octave process after sending a command (but without selecting it). Default is `t'. If you send code and there is no inferior Octave process yet, it will be started automatically. The startup of the inferior Octave process is highly customizable. The variable `inferior-octave-startup-args' can be used for specifying command lines arguments to be passed to Octave on startup as a list of strings. For example, to suppress the startup message and use `traditional' mode, set this to `'("-q" "--traditional")'. You can also specify a startup file of Octave commands to be loaded on startup; note that these commands will not produce any visible output in the process buffer. Which file to use is controlled by the variable `inferior-octave-startup-file'. If this is `nil', the file `~/.emacs-octave' is used if it exists. And finally, `inferior-octave-mode-hook' is run after starting the process and putting its buffer into Inferior Octave mode. Hence, if you like the up and down arrow keys to behave in the interaction buffer as in the shell, and you want this buffer to use nice colors, add (add-hook 'inferior-octave-mode-hook (lambda () (turn-on-font-lock) (define-key inferior-octave-mode-map [up] 'comint-previous-input) (define-key inferior-octave-mode-map [down] 'comint-next-input))) to your `.emacs' file. You could also swap the roles of `C-a' (`beginning-of-line') and `C-c C-a' (`comint-bol') using this hook. *Note* that if you set your Octave prompts to something different from the defaults, make sure that `inferior-octave-prompt' matches them. Otherwise, _nothing_ will work, because Emacs will not know when Octave is waiting for input, or done sending output.  File: octave.info, Node: Using the Emacs Info Reader for Octave, Prev: Running Octave From Within Emacs, Up: Emacs Octave Support G.4 Using the Emacs Info Reader for Octave ========================================== You may also use the Emacs Info reader with Octave's `doc' function. For this, the package `gnuserv' needs to be installed. If `gnuserv' is installed, add the lines (autoload 'octave-help "octave-hlp" nil t) (require 'gnuserv) (gnuserv-start) to your `.emacs' file. You can use either `plain' Emacs Info or the function `octave-help' as your Octave info reader (for `help -i'). In the former case, use `info_program ("info-emacs-info")'. The latter is perhaps more attractive because it allows to look up keys in the indices of _several_ info files related to Octave (provided that the Emacs variable `octave-help-files' is set correctly). In this case, use `info_program ("info-emacs-octave-help")'. If you use Octave from within Emacs, it is best to add these settings to your `~/.emacs-octave' startup file (or the file pointed to by the Emacs variable `inferior-octave-startup-file').  File: octave.info, Node: Copying, Next: Concept Index, Prev: Emacs Octave Support, Up: Top Appendix H GNU GENERAL PUBLIC LICENSE ************************************* Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/' Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble ======== The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS ==================== 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a. The work must carry prominent notices stating that you modified it, and giving a relevant date. b. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d. Limiting the use for publicity purposes of names of licensors or authors of the material; or e. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS =========================== How to Apply These Terms to Your New Programs ============================================= If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) YEAR NAME OF AUTHOR This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see `http://www.gnu.org/licenses/'. Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: PROGRAM Copyright (C) YEAR NAME OF AUTHOR This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see `http://www.gnu.org/licenses/'. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.  File: octave.info, Node: Concept Index, Next: Function Index, Prev: Copying, Up: Top Concept Index ************* [index] * Menu: * #: Single Line Comments. (line 6) * #!: Executable Octave Programs. (line 6) * #{: Block Comments. (line 6) * %: Single Line Comments. (line 6) * %{: Block Comments. (line 6) * --braindead: Command Line Options. (line 115) * --debug: Command Line Options. (line 10) * --doc-cache-file FILENAME: Command Line Options. (line 16) * --echo-commands: Command Line Options. (line 24) * --exec-path PATH: Command Line Options. (line 31) * --help: Command Line Options. (line 40) * --image-path PATH: Command Line Options. (line 43) * --info-file FILENAME: Command Line Options. (line 50) * --info-program PROGRAM: Command Line Options. (line 57) * --interactive: Command Line Options. (line 65) * --line-editing: Command Line Options. (line 71) * --no-history: Command Line Options. (line 75) * --no-init-file: Command Line Options. (line 78) * --no-init-path: Command Line Options. (line 81) * --no-line-editing: Command Line Options. (line 85) * --no-site-file: Command Line Options. (line 88) * --norc: Command Line Options. (line 92) * --path PATH: Command Line Options. (line 98) * --persist: Command Line Options. (line 105) * --quiet: Command Line Options. (line 111) * --silent: Command Line Options. (line 111) * --traditional: Command Line Options. (line 115) * --verbose: Command Line Options. (line 137) * --version: Command Line Options. (line 141) * -?: Command Line Options. (line 40) * -d: Command Line Options. (line 10) * -f: Command Line Options. (line 92) * -H: Command Line Options. (line 75) * -h: Command Line Options. (line 40) * -i: Command Line Options. (line 65) * -p PATH: Command Line Options. (line 98) * -q: Command Line Options. (line 111) * -v: Command Line Options. (line 141) * -V: Command Line Options. (line 137) * -x: Command Line Options. (line 24) * ... continuation marker: The try Statement. (line 29) * .octaverc: Startup Files. (line 35) * \ continuation marker: The try Statement. (line 29) * acknowledgements: Acknowledgements. (line 6) * addition: Arithmetic Ops. (line 6) * and operator: Boolean Expressions. (line 6) * anonymous functions: Function Handles Inline Functions and Anonymous Functions. (line 6) * ans: Variables. (line 45) * answers, incorrect <1>: Bug Reporting. (line 70) * answers, incorrect: Bug Criteria. (line 12) * area series: Area series. (line 6) * arguments in function call: Calling Functions. (line 15) * arithmetic operators: Arithmetic Ops. (line 6) * assignment expressions: Assignment Ops. (line 6) * assignment operators: Assignment Ops. (line 6) * axes graphics object: Graphics Objects. (line 19) * axes properties: Axes Properties. (line 6) * backends, graphics: Graphics backends. (line 6) * bar series: Bar series. (line 6) * batch processing: Executable Octave Programs. (line 6) * block comments: Block Comments. (line 6) * body of a loop: The while Statement. (line 6) * boolean expressions: Boolean Expressions. (line 6) * boolean operators: Boolean Expressions. (line 6) * break statement: The break Statement. (line 6) * bug criteria: Bug Criteria. (line 6) * bug report mailing lists: Bug Lists. (line 6) * bugs: Reporting Bugs. (line 6) * bugs, investigating: Bug Reporting. (line 102) * bugs, known: Trouble. (line 6) * bugs, reporting <1>: Bug Reporting. (line 6) * bugs, reporting: Bug Lists. (line 6) * built-in data types: Built-in Data Types. (line 6) * built-in function: A Sample Function Description. (line 45) * callbacks: Callbacks. (line 6) * case statement: The switch Statement. (line 6) * catch: The try Statement. (line 6) * cell arrays <1>: Cell Arrays. (line 6) * cell arrays: Cell Array Objects. (line 6) * character strings <1>: Strings. (line 6) * character strings: String Objects. (line 6) * Cholesky factorization: Matrix Factorizations. (line 11) * clearing the screen: Cursor Motion. (line 53) * coding standards <1>: Contributing Guidelines. (line 6) * coding standards: Tips and Standards. (line 6) * colors, graphics: Colors. (line 6) * comma separated lists: Comma Separated Lists. (line 6) * command and output logs: Diary and Echo Commands. (line 6) * command completion: Commands For Completion. (line 6) * command descriptions: A Sample Command Description. (line 6) * command echoing: Diary and Echo Commands. (line 6) * command history: Commands For History. (line 6) * command options: Command Line Options. (line 6) * command-line editing: Command Line Editing. (line 6) * comments: Comments. (line 6) * comparison expressions: Comparison Ops. (line 6) * complex-conjugate transpose: Arithmetic Ops. (line 6) * containers: Data Containers. (line 6) * continuation lines: The try Statement. (line 29) * continue statement: The continue Statement. (line 6) * contour series: Contour groups. (line 6) * contributing to Octave: How You Can Contribute to Octave. (line 6) * contributors: Preface. (line 6) * conversion specifications (printf): Formatted Output. (line 48) * conversion specifications (scanf): Formatted Input. (line 83) * copyright: Copying. (line 6) * core dump: Bug Criteria. (line 9) * cs-lists: Comma Separated Lists. (line 6) * customizing readline: Customizing readline. (line 6) * customizing the prompt: Customizing the Prompt. (line 6) * DAE: Differential Equations. (line 15) * data sources in object groups: Data sources in object groups. (line 6) * data structures <1>: Data Structures. (line 6) * data structures: Data Structure Objects. (line 6) * data types: Data Types. (line 6) * data types, built-in: Built-in Data Types. (line 6) * data types, user-defined: User-defined Data Types. (line 6) * decrement operator: Assignment Ops. (line 152) * default arguments: Default Arguments. (line 6) * default graphics properties: Managing Default Properties. (line 6) * defining functions: Functions and Scripts. (line 6) * description format: Format of Descriptions. (line 6) * diary of commands and output: Diary and Echo Commands. (line 6) * Differential Equations: Differential Equations. (line 15) * diffs, submitting: Sending Patches. (line 6) * distribution of Octave: Distribution. (line 6) * division: Arithmetic Ops. (line 6) * do-until statement: The do-until Statement. (line 6) * documentation fonts: Fonts. (line 6) * documentation notation: Evaluation Notation. (line 6) * documenting functions: Comments and the Help System. (line 6) * documenting Octave programs: Comments. (line 6) * documenting user scripts: Comments and the Help System. (line 6) * Dulmage-Mendelsohn decomposition: Mathematical Considerations. (line 408) * dynamic-linking: Dynamically Linked Functions. (line 6) * echoing executing commands: Diary and Echo Commands. (line 6) * editing the command line: Command Line Editing. (line 6) * element-by-element evaluation: Element-by-element Boolean Operators. (line 6) * else statement: The if Statement. (line 6) * elseif statement: The if Statement. (line 6) * Emacs TAGS files: Using Octave Mode. (line 256) * end statement: Statements. (line 16) * end_try_catch: The try Statement. (line 6) * end_unwind_protect: The unwind_protect Statement. (line 6) * endfor statement: The for Statement. (line 6) * endfunction statement: Defining Functions. (line 6) * endif statement: The if Statement. (line 6) * endswitch statement: The switch Statement. (line 6) * endwhile statement: The while Statement. (line 6) * equality operator: Comparison Ops. (line 6) * equality, tests for: Comparison Ops. (line 6) * equations, nonlinear: Nonlinear Equations. (line 6) * erroneous messages: Bug Criteria. (line 22) * erroneous results <1>: Bug Reporting. (line 70) * erroneous results: Bug Criteria. (line 12) * error bar series: Error bar series. (line 6) * error message notation: Error Messages. (line 6) * error messages: Errors. (line 6) * error messages, incorrect: Bug Criteria. (line 22) * escape sequence notation: Escape Sequences in string constants. (line 6) * evaluation notation: Evaluation Notation. (line 6) * executable scripts: Executable Octave Programs. (line 6) * execution speed: Coding Tips. (line 6) * exiting octave <1>: Quitting Octave. (line 6) * exiting octave: Running Octave. (line 16) * exponentiation: Arithmetic Ops. (line 6) * expression, range: Ranges. (line 6) * expressions: Expressions. (line 6) * expressions, assignment: Assignment Ops. (line 6) * expressions, boolean: Boolean Expressions. (line 6) * expressions, comparison: Comparison Ops. (line 6) * expressions, logical: Boolean Expressions. (line 6) * factorial function: Recursion. (line 6) * fatal signal: Bug Criteria. (line 9) * figure graphics object: Graphics Objects. (line 16) * figure properties: Figure Properties. (line 6) * flag character (printf): Output Conversion Syntax. (line 28) * flag character (scanf): Input Conversion Syntax. (line 34) * flying high and fast: Variables. (line 14) * for statement: The for Statement. (line 6) * Fordyce, A. P.: Calling a Function by its Name. (line 16) * Frobenius norm: Basic Matrix Functions. (line 194) * function descriptions: A Sample Function Description. (line 6) * function file <1>: Function Files. (line 6) * function file: A Sample Function Description. (line 41) * function statement: Defining Functions. (line 6) * functions, user-defined: Functions and Scripts. (line 6) * funding Octave development: How You Can Contribute to Octave. (line 6) * general p-norm: Basic Matrix Functions. (line 197) * getting a good job: Variables. (line 14) * global statement: Global Variables. (line 6) * global variables: Global Variables. (line 6) * gnuplot interaction: Interaction with gnuplot. (line 6) * graphics: Plotting. (line 6) * graphics backends: Graphics backends. (line 6) * graphics colors: Colors. (line 6) * graphics line styles: Line Styles. (line 6) * graphics marker styles: Marker Styles. (line 6) * graphics object properties: Graphics Object Properties. (line 6) * graphics object, axes: Graphics Objects. (line 19) * graphics object, figure: Graphics Objects. (line 16) * graphics object, image: Graphics Objects. (line 29) * graphics object, line: Graphics Objects. (line 23) * graphics object, patch: Graphics Objects. (line 32) * graphics object, root figure: Graphics Objects. (line 12) * graphics object, surface: Graphics Objects. (line 35) * graphics object, text: Graphics Objects. (line 26) * graphics properties, default: Managing Default Properties. (line 6) * greater than operator: Comparison Ops. (line 6) * group objects <1>: Surface group. (line 6) * group objects <2>: Stair group. (line 6) * group objects <3>: Scatter group. (line 6) * group objects: Quiver group. (line 6) * handle, function handles: Function Handles Inline Functions and Anonymous Functions. (line 6) * header comments: Function Headers. (line 6) * help, on-line: Getting Help. (line 6) * help, user-defined functions: Comments and the Help System. (line 6) * help, where to find: Service. (line 6) * Hermitian operator: Arithmetic Ops. (line 6) * Hessenberg decomposition: Matrix Factorizations. (line 121) * history: Preface. (line 6) * history of commands: Commands For History. (line 6) * if statement: The if Statement. (line 6) * image graphics object: Graphics Objects. (line 29) * image properties: Image Properties. (line 6) * improving Octave <1>: Sending Patches. (line 6) * improving Octave: Bug Criteria. (line 29) * incorrect error messages: Bug Criteria. (line 22) * incorrect output <1>: Bug Reporting. (line 70) * incorrect output: Bug Criteria. (line 12) * incorrect results <1>: Bug Reporting. (line 70) * incorrect results: Bug Criteria. (line 12) * increment operator: Assignment Ops. (line 152) * infinity norm: Basic Matrix Functions. (line 190) * initialization: Startup Files. (line 6) * inline, inline functions: Function Handles Inline Functions and Anonymous Functions. (line 6) * input conversions, for scanf: Table of Input Conversions. (line 6) * input history: Commands For History. (line 6) * installation trouble: Trouble. (line 6) * installing Octave: Installation. (line 6) * introduction: Introduction. (line 6) * invalid input: Bug Criteria. (line 24) * job hunting: Variables. (line 14) * known causes of trouble: Trouble. (line 6) * less than operator: Comparison Ops. (line 6) * line graphics object: Graphics Objects. (line 23) * line properties: Line Properties. (line 6) * line series: Line series. (line 6) * line styles, graphics: Line Styles. (line 6) * loadable function: A Sample Function Description. (line 49) * loading data: Simple File I/O. (line 6) * logging commands and output: Diary and Echo Commands. (line 6) * logical expressions: Boolean Expressions. (line 6) * logical operators: Boolean Expressions. (line 6) * loop: The while Statement. (line 6) * looping over structure elements: Looping Over Structure Elements. (line 6) * LP: Optimization. (line 18) * LU decomposition <1>: Iterative Techniques. (line 279) * LU decomposition: Matrix Factorizations. (line 137) * lvalue: Assignment Ops. (line 33) * mapping function: A Sample Function Description. (line 55) * marker styles, graphics: Marker Styles. (line 6) * matching failure, in scanf: Formatted Input. (line 88) * matrices: Matrices. (line 6) * matrix multiplication: Arithmetic Ops. (line 6) * maximum field width (scanf): Input Conversion Syntax. (line 42) * messages, error: Errors. (line 6) * mex: Mex-Files. (line 6) * mex-files: Mex-Files. (line 6) * minimum field width (printf): Output Conversion Syntax. (line 35) * missing data: Missing Data. (line 6) * mkoctfile: Oct-Files. (line 6) * multi-line comments: Block Comments. (line 6) * multiplication: Arithmetic Ops. (line 6) * negation: Arithmetic Ops. (line 6) * NLP: Optimization. (line 18) * nonlinear equations: Nonlinear Equations. (line 6) * nonlinear programming: Optimization. (line 18) * not operator: Boolean Expressions. (line 6) * numeric constant <1>: Numeric Data Types. (line 6) * numeric constant: Numeric Objects. (line 6) * numeric value <1>: Numeric Data Types. (line 6) * numeric value: Numeric Objects. (line 6) * object groups: Object Groups. (line 6) * oct: Oct-Files. (line 6) * oct-files: Oct-Files. (line 6) * Octave command options: Command Line Options. (line 6) * Octave development: Contributing Guidelines. (line 6) * octave-tags: Using Octave Mode. (line 256) * ODE: Differential Equations. (line 15) * on-line help: Getting Help. (line 6) * operator precedence: Operator Precedence. (line 6) * operators, arithmetic: Arithmetic Ops. (line 6) * operators, assignment: Assignment Ops. (line 6) * operators, boolean: Boolean Expressions. (line 6) * operators, decrement: Assignment Ops. (line 152) * operators, increment: Assignment Ops. (line 152) * operators, logical: Boolean Expressions. (line 6) * operators, relational: Comparison Ops. (line 6) * optimization: Optimization. (line 18) * options, Octave command: Command Line Options. (line 6) * or operator: Boolean Expressions. (line 6) * oregonator: Ordinary Differential Equations. (line 145) * otherwise statement: The switch Statement. (line 6) * output conversions, for printf: Table of Output Conversions. (line 6) * patch graphics object: Graphics Objects. (line 32) * patch properties: Patch Properties. (line 6) * patches, submitting: Sending Patches. (line 6) * persistent statement: Persistent Variables. (line 6) * persistent variables: Persistent Variables. (line 6) * personal startup file: Startup Files. (line 31) * plotting: Plotting. (line 6) * precision (printf): Output Conversion Syntax. (line 47) * printing notation: Printing Notation. (line 6) * program, self contained: Executable Octave Programs. (line 6) * project startup file: Startup Files. (line 35) * prompt customization: Customizing the Prompt. (line 6) * QP: Optimization. (line 18) * QR factorization: Matrix Factorizations. (line 197) * quadratic programming: Optimization. (line 18) * quitting octave <1>: Quitting Octave. (line 6) * quitting octave: Running Octave. (line 16) * quiver group: Quiver group. (line 6) * quotient: Arithmetic Ops. (line 6) * range expressions: Ranges. (line 6) * readline customization: Customizing readline. (line 6) * relational operators: Comparison Ops. (line 6) * reporting bugs <1>: Bug Lists. (line 6) * reporting bugs: Reporting Bugs. (line 6) * results, incorrect <1>: Bug Reporting. (line 70) * results, incorrect: Bug Criteria. (line 12) * root figure graphics object: Graphics Objects. (line 12) * saving data: Simple File I/O. (line 6) * scatter group: Scatter group. (line 6) * Schur decomposition: Matrix Factorizations. (line 414) * script files: Functions and Scripts. (line 6) * scripts: Executable Octave Programs. (line 6) * self contained programs: Executable Octave Programs. (line 6) * series objects <1>: Stem Series. (line 6) * series objects <2>: Line series. (line 6) * series objects <3>: Error bar series. (line 6) * series objects <4>: Contour groups. (line 6) * series objects <5>: Bar series. (line 6) * series objects: Area series. (line 6) * short-circuit evaluation: Short-circuit Boolean Operators. (line 6) * side effect: Assignment Ops. (line 26) * singular value decomposition: Matrix Factorizations. (line 442) * site startup file: Startup Files. (line 11) * speedups: Coding Tips. (line 6) * stair group: Stair group. (line 6) * standards of coding style: Tips and Standards. (line 6) * startup: Startup Files. (line 6) * startup files: Startup Files. (line 10) * statements: Statements. (line 6) * stem series: Stem Series. (line 6) * strings <1>: Strings. (line 6) * strings: String Objects. (line 6) * Structural Rank: Sparse Linear Algebra. (line 242) * structure elements, looping over: Looping Over Structure Elements. (line 6) * structures <1>: Data Structures. (line 6) * structures: Data Structure Objects. (line 6) * submitting diffs: Sending Patches. (line 6) * submitting patches: Sending Patches. (line 6) * subtraction: Arithmetic Ops. (line 6) * suggestions: Bug Criteria. (line 29) * surface graphics object: Graphics Objects. (line 35) * surface group: Surface group. (line 6) * surface properties: Surface Properties. (line 6) * switch statement: The switch Statement. (line 6) * TAGS: Using Octave Mode. (line 256) * test functions: Test and Demo Functions. (line 6) * tests for equality: Comparison Ops. (line 6) * text graphics object: Graphics Objects. (line 26) * text properties: Text Properties. (line 6) * tips: Tips and Standards. (line 6) * transpose: Arithmetic Ops. (line 6) * transpose, complex-conjugate: Arithmetic Ops. (line 6) * troubleshooting: Trouble. (line 6) * try statement: The try Statement. (line 6) * unary minus: Arithmetic Ops. (line 6) * undefined behavior: Bug Criteria. (line 15) * undefined function value: Bug Criteria. (line 15) * unwind_protect statement: The unwind_protect Statement. (line 6) * unwind_protect_cleanup: The unwind_protect Statement. (line 6) * use of comments: Comments. (line 6) * user-defined data types: User-defined Data Types. (line 6) * user-defined functions: Functions and Scripts. (line 6) * user-defined variables: Variables. (line 6) * varargin: Variable-length Argument Lists. (line 6) * varargout: Variable-length Return Lists. (line 6) * variable descriptions: A Sample Variable Description. (line 6) * variable-length argument lists: Variable-length Argument Lists. (line 6) * variable-length return lists: Variable-length Return Lists. (line 6) * variables, global: Global Variables. (line 6) * variables, persistent: Persistent Variables. (line 6) * variables, user-defined: Variables. (line 6) * version startup file: Startup Files. (line 21) * warranty: Copying. (line 6) * while statement: The while Statement. (line 6) * wrong answers <1>: Bug Reporting. (line 70) * wrong answers: Bug Criteria. (line 12) * ~/.inputrc: Customizing readline. (line 6) * ~/.octaverc: Startup Files. (line 31) qtoctave-0.10.1/qtoctave-info-reader/test/texinfo-3.lzma0000644000175000017500000010410611511434231022113 0ustar lucaslucas]* 'd_>s4Frfs cJ{8iE%Q 1#P7uxki+_ Y PW&rKVt'X6 " 52!2{P&TF n(>-F2.+=yѪ-;ݐb% *IݓǕnea- Lya&1L2;۵ -۱@ . vKkgX+0aoW~)K2{v/3d*A1\^P_mz5)M%.C 1r;,֬m$"Ii}F3C:cpd؆";_?چ2aՎ4ṇ!2@|J|& JEy/ vmZgٿ6&}2W$Yyʏw9e}J: 9;\KxE-"1!XwKhqݱԣ#\etK(zҨ^.Kz,u!4;c%W-OU^]bMTm!ŝ|\M'8 Ӓs6@+D8G2ƽG%D64}Cahom|qF;U޶vꑭﻙi ).p(}WEе#T#R0 {HQ HNAZ a,d=KbGL\ H#"l_x@˳1qe'tgP4Iq0G1ɜF{Cc'pܛN5C2Q5>\ߴ\|kOvCjN iHdǴ4фJ,n}2 (!ȿ w#m YJLyr:6ݩX%LKpۄ g'a3ŐP2P־6`~|*<-#׊ԃVﭭķ<`ȪTۅJ>rwGtz(_6OwyP*Ϭ0ZHӗUnr2+7.p]mmuӧ񧱝qhhAa c;QkKJɭ5FD勋yAWiϙ[eY- l;:W? Op?rȒ+?r=8 s11ߘ8yɾ@(hIBQ-7,dedÃs!-;Qv)<4e%!Q+qTgaӚ6UD$l ʇ6m{>8 a`㧔zTkbqF=# _! pҿiLџ غ@h oZꁭ=}zK}M1axcdՇ;k ]d6qDT>,ʞ -&KaU`JAoѪ &51TcbkPA_ZuW$xJb`W 502-7` 8"(8{ⰴփtL\ؾLG><{lA7X]_.2tacZWggT Z\mG֏}tAE.gY}V);a\& ^>ի\6u}kʔ1YnXRUBӫS)iD Q5ˁ0d`$q"/'&.74<|k}5BWٷؽ$2{L \NG1cҼO9}NA0Xl]nJ7ߺ,ma]OTf,qJLźc f2v@ 1k] ȁ  "amg<2 -72O@) ;dIqN3j^0OxP)w#\p" cf{sDyXG(>mh. mD!8QUw, ʀ5Q>[ `qjY;hDzV.. w7w'L]1*Qʲ~ĵ~2|2X0>uO9p9 3YPçe_m6~-?-Ј0[Z$R<-e S8z+o +?^q_#1nR^/V66vI;#2P*b13tOBJm x7+U:̸OD|ɪJ KƜjf'tCz(i țSH%p2*WcoaDZ+?{_6ȳy q)Rrp5wK s9&o' c%Q?珲$Y`o$0D< 63uCDʽ(0*,F~54#peMi܂R\@PkZꖡfRBjj҅!)Gnf >4bixj x9J(`6Pb b*WռЙBA &8v蕝yljF/4"w7=??%|EIr s]R쁏˕Inǒt|T+ewD`CVJk:MM)!%Ry~xtMDM2G:j0:v_!^ȥFvvKAM|oԆYƲ@poo=#[O ߠ(|gHlj8 M' pRŁ(=wnOF%ĠYи2bSOlɳ7jw}6KC%~P8mܢ"25j}9n s"`o94(EpffnoF //VNZxoZW g0BK]}n9{EMBunV~u2gksNCi.SLE1MQ# <K,Hbqi!I;N.J-ODbθY5d;HQ&`mB(1 $xWB(/X#D]_ '6gع9]v:Dz;E,tq~ՁX)q |1ė]{sLwsUnL} $Jƾ_r[rغ-3NA.tz̸ϰߧQӇ?")9' h,Х&)}[ڋ>ݪ̌eQjlw"g[ b`YW)gEVMU?siq磼o-:zcRoq >ylW= +lX)#"u;X+]ڄ_i.OsƛԨM  A8P`F3 9NO'e#3'f_ ajFюxOX A76{Il%9qMF 9+˃X zPzAeİSFkpV- _n1؋]cs 9Wp㭒^Ç,ʹv9018#W@@wX܌0;}UBozқYې|gpst0ZsPLƅһMdZPVBuGN`9KbsQ›x~ 5PzߪR󋎺S0!nɅ=0ܲH!pQ5H./ 8 I$uI?F]=qןZ V+ߺ\ 1[E$-mU,symM8ڐ)qcm<aE!8I~VEдu{ȓ sU)SM"YU oL] E(O 5(:?[Ӊ#T5V$H~dW"DZ(hiO>ݳKM&*8mN$)/xbY*ś d:5+{ [:sّ_σ?1q]#hT֯-ͻg +ۨ'<7j!}V `[);q3 XO᱑GTQtiCmK{)Dꂈ#SK5 =5;;GLB֦0 b>nPKC{V<~ A?ܢj.bêT2rF6.>}bTvfEȵʂjqOc5rԥIkQz4,3Wk8 ^+}ٲ EQ?m O j?,q |.|^6U>9,`H^mhL$b- eݨjeah5vb_Y]Ըz"RCa{'QٟYvCHHQIh"3+^-Ki$odea !akmG%kO/$K0v9ա0xdYQRB(I/HM澤"*chn$G)c%yge̫<@h.DUl?s vA. ivS03Q5kZ]ߦF OQh<ܫU|RڡaЪD1mD#šs+5ssA@KR.\ee(j_t̜݊5ErX:>`DO%c+EizCmbZ$ ݜ_I 'O^{)9LWB2wxgH _:,;iGIɼ1Q=>7l=ѨkD8)luDڦW+S'H4O~,@ʂ5Fv KY:U['SuZI]/J -E1ȶAd F/^P!6yoTt!!Yd/S7QY$/W޲D{ZpANBuCf|GyEnRlBEpl`=ԆG@|lLfs_01]${K8#.oc|Sr7(NENe$Dj3L:x/kZހDY=NSw({m />C1Wkb,=}V3׊!3q@MsqSgW|! Us|1LR3N'ҁqg3,˗z3(_cnsH 8u|DhOJè@ϼ*xς(cJj UL$Ф˶Z >R']bsE'mg(8}r3JI}O4uQk`7IIuvsyjv(2XjF&?56 tqV21=V%m\#>oKaGmT:Ռ#.p:YȜ | nNtQFV{ Fj ua9~L%}bČ͡toO?_-ވ=#O(3X kC&*rBxV1wO;FUP.a"3D _?x hN'd 5jIi4dw0ܼc&5yү @G8]c3P~Ó[ q9F:vk9'#u}/u 6㽺~f9trR1\OYoI cErd#]`#YSf&n92ҽ;'Tր}yXB$fhumB ag..i49\ǂR^ MI6ƽ[ j813rʳMMdWG l6uqTf߄;P_V+jn=t6HW=(:trP;J)ј X@p:9+ w0 /\a;7SHК{Yתul-:%ۖyq|V/&N:ȪyalM~Txq^5fo.xeP͓{(D"d;EY\[ۤ!f"iE{d;rł"" =9ɺޣa:}+-A\vZ+j)~R < *Xb^)&?seN3Y րSf"m{_y  ̩墭kAhB+FMqXw~'X^ΣAo`^B\?MJ9-A;yӾی{ȊO39َL]"C,B'y, UBuL&=N&{{3|[s-!\C ՗lWKC "5%"dPr<~_2mR)mN 5 @.K%06/ң=jŤiK{G= Fє.R[tW+hM_drXI3{rmس`;C|w0 fKw' we$Cwt]oJ`4|5Ӛ"KU3 P1Ulmg__֛}MSg{D,zY^i~-z^,z)>8S碷NVqЈ4` )Hjb|ӿEVZSg&֐#[sC7T9&)Ź$0%x9pppm/4{CS ȞlQQ Q[}\"ƔOR4Ek~귐hCX!MZ]5\˨Q/T\l#oϲtkԘE^h渲֩͠BH#ȶCù.tc_"E!8""̰E_تJM'+t3lC4L^ O>gUD m˕.rC^VAiJ hwa|$'\,Xn;m0/[u^OiVsĚ @TlZG(,s}BjOQBqO*_*%DH\.%MBGmY7oI׵2pT z|k9a#_Pnȍz% Wm6%C^TLeBDa kʯj+>@bhuׁ&(#p*7@Fy?Z>ܹveDT3{d_tƅP7moSzSjW;ٱs("rK>8C ,[ėWGU@R-A:Wc%Au%Ʌl{Uj-):?j'`. Wx_@sqЁksmc!b|@[T\ +^AEh_e@97(vi]f>LjEErfIsQڼ\Up= Y\kU6KNޗ;}ϡ5#9kyKʪ0 *ØnEݑ,(Y2a&=Ա=yAl#&ú`D 1`b 8ч%,-wWY}5zqf1?c9(26ƩN;2Sd'K)8]_H%M1+: ڕ@xW$%֌ ؐJÞS¢^ #QހԜ"Gc=]- d l4a>`8KQp0YGGnSs0JPCk؇@HKi-f"t7˛yREtۿ{ _erjw '2YDL|X_e&uց+f<7q_@I?m$MuG򲞅8#cJ}24MY橢tDpn?gc;%Χ >fd?`RV^ S)QiԳT[_`]rCn5f&o1a4Vz 8{dSYj16_>SN5Jx!Y =vE16?5 16!Z(#)sd{4[3&sw1-T5;T_q_ 4dV\mԿN O)k{N].\vzRئy\# #hN%uQZtp1>ju.Ã6? D84]wծ\YH3[wZql*dD2nXÂ^pϾ#MӸ_AoܿbD1\^زDEVW9(x*ّ "=Ǭl+q;ʤwiH5 ,#1ʏ JHwL\m~>wٳS-װ aw{mżJFA.e"Z[ϛ~L9RMFT^s|[eyUv\46( 7 ,o}.2+%W1?6'BNImה"jHuUe$/nkw =kpV$Q™@"-I<9zCE'Kcev&=)dK$?}P+^m~Y|CnѮ[-l+|3UTf=峎ԕ"jz>i+#"&:hDJ!QhN l2y1-Y Y~( J5Hj2u=:xܣX6?˵w~wy钴*"ywcKpXHwnFfG7v*I }n7ށX 'b:H2 g>-یCo=Gzo|&GjQjeEvоƘb?sZ1r,ܯa*6Ezs% ]? /[ nScʢfOm{N qTVE+3Р@|I7'IOvJ!:0`ܞ/=݈EfU|jic]|"6ѩF(9$d+a)^ytB,Фe(ճ۲ DjqBw4`\LgZ'. r2QhmCJnD~{1Ztv)X},+OhZr7#7J`NA^Wr|*S#/ ;TPGϯk}Qq7b&7HPyMo‚ VZ?ݓd6ObrN21Y Ѱ=o+81nKS N;3a93'}:!u -\c=87TPdcBO@)O> (oס*Wy1- WS!hGR5s K/eqCѪTO 2P@X˹ôvM=(RjaD FyS)1 ];^܇ <oP fZCy[,Έ 1`8A>ra,NˣӣPkŨ\qDج.6B`tO/˙'Ɩe^yKH:Uls]\<#nNA=w@.P5R3R$@N} &ΩH xpBW2qQb% -W5MTSgBvDw4L٨'DX]P1lC>_!v&:ꔟ",VB`Vgo:{FjoBc{x7+axcȂ;xu$vB&'7f:`uJ3'Qp LԈzLD$ZH=VS1{X藔>֊lAHQp+UЕPtB5<)2i>uUUS_ThV!8p_yWqw)ؖ, ½WijfumZjaW8+(u õmd-i'~QC (y3Aua~+QKX{Gda T3w+]0*;vT?AZS蒻=FhҍA);>{CoG\~3 `ӷu1}rDM+bcF_xS!)a9:|is*L ;mTB֕nb#ʱuז3:aw3tn$B"J"`4J ޼I^XFw55hyAOr4E{C{wC19 C̰R-1BX[*OՊGlv:C仭*4sx,SƠ3G[  5[ LIuЫM}jB'^] 6Ů^ʩ]z(\\KSM9LhLkCICY]~Pk"8$sLg _Fi "lD4S;1։Tf=U X0flZ`tFdE+tKd<Iß7JeycG ig}sr{bz~MІڟ ѡibв H <r>uV b2p I+HH GRr.f>k2?ںLK6#.jM/&Y47lvn&Iyo9& mlRpNb_ Ƌ\=!N:Qd-pC4ɚ~<Ǚl*ά|MڊMxM%,%Kg|WyzgVaPR?šʭF}usL(2 {tmX!4qhF7FyZMnT2vL *YlWt:6^VM[tccM,PZ3L)'c_=8{=,!B$ڕ '9=S [لŇuRRYwL*'E-뙧M⾀rt-23[u` "SL6}/N4Z$ovhy^Pti I?9<1-)I$33q.RwWf{PtI_lc'ᦴYϊEmo7iy l+ޡ:]2?[%wԄ\6[-k_V6S?.tBK#lwo<~%qBY^]>%-v Mtq+= \uXN[ SxC.aq@eo心n5tt5)Oi}53@#2@4ZВ}% u0}X`>kj .ǮŠ++Őo\Nퟮhh(*rJ'vyK9E=_V=XUI'Y]n Jюo-8ح$,ytiz&Bֲ{)Gje@l~PhहZ]Zۉzƞ-GM< {aLkXc!Y9$@vgꉝ4Tn?hZ[Us'XP$!Qb$ |9yq\:^hBo[l]84')=B1WBE-Hێ}{f^*o"㕁>;J68;1?u A4Gz_hQs=|)*qD=>(k{'Ice^>)X!t+/b^F3R)w 87w.:w,`KOrc{DF(i.p_pIOVIɼ-i,?%vųF2ڸgF J; w |nT Q3i+ud6.`ր'wQqŦOώU[$m] wTqcN^9552iTh+{_%Wrig7ONw?)~%`•΃cLFc-7.#6Q3jtL{[D}C8LƚK ӑl<žj95X)EfCdhFc_? Qv뻿yY;ScbH;I6W <Y?5)*'O[Ag#D,AP$N k߅f pZwx];RrMU"[Eca:[C؂X0hu& PD5sxeh5CςebPZٽM̶8<8M [j}r1Ws*~?~ҹ+ 5r$7U`sM;=Aq2Gnf2< 2c,vZ2#4y= TPa(7 B zG덗hϔei2kל1$ԒE.rLh/vcm/%%EP(l U]^bXt)${P{N&*~x[6|K:?M\/Qn-k/|^ 9Ym}yRZufc*SnK#`TBnGZG">e6 P"aE\:`|vbM0-9 \ bY{5ً{Sؙ] @&4*A8PӖ9Jup5eKC0z!Gǘlp?+hv6uCBq{Q]>Ujhp_XEFQGN </X2V+3Ջ!sSb~rwֳ+^(nN=fZמ>4% J74Bj噼z39<[Ov( p皟A7t>ʱ1YdAJrrl7a=Hl݈،~t1`Z5]Emy\{p x VC){3o' i5<#<3m-N߁\d'kd3I3z? */mjEVSَBS$jO4Mg]` _rVA'|HQbKzu0ftBFN&dNAPS.DH.dMX?F= |awrMu[0 w7x^_8&\JHa`/C H \&!t8GJMݳ"У̢Mh]qr pakwaza$^;""Z-Ů{=?^7tyE[DAdl4 ѧ-zՖ9Yz`*,)e loaE{bdQJ3 tOSdCoɝix֗B;uTס>|Ͷ\dߜUP0R'A֖5\b؞gxl!MQ|/)ul1&v< B\bsf=})o2@=A1ƺtnBl><]7Uٟ 1g]*0  'e!=s SS֋o knTgysZC씐ѨPI ݯr>$rPh)X @w23n$=>mcq7kv3ʘ[³0j i%aeܽOh쫚U#z*dj7(#}kZO"p ajy%#\) &ҴCjT/gŜEP3W0t3.&AƋF]U:bM l-Xt=.CNo:qp pC; NS(斈٫u.# 1-$hkmS04W3Sg'Ik Pٖ,[ 9M*v)R9~u*: ,;eu}^p1h84^jDre *bֳ7lep22 EiVC4/6׌1T &]ǂ߯'D+]AyEX)nWW.McU,o833SYp{Xc5<%*Xs:mΨ9t>vC#f-} F%ASě,x=ٕS6Mzϝ{: !>ᕰ/bS{Swugj~+ Aۓ6 /wíT AmmP!ky1?Fod~QRcnjjD:Gl}d7$8ҶtBqO5loYT ej׽B-+lRhzT'rŨQNj}dK ~%Okv8˗he InA7NN+OĖYVuSb%!Kܴ*9 #ri,|%$ыO6$g/lP:}c̤Pi74;*Dl)[L;챜k<\@V^ vl!^ezhU,7Ed,Ti=;,,<3HgqHFVFMOt@uYN l3[͢wu%V>/R>̓EG;O7xMLOHiwW^35w sjMQNpW6Ya* 󁖲h;# +er"I5EUrگD6/h[(O+#%5'ke{-([ 3N ]h{uM|-75Eicǟ=9~8Y/'\0\O([o$gY& Iפ,ފG (=2 ȏ<{*z`d,;g;9; qW>Voo?YjY8%FX.G1鴱o A#$[h%lBTFlAz+aM{GhytuCFF\.W;iXF}r07glq0TA}l $)0$xD>Ο%[?̧>N~3"$+=FA/[h23kc6{RDh(Og?(جbϤϦ1WTR>;Bˍ5ue~a͘br=:`NLl^Ϫ, H%GиSf+V*g:pJ_'mXp?#C~G dO, k|c|q2; .`Qf"ѺYnԖYn.4Mj)>ڂ%9}7:P8~VD"!ʀY&~޴d ǬIϬx_dכ:z Aonm\t3jnxmx篑y)YFcu3#5ŶLawRHlvmCP]>Y 6!p/arb# @iQ\Eq~@ܙa4bw TbaxRzKըHP`Y<%ٰ= ؕOWA3?_LȋeRPx6SWM:70`EzG.ċ0Oe"6H%TY =5JTt ߌ8%ژL;]r|s0XfG-u\\+!zAgLWzOxʌt~ܟ-`- QBs4J`)do $=vD˷Mr;|2t) 1k8|VӹGlpnG ?.vy\ߟ5">1J/gpwu)4.%#_\,b N#̐bP,I``J QؽvV)^'H痷m4o;]0tͽ;1Yu?Y\h؄oHAeRi"F`z%J40v(m /s-xNWIطeqd1~ԆKBA}EDŚPݳ:djFaa'0E-޷= HMF}i2TzϲGe!̿ELF{fu-hjISJt& ֩@1XYu?[Ա$*»> P)0e%YFvJ8(#~|6|~'1('%= ]E- c.@F3x#2kMnul~&4.Le["| HLU\3 |B5&+9L󜼙^Dz(b~9LU>wh.0.' 6B;WPQ. '`(g|{;Dv菹B PNwOJig~W\OrPԮXĎ8ZwS5IgoZw3l \EM.܍/ ×P׿i 'XiVa=D̥sba3<|< XqMLxD>\_Ӷ|!2T;5J4 Z? Evi2nMժ"`( _I XG,n ;~ccڳZy)5"Yyg3qxsSJWZ +J3?KvVP1o-B<'Q6c,ʓ6VPM _M-< y[ƥ+xM=z$V<5"^Zӂ <Ӄ|`ձߗHٓl:"ɾV؅r(%e<%8&P27-jXuZ+sh΀ ə%=9ȝC!Z^$$ eWhtnh68Hy3maX3F(%%rkq)@'WsNkTW4=z {nDQP] )?\E+8@Lj 3ahQ]عN.κVB5WQ5ݭ w9Z"`E<feV[3D:$xq,܏koV֣|C6 C~B /_*Ŏ@0M yUW (Ax {@<1[tN?5*$ܪL~r&rVwtE>C:W\i5ޞwkhnrÙ 妁ܛ^ NWJ:>L9& 0@Q#"^hyJb#S_ma< .rWOr J[?2l ګ yQoO"WhY#AM4o!Hj^b ե=¨ArJ!-AGx_?l2ڑn }x Bv;HB,T }p:C]] 0أپs4xQ&:Oa p S4Ϊ?X*NS-]}~m:5̝kK oB)e¯C;[ FxI^yP%$87dVl\s(QΕwXQro , rc&~js;k͑ P[Bt|ĂccJ՛٥b2.seϰũۑѼf@d0/ۀcOf9p;#)ea?E?IwFe(ï!:((Er,$\_ ``YD NqMun WzV~ >JկS=ǡO'Nt閒2_}rCfIB<Eaz7 _-34NBqrhӆq;ZLJ| w(cb?xa.da_S)KP5rH l[f'KX$iJLhs޲0'`V0 tBGwCUl+q-c^ Yδa0Nd_GmQ| 9H @xʚێH02孚P ]+Rp&]]6T MeSw9a HᤨrF~j "ަ)%Pr3\Q+=vM*qmɵ%Vנ m.c @s@?s}Zt[ůUL u/V'tQ|WS\h#;3}3Ad=FX/(M?pcXVR6҄qIHz-qYI:zo܆Ⱥ[L1by;H\#=ⳮ/2)28Cb}ؑ }6F^t 7ڰkz ymiR"uhxRn擹-깻)v qV&[k~uEbv6/}<N􋢛8ٮ/8LP(GVdi$6MfP~^[ }@=maqfRjoY SE"jVU:Yli/2Of)ѓGsI!`1?mV-|롈W%r#sN Rjf?eHX02DޫìP ,x:OŘ?_`|pIh&pFN; rn(qlr̖ ENl)@ٗ x<@r8IҀnE#7:>]y!%P\Yɚ:+`sүE\9~K YORj_gqW'C>q_5N.4 W{jyV*ɷaro #*P2{(`\b{5c J])ǐq]Mz"7o'1jQV>|{:cB 3O 0LKQ'O%l chg斒:h'I>vo U6m'dPΟ QhBOnDAnB?nCC9+eSnijZߍGԚO9:aA?ƁCvhL|4jMsc06$Tɻi-&_MiZr40J3֌c`ؚUؒiE\Ը?4inCMUt9; iq#Ʊt! )dLYF^W͆q&hT Ʃ9Awy$,.]Yx^V.њQ6a Pd5{8lGfFoªbPbǀS (5/^@Rw'5C *Ib^RRY&z"1ڸT ҝQݏ8f"P@([k70iiLyQ9FGcgt\as JnB0>ӘǻsZc qc.THN @4/7zɕ'h%: hW5n/&}!ϏXDc#w!uYdO) deAX饞 LԈn'é$.BZ[hJlķ-ҭ 6=,{zmY kD_8/,L$ozO׎Ń1:h ` %}\u|Tjjݮ2GZ䡂MŤ!  !N:~WZ($=5Q#vs![Í$%ƥִ1''=qOXեj@-*j8cegtODL# ygg]~]0mYзz$4yJ]mҮxu:\c"=A_-?L_ DZ6'?bZ``tC ҙ IޯjeB-e/A az5&Ʒ>rzHYIu)= #]{)ARNKJ>n~`$] }HB-rNٳ:s?qj:uH3On&jԎY'ڰI͉ꨗm9MLO昮; U$~FGnQ>j-*}QweE1 U>F)Xoyy4g!vSIKЙg.;I4P5UmٙjT&}x%',mgCk axYog`̅D2h#0K%O\`>%;| IDUjه(:#6A„5`{S\zȵu3DX5ξVj&}]y FwLןVPe ,I/9P{$Š(Dnw7;R=֒PSEEC>CçYcc}aKA?@ t"}_r72 v=7{L2,m8 Dێ̫٧h{s ~|>Bx]VCW+gr Ǫԝ5zWhma 4QXq»ʵ@bz$юXN׼r\n}0[<ne&O}9,HDvhTqΊ_ūH8ɦpqѯ\\?OC~YW1"_ЊܘL{-T/ץ5/HrƔl3_.pԹ`wʭA 7]PC,d[-cG&7^OU/۳y 2'] ýKP0yM(rbwؒҹ%->z.%=r~O=Tz JVI"88Bw Aqٗ V>o#f]8c Hö7VU-QZJN ?;#G`VyfS5)6^:Mb5< +q:ڮZ±I(`oen@ym%OB!45'Fˎ/c'{ Q,(q.) 20O0br&< h-Fq^L-ː *BFgYOJzGHI#p!sk:*Ab;rŐ'~]U5X1L`{meh˞,a'YQ21(#[=͡mS}d,@]>j3jO,GMczvhdR1) pnKĸ:WA Pصbm[R^-. e(ɰaw}w|,1DR eJbEG;|hpRx%ڈt'>f,zD 7w`($Tigړ3//p>m.G6& M7 l$b͞>c?ady#5 ʔ2: +p 7kjW|;AU9*ZrⒸߝdEd۰}ULBro\6OSTm.ù~Y o:kA .U(皔mQ>1el/ LfQʐ ͵5z*ʢu qQֱ37{\k|=iRknz|?S6O0U*zx BU[t=8@H MfPżT^fuIF4"J|!`bHaCc:Ko@ȳۦ0Q1B=`vs;! R+_<[ FApˡ6j5ӳP33#I'zaxfw")uQ>[\\/0H12kRU&)[xB<6޻Yl%#mcsBo/dE2$Ukݸ#!`SYFl4!J;J)jpޑ|P,{Y1&U ,ϧL16\i?jp@,5=Hď0C54d#,E*@Pi>%sE9uie&cO!LͧcIB1 mtF$61"' G#w]杯w_j \'lNB(iH3J`4#/v$ģ>dr #d^)K}^|^/y$,͛Tr3ח鬧w#X>$Qge`TFnXPy",ZKݤ`Zp"ŏEJ:~S1b# = K@Rpf i!ip)A7%h[qꯊNi|UnZo}e,x@\:Le't@/|ocrt@8{P}A%g;d5j_:UR ffVy(6ʞbhM-Hcx43c PkPeƐWޜ}$^^qXx^MJ-2YҼH 2o.dtgM<}퓃u=A̜C$r^~p$ffdbOuusԕ;&%PFt6Aaj\6.N(>9:GD/bƷPĉ)eʖ^UzMU– ]+nuw[#hMħ z_W hTE^%4 &o`PLgs=M7) $/1&E>%͌ZA 02c %Bګ~G [,f߈>E %ymR}T/0I0X最}1O]я2v?7зxW`;ٹ0Ga?k9ذsf ((G[{;U9AS0 Bci3l{p0tydtv4onycMrū3LlV2:}a!_2Azɤ-*s*ݮ3bJE> &%ٵ=]L>zYZlzAfk'D`u\GJ!-Jt7("1 4/KΰrP&MA-ED3\OqcCz| 8NJzw̠ŢS<~rX=|YG SWrV?J-17sG{1x"x\-CD9'sm*ͶBs^X9('ٟ evmJI3;u ϫv9Ϸ- UUUWSUC&Rx8ni`?ϥTJʽm)-!FiUZxj= 'nLǰ倉NM2\]7e3"ݠY^) ǂcJ) 'lUP SEsv[R yh?'G?P'KJIx cLy][vHtҸܤl1vy A3sU;ps o3p`W22JPh['s/;4Z{Qa-/FŽ l\A*%y6§oӂW'5b G固vE\IjM%\zQbZb XCz@T?5D g%mb p+ER۟ b~d ex [.y%[߄hY2RQl$]J!Gr1dϥ8%l%%_l/3c4OWD7^H\*+'t/C@,x e¡ftd#o,ȵ(.9YM>߯"g5t @|@qW>D~]wvߝq$T CҎiH4$v94" 3OoԛRwGM >&zrKLpo/cP(ܷ.S絝3(8 XGVi\Z:uOજSfXSATIuYL,藱g(LM -1`> vg/wKA m C~Pkcnˮױ=Cj+K#3\b$wARKGa$#$IW铕y:{bJ{;givUNMZ`Z Q4s1#4ov vEn&fq/{½4`ֈ{q-I@`7D#\_$ip,in|hƆ}~pRCQ ;Q%ïiBpQ0SCoT#7 B#JDi'7jq*zfu3P@C(\O܂W;$~<m ?`ݼwd_l?N 5IZo޷ؐ >5zЩMN Iէ}Pmfly~"!^-ޠϱb M[o隇ՔX޺YF ws=Hk Qt##Y\n* x/Ing lSܴ72?؟}}i j<;f)д+6/AN7y+h$܈gm ۣڡ;hN`hGSvU[l؅b JK9 ]QHRlhɩa`in6oM tGo/{BPo6WqBb5LB P0aWN':!7 d'~Afτw*[K%Zʾ jp44=#{ѭ2~Mm@^Р`7>CQ14{ (&ğ0"cԍ{IP(~:51Ȧt n"ʺc緼Ϟ<mUf+nqV(A`piLM7/7ko)A`撟,&B#+Ik#~Z=,k䌿x0 ^k&w@ojȊST+8O/VܪKY_uf'1̢\ujXQhD!s7J!t!:[mj[]h|ajl,Py(' =0F EJp h+W[6H{Nv7kvMXKm9g{ı9iX$ T}r{klm)4#+jW]ɖAgN 2H7hNt@ ,g~z7M;k9JguT߅ٟh[P:x?8-5e;?S0]j5Km#1oYj$@MQ/x@sy=#?V2СSR -I]4G9]81a&.57 bsAl%/L&N>!Ht@`mR؆,v4͝C{+-h:"7B F7ޙ|G3٧#Kl]/DH^s\2Dz\WOVm>yKr[a9V+(:aRD"F! ۝>+XӨĿR[O,;bX*٥F_]1-/Mh-0z?cu;ۋ\DZ c3f} HʕYH'shmyl#/SQs4j#D5 pò)suuG_J^[hrL*_5\|!krĪkX[rÜ;f7\Gzz2L]*—-TJ|-  jXN.#csT\&@R6Xmn%-Q%dѷcC6֙/eUI3s+ʣk6o2qtoctave-0.10.1/qtoctave-info-reader/test/octave.info-40000644000175000017500000113524011511434230021714 0ustar lucaslucasThis is octave.info, produced by makeinfo version 4.11 from ./octave.texi. START-INFO-DIR-ENTRY * Octave: (octave). Interactive language for numerical computations. END-INFO-DIR-ENTRY Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2005, 2006, 2007 John W. Eaton. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.  File: octave.info, Node: Optimization, Next: Statistics, Prev: Differential Equations, Up: Top 24 Optimization *************** Octave comes with support for solving various kinds of optimization problems. Specifically Octave can solve problems in Linear Programming, Quadratic Programming, Nonlinear Programming, and Linear Least Squares Minimization. * Menu: * Linear Programming:: * Quadratic Programming:: * Nonlinear Programming:: * Linear Least Squares::  File: octave.info, Node: Linear Programming, Next: Quadratic Programming, Up: Optimization 24.1 Linear Programming ======================= Octave can solve Linear Programming problems using the `glpk' function. That is, Octave can solve min C'*x subject to the linear constraints A*x = b where x >= 0. The `glpk' function also supports variations of this problem. -- Function File: [XOPT, FMIN, STATUS, EXTRA] = glpk (C, A, B, LB, UB, CTYPE, VARTYPE, SENSE, PARAM) Solve a linear program using the GNU GLPK library. Given three arguments, `glpk' solves the following standard LP: min C'*x subject to A*x = b x >= 0 but may also solve problems of the form [ min | max ] C'*x subject to A*x [ "=" | "<=" | ">=" ] b x >= LB x <= UB Input arguments: C A column array containing the objective function coefficients. A A matrix containing the constraints coefficients. B A column array containing the right-hand side value for each constraint in the constraint matrix. LB An array containing the lower bound on each of the variables. If LB is not supplied, the default lower bound for the variables is zero. UB An array containing the upper bound on each of the variables. If UB is not supplied, the default upper bound is assumed to be infinite. CTYPE An array of characters containing the sense of each constraint in the constraint matrix. Each element of the array may be one of the following values `"F"' A free (unbounded) constraint (the constraint is ignored). `"U"' An inequality constraint with an upper bound (`A(i,:)*x <= b(i)'). `"S"' An equality constraint (`A(i,:)*x = b(i)'). `"L"' An inequality with a lower bound (`A(i,:)*x >= b(i)'). `"D"' An inequality constraint with both upper and lower bounds (`A(i,:)*x >= -b(i)' _and_ (`A(i,:)*x <= b(i)'). VARTYPE A column array containing the types of the variables. `"C"' A continuous variable. `"I"' An integer variable. SENSE If SENSE is 1, the problem is a minimization. If SENSE is -1, the problem is a maximization. The default value is 1. PARAM A structure containing the following parameters used to define the behavior of solver. Missing elements in the structure take on default values, so you only need to set the elements that you wish to change from the default. Integer parameters: `msglev (`LPX_K_MSGLEV', default: 1)' Level of messages output by solver routines: 0 No output. 1 Error messages only. 2 Normal output . 3 Full output (includes informational messages). `scale (`LPX_K_SCALE', default: 1)' Scaling option: 0 No scaling. 1 Equilibration scaling. 2 Geometric mean scaling, then equilibration scaling. `dual (`LPX_K_DUAL', default: 0)' Dual simplex option: 0 Do not use the dual simplex. 1 If initial basic solution is dual feasible, use the dual simplex. `price (`LPX_K_PRICE', default: 1)' Pricing option (for both primal and dual simplex): 0 Textbook pricing. 1 Steepest edge pricing. `round (`LPX_K_ROUND', default: 0)' Solution rounding option: 0 Report all primal and dual values "as is". 1 Replace tiny primal and dual values by exact zero. `itlim (`LPX_K_ITLIM', default: -1)' Simplex iterations limit. If this value is positive, it is decreased by one each time when one simplex iteration has been performed, and reaching zero value signals the solver to stop the search. Negative value means no iterations limit. `itcnt (`LPX_K_OUTFRQ', default: 200)' Output frequency, in iterations. This parameter specifies how frequently the solver sends information about the solution to the standard output. `branch (`LPX_K_BRANCH', default: 2)' Branching heuristic option (for MIP only): 0 Branch on the first variable. 1 Branch on the last variable. 2 Branch using a heuristic by Driebeck and Tomlin. `btrack (`LPX_K_BTRACK', default: 2)' Backtracking heuristic option (for MIP only): 0 Depth first search. 1 Breadth first search. 2 Backtrack using the best projection heuristic. `presol (`LPX_K_PRESOL', default: 1)' If this flag is set, the routine lpx_simplex solves the problem using the built-in LP presolver. Otherwise the LP presolver is not used. `lpsolver (default: 1)' Select which solver to use. If the problem is a MIP problem this flag will be ignored. 1 Revised simplex method. 2 Interior point method. `save (default: 0)' If this parameter is nonzero, save a copy of the problem in CPLEX LP format to the file `"outpb.lp"'. There is currently no way to change the name of the output file. Real parameters: `relax (`LPX_K_RELAX', default: 0.07)' Relaxation parameter used in the ratio test. If it is zero, the textbook ratio test is used. If it is non-zero (should be positive), Harris' two-pass ratio test is used. In the latter case on the first pass of the ratio test basic variables (in the case of primal simplex) or reduced costs of non-basic variables (in the case of dual simplex) are allowed to slightly violate their bounds, but not more than `relax*tolbnd' or `relax*toldj (thus, `relax' is a percentage of `tolbnd' or `toldj''. `tolbnd (`LPX_K_TOLBND', default: 10e-7)' Relative tolerance used to check if the current basic solution is primal feasible. It is not recommended that you change this parameter unless you have a detailed understanding of its purpose. `toldj (`LPX_K_TOLDJ', default: 10e-7)' Absolute tolerance used to check if the current basic solution is dual feasible. It is not recommended that you change this parameter unless you have a detailed understanding of its purpose. `tolpiv (`LPX_K_TOLPIV', default: 10e-9)' Relative tolerance used to choose eligible pivotal elements of the simplex table. It is not recommended that you change this parameter unless you have a detailed understanding of its purpose. `objll (`LPX_K_OBJLL', default: -DBL_MAX)' Lower limit of the objective function. If on the phase II the objective function reaches this limit and continues decreasing, the solver stops the search. This parameter is used in the dual simplex method only. `objul (`LPX_K_OBJUL', default: +DBL_MAX)' Upper limit of the objective function. If on the phase II the objective function reaches this limit and continues increasing, the solver stops the search. This parameter is used in the dual simplex only. `tmlim (`LPX_K_TMLIM', default: -1.0)' Searching time limit, in seconds. If this value is positive, it is decreased each time when one simplex iteration has been performed by the amount of time spent for the iteration, and reaching zero value signals the solver to stop the search. Negative value means no time limit. `outdly (`LPX_K_OUTDLY', default: 0.0)' Output delay, in seconds. This parameter specifies how long the solver should delay sending information about the solution to the standard output. Non-positive value means no delay. `tolint (`LPX_K_TOLINT', default: 10e-5)' Relative tolerance used to check if the current basic solution is integer feasible. It is not recommended that you change this parameter unless you have a detailed understanding of its purpose. `tolobj (`LPX_K_TOLOBJ', default: 10e-7)' Relative tolerance used to check if the value of the objective function is not better than in the best known integer feasible solution. It is not recommended that you change this parameter unless you have a detailed understanding of its purpose. Output values: XOPT The optimizer (the value of the decision variables at the optimum). FOPT The optimum value of the objective function. STATUS Status of the optimization. Simplex Method: 180 (`LPX_OPT') Solution is optimal. 181 (`LPX_FEAS') Solution is feasible. 182 (`LPX_INFEAS') Solution is infeasible. 183 (`LPX_NOFEAS') Problem has no feasible solution. 184 (`LPX_UNBND') Problem has no unbounded solution. 185 (`LPX_UNDEF') Solution status is undefined. Interior Point Method: 150 (`LPX_T_UNDEF') The interior point method is undefined. 151 (`LPX_T_OPT') The interior point method is optimal. Mixed Integer Method: 170 (`LPX_I_UNDEF') The status is undefined. 171 (`LPX_I_OPT') The solution is integer optimal. 172 (`LPX_I_FEAS') Solution integer feasible but its optimality has not been proven 173 (`LPX_I_NOFEAS') No integer feasible solution. If an error occurs, STATUS will contain one of the following codes: 204 (`LPX_E_FAULT') Unable to start the search. 205 (`LPX_E_OBJLL') Objective function lower limit reached. 206 (`LPX_E_OBJUL') Objective function upper limit reached. 207 (`LPX_E_ITLIM') Iterations limit exhausted. 208 (`LPX_E_TMLIM') Time limit exhausted. 209 (`LPX_E_NOFEAS') No feasible solution. 210 (`LPX_E_INSTAB') Numerical instability. 211 (`LPX_E_SING') Problems with basis matrix. 212 (`LPX_E_NOCONV') No convergence (interior). 213 (`LPX_E_NOPFS') No primal feasible solution (LP presolver). 214 (`LPX_E_NODFS') No dual feasible solution (LP presolver). EXTRA A data structure containing the following fields: `lambda' Dual variables. `redcosts' Reduced Costs. `time' Time (in seconds) used for solving LP/MIP problem. `mem' Memory (in bytes) used for solving LP/MIP problem (this is not available if the version of GLPK is 4.15 or later). Example: c = [10, 6, 4]'; a = [ 1, 1, 1; 10, 4, 5; 2, 2, 6]; b = [100, 600, 300]'; lb = [0, 0, 0]'; ub = []; ctype = "UUU"; vartype = "CCC"; s = -1; param.msglev = 1; param.itlim = 100; [xmin, fmin, status, extra] = ... glpk (c, a, b, lb, ub, ctype, vartype, s, param);  File: octave.info, Node: Quadratic Programming, Next: Nonlinear Programming, Prev: Linear Programming, Up: Optimization 24.2 Quadratic Programming ========================== Octave can also solve Quadratic Programming problems, this is min 0.5 x'*H*x + x'*q subject to A*x = b lb <= x <= ub A_lb <= A_in*x <= A_ub -- Function File: [X, OBJ, INFO, LAMBDA] = qp (X0, H, Q, A, B, LB, UB, A_LB, A_IN, A_UB) Solve the quadratic program min 0.5 x'*H*x + x'*q x subject to A*x = b lb <= x <= ub A_lb <= A_in*x <= A_ub using a null-space active-set method. Any bound (A, B, LB, UB, A_LB, A_UB) may be set to the empty matrix (`[]') if not present. If the initial guess is feasible the algorithm is faster. The value INFO is a structure with the following fields: `solveiter' The number of iterations required to find the solution. `info' An integer indicating the status of the solution, as follows: 0 The problem is feasible and convex. Global solution found. 1 The problem is not convex. Local solution found. 2 The problem is not convex and unbounded. 3 Maximum number of iterations reached. 6 The problem is infeasible.  File: octave.info, Node: Nonlinear Programming, Next: Linear Least Squares, Prev: Quadratic Programming, Up: Optimization 24.3 Nonlinear Programming ========================== Octave can also perform general nonlinear minimization using a successive quadratic programming solver. -- Function File: [X, OBJ, INFO, ITER, NF, LAMBDA] = sqp (X, PHI, G, H, LB, UB, MAXITER, TOLERANCE) Solve the nonlinear program min phi (x) x subject to g(x) = 0 h(x) >= 0 lb <= x <= ub using a successive quadratic programming method. The first argument is the initial guess for the vector X. The second argument is a function handle pointing to the objective function. The objective function must be of the form y = phi (x) in which X is a vector and Y is a scalar. The second argument may also be a 2- or 3-element cell array of function handles. The first element should point to the objective function, the second should point to a function that computes the gradient of the objective function, and the third should point to a function to compute the hessian of the objective function. If the gradient function is not supplied, the gradient is computed by finite differences. If the hessian function is not supplied, a BFGS update formula is used to approximate the hessian. If supplied, the gradient function must be of the form g = gradient (x) in which X is a vector and G is a vector. If supplied, the hessian function must be of the form h = hessian (x) in which X is a vector and H is a matrix. The third and fourth arguments are function handles pointing to functions that compute the equality constraints and the inequality constraints, respectively. If your problem does not have equality (or inequality) constraints, you may pass an empty matrix for CEF (or CIF). If supplied, the equality and inequality constraint functions must be of the form r = f (x) in which X is a vector and R is a vector. The third and fourth arguments may also be 2-element cell arrays of function handles. The first element should point to the constraint function and the second should point to a function that computes the gradient of the constraint function: [ d f(x) d f(x) d f(x) ] transpose ( [ ------ ----- ... ------ ] ) [ dx_1 dx_2 dx_N ] The fifth and sixth arguments are vectors containing lower and upper bounds on X. These must be consistent with equality and inequality constraints G and H. If the bounds are not specified, or are empty, they are set to -REALMAX and REALMAX by default. The seventh argument is max. number of iterations. If not specified, the default value is 100. The eighth argument is tolerance for stopping criteria. If not specified, the default value is EPS. Here is an example of calling `sqp': function r = g (x) r = [ sumsq(x)-10; x(2)*x(3)-5*x(4)*x(5); x(1)^3+x(2)^3+1 ]; endfunction function obj = phi (x) obj = exp(prod(x)) - 0.5*(x(1)^3+x(2)^3+1)^2; endfunction x0 = [-1.8; 1.7; 1.9; -0.8; -0.8]; [x, obj, info, iter, nf, lambda] = sqp (x0, @phi, @g, []) x = -1.71714 1.59571 1.82725 -0.76364 -0.76364 obj = 0.053950 info = 101 iter = 8 nf = 10 lambda = -0.0401627 0.0379578 -0.0052227 The value returned in INFO may be one of the following: 101 The algorithm terminated because the norm of the last step was less than `tol * norm (x))' (the value of tol is currently fixed at `sqrt (eps)'--edit `sqp.m' to modify this value. 102 The BFGS update failed. 103 The maximum number of iterations was reached (the maximum number of allowed iterations is currently fixed at 100--edit `sqp.m' to increase this value). *See also:* *note qp: doc-qp.  File: octave.info, Node: Linear Least Squares, Prev: Nonlinear Programming, Up: Optimization 24.4 Linear Least Squares ========================= Octave also supports linear least squares minimization. That is, Octave can find the parameter b such that the model y = x*b fits data (x,y) as well as possible, assuming zero-mean Gaussian noise. If the noise is assumed to be isotropic the problem can be solved using the `\' or `/' operators, or the `ols' function. In the general case where the noise is assumed to be anisotropic the `gls' is needed. -- Function File: [BETA, SIGMA, R] = ols (Y, X) Ordinary least squares estimation for the multivariate model y = x b + e with mean (e) = 0 and cov (vec (e)) = kron (s, I). where y is a t by p matrix, x is a t by k matrix, b is a k by p matrix, and e is a t by p matrix. Each row of Y and X is an observation and each column a variable. The return values BETA, SIGMA, and R are defined as follows. BETA The OLS estimator for B, `BETA = pinv (X) * Y', where `pinv (X)' denotes the pseudoinverse of X. SIGMA The OLS estimator for the matrix S, SIGMA = (Y-X*BETA)' * (Y-X*BETA) / (T-rank(X)) R The matrix of OLS residuals, `R = Y - X * BETA'. -- Function File: [BETA, V, R] = gls (Y, X, O) Generalized least squares estimation for the multivariate model y = x b + e with mean (e) = 0 and cov (vec (e)) = (s^2) o, where y is a t by p matrix, x is a t by k matrix, b is a k by p matrix, e is a t by p matrix, and o is a t p by t p matrix. Each row of Y and X is an observation and each column a variable. The return values BETA, V, and R are defined as follows. BETA The GLS estimator for b. V The GLS estimator for s^2. R The matrix of GLS residuals, r = y - x beta. -- Function File: X = lsqnonneg (C, D) -- Function File: X = lsqnonneg (C, D, X0) -- Function File: [X, RESNORM] = lsqnonneg (...) -- Function File: [X, RESNORM, RESIDUAL] = lsqnonneg (...) -- Function File: [X, RESNORM, RESIDUAL, EXITFLAG] = lsqnonneg (...) -- Function File: [X, RESNORM, RESIDUAL, EXITFLAG, OUTPUT] = lsqnonneg (...) -- Function File: [X, RESNORM, RESIDUAL, EXITFLAG, OUTPUT, LAMBDA] = lsqnonneg (...) Minimize `norm (C*X-d)' subject to `X >= 0'. C and D must be real. X0 is an optional initial guess for X. Outputs: * resnorm The squared 2-norm of the residual: norm(C*X-D)^2 * residual The residual: D-C*X * exitflag An indicator of convergence. 0 indicates that the iteration count was exceeded, and therefore convergence was not reached; >0 indicates that the algorithm converged. (The algorithm is stable and will converge given enough iterations.) * output A structure with two fields: * "algorithm": The algorithm used ("nnls") * "iterations": The number of iterations taken. * lambda Not implemented. *See also:* *note optimset: doc-optimset. -- Function File: optimset () -- Function File: optimset (PAR, VAL, ...) -- Function File: optimset (OLD, PAR, VAL, ...) -- Function File: optimset (OLD, NEW) Create options struct for optimization functions. -- Function File: optimget (OPTIONS, PARNAME) -- Function File: optimget (OPTIONS, PARNAME, DEFAULT) Return a specific option from a structure created by `optimset'. If PARNAME is not a field of the OPTIONS structure, return DEFAULT if supplied, otherwise return an empty matrix.  File: octave.info, Node: Statistics, Next: Sets, Prev: Optimization, Up: Top 25 Statistics ************* Octave has support for various statistical methods. This includes basic descriptive statistics, statistical tests, random number generation, and much more. The functions that analyze data all assume that multidimensional data is arranged in a matrix where each row is an observation, and each column is a variable. So, the matrix defined by a = [ 0.9, 0.7; 0.1, 0.1; 0.5, 0.4 ]; contains three observations from a two-dimensional distribution. While this is the default data arrangement, most functions support different arrangements. It should be noted that the statistics functions don't test for data containing NaN, NA, or Inf. Such values need to be handled explicitly. * Menu: * Descriptive Statistics:: * Basic Statistical Functions:: * Statistical Plots:: * Tests:: * Models:: * Distributions:: * Random Number Generation::  File: octave.info, Node: Descriptive Statistics, Next: Basic Statistical Functions, Up: Statistics 25.1 Descriptive Statistics =========================== Octave can compute various statistics such as the moments of a data set. -- Function File: mean (X, DIM, OPT) If X is a vector, compute the mean of the elements of X mean (x) = SUM_i x(i) / N If X is a matrix, compute the mean for each column and return them in a row vector. With the optional argument OPT, the kind of mean computed can be selected. The following options are recognized: `"a"' Compute the (ordinary) arithmetic mean. This is the default. `"g"' Compute the geometric mean. `"h"' Compute the harmonic mean. If the optional argument DIM is supplied, work along dimension DIM. Both DIM and OPT are optional. If both are supplied, either may appear first. -- Function File: median (X, DIM) If X is a vector, compute the median value of the elements of X. If the elements of X are sorted, the median is defined as x(ceil(N/2)), N odd median(x) = (x(N/2) + x((N/2)+1))/2, N even If X is a matrix, compute the median value for each column and return them in a row vector. If the optional DIM argument is given, operate along this dimension. *See also:* *note std: doc-std, *note mean: doc-mean. -- Function File: Q = quantile (X, P) -- Function File: Q = quantile (X, P, DIM) -- Function File: Q = quantile (X, P, DIM, METHOD) For a sample, X, calculate the quantiles, Q, corresponding to the cumulative probability values in P. All non-numeric values (NaNs) of X are ignored. If X is a matrix, compute the quantiles for each column and return them in a matrix, such that the i-th row of Q contains the P(i)th quantiles of each column of X. The optional argument DIM determines the dimension along which the percentiles are calculated. If DIM is omitted, and X is a vector or matrix, it defaults to 1 (column wise quantiles). In the instance that X is a N-d array, DIM defaults to the first dimension whose size greater than unity. The methods available to calculate sample quantiles are the nine methods used by R (http://www.r-project.org/). The default value is METHOD = 5. Discontinuous sample quantile methods 1, 2, and 3 1. Method 1: Inverse of empirical distribution function. 2. Method 2: Similar to method 1 but with averaging at discontinuities. 3. Method 3: SAS definition: nearest even order statistic. Continuous sample quantile methods 4 through 9, where p(k) is the linear interpolation function respecting each methods' representative cdf. 4. Method 4: p(k) = k / n. That is, linear interpolation of the empirical cdf. 5. Method 5: p(k) = (k - 0.5) / n. That is a piecewise linear function where the knots are the values midway through the steps of the empirical cdf. 6. Method 6: p(k) = k / (n + 1). 7. Method 7: p(k) = (k - 1) / (n - 1). 8. Method 8: p(k) = (k - 1/3) / (n + 1/3). The resulting quantile estimates are approximately median-unbiased regardless of the distribution of X. 9. Method 9: p(k) = (k - 3/8) / (n + 1/4). The resulting quantile estimates are approximately unbiased for the expected order statistics if X is normally distributed. Hyndman and Fan (1996) recommend method 8. Maxima, S, and R (versions prior to 2.0.0) use 7 as their default. Minitab and SPSS use method 6. MATLAB uses method 5. References: * Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole. * Hyndman, R. J. and Fan, Y. (1996) Sample quantiles in statistical packages, American Statistician, 50, 361-365. * R: A Language and Environment for Statistical Computing; `http://cran.r-project.org/doc/manuals/fullrefman.pdf'. -- Function File: Y = prctile (X, P) -- Function File: Q = prctile (X, P, DIM) For a sample X, compute the quantiles, Y, corresponding to the cumulative probability values, P, in percent. All non-numeric values (NaNs) of X are ignored. If X is a matrix, compute the percentiles for each column and return them in a matrix, such that the i-th row of Y contains the P(i)th percentiles of each column of X. The optional argument DIM determines the dimension along which the percentiles are calculated. If DIM is omitted, and X is a vector or matrix, it defaults to 1 (column wise quantiles). In the instance that X is a N-d array, DIM defaults to the first dimension whose size greater than unity. -- Function File: meansq (X) -- Function File: meansq (X, DIM) For vector arguments, return the mean square of the values. For matrix arguments, return a row vector containing the mean square of each column. With the optional DIM argument, returns the mean squared of the values along this dimension. -- Function File: std (X) -- Function File: std (X, OPT) -- Function File: std (X, OPT, DIM) If X is a vector, compute the standard deviation of the elements of X. std (x) = sqrt (sumsq (x - mean (x)) / (n - 1)) If X is a matrix, compute the standard deviation for each column and return them in a row vector. The argument OPT determines the type of normalization to use. Valid values are 0: normalizes with N-1, provides the square root of best unbiased estimator of the variance [default] 1: normalizes with N, this provides the square root of the second moment around the mean The third argument DIM determines the dimension along which the standard deviation is calculated. *See also:* *note mean: doc-mean, *note median: doc-median. -- Function File: var (X) For vector arguments, return the (real) variance of the values. For matrix arguments, return a row vector containing the variance for each column. The argument OPT determines the type of normalization to use. Valid values are 0: Normalizes with N-1, provides the best unbiased estimator of the variance [default]. 1: Normalizes with N, this provides the second moment around the mean. The third argument DIM determines the dimension along which the variance is calculated. -- Function File: [M, F, C] = mode (X, DIM) Count the most frequently appearing value. `mode' counts the frequency along the first non-singleton dimension and if two or more values have the same frequency returns the smallest of the two in M. The dimension along which to count can be specified by the DIM parameter. The variable F counts the frequency of each of the most frequently occurring elements. The cell array C contains all of the elements with the maximum frequency . -- Function File: cov (X, Y) Compute covariance. If each row of X and Y is an observation and each column is a variable, the (I, J)-th entry of `cov (X, Y)' is the covariance between the I-th variable in X and the J-th variable in Y. If called with one argument, compute `cov (X, X)'. -- Function File: cor (X, Y) Compute correlation. The (I, J)-th entry of `cor (X, Y)' is the correlation between the I-th variable in X and the J-th variable in Y. corrcoef(x,y) = cov(x,y)/(std(x)*std(y)) For matrices, each row is an observation and each column a variable; vectors are always observations and may be row or column vectors. `cor (X)' is equivalent to `cor (X, X)'. Note that the `corrcoef' function does the same as `cor'. -- Function File: corrcoef (X, Y) Compute correlation. If each row of X and Y is an observation and each column is a variable, the (I, J)-th entry of `corrcoef (X, Y)' is the correlation between the I-th variable in X and the J-th variable in Y. corrcoef(x,y) = cov(x,y)/(std(x)*std(y)) If called with one argument, compute `corrcoef (X, X)'. -- Function File: kurtosis (X, DIM) If X is a vector of length N, return the kurtosis kurtosis (x) = N^(-1) std(x)^(-4) sum ((x - mean(x)).^4) - 3 of X. If X is a matrix, return the kurtosis over the first non-singleton dimension. The optional argument DIM can be given to force the kurtosis to be given over that dimension. -- Function File: skewness (X, DIM) If X is a vector of length n, return the skewness skewness (x) = N^(-1) std(x)^(-3) sum ((x - mean(x)).^3) of X. If X is a matrix, return the skewness along the first non-singleton dimension of the matrix. If the optional DIM argument is given, operate along this dimension. -- Function File: statistics (X) If X is a matrix, return a matrix with the minimum, first quartile, median, third quartile, maximum, mean, standard deviation, skewness and kurtosis of the columns of X as its columns. If X is a vector, calculate the statistics along the non-singleton dimension. -- Function File: moment (X, P, OPT, DIM) If X is a vector, compute the P-th moment of X. If X is a matrix, return the row vector containing the P-th moment of each column. With the optional string opt, the kind of moment to be computed can be specified. If opt contains `"c"' or `"a"', central and/or absolute moments are returned. For example, moment (x, 3, "ac") computes the third central absolute moment of X. If the optional argument DIM is supplied, work along dimension DIM.  File: octave.info, Node: Basic Statistical Functions, Next: Statistical Plots, Prev: Descriptive Statistics, Up: Statistics 25.2 Basic Statistical Functions ================================ Octave also supports various helpful statistical functions. -- Function File: mahalanobis (X, Y) Return the Mahalanobis' D-square distance between the multivariate samples X and Y, which must have the same number of components (columns), but may have a different number of observations (rows). -- Function File: center (X) -- Function File: center (X, DIM) If X is a vector, subtract its mean. If X is a matrix, do the above for each column. If the optional argument DIM is given, perform the above operation along this dimension -- Function File: studentize (X, DIM) If X is a vector, subtract its mean and divide by its standard deviation. If X is a matrix, do the above along the first non-singleton dimension. If the optional argument DIM is given then operate along this dimension. -- Function File: C = nchoosek (N, K) Compute the binomial coefficient or all combinations of N. If N is a scalar then, calculate the binomial coefficient of N and K, defined as / \ | n | n (n-1) (n-2) ... (n-k+1) n! | | = ------------------------- = --------- | k | k! k! (n-k)! \ / If N is a vector generate all combinations of the elements of N, taken K at a time, one row per combination. The resulting C has size `[nchoosek (length (N), K), K]'. `nchoosek' works only for non-negative integer arguments; use `bincoeff' for non-integer scalar arguments and for using vector arguments to compute many coefficients at once. *See also:* *note bincoeff: doc-bincoeff. -- Function File: N = histc (Y, EDGES) -- Function File: N = histc (Y, EDGES, DIM) -- Function File: [N, IDX] = histc (...) Produce histogram counts. When Y is a vector, the function counts the number of elements of Y that fall in the histogram bins defined by EDGES. This must be a vector of monotonically non-decreasing values that define the edges of the histogram bins. So, `N (k)' contains the number of elements in Y for which `EDGES (k) <= Y < EDGES (k+1)'. The final element of N contains the number of elements of Y that was equal to the last element of EDGES. When Y is a N-dimensional array, the same operation as above is repeated along dimension DIM. If this argument is given, the operation is performed along the first non-singleton dimension. If a second output argument is requested an index matrix is also returned. The IDX matrix has same size as Y. Each element of IDX contains the index of the histogram bin in which the corresponding element of Y was counted. *See also:* *note hist: doc-hist. -- Function File: perms (V) Generate all permutations of V, one row per permutation. The result has size `factorial (N) * N', where N is the length of V. As an example, `perms([1, 2, 3])' returns the matrix 1 2 3 2 1 3 1 3 2 2 3 1 3 1 2 3 2 1 -- Function File: values (X) Return the different values in a column vector, arranged in ascending order. As an example, `values([1, 2, 3, 1])' returns the vector `[1, 2, 3]'. -- Function File: [T, L_X] = table (X) -- Function File: [T, L_X, L_Y] = table (X, Y) Create a contingency table T from data vectors. The L vectors are the corresponding levels. Currently, only 1- and 2-dimensional tables are supported. -- Function File: spearman (X, Y) Compute Spearman's rank correlation coefficient RHO for each of the variables specified by the input arguments. For matrices, each row is an observation and each column a variable; vectors are always observations and may be row or column vectors. `spearman (X)' is equivalent to `spearman (X, X)'. For two data vectors X and Y, Spearman's RHO is the correlation of the ranks of X and Y. If X and Y are drawn from independent distributions, RHO has zero mean and variance `1 / (n - 1)', and is asymptotically normally distributed. -- Function File: run_count (X, N) Count the upward runs along the first non-singleton dimension of X of length 1, 2, ..., N-1 and greater than or equal to N. If the optional argument DIM is given operate along this dimension -- Function File: ranks (X, DIM) Return the ranks of X along the first non-singleton dimension adjust for ties. If the optional argument DIM is given, operate along this dimension. -- Function File: range (X) -- Function File: range (X, DIM) If X is a vector, return the range, i.e., the difference between the maximum and the minimum, of the input data. If X is a matrix, do the above for each column of X. If the optional argument DIM is supplied, work along dimension DIM. -- Function File: probit (P) For each component of P, return the probit (the quantile of the standard normal distribution) of P. -- Function File: logit (P) For each component of P, return the logit of P defined as logit(P) = log (P / (1-P)) -- Function File: cloglog (X) Return the complementary log-log function of X, defined as cloglog(x) = - log (- log (X)) -- Function File: kendall (X, Y) Compute Kendall's TAU for each of the variables specified by the input arguments. For matrices, each row is an observation and each column a variable; vectors are always observations and may be row or column vectors. `kendall (X)' is equivalent to `kendall (X, X)'. For two data vectors X, Y of common length N, Kendall's TAU is the correlation of the signs of all rank differences of X and Y; i.e., if both X and Y have distinct entries, then 1 tau = ------- SUM sign (q(i) - q(j)) * sign (r(i) - r(j)) n (n-1) i,j in which the Q(I) and R(I) are the ranks of X and Y, respectively. If X and Y are drawn from independent distributions, Kendall's TAU is asymptotically normal with mean 0 and variance `(2 * (2N+5)) / (9 * N * (N-1))'. -- Function File: iqr (X, DIM) If X is a vector, return the interquartile range, i.e., the difference between the upper and lower quartile, of the input data. If X is a matrix, do the above for first non-singleton dimension of X. If the option DIM argument is given, then operate along this dimension. -- Function File: cut (X, BREAKS) Create categorical data out of numerical or continuous data by cutting into intervals. If BREAKS is a scalar, the data is cut into that many equal-width intervals. If BREAKS is a vector of break points, the category has `length (BREAKS) - 1' groups. The returned value is a vector of the same size as X telling which group each point in X belongs to. Groups are labelled from 1 to the number of groups; points outside the range of BREAKS are labelled by `NaN'.  File: octave.info, Node: Statistical Plots, Next: Tests, Prev: Basic Statistical Functions, Up: Statistics 25.3 Statistical Plots ====================== Octave can create Quantile Plots (QQ-Plots), and Probability Plots (PP-Plots). These are simple graphical tests for determining if a data set comes from a certain distribution. Note that Octave can also show histograms of data using the `hist' function as described in *note Two-Dimensional Plots::. -- Function File: [Q, S] = qqplot (X, DIST, PARAMS) Perform a QQ-plot (quantile plot). If F is the CDF of the distribution DIST with parameters PARAMS and G its inverse, and X a sample vector of length N, the QQ-plot graphs ordinate S(I) = I-th largest element of x versus abscissa Q(If) = G((I - 0.5)/N). If the sample comes from F except for a transformation of location and scale, the pairs will approximately follow a straight line. The default for DIST is the standard normal distribution. The optional argument PARAMS contains a list of parameters of DIST. For example, for a quantile plot of the uniform distribution on [2,4] and X, use qqplot (x, "uniform", 2, 4) DIST can be any string for which a function DIST_INV that calculates the inverse CDF of distribution DIST exists. If no output arguments are given, the data are plotted directly. -- Function File: [P, Y] = ppplot (X, DIST, PARAMS) Perform a PP-plot (probability plot). If F is the CDF of the distribution DIST with parameters PARAMS and X a sample vector of length N, the PP-plot graphs ordinate Y(I) = F (I-th largest element of X) versus abscissa P(I) = (I - 0.5)/N. If the sample comes from F, the pairs will approximately follow a straight line. The default for DIST is the standard normal distribution. The optional argument PARAMS contains a list of parameters of DIST. For example, for a probability plot of the uniform distribution on [2,4] and X, use ppplot (x, "uniform", 2, 4) DIST can be any string for which a function DIST_CDF that calculates the CDF of distribution DIST exists. If no output arguments are given, the data are plotted directly.  File: octave.info, Node: Tests, Next: Models, Prev: Statistical Plots, Up: Statistics 25.4 Tests ========== Octave can perform several different statistical tests. The following table summarizes the available tests. *Hypothesis* *Test Functions* Equal mean values `anova', `hotelling_test2', `t_test_2', `welch_test', `wilcoxon_test', `z_test_2' Equal medians `kruskal_wallis_test', `sign_test' Equal variances `bartlett_test', `manova', `var_test' Equal distributions `chisquare_test_homogeneity', `kolmogorov_smirnov_test_2', `u_test' Equal marginal frequencies `mcnemar_test' Equal success probabilities `prop_test_2' Independent observations `chisquare_test_independence', `run_test' Uncorrelated observations `cor_test' Given mean value `hotelling_test', `t_test', `z_test' Observations from given `kolmogorov_smirnov_test' distribution Regression `f_test_regression', `t_test_regression' The tests return a p-value that describes the outcome of the test. Assuming that the test hypothesis is true, the p-value is the probability of obtaining a worse result than the observed one. So large p-values corresponds to a successful test. Usually a test hypothesis is accepted if the p-value exceeds 0.05. -- Function File: [PVAL, F, DF_B, DF_W] = anova (Y, G) Perform a one-way analysis of variance (ANOVA). The goal is to test whether the population means of data taken from K different groups are all equal. Data may be given in a single vector Y with groups specified by a corresponding vector of group labels G (e.g., numbers from 1 to K). This is the general form which does not impose any restriction on the number of data in each group or the group labels. If Y is a matrix and G is omitted, each column of Y is treated as a group. This form is only appropriate for balanced ANOVA in which the numbers of samples from each group are all equal. Under the null of constant means, the statistic F follows an F distribution with DF_B and DF_W degrees of freedom. The p-value (1 minus the CDF of this distribution at F) is returned in PVAL. If no output argument is given, the standard one-way ANOVA table is printed. -- Function File: [PVAL, CHISQ, DF] = bartlett_test (X1, ...) Perform a Bartlett test for the homogeneity of variances in the data vectors X1, X2, ..., XK, where K > 1. Under the null of equal variances, the test statistic CHISQ approximately follows a chi-square distribution with DF degrees of freedom. The p-value (1 minus the CDF of this distribution at CHISQ) is returned in PVAL. If no output argument is given, the p-value is displayed. -- Function File: [PVAL, CHISQ, DF] = chisquare_test_homogeneity (X, Y, C) Given two samples X and Y, perform a chisquare test for homogeneity of the null hypothesis that X and Y come from the same distribution, based on the partition induced by the (strictly increasing) entries of C. For large samples, the test statistic CHISQ approximately follows a chisquare distribution with DF = `length (C)' degrees of freedom. The p-value (1 minus the CDF of this distribution at CHISQ) is returned in PVAL. If no output argument is given, the p-value is displayed. -- Function File: [PVAL, CHISQ, DF] = chisquare_test_independence (X) Perform a chi-square test for independence based on the contingency table X. Under the null hypothesis of independence, CHISQ approximately has a chi-square distribution with DF degrees of freedom. The p-value (1 minus the CDF of this distribution at chisq) of the test is returned in PVAL. If no output argument is given, the p-value is displayed. -- Function File: cor_test (X, Y, ALT, METHOD) Test whether two samples X and Y come from uncorrelated populations. The optional argument string ALT describes the alternative hypothesis, and can be `"!="' or `"<>"' (non-zero), `">"' (greater than 0), or `"<"' (less than 0). The default is the two-sided case. The optional argument string METHOD specifies on which correlation coefficient the test should be based. If METHOD is `"pearson"' (default), the (usual) Pearson's product moment correlation coefficient is used. In this case, the data should come from a bivariate normal distribution. Otherwise, the other two methods offer nonparametric alternatives. If METHOD is `"kendall"', then Kendall's rank correlation tau is used. If METHOD is `"spearman"', then Spearman's rank correlation rho is used. Only the first character is necessary. The output is a structure with the following elements: PVAL The p-value of the test. STAT The value of the test statistic. DIST The distribution of the test statistic. PARAMS The parameters of the null distribution of the test statistic. ALTERNATIVE The alternative hypothesis. METHOD The method used for testing. If no output argument is given, the p-value is displayed. -- Function File: [PVAL, F, DF_NUM, DF_DEN] = f_test_regression (Y, X, RR, R) Perform an F test for the null hypothesis rr * b = r in a classical normal regression model y = X * b + e. Under the null, the test statistic F follows an F distribution with DF_NUM and DF_DEN degrees of freedom. The p-value (1 minus the CDF of this distribution at F) is returned in PVAL. If not given explicitly, R = 0. If no output argument is given, the p-value is displayed. -- Function File: [PVAL, TSQ] = hotelling_test (X, M) For a sample X from a multivariate normal distribution with unknown mean and covariance matrix, test the null hypothesis that `mean (X) == M'. Hotelling's T^2 is returned in TSQ. Under the null, (n-p) T^2 / (p(n-1)) has an F distribution with p and n-p degrees of freedom, where n and p are the numbers of samples and variables, respectively. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, TSQ] = hotelling_test_2 (X, Y) For two samples X from multivariate normal distributions with the same number of variables (columns), unknown means and unknown equal covariance matrices, test the null hypothesis `mean (X) == mean (Y)'. Hotelling's two-sample T^2 is returned in TSQ. Under the null, (n_x+n_y-p-1) T^2 / (p(n_x+n_y-2)) has an F distribution with p and n_x+n_y-p-1 degrees of freedom, where n_x and n_y are the sample sizes and p is the number of variables. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, KS] = kolmogorov_smirnov_test (X, DIST, PARAMS, ALT) Perform a Kolmogorov-Smirnov test of the null hypothesis that the sample X comes from the (continuous) distribution dist. I.e., if F and G are the CDFs corresponding to the sample and dist, respectively, then the null is that F == G. The optional argument PARAMS contains a list of parameters of DIST. For example, to test whether a sample X comes from a uniform distribution on [2,4], use kolmogorov_smirnov_test(x, "uniform", 2, 4) DIST can be any string for which a function DIST_CDF that calculates the CDF of distribution DIST exists. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative F != G. In this case, the test statistic KS follows a two-sided Kolmogorov-Smirnov distribution. If ALT is `">"', the one-sided alternative F > G is considered. Similarly for `"<"', the one-sided alternative F > G is considered. In this case, the test statistic KS has a one-sided Kolmogorov-Smirnov distribution. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value is displayed. -- Function File: [PVAL, KS, D] = kolmogorov_smirnov_test_2 (X, Y, ALT) Perform a 2-sample Kolmogorov-Smirnov test of the null hypothesis that the samples X and Y come from the same (continuous) distribution. I.e., if F and G are the CDFs corresponding to the X and Y samples, respectively, then the null is that F == G. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative F != G. In this case, the test statistic KS follows a two-sided Kolmogorov-Smirnov distribution. If ALT is `">"', the one-sided alternative F > G is considered. Similarly for `"<"', the one-sided alternative F < G is considered. In this case, the test statistic KS has a one-sided Kolmogorov-Smirnov distribution. The default is the two-sided case. The p-value of the test is returned in PVAL. The third returned value, D, is the test statistic, the maximum vertical distance between the two cumulative distribution functions. If no output argument is given, the p-value is displayed. -- Function File: [PVAL, K, DF] = kruskal_wallis_test (X1, ...) Perform a Kruskal-Wallis one-factor "analysis of variance". Suppose a variable is observed for K > 1 different groups, and let X1, ..., XK be the corresponding data vectors. Under the null hypothesis that the ranks in the pooled sample are not affected by the group memberships, the test statistic K is approximately chi-square with DF = K - 1 degrees of freedom. If the data contains ties (some value appears more than once) K is divided by 1 - SUM_TIES / (N^3 - N) where SUM_TIES is the sum of T^2 - T over each group of ties where T is the number of ties in the group and N is the total number of values in the input data. For more info on this adjustment see "Use of Ranks in One-Criterion Variance Analysis" in Journal of the American Statistical Association, Vol. 47, No. 260 (Dec 1952) by William H. Kruskal and W. Allen Wallis. The p-value (1 minus the CDF of this distribution at K) is returned in PVAL. If no output argument is given, the p-value is displayed. -- Function File: manova (Y, G) Perform a one-way multivariate analysis of variance (MANOVA). The goal is to test whether the p-dimensional population means of data taken from K different groups are all equal. All data are assumed drawn independently from p-dimensional normal distributions with the same covariance matrix. The data matrix is given by Y. As usual, rows are observations and columns are variables. The vector G specifies the corresponding group labels (e.g., numbers from 1 to K). The LR test statistic (Wilks' Lambda) and approximate p-values are computed and displayed. -- Function File: [PVAL, CHISQ, DF] = mcnemar_test (X) For a square contingency table X of data cross-classified on the row and column variables, McNemar's test can be used for testing the null hypothesis of symmetry of the classification probabilities. Under the null, CHISQ is approximately distributed as chisquare with DF degrees of freedom. The p-value (1 minus the CDF of this distribution at CHISQ) is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, Z] = prop_test_2 (X1, N1, X2, N2, ALT) If X1 and N1 are the counts of successes and trials in one sample, and X2 and N2 those in a second one, test the null hypothesis that the success probabilities P1 and P2 are the same. Under the null, the test statistic Z approximately follows a standard normal distribution. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative P1 != P2. If ALT is `">"', the one-sided alternative P1 > P2 is used. Similarly for `"<"', the one-sided alternative P1 < P2 is used. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, CHISQ] = run_test (X) Perform a chi-square test with 6 degrees of freedom based on the upward runs in the columns of X. Can be used to test whether X contains independent data. The p-value of the test is returned in PVAL. If no output argument is given, the p-value is displayed. -- Function File: [PVAL, B, N] = sign_test (X, Y, ALT) For two matched-pair samples X and Y, perform a sign test of the null hypothesis PROB (X > Y) == PROB (X < Y) == 1/2. Under the null, the test statistic B roughly follows a binomial distribution with parameters `N = sum (X != Y)' and P = 1/2. With the optional argument `alt', the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null hypothesis is tested against the two-sided alternative PROB (X < Y) != 1/2. If ALT is `">"', the one-sided alternative PROB (X > Y) > 1/2 ("x is stochastically greater than y") is considered. Similarly for `"<"', the one-sided alternative PROB (X > Y) < 1/2 ("x is stochastically less than y") is considered. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, T, DF] = t_test (X, M, ALT) For a sample X from a normal distribution with unknown mean and variance, perform a t-test of the null hypothesis `mean (X) == M'. Under the null, the test statistic T follows a Student distribution with `DF = length (X) - 1' degrees of freedom. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative `mean (X) != M'. If ALT is `">"', the one-sided alternative `mean (X) > M' is considered. Similarly for "<", the one-sided alternative `mean (X) < M' is considered. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, T, DF] = t_test_2 (X, Y, ALT) For two samples x and y from normal distributions with unknown means and unknown equal variances, perform a two-sample t-test of the null hypothesis of equal means. Under the null, the test statistic T follows a Student distribution with DF degrees of freedom. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative `mean (X) != mean (Y)'. If ALT is `">"', the one-sided alternative `mean (X) > mean (Y)' is used. Similarly for `"<"', the one-sided alternative `mean (X) < mean (Y)' is used. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, T, DF] = t_test_regression (Y, X, RR, R, ALT) Perform an t test for the null hypothesis `RR * B = R' in a classical normal regression model `Y = X * B + E'. Under the null, the test statistic T follows a T distribution with DF degrees of freedom. If R is omitted, a value of 0 is assumed. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative `RR * B != R'. If ALT is `">"', the one-sided alternative `RR * B > R' is used. Similarly for "<", the one-sided alternative `RR * B < R' is used. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, Z] = u_test (X, Y, ALT) For two samples X and Y, perform a Mann-Whitney U-test of the null hypothesis PROB (X > Y) == 1/2 == PROB (X < Y). Under the null, the test statistic Z approximately follows a standard normal distribution. Note that this test is equivalent to the Wilcoxon rank-sum test. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative PROB (X > Y) != 1/2. If ALT is `">"', the one-sided alternative PROB (X > Y) > 1/2 is considered. Similarly for `"<"', the one-sided alternative PROB (X > Y) < 1/2 is considered. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, F, DF_NUM, DF_DEN] = var_test (X, Y, ALT) For two samples X and Y from normal distributions with unknown means and unknown variances, perform an F-test of the null hypothesis of equal variances. Under the null, the test statistic F follows an F-distribution with DF_NUM and DF_DEN degrees of freedom. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative `var (X) != var (Y)'. If ALT is `">"', the one-sided alternative `var (X) > var (Y)' is used. Similarly for "<", the one-sided alternative `var (X) > var (Y)' is used. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, T, DF] = welch_test (X, Y, ALT) For two samples X and Y from normal distributions with unknown means and unknown and not necessarily equal variances, perform a Welch test of the null hypothesis of equal means. Under the null, the test statistic T approximately follows a Student distribution with DF degrees of freedom. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative `mean (X) != M'. If ALT is `">"', the one-sided alternative mean(x) > M is considered. Similarly for `"<"', the one-sided alternative mean(x) < M is considered. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, Z] = wilcoxon_test (X, Y, ALT) For two matched-pair sample vectors X and Y, perform a Wilcoxon signed-rank test of the null hypothesis PROB (X > Y) == 1/2. Under the null, the test statistic Z approximately follows a standard normal distribution when N > 25. *Warning*: This function assumes a normal distribution for Z and thus is invalid for N <= 25. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative PROB (X > Y) != 1/2. If alt is `">"', the one-sided alternative PROB (X > Y) > 1/2 is considered. Similarly for `"<"', the one-sided alternative PROB (X > Y) < 1/2 is considered. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed. -- Function File: [PVAL, Z] = z_test (X, M, V, ALT) Perform a Z-test of the null hypothesis `mean (X) == M' for a sample X from a normal distribution with unknown mean and known variance V. Under the null, the test statistic Z follows a standard normal distribution. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative `mean (X) != M'. If ALT is `">"', the one-sided alternative `mean (X) > M' is considered. Similarly for `"<"', the one-sided alternative `mean (X) < M' is considered. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed along with some information. -- Function File: [PVAL, Z] = z_test_2 (X, Y, V_X, V_Y, ALT) For two samples X and Y from normal distributions with unknown means and known variances V_X and V_Y, perform a Z-test of the hypothesis of equal means. Under the null, the test statistic Z follows a standard normal distribution. With the optional argument string ALT, the alternative of interest can be selected. If ALT is `"!="' or `"<>"', the null is tested against the two-sided alternative `mean (X) != mean (Y)'. If alt is `">"', the one-sided alternative `mean (X) > mean (Y)' is used. Similarly for `"<"', the one-sided alternative `mean (X) < mean (Y)' is used. The default is the two-sided case. The p-value of the test is returned in PVAL. If no output argument is given, the p-value of the test is displayed along with some information.  File: octave.info, Node: Models, Next: Distributions, Prev: Tests, Up: Statistics 25.5 Models =========== -- Function File: [THETA, BETA, DEV, DL, D2L, P] = logistic_regression (Y, X, PRINT, THETA, BETA) Perform ordinal logistic regression. Suppose Y takes values in K ordered categories, and let `gamma_i (X)' be the cumulative probability that Y falls in one of the first I categories given the covariate X. Then [theta, beta] = logistic_regression (y, x) fits the model logit (gamma_i (x)) = theta_i - beta' * x, i = 1 ... k-1 The number of ordinal categories, K, is taken to be the number of distinct values of `round (Y)'. If K equals 2, Y is binary and the model is ordinary logistic regression. The matrix X is assumed to have full column rank. Given Y only, `theta = logistic_regression (y)' fits the model with baseline logit odds only. The full form is [theta, beta, dev, dl, d2l, gamma] = logistic_regression (y, x, print, theta, beta) in which all output arguments and all input arguments except Y are optional. Setting PRINT to 1 requests summary information about the fitted model to be displayed. Setting PRINT to 2 requests information about convergence at each iteration. Other values request no information to be displayed. The input arguments THETA and BETA give initial estimates for THETA and BETA. The returned value DEV holds minus twice the log-likelihood. The returned values DL and D2L are the vector of first and the matrix of second derivatives of the log-likelihood with respect to THETA and BETA. P holds estimates for the conditional distribution of Y given X.  File: octave.info, Node: Distributions, Next: Random Number Generation, Prev: Models, Up: Statistics 25.6 Distributions ================== Octave has functions for computing the Probability Density Function (PDF), the Cumulative Distribution function (CDF), and the quantile (the inverse of the CDF) of a large number of distributions. The following table summarizes the supported distributions (in alphabetical order). *Distribution* *PDF* *CDF* *Quantile* Beta Distribution `betapdf' `betacdf' `betainv' Binomial Distribution `binopdf' `binocdf' `binoinv' Cauchy Distribution `cauchy_pdf' `cauchy_cdf' `cauchy_inv' Chi-Square `chi2pdf' `chi2cdf' `chi2inv' Distribution Univariate Discrete `discrete_pdf' `discrete_cdf' `discrete_inv' Distribution Empirical Distribution `empirical_pdf' `empirical_cdf' `empirical_inv' Exponential `exppdf' `expcdf' `expinv' Distribution F Distribution `fpdf' `fcdf' `finv' Gamma Distribution `gampdf' `gamcdf' `gaminv' Geometric Distribution `geopdf' `geocdf' `geoinv' Hypergeometric `hygepdf' `hygecdf' `hygeinv' Distribution Kolmogorov Smirnov _Not Available_ `kolmogorov_smirnov_cdf'_Not Available_ Distribution Laplace Distribution `laplace_pdf' `laplace_cdf' `laplace_inv' Logistic Distribution `logistic_pdf' `logistic_cdf' `logistic_inv' Log-Normal `lognpdf' `logncdf' `logninv' Distribution Pascal Distribution `nbinpdf' `nbincdf' `nbininv' Univariate Normal `normpdf' `normcdf' `norminv' Distribution Poisson Distribution `poisspdf' `poisscdf' `poissinv' t (Student) `tpdf' `tcdf' `tinv' Distribution Univariate Discrete `unidpdf' `unidcdf' `unidinv' Distribution Uniform Distribution `unifpdf' `unifcdf' `unifinv' Weibull Distribution `wblpdf' `wblcdf' `wblinv' -- Function File: betacdf (X, A, B) For each element of X, returns the CDF at X of the beta distribution with parameters A and B, i.e., PROB (beta (A, B) <= X). -- Function File: betainv (X, A, B) For each component of X, compute the quantile (the inverse of the CDF) at X of the Beta distribution with parameters A and B. -- Function File: betapdf (X, A, B) For each element of X, returns the PDF at X of the beta distribution with parameters A and B. -- Function File: binocdf (X, N, P) For each element of X, compute the CDF at X of the binomial distribution with parameters N and P. -- Function File: binoinv (X, N, P) For each element of X, compute the quantile at X of the binomial distribution with parameters N and P. -- Function File: binopdf (X, N, P) For each element of X, compute the probability density function (PDF) at X of the binomial distribution with parameters N and P. -- Function File: cauchy_cdf (X, LAMBDA, SIGMA) For each element of X, compute the cumulative distribution function (CDF) at X of the Cauchy distribution with location parameter LAMBDA and scale parameter SIGMA. Default values are LAMBDA = 0, SIGMA = 1. -- Function File: cauchy_inv (X, LAMBDA, SIGMA) For each element of X, compute the quantile (the inverse of the CDF) at X of the Cauchy distribution with location parameter LAMBDA and scale parameter SIGMA. Default values are LAMBDA = 0, SIGMA = 1. -- Function File: cauchy_pdf (X, LAMBDA, SIGMA) For each element of X, compute the probability density function (PDF) at X of the Cauchy distribution with location parameter LAMBDA and scale parameter SIGMA > 0. Default values are LAMBDA = 0, SIGMA = 1. -- Function File: chi2cdf (X, N) For each element of X, compute the cumulative distribution function (CDF) at X of the chisquare distribution with N degrees of freedom. -- Function File: chi2inv (X, N) For each element of X, compute the quantile (the inverse of the CDF) at X of the chisquare distribution with N degrees of freedom. -- Function File: chisquare_pdf (X, N) For each element of X, compute the probability density function (PDF) at X of the chisquare distribution with N degrees of freedom. -- Function File: discrete_cdf (X, V, P) For each element of X, compute the cumulative distribution function (CDF) at X of a univariate discrete distribution which assumes the values in V with probabilities P. -- Function File: discrete_inv (X, V, P) For each component of X, compute the quantile (the inverse of the CDF) at X of the univariate distribution which assumes the values in V with probabilities P. -- Function File: discrete_pdf (X, V, P) For each element of X, compute the probability density function (PDF) at X of a univariate discrete distribution which assumes the values in V with probabilities P. -- Function File: empirical_cdf (X, DATA) For each element of X, compute the cumulative distribution function (CDF) at X of the empirical distribution obtained from the univariate sample DATA. -- Function File: empirical_inv (X, DATA) For each element of X, compute the quantile (the inverse of the CDF) at X of the empirical distribution obtained from the univariate sample DATA. -- Function File: empirical_pdf (X, DATA) For each element of X, compute the probability density function (PDF) at X of the empirical distribution obtained from the univariate sample DATA. -- Function File: expcdf (X, LAMBDA) For each element of X, compute the cumulative distribution function (CDF) at X of the exponential distribution with mean LAMBDA. The arguments can be of common size or scalar. -- Function File: expinv (X, LAMBDA) For each element of X, compute the quantile (the inverse of the CDF) at X of the exponential distribution with mean LAMBDA. -- Function File: exppdf (X, LAMBDA) For each element of X, compute the probability density function (PDF) of the exponential distribution with mean LAMBDA. -- Function File: fcdf (X, M, N) For each element of X, compute the CDF at X of the F distribution with M and N degrees of freedom, i.e., PROB (F (M, N) <= X). -- Function File: finv (X, M, N) For each component of X, compute the quantile (the inverse of the CDF) at X of the F distribution with parameters M and N. -- Function File: fpdf (X, M, N) For each element of X, compute the probability density function (PDF) at X of the F distribution with M and N degrees of freedom. -- Function File: gamcdf (X, A, B) For each element of X, compute the cumulative distribution function (CDF) at X of the Gamma distribution with parameters A and B. *See also:* *note gamma: doc-gamma, *note gammaln: doc-gammaln, *note gammainc: doc-gammainc, *note gampdf: doc-gampdf, *note gaminv: doc-gaminv, *note gamrnd: doc-gamrnd. -- Function File: gaminv (X, A, B) For each component of X, compute the quantile (the inverse of the CDF) at X of the Gamma distribution with parameters A and B. *See also:* *note gamma: doc-gamma, *note gammaln: doc-gammaln, *note gammainc: doc-gammainc, *note gampdf: doc-gampdf, *note gamcdf: doc-gamcdf, *note gamrnd: doc-gamrnd. -- Function File: gampdf (X, A, B) For each element of X, return the probability density function (PDF) at X of the Gamma distribution with parameters A and B. *See also:* *note gamma: doc-gamma, *note gammaln: doc-gammaln, *note gammainc: doc-gammainc, *note gamcdf: doc-gamcdf, *note gaminv: doc-gaminv, *note gamrnd: doc-gamrnd. -- Function File: geocdf (X, P) For each element of X, compute the CDF at X of the geometric distribution with parameter P. -- Function File: geoinv (X, P) For each element of X, compute the quantile at X of the geometric distribution with parameter P. -- Function File: geopdf (X, P) For each element of X, compute the probability density function (PDF) at X of the geometric distribution with parameter P. -- Function File: hygecdf (X, T, M, N) Compute the cumulative distribution function (CDF) at X of the hypergeometric distribution with parameters T, M, and N. This is the probability of obtaining not more than X marked items when randomly drawing a sample of size N without replacement from a population of total size T containing M marked items. The parameters T, M, and N must positive integers with M and N not greater than T. -- Function File: hygeinv (X, T, M, N) For each element of X, compute the quantile at X of the hypergeometric distribution with parameters T, M, and N. The parameters T, M, and N must positive integers with M and N not greater than T. -- Function File: hygepdf (X, T, M, N) Compute the probability density function (PDF) at X of the hypergeometric distribution with parameters T, M, and N. This is the probability of obtaining X marked items when randomly drawing a sample of size N without replacement from a population of total size T containing M marked items. The arguments must be of common size or scalar. -- Function File: kolmogorov_smirnov_cdf (X, TOL) Return the CDF at X of the Kolmogorov-Smirnov distribution, Inf Q(x) = SUM (-1)^k exp(-2 k^2 x^2) k = -Inf for X > 0. The optional parameter TOL specifies the precision up to which the series should be evaluated; the default is TOL = `eps'. -- Function File: laplace_cdf (X) For each element of X, compute the cumulative distribution function (CDF) at X of the Laplace distribution. -- Function File: laplace_inv (X) For each element of X, compute the quantile (the inverse of the CDF) at X of the Laplace distribution. -- Function File: laplace_pdf (X) For each element of X, compute the probability density function (PDF) at X of the Laplace distribution. -- Function File: logistic_cdf (X) For each component of X, compute the CDF at X of the logistic distribution. -- Function File: logistic_inv (X) For each component of X, compute the quantile (the inverse of the CDF) at X of the logistic distribution. -- Function File: logistic_pdf (X) For each component of X, compute the PDF at X of the logistic distribution. -- Function File: logncdf (X, MU, SIGMA) For each element of X, compute the cumulative distribution function (CDF) at X of the lognormal distribution with parameters MU and SIGMA. If a random variable follows this distribution, its logarithm is normally distributed with mean MU and standard deviation SIGMA. Default values are MU = 1, SIGMA = 1. -- Function File: logninv (X, MU, SIGMA) For each element of X, compute the quantile (the inverse of the CDF) at X of the lognormal distribution with parameters MU and SIGMA. If a random variable follows this distribution, its logarithm is normally distributed with mean `log (MU)' and variance SIGMA. Default values are MU = 1, SIGMA = 1. -- Function File: lognpdf (X, MU, SIGMA) For each element of X, compute the probability density function (PDF) at X of the lognormal distribution with parameters MU and SIGMA. If a random variable follows this distribution, its logarithm is normally distributed with mean MU and standard deviation SIGMA. Default values are MU = 1, SIGMA = 1. -- Function File: nbincdf (X, N, P) For each element of X, compute the CDF at x of the Pascal (negative binomial) distribution with parameters N and P. The number of failures in a Bernoulli experiment with success probability P before the N-th success follows this distribution. -- Function File: nbininv (X, N, P) For each element of X, compute the quantile at X of the Pascal (negative binomial) distribution with parameters N and P. The number of failures in a Bernoulli experiment with success probability P before the N-th success follows this distribution. -- Function File: nbinpdf (X, N, P) For each element of X, compute the probability density function (PDF) at X of the Pascal (negative binomial) distribution with parameters N and P. The number of failures in a Bernoulli experiment with success probability P before the N-th success follows this distribution. -- Function File: normcdf (X, M, S) For each element of X, compute the cumulative distribution function (CDF) at X of the normal distribution with mean M and standard deviation S. Default values are M = 0, S = 1. -- Function File: norminv (X, M, S) For each element of X, compute the quantile (the inverse of the CDF) at X of the normal distribution with mean M and standard deviation S. Default values are M = 0, S = 1. -- Function File: normpdf (X, M, S) For each element of X, compute the probability density function (PDF) at X of the normal distribution with mean M and standard deviation S. Default values are M = 0, S = 1. -- Function File: poisscdf (X, LAMBDA) For each element of X, compute the cumulative distribution function (CDF) at X of the Poisson distribution with parameter lambda. -- Function File: poissinv (X, LAMBDA) For each component of X, compute the quantile (the inverse of the CDF) at X of the Poisson distribution with parameter LAMBDA. -- Function File: poisspdf (X, LAMBDA) For each element of X, compute the probability density function (PDF) at X of the poisson distribution with parameter LAMBDA. -- Function File: tcdf (X, N) For each element of X, compute the cumulative distribution function (CDF) at X of the t (Student) distribution with N degrees of freedom, i.e., PROB (t(N) <= X). -- Function File: tinv (X, N) For each probability value X, compute the inverse of the cumulative distribution function (CDF) of the t (Student) distribution with degrees of freedom N. This function is analogous to looking in a table for the t-value of a single-tailed distribution. -- Function File: tpdf (X, N) For each element of X, compute the probability density function (PDF) at X of the T (Student) distribution with N degrees of freedom. -- Function File: unidcdf (X, V) For each element of X, compute the cumulative distribution function (CDF) at X of a univariate discrete distribution which assumes the values in V with equal probability. -- Function File: unidinv (X, V) For each component of X, compute the quantile (the inverse of the CDF) at X of the univariate discrete distribution which assumes the values in V with equal probability -- Function File: unidpdf (X, V) For each element of X, compute the probability density function (PDF) at X of a univariate discrete distribution which assumes the values in V with equal probability. -- Function File: unifcdf (X, A, B) Return the CDF at X of the uniform distribution on [A, B], i.e., PROB (uniform (A, B) <= x). Default values are A = 0, B = 1. -- Function File: unifinv (X, A, B) For each element of X, compute the quantile (the inverse of the CDF) at X of the uniform distribution on [A, B]. Default values are A = 0, B = 1. -- Function File: unifpdf (X, A, B) For each element of X, compute the PDF at X of the uniform distribution on [A, B]. Default values are A = 0, B = 1. -- Function File: wblcdf (X, SCALE, SHAPE) Compute the cumulative distribution function (CDF) at X of the Weibull distribution with shape parameter SCALE and scale parameter SHAPE, which is 1 - exp(-(x/shape)^scale) for X >= 0. -- Function File: wblinv (X, SCALE, SHAPE) Compute the quantile (the inverse of the CDF) at X of the Weibull distribution with shape parameter SCALE and scale parameter SHAPE. -- Function File: wblpdf (X, SCALE, SHAPE) Compute the probability density function (PDF) at X of the Weibull distribution with shape parameter SCALE and scale parameter SHAPE which is given by scale * shape^(-scale) * x^(scale-1) * exp(-(x/shape)^scale) for X > 0.  File: octave.info, Node: Random Number Generation, Prev: Distributions, Up: Statistics 25.7 Random Number Generation ============================= Octave can generate random numbers from a large number of distributions. The random number generators are based on the random number generators described in *note Special Utility Matrices::. The following table summarizes the available random number generators (in alphabetical order). *Distribution* *Function* Beta Distribution `betarnd' Binomial Distribution `binornd' Cauchy Distribution `cauchy_rnd' Chi-Square Distribution `chi2rnd' Univariate Discrete `discrete_rnd' Distribution Empirical Distribution `empirical_rnd' Exponential Distribution `exprnd' F Distribution `frnd' Gamma Distribution `gamrnd' Geometric Distribution `geornd' Hypergeometric Distribution `hygernd' Laplace Distribution `laplace_rnd' Logistic Distribution `logistic_rnd' Log-Normal Distribution `lognrnd' Pascal Distribution `nbinrnd' Univariate Normal `normrnd' Distribution Poisson Distribution `poissrnd' t (Student) Distribution `trnd' Univariate Discrete `unidrnd' Distribution Uniform Distribution `unifrnd' Weibull Distribution `wblrnd' Wiener Process `wienrnd' -- Function File: betarnd (A, B, R, C) -- Function File: betarnd (A, B, SZ) Return an R by C or `size (SZ)' matrix of random samples from the Beta distribution with parameters A and B. Both A and B must be scalar or of size R by C. If R and C are omitted, the size of the result matrix is the common size of A and B. -- Function File: binornd (N, P, R, C) -- Function File: binornd (N, P, SZ) Return an R by C or a `size (SZ)' matrix of random samples from the binomial distribution with parameters N and P. Both N and P must be scalar or of size R by C. If R and C are omitted, the size of the result matrix is the common size of N and P. -- Function File: cauchy_rnd (LAMBDA, SIGMA, R, C) -- Function File: cauchy_rnd (LAMBDA, SIGMA, SZ) Return an R by C or a `size (SZ)' matrix of random samples from the Cauchy distribution with parameters LAMBDA and SIGMA which must both be scalar or of size R by C. If R and C are omitted, the size of the result matrix is the common size of LAMBDA and SIGMA. -- Function File: chi2rnd (N, R, C) -- Function File: chi2rnd (N, SZ) Return an R by C or a `size (SZ)' matrix of random samples from the chisquare distribution with N degrees of freedom. N must be a scalar or of size R by C. If R and C are omitted, the size of the result matrix is the size of N. -- Function File: discrete_rnd (N, V, P) -- Function File: discrete_rnd (V, P, R, C) -- Function File: discrete_rnd (V, P, SZ) Generate a row vector containing a random sample of size N from the univariate distribution which assumes the values in V with probabilities P. N must be a scalar. If R and C are given create a matrix with R rows and C columns. Or if SZ is a vector, create a matrix of size SZ. -- Function File: empirical_rnd (N, DATA) -- Function File: empirical_rnd (DATA, R, C) -- Function File: empirical_rnd (DATA, SZ) Generate a bootstrap sample of size N from the empirical distribution obtained from the univariate sample DATA. If R and C are given create a matrix with R rows and C columns. Or if SZ is a vector, create a matrix of size SZ. -- Function File: exprnd (LAMBDA, R, C) -- Function File: exprnd (LAMBDA, SZ) Return an R by C matrix of random samples from the exponential distribution with mean LAMBDA, which must be a scalar or of size R by C. Or if SZ is a vector, create a matrix of size SZ. If R and C are omitted, the size of the result matrix is the size of LAMBDA. -- Function File: frnd (M, N, R, C) -- Function File: frnd (M, N, SZ) Return an R by C matrix of random samples from the F distribution with M and N degrees of freedom. Both M and N must be scalar or of size R by C. If SZ is a vector the random samples are in a matrix of size SZ. If R and C are omitted, the size of the result matrix is the common size of M and N. -- Function File: gamrnd (A, B, R, C) -- Function File: gamrnd (A, B, SZ) Return an R by C or a `size (SZ)' matrix of random samples from the Gamma distribution with parameters A and B. Both A and B must be scalar or of size R by C. If R and C are omitted, the size of the result matrix is the common size of A and B. *See also:* *note gamma: doc-gamma, *note gammaln: doc-gammaln, *note gammainc: doc-gammainc, *note gampdf: doc-gampdf, *note gamcdf: doc-gamcdf, *note gaminv: doc-gaminv. -- Function File: geornd (P, R, C) -- Function File: geornd (P, SZ) Return an R by C matrix of random samples from the geometric distribution with parameter P, which must be a scalar or of size R by C. If R and C are given create a matrix with R rows and C columns. Or if SZ is a vector, create a matrix of size SZ. -- Function File: hygernd (T, M, N, R, C) -- Function File: hygernd (T, M, N, SZ) -- Function File: hygernd (T, M, N) Return an R by C matrix of random samples from the hypergeometric distribution with parameters T, M, and N. The parameters T, M, and N must positive integers with M and N not greater than T. The parameter SZ must be scalar or a vector of matrix dimensions. If SZ is scalar, then a SZ by SZ matrix of random samples is generated. -- Function File: laplace_rnd (R, C) -- Function File: laplace_rnd (SZ); Return an R by C matrix of random numbers from the Laplace distribution. Or if SZ is a vector, create a matrix of SZ. -- Function File: logistic_rnd (R, C) -- Function File: logistic_rnd (SZ) Return an R by C matrix of random numbers from the logistic distribution. Or if SZ is a vector, create a matrix of SZ. -- Function File: lognrnd (MU, SIGMA, R, C) -- Function File: lognrnd (MU, SIGMA, SZ) Return an R by C matrix of random samples from the lognormal distribution with parameters MU and SIGMA. Both MU and SIGMA must be scalar or of size R by C. Or if SZ is a vector, create a matrix of size SZ. If R and C are omitted, the size of the result matrix is the common size of MU and SIGMA. -- Function File: nbinrnd (N, P, R, C) -- Function File: nbinrnd (N, P, SZ) Return an R by C matrix of random samples from the Pascal (negative binomial) distribution with parameters N and P. Both N and P must be scalar or of size R by C. If R and C are omitted, the size of the result matrix is the common size of N and P. Or if SZ is a vector, create a matrix of size SZ. -- Function File: normrnd (M, S, R, C) -- Function File: normrnd (M, S, SZ) Return an R by C or `size (SZ)' matrix of random samples from the normal distribution with parameters mean M and standard deviation S. Both M and S must be scalar or of size R by C. If R and C are omitted, the size of the result matrix is the common size of M and S. -- Function File: poissrnd (LAMBDA, R, C) Return an R by C matrix of random samples from the Poisson distribution with parameter LAMBDA, which must be a scalar or of size R by C. If R and C are omitted, the size of the result matrix is the size of LAMBDA. -- Function File: trnd (N, R, C) -- Function File: trnd (N, SZ) Return an R by C matrix of random samples from the t (Student) distribution with N degrees of freedom. N must be a scalar or of size R by C. Or if SZ is a vector create a matrix of size SZ. If R and C are omitted, the size of the result matrix is the size of N. -- Function File: unidrnd (MX); -- Function File: unidrnd (MX, V); -- Function File: unidrnd (MX, M, N, ...); Return random values from discrete uniform distribution, with maximum value(s) given by the integer MX, which may be a scalar or multidimensional array. If MX is a scalar, the size of the result is specified by the vector V, or by the optional arguments M, N, .... Otherwise, the size of the result is the same as the size of MX. -- Function File: unifrnd (A, B, R, C) -- Function File: unifrnd (A, B, SZ) Return an R by C or a `size (SZ)' matrix of random samples from the uniform distribution on [A, B]. Both A and B must be scalar or of size R by C. If R and C are omitted, the size of the result matrix is the common size of A and B. -- Function File: wblrnd (SCALE, SHAPE, R, C) -- Function File: wblrnd (SCALE, SHAPE, SZ) Return an R by C matrix of random samples from the Weibull distribution with parameters SCALE and SHAPE which must be scalar or of size R by C. Or if SZ is a vector return a matrix of size SZ. If R and C are omitted, the size of the result matrix is the common size of ALPHA and SIGMA. -- Function File: wienrnd (T, D, N) Return a simulated realization of the D-dimensional Wiener Process on the interval [0, T]. If D is omitted, D = 1 is used. The first column of the return matrix contains time, the remaining columns contain the Wiener process. The optional parameter N gives the number of summands used for simulating the process over an interval of length 1. If N is omitted, N = 1000 is used.  File: octave.info, Node: Sets, Next: Polynomial Manipulations, Prev: Statistics, Up: Top 26 Sets ******* Octave has a limited number of functions for managing sets of data, where a set is defined as a collection of unique elements. In Octave a set is represented as a vector of numbers. -- Function File: unique (X) -- Function File: unique (X, "rows") -- Function File: unique (..., "first") -- Function File: unique (..., "last") -- Function File: [Y, I, J] = unique (...) Return the unique elements of X, sorted in ascending order. If X is a row vector, return a row vector, but if X is a column vector or a matrix return a column vector. If the optional argument `"rows"' is supplied, return the unique rows of X, sorted in ascending order. If requested, return index vectors I and J such that `x(i)==y' and `y(j)==x'. Additionally, one of `"first"' or `"last"' may be given as an argument. If `"last"' is specified, return the highest possible indices in I, otherwise, if `"first"' is specified, return the lowest. The default is `"last"'. *See also:* *note union: doc-union, *note intersect: doc-intersect, *note setdiff: doc-setdiff, *note setxor: doc-setxor, *note ismember: doc-ismember. * Menu: * Set Operations::  File: octave.info, Node: Set Operations, Up: Sets 26.1 Set Operations =================== Octave supports the basic set operations. That is, Octave can compute the union, intersection, complement, and difference of two sets. Octave also supports the _Exclusive Or_ set operation, and membership determination. The functions for set operations all work in pretty much the same way. As an example, assume that `x' and `y' contains two sets, then union(x, y) computes the union of the two sets. -- Function File: [TF = ismember (A, S) -- Function File: [TF, S_IDX] = ismember (A, S) -- Function File: [TF, S_IDX] = ismember (A, S, "rows") Return a matrix TF with the same shape as A which has a 1 if `A(i,j)' is in S and 0 if it is not. If a second output argument is requested, the index into S of each of the matching elements is also returned. a = [3, 10, 1]; s = [0:9]; [tf, s_idx] = ismember (a, s); => tf = [1, 0, 1] => s_idx = [4, 0, 2] The inputs, A and S, may also be cell arrays. a = {'abc'}; s = {'abc', 'def'}; [tf, s_idx] = ismember (a, s); => tf = [1, 0] => s_idx = [1, 0] With the optional third argument `"rows"', and matrices A and S with the same number of columns, compare rows in A with the rows in S. a = [1:3; 5:7; 4:6]; s = [0:2; 1:3; 2:4; 3:5; 4:6]; [tf, s_idx] = ismember(a, s, 'rows'); => tf = logical ([1; 0; 1]) => s_idx = [2; 0; 5]; *See also:* *note unique: doc-unique, *note union: doc-union, *note intersect: doc-intersect, *note setxor: doc-setxor, *note setdiff: doc-setdiff. -- Function File: union (A, B) -- Function File: union (A, B, "rows") Return the set of elements that are in either of the sets A and B. For example, union ([1, 2, 4], [2, 3, 5]) => [1, 2, 3, 4, 5] If the optional third input argument is the string "rows" each row of the matrices A and B will be considered an element of sets. For example, union([1, 2; 2, 3], [1, 2; 3, 4], "rows") => 1 2 2 3 3 4 -- Function File: [C, IA, IB] = union (A, B) Return index vectors IA and IB such that `a == c(ia)' and `b == c(ib)'. *See also:* *note intersect: doc-intersect, *note complement: doc-complement, *note unique: doc-unique. -- Function File: intersect (A, B) -- Function File: [C, IA, IB] = intersect (A, B) Return the elements in both A and B, sorted in ascending order. If A and B are both column vectors return a column vector, otherwise return a row vector. Return index vectors IA and IB such that `a(ia)==c' and `b(ib)==c'. *See also:* *note unique: doc-unique, *note union: doc-union, *note setxor: doc-setxor, *note setdiff: doc-setdiff, *note ismember: doc-ismember. -- Function File: complement (X, Y) Return the elements of set Y that are not in set X. For example, complement ([ 1, 2, 3 ], [ 2, 3, 5 ]) => 5 *See also:* *note union: doc-union, *note intersect: doc-intersect, *note unique: doc-unique. -- Function File: setdiff (A, B) -- Function File: setdiff (A, B, "rows") -- Function File: [C, I] = setdiff (A, B) Return the elements in A that are not in B, sorted in ascending order. If A and B are both column vectors return a column vector, otherwise return a row vector. Given the optional third argument `"rows"', return the rows in A that are not in B, sorted in ascending order by rows. If requested, return I such that `c = a(i)'. *See also:* *note unique: doc-unique, *note union: doc-union, *note intersect: doc-intersect, *note setxor: doc-setxor, *note ismember: doc-ismember. -- Function File: setxor (A, B) -- Function File: setxor (A, B, 'rows') Return the elements exclusive to A or B, sorted in ascending order. If A and B are both column vectors return a column vector, otherwise return a row vector. -- Function File: [C, IA, IB] = setxor (A, B) Return index vectors IA and IB such that `a == c(ia)' and `b == c(ib)'. *See also:* *note unique: doc-unique, *note union: doc-union, *note intersect: doc-intersect, *note setdiff: doc-setdiff, *note ismember: doc-ismember.  File: octave.info, Node: Polynomial Manipulations, Next: Interpolation, Prev: Sets, Up: Top 27 Polynomial Manipulations *************************** In Octave, a polynomial is represented by its coefficients (arranged in descending order). For example, a vector C of length N+1 corresponds to the following polynomial of order N p(x) = C(1) x^N + ... + C(N) x + C(N+1). * Menu: * Evaluating Polynomials:: * Finding Roots:: * Products of Polynomials:: * Derivatives and Integrals:: * Polynomial Interpolation:: * Miscellaneous Functions::  File: octave.info, Node: Evaluating Polynomials, Next: Finding Roots, Up: Polynomial Manipulations 27.1 Evaluating Polynomials =========================== The value of a polynomial represented by the vector C can be evaluated at the point X very easily, as the following example shows: N = length(c)-1; val = dot( x.^(N:-1:0), c ); While the above example shows how easy it is to compute the value of a polynomial, it isn't the most stable algorithm. With larger polynomials you should use more elegant algorithms, such as Horner's Method, which is exactly what the Octave function `polyval' does. In the case where X is a square matrix, the polynomial given by C is still well-defined. As when X is a scalar the obvious implementation is easily expressed in Octave, but also in this case more elegant algorithms perform better. The `polyvalm' function provides such an algorithm. -- Function File: Y = polyval (P, X) -- Function File: Y = polyval (P, X, [], MU) Evaluate the polynomial at of the specified values for X. When MU is present evaluate the polynomial for (X-MU(1))/MU(2). If X is a vector or matrix, the polynomial is evaluated for each of the elements of X. -- Function File: [Y, DY] = polyval (P, X, S) -- Function File: [Y, DY] = polyval (P, X, S, MU) In addition to evaluating the polynomial, the second output represents the prediction interval, Y +/- DY, which contains at least 50% of the future predictions. To calculate the prediction interval, the structured variable S, originating form `polyfit', must be present. *See also:* *note polyfit: doc-polyfit, *note polyvalm: doc-polyvalm, *note poly: doc-poly, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note residue: doc-residue, *note filter: doc-filter, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg. -- Function File: polyvalm (C, X) Evaluate a polynomial in the matrix sense. `polyvalm (C, X)' will evaluate the polynomial in the matrix sense, i.e., matrix multiplication is used instead of element by element multiplication as is used in polyval. The argument X must be a square matrix. *See also:* *note polyval: doc-polyval, *note poly: doc-poly, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note residue: doc-residue, *note filter: doc-filter, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg.  File: octave.info, Node: Finding Roots, Next: Products of Polynomials, Prev: Evaluating Polynomials, Up: Polynomial Manipulations 27.2 Finding Roots ================== Octave can find the roots of a given polynomial. This is done by computing the companion matrix of the polynomial (see the `compan' function for a definition), and then finding its eigenvalues. -- Function File: roots (V) For a vector V with N components, return the roots of the polynomial v(1) * z^(N-1) + ... + v(N-1) * z + v(N) As an example, the following code finds the roots of the quadratic polynomial p(x) = x^2 - 5. c = [1, 0, -5]; roots(c) => 2.2361 => -2.2361 Note that the true result is +/- sqrt(5) which is roughly +/- 2.2361. *See also:* *note compan: doc-compan. -- Function File: compan (C) Compute the companion matrix corresponding to polynomial coefficient vector C. The companion matrix is _ _ | -c(2)/c(1) -c(3)/c(1) ... -c(N)/c(1) -c(N+1)/c(1) | | 1 0 ... 0 0 | | 0 1 ... 0 0 | A = | . . . . . | | . . . . . | | . . . . . | |_ 0 0 ... 1 0 _| The eigenvalues of the companion matrix are equal to the roots of the polynomial. *See also:* *note poly: doc-poly, *note roots: doc-roots, *note residue: doc-residue, *note conv: doc-conv, *note deconv: doc-deconv, *note polyval: doc-polyval, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg. -- Function File: [MULTP, INDX] = mpoles (P) -- Function File: [MULTP, INDX] = mpoles (P, TOL) -- Function File: [MULTP, INDX] = mpoles (P, TOL, REORDER) Identify unique poles in P and associates their multiplicity, ordering them from largest to smallest. If the relative difference of the poles is less than TOL, then they are considered to be multiples. The default value for TOL is 0.001. If the optional parameter REORDER is zero, poles are not sorted. The value MULTP is a vector specifying the multiplicity of the poles. MULTP(:) refers to multiplicity of P(INDX(:)). For example, p = [2 3 1 1 2]; [m, n] = mpoles(p); => m = [1; 1; 2; 1; 2] => n = [2; 5; 1; 4; 3] => p(n) = [3, 2, 2, 1, 1] *See also:* *note poly: doc-poly, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note polyval: doc-polyval, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg, *note residue: doc-residue.  File: octave.info, Node: Products of Polynomials, Next: Derivatives and Integrals, Prev: Finding Roots, Up: Polynomial Manipulations 27.3 Products of Polynomials ============================ -- Function File: conv (A, B) Convolve two vectors. `y = conv (a, b)' returns a vector of length equal to `length (a) + length (b) - 1'. If A and B are polynomial coefficient vectors, `conv' returns the coefficients of the product polynomial. *See also:* *note deconv: doc-deconv, *note poly: doc-poly, *note roots: doc-roots, *note residue: doc-residue, *note polyval: doc-polyval, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg. -- Function File: C = convn (A, B, SHAPE) N-dimensional convolution of matrices A and B. The size of the output is determined by the SHAPE argument. This can be any of the following character strings: "full" The full convolution result is returned. The size out of the output is `size (A) + size (B)-1'. This is the default behavior. "same" The central part of the convolution result is returned. The size out of the output is the same as A. "valid" The valid part of the convolution is returned. The size of the result is `max (size (A) - size (B)+1, 0)'. *See also:* *note conv: doc-conv, *note conv2: doc-conv2. -- Function File: deconv (Y, A) Deconvolve two vectors. `[b, r] = deconv (y, a)' solves for B and R such that `y = conv (a, b) + r'. If Y and A are polynomial coefficient vectors, B will contain the coefficients of the polynomial quotient and R will be a remainder polynomial of lowest order. *See also:* *note conv: doc-conv, *note poly: doc-poly, *note roots: doc-roots, *note residue: doc-residue, *note polyval: doc-polyval, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg. -- Loadable Function: y = conv2 (A, B, SHAPE) -- Loadable Function: y = conv2 (V1, V2, M, SHAPE) Returns 2D convolution of A and B where the size of C is given by SHAPE= 'full' returns full 2-D convolution SHAPE= 'same' same size as a. 'central' part of convolution SHAPE= 'valid' only parts which do not include zero-padded edges By default SHAPE is 'full'. When the third argument is a matrix returns the convolution of the matrix M by the vector V1 in the column direction and by vector V2 in the row direction -- Function File: Q = polygcd (B, A, TOL) Find greatest common divisor of two polynomials. This is equivalent to the polynomial found by multiplying together all the common roots. Together with deconv, you can reduce a ratio of two polynomials. Tolerance defaults to sqrt(eps). Note that this is an unstable algorithm, so don't try it on large polynomials. Example polygcd (poly(1:8), poly(3:12)) - poly(3:8) => [ 0, 0, 0, 0, 0, 0, 0 ] deconv (poly(1:8), polygcd (poly(1:8), poly(3:12))) ... - poly(1:2) => [ 0, 0, 0 ] *See also:* *note poly: doc-poly, *note polyinteg: doc-polyinteg, *note polyderiv: doc-polyderiv, *note polyreduce: doc-polyreduce, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note residue: doc-residue, *note filter: doc-filter, *note polyval: doc-polyval, *note polyvalm: doc-polyvalm. -- Function File: [R, P, K, E] = residue (B, A) Compute the partial fraction expansion for the quotient of the polynomials, B and A. B(s) M r(m) N ---- = SUM ------------- + SUM k(i)*s^(N-i) A(s) m=1 (s-p(m))^e(m) i=1 where M is the number of poles (the length of the R, P, and E), the K vector is a polynomial of order N-1 representing the direct contribution, and the E vector specifies the multiplicity of the m-th residue's pole. For example, b = [1, 1, 1]; a = [1, -5, 8, -4]; [r, p, k, e] = residue (b, a); => r = [-2; 7; 3] => p = [2; 2; 1] => k = [](0x0) => e = [1; 2; 1] which represents the following partial fraction expansion s^2 + s + 1 -2 7 3 ------------------- = ----- + ------- + ----- s^3 - 5s^2 + 8s - 4 (s-2) (s-2)^2 (s-1) -- Function File: [B, A] = residue (R, P, K) -- Function File: [B, A] = residue (R, P, K, E) Compute the reconstituted quotient of polynomials, B(s)/A(s), from the partial fraction expansion; represented by the residues, poles, and a direct polynomial specified by R, P and K, and the pole multiplicity E. If the multiplicity, E, is not explicitly specified the multiplicity is determined by the script mpoles.m. For example, r = [-2; 7; 3]; p = [2; 2; 1]; k = [1, 0]; [b, a] = residue (r, p, k); => b = [1, -5, 9, -3, 1] => a = [1, -5, 8, -4] where mpoles.m is used to determine e = [1; 2; 1] Alternatively the multiplicity may be defined explicitly, for example, r = [7; 3; -2]; p = [2; 1; 2]; k = [1, 0]; e = [2; 1; 1]; [b, a] = residue (r, p, k, e); => b = [1, -5, 9, -3, 1] => a = [1, -5, 8, -4] which represents the following partial fraction expansion -2 7 3 s^4 - 5s^3 + 9s^2 - 3s + 1 ----- + ------- + ----- + s = -------------------------- (s-2) (s-2)^2 (s-1) s^3 - 5s^2 + 8s - 4 *See also:* *note poly: doc-poly, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note mpoles: doc-mpoles, *note polyval: doc-polyval, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg.  File: octave.info, Node: Derivatives and Integrals, Next: Polynomial Interpolation, Prev: Products of Polynomials, Up: Polynomial Manipulations 27.4 Derivatives and Integrals ============================== Octave comes with functions for computing the derivative and the integral of a polynomial. The functions `polyderiv' and `polyint' both return new polynomials describing the result. As an example we'll compute the definite integral of p(x) = x^2 + 1 from 0 to 3. c = [1, 0, 1]; integral = polyint(c); area = polyval(integral, 3) - polyval(integral, 0) => 12 -- Function File: polyderiv (C) -- Function File: [Q] = polyderiv (B, A) -- Function File: [Q, R] = polyderiv (B, A) Return the coefficients of the derivative of the polynomial whose coefficients are given by vector C. If a pair of polynomials is given B and A, the derivative of the product is returned in Q, or the quotient numerator in Q and the quotient denominator in R. *See also:* *note poly: doc-poly, *note polyinteg: doc-polyinteg, *note polyreduce: doc-polyreduce, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note residue: doc-residue, *note filter: doc-filter, *note polygcd: doc-polygcd, *note polyval: doc-polyval, *note polyvalm: doc-polyvalm. -- Function File: polyder (C) -- Function File: [Q] = polyder (B, A) -- Function File: [Q, R] = polyder (B, A) See polyderiv. -- Function File: polyinteg (C) Return the coefficients of the integral of the polynomial whose coefficients are represented by the vector C. The constant of integration is set to zero. *See also:* *note polyint: doc-polyint, *note poly: doc-poly, *note polyderiv: doc-polyderiv, *note polyreduce: doc-polyreduce, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note residue: doc-residue, *note filter: doc-filter, *note polyval: doc-polyval, *note polyvalm: doc-polyvalm. -- Function File: polyint (C, K) Return the coefficients of the integral of the polynomial whose coefficients are represented by the vector C. The variable K is the constant of integration, which by default is set to zero. *See also:* *note poly: doc-poly, *note polyderiv: doc-polyderiv, *note polyreduce: doc-polyreduce, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note residue: doc-residue, *note filter: doc-filter, *note polyval: doc-polyval, *note polyvalm: doc-polyvalm.  File: octave.info, Node: Polynomial Interpolation, Next: Miscellaneous Functions, Prev: Derivatives and Integrals, Up: Polynomial Manipulations 27.5 Polynomial Interpolation ============================= Octave comes with good support for various kinds of interpolation, most of which are described in *note Interpolation::. One simple alternative to the functions described in the aforementioned chapter, is to fit a single polynomial to some given data points. To avoid a highly fluctuating polynomial, one most often wants to fit a low-order polynomial to data. This usually means that it is necessary to fit the polynomial in a least-squares sense, which is what the `polyfit' function does. -- Function File: [P, S, MU] = polyfit (X, Y, N) Return the coefficients of a polynomial P(X) of degree N that minimizes the least-squares-error of the fit. The polynomial coefficients are returned in a row vector. The second output is a structure containing the following fields: `R' Triangular factor R from the QR decomposition. `X' The Vandermonde matrix used to compute the polynomial coefficients. `df' The degrees of freedom. `normr' The norm of the residuals. `yf' The values of the polynomial for each value of X. The second output may be used by `polyval' to calculate the statistical error limits of the predicted values. When the third output, MU, is present the coefficients, P, are associated with a polynomial in XHAT = (X-MU(1))/MU(2). Where MU(1) = mean (X), and MU(2) = std (X). This linear transformation of X improves the numerical stability of the fit. *See also:* *note polyval: doc-polyval, *note residue: doc-residue. In situations where a single polynomial isn't good enough, a solution is to use several polynomials pieced together. The function `mkpp' creates a piece-wise polynomial, `ppval' evaluates the function created by `mkpp', and `unmkpp' returns detailed information about the function. The following example shows how to combine two linear functions and a quadratic into one function. Each of these functions is expressed on adjoined intervals. x = [-2, -1, 1, 2]; p = [ 0, 1, 0; 1, -2, 1; 0, -1, 1 ]; pp = mkpp(x, p); xi = linspace(-2, 2, 50); yi = ppval(pp, xi); plot(xi, yi); -- Function File: YI = ppval (PP, XI) Evaluate piece-wise polynomial PP at the points XI. If `PP.d' is a scalar greater than 1, or an array, then the returned value YI will be an array that is `d1, d1, ..., dk, length (XI)]'. *See also:* *note mkpp: doc-mkpp, *note unmkpp: doc-unmkpp, *note spline: doc-spline. -- Function File: PP = mkpp (X, P) -- Function File: PP = mkpp (X, P, D) Construct a piece-wise polynomial structure from sample points X and coefficients P. The i-th row of P, `P (I,:)', contains the coefficients for the polynomial over the I-th interval, ordered from highest to lowest. There must be one row for each interval in X, so `rows (P) == length (X) - 1'. You can concatenate multiple polynomials of the same order over the same set of intervals using `P = [ P1; P2; ...; PD ]'. In this case, `rows (P) == D * (length (X) - 1)'. D specifies the shape of the matrix P for all except the last dimension. If D is not specified it will be computed as `round (rows (P) / (length (X) - 1))' instead. *See also:* *note unmkpp: doc-unmkpp, *note ppval: doc-ppval, *note spline: doc-spline. -- Function File: [X, P, N, K, D] = unmkpp (PP) Extract the components of a piece-wise polynomial structure PP. These are as follows: X Sample points. P Polynomial coefficients for points in sample interval. `P (I, :)' contains the coefficients for the polynomial over interval I ordered from highest to lowest. If `D > 1', `P (R, I, :)' contains the coefficients for the r-th polynomial defined on interval I. However, this is stored as a 2-D array such that `C = reshape (P (:, J), N, D)' gives `C (I, R)' is the j-th coefficient of the r-th polynomial over the i-th interval. N Number of polynomial pieces. K Order of the polynomial plus 1. D Number of polynomials defined for each interval. *See also:* *note mkpp: doc-mkpp, *note ppval: doc-ppval, *note spline: doc-spline.  File: octave.info, Node: Miscellaneous Functions, Prev: Polynomial Interpolation, Up: Polynomial Manipulations 27.6 Miscellaneous Functions ============================ -- Function File: poly (A) If A is a square N-by-N matrix, `poly (A)' is the row vector of the coefficients of `det (z * eye (N) - a)', the characteristic polynomial of A. As an example we can use this to find the eigenvalues of A as the roots of `poly (A)'. roots(poly(eye(3))) => 1.00000 + 0.00000i => 1.00000 - 0.00000i => 1.00000 + 0.00000i In real-life examples you should, however, use the `eig' function for computing eigenvalues. If X is a vector, `poly (X)' is a vector of coefficients of the polynomial whose roots are the elements of X. That is, of C is a polynomial, then the elements of `D = roots (poly (C))' are contained in C. The vectors C and D are, however, not equal due to sorting and numerical errors. *See also:* *note eig: doc-eig, *note roots: doc-roots. -- Function File: polyout (C, X) Write formatted polynomial c(x) = c(1) * x^n + ... + c(n) x + c(n+1) and return it as a string or write it to the screen (if NARGOUT is zero). X defaults to the string `"s"'. *See also:* *note polyval: doc-polyval, *note polyvalm: doc-polyvalm, *note poly: doc-poly, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note residue: doc-residue, *note filter: doc-filter, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg. -- Function File: polyreduce (C) Reduces a polynomial coefficient vector to a minimum number of terms by stripping off any leading zeros. *See also:* *note poly: doc-poly, *note roots: doc-roots, *note conv: doc-conv, *note deconv: doc-deconv, *note residue: doc-residue, *note filter: doc-filter, *note polyval: doc-polyval, *note polyvalm: doc-polyvalm, *note polyderiv: doc-polyderiv, *note polyinteg: doc-polyinteg.  File: octave.info, Node: Interpolation, Next: Geometry, Prev: Polynomial Manipulations, Up: Top 28 Interpolation **************** * Menu: * One-dimensional Interpolation:: * Multi-dimensional Interpolation::  File: octave.info, Node: One-dimensional Interpolation, Next: Multi-dimensional Interpolation, Up: Interpolation 28.1 One-dimensional Interpolation ================================== Octave supports several methods for one-dimensional interpolation, most of which are described in this section. *note Polynomial Interpolation:: and *note Interpolation on Scattered Data:: describe further methods. -- Function File: YI = interp1 (X, Y, XI) -- Function File: YI = interp1 (..., METHOD) -- Function File: YI = interp1 (..., EXTRAP) -- Function File: PP = interp1 (..., 'pp') One-dimensional interpolation. Interpolate Y, defined at the points X, at the points XI. The sample points X must be strictly monotonic. If Y is an array, treat the columns of Y separately. Method is one of: 'nearest' Return the nearest neighbor. 'linear' Linear interpolation from nearest neighbors 'pchip' Piece-wise cubic hermite interpolating polynomial 'cubic' Cubic interpolation from four nearest neighbors 'spline' Cubic spline interpolation-smooth first and second derivatives throughout the curve Appending '*' to the start of the above method forces `interp1' to assume that X is uniformly spaced, and only `X (1)' and `X (2)' are referenced. This is usually faster, and is never slower. The default method is 'linear'. If EXTRAP is the string 'extrap', then extrapolate values beyond the endpoints. If EXTRAP is a number, replace values beyond the endpoints with that number. If EXTRAP is missing, assume NA. If the string argument 'pp' is specified, then XI should not be supplied and `interp1' returns the piece-wise polynomial that can later be used with `ppval' to evaluate the interpolation. There is an equivalence, such that `ppval (interp1 (X, Y, METHOD, 'pp'), XI) == interp1 (X, Y, XI, METHOD, 'extrap')'. An example of the use of `interp1' is xf = [0:0.05:10]; yf = sin (2*pi*xf/5); xp = [0:10]; yp = sin (2*pi*xp/5); lin = interp1 (xp, yp, xf); spl = interp1 (xp, yp, xf, "spline"); cub = interp1 (xp, yp, xf, "cubic"); near = interp1 (xp, yp, xf, "nearest"); plot (xf, yf, "r", xf, lin, "g", xf, spl, "b", xf, cub, "c", xf, near, "m", xp, yp, "r*"); legend ("original", "linear", "spline", "cubic", "nearest") *See also:* *note interpft: doc-interpft. There are some important differences between the various interpolation methods. The 'spline' method enforces that both the first and second derivatives of the interpolated values have a continuous derivative, whereas the other methods do not. This means that the results of the 'spline' method are generally smoother. If the function to be interpolated is in fact smooth, then 'spline' will give excellent results. However, if the function to be evaluated is in some manner discontinuous, then 'pchip' interpolation might give better results. This can be demonstrated by the code t = -2:2; dt = 1; ti =-2:0.025:2; dti = 0.025; y = sign(t); ys = interp1(t,y,ti,'spline'); yp = interp1(t,y,ti,'pchip'); ddys = diff(diff(ys)./dti)./dti; ddyp = diff(diff(yp)./dti)./dti; figure(1); plot (ti, ys,'r-', ti, yp,'g-'); legend('spline','pchip',4); figure(2); plot (ti, ddys,'r+', ti, ddyp,'g*'); legend('spline','pchip'); A simplified version of `interp1' that performs only linear interpolation is available in `interp1q'. This argument is slightly faster than `interp1' as to performs little error checking. -- Function File: YI = interp1q (X, Y, XI) One-dimensional linear interpolation without error checking. Interpolates Y, defined at the points X, at the points XI. The sample points X must be a strictly monotonically increasing column vector. If Y is an array, treat the columns of Y separately. If Y is a vector, it must be a column vector of the same length as X. Values of XI beyond the endpoints of the interpolation result in NA being returned. Note that the error checking is only a significant portion of the execution time of this `interp1' if the size of the input arguments is relatively small. Therefore, the benefit of using `interp1q' is relatively small. *See also:* *note interp1: doc-interp1. Fourier interpolation, is a resampling technique where a signal is converted to the frequency domain, padded with zeros and then reconverted to the time domain. -- Function File: interpft (X, N) -- Function File: interpft (X, N, DIM) Fourier interpolation. If X is a vector, then X is resampled with N points. The data in X is assumed to be equispaced. If X is an array, then operate along each column of the array separately. If DIM is specified, then interpolate along the dimension DIM. `interpft' assumes that the interpolated function is periodic, and so assumptions are made about the end points of the interpolation. *See also:* *note interp1: doc-interp1. There are two significant limitations on Fourier interpolation. Firstly, the function signal is assumed to be periodic, and so non-periodic signals will be poorly represented at the edges. Secondly, both the signal and its interpolation are required to be sampled at equispaced points. An example of the use of `interpft' is t = 0 : 0.3 : pi; dt = t(2)-t(1); n = length (t); k = 100; ti = t(1) + [0 : k-1]*dt*n/k; y = sin (4*t + 0.3) .* cos (3*t - 0.1); yp = sin (4*ti + 0.3) .* cos (3*ti - 0.1); plot (ti, yp, 'g', ti, interp1(t, y, ti, 'spline'), 'b', ... ti, interpft (y, k), 'c', t, y, 'r+'); legend ('sin(4t+0.3)cos(3t-0.1','spline','interpft','data'); which demonstrates the poor behavior of Fourier interpolation for non-periodic functions. In additional the support function `spline' and `lookup' that underlie the `interp1' function can be called directly. -- Function File: PP = spline (X, Y) -- Function File: YI = spline (X, Y, XI) Return the cubic spline interpolant of Y at points X. If called with two arguments, `spline' returns the piece-wise polynomial PP that may later be used with `ppval' to evaluate the polynomial at specific points. If called with a third input argument, `spline' evaluates the spline at the points XI. There is an equivalence between `ppval (spline (X, Y), XI)' and `spline (X, Y, XI)'. The variable X must be a vector of length N, and Y can be either a vector or array. In the case where Y is a vector, it can have a length of either N or `N + 2'. If the length of Y is N, then the 'not-a-knot' end condition is used. If the length of Y is `N + 2', then the first and last values of the vector Y are the values of the first derivative of the cubic spline at the end-points. If Y is an array, then the size of Y must have the form `[S1, S2, ..., SK, N]' or `[S1, S2, ..., SK, N + 2]'. The array is then reshaped internally to a matrix where the leading dimension is given by `S1 * S2 * ... * SK' and each row of this matrix is then treated separately. Note that this is exactly the opposite treatment than `interp1' and is done for compatibility. *See also:* *note ppval: doc-ppval, *note mkpp: doc-mkpp, *note unmkpp: doc-unmkpp. The `lookup' function is used by other interpolation functions to identify the points of the original data that are closest to the current point of interest. -- Loadable Function: IDX = lookup (TABLE, Y, OPT) Lookup values in a sorted table. Usually used as a prelude to interpolation. If table is strictly increasing and `idx = lookup (table, y)', then `table(idx(i)) <= y(i) < table(idx(i+1))' for all `y(i)' within the table. If `y(i) < table (1)' then `idx(i)' is 0. If `y(i) >= table(end)' then `idx(i)' is `table(n)'. If the table is strictly decreasing, then the tests are reversed. There are no guarantees for tables which are non-monotonic or are not strictly monotonic. The algorithm used by lookup is standard binary search, with optimizations to speed up the case of partially ordered arrays (dense downsampling). In particular, looking up a single entry is of logarithmic complexity (unless a conversion occurs due to non-numeric or unequal types). TABLE and Y can also be cell arrays of strings (or Y can be a single string). In this case, string lookup is performed using lexicographical comparison. If OPTS is specified, it shall be a string with letters indicating additional options. For numeric lookup, 'l' in OPTS indicates that the leftmost subinterval shall be extended to infinity (i.e., all indices at least 1), and 'r' indicates that the rightmost subinterval shall be extended to infinity (i.e., all indices at most n-1). For string lookup, 'i' indicates case-insensitive comparison.  File: octave.info, Node: Multi-dimensional Interpolation, Prev: One-dimensional Interpolation, Up: Interpolation 28.2 Multi-dimensional Interpolation ==================================== There are three multi-dimensional interpolation functions in Octave, with similar capabilities. Methods using Delaunay tessellation are described in *note Interpolation on Scattered Data::. -- Function File: ZI = interp2 (X, Y, Z, XI, YI) -- Function File: ZI = interp2 (Z, XI, YI) -- Function File: ZI = interp2 (Z, N) -- Function File: ZI = interp2 (..., METHOD) -- Function File: ZI = interp2 (..., METHOD, EXTRAPVAL) Two-dimensional interpolation. X, Y and Z describe a surface function. If X and Y are vectors their length must correspondent to the size of Z. X and Y must be monotonic. If they are matrices they must have the `meshgrid' format. `interp2 (X, Y, Z, XI, YI, ...)' Returns a matrix corresponding to the points described by the matrices XI, YI. If the last argument is a string, the interpolation method can be specified. The method can be 'linear', 'nearest' or 'cubic'. If it is omitted 'linear' interpolation is assumed. `interp2 (Z, XI, YI)' Assumes `X = 1:rows (Z)' and `Y = 1:columns (Z)' `interp2 (Z, N)' Interleaves the matrix Z n-times. If N is omitted a value of `N = 1' is assumed. The variable METHOD defines the method to use for the interpolation. It can take one of the following values 'nearest' Return the nearest neighbor. 'linear' Linear interpolation from nearest neighbors. 'pchip' Piece-wise cubic hermite interpolating polynomial (not implemented yet). 'cubic' Cubic interpolation from four nearest neighbors. 'spline' Cubic spline interpolation-smooth first and second derivatives throughout the curve. If a scalar value EXTRAPVAL is defined as the final value, then values outside the mesh as set to this value. Note that in this case METHOD must be defined as well. If EXTRAPVAL is not defined then NA is assumed. *See also:* *note interp1: doc-interp1. -- Function File: VI = interp3 (X, Y,Z, V, XI, YI, ZI) -- Function File: VI = interp3 (V, XI, YI, ZI) -- Function File: VI = interp3 (V, M) -- Function File: VI = interp3 (V) -- Function File: VI = interp3 (..., METHOD) -- Function File: VI = interp3 (..., METHOD, EXTRAPVAL) Perform 3-dimensional interpolation. Each element of the 3-dimensional array V represents a value at a location given by the parameters X, Y, and Z. The parameters X, X, and Z are either 3-dimensional arrays of the same size as the array V in the 'meshgrid' format or vectors. The parameters XI, etc. respect a similar format to X, etc., and they represent the points at which the array VI is interpolated. If X, Y, Z are omitted, they are assumed to be `x = 1 : size (V, 2)', `y = 1 : size (V, 1)' and `z = 1 : size (V, 3)'. If M is specified, then the interpolation adds a point half way between each of the interpolation points. This process is performed M times. If only V is specified, then M is assumed to be `1'. Method is one of: 'nearest' Return the nearest neighbor. 'linear' Linear interpolation from nearest neighbors. 'cubic' Cubic interpolation from four nearest neighbors (not implemented yet). 'spline' Cubic spline interpolation-smooth first and second derivatives throughout the curve. The default method is 'linear'. If EXTRAP is the string 'extrap', then extrapolate values beyond the endpoints. If EXTRAP is a number, replace values beyond the endpoints with that number. If EXTRAP is missing, assume NA. *See also:* *note interp1: doc-interp1, *note interp2: doc-interp2, *note spline: doc-spline, *note meshgrid: doc-meshgrid. -- Function File: VI = interpn (X1, X2, ..., V, Y1, Y2, ...) -- Function File: VI = interpn (V, Y1, Y2, ...) -- Function File: VI = interpn (V, M) -- Function File: VI = interpn (V) -- Function File: VI = interpn (..., METHOD) -- Function File: VI = interpn (..., METHOD, EXTRAPVAL) Perform N-dimensional interpolation, where N is at least two. Each element of the N-dimensional array V represents a value at a location given by the parameters X1, X2, ..., XN. The parameters X1, X2, ..., XN are either N-dimensional arrays of the same size as the array V in the 'ndgrid' format or vectors. The parameters Y1, etc. respect a similar format to X1, etc., and they represent the points at which the array VI is interpolated. If X1, ..., XN are omitted, they are assumed to be `x1 = 1 : size (V, 1)', etc. If M is specified, then the interpolation adds a point half way between each of the interpolation points. This process is performed M times. If only V is specified, then M is assumed to be `1'. Method is one of: 'nearest' Return the nearest neighbor. 'linear' Linear interpolation from nearest neighbors. 'cubic' Cubic interpolation from four nearest neighbors (not implemented yet). 'spline' Cubic spline interpolation-smooth first and second derivatives throughout the curve. The default method is 'linear'. If EXTRAPVAL is the scalar value, use it to replace the values beyond the endpoints with that number. If EXTRAPVAL is missing, assume NA. *See also:* *note interp1: doc-interp1, *note interp2: doc-interp2, *note spline: doc-spline, *note ndgrid: doc-ndgrid. A significant difference between `interpn' and the other two multidimensional interpolation functions is the fashion in which the dimensions are treated. For `interp2' and `interp3', the 'y' axis is considered to be the columns of the matrix, whereas the 'x' axis corresponds to the rows of the array. As Octave indexes arrays in column major order, the first dimension of any array is the columns, and so `interpn' effectively reverses the 'x' and 'y' dimensions. Consider the example x = y = z = -1:1; f = @(x,y,z) x.^2 - y - z.^2; [xx, yy, zz] = meshgrid (x, y, z); v = f (xx,yy,zz); xi = yi = zi = -1:0.1:1; [xxi, yyi, zzi] = meshgrid (xi, yi, zi); vi = interp3(x, y, z, v, xxi, yyi, zzi, 'spline'); [xxi, yyi, zzi] = ndgrid (xi, yi, zi); vi2 = interpn(x, y, z, v, xxi, yyi, zzi, 'spline'); mesh (zi, yi, squeeze (vi2(1,:,:))); where `vi' and `vi2' are identical. The reversal of the dimensions is treated in the `meshgrid' and `ndgrid' functions respectively. In additional the support function `bicubic' that underlies the cubic interpolation of `interp2' function can be called directly. -- Function File: ZI = bicubic (X, Y, Z, XI, YI, EXTRAPVAL) Return a matrix ZI corresponding to the bicubic interpolations at XI and YI of the data supplied as X, Y and Z. Points outside the grid are set to EXTRAPVAL. See `http://wiki.woodpecker.org.cn/moin/Octave/Bicubic' for further information. *See also:* *note interp2: doc-interp2.  File: octave.info, Node: Geometry, Next: Signal Processing, Prev: Interpolation, Up: Top 29 Geometry *********** Much of the geometry code in Octave is based on the Qhull library(1). Some of the documentation for Qhull, particularly for the options that can be passed to `delaunay', `voronoi' and `convhull', etc., is relevant to Octave users. * Menu: * Delaunay Triangulation:: * Voronoi Diagrams:: * Convex Hull:: * Interpolation on Scattered Data:: ---------- Footnotes ---------- (1) Barber, C.B., Dobkin, D.P., and Huhdanpaa, H.T., "The Quickhull algorithm for convex hulls," ACM Trans. on Mathematical Software, 22(4):469-483, Dec 1996, `http://www.qhull.org'  File: octave.info, Node: Delaunay Triangulation, Next: Voronoi Diagrams, Up: Geometry 29.1 Delaunay Triangulation =========================== The Delaunay triangulation is constructed from a set of circum-circles. These circum-circles are chosen so that there are at least three of the points in the set to triangulation on the circumference of the circum-circle. None of the points in the set of points falls within any of the circum-circles. In general there are only three points on the circumference of any circum-circle. However, in some cases, and in particular for the case of a regular grid, 4 or more points can be on a single circum-circle. In this case the Delaunay triangulation is not unique. -- Function File: TRI = delaunay (X, Y) -- Function File: TRI = delaunay (X, Y, OPT) The return matrix of size [n, 3] contains a set triangles which are described by the indices to the data point x and y vector. The triangulation satisfies the Delaunay circum-circle criterion. No other data point is in the circum-circle of the defining triangle. A third optional argument, which must be a string, contains extra options passed to the underlying qhull command. See the documentation for the Qhull library for details. x = rand (1, 10); y = rand (size (x)); T = delaunay (x, y); X = [x(T(:,1)); x(T(:,2)); x(T(:,3)); x(T(:,1))]; Y = [y(T(:,1)); y(T(:,2)); y(T(:,3)); y(T(:,1))]; axis ([0,1,0,1]); plot (X, Y, "b", x, y, "r*"); *See also:* *note voronoi: doc-voronoi, *note delaunay3: doc-delaunay3, *note delaunayn: doc-delaunayn. The 3- and N-dimensional extension of the Delaunay triangulation are given by `delaunay3' and `delaunayn' respectively. `delaunay3' returns a set of tetrahedra that satisfy the Delaunay circum-circle criteria. Similarly, `delaunayn' returns the N-dimensional simplex satisfying the Delaunay circum-circle criteria. The N-dimensional extension of a triangulation is called a tessellation. -- Function File: T = delaunay3 (X, Y, Z) -- Function File: T = delaunay3 (X, Y, Z, OPT) A matrix of size [n, 4] is returned. Each row contains a set of tetrahedron which are described by the indices to the data point vectors (x,y,z). A fourth optional argument, which must be a string or cell array of strings, contains extra options passed to the underlying qhull command. See the documentation for the Qhull library for details. *See also:* *note delaunay: doc-delaunay, *note delaunayn: doc-delaunayn. -- Function File: T = delaunayn (P) -- Function File: T = delaunayn (P, OPT) Form the Delaunay triangulation for a set of points. The Delaunay triangulation is a tessellation of the convex hull of the points such that no n-sphere defined by the n-triangles contains any other points from the set. The input matrix P of size `[n, dim]' contains N points in a space of dimension dim. The return matrix T has the size `[m, dim+1]'. It contains for each row a set of indices to the points, which describes a simplex of dimension dim. For example, a 2d simplex is a triangle and 3d simplex is a tetrahedron. Extra options for the underlying Qhull command can be specified by the second argument. This argument is a cell array of strings. The default options depend on the dimension of the input: * 2D and 3D: OPT = `{"Qt", "Qbb", "Qc"}' * 4D and higher: OPT = `{"Qt", "Qbb", "Qc", "Qz"}' If OPT is [], then the default arguments are used. If OPT is `{""}', then none of the default arguments are used by Qhull. See the Qhull documentation for the available options. All options can also be specified as single string, for example `"Qt Qbb Qc Qz"'. An example of a Delaunay triangulation of a set of points is rand ("state", 2); x = rand (10, 1); y = rand (10, 1); T = delaunay (x, y); X = [ x(T(:,1)); x(T(:,2)); x(T(:,3)); x(T(:,1)) ]; Y = [ y(T(:,1)); y(T(:,2)); y(T(:,3)); y(T(:,1)) ]; axis ([0, 1, 0, 1]); plot(X, Y, "b", x, y, "r*"); * Menu: * Plotting the Triangulation:: * Identifying points in Triangulation::  File: octave.info, Node: Plotting the Triangulation, Next: Identifying points in Triangulation, Up: Delaunay Triangulation 29.1.1 Plotting the Triangulation --------------------------------- Octave has the functions `triplot' and `trimesh' to plot the Delaunay triangulation of a 2-dimensional set of points. -- Function File: triplot (TRI, X, Y) -- Function File: triplot (TRI, X, Y, LINESPEC) -- Function File: H = triplot (...) Plot a triangular mesh in 2D. The variable TRI is the triangular meshing of the points `(X, Y)' which is returned from `delaunay'. If given, the LINESPEC determines the properties to use for the lines. The output argument H is the graphic handle to the plot. *See also:* *note plot: doc-plot, *note trimesh: doc-trimesh, *note delaunay: doc-delaunay. -- Function File: trimesh (TRI, X, Y, Z) -- Function File: H = trimesh (...) Plot a triangular mesh in 3D. The variable TRI is the triangular meshing of the points `(X, Y)' which is returned from `delaunay'. The variable Z is value at the point `(X, Y)'. The output argument H is the graphic handle to the plot. *See also:* *note triplot: doc-triplot, *note delaunay3: doc-delaunay3. The difference between `triplot' and `trimesh' is that the former only plots the 2-dimensional triangulation itself, whereas the second plots the value of some function `f (X, Y)'. An example of the use of the `triplot' function is rand ("state", 2) x = rand (20, 1); y = rand (20, 1); tri = delaunay (x, y); triplot (tri, x, y); that plot the Delaunay triangulation of a set of random points in 2-dimensions.  File: octave.info, Node: Identifying points in Triangulation, Prev: Plotting the Triangulation, Up: Delaunay Triangulation 29.1.2 Identifying points in Triangulation ------------------------------------------ It is often necessary to identify whether a particular point in the N-dimensional space is within the Delaunay tessellation of a set of points in this N-dimensional space, and if so which N-simplex contains the point and which point in the tessellation is closest to the desired point. The functions `tsearch' and `dsearch' perform this function in a triangulation, and `tsearchn' and `dsearchn' in an N-dimensional tessellation. To identify whether a particular point represented by a vector P falls within one of the simplices of an N-simplex, we can write the Cartesian coordinates of the point in a parametric form with respect to the N-simplex. This parametric form is called the Barycentric Coordinates of the point. If the points defining the N-simplex are given by `N + 1' vectors T(I,:), then the Barycentric coordinates defining the point P are given by P = sum (BETA(1:N+1) * T(1:N+1),:) where there are `N + 1' values `BETA(I)' that together as a vector represent the Barycentric coordinates of the point P. To ensure a unique solution for the values of `BETA(I)' an additional criteria of sum (BETA(1:N+1)) == 1 is imposed, and we can therefore write the above as P - T(end, :) = BETA(1:end-1) * (T(1:end-1, :) - ones(N, 1) * T(end, :) Solving for BETA we can then write BETA(1:end-1) = (P - T(end, :)) / (T(1:end-1, :) - ones(N, 1) * T(end, :)) BETA(end) = sum(BETA(1:end-1)) which gives the formula for the conversion of the Cartesian coordinates of the point P to the Barycentric coordinates BETA. An important property of the Barycentric coordinates is that for all points in the N-simplex 0 <= BETA(I) <= 1 Therefore, the test in `tsearch' and `tsearchn' essentially only needs to express each point in terms of the Barycentric coordinates of each of the simplices of the N-simplex and test the values of BETA. This is exactly the implementation used in `tsearchn'. `tsearch' is optimized for 2-dimensions and the Barycentric coordinates are not explicitly formed. -- Loadable Function: IDX = tsearch (X, Y, T, XI, YI) Searches for the enclosing Delaunay convex hull. For `T = delaunay (X, Y)', finds the index in T containing the points `(XI, YI)'. For points outside the convex hull, IDX is NaN. *See also:* *note delaunay: doc-delaunay, *note delaunayn: doc-delaunayn. -- Function File: [IDX, P] = tsearchn (X, T, XI) Searches for the enclosing Delaunay convex hull. For `T = delaunayn (X)', finds the index in T containing the points XI. For points outside the convex hull, IDX is NaN. If requested `tsearchn' also returns the Barycentric coordinates P of the enclosing triangles. *See also:* *note delaunay: doc-delaunay, *note delaunayn: doc-delaunayn. An example of the use of `tsearch' can be seen with the simple triangulation X = [-1; -1; 1; 1]; Y = [-1; 1; -1; 1]; TRI = [1, 2, 3; 2, 3, 1]; consisting of two triangles defined by TRI. We can then identify which triangle a point falls in like tsearch (X, Y, TRI, -0.5, -0.5) => 1 tsearch (X, Y, TRI, 0.5, 0.5) => 2 and we can confirm that a point doesn't lie within one of the triangles like tsearch (X, Y, TRI, 2, 2) => NaN The `dsearch' and `dsearchn' find the closest point in a tessellation to the desired point. The desired point does not necessarily have to be in the tessellation, and even if it the returned point of the tessellation does not have to be one of the vertexes of the N-simplex within which the desired point is found. -- Function File: IDX = dsearch (X, Y, TRI, XI, YI) -- Function File: IDX = dsearch (X, Y, TRI, XI, YI, S) Returns the index IDX or the closest point in `X, Y' to the elements `[XI(:), YI(:)]'. The variable S is accepted but ignored for compatibility. *See also:* *note dsearchn: doc-dsearchn, *note tsearch: doc-tsearch. -- Function File: IDX = dsearchn (X, TRI, XI) -- Function File: IDX = dsearchn (X, TRI, XI, OUTVAL) -- Function File: IDX = dsearchn (X, XI) -- Function File: [IDX, D] = dsearchn (...) Returns the index IDX or the closest point in X to the elements XI. If OUTVAL is supplied, then the values of XI that are not contained within one of the simplicies TRI are set to OUTVAL. Generally, TRI is returned from `delaunayn (X)'. *See also:* *note dsearch: doc-dsearch, *note tsearch: doc-tsearch. An example of the use of `dsearch', using the above values of X, Y and TRI is dsearch (X, Y, TRI, -2, -2) => 1 If you wish the points that are outside the tessellation to be flagged, then `dsearchn' can be used as dsearchn ([X, Y], TRI, [-2, -2], NaN) => NaN dsearchn ([X, Y], TRI, [-0.5, -0.5], NaN) => 1 where the point outside the tessellation are then flagged with `NaN'.  File: octave.info, Node: Voronoi Diagrams, Next: Convex Hull, Prev: Delaunay Triangulation, Up: Geometry 29.2 Voronoi Diagrams ===================== A Voronoi diagram or Voronoi tessellation of a set of points S in an N-dimensional space, is the tessellation of the N-dimensional space such that all points in `V(P)', a partitions of the tessellation where P is a member of S, are closer to P than any other point in S. The Voronoi diagram is related to the Delaunay triangulation of a set of points, in that the vertexes of the Voronoi tessellation are the centers of the circum-circles of the simplicies of the Delaunay tessellation. -- Function File: voronoi (X, Y) -- Function File: voronoi (X, Y, "plotstyle") -- Function File: voronoi (X, Y, "plotstyle", OPTIONS) -- Function File: [VX, VY] = voronoi (...) plots voronoi diagram of points `(X, Y)'. The voronoi facets with points at infinity are not drawn. [VX, VY] = voronoi(...) returns the vertices instead of plotting the diagram. plot (VX, VY) shows the voronoi diagram. A fourth optional argument, which must be a string, contains extra options passed to the underlying qhull command. See the documentation for the Qhull library for details. x = rand (10, 1); y = rand (size (x)); h = convhull (x, y); [vx, vy] = voronoi (x, y); plot (vx, vy, "-b", x, y, "o", x(h), y(h), "-g") legend ("", "points", "hull"); *See also:* *note voronoin: doc-voronoin, *note delaunay: doc-delaunay, *note convhull: doc-convhull. -- Function File: [C, F] = voronoin (PTS) -- Function File: [C, F] = voronoin (PTS, OPTIONS) computes n- dimensional voronoi facets. The input matrix PTS of size [n, dim] contains n points of dimension dim. C contains the points of the voronoi facets. The list F contains for each facet the indices of the voronoi points. A second optional argument, which must be a string, contains extra options passed to the underlying qhull command. See the documentation for the Qhull library for details. *See also:* *note voronoin: doc-voronoin, *note delaunay: doc-delaunay, *note convhull: doc-convhull. An example of the use of `voronoi' is rand("state",9); x = rand(10,1); y = rand(10,1); tri = delaunay (x, y); [vx, vy] = voronoi (x, y, tri); triplot (tri, x, y, "b"); hold on; plot (vx, vy, "r"); Additional information about the size of the facets of a Voronoi diagram, and which points of a set of points is in a polygon can be had with the `polyarea' and `inpolygon' functions respectively. -- Function File: polyarea (X, Y) -- Function File: polyarea (X, Y, DIM) Determines area of a polygon by triangle method. The variables X and Y define the vertex pairs, and must therefore have the same shape. They can be either vectors or arrays. If they are arrays then the columns of X and Y are treated separately and an area returned for each. If the optional DIM argument is given, then `polyarea' works along this dimension of the arrays X and Y. An example of the use of `polyarea' might be rand ("state", 2); x = rand (10, 1); y = rand (10, 1); [c, f] = voronoin ([x, y]); af = zeros (size(f)); for i = 1 : length (f) af(i) = polyarea (c (f {i, :}, 1), c (f {i, :}, 2)); endfor Facets of the Voronoi diagram with a vertex at infinity have infinity area. A simplified version of `polyarea' for rectangles is available with `rectint' -- Function File: AREA = rectint (A, B) Compute the area of intersection of rectangles in A and rectangles in B. Rectangles are defined as [x y width height] where x and y are the minimum values of the two orthogonal dimensions. If A or B are matrices, then the output, AREA, is a matrix where the i-th row corresponds to the i-th row of a and the j-th column corresponds to the j-th row of b. *See also:* *note polyarea: doc-polyarea. -- Function File: [IN, ON] = inpolygon (X, Y, XV, XY) For a polygon defined by `(XV, YV)' points, determine if the points `(X, Y)' are inside or outside the polygon. The variables X, Y, must have the same dimension. The optional output ON gives the points that are on the polygon. An example of the use of `inpolygon' might be randn ("state", 2); x = randn (100, 1); y = randn (100, 1); vx = cos (pi * [-1 : 0.1: 1]); vy = sin (pi * [-1 : 0.1 : 1]); in = inpolygon (x, y, vx, vy); plot(vx, vy, x(in), y(in), "r+", x(!in), y(!in), "bo"); axis ([-2, 2, -2, 2]);  File: octave.info, Node: Convex Hull, Next: Interpolation on Scattered Data, Prev: Voronoi Diagrams, Up: Geometry 29.3 Convex Hull ================ The convex hull of a set of points is the minimum convex envelope containing all of the points. Octave has the functions `convhull' and `convhulln' to calculate the convex hull of 2-dimensional and N-dimensional sets of points. -- Function File: H = convhull (X, Y) -- Function File: H = convhull (X, Y, OPT) Returns the index vector to the points of the enclosing convex hull. The data points are defined by the x and y vectors. A third optional argument, which must be a string, contains extra options passed to the underlying qhull command. See the documentation for the Qhull library for details. *See also:* *note delaunay: doc-delaunay, *note convhulln: doc-convhulln. -- Loadable Function: H = convhulln (P) -- Loadable Function: H = convhulln (P, OPT) -- Loadable Function: [H, V] = convhulln (...) Return an index vector to the points of the enclosing convex hull. The input matrix of size [n, dim] contains n points of dimension dim. If a second optional argument is given, it must be a string or cell array of strings containing options for the underlying qhull command. (See the Qhull documentation for the available options.) The default options are "s Qci Tcv". If the second output V is requested the volume of the convex hull is calculated. *See also:* *note convhull: doc-convhull, *note delaunayn: doc-delaunayn. An example of the use of `convhull' is x = -3:0.05:3; y = abs (sin (x)); k = convhull (x, y); plot (x(k), y(k), "r-", x, y, "b+"); axis ([-3.05, 3.05, -0.05, 1.05]);  File: octave.info, Node: Interpolation on Scattered Data, Prev: Convex Hull, Up: Geometry 29.4 Interpolation on Scattered Data ==================================== An important use of the Delaunay tessellation is that it can be used to interpolate from scattered data to an arbitrary set of points. To do this the N-simplex of the known set of points is calculated with `delaunay', `delaunay3' or `delaunayn'. Then the simplicies in to which the desired points are found are identified. Finally the vertices of the simplicies are used to interpolate to the desired points. The functions that perform this interpolation are `griddata', `griddata3' and `griddatan'. -- Function File: ZI = griddata (X, Y, Z, XI, YI, METHOD) -- Function File: [XI, YI, ZI] = griddata (X, Y, Z, XI, YI, METHOD) Generate a regular mesh from irregular data using interpolation. The function is defined by `Z = f (X, Y)'. The interpolation points are all `(XI, YI)'. If XI, YI are vectors then they are made into a 2D mesh. The interpolation method can be `"nearest"', `"cubic"' or `"linear"'. If method is omitted it defaults to `"linear"'. *See also:* *note delaunay: doc-delaunay. -- Function File: VI = griddata3 (X, Y, Z, V XI, YI, ZI, METHOD, OPTIONS) Generate a regular mesh from irregular data using interpolation. The function is defined by `Y = f (X,Y,Z)'. The interpolation points are all XI. The interpolation method can be `"nearest"' or `"linear"'. If method is omitted it defaults to `"linear"'. *See also:* *note griddata: doc-griddata, *note delaunayn: doc-delaunayn. -- Function File: YI = griddatan (X, Y, XI, METHOD, OPTIONS) Generate a regular mesh from irregular data using interpolation. The function is defined by `Y = f (X)'. The interpolation points are all XI. The interpolation method can be `"nearest"' or `"linear"'. If method is omitted it defaults to `"linear"'. *See also:* *note griddata: doc-griddata, *note delaunayn: doc-delaunayn. An example of the use of the `griddata' function is rand("state",1); x=2*rand(1000,1)-1; y=2*rand(size(x))-1; z=sin(2*(x.^2+y.^2)); [xx,yy]=meshgrid(linspace(-1,1,32)); griddata(x,y,z,xx,yy); that interpolates from a random scattering of points, to a uniform grid.  File: octave.info, Node: Signal Processing, Next: Image Processing, Prev: Geometry, Up: Top 30 Signal Processing ******************** This chapter describes the signal processing and fast Fourier transform functions available in Octave. Fast Fourier transforms are computed with the FFTW or FFTPACK libraries depending on how Octave is built. -- Function File: detrend (X, P) If X is a vector, `detrend (X, P)' removes the best fit of a polynomial of order P from the data X. If X is a matrix, `detrend (X, P)' does the same for each column in X. The second argument is optional. If it is not specified, a value of 1 is assumed. This corresponds to removing a linear trend. -- Loadable Function: fft (A, N, DIM) Compute the FFT of A using subroutines from FFTW. The FFT is calculated along the first non-singleton dimension of the array. Thus if A is a matrix, `fft (A)' computes the FFT for each column of A. If called with two arguments, N is expected to be an integer specifying the number of elements of A to use, or an empty matrix to specify that its value should be ignored. If N is larger than the dimension along which the FFT is calculated, then A is resized and padded with zeros. Otherwise, if N is smaller than the dimension along which the FFT is calculated, then A is truncated. If called with three arguments, DIM is an integer specifying the dimension of the matrix along which the FFT is performed *See also:* *note ifft: doc-ifft, *note fft2: doc-fft2, *note fftn: doc-fftn, *note fftw: doc-fftw. Octave uses the FFTW libraries to perform FFT computations. When Octave starts up and initializes the FFTW libraries, they read a system wide file (on a Unix system, it is typically `/etc/fftw/wisdom') that contains information useful to speed up FFT computations. This information is called the _wisdom_. The system-wide file allows wisdom to be shared between all applications using the FFTW libraries. Use the `fftw' function to generate and save wisdom. Using the utilities provided together with the FFTW libraries (`fftw-wisdom' on Unix systems), you can even add wisdom generated by Octave to the system-wide wisdom file. -- Loadable Function: METHOD = fftw ('planner') -- Loadable Function: fftw ('planner', METHOD) -- Loadable Function: WISDOM = fftw ('dwisdom') -- Loadable Function: WISDOM = fftw ('dwisdom', WISDOM) Manage FFTW wisdom data. Wisdom data can be used to significantly accelerate the calculation of the FFTs but implies an initial cost in its calculation. When the FFTW libraries are initialized, they read a system wide wisdom file (typically in `/etc/fftw/wisdom'), allowing wisdom to be shared between applications other than Octave. Alternatively, the `fftw' function can be used to import wisdom. For example WISDOM = fftw ('dwisdom') will save the existing wisdom used by Octave to the string WISDOM. This string can then be saved to a file and restored using the `save' and `load' commands respectively. This existing wisdom can be reimported as follows fftw ('dwisdom', WISDOM) If WISDOM is an empty matrix, then the wisdom used is cleared. During the calculation of Fourier transforms further wisdom is generated. The fashion in which this wisdom is generated is equally controlled by the `fftw' function. There are five different manners in which the wisdom can be treated, these being 'estimate' This specifies that no run-time measurement of the optimal means of calculating a particular is performed, and a simple heuristic is used to pick a (probably sub-optimal) plan. The advantage of this method is that there is little or no overhead in the generation of the plan, which is appropriate for a Fourier transform that will be calculated once. 'measure' In this case a range of algorithms to perform the transform is considered and the best is selected based on their execution time. 'patient' This is like 'measure', but a wider range of algorithms is considered. 'exhaustive' This is like 'measure', but all possible algorithms that may be used to treat the transform are considered. 'hybrid' As run-time measurement of the algorithm can be expensive, this is a compromise where 'measure' is used for transforms up to the size of 8192 and beyond that the 'estimate' method is used. The default method is 'estimate', and the method currently being used can be probed with METHOD = fftw ('planner') and the method used can be set using fftw ('planner', METHOD) Note that calculated wisdom will be lost when restarting Octave. However, the wisdom data can be reloaded if it is saved to a file as described above. Saved wisdom files should not be used on different platforms since they will not be efficient and the point of calculating the wisdom is lost. *See also:* *note fft: doc-fft, *note ifft: doc-ifft, *note fft2: doc-fft2, *note ifft2: doc-ifft2, *note fftn: doc-fftn, *note ifftn: doc-ifftn. -- Loadable Function: ifft (A, N, DIM) Compute the inverse FFT of A using subroutines from FFTW. The inverse FFT is calculated along the first non-singleton dimension of the array. Thus if A is a matrix, `fft (A)' computes the inverse FFT for each column of A. If called with two arguments, N is expected to be an integer specifying the number of elements of A to use, or an empty matrix to specify that its value should be ignored. If N is larger than the dimension along which the inverse FFT is calculated, then A is resized and padded with zeros. Otherwise, ifN is smaller than the dimension along which the inverse FFT is calculated, then A is truncated. If called with three arguments, DIM is an integer specifying the dimension of the matrix along which the inverse FFT is performed *See also:* *note fft: doc-fft, *note ifft2: doc-ifft2, *note ifftn: doc-ifftn, *note fftw: doc-fftw. -- Loadable Function: fft2 (A, N, M) Compute the two-dimensional FFT of A using subroutines from FFTW. The optional arguments N and M may be used specify the number of rows and columns of A to use. If either of these is larger than the size of A, A is resized and padded with zeros. If A is a multi-dimensional matrix, each two-dimensional sub-matrix of A is treated separately *See also:* ifft2, fft, fftn, fftw. -- Loadable Function: fft2 (A, N, M) Compute the inverse two-dimensional FFT of A using subroutines from FFTW. The optional arguments N and M may be used specify the number of rows and columns of A to use. If either of these is larger than the size of A, A is resized and padded with zeros. If A is a multi-dimensional matrix, each two-dimensional sub-matrix of A is treated separately *See also:* fft2, ifft, ifftn, fftw. -- Loadable Function: fftn (A, SIZE) Compute the N-dimensional FFT of A using subroutines from FFTW. The optional vector argument SIZE may be used specify the dimensions of the array to be used. If an element of SIZE is smaller than the corresponding dimension, then the dimension is truncated prior to performing the FFT. Otherwise if an element of SIZE is larger than the corresponding dimension A is resized and padded with zeros. *See also:* ifftn, fft, fft2, fftw. -- Loadable Function: ifftn (A, SIZE) Compute the inverse N-dimensional FFT of A using subroutines from FFTW. The optional vector argument SIZE may be used specify the dimensions of the array to be used. If an element of SIZE is smaller than the corresponding dimension, then the dimension is truncated prior to performing the inverse FFT. Otherwise if an element of SIZE is larger than the corresponding dimension A is resized and padded with zeros. *See also:* fftn, ifft, ifft2, fftw. -- Function File: fftconv (A, B, N) Return the convolution of the vectors A and B, as a vector with length equal to the `length (a) + length (b) - 1'. If A and B are the coefficient vectors of two polynomials, the returned value is the coefficient vector of the product polynomial. The computation uses the FFT by calling the function `fftfilt'. If the optional argument N is specified, an N-point FFT is used. -- Function File: fftfilt (B, X, N) With two arguments, `fftfilt' filters X with the FIR filter B using the FFT. Given the optional third argument, N, `fftfilt' uses the overlap-add method to filter X with B using an N-point FFT. If X is a matrix, filter each column of the matrix. -- Loadable Function: y = filter (B, A, X) -- Loadable Function: [Y, SF] = filter (B, A, X, SI) -- Loadable Function: [Y, SF] = filter (B, A, X, [], DIM) -- Loadable Function: [Y, SF] = filter (B, A, X, SI, DIM) Return the solution to the following linear, time-invariant difference equation: N M SUM a(k+1) y(n-k) = SUM b(k+1) x(n-k) for 1<=n<=length(x) k=0 k=0 where N=length(a)-1 and M=length(b)-1. over the first non-singleton dimension of X or over DIM if supplied. An equivalent form of this equation is: N M y(n) = - SUM c(k+1) y(n-k) + SUM d(k+1) x(n-k) for 1<=n<=length(x) k=1 k=0 where c = a/a(1) and d = b/a(1). If the fourth argument SI is provided, it is taken as the initial state of the system and the final state is returned as SF. The state vector is a column vector whose length is equal to the length of the longest coefficient vector minus one. If SI is not supplied, the initial state vector is set to all zeros. In terms of the z-transform, y is the result of passing the discrete- time signal x through a system characterized by the following rational system function: M SUM d(k+1) z^(-k) k=0 H(z) = ---------------------- N 1 + SUM c(k+1) z^(-k) k=1 -- Function File: Y = filter2 (B, X) -- Function File: Y = filter2 (B, X, SHAPE) Apply the 2-D FIR filter B to X. If the argument SHAPE is specified, return an array of the desired shape. Possible values are: 'full' pad X with zeros on all sides before filtering. 'same' unpadded X (default) 'valid' trim X after filtering so edge effects are no included. Note this is just a variation on convolution, with the parameters reversed and B rotated 180 degrees. *See also:* *note conv2: doc-conv2. -- Function File: [H, W] = freqz (B, A, N, "whole") Return the complex frequency response H of the rational IIR filter whose numerator and denominator coefficients are B and A, respectively. The response is evaluated at N angular frequencies between 0 and 2*pi. The output value W is a vector of the frequencies. If the fourth argument is omitted, the response is evaluated at frequencies between 0 and pi. If N is omitted, a value of 512 is assumed. If A is omitted, the denominator is assumed to be 1 (this corresponds to a simple FIR filter). For fastest computation, N should factor into a small number of small primes. -- Function File: H = freqz (B, A, W) Evaluate the response at the specific frequencies in the vector W. The values for W are measured in radians. -- Function File: [...] = freqz (..., FS) Return frequencies in Hz instead of radians assuming a sampling rate FS. If you are evaluating the response at specific frequencies W, those frequencies should be requested in Hz rather than radians. -- Function File: freqz (...) Plot the pass band, stop band and phase response of H rather than returning them. -- Function File: freqz_plot (W, H) Plot the pass band, stop band and phase response of H. -- Function File: sinc (X) Return sin(pi*x)/(pi*x). -- Function File: B = unwrap (A, TOL, DIM) Unwrap radian phases by adding multiples of 2*pi as appropriate to remove jumps greater than TOL. TOL defaults to pi. Unwrap will unwrap along the first non-singleton dimension of A, unless the optional argument DIM is given, in which case the data will be unwrapped along this dimension -- Function File: [A, B] = arch_fit (Y, X, P, ITER, GAMMA, A0, B0) Fit an ARCH regression model to the time series Y using the scoring algorithm in Engle's original ARCH paper. The model is y(t) = b(1) * x(t,1) + ... + b(k) * x(t,k) + e(t), h(t) = a(1) + a(2) * e(t-1)^2 + ... + a(p+1) * e(t-p)^2 in which e(t) is N(0, h(t)), given a time-series vector Y up to time t-1 and a matrix of (ordinary) regressors X up to t. The order of the regression of the residual variance is specified by P. If invoked as `arch_fit (Y, K, P)' with a positive integer K, fit an ARCH(K, P) process, i.e., do the above with the t-th row of X given by [1, y(t-1), ..., y(t-k)] Optionally, one can specify the number of iterations ITER, the updating factor GAMMA, and initial values a0 and b0 for the scoring algorithm. -- Function File: arch_rnd (A, B, T) Simulate an ARCH sequence of length T with AR coefficients B and CH coefficients A. I.e., the result y(t) follows the model y(t) = b(1) + b(2) * y(t-1) + ... + b(lb) * y(t-lb+1) + e(t), where e(t), given Y up to time t-1, is N(0, h(t)), with h(t) = a(1) + a(2) * e(t-1)^2 + ... + a(la) * e(t-la+1)^2 -- Function File: [PVAL, LM] = arch_test (Y, X, P) For a linear regression model y = x * b + e perform a Lagrange Multiplier (LM) test of the null hypothesis of no conditional heteroscedascity against the alternative of CH(P). I.e., the model is y(t) = b(1) * x(t,1) + ... + b(k) * x(t,k) + e(t), given Y up to t-1 and X up to t, e(t) is N(0, h(t)) with h(t) = v + a(1) * e(t-1)^2 + ... + a(p) * e(t-p)^2, and the null is a(1) == ... == a(p) == 0. If the second argument is a scalar integer, k, perform the same test in a linear autoregression model of order k, i.e., with [1, y(t-1), ..., y(t-K)] as the t-th row of X. Under the null, LM approximately has a chisquare distribution with P degrees of freedom and PVAL is the p-value (1 minus the CDF of this distribution at LM) of the test. If no output argument is given, the p-value is displayed. -- Function File: arma_rnd (A, B, V, T, N) Return a simulation of the ARMA model x(n) = a(1) * x(n-1) + ... + a(k) * x(n-k) + e(n) + b(1) * e(n-1) + ... + b(l) * e(n-l) in which K is the length of vector A, L is the length of vector B and E is Gaussian white noise with variance V. The function returns a vector of length T. The optional parameter N gives the number of dummy X(I) used for initialization, i.e., a sequence of length T+N is generated and X(N+1:T+N) is returned. If N is omitted, N = 100 is used. -- Function File: autocor (X, H) Return the autocorrelations from lag 0 to H of vector X. If H is omitted, all autocorrelations are computed. If X is a matrix, the autocorrelations of each column are computed. -- Function File: autocov (X, H) Return the autocovariances from lag 0 to H of vector X. If H is omitted, all autocovariances are computed. If X is a matrix, the autocovariances of each column are computed. -- Function File: autoreg_matrix (Y, K) Given a time series (vector) Y, return a matrix with ones in the first column and the first K lagged values of Y in the other columns. I.e., for T > K, `[1, Y(T-1), ..., Y(T-K)]' is the t-th row of the result. The resulting matrix may be used as a regressor matrix in autoregressions. -- Function File: bartlett (M) Return the filter coefficients of a Bartlett (triangular) window of length M. For a definition of the Bartlett window, see e.g., A. V. Oppenheim & R. W. Schafer, `Discrete-Time Signal Processing'. -- Function File: blackman (M) Return the filter coefficients of a Blackman window of length M. For a definition of the Blackman window, see e.g., A. V. Oppenheim & R. W. Schafer, `Discrete-Time Signal Processing'. -- Function File: [D, DD] = diffpara (X, A, B) Return the estimator D for the differencing parameter of an integrated time series. The frequencies from [2*pi*a/t, 2*pi*b/T] are used for the estimation. If B is omitted, the interval [2*pi/T, 2*pi*a/T] is used. If both B and A are omitted then a = 0.5 * sqrt (T) and b = 1.5 * sqrt (T) is used, where T is the sample size. If X is a matrix, the differencing parameter of each column is estimated. The estimators for all frequencies in the intervals described above is returned in DD. The value of D is simply the mean of DD. Reference: Brockwell, Peter J. & Davis, Richard A. Time Series: Theory and Methods Springer 1987. -- Function File: durbinlevinson (C, OLDPHI, OLDV) Perform one step of the Durbin-Levinson algorithm. The vector C specifies the autocovariances `[gamma_0, ..., gamma_t]' from lag 0 to T, OLDPHI specifies the coefficients based on C(T-1) and OLDV specifies the corresponding error. If OLDPHI and OLDV are omitted, all steps from 1 to T of the algorithm are performed. -- Function File: fftshift (V) -- Function File: fftshift (V, DIM) Perform a shift of the vector V, for use with the `fft' and `ifft' functions, in order the move the frequency 0 to the center of the vector or matrix. If V is a vector of N elements corresponding to N time samples spaced of Dt each, then `fftshift (fft (V))' corresponds to frequencies f = ((1:N) - ceil(N/2)) / N / Dt If V is a matrix, the same holds for rows and columns. If V is an array, then the same holds along each dimension. The optional DIM argument can be used to limit the dimension along which the permutation occurs. -- Function File: ifftshift (V) -- Function File: ifftshift (V, DIM) Undo the action of the `fftshift' function. For even length V, `fftshift' is its own inverse, but odd lengths differ slightly. -- Function File: fractdiff (X, D) Compute the fractional differences (1-L)^d x where L denotes the lag-operator and d is greater than -1. -- Function File: hamming (M) Return the filter coefficients of a Hamming window of length M. For a definition of the Hamming window, see e.g., A. V. Oppenheim & R. W. Schafer, `Discrete-Time Signal Processing'. -- Function File: hanning (M) Return the filter coefficients of a Hanning window of length M. For a definition of this window type, see e.g., A. V. Oppenheim & R. W. Schafer, `Discrete-Time Signal Processing'. -- Function File: hurst (X) Estimate the Hurst parameter of sample X via the rescaled range statistic. If X is a matrix, the parameter is estimated for every single column. -- Function File: PP = pchip (X, Y) -- Function File: YI = pchip (X, Y, XI) Piecewise Cubic Hermite interpolating polynomial. Called with two arguments, the piece-wise polynomial PP is returned, that may later be used with `ppval' to evaluate the polynomial at specific points. The variable X must be a strictly monotonic vector (either increasing or decreasing). While Y can be either a vector or array. In the case where Y is a vector, it must have a length of N. If Y is an array, then the size of Y must have the form `[S1, S2, ..., SK, N]' The array is then reshaped internally to a matrix where the leading dimension is given by `S1 * S2 * ... * SK' and each row in this matrix is then treated separately. Note that this is exactly the opposite treatment than `interp1' and is done for compatibility. Called with a third input argument, `pchip' evaluates the piece-wise polynomial at the points XI. There is an equivalence between `ppval (pchip (X, Y), XI)' and `pchip (X, Y, XI)'. *See also:* *note spline: doc-spline, *note ppval: doc-ppval, *note mkpp: doc-mkpp, *note unmkpp: doc-unmkpp. -- Function File: periodogram (X) For a data matrix X from a sample of size N, return the periodogram. -- Function File: rectangle_lw (N, B) Rectangular lag window. Subfunction used for spectral density estimation. -- Function File: rectangle_sw (N, B) Rectangular spectral window. Subfunction used for spectral density estimation. -- Function File: sinetone (FREQ, RATE, SEC, AMPL) Return a sinetone of frequency FREQ with length of SEC seconds at sampling rate RATE and with amplitude AMPL. The arguments FREQ and AMPL may be vectors of common size. Defaults are RATE = 8000, SEC = 1 and AMPL = 64. -- Function File: sinewave (M, N, D) Return an M-element vector with I-th element given by `sin (2 * pi * (I+D-1) / N)'. The default value for D is 0 and the default value for N is M. -- Function File: spectral_adf (C, WIN, B) Return the spectral density estimator given a vector of autocovariances C, window name WIN, and bandwidth, B. The window name, e.g., `"triangle"' or `"rectangle"' is used to search for a function called `WIN_sw'. If WIN is omitted, the triangle window is used. If B is omitted, `1 / sqrt (length (X))' is used. -- Function File: spectral_xdf (X, WIN, B) Return the spectral density estimator given a data vector X, window name WIN, and bandwidth, B. The window name, e.g., `"triangle"' or `"rectangle"' is used to search for a function called `WIN_sw'. If WIN is omitted, the triangle window is used. If B is omitted, `1 / sqrt (length (X))' is used. -- Function File: spencer (X) Return Spencer's 15 point moving average of every single column of X. -- Function File: [Y, C] = stft (X, WIN_SIZE, INC, NUM_COEF, W_TYPE) Compute the short-time Fourier transform of the vector X with NUM_COEF coefficients by applying a window of WIN_SIZE data points and an increment of INC points. Before computing the Fourier transform, one of the following windows is applied: hanning w_type = 1 hamming w_type = 2 rectangle w_type = 3 The window names can be passed as strings or by the W_TYPE number. If not all arguments are specified, the following defaults are used: WIN_SIZE = 80, INC = 24, NUM_COEF = 64, and W_TYPE = 1. `Y = stft (X, ...)' returns the absolute values of the Fourier coefficients according to the NUM_COEF positive frequencies. `[Y, C] = stft (`x', ...)' returns the entire STFT-matrix Y and a 3-element vector C containing the window size, increment, and window type, which is needed by the synthesis function. -- Function File: synthesis (Y, C) Compute a signal from its short-time Fourier transform Y and a 3-element vector C specifying window size, increment, and window type. The values Y and C can be derived by [Y, C] = stft (X , ...) -- Function File: triangle_lw (N, B) Triangular lag window. Subfunction used for spectral density estimation. -- Function File: triangle_sw (N, B) Triangular spectral window. Subfunction used for spectral density estimation. -- Function File: [A, V] = yulewalker (C) Fit an AR (p)-model with Yule-Walker estimates given a vector C of autocovariances `[gamma_0, ..., gamma_p]'. Returns the AR coefficients, A, and the variance of white noise, V.  File: octave.info, Node: Image Processing, Next: Audio Processing, Prev: Signal Processing, Up: Top 31 Image Processing ******************* Since an image basically is a matrix Octave is a very powerful environment for processing and analyzing images. To illustrate how easy it is to do image processing in Octave, the following example will load an image, smooth it by a 5-by-5 averaging filter, and compute the gradient of the smoothed image. I = imread ("myimage.jpg"); S = conv2 (I, ones (5, 5) / 25, "same"); [Dx, Dy] = gradient (S); In this example `S' contains the smoothed image, and `Dx' and `Dy' contains the partial spatial derivatives of the image. * Menu: * Loading and Saving Images:: * Displaying Images:: * Representing Images:: * Plotting on top of Images:: * Color Conversion::  File: octave.info, Node: Loading and Saving Images, Next: Displaying Images, Up: Image Processing 31.1 Loading and Saving Images ============================== The first step in most image processing tasks is to load an image into Octave. This is done using the `imread' function, which uses the `GraphicsMagick' library for reading. This means a vast number of image formats is supported. The `imwrite' function is the corresponding function for writing images to the disk. In summary, most image processing code will follow the structure of this code I = imread ("my_input_image.img"); J = process_my_image (I); imwrite ("my_output_image.img", J); -- Function File: [IMG, MAP, ALPHA] = imread (FILENAME) Read images from various file formats. The size and numeric class of the output depends on the format of the image. A color image is returned as an MxNx3 matrix. Grey-level and black-and-white images are of size MxN. The color depth of the image determines the numeric class of the output: "uint8" or "uint16" for grey and color, and "logical" for black and white. *See also:* *note imwrite: doc-imwrite, *note imfinfo: doc-imfinfo. -- Function File: imwrite (IMG, FILENAME, FMT, P1, V1, ...) -- Function File: imwrite (IMG, MAP, FILENAME, FMT, P1, V1, ...) Write images in various file formats. If FMT is missing, the file extension (if any) of FILENAME is used to determine the format. The parameter-value pairs (P1, V1, ...) are optional. Currently the following options are supported for JPEG images `Quality' Sets the quality of the compression. The corresponding value should be an integer between 0 and 100, with larger values meaning higher visual quality and less compression. *See also:* *note imread: doc-imread, *note imfinfo: doc-imfinfo. -- Built-in Function: VAL = IMAGE_PATH () -- Built-in Function: OLD_VAL = IMAGE_PATH (NEW_VAL) Query or set the internal variable that specifies a colon separated list of directories in which to search for image files. It is possible to get information about an image file on disk, without actually reading it into Octave. This is done using the `imfinfo' function which provides read access to many of the parameters stored in the header of the image file. -- Function File: INFO = imfinfo (FILENAME) -- Function File: INFO = imfinfo (URL) Read image information from a file. `imfinfo' returns a structure containing information about the image stored in the file FILENAME. The output structure contains the following fields. `Filename' The full name of the image file. `FileSize' Number of bytes of the image on disk `FileModDate' Date of last modification to the file. `Height' Image height in pixels. `Width' Image Width in pixels. `BitDepth' Number of bits per channel per pixel. `Format' Image format (e.g., `"jpeg"'). `LongFormat' Long form image format description. `XResolution' X resolution of the image. `YResolution' Y resolution of the image. `TotalColors' Number of unique colors in the image. `TileName' Tile name. `AnimationDelay' Time in 1/100ths of a second (0 to 65535) which must expire before displaying the next image in an animated sequence. `AnimationIterations' Number of iterations to loop an animation (e.g., Netscape loop extension) for. `ByteOrder' Endian option for formats that support it. Is either `"little-endian"', `"big-endian"', or `"undefined"'. `Gamma' Gamma level of the image. The same color image displayed on two different workstations may look different due to differences in the display monitor. `Matte' `true' if the image has transparency. `ModulusDepth' Image modulus depth (minimum number of bits required to support red/green/blue components without loss of accuracy). `Quality' JPEG/MIFF/PNG compression level. `QuantizeColors' Preferred number of colors in the image. `ResolutionUnits' Units of image resolution. Is either `"pixels per inch"', `"pixels per centimeter"', or `"undefined"'. `ColorType' Image type. Is either `"grayscale"', `"indexed"', `"truecolor"', or `"undefined"'. `View' FlashPix viewing parameters. *See also:* *note imread: doc-imread, *note imwrite: doc-imwrite.  File: octave.info, Node: Displaying Images, Next: Representing Images, Prev: Loading and Saving Images, Up: Image Processing 31.2 Displaying Images ====================== A natural part of image processing is visualization of an image. The most basic function for this is the `imshow' function that shows the image given in the first input argument. This function uses an external program to show the image. If gnuplot 4.2 or later is available it will be used to display the image, otherwise the `display', `xv', or `xloadimage' program is used. The actual program can be selected with the `image_viewer' function. -- Function File: imshow (IM) -- Function File: imshow (IM, LIMITS) -- Function File: imshow (IM, MAP) -- Function File: imshow (RGB, ...) -- Function File: imshow (FILENAME) -- Function File: imshow (..., STRING_PARAM1, VALUE1, ...) Display the image IM, where IM can be a 2-dimensional (gray-scale image) or a 3-dimensional (RGB image) matrix. If LIMITS is a 2-element vector `[LOW, HIGH]', the image is shown using a display range between LOW and HIGH. If an empty matrix is passed for LIMITS, the display range is computed as the range between the minimal and the maximal value in the image. If MAP is a valid color map, the image will be shown as an indexed image using the supplied color map. If a file name is given instead of an image, the file will be read and shown. If given, the parameter STRING_PARAM1 has value VALUE1. STRING_PARAM1 can be any of the following: `"displayrange"' VALUE1 is the display range as described above. *See also:* *note image: doc-image, *note imagesc: doc-imagesc, *note colormap: doc-colormap, *note gray2ind: doc-gray2ind, *note rgb2ind: doc-rgb2ind. -- Function File: image (IMG) -- Function File: image (X, Y, IMG) Display a matrix as a color image. The elements of X are indices into the current colormap, and the colormap will be scaled so that the extremes of X are mapped to the extremes of the colormap. It first tries to use `gnuplot', then `display' from `ImageMagick', then `xv', and then `xloadimage'. The actual program used can be changed using the `image_viewer' function. The axis values corresponding to the matrix elements are specified in X and Y. If you're not using gnuplot 4.2 or later, these variables are ignored. *See also:* *note imshow: doc-imshow, *note imagesc: doc-imagesc, *note colormap: doc-colormap, *note image_viewer: doc-image_viewer. -- Function File: imagesc (A) -- Function File: imagesc (X, Y, A) -- Function File: imagesc (..., LIMITS) -- Function File: imagesc (H, ...) -- Function File: H = imagesc (...) Display a scaled version of the matrix A as a color image. The colormap is scaled so that the entries of the matrix occupy the entire colormap. If LIMITS = [LO, HI] are given, then that range is set to the 'clim' of the current axes. The axis values corresponding to the matrix elements are specified in X and Y, either as pairs giving the minimum and maximum values for the respective axes, or as values for each row and column of the matrix A. *See also:* *note image: doc-image, *note imshow: doc-imshow, *note caxis: doc-caxis. -- Function File: [FCN, DEFAULT_ZOOM] = image_viewer (FCN, DEFAULT_ZOOM) Change the program or function used for viewing images and return the previous values. When the `image' or `imshow' function is called it will launch an external program to display the image. The default behavior is to use gnuplot if the installed version supports image viewing, and otherwise try the programs `display', `xv', and `xloadimage'. Using this function it is possible to change that behavior. When called with one input argument images will be displayed by saving the image to a file and the system command COMMAND will be called to view the image. The COMMAND must be a string containing `%s' and possibly `%f'. The `%s' will be replaced by the filename of the image, and the `%f' will (if present) be replaced by the zoom factor given to the `image' function. For example, image_viewer ("eog %s"); changes the image viewer to the `eog' program. With two input arguments, images will be displayed by calling the function FUNCTION_HANDLE. For example, image_viewer (data, @my_image_viewer); sets the image viewer function to `my_image_viewer'. The image viewer function is called with my_image_viewer (X, Y, IM, ZOOM, DATA) where X and Y are the axis of the image, IM is the image variable, and DATA is extra user-supplied data to be passed to the viewer function. With three input arguments it is possible to change the zooming. Some programs (like `xloadimage') require the zoom factor to be between 0 and 100, and not 0 and 1 like Octave assumes. This is solved by setting the third argument to 100. *See also:* *note image: doc-image, *note imshow: doc-imshow.  File: octave.info, Node: Representing Images, Next: Plotting on top of Images, Prev: Displaying Images, Up: Image Processing 31.3 Representing Images ======================== In general Octave supports four different kinds of images, gray-scale images, RGB images, binary images, and indexed images. A gray-scale image is represented with an M-by-N matrix in which each element corresponds to the intensity of a pixel. An RGB image is represented with an M-by-N-by-3 array where each 3-vector corresponds to the red, green, and blue intensities of each pixel. The actual meaning of the value of a pixel in a gray-scale or RGB image depends on the class of the matrix. If the matrix is of class `double' pixel intensities are between 0 and 1, if it is of class `uint8' intensities are between 0 and 255, and if it is of class `uint16' intensities are between 0 and 65535. A binary image is an M-by-N matrix of class `logical'. A pixel in a binary image is black if it is `false' and white if it is `true'. An indexed image consists of an M-by-N matrix of integers and a C-by-3 color map. Each integer corresponds to an index in the color map, and each row in the color map corresponds to an RGB color. The color map must be of class `double' with values between 0 and 1. -- Function File: [IMG, MAP] = gray2ind (I, N) Convert a gray scale intensity image to an Octave indexed image. The indexed image will consist of N different intensity values. If not given N will default to 64. -- Function File: ind2gray (X, MAP) Convert an Octave indexed image to a gray scale intensity image. If MAP is omitted, the current colormap is used to determine the intensities. *See also:* *note gray2ind: doc-gray2ind, *note rgb2ntsc: doc-rgb2ntsc, *note image: doc-image, *note colormap: doc-colormap. -- Function File: [X, MAP] = rgb2ind (RGB) -- Function File: [X, MAP] = rgb2ind (R, G, B) Convert an RGB image to an Octave indexed image. *See also:* *note ind2rgb: doc-ind2rgb, *note rgb2ntsc: doc-rgb2ntsc. -- Function File: RGB = ind2rgb (X, MAP) -- Function File: [R, G, B] = ind2rgb (X, MAP) Convert an indexed image to red, green, and blue color components. If the colormap doesn't contain enough colors, pad it with the last color in the map. If MAP is omitted, the current colormap is used for the conversion. *See also:* *note rgb2ind: doc-rgb2ind, *note image: doc-image, *note imshow: doc-imshow, *note ind2gray: doc-ind2gray, *note gray2ind: doc-gray2ind. -- Function File: colormap (MAP) -- Function File: colormap ("default") Set the current colormap. `colormap (MAP)' sets the current colormap to MAP. The color map should be an N row by 3 column matrix. The columns contain red, green, and blue intensities respectively. All entries should be between 0 and 1 inclusive. The new colormap is returned. `colormap ("default")' restores the default colormap (the `jet' map with 64 entries). The default colormap is returned. With no arguments, `colormap' returns the current color map. *See also:* *note jet: doc-jet. -- Function File: MAP_OUT = brighten (MAP, BETA) -- Function File: MAP_OUT = brighten (H, BETA) -- Function File: MAP_OUT = brighten (BETA) Darkens or brightens the given colormap. If the MAP argument is omitted, the function is applied to the current colormap. The first argument can also be a valid graphics handle H, in which case `brighten' is applied to the colormap associated with this handle. Should the resulting colormap MAP_OUT not be assigned, it will be written to the current colormap. The argument BETA should be a scalar between -1 and 1, where a negative value darkens and a positive value brightens the colormap. *See also:* *note colormap: doc-colormap. -- Function File: autumn (N) Create color colormap. This colormap is red through orange to yellow. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: bone (N) Create color colormap. This colormap is a gray colormap with a light blue tone. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: cool (N) Create color colormap. The colormap is cyan to magenta. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: copper (N) Create color colormap. This colormap is black to a light copper tone. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: flag (N) Create color colormap. This colormap cycles through red, white, blue and black. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: gray (N) Return a gray colormap with N entries corresponding to values from 0 to N-1. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. -- Function File: hot (N) Create color colormap. This colormap is black through dark red, red, orange, yellow to white. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: hsv (N) Create color colormap. This colormap is red through yellow, green, cyan, blue, magenta to red. It is obtained by linearly varying the hue through all possible values while keeping constant maximum saturation and value and is equivalent to `hsv2rgb ([linspace(0,1,N)', ones(N,2)])'. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: jet (N) Create color colormap. This colormap is dark blue through blue, cyan, green, yellow, red to dark red. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: ocean (N) Create color colormap. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. -- Function File: pink (N) Create color colormap. This colormap gives a sepia tone on black and white images. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: prism (N) Create color colormap. This colormap cycles trough red, orange, yellow, green, blue and violet. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: rainbow (N) Create color colormap. This colormap is red through orange, yellow, green, blue to violet. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: spring (N) Create color colormap. This colormap is magenta to yellow. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: summer (N) Create color colormap. This colormap is green to yellow. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: white (N) Create color colormap. This colormap is completely white. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: winter (N) Create color colormap. This colormap is blue to green. The argument N should be a scalar. If it is omitted, the length of the current colormap or 64 is assumed. *See also:* *note colormap: doc-colormap. -- Function File: contrast (X, N) Return a gray colormap that maximizes the contrast in an image. The returned colormap will have N rows. If N is not defined then the size of the current colormap is used instead. *See also:* *note colormap: doc-colormap. An additional colormap is `gmap40'. This code map contains only colors with integer values of the red, green and blue components. This is a workaround for a limitation of gnuplot 4.0, that does not allow the color of line or patch objects to be set, and so `gmap40' is useful for gnuplot 4.0 users, and in particular in conjunction with the BAR, BARH or CONTOUR functions. -- Function File: gmap40 (N) Create a color colormap. The colormap is red, green, blue, yellow, magenta and cyan. These are the colors that are allowed with patch objects using gnuplot 4.0, and so this colormap function is specially designed for users of gnuplot 4.0. The argument N should be a scalar. If it is omitted, a length of 6 is assumed. Larger values of N result in a repetition of the above colors *See also:* *note colormap: doc-colormap. You may use the `spinmap' function to cycle through the colors in the current colormap, displaying the changes for the current figure. -- Function File: spinmap (T, INC) Cycle the colormap for T seconds with an increment of INC. Both parameters are optional. The default cycle time is 5 seconds and the default increment is 2. A higher value of INC causes a faster cycle through the colormap. *See also:* *note gca: doc-gca, *note colorbar: doc-colorbar.  File: octave.info, Node: Plotting on top of Images, Next: Color Conversion, Prev: Representing Images, Up: Image Processing 31.4 Plotting on top of Images ============================== If gnuplot is being used to display images it is possible to plot on top of images. Since an image is a matrix it is indexed by row and column values. The plotting system is, however, based on the traditional (x, y) system. To minimize the difference between the two systems Octave places the origin of the coordinate system in the point corresponding to the pixel at (1, 1). So, to plot points given by row and column values on top of an image, one should simply call `plot' with the column values as the first argument and the row values as the second. As an example the following code generates an image with random intensities between 0 and 1, and shows the image with red circles over pixels with an intensity above 0.99. I = rand (100, 100); [row, col] = find (I > 0.99); hold ("on"); imshow (I); plot (col, row, "ro"); hold ("off");  File: octave.info, Node: Color Conversion, Prev: Plotting on top of Images, Up: Image Processing 31.5 Color Conversion ===================== Octave supports conversion from the RGB color system to NTSC and HSV and vice versa. -- Function File: HSV_MAP = rgb2hsv (RGB_MAP) Transform a colormap or image from the rgb space to the hsv space. A color n the RGB space consists of the red, green and blue intensities. In the HSV space each color is represented by their hue, saturation and value (brightness). Value gives the amount of light in the color. Hue describes the dominant wavelength. Saturation is the amount of Hue mixed into the color. *See also:* *note hsv2rgb: doc-hsv2rgb. -- Function File: RGB_MAP = hsv2rgb (HSV_MAP) Transform a colormap or image from the hsv space to the rgb space. *See also:* *note rgb2hsv: doc-rgb2hsv. -- Function File: rgb2ntsc (RGB) Transform a colormap or image from RGB to NTSC. *See also:* *note ntsc2rgb: doc-ntsc2rgb. -- Function File: ntsc2rgb (YIQ) Transform a colormap or image from NTSC to RGB. *See also:* *note rgb2ntsc: doc-rgb2ntsc.  File: octave.info, Node: Audio Processing, Next: Object Oriented Programming, Prev: Image Processing, Up: Top 32 Audio Processing ******************* Octave provides a few functions for dealing with audio data. An audio `sample' is a single output value from an A/D converter, i.e., a small integer number (usually 8 or 16 bits), and audio data is just a series of such samples. It can be characterized by three parameters: the sampling rate (measured in samples per second or Hz, e.g., 8000 or 44100), the number of bits per sample (e.g., 8 or 16), and the number of channels (1 for mono, 2 for stereo, etc.). There are many different formats for representing such data. Currently, only the two most popular, _linear encoding_ and _mu-law encoding_, are supported by Octave. There is an excellent FAQ on audio formats by Guido van Rossum which can be found at any FAQ ftp site, in particular in the directory `/pub/usenet/news.answers/audio-fmts' of the archive site `rtfm.mit.edu'. Octave simply treats audio data as vectors of samples (non-mono data are not supported yet). It is assumed that audio files using linear encoding have one of the extensions `lin' or `raw', and that files holding data in mu-law encoding end in `au', `mu', or `snd'. -- Function File: lin2mu (X, N) Converts audio data from linear to mu-law. Mu-law values use 8-bit unsigned integers. Linear values use N-bit signed integers or floating point values in the range -1<=X<=1 if N is 0. If N is not specified it defaults to 0, 8 or 16 depending on the range values in X. *See also:* *note mu2lin: doc-mu2lin, *note loadaudio: doc-loadaudio, *note saveaudio: doc-saveaudio, *note playaudio: doc-playaudio, *note setaudio: doc-setaudio, *note record: doc-record. -- Function File: mu2lin (X, BPS) Converts audio data from linear to mu-law. Mu-law values are 8-bit unsigned integers. Linear values use N-bit signed integers or floating point values in the range -1<=y<=1 if N is 0. If N is not specified it defaults to 8. *See also:* *note lin2mu: doc-lin2mu, *note loadaudio: doc-loadaudio, *note saveaudio: doc-saveaudio, *note playaudio: doc-playaudio, *note setaudio: doc-setaudio, *note record: doc-record. -- Function File: loadaudio (NAME, EXT, BPS) Loads audio data from the file `NAME.EXT' into the vector X. The extension EXT determines how the data in the audio file is interpreted; the extensions `lin' (default) and `raw' correspond to linear, the extensions `au', `mu', or `snd' to mu-law encoding. The argument BPS can be either 8 (default) or 16, and specifies the number of bits per sample used in the audio file. *See also:* *note lin2mu: doc-lin2mu, *note mu2lin: doc-mu2lin, *note saveaudio: doc-saveaudio, *note playaudio: doc-playaudio, *note setaudio: doc-setaudio, *note record: doc-record. -- Function File: saveaudio (NAME, X, EXT, BPS) Saves a vector X of audio data to the file `NAME.EXT'. The optional parameters EXT and BPS determine the encoding and the number of bits per sample used in the audio file (see `loadaudio'); defaults are `lin' and 8, respectively. *See also:* *note lin2mu: doc-lin2mu, *note mu2lin: doc-mu2lin, *note loadaudio: doc-loadaudio, *note playaudio: doc-playaudio, *note setaudio: doc-setaudio, *note record: doc-record. The following functions for audio I/O require special A/D hardware and operating system support. It is assumed that audio data in linear encoding can be played and recorded by reading from and writing to `/dev/dsp', and that similarly `/dev/audio' is used for mu-law encoding. These file names are system-dependent. Improvements so that these functions will work without modification on a wide variety of hardware are welcome. -- Function File: playaudio (NAME, EXT) -- Function File: playaudio (X) Plays the audio file `NAME.EXT' or the audio data stored in the vector X. *See also:* *note lin2mu: doc-lin2mu, *note mu2lin: doc-mu2lin, *note loadaudio: doc-loadaudio, *note saveaudio: doc-saveaudio, *note setaudio: doc-setaudio, *note record: doc-record. -- Function File: record (SEC, SAMPLING_RATE) Records SEC seconds of audio input into the vector X. The default value for SAMPLING_RATE is 8000 samples per second, or 8kHz. The program waits until the user types and then immediately starts to record. *See also:* *note lin2mu: doc-lin2mu, *note mu2lin: doc-mu2lin, *note loadaudio: doc-loadaudio, *note saveaudio: doc-saveaudio, *note playaudio: doc-playaudio, *note setaudio: doc-setaudio. -- Function File: setaudio ([W_TYPE [, VALUE]]) Execute the shell command `mixer [W_TYPE [, VALUE]]' -- Function File: Y = wavread (FILENAME) Load the RIFF/WAVE sound file FILENAME, and return the samples in vector Y. If the file contains multichannel data, then Y is a matrix with the channels represented as columns. -- Function File: [Y, FS, BITS] = wavread (FILENAME) Additionally return the sample rate (FS) in Hz and the number of bits per sample (BITS). -- Function File: [...] = wavread (FILENAME, N) Read only the first N samples from each channel. -- Function File: [...] = wavread (FILENAME,[N1 N2]) Read only samples N1 through N2 from each channel. -- Function File: [SAMPLES, CHANNELS] = wavread (FILENAME, "size") Return the number of samples (N) and channels (CH) instead of the audio data. *See also:* *note wavwrite: doc-wavwrite. -- Function File: wavwrite (Y, FILENAME) -- Function File: wavwrite (Y, FS, FILENAME) -- Function File: wavwrite (Y, FS, BITS, FILENAME) Write Y to the canonical RIFF/WAVE sound file FILENAME with sample rate FS and bits per sample BITS. The default sample rate is 8000 Hz with 16-bits per sample. Each column of the data represents a separate channel. *See also:* *note wavread: doc-wavread.  File: octave.info, Node: Object Oriented Programming, Next: System Utilities, Prev: Audio Processing, Up: Top 33 Object Oriented Programming ****************************** Octave includes the capability to include user classes, including the features of operator and function overloading. Equally a user class can be used to encapsulate certain properties of the class so that they cannot be altered accidentally and can be set up to address the issue of class precedence in mixed class operations. This chapter discussions the means of constructing a user class with the example of a polynomial class, how to query and set the properties of this class, together with the means to overload operators and functions. * Menu: * Creating a Class:: * Manipulating Classes:: * Indexing Objects:: * Overloading Objects:: * Inheritance and Aggregation::  File: octave.info, Node: Creating a Class, Next: Manipulating Classes, Up: Object Oriented Programming 33.1 Creating a Class ===================== We use in the following text a polynomial class to demonstrate the use of object oriented programming within Octave. This class was chosen as it is simple, and so doesn't distract unnecessarily from the discussion of the programming features of Octave. However, even still a small understand of the polynomial class itself is necessary to fully grasp the techniques described. The polynomial class is used to represent polynomials of the form a0 + a1 * x + a2 * x^2 + ... + an * x^n where a0, a1, etc. are real scalars. Thus the polynomial can be represented by a vector a = [a0, a1, a2, ..., an]; We therefore now have sufficient information about the requirements of the class constructor for our polynomial class to write it. All object oriented classes in Octave, must be contained with a directory taking the name of the class, prepended with the @ symbol. For example, with our polynomial class, we would place the methods defining the class in the @polynomial directory. The constructor of the class, must have the name of the class itself and so in our example the constructor with have the name `@polynomial/polynomial.m'. Also ideally when the constructor is called with no arguments to should return a value object. So for example our polynomial might look like ## -*- texinfo -*- ## @deftypefn {Function File} {} polynomial () ## @deftypefnx {Function File} {} polynomial (@var{a}) ## Creates a polynomial object representing the polynomial ## ## @example ## a0 + a1 * x + a2 * x^2 + @dots{} + an * x^n ## @end example ## ## from a vector of coefficients [a0 a1 a2 ... an]. ## @end deftypefn function p = polynomial (a) if (nargin == 0) p.poly = [0]; p = class (p, "polynomial"); elseif (nargin == 1) if (strcmp (class (a), "polynomial")) p = a; elseif (isvector (a) && isreal (a)) p.poly = a(:).'; p = class (p, "polynomial"); else error ("polynomial: expecting real vector"); endif else print_usage (); endif endfunction Note that the return value of the constructor must be the output of the `class' function called with the first argument being a structure and the second argument being the class name. An example of the call to this constructor function is then p = polynomial ([1, 0, 1]); Note that methods of a class can be documented. The help for the constructor itself can be obtained with the constructor name, that is for the polynomial constructor `help polynomial' will return the help string. Also the help can be obtained by restricting the search for the help to a particular class, for example `help @polynomial/polynomial'. This second method is the only means of getting help for the overloaded methods and functions of the class. The same is true for other Octave functions that take a function name as an argument. For example `type @polynomial/display' will print the code of the display method of the polynomial class to the screen, and `dbstop @polynomial/display' will set a breakpoint at the first executable line of the display method of the polynomial class. To check where a variable is a user class, the `isobject' and `isa' functions can be used. for example p = polynomial ([1, 0, 1]); isobject (p) => 1 isa (p, "polynomial") => 1 -- Built-in Function: isobject (X) Return true if X is a class object. The available methods of a class can be displayed with the `methods' function. -- Built-in Function: methods (X) -- Built-in Function: methods ("classname") Return a cell array containing the names of the methods for the object X or the named class. To inquire whether a particular method is available to a user class, the `ismethod' function can be used. -- Built-in Function: ismethod (X, METHOD) Return true if X is a class object and the string METHOD is a method of this class. For example p = polynomial ([1, 0, 1]); ismethod (p, "roots") => 1  File: octave.info, Node: Manipulating Classes, Next: Indexing Objects, Prev: Creating a Class, Up: Object Oriented Programming 33.2 Manipulating Classes ========================= There are a number of basic classes methods that can be defined to allow the contents of the classes to be queried and set. The most basic of these is the `display' method. The `display' method is used by Octave when displaying a class on the screen, due to an expression that is not terminated with a semicolon. If this method is not defined, then Octave will printed nothing when displaying the contents of a class. -- Function File: display (A) Display the contents of an object. If A is an object of the class "myclass", then `display' is called in a case like myclass (...) where Octave is required to display the contents of a variable of the type "myclass". *See also:* *note class: doc-class, *note subsref: doc-subsref, *note subsasgn: doc-subsasgn. An example of a display method for the polynomial class might be function display (p) a = p.poly; first = true; fprintf("%s =", inputname(1)); for i = 1 : length (a); if (a(i) != 0) if (first) first = false; elseif (a(i) > 0) fprintf (" +"); endif if (a(i) < 0) fprintf (" -"); endif if (i == 1) fprintf (" %g", abs (a(i))); elseif (abs(a(i)) != 1) fprintf (" %g *", abs (a(i))); endif if (i > 1) fprintf (" X"); endif if (i > 2) fprintf (" ^ %d", i - 1); endif endif endfor if (first) fprintf(" 0"); endif fprintf("\n"); endfunction Note that in the display method, it makes sense to start the method with the line `fprintf("%s =", inputname(1))' to be consistent with the rest of Octave and print the variable name to be displayed when displaying the class. To be consistent with the Octave graphic handle classes, a class should also define the `get' and `set' methods. The `get' method should accept one or two arguments, and given one argument of the appropriate class it should return a structure with all of the properties of the class. For example function s = get (p, f) if (nargin == 1) s.poly = p.poly; elseif (nargin == 2) if (ischar (f)) switch (f) case "poly" s = p.poly; otherwise error ("get: invalid property %s", f); endswitch else error ("get: expecting the property to be a string"); endif else print_usage (); endif endfunction Similarly, the `set' method should taken as its first argument an object to modify, and then take property/value pairs to be modified. function s = set (p, varargin) s = p; if (length (varargin) < 2 || rem (length (varargin), 2) != 0) error ("set: expecting property/value pairs"); endif while (length (varargin) > 1) prop = varargin{1}; val = varargin{2}; varargin(1:2) = []; if (ischar (prop) && strcmp (prop, "poly")) if (isvector (val) && isreal (val)) s.poly = val(:).'; else error ("set: expecting the value to be a real vector"); endif else error ("set: invalid property of polynomial class"); endif endwhile endfunction Note that as Octave does not implement pass by reference, than the modified object is the return value of the `set' method and it must be called like p = set (p, "a", [1, 0, 0, 0, 1]); Also the `set' method makes use of the `subsasgn' method of the class, and this method must be defined. The `subsasgn' method is discussed in the next section. Finally, user classes can be considered as a special type of a structure, and so they can be saved to a file in the same manner as a structure. For example p = polynomial ([1, 0, 1]); save userclass.mat p clear p load userclass.mat All of the file formats supported by `save' and `load' are supported. In certain circumstances, a user class might either contain a field that it makes no sense to save or a field that needs to be initialized before it is saved. This can be done with the `saveobj' method of the class -- Function File: B = saveobj (A) Method of a class to manipulate an object prior to saving it to a file. The function `saveobj' is called when the object A is saved using the `save' function. An example of the use of `saveobj' might be to remove fields of the object that don't make sense to be saved or it might be used to ensure that certain fields of the object are initialized before the object is saved. For example function b = saveobj (a) b = a; if (isempty (b.field)) b.field = initfield(b); endif endfunction *See also:* *note loadobj: doc-loadobj, *note class: doc-class. `saveobj' is called just prior to saving the class to a file. Likely, the `loadobj' method is called just after a class is loaded from a file, and can be used to ensure that any removed fields are reinserted into the user object. -- Function File: B = loadobj (A) Method of a class to manipulate an object after loading it from a file. The function `loadobj' is called when the object A is loaded using the `load' function. An example of the use of `saveobj' might be to add fields to an object that don't make sense to be saved. For example function b = loadobj (a) b = a; b.addmissingfield = addfield (b); endfunction *See also:* *note saveobj: doc-saveobj, *note class: doc-class.  File: octave.info, Node: Indexing Objects, Next: Overloading Objects, Prev: Manipulating Classes, Up: Object Oriented Programming 33.3 Indexing Objects ===================== Objects can be indexed with parentheses, either like `A (IDX)' or like `A {IDX}', or even like `A (IDX).FIELD'. However, it is up to the user to decide what this indexing actually means. In the case of our polynomial class `P (N)' might mean either the coefficient of the N-th power of the polynomial, or it might be the evaluation of the polynomial at N. The meaning of this subscripted referencing is determined by the `subsref' method. -- Built-in Function: subsref (VAL, IDX) Perform the subscripted element selection operation according to the subscript specified by IDX. The subscript IDX is expected to be a structure array with fields `type' and `subs'. Valid values for `type' are `"()"', `"{}"', and `"."'. The `subs' field may be either `":"' or a cell array of index values. The following example shows how to extract the two first columns of a matrix val = magic(3) => val = [ 8 1 6 3 5 7 4 9 2 ] idx.type = "()"; idx.subs = {":", 1:2}; subsref(val, idx) => [ 8 1 3 5 4 9 ] Note that this is the same as writing `val(:,1:2)'. *See also:* *note subsasgn: doc-subsasgn, *note substruct: doc-substruct. For example we might decide that indexing with "()" evaluates the polynomial and indexing with "{}" returns the N-th coefficient (of N-th power). In this case the `subsref' method of our polynomial class might look like function b = subsref (a, s) if (isempty (s)) error ("polynomial: missing index"); endif switch (s(1).type) case "()" ind = s(1).subs; if (numel (ind) != 1) error ("polynomial: need exactly one index"); else b = polyval (fliplr (a.poly), ind{1}); endif case "{}" ind = s(1).subs; if (numel (ind) != 1) error ("polynomial: need exactly one index"); else b = a.poly(ind{1}+1); endif case "." fld = s.subs; if (strcmp (fld, "poly")) b = a.poly; else error ("@polynomial/subsref: invalid property \"%s\"", fld); endif otherwise error ("invalid subscript type"); endswitch if (numel (s) > 1) b = subsref (b, s(2:end)); endif endfunction The equivalent functionality for subscripted assignments uses the `subsasgn' method. -- Built-in Function: subsasgn (VAL, IDX, RHS) Perform the subscripted assignment operation according to the subscript specified by IDX. The subscript IDX is expected to be a structure array with fields `type' and `subs'. Valid values for `type' are `"()"', `"{}"', and `"."'. The `subs' field may be either `":"' or a cell array of index values. The following example shows how to set the two first columns of a 3-by-3 matrix to zero. val = magic(3); idx.type = "()"; idx.subs = {":", 1:2}; subsasgn (val, idx, 0) => [ 0 0 6 0 0 7 0 0 2 ] Note that this is the same as writing `val(:,1:2) = 0'. *See also:* *note subsref: doc-subsref, *note substruct: doc-substruct. Note that the `subsref' and `subsasgn' methods always receive the whole index chain, while they usually handle only the first element. It is the responsibility of these methods to handle the rest of the chain (if needed), usually by forwarding it again to `subsref' or `subsasgn'. If you wish to use the `end' keyword in subscripted expressions of an object, then the user needs to define the `end' method for the class. For example the `end' method for our polynomial class might look like function r = end (obj, index_pos, num_indices) if (num_indices != 1) error ("polynomial object may only have one index") endif r = length (obj.poly) - 1; endfunction which is a fairly generic `end' method that has a behavior similar to the `end' keyword for Octave Array classes. It can then be used for example like p = polynomial([1,2,3,4]); p(end-1) => 3 Objects can also be used as the index in a subscripted expression themselves and this is controlled with the `subsindex' function. -- Function File: IDX = subsindex (A) Convert an object to an index vector. When A is a class object defined with a class constructor, then `subsindex' is the overloading method that allows the conversion of this class object to a valid indexing vector. It is important to note that `subsindex' must return a zero-based real integer vector of the class "double". For example, if the class constructor function b = myclass (a) b = myclass (struct ("a", a), "myclass"); endfunction then the `subsindex' function function idx = subsindex (a) idx = double (a.a) - 1.0; endfunction can then be used as follows a = myclass (1:4); b = 1:10; b(a) => 1 2 3 4 *See also:* *note class: doc-class, *note subsref: doc-subsref, *note subsasgn: doc-subsasgn. Finally, objects can equally be used like ranges, using the `colon' method -- Function File: R = colon (A, B) -- Function File: R = colon (A, B, C) Method of a class to construct a range with the `:' operator. For example. a = myclass (...) b = myclass (...) c = a : b *See also:* *note class: doc-class, *note subsref: doc-subsref, *note subsasgn: doc-subsasgn.  File: octave.info, Node: Overloading Objects, Next: Inheritance and Aggregation, Prev: Indexing Objects, Up: Object Oriented Programming 33.4 Overloading Objects ======================== * Menu: * Function Overloading:: * Operator Overloading:: * Precedence of Objects::  File: octave.info, Node: Function Overloading, Next: Operator Overloading, Up: Overloading Objects 33.4.1 Function Overloading --------------------------- Any Octave function can be overloaded, and allows a object specific version of this function to be called as needed. A pertinent example for our polynomial class might be to overload the `polyval' function like function [y, dy] = polyval (p, varargin) if (nargout == 2) [y, dy] = polyval (fliplr(p.poly), varargin{:}); else y = polyval (fliplr(p.poly), varargin{:}); endif endfunction This function just hands off the work to the normal Octave `polyval' function. Another interesting example for an overloaded function for our polynomial class is the `plot' function. function h = plot(p, varargin) n = 128; rmax = max (abs (roots (p.poly))); x = [0 : (n - 1)] / (n - 1) * 2.2 * rmax - 1.1 * rmax; if (nargout > 0) h = plot(x, p(x), varargin{:}); else plot(x, p(x), varargin{:}); endif endfunction which allows polynomials to be plotted in the domain near the region of the roots of the polynomial. Functions that are of particular interest to be overloaded are the class conversion functions such as `double'. Overloading these functions allows the `cast' function to work with the user class and can aid in the use of methods of other classes with the user class. An example `double' function for our polynomial class might look like. function b = double (a) b = a.poly; endfunction  File: octave.info, Node: Operator Overloading, Next: Precedence of Objects, Prev: Function Overloading, Up: Overloading Objects 33.4.2 Operator Overloading --------------------------- Operation Method Description a + b plus (a, b) Binary addition a - b$ minus (a, b) Binary subtraction operator + a$ uplus (a) Unary addition operator - a$ uminus (a) Unary subtraction operator a .* b$ times (a, b) Element-wise multiplication operator a * b$ mtimes (a, b) Matrix multiplication operator a ./ b$ rdivide (a, Element-wise right division b) operator a / b$ mrdivide (a, Matrix right division b) operator a .\ b$ ldivide (a, Element-wise left division b) operator a \ b$ mldivide (a, Matrix left division b) operator a .^ b$ ldivide (a, Element-wise power operator b) a ^ b$ mldivide (a, Matrix power operator b) a < b$ lt (a, b) Less than operator a <= b$ le (a, b) Less than or equal to operator a > b$ gt (a, b) Greater than operator a >= b$ ge (a, b) Greater than or equal to operator a == b$ eq (a, b) Equal to operator a != b$ ne (a, b) Not equal to operator a \& b$ and (a, b) Logical and operator a | b$ or (a, b) Logical or operator ! b$ not (a) Logical not operator a'$ ctranspose Complex conjugate transpose (a) operator a.'$ transpose (a) Transpose operator a : b$ colon (a, b) Two element range operator a : b : c$ colon (a, b, Three element range operator c) [a, b]$ horzcat (a, Horizontal concatenation b) operator [a; b]$ vertcat (a, Vertical concatenation b) operator a(s_1, subsref (a, Subscripted reference \ldots, s_n)$ s) a(s_1, subsasgn (a, Subscripted assignment \ldots, s_n) s, b) = b$ b (a)$ subsindex (a) Convert to zero-based index "display" display (a) Commandline display function Table 33.1: Available overloaded operators and their corresponding class method An example `mtimes' method for our polynomial class might look like function y = mtimes (a, b) y = polynomial (conv (double(a),double(b))); endfunction  File: octave.info, Node: Precedence of Objects, Prev: Operator Overloading, Up: Overloading Objects 33.4.3 Precedence of Objects ---------------------------- Many functions and operators take two or more arguments and so the case can easily arise that these functions are called with objects of different classes. It is therefore necessary to determine the precedence of which method of which class to call when there are mixed objects given to a function or operator. To do this the `superiorto' and `inferiorto' functions can be used -- Built-in Function: superiorto (CLASS_NAME, ...) When called from a class constructor, mark the object currently constructed as having a higher precedence than CLASS_NAME. More that one such class can be specified in a single call. This function may only be called from a class constructor. -- Built-in Function: inferiorto (CLASS_NAME, ...) When called from a class constructor, mark the object currently constructed as having a lower precedence than CLASS_NAME. More that one such class can be specified in a single call. This function may only be called from a class constructor. For example with our polynomial class consider the case 2 * polynomial ([1, 0, 1]); That mixes an object of the class "double" with an object of the class "polynomial". In this case we like to ensure that the return type of the above is of the type "polynomial" and so we use the `superiorto' function in the class constructor. In particular our polynomial class constructor would be modified to be ## -*- texinfo -*- ## @deftypefn {Function File} {} polynomial () ## @deftypefnx {Function File} {} polynomial (@var{a}) ## Creates a polynomial object representing the polynomial ## ## @example ## a0 + a1 * x + a2 * x^2 + @dots{} + an * x^n ## @end example ## ## from a vector of coefficients [a0 a1 a2 ... an]. ## @end deftypefn function p = polynomial (a) if (nargin == 0) p.poly = [0]; p = class (p, "polynomial"); elseif (nargin == 1) if (strcmp (class (a), "polynomial")) p = a; elseif (isvector (a) && isreal (a)) p.poly = a(:).'; p = class (p, "polynomial"); else error ("polynomial: expecting real vector"); endif else print_usage (); endif superiorto ("double"); endfunction Note that user classes always have higher precedence than built-in Octave types. So in fact marking our polynomial class higher than the "double" class is in fact not necessary.  File: octave.info, Node: Inheritance and Aggregation, Prev: Overloading Objects, Up: Object Oriented Programming 33.5 Inheritance and Aggregation ================================ Using classes to build new classes is supported by octave through the use of both inheritance and aggregation. Class inheritance is provided by octave using the `class' function in the class constructor. As in the case of the polynomial class, the octave programmer will create a struct that contains the data fields required by the class, and then call the class function to indicate that an object is to be created from the struct. Creating a child of an existing object is done by creating an object of the parent class and providing that object as the third argument of the class function. This is easily demonstrated by example. Suppose the programmer needs an FIR filter, i.e. a filter with a numerator polynomial but a unity denominator polynomial. In traditional octave programming, this would be performed as follows. octave:1> x = [some data vector]; octave:2> n = [some coefficient vector]; octave:3> y = filter (n, 1, x); The equivalent class could be implemented in a class directory @FIRfilter that is on the octave path. The constructor is a file FIRfilter.m in the class directory. ## -*- texinfo -*- ## @deftypefn {Function File} {} FIRfilter () ## @deftypefnx {Function File} {} FIRfilter (@var{p}) ## Creates an FIR filter with polynomial @var{p} as ## coefficient vector. ## ## @end deftypefn function f = FIRfilter (p) f.polynomial = []; if (nargin == 0) p = @polynomial ([1]); elseif (nargin == 1) if (!isa (p, "polynomial")) error ("FIRfilter: expecting polynomial as input argument"); endif else print_usage (); endif f = class (f, "FIRfilter", p); endfunction As before, the leading comments provide command-line documentation for the class constructor. This constructor is very similar to the polynomial class constructor, except that we pass a polynomial object as the third argument to the class function, telling octave that the FIRfilter class will be derived from the polynomial class. Our FIR filter does not have any data fields, but we must provide a struct to the `class' function. The `class' function will add an element named polynomial to the object struct, so we simply add a dummy element named polynomial as the first line of the constructor. This dummy element will be overwritten by the class function. Note further that all our examples provide for the case in which no arguments are supplied. This is important since octave will call the constructor with no arguments when loading ojects from save files to determine the inheritance structure. A class may be a child of more than one class (see the documentation for the `class' function), and inheritance may be nested. There is no limitation to the number of parents or the level of nesting other than memory or other physical issues. As before, we need a `display' method. A simple example might be function display (f) display(f.polynomial); endfunction Note that we have used the polynomial field of the struct to display the filter coefficients. Once we have the class constructor and display method, we may create an object by calling the class constructor. We may also check the class type and examine the underlying structure. octave:1> f=FIRfilter(polynomial([1 1 1]/3)) f.polynomial = 0.333333 + 0.333333 * X + 0.333333 * X ^ 2 octave:2> class(f) ans = FIRfilter octave:3> isa(f,"FIRfilter") ans = 1 octave:4> isa(f,"polynomial") ans = 1 octave:5> struct(f) ans = { polynomial = 0.333333 + 0.333333 * X + 0.333333 * X ^ 2 } We only need to define a method to actually process data with our filter and our class is usable. It is also useful to provide a means of changing the data stored in the class. Since the fields in the underlying struct are private by default, we could provide a mechanism to access the fields. The `subsref' method may be used for both. function out = subsref (f, x) switch x.type case "()" n = f.polynomial; out = filter(n.poly, 1, x.subs{1}); case "." fld = x.subs; if (strcmp (fld, "polynomial")) out = f.polynomial; else error ("@FIRfilter/subsref: invalid property \"%s\"", fld); endif otherwise error ("@FIRfilter/subsref: invalid subscript type for FIR filter"); endswitch endfunction The "()" case allows us to filter data using the polynomial provided to the constructor. octave:2> f=FIRfilter(polynomial([1 1 1]/3)); octave:3> x=ones(5,1); octave:4> y=f(x) y = 0.33333 0.66667 1.00000 1.00000 1.00000 The "." case allows us to view the contents of the polynomial field. octave:1> f=FIRfilter(polynomial([1 1 1]/3)); octave:2> f.polynomial ans = 0.333333 + 0.333333 * X + 0.333333 * X ^ 2 In order to change the contents of the object, we need to define a `subsasgn' method. For example, we may make the polynomial field publicly writeable. function out = subsasgn (f, index, val) switch (index.type) case "." fld = index.subs; if (strcmp (fld, "polynomial")) out = f; out.polynomial = val; else error ("@FIRfilter/subsref: invalid property \"%s\"", fld); endif otherwise error ("FIRfilter/subsagn: Invalid index type") endswitch endfunction So that octave:6> f=FIRfilter(); octave:7> f.polynomial = polynomial([1 2 3]); f.polynomial = 1 + 2 * X + 3 * X ^ 2 Defining the FIRfilter class as a child of the polynomial class implies that and FIRfilter object may be used any place that a polynomial may be used. This is not a normal use of a filter, so that aggregation may be a more sensible design approach. In this case, the polynomial is simply a field in the class structure. A class constructor for this case might be ## -*- texinfo -*- ## @deftypefn {Function File} {} FIRfilter () ## @deftypefnx {Function File} {} FIRfilter (@var{p}) ## Creates an FIR filter with polynomial @var{p} as ## coefficient vector. ## ## @end deftypefn function f = FIRfilter (p) if (nargin == 0) f.polynomial = @polynomial ([1]); elseif (nargin == 1) if (isa (p, "polynomial")) f.polynomial = p; else error ("FIRfilter: expecting polynomial as input argument"); endif else print_usage (); endif f = class (f, "FIRfilter"); endfunction For our example, the remaining class methods remain unchanged.  File: octave.info, Node: System Utilities, Next: Packages, Prev: Object Oriented Programming, Up: Top 34 System Utilities ******************* This chapter describes the functions that are available to allow you to get information about what is happening outside of Octave, while it is still running, and use this information in your program. For example, you can get information about environment variables, the current time, and even start other programs from the Octave prompt. * Menu: * Timing Utilities:: * Filesystem Utilities:: * File Archiving Utilities:: * Networking Utilities:: * Controlling Subprocesses:: * Process ID Information:: * Environment Variables:: * Current Working Directory:: * Password Database Functions:: * Group Database Functions:: * System Information:: * Hashing Functions::  File: octave.info, Node: Timing Utilities, Next: Filesystem Utilities, Up: System Utilities 34.1 Timing Utilities ===================== Octave's core set of functions for manipulating time values are patterned after the corresponding functions from the standard C library. Several of these functions use a data structure for time that includes the following elements: `usec' Microseconds after the second (0-999999). `sec' Seconds after the minute (0-61). This number can be 61 to account for leap seconds. `min' Minutes after the hour (0-59). `hour' Hours since midnight (0-23). `mday' Day of the month (1-31). `mon' Months since January (0-11). `year' Years since 1900. `wday' Days since Sunday (0-6). `yday' Days since January 1 (0-365). `isdst' Daylight Savings Time flag. `zone' Time zone. In the descriptions of the following functions, this structure is referred to as a TM_STRUCT. -- Loadable Function: time () Return the current time as the number of seconds since the epoch. The epoch is referenced to 00:00:00 CUT (Coordinated Universal Time) 1 Jan 1970. For example, on Monday February 17, 1997 at 07:15:06 CUT, the value returned by `time' was 856163706. *See also:* *note strftime: doc-strftime, *note strptime: doc-strptime, *note localtime: doc-localtime, *note gmtime: doc-gmtime, *note mktime: doc-mktime, *note now: doc-now, *note date: doc-date, *note clock: doc-clock, *note datenum: doc-datenum, *note datestr: doc-datestr, *note datevec: doc-datevec, *note calendar: doc-calendar, *note weekday: doc-weekday. -- Function File: t = now () Returns the current local time as the number of days since Jan 1, 0000. By this reckoning, Jan 1, 1970 is day number 719529. The integral part, `floor (now)' corresponds to 00:00:00 today. The fractional part, `rem (now, 1)' corresponds to the current time on Jan 1, 0000. The returned value is also called a "serial date number" (see `datenum'). *See also:* *note clock: doc-clock, *note date: doc-date, *note datenum: doc-datenum. -- Function File: ctime (T) Convert a value returned from `time' (or any other non-negative integer), to the local time and return a string of the same form as `asctime'. The function `ctime (time)' is equivalent to `asctime (localtime (time))'. For example, ctime (time ()) => "Mon Feb 17 01:15:06 1997\n" -- Loadable Function: gmtime (T) Given a value returned from time (or any non-negative integer), return a time structure corresponding to CUT. For example, gmtime (time ()) => { usec = 0 year = 97 mon = 1 mday = 17 sec = 6 zone = CST min = 15 wday = 1 hour = 7 isdst = 0 yday = 47 } *See also:* *note strftime: doc-strftime, *note strptime: doc-strptime, *note localtime: doc-localtime, *note mktime: doc-mktime, *note time: doc-time, *note now: doc-now, *note date: doc-date, *note clock: doc-clock, *note datenum: doc-datenum, *note datestr: doc-datestr, *note datevec: doc-datevec, *note calendar: doc-calendar, *note weekday: doc-weekday. -- Loadable Function: localtime (T) Given a value returned from time (or any non-negative integer), return a time structure corresponding to the local time zone. localtime (time ()) => { usec = 0 year = 97 mon = 1 mday = 17 sec = 6 zone = CST min = 15 wday = 1 hour = 1 isdst = 0 yday = 47 } *See also:* *note strftime: doc-strftime, *note strptime: doc-strptime, *note gmtime: doc-gmtime, *note mktime: doc-mktime, *note time: doc-time, *note now: doc-now, *note date: doc-date, *note clock: doc-clock, *note datenum: doc-datenum, *note datestr: doc-datestr, *note datevec: doc-datevec, *note calendar: doc-calendar, *note weekday: doc-weekday. -- Loadable Function: mktime (TM_STRUCT) Convert a time structure corresponding to the local time to the number of seconds since the epoch. For example, mktime (localtime (time ())) => 856163706 *See also:* *note strftime: doc-strftime, *note strptime: doc-strptime, *note localtime: doc-localtime, *note gmtime: doc-gmtime, *note time: doc-time, *note now: doc-now, *note date: doc-date, *note clock: doc-clock, *note datenum: doc-datenum, *note datestr: doc-datestr, *note datevec: doc-datevec, *note calendar: doc-calendar, *note weekday: doc-weekday. -- Function File: asctime (TM_STRUCT) Convert a time structure to a string using the following five-field format: Thu Mar 28 08:40:14 1996. For example, asctime (localtime (time ())) => "Mon Feb 17 01:15:06 1997\n" This is equivalent to `ctime (time ())'. -- Loadable Function: strftime (FMT, TM_STRUCT) Format the time structure TM_STRUCT in a flexible way using the format string FMT that contains `%' substitutions similar to those in `printf'. Except where noted, substituted fields have a fixed size; numeric fields are padded if necessary. Padding is with zeros by default; for fields that display a single number, padding can be changed or inhibited by following the `%' with one of the modifiers described below. Unknown field specifiers are copied as normal characters. All other characters are copied to the output without change. For example, strftime ("%r (%Z) %A %e %B %Y", localtime (time ())) => "01:15:06 AM (CST) Monday 17 February 1997" Octave's `strftime' function supports a superset of the ANSI C field specifiers. Literal character fields: `%' % character. `n' Newline character. `t' Tab character. Numeric modifiers (a nonstandard extension): `- (dash)' Do not pad the field. `_ (underscore)' Pad the field with spaces. Time fields: `%H' Hour (00-23). `%I' Hour (01-12). `%k' Hour (0-23). `%l' Hour (1-12). `%M' Minute (00-59). `%p' Locale's AM or PM. `%r' Time, 12-hour (hh:mm:ss [AP]M). `%R' Time, 24-hour (hh:mm). `%s' Time in seconds since 00:00:00, Jan 1, 1970 (a nonstandard extension). `%S' Second (00-61). `%T' Time, 24-hour (hh:mm:ss). `%X' Locale's time representation (%H:%M:%S). `%Z' Time zone (EDT), or nothing if no time zone is determinable. Date fields: `%a' Locale's abbreviated weekday name (Sun-Sat). `%A' Locale's full weekday name, variable length (Sunday-Saturday). `%b' Locale's abbreviated month name (Jan-Dec). `%B' Locale's full month name, variable length (January-December). `%c' Locale's date and time (Sat Nov 04 12:02:33 EST 1989). `%C' Century (00-99). `%d' Day of month (01-31). `%e' Day of month ( 1-31). `%D' Date (mm/dd/yy). `%h' Same as %b. `%j' Day of year (001-366). `%m' Month (01-12). `%U' Week number of year with Sunday as first day of week (00-53). `%w' Day of week (0-6). `%W' Week number of year with Monday as first day of week (00-53). `%x' Locale's date representation (mm/dd/yy). `%y' Last two digits of year (00-99). `%Y' Year (1970-). *See also:* *note strptime: doc-strptime, *note localtime: doc-localtime, *note gmtime: doc-gmtime, *note mktime: doc-mktime, *note time: doc-time, *note now: doc-now, *note date: doc-date, *note clock: doc-clock, *note datenum: doc-datenum, *note datestr: doc-datestr, *note datevec: doc-datevec, *note calendar: doc-calendar, *note weekday: doc-weekday. -- Loadable Function: [TM_STRUCT, NCHARS] = strptime (STR, FMT) Convert the string STR to the time structure TM_STRUCT under the control of the format string FMT. If FMT fails to match, NCHARS is 0; otherwise it is set to the position of last matched character plus 1. Always check for this unless you're absolutely sure the date string will be parsed correctly. *See also:* *note strftime: doc-strftime, *note localtime: doc-localtime, *note gmtime: doc-gmtime, *note mktime: doc-mktime, *note time: doc-time, *note now: doc-now, *note date: doc-date, *note clock: doc-clock, *note datenum: doc-datenum, *note datestr: doc-datestr, *note datevec: doc-datevec, *note calendar: doc-calendar, *note weekday: doc-weekday. Most of the remaining functions described in this section are not patterned after the standard C library. Some are available for compatibility with MATLAB and others are provided because they are useful. -- Function File: clock () Return a vector containing the current year, month (1-12), day (1-31), hour (0-23), minute (0-59) and second (0-61). For example, clock () => [ 1993, 8, 20, 4, 56, 1 ] The function clock is more accurate on systems that have the `gettimeofday' function. -- Function File: date () Return the date as a character string in the form DD-MMM-YY. For example, date () => "20-Aug-93" -- Function File: etime (T1, T2) Return the difference (in seconds) between two time values returned from `clock'. For example: t0 = clock (); many computations later... elapsed_time = etime (clock (), t0); will set the variable `elapsed_time' to the number of seconds since the variable `t0' was set. *See also:* *note tic: doc-tic, *note toc: doc-toc, *note clock: doc-clock, *note cputime: doc-cputime. -- Built-in Function: [TOTAL, USER, SYSTEM] = cputime (); Return the CPU time used by your Octave session. The first output is the total time spent executing your process and is equal to the sum of second and third outputs, which are the number of CPU seconds spent executing in user mode and the number of CPU seconds spent executing in system mode, respectively. If your system does not have a way to report CPU time usage, `cputime' returns 0 for each of its output values. Note that because Octave used some CPU time to start, it is reasonable to check to see if `cputime' works by checking to see if the total CPU time used is nonzero. -- Function File: is_leap_year (YEAR) Return 1 if the given year is a leap year and 0 otherwise. If no arguments are provided, `is_leap_year' will use the current year. For example, is_leap_year (2000) => 1 -- Built-in Function: tic () -- Built-in Function: toc () Set or check a wall-clock timer. Calling `tic' without an output argument sets the timer. Subsequent calls to `toc' return the number of seconds since the timer was set. For example, tic (); # many computations later... elapsed_time = toc (); will set the variable `elapsed_time' to the number of seconds since the most recent call to the function `tic'. If called with one output argument then this function returns a scalar of type `uint64' and the wall-clock timer is not started. t = tic; sleep (5); (double (tic ()) - double (t)) * 1e-6 => 5 Nested timing with `tic' and `toc' is not supported. Therefore `toc' will always return the elapsed time from the most recent call to `tic'. If you are more interested in the CPU time that your process used, you should use the `cputime' function instead. The `tic' and `toc' functions report the actual wall clock time that elapsed between the calls. This may include time spent processing other jobs or doing nothing at all. For example, tic (); sleep (5); toc () => 5 t = cputime (); sleep (5); cputime () - t => 0 (This example also illustrates that the CPU timer may have a fairly coarse resolution.) -- Built-in Function: pause (SECONDS) Suspend the execution of the program. If invoked without any arguments, Octave waits until you type a character. With a numeric argument, it pauses for the given number of seconds. For example, the following statement prints a message and then waits 5 seconds before clearing the screen. fprintf (stderr, "wait please...\n"); pause (5); clc; -- Built-in Function: sleep (SECONDS) Suspend the execution of the program for the given number of seconds. -- Built-in Function: usleep (MICROSECONDS) Suspend the execution of the program for the given number of microseconds. On systems where it is not possible to sleep for periods of time less than one second, `usleep' will pause the execution for `round (MICROSECONDS / 1e6)' seconds. -- Function File: datenum (YEAR, MONTH, DAY) -- Function File: datenum (YEAR, MONTH, DAY, HOUR) -- Function File: datenum (YEAR, MONTH, DAY, HOUR, MINUTE) -- Function File: datenum (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND) -- Function File: datenum (`"date"') -- Function File: datenum (`"date"', P) Returns the specified local time as a day number, with Jan 1, 0000 being day 1. By this reckoning, Jan 1, 1970 is day number 719529. The fractional portion, P, corresponds to the portion of the specified day. Notes: * Years can be negative and/or fractional. * Months below 1 are considered to be January. * Days of the month start at 1. * Days beyond the end of the month go into subsequent months. * Days before the beginning of the month go to the previous month. * Days can be fractional. *Warning:* this function does not attempt to handle Julian calendars so dates before Octave 15, 1582 are wrong by as much as eleven days. Also be aware that only Roman Catholic countries adopted the calendar in 1582. It took until 1924 for it to be adopted everywhere. See the Wikipedia entry on the Gregorian calendar for more details. *Warning:* leap seconds are ignored. A table of leap seconds is available on the Wikipedia entry for leap seconds. *See also:* *note date: doc-date, *note clock: doc-clock, *note now: doc-now, *note datestr: doc-datestr, *note datevec: doc-datevec, *note calendar: doc-calendar, *note weekday: doc-weekday. -- Function File: STR = datestr (DATE, [F, [P]]) Format the given date/time according to the format `f' and return the result in STR. DATE is a serial date number (see `datenum') or a date vector (see `datevec'). The value of DATE may also be a string or cell array of strings. F can be an integer which corresponds to one of the codes in the table below, or a date format string. P is the year at the start of the century in which two-digit years are to be interpreted in. If not specified, it defaults to the current year minus 50. For example, the date 730736.65149 (2000-09-07 15:38:09.0934) would be formatted as follows: Code Format Example --------------------------------------------------------------- 0 dd-mmm-yyyy HH:MM:SS 07-Sep-2000 15:38:09 1 dd-mmm-yyyy 07-Sep-2000 2 mm/dd/yy 09/07/00 3 mmm Sep 4 m S 5 mm 09 6 mm/dd 09/07 7 dd 07 8 ddd Thu 9 d T 10 yyyy 2000 11 yy 00 12 mmmyy Sep00 13 HH:MM:SS 15:38:09 14 HH:MM:SS PM 03:38:09 PM 15 HH:MM 15:38 16 HH:MM PM 03:38 PM 17 QQ-YY Q3-00 18 QQ Q3 19 dd/mm 13/03 20 dd/mm/yy 13/03/95 21 mmm.dd.yyyy HH:MM:SS Mar.03.1962 13:53:06 22 mmm.dd.yyyy Mar.03.1962 23 mm/dd/yyyy 03/13/1962 24 dd/mm/yyyy 12/03/1962 25 yy/mm/dd 95/03/13 26 yyyy/mm/dd 1995/03/13 27 QQ-YYYY Q4-2132 28 mmmyyyy Mar2047 29 yyyymmdd 20470313 30 yyyymmddTHHMMSS 20470313T132603 31 yyyy-mm-dd HH:MM:SS 1047-03-13 13:26:03 If F is a format string, the following symbols are recognized: Symbol Meaning Example ---------------------------------------------------------------------- yyyy Full year 2005 yy Two-digit year 2005 mmmm Full month name December mmm Abbreviated month name Dec mm Numeric month number (padded with zeros) 01, 08, 12 m First letter of month name (capitalized) D dddd Full weekday name Sunday ddd Abbreviated weekday name Sun dd Numeric day of month (padded with zeros) 11 d First letter of weekday name (capitalized) S HH Hour of day, padded with zeros if PM is set 09:00 and not padded with zeros otherwise 9:00 AM MM Minute of hour (padded with zeros) 10:05 SS Second of minute (padded with zeros) 10:05:03 PM Use 12-hour time format 11:30 PM If F is not specified or is `-1', then use 0, 1 or 16, depending on whether the date portion or the time portion of DATE is empty. If P is nor specified, it defaults to the current year minus 50. If a matrix or cell array of dates is given, a vector of date strings is returned. *See also:* *note datenum: doc-datenum, *note datevec: doc-datevec, *note date: doc-date, *note clock: doc-clock, *note now: doc-now, *note datetick: doc-datetick. -- Function File: V = datevec (DATE) -- Function File: V = datevec (DATE, F) -- Function File: V = datevec (DATE, P) -- Function File: V = datevec (DATE, F, P) -- Function File: [Y, M, D, H, MI, S] = datevec (...) Convert a serial date number (see `datenum') or date string (see `datestr') into a date vector. A date vector is a row vector with six members, representing the year, month, day, hour, minute, and seconds respectively. F is the format string used to interpret date strings (see `datestr'). P is the year at the start of the century in which two-digit years are to be interpreted in. If not specified, it defaults to the current year minus 50. *See also:* *note datenum: doc-datenum, *note datestr: doc-datestr, *note date: doc-date, *note clock: doc-clock, *note now: doc-now. -- Function File: D = addtodate (D, Q, F) Add Q amount of time (with units F) to the datenum, D. F must be one of "year", "month", "day", "hour", "minute", or "second". *See also:* *note datenum: doc-datenum, *note datevec: doc-datevec. -- Function File: calendar (...) -- Function File: C = calendar () -- Function File: C = calendar (D) -- Function File: C = calendar (Y, M) If called with no arguments, return the current monthly calendar in a 6x7 matrix. If D is specified, return the calendar for the month containing the day D, which must be a serial date number or a date string. If Y and M are specified, return the calendar for year Y and month M. If no output arguments are specified, print the calendar on the screen instead of returning a matrix. *See also:* *note datenum: doc-datenum. -- Function File: [N, S] = weekday (D, [FORM]) Return the day of week as a number in N and a string in S, for example `[1, "Sun"]', `[2, "Mon"]', ..., or `[7, "Sat"]'. D is a serial date number or a date string. If the string FORM is given and is `"long"', S will contain the full name of the weekday; otherwise (or if FORM is `"short"'), S will contain the abbreviated name of the weekday. *See also:* *note datenum: doc-datenum, *note datevec: doc-datevec, *note eomday: doc-eomday. -- Function File: E = eomday (Y, M) Return the last day of the month M for the year Y. *See also:* *note datenum: doc-datenum, *note datevec: doc-datevec, *note weekday: doc-weekday. -- Function File: datetick (FORM) -- Function File: datetick (AXIS, FORM) -- Function File: datetick (..., "keeplimits") -- Function File: datetick (..., "keepticks") -- Function File: datetick (...ax, ...) Adds date formatted tick labels to an axis. The axis the apply the ticks to is determined by AXIS that can take the values "x", "y" or "z". The default value is "x". The formatting of the labels is determined by the variable FORM, that can either be a string in the format needed by `dateform', or a positive integer that can be accepted by `datestr'. *See also:* *note datenum: doc-datenum, *note datestr: doc-datestr.  File: octave.info, Node: Filesystem Utilities, Next: File Archiving Utilities, Prev: Timing Utilities, Up: System Utilities 34.2 Filesystem Utilities ========================= Octave includes the following functions for renaming and deleting files, creating, deleting, and reading directories, and for getting information about the status of files. -- Built-in Function: [ERR, MSG] = rename (OLD, NEW) Change the name of file OLD to NEW. If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. *See also:* *note ls: doc-ls, *note dir: doc-dir. -- Built-in Function: [ERR, MSG] = link (OLD, NEW) Create a new link (also known as a hard link) to an existing file. If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. *See also:* *note symlink: doc-symlink. -- Built-in Function: [ERR, MSG] = symlink (OLD, NEW) Create a symbolic link NEW which contains the string OLD. If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. *See also:* *note link: doc-link, *note readlink: doc-readlink. -- Built-in Function: [RESULT, ERR, MSG] = readlink (SYMLINK) Read the value of the symbolic link SYMLINK. If successful, RESULT contains the contents of the symbolic link SYMLINK, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. *See also:* *note link: doc-link, *note symlink: doc-symlink. -- Built-in Function: [ERR, MSG] = unlink (FILE) Delete the file named FILE. If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. -- Built-in Function: [FILES, ERR, MSG] = readdir (DIR) Return names of the files in the directory DIR as a cell array of strings. If an error occurs, return an empty cell array in FILES. If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. *See also:* *note dir: doc-dir, *note glob: doc-glob. -- Built-in Function: [STATUS, MSG, MSGID] = mkdir (DIR) -- Built-in Function: [STATUS, MSG, MSGID] = mkdir (PARENT, DIR) Create a directory named DIR in the directory PARENT. If successful, STATUS is 1, with MSG and MSGID empty character strings. Otherwise, STATUS is 0, MSG contains a system-dependent error message, and MSGID contains a unique message identifier. *See also:* *note rmdir: doc-rmdir. -- Built-in Function: [STATUS, MSG, MSGID] = rmdir (DIR) -- Built-in Function: [STATUS, MSG, MSGID] = rmdir (DIR, `"s"') Remove the directory named DIR. If successful, STATUS is 1, with MSG and MSGID empty character strings. Otherwise, STATUS is 0, MSG contains a system-dependent error message, and MSGID contains a unique message identifier. If the optional second parameter is supplied with value `"s"', recursively remove all subdirectories as well. *See also:* *note mkdir: doc-mkdir, *note confirm_recursive_rmdir: doc-confirm_recursive_rmdir. -- Built-in Function: VAL = confirm_recursive_rmdir () -- Built-in Function: OLD_VAL = confirm_recursive_rmdir (NEW_VAL) Query or set the internal variable that controls whether Octave will ask for confirmation before recursively removing a directory tree. -- Built-in Function: [ERR, MSG] = mkfifo (NAME, MODE) Create a FIFO special file named NAME with file mode MODE If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. -- Built-in Function: umask (MASK) Set the permission mask for file creation. The parameter MASK is an integer, interpreted as an octal number. If successful, returns the previous value of the mask (as an integer to be interpreted as an octal number); otherwise an error message is printed. -- Built-in Function: [INFO, ERR, MSG] = stat (FILE) -- Built-in Function: [INFO, ERR, MSG] = lstat (FILE) Return a structure S containing the following information about FILE. `dev' ID of device containing a directory entry for this file. `ino' File number of the file. `mode' File mode, as an integer. Use the functions `S_ISREG', `S_ISDIR', `S_ISCHR', `S_ISBLK', `S_ISFIFO', `S_ISLNK', or `S_ISSOCK' to extract information from this value. `modestr' File mode, as a string of ten letters or dashes as would be returned by `ls -l'. `nlink' Number of links. `uid' User ID of file's owner. `gid' Group ID of file's group. `rdev' ID of device for block or character special files. `size' Size in bytes. `atime' Time of last access in the same form as time values returned from `time'. *Note Timing Utilities::. `mtime' Time of last modification in the same form as time values returned from `time'. *Note Timing Utilities::. `ctime' Time of last file status change in the same form as time values returned from `time'. *Note Timing Utilities::. `blksize' Size of blocks in the file. `blocks' Number of blocks allocated for file. If the call is successful ERR is 0 and MSG is an empty string. If the file does not exist, or some other error occurs, S is an empty matrix, ERR is -1, and MSG contains the corresponding system error message. If FILE is a symbolic link, `stat' will return information about the actual file that is referenced by the link. Use `lstat' if you want information about the symbolic link itself. For example, [s, err, msg] = stat ("/vmlinuz") => s = { atime = 855399756 rdev = 0 ctime = 847219094 uid = 0 size = 389218 blksize = 4096 mtime = 847219094 gid = 6 nlink = 1 blocks = 768 mode = -rw-r--r-- modestr = -rw-r--r-- ino = 9316 dev = 2049 } => err = 0 => msg = -- Built-in Function: [INFO, ERR, MSG] = fstat (FID) Return information about the open file FID. See `stat' for a description of the contents of INFO. -- Function File: [STATUS, MSG, MSGID] = fileattrib (FILE) Return information about FILE. If successful, STATUS is 1, with RESULT containing a structure with the following fields: `Name' Full name of FILE. `archive' True if FILE is an archive (Windows). `system' True if FILE is a system file (Windows). `hidden' True if FILE is a hidden file (Windows). `directory' True if FILE is a directory. `UserRead' `GroupRead' `OtherRead' True if the user (group; other users) has read permission for FILE. `UserWrite' `GroupWrite' `OtherWrite' True if the user (group; other users) has write permission for FILE. `UserExecute' `GroupExecute' `OtherExecute' True if the user (group; other users) has execute permission for FILE. If an attribute does not apply (i.e., archive on a Unix system) then the field is set to NaN. With no input arguments, return information about the current directory. If FILE contains globbing characters, return information about all the matching files. *See also:* *note glob: doc-glob. -- Function File: isdir (F) Return true if F is a directory. -- Built-in Function: glob (PATTERN) Given an array of strings (as a char array or a cell array) in PATTERN, return a cell array of file names that match any of them, or an empty cell array if no patterns match. Tilde expansion is performed on each of the patterns before looking for matching file names. For example, glob ("/vm*") => "/vmlinuz" *See also:* *note dir: doc-dir, *note ls: doc-ls, *note stat: doc-stat, *note readdir: doc-readdir. -- Built-in Function: fnmatch (PATTERN, STRING) Return 1 or zero for each element of STRING that matches any of the elements of the string array PATTERN, using the rules of filename pattern matching. For example, fnmatch ("a*b", {"ab"; "axyzb"; "xyzab"}) => [ 1; 1; 0 ] -- Built-in Function: file_in_path (PATH, FILE) -- Built-in Function: file_in_path (PATH, FILE, "all") Return the absolute name of FILE if it can be found in PATH. The value of PATH should be a colon-separated list of directories in the format described for `path'. If no file is found, return an empty matrix. For example, file_in_path (EXEC_PATH, "sh") => "/bin/sh" If the second argument is a cell array of strings, search each directory of the path for element of the cell array and return the first that matches. If the third optional argument `"all"' is supplied, return a cell array containing the list of all files that have the same name in the path. If no files are found, return an empty cell array. *See also:* *note file_in_loadpath: doc-file_in_loadpath. -- Built-in Function: tilde_expand (STRING) Performs tilde expansion on STRING. If STRING begins with a tilde character, (`~'), all of the characters preceding the first slash (or all characters, if there is no slash) are treated as a possible user name, and the tilde and the following characters up to the slash are replaced by the home directory of the named user. If the tilde is followed immediately by a slash, the tilde is replaced by the home directory of the user running Octave. For example, tilde_expand ("~joeuser/bin") => "/home/joeuser/bin" tilde_expand ("~/bin") => "/home/jwe/bin" -- Built-in Function: [CNAME, STATUS, MSG] canonicalize_file_name (NAME) Return the canonical name of file NAME. -- Function File: [STATUS, MSG, MSGID] = movefile (F1, F2) Move the file F1 to the new name F2. The name F1 may contain globbing patterns. If F1 expands to multiple file names, F2 must be a directory. If successful, STATUS is 1, with MSG and MSGID empty\n\ character strings. Otherwise, STATUS is 0, MSG contains a\n\ system-dependent error message, and MSGID contains a unique\n\ message identifier.\n\ *See also:* *note glob: doc-glob. -- Function File: [STATUS, MSG, MSGID] = copyfile (F1, F2, FORCE) Copy the file F1 to the new name F2. The name F1 may contain globbing patterns. If F1 expands to multiple file names, F2 must be a directory. If FORCE is given and equals the string "f" the copy operation will be forced. If successful, STATUS is 1, with MSG and MSGID empty\n\ character strings. Otherwise, STATUS is 0, MSG contains a\n\ system-dependent error message, and MSGID contains a unique\n\ message identifier.\n\ *See also:* *note glob: doc-glob, *note movefile: doc-movefile. -- Function File: [DIR, NAME, EXT, VER] = fileparts (FILENAME) Return the directory, name, extension, and version components of FILENAME. *See also:* *note fullfile: doc-fullfile. -- Built-in Function: filesep () -- Built-in Function: filesep ('all') Return the system-dependent character used to separate directory names. If 'all' is given, the function return all valid file separators in the form of a string. The list of file separators is system-dependent. It is / (forward slash) under UNIX or Mac OS X, / and \ (forward and backward slashes) under Windows. *See also:* *note pathsep: doc-pathsep, *note dir: doc-dir, *note ls: doc-ls. -- Built-in Function: filemarker () Returns or sets the character used to separate filename from the the subfunction names contained within the file. This can be used in a generic manner to interact with subfunctions. For example help (["myfunc", filemarker, "mysubfunc"]) returns the help string associated with the sub-function `mysubfunc' of the function `myfunc'. Another use of `filemarker' is when debugging it allows easier placement of breakpoints within sub-functions. For example dbstop (["myfunc", filemarker, "mysubfunc"]) will set a breakpoint at the first line of the subfunction `mysubfunc'. -- Function File: FILENAME = fullfile (DIR1, DIR2, ..., FILE) Return a complete filename constructed from the given components. *See also:* *note fileparts: doc-fileparts. -- Function File: DIR = tempdir () Return the name of the system's directory for temporary files. -- Function File: filename = tempname () This function is an alias for `tmpnam'. -- Built-in Function: P_tmpdir () Return the default name of the directory for temporary files on this system. The name of this directory is system dependent. -- Built-in Function: is_absolute_filename (FILE) Return true if FILE is an absolute filename. -- Built-in Function: is_rooted_relative_filename (FILE) Return true if FILE is a rooted-relative filename. -- Built-in Function: make_absolute_filename (FILE) Return the full name of FILE, relative to the current directory.  File: octave.info, Node: File Archiving Utilities, Next: Networking Utilities, Prev: Filesystem Utilities, Up: System Utilities 34.3 File Archiving Utilities ============================= -- Function File: bunzip2 (BZFILE, DIR) Unpack the bzip2 archive BZFILE to the directory DIR. If DIR is not specified, it defaults to the current directory. *See also:* *note unpack: doc-unpack, *note bzip2: doc-bzip2, *note tar: doc-tar, *note untar: doc-untar, *note gzip: doc-gzip, *note gunzip: doc-gunzip, *note zip: doc-zip, *note unzip: doc-unzip. -- Function File: ENTRIES = gzip (FILES) -- Function File: ENTRIES = gzip (FILES, OUTDIR) Compress the list of files and/or directories specified in FILES. Each file is compressed separately and a new file with a '.gz' extension is created. The original files are not touched. Existing compressed files are silently overwritten. If OUTDIR is defined the compressed versions of the files are placed in this directory. *See also:* *note gunzip: doc-gunzip, *note bzip2: doc-bzip2, *note zip: doc-zip, *note tar: doc-tar. -- Function File: gunzip (GZFILE, DIR) Unpack the gzip archive GZFILE to the directory DIR. If DIR is not specified, it defaults to the current directory. If the GZFILE is a directory, all files in the directory will be recursively gunzipped. *See also:* *note unpack: doc-unpack, *note bunzip2: doc-bunzip2, *note tar: doc-tar, *note untar: doc-untar, *note gzip: doc-gzip, *note gunzip: doc-gunzip, *note zip: doc-zip, *note unzip: doc-unzip. -- Function File: ENTRIES = tar (TARFILE, FILES, ROOT) Pack FILES FILES into the TAR archive TARFILE. The list of files must be a string or a cell array of strings. The optional argument ROOT changes the relative path of FILES from the current directory. If an output argument is requested the entries in the archive are returned in a cell array. *See also:* *note untar: doc-untar, *note gzip: doc-gzip, *note gunzip: doc-gunzip, *note zip: doc-zip, *note unzip: doc-unzip. -- Function File: untar (TARFILE, DIR) Unpack the TAR archive TARFILE to the directory DIR. If DIR is not specified, it defaults to the current directory. *See also:* *note unpack: doc-unpack, *note bunzip2: doc-bunzip2, *note tar: doc-tar, *note gzip: doc-gzip, *note gunzip: doc-gunzip, *note zip: doc-zip, *note unzip: doc-unzip. -- Function File: ENTRIES = zip (ZIPFILE, FILES) -- Function File: ENTRIES = zip (ZIPFILE, FILES, ROOTDIR) Compress the list of files and/or directories specified in FILES into the archive ZIPFILES in the same directory. If ROOTDIR is defined the FILES is located relative to ROOTDIR rather than the current directory *See also:* *note unzip: doc-unzip, *note tar: doc-tar. -- Function File: unzip (ZIPFILE, DIR) Unpack the ZIP archive ZIPFILE to the directory DIR. If DIR is not specified, it defaults to the current directory. *See also:* *note unpack: doc-unpack, *note bunzip2: doc-bunzip2, *note tar: doc-tar, *note untar: doc-untar, *note gzip: doc-gzip, *note gunzip: doc-gunzip, *note zip: doc-zip. -- Function File: pack () This function is provided for compatibility with MATLAB, but it doesn't actually do anything. -- Function File: FILES = unpack (FILE, DIR) -- Function File: FILES = unpack (FILE, DIR, FILETYPE) Unpack the archive FILE based on its extension to the directory DIR. If FILE is a cellstr, then all files will be handled individually. If DIR is not specified, it defaults to the current directory. It returns a list of FILES unpacked. If a directory is in the file list, then the FILETYPE to unpack must also be specified. The FILES includes the entire path to the output files. *See also:* *note bunzip2: doc-bunzip2, *note tar: doc-tar, *note untar: doc-untar, *note gzip: doc-gzip, *note gunzip: doc-gunzip, *note zip: doc-zip, *note unzip: doc-unzip. -- Function File: ENTRIES = bzip2 (FILES) -- Function File: ENTRIES = bzip2 (FILES, OUTDIR) Compress the list of files specified in FILES. Each file is compressed separately and a new file with a '.bz2' extension is created. The original files are not touched. Existing compressed files are silently overwritten.If OUTDIR is defined the compressed versions of the files are placed in this directory. *See also:* *note bunzip2: doc-bunzip2, *note gzip: doc-gzip, *note zip: doc-zip, *note tar: doc-tar.  File: octave.info, Node: Networking Utilities, Next: Controlling Subprocesses, Prev: File Archiving Utilities, Up: System Utilities 34.4 Networking Utilities ========================= -- Loadable Function: S = urlread (URL) -- Loadable Function: [S, SUCCESS] = urlread (URL) -- Loadable Function: [S, SUCCESS, MESSAGE] = urlread (URL) -- Loadable Function: [...] = urlread (URL, METHOD, PARAM) Download a remote file specified by its URL and return its content in string S. For example, s = urlread ("ftp://ftp.octave.org/pub/octave/README"); The variable SUCCESS is 1 if the download was successful, otherwise it is 0 in which case MESSAGE contains an error message. If no output argument is specified and if an error occurs, then the error is signaled through Octave's error handling mechanism. This function uses libcurl. Curl supports, among others, the HTTP, FTP and FILE protocols. Username and password may be specified in the URL. For example, s = urlread ("http://user:password@example.com/file.txt"); GET and POST requests can be specified by METHOD and PARAM. The parameter METHOD is either `get' or `post' and PARAM is a cell array of parameter and value pairs. For example, s = urlread ("http://www.google.com/search", "get", {"query", "octave"}); *See also:* *note urlwrite: doc-urlwrite. -- Loadable Function: urlwrite (URL, LOCALFILE) -- Loadable Function: F = urlwrite (URL, LOCALFILE) -- Loadable Function: [F, SUCCESS] = urlwrite (URL, LOCALFILE) -- Loadable Function: [F, SUCCESS, MESSAGE] = urlwrite (URL, LOCALFILE) Download a remote file specified by its URL and save it as LOCALFILE. For example, urlwrite ("ftp://ftp.octave.org/pub/octave/README", "README.txt"); The full path of the downloaded file is returned in F. The variable SUCCESS is 1 if the download was successful, otherwise it is 0 in which case MESSAGE contains an error message. If no output argument is specified and if an error occurs, then the error is signaled through Octave's error handling mechanism. This function uses libcurl. Curl supports, among others, the HTTP, FTP and FILE protocols. Username and password may be specified in the URL, for example: urlwrite ("http://username:password@example.com/file.txt", "file.txt"); GET and POST requests can be specified by METHOD and PARAM. The parameter METHOD is either `get' or `post' and PARAM is a cell array of parameter and value pairs. For example: urlwrite ("http://www.google.com/search", "search.html", "get", {"query", "octave"}); *See also:* *note urlread: doc-urlread.  File: octave.info, Node: Controlling Subprocesses, Next: Process ID Information, Prev: Networking Utilities, Up: System Utilities 34.5 Controlling Subprocesses ============================= Octave includes some high-level commands like `system' and `popen' for starting subprocesses. If you want to run another program to perform some task and then look at its output, you will probably want to use these functions. Octave also provides several very low-level Unix-like functions which can also be used for starting subprocesses, but you should probably only use them if you can't find any way to do what you need with the higher-level functions. -- Built-in Function: system (STRING, RETURN_OUTPUT, TYPE) Execute a shell command specified by STRING. The second argument is optional. If TYPE is `"async"', the process is started in the background and the process id of the child process is returned immediately. Otherwise, the process is started, and Octave waits until it exits. If the TYPE argument is omitted, a value of `"sync"' is assumed. If two input arguments are given (the actual value of RETURN_OUTPUT is irrelevant) and the subprocess is started synchronously, or if SYSTEM is called with one input argument and one or more output arguments, the output from the command is returned. Otherwise, if the subprocess is executed synchronously, its output is sent to the standard output. To send the output of a command executed with SYSTEM through the pager, use a command like disp (system (cmd, 1)); or printf ("%s\n", system (cmd, 1)); The `system' function can return two values. The first is the exit status of the command and the second is any output from the command that was written to the standard output stream. For example, [status, output] = system ("echo foo; exit 2"); will set the variable `output' to the string `foo', and the variable `status' to the integer `2'. -- Function File: [STATUS, TEXT] unix (COMMAND) -- Function File: [STATUS, TEXT] unix (COMMAND, "-echo") Execute a system command if running under a Unix-like operating system, otherwise do nothing. Return the exit status of the program in STATUS and any output sent to the standard output in TEXT. If the optional second argument `"-echo"' is given, then also send the output from the command to the standard output. *See also:* *note isunix: doc-isunix, *note ispc: doc-ispc, *note system: doc-system. -- Function File: [STATUS, TEXT] = dos (COMMAND) -- Function File: [STATUS, TEXT] = dos (COMMAND, "-echo") Execute a system command if running under a Windows-like operating system, otherwise do nothing. Return the exit status of the program in STATUS and any output sent to the standard output in TEXT. If the optional second argument `"-echo"' is given, then also send the output from the command to the standard output. *See also:* *note unix: doc-unix, *note isunix: doc-isunix, *note ispc: doc-ispc, *note system: doc-system. -- Function File: [OUTPUT, STATUS] = perl (SCRIPTFILE) -- Function File: [OUTPUT, STATUS] = perl (SCRIPTFILE, ARGUMENT1, ARGUMENT2, ...) Invoke perl script SCRIPTFILE with possibly a list of command line arguments. Returns output in OUTPUT and status in STATUS. *See also:* *note system: doc-system. -- Built-in Function: FID = popen (COMMAND, MODE) Start a process and create a pipe. The name of the command to run is given by COMMAND. The file identifier corresponding to the input or output stream of the process is returned in FID. The argument MODE may be `"r"' The pipe will be connected to the standard output of the process, and open for reading. `"w"' The pipe will be connected to the standard input of the process, and open for writing. For example, fid = popen ("ls -ltr / | tail -3", "r"); while (ischar (s = fgets (fid))) fputs (stdout, s); endwhile -| drwxr-xr-x 33 root root 3072 Feb 15 13:28 etc -| drwxr-xr-x 3 root root 1024 Feb 15 13:28 lib -| drwxrwxrwt 15 root root 2048 Feb 17 14:53 tmp -- Built-in Function: pclose (FID) Close a file identifier that was opened by `popen'. You may also use `fclose' for the same purpose. -- Built-in Function: [IN, OUT, PID] = popen2 (COMMAND, ARGS) Start a subprocess with two-way communication. The name of the process is given by COMMAND, and ARGS is an array of strings containing options for the command. The file identifiers for the input and output streams of the subprocess are returned in IN and OUT. If execution of the command is successful, PID contains the process ID of the subprocess. Otherwise, PID is -1. For example, [in, out, pid] = popen2 ("sort", "-r"); fputs (in, "these\nare\nsome\nstrings\n"); fclose (in); EAGAIN = errno ("EAGAIN"); done = false; do s = fgets (out); if (ischar (s)) fputs (stdout, s); elseif (errno () == EAGAIN) sleep (0.1); fclear (out); else done = true; endif until (done) fclose (out); -| are -| some -| strings -| these -- Built-in Function: VAL = EXEC_PATH () -- Built-in Function: OLD_VAL = EXEC_PATH (NEW_VAL) Query or set the internal variable that specifies a colon separated list of directories to search when executing external programs. Its initial value is taken from the environment variable `OCTAVE_EXEC_PATH' (if it exists) or `PATH', but that value can be overridden by the command line argument `--exec-path PATH'. At startup, an additional set of directories (including the shell PATH) is appended to the path specified in the environment or on the command line. If you use the `EXEC_PATH' function to modify the path, you should take care to preserve these additional directories. In most cases, the following functions simply decode their arguments and make the corresponding Unix system calls. For a complete example of how they can be used, look at the definition of the function `popen2'. -- Built-in Function: [PID, MSG] = fork () Create a copy of the current process. Fork can return one of the following values: > 0 You are in the parent process. The value returned from `fork' is the process id of the child process. You should probably arrange to wait for any child processes to exit. 0 You are in the child process. You can call `exec' to start another process. If that fails, you should probably call `exit'. < 0 The call to `fork' failed for some reason. You must take evasive action. A system dependent error message will be waiting in MSG. -- Built-in Function: [ERR, MSG] = exec (FILE, ARGS) Replace current process with a new process. Calling `exec' without first calling `fork' will terminate your current Octave process and replace it with the program named by FILE. For example, exec ("ls" "-l") will run `ls' and return you to your shell prompt. If successful, `exec' does not return. If `exec' does return, ERR will be nonzero, and MSG will contain a system-dependent error message. -- Built-in Function: [READ_FD, WRITE_FD, ERR, MSG] = pipe () Create a pipe and return the reading and writing ends of the pipe into READ_FD and WRITE_FD respectively. If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. -- Built-in Function: [FID, MSG] = dup2 (OLD, NEW) Duplicate a file descriptor. If successful, FID is greater than zero and contains the new file ID. Otherwise, FID is negative and MSG contains a system-dependent error message. -- Built-in Function: [PID, STATUS, MSG] = waitpid (PID, OPTIONS) Wait for process PID to terminate. The PID argument can be: -1 Wait for any child process. 0 Wait for any child process whose process group ID is equal to that of the Octave interpreter process. > 0 Wait for termination of the child process with ID PID. The OPTIONS argument can be a bitwise OR of zero or more of the following constants: `0' Wait until signal is received or a child process exits (this is the default if the OPTIONS argument is missing). `WNOHANG' Do not hang if status is not immediately available. `WUNTRACED' Report the status of any child processes that are stopped, and whose status has not yet been reported since they stopped. `WCONTINUE' Return if a stopped child has been resumed by delivery of `SIGCONT'. This value may not be meaningful on all systems. If the returned value of PID is greater than 0, it is the process ID of the child process that exited. If an error occurs, PID will be less than zero and MSG will contain a system-dependent error message. The value of STATUS contains additional system-dependent information about the subprocess that exited. *See also:* *note WCONTINUE: doc-WCONTINUE, *note WCOREDUMP: doc-WCOREDUMP, *note WEXITSTATUS: doc-WEXITSTATUS, *note WIFCONTINUED: doc-WIFCONTINUED, *note WIFSIGNALED: doc-WIFSIGNALED, *note WIFSTOPPED: doc-WIFSTOPPED, *note WNOHANG: doc-WNOHANG, *note WSTOPSIG: doc-WSTOPSIG, *note WTERMSIG: doc-WTERMSIG, *note WUNTRACED: doc-WUNTRACED. -- Built-in Function: WCONINTUE () Return the numerical value of the option argument that may be passed to `waitpid' to indicate that it should also return if a stopped child has been resumed by delivery of a `SIGCONT' signal. *See also:* *note waitpid: doc-waitpid, *note WNOHANG: doc-WNOHANG, *note WUNTRACED: doc-WUNTRACED. -- Built-in Function: WCOREDUMP (STATUS) Given STATUS from a call to `waitpid', return true if the child produced a core dump. This function should only be employed if `WIFSIGNALED' returned true. The macro used to implement this function is not specified in POSIX.1-2001 and is not available on some Unix implementations (e.g., AIX, SunOS). *See also:* *note waitpid: doc-waitpid, *note WIFEXITED: doc-WIFEXITED, *note WEXITSTATUS: doc-WEXITSTATUS, *note WIFSIGNALED: doc-WIFSIGNALED, *note WTERMSIG: doc-WTERMSIG, *note WIFSTOPPED: doc-WIFSTOPPED, *note WSTOPSIG: doc-WSTOPSIG, *note WIFCONTINUED: doc-WIFCONTINUED. -- Built-in Function: WEXITSTATUS (STATUS) Given STATUS from a call to `waitpid', return the exit status of the child. This function should only be employed if `WIFEXITED' returned true. *See also:* *note waitpid: doc-waitpid, *note WIFEXITED: doc-WIFEXITED, *note WIFSIGNALED: doc-WIFSIGNALED, *note WTERMSIG: doc-WTERMSIG, *note WCOREDUMP: doc-WCOREDUMP, *note WIFSTOPPED: doc-WIFSTOPPED, *note WSTOPSIG: doc-WSTOPSIG, *note WIFCONTINUED: doc-WIFCONTINUED. -- Built-in Function: WIFCONTINUED (STATUS) Given STATUS from a call to `waitpid', return true if the child process was resumed by delivery of `SIGCONT'. *See also:* *note waitpid: doc-waitpid, *note WIFEXITED: doc-WIFEXITED, *note WEXITSTATUS: doc-WEXITSTATUS, *note WIFSIGNALED: doc-WIFSIGNALED, *note WTERMSIG: doc-WTERMSIG, *note WCOREDUMP: doc-WCOREDUMP, *note WIFSTOPPED: doc-WIFSTOPPED, *note WSTOPSIG: doc-WSTOPSIG. -- Built-in Function: WIFSIGNALED (STATUS) Given STATUS from a call to `waitpid', return true if the child process was terminated by a signal. *See also:* *note waitpid: doc-waitpid, *note WIFEXITED: doc-WIFEXITED, *note WEXITSTATUS: doc-WEXITSTATUS, *note WTERMSIG: doc-WTERMSIG, *note WCOREDUMP: doc-WCOREDUMP, *note WIFSTOPPED: doc-WIFSTOPPED, *note WSTOPSIG: doc-WSTOPSIG, *note WIFCONTINUED: doc-WIFCONTINUED. -- Built-in Function: WIFSTOPPED (STATUS) Given STATUS from a call to `waitpid', return true if the child process was stopped by delivery of a signal; this is only possible if the call was done using `WUNTRACED' or when the child is being traced (see ptrace(2)). *See also:* *note waitpid: doc-waitpid, *note WIFEXITED: doc-WIFEXITED, *note WEXITSTATUS: doc-WEXITSTATUS, *note WIFSIGNALED: doc-WIFSIGNALED, *note WTERMSIG: doc-WTERMSIG, *note WCOREDUMP: doc-WCOREDUMP, *note WSTOPSIG: doc-WSTOPSIG, *note WIFCONTINUED: doc-WIFCONTINUED. -- Built-in Function: WIFEXITED (STATUS) Given STATUS from a call to `waitpid', return true if the child terminated normally. *See also:* *note waitpid: doc-waitpid, *note WEXITSTATUS: doc-WEXITSTATUS, *note WIFSIGNALED: doc-WIFSIGNALED, *note WTERMSIG: doc-WTERMSIG, *note WCOREDUMP: doc-WCOREDUMP, *note WIFSTOPPED: doc-WIFSTOPPED, *note WSTOPSIG: doc-WSTOPSIG, *note WIFCONTINUED: doc-WIFCONTINUED. -- Built-in Function: WNOHANG () Return the numerical value of the option argument that may be passed to `waitpid' to indicate that it should return its status immediately instead of waiting for a process to exit. *See also:* *note waitpid: doc-waitpid, *note WUNTRACED: doc-WUNTRACED, *note WCONTINUE: doc-WCONTINUE. -- Built-in Function: WSTOPSIG (STATUS) Given STATUS from a call to `waitpid', return the number of the signal which caused the child to stop. This function should only be employed if `WIFSTOPPED' returned true. *See also:* *note waitpid: doc-waitpid, *note WIFEXITED: doc-WIFEXITED, *note WEXITSTATUS: doc-WEXITSTATUS, *note WIFSIGNALED: doc-WIFSIGNALED, *note WTERMSIG: doc-WTERMSIG, *note WCOREDUMP: doc-WCOREDUMP, *note WIFSTOPPED: doc-WIFSTOPPED, *note WIFCONTINUED: doc-WIFCONTINUED. -- Built-in Function: WTERMSIG (STATUS) Given STATUS from a call to `waitpid', return the number of the signal that caused the child process to terminate. This function should only be employed if `WIFSIGNALED' returned true. *See also:* *note waitpid: doc-waitpid, *note WIFEXITED: doc-WIFEXITED, *note WEXITSTATUS: doc-WEXITSTATUS, *note WIFSIGNALED: doc-WIFSIGNALED, *note WCOREDUMP: doc-WCOREDUMP, *note WIFSTOPPED: doc-WIFSTOPPED, *note WSTOPSIG: doc-WSTOPSIG, *note WIFCONTINUED: doc-WIFCONTINUED. -- Built-in Function: WUNTRACED () Return the numerical value of the option argument that may be passed to `waitpid' to indicate that it should also return if the child process has stopped but is not traced via the `ptrace' system call *See also:* *note waitpid: doc-waitpid, *note WNOHANG: doc-WNOHANG, *note WCONTINUE: doc-WCONTINUE. -- Built-in Function: [ERR, MSG] = fcntl (FID, REQUEST, ARG) Change the properties of the open file FID. The following values may be passed as REQUEST: `F_DUPFD' Return a duplicate file descriptor. `F_GETFD' Return the file descriptor flags for FID. `F_SETFD' Set the file descriptor flags for FID. `F_GETFL' Return the file status flags for FID. The following codes may be returned (some of the flags may be undefined on some systems). `O_RDONLY' Open for reading only. `O_WRONLY' Open for writing only. `O_RDWR' Open for reading and writing. `O_APPEND' Append on each write. `O_CREAT' Create the file if it does not exist. `O_NONBLOCK' Nonblocking mode. `O_SYNC' Wait for writes to complete. `O_ASYNC' Asynchronous I/O. `F_SETFL' Set the file status flags for FID to the value specified by ARG. The only flags that can be changed are `O_APPEND' and `O_NONBLOCK'. If successful, ERR is 0 and MSG is an empty string. Otherwise, ERR is nonzero and MSG contains a system-dependent error message. -- Built-in Function: [ERR, MSG] = kill (PID, SIG) Send signal SIG to process PID. If PID is positive, then signal SIG is sent to PID. If PID is 0, then signal SIG is sent to every process in the process group of the current process. If PID is -1, then signal SIG is sent to every process except process 1. If PID is less than -1, then signal SIG is sent to every process in the process group -PID. If SIG is 0, then no signal is sent, but error checking is still performed. Return 0 if successful, otherwise return -1. -- Built-in Function: SIG () Return a structure containing Unix signal names and their defined values. qtoctave-0.10.1/qtoctave-info-reader/test/octave.info-10000644000175000017500000111201111511434230021700 0ustar lucaslucasThis is octave.info, produced by makeinfo version 4.11 from ./octave.texi. START-INFO-DIR-ENTRY * Octave: (octave). Interactive language for numerical computations. END-INFO-DIR-ENTRY Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2005, 2006, 2007 John W. Eaton. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.  File: octave.info, Node: Top, Next: Preface, Up: (dir) GNU Octave ********** This manual documents how to run, install and port GNU Octave, as well as its new features and incompatibilities, and how to report bugs. It corresponds to GNU Octave version 3.2.0. * Menu: * Preface:: * Introduction:: A brief introduction to Octave. * Getting Started:: * Data Types:: * Numeric Data Types:: * Strings:: * Data Containers:: * Variables:: * Expressions:: * Evaluation:: * Statements:: Looping and program flow control. * Functions and Scripts:: * Errors and Warnings:: * Debugging:: * Input and Output:: * Plotting:: * Matrix Manipulation:: * Arithmetic:: * Linear Algebra:: * Nonlinear Equations:: * Diagonal and Permutation Matrices:: * Sparse Matrices:: * Numerical Integration:: * Differential Equations:: * Optimization:: * Statistics:: * Sets:: * Polynomial Manipulations:: * Interpolation:: * Geometry:: * Signal Processing:: * Image Processing:: * Audio Processing:: * Object Oriented Programming:: * System Utilities:: * Packages:: * Dynamically Linked Functions:: * Test and Demo Functions:: * Tips and Standards:: * Contributing Guidelines:: * Trouble:: If you have trouble installing Octave. * Installation:: How to configure, compile and install Octave. * Emacs Octave Support:: * Copying:: The GNU General Public License. * Concept Index:: An item for each concept. * Function Index:: An item for each documented function. * Operator Index:: An item for each documented operator. --- The Detailed Node Listing --- Preface * Acknowledgements:: * How You Can Contribute to Octave:: * Distribution:: Introduction * Running Octave:: * Simple Examples:: * Conventions:: Conventions * Fonts:: * Evaluation Notation:: * Printing Notation:: * Error Messages:: * Format of Descriptions:: Format of Descriptions * A Sample Function Description:: * A Sample Command Description:: * A Sample Variable Description:: Getting Started * Invoking Octave from the Command Line:: * Quitting Octave:: * Getting Help:: * Command Line Editing:: * Errors:: * Executable Octave Programs:: * Comments:: Invoking Octave from the Command Line * Command Line Options:: * Startup Files:: Command Line Editing * Cursor Motion:: * Killing and Yanking:: * Commands For Text:: * Commands For Completion:: * Commands For History:: * Customizing readline:: * Customizing the Prompt:: * Diary and Echo Commands:: Comments * Single Line Comments:: * Block Comments:: * Comments and the Help System:: Data Types * Built-in Data Types:: * User-defined Data Types:: * Object Sizes:: Built-in Data Types * Numeric Objects:: * Missing Data:: * String Objects:: * Data Structure Objects:: * Cell Array Objects:: Numeric Data Types * Matrices:: * Ranges:: * Single Precision Data Types:: * Integer Data Types:: * Bit Manipulations:: * Logical Values:: * Promotion and Demotion of Data Types:: * Predicates for Numeric Objects:: Matrices * Empty Matrices:: Integer Data Types * Integer Arithmetic:: Strings * Escape Sequences in string constants:: * Character Arrays:: * Creating Strings:: * Comparing Strings:: * Manipulating Strings:: * String Conversions:: * Character Class Functions:: Creating Strings * Concatenating Strings:: * Conversion of Numerical Data to Strings:: Data Containers * Data Structures:: * Cell Arrays:: * Comma Separated Lists:: Data Structures * Structure Arrays:: * Creating Structures:: * Manipulating Structures:: * Processing Data in Structures:: Cell Arrays * Creating Cell Arrays:: * Indexing Cell Arrays:: * Cell Arrays of Strings:: * Processing Data in Cell Arrays:: Variables * Global Variables:: * Persistent Variables:: * Status of Variables:: Expressions * Index Expressions:: * Calling Functions:: * Arithmetic Ops:: * Comparison Ops:: * Boolean Expressions:: * Assignment Ops:: * Increment Ops:: * Operator Precedence:: Calling Functions * Call by Value:: * Recursion:: Boolean Expressions * Element-by-element Boolean Operators:: * Short-circuit Boolean Operators:: Evaluation * Calling a Function by its Name:: * Evaluation in a Different Context:: Statements * The `if' Statement:: * The `switch' Statement:: * The `while' Statement:: * The `do-until' Statement:: * The `for' Statement:: * The `break' Statement:: * The `continue' Statement:: * The `unwind_protect' Statement:: * The `try' Statement:: * Continuation Lines:: The `switch' Statement * Notes for the C programmer:: The `for' Statement * Looping Over Structure Elements:: Functions and Scripts * Defining Functions:: * Multiple Return Values:: * Variable-length Argument Lists:: * Variable-length Return Lists:: * Returning From a Function:: * Default Arguments:: * Function Files:: * Script Files:: * Function Handles Inline Functions and Anonymous Functions:: * Commands:: * Organization of Functions:: Function Files * Manipulating the load path:: * Subfunctions:: * Private Functions:: * Overloading and Autoloading:: * Function Locking:: * Function Precedence:: Function Handles Inline Functions and Anonymous Functions * Function Handles:: * Anonymous Functions:: * Inline Functions:: Errors and Warnings * Handling Errors:: * Handling Warnings:: Handling Errors * Raising Errors:: * Catching Errors:: Handling Warnings * Issuing Warnings:: * Enabling and Disabling Warnings:: Debugging * Entering Debug Mode:: * Leaving Debug Mode:: * Breakpoints:: * Debug Mode:: * Call Stack:: Input and Output * Basic Input and Output:: * C-Style I/O Functions:: Basic Input and Output * Terminal Output:: * Terminal Input:: * Simple File I/O:: * Rational Approximations:: Terminal Output * Paging Screen Output:: Simple File I/O * Saving Data on Unexpected Exits:: C-Style I/O Functions * Opening and Closing Files:: * Simple Output:: * Line-Oriented Input:: * Formatted Output:: * Output Conversion for Matrices:: * Output Conversion Syntax:: * Table of Output Conversions:: * Integer Conversions:: * Floating-Point Conversions:: * Other Output Conversions:: * Formatted Input:: * Input Conversion Syntax:: * Table of Input Conversions:: * Numeric Input Conversions:: * String Input Conversions:: * Binary I/O:: * Temporary Files:: * EOF and Errors:: * File Positioning:: Plotting * Plotting Basics:: * Advanced Plotting:: Plotting Basics * Two-Dimensional Plots:: * Three-Dimensional Plotting:: * Plot Annotations:: * Multiple Plots on One Page:: * Multiple Plot Windows:: * Printing Plots:: * Interacting with plots:: * Test Plotting Functions:: Two-Dimensional Plots * Two-dimensional Function Plotting:: Three-Dimensional Plotting * Three-dimensional Function Plotting:: * Three-dimensional Geometric Shapes:: Advanced Plotting * Graphics Objects:: * Graphics Object Properties:: * Managing Default Properties:: * Colors:: * Line Styles:: * Marker Styles:: * Callbacks:: * Object Groups:: * Graphics backends:: Graphics Object Properties * Root Figure Properties:: * Figure Properties:: * Axes Properties:: * Line Properties:: * Text Properties:: * Image Properties:: * Patch Properties:: * Surface Properties:: * Searching Properties:: Object Groups * Data sources in object groups:: * Area series:: * Bar series:: * Contour groups:: * Error bar series:: * Line series:: * Quiver group:: * Scatter group:: * Stair group:: * Stem Series:: * Surface group:: Graphics backends * Interaction with gnuplot:: Matrix Manipulation * Finding Elements and Checking Conditions:: * Rearranging Matrices:: * Applying a Function to an Array:: * Special Utility Matrices:: * Famous Matrices:: Arithmetic * Exponents and Logarithms:: * Complex Arithmetic:: * Trigonometry:: * Sums and Products:: * Utility Functions:: * Special Functions:: * Coordinate Transformations:: * Mathematical Constants:: Linear Algebra * Techniques used for Linear Algebra:: * Basic Matrix Functions:: * Matrix Factorizations:: * Functions of a Matrix:: * Specialized Solvers:: Diagonal and Permutation Matrices * Basic Usage:: Creation and Manipulation of Diagonal and Permutation Matrices * Matrix Algebra:: Linear Algebra with Diagonal and Permutation Matrices * Function Support:: Functions That Are Aware of These Matrices * Example Codes:: Some Examples of Usage * Zeros Treatment:: The Differences in Treatment of Zero Elements Basic Usage * Creating Diagonal Matrices:: * Creating Permutation Matrices:: * Explicit and Implicit Conversions:: Matrix Algebra * Expressions Involving Diagonal Matrices:: * Expressions Involving Permutation Matrices:: Function Support * Diagonal Matrix Functions:: * Permutation Matrix Functions:: Sparse Matrices * Basics:: Creation and Manipulation of Sparse Matrices * Sparse Linear Algebra:: Linear Algebra on Sparse Matrices * Iterative Techniques:: Iterative Techniques * Real Life Example:: Using Sparse Matrices Basics * Storage of Sparse Matrices:: * Creating Sparse Matrices:: * Information:: * Operators and Functions:: Operators and Functions * Sparse Functions:: * Return Types of Operators and Functions:: * Mathematical Considerations:: Numerical Integration * Functions of One Variable:: * Functions of Multiple Variables:: * Orthogonal Collocation:: Differential Equations * Ordinary Differential Equations:: * Differential-Algebraic Equations:: Optimization * Linear Programming:: * Quadratic Programming:: * Nonlinear Programming:: * Linear Least Squares:: Statistics * Descriptive Statistics:: * Basic Statistical Functions:: * Statistical Plots:: * Tests:: * Models:: * Distributions:: * Random Number Generation:: Sets * Set Operations:: Polynomial Manipulations * Evaluating Polynomials:: * Finding Roots:: * Products of Polynomials:: * Derivatives and Integrals:: * Polynomial Interpolation:: * Miscellaneous Functions:: Interpolation * One-dimensional Interpolation:: * Multi-dimensional Interpolation:: Geometry * Delaunay Triangulation:: * Voronoi Diagrams:: * Convex Hull:: * Interpolation on Scattered Data:: Delaunay Triangulation * Plotting the Triangulation:: * Identifying points in Triangulation:: Image Processing * Loading and Saving Images:: * Displaying Images:: * Representing Images:: * Plotting on top of Images:: * Color Conversion:: Object Oriented Programming * Creating a Class:: * Manipulating Classes:: * Indexing Objects:: * Overloading Objects:: Overloading Objects * Function Overloading:: * Operator Overloading:: * Precedence of Objects:: System Utilities * Timing Utilities:: * Filesystem Utilities:: * File Archiving Utilities:: * Networking Utilities:: * Controlling Subprocesses:: * Process ID Information:: * Environment Variables:: * Current Working Directory:: * Password Database Functions:: * Group Database Functions:: * System Information:: * Hashing Functions:: Packages * Installing and Removing Packages:: * Using Packages:: * Administrating Packages:: * Creating Packages:: Creating Packages * The DESCRIPTION File:: * The INDEX file:: * PKG_ADD and PKG_DEL directives:: Dynamically Linked Functions * Oct-Files:: * Mex-Files:: * Standalone Programs:: Oct-Files * Getting Started with Oct-Files:: * Matrices and Arrays in Oct-Files:: * Character Strings in Oct-Files:: * Cell Arrays in Oct-Files:: * Structures in Oct-Files:: * Sparse Matrices in Oct-Files:: * Accessing Global Variables in Oct-Files:: * Calling Octave Functions from Oct-Files:: * Calling External Code from Oct-Files:: * Allocating Local Memory in Oct-Files:: * Input Parameter Checking in Oct-Files:: * Exception and Error Handling in Oct-Files:: * Documentation and Test of Oct-Files:: Sparse Matrices in Oct-Files * Array and Sparse Differences:: * Creating Sparse Matrices in Oct-Files:: * Using Sparse Matrices in Oct-Files:: Mex-Files * Getting Started with Mex-Files:: * Working with Matrices and Arrays in Mex-Files:: * Character Strings in Mex-Files:: * Cell Arrays with Mex-Files:: * Structures with Mex-Files:: * Sparse Matrices with Mex-Files:: * Calling Other Functions in Mex-Files:: Test and Demo Functions * Test Functions:: * Demonstration Functions:: Tips and Standards * Style Tips:: Writing clean and robust programs. * Coding Tips:: Making code run faster. * Comment Tips:: Conventions for writing comments. * Function Headers:: Standard headers for functions. * Documentation Tips:: Writing readable documentation strings. Contributing Guidelines * How to Contribute:: * General Guidelines:: * Octave Sources (m-files):: * C++ Sources:: * Other Sources:: Trouble * Actual Bugs:: Bugs we will fix later. * Reporting Bugs:: * Bug Criteria:: * Bug Lists:: * Bug Reporting:: * Sending Patches:: * Service:: Reporting Bugs * Bug Criteria:: * Where: Bug Lists. Where to send your bug report. * Reporting: Bug Reporting. How to report a bug effectively. * Patches: Sending Patches. How to send a patch for Octave. Installation * Installation Problems:: Emacs Octave Support * Installing EOS:: * Using Octave Mode:: * Running Octave From Within Emacs:: * Using the Emacs Info Reader for Octave::  File: octave.info, Node: Preface, Next: Introduction, Prev: Top, Up: Top Preface ******* Octave was originally intended to be companion software for an undergraduate-level textbook on chemical reactor design being written by James B. Rawlings of the University of Wisconsin-Madison and John G. Ekerdt of the University of Texas. Clearly, Octave is now much more than just another `courseware' package with limited utility beyond the classroom. Although our initial goals were somewhat vague, we knew that we wanted to create something that would enable students to solve realistic problems, and that they could use for many things other than chemical reactor design problems. There are those who would say that we should be teaching the students Fortran instead, because that is the computer language of engineering, but every time we have tried that, the students have spent far too much time trying to figure out why their Fortran code crashes and not enough time learning about chemical engineering. With Octave, most students pick up the basics quickly, and are using it confidently in just a few hours. Although it was originally intended to be used to teach reactor design, it has been used in several other undergraduate and graduate courses in the Chemical Engineering Department at the University of Texas, and the math department at the University of Texas has been using it for teaching differential equations and linear algebra as well. If you find it useful, please let us know. We are always interested to find out how Octave is being used in other places. Virtually everyone thinks that the name Octave has something to do with music, but it is actually the name of a former professor of mine who wrote a famous textbook on chemical reaction engineering, and who was also well known for his ability to do quick `back of the envelope' calculations. We hope that this software will make it possible for many people to do more ambitious computations just as easily. Everyone is encouraged to share this software with others under the terms of the GNU General Public License (*note Copying::). You are also encouraged to help make Octave more useful by writing and contributing additional functions for it, and by reporting any problems you may have. * Menu: * Acknowledgements:: * How You Can Contribute to Octave:: * Distribution::  File: octave.info, Node: Acknowledgements, Next: How You Can Contribute to Octave, Up: Preface Acknowledgements ================ Many people have already contributed to Octave's development. The following people have helped code parts of Octave or aided in various other ways (listed alphabetically). Ben Abbott Andy Adler Joel Andersson Muthiah Annamalai Shai Ayal Roger Banks Ben Barrowes Alexander Barth David Bateman Heinz Bauschke Karl Berry David Billinghurst Don Bindner Jakub Bogusz Moritz Borgmann Richard Bovey Marcus Brinkmann Remy Bruno Marco Caliari Daniel Calvelo John C. Campbell Jean-Francois Cardoso Joao Cardoso Larrie Carr David Castelow Vincent Cautaerts Clinton Chee Albert Chin-A-Young Carsten Clark J. D. Cole Martin Costabel Michael Creel Jeff Cunningham Martin Dalecki Jorge Barros de Abreu Carlo de Falco Thomas D. Dean Philippe Defert Bill Denney David M. Doolin Pascal A. Dupuis John W. Eaton Dirk Eddelbuettel Paul Eggert Stephen Eglen Peter Ekberg Rolf Fabian Stephen Fegan Ramon Garcia Fernandez Torsten Finke Jose Daniel Munoz Frias Castor Fu Eduardo Gallestey Walter Gautschi Klaus Gebhardt Driss Ghaddab Nicolo Giorgetti Michael Goffioul Glenn Golden Tomislav Goles Keith Goodman Brian Gough Steffen Groot Etienne Grossmann Peter Gustafson Kai Habel William P. Y. Jaroslav Hajek Benjamin Hall Hadisoeseno Kim Hansen Soren Hauberg Dave Hawthorne Daniel Heiserer Martin Helm Yozo Hida Ryan Hinton Roman Hodek A. Scottedward Hodel Richard Allan Holcombe Tom Holroyd David Hoover Kurt Hornik Christopher Hulbert Cyril Humbert Teemu Ikonen Alan W. Irwin Geoff Jacobsen Mats Jansson Cai Jianming Steven G. Johnson Heikki Junes Atsushi Kajita Jarkko Kaleva Mohamed Kamoun Lute Kamstra Thomas Kasper Joel Keay Mumit Khan Paul Kienzle Aaron A. King Arno J. Klaassen Geoffrey Knauth Heine Kolltveit Ken Kouno Oyvind Kristiansen Piotr Krzyzanowski Volker Kuhlmann Tetsuro Kurita Miroslaw Kwasniak Rafael Laboissiere Kai Labusch Claude Lacoursiere Walter Landry Bill Lash Dirk Laurie Maurice LeBrun Friedrich Leisch Timo Lindfors Benjamin Lindner Ross Lippert David Livings Erik de Castro Lopo Massimo Lorenzin Emil Lucretiu Hoxide Ma James Macnicol Jens-Uwe Mager Ricardo Marranita Orestes Mas Makoto Matsumoto Tatsuro Matsuoka Laurent Mazet G. D. McBain Christoph Mayer Thorsten Meyer Petr Mikulik Stefan Monnier Antoine Moreau Kai P. Mueller Victor Munoz Carmen Navarrete Todd Neal Al Niessner Rick Niles Takuji Nishimura Eric Norum Krzesimir Nowak Michael O'Brien Peter O'Gorman Thorsten Ohl Arno Onken Luis F. Ortiz Scott Pakin Gabriele Pannocchia Sylvain Pelissier Per Persson Primozz Peterlin Jim Peterson Danilo Piazzalunga Nicholas Piper Robert Platt Hans Ekkehard Plesser Tom Poage Orion Poplawski Ondrej Popp Jef Poskanzer Francesco Potorti James B. Rawlings Eric S. Raymond Balint Reczey Michael Reifenberger Jason Riedy Petter Risholm Matthew W. Roberts Andrew Ross Mark van Rossum Kevin Ruland Ryan Rusaw Olli Saarela Toni Saarela Juhani Saastamoinen Radek Salac Ben Sapp Alois Schloegl Michel D. Schmid Julian Schnidder Nicol N. Schraudolph Sebastian Schubert Ludwig Schwardt Thomas L. Scofield Daniel J. Sebald Dmitri A. Sergatskov Baylis Shanks Joseph P. Skudlarek John Smith Julius Smith Shan G. Smith Joerg Specht Quentin H. Spencer Christoph Spiel Richard Stallman Russell Standish Doug Stewart Jonathan Stickel Thomas Stuart Ivan Sutoris John Swensen Ariel Tankus Georg Thimm Duncan Temple Lang Kris Thielemans Olaf Till Thomas Treichl Frederick Umminger Utkarsh Upadhyay Stefan van der Walt Peter Van Wieren James R. Van Zandt Gregory Vanuxem Ivana Varekova Thomas Walter Olaf Weber Thomas Weber Rik Wehbring Bob Weigel Andreas Weingessel Michael Weitzel Fook Fah Yap Michael Zeising Federico Zenith Alex Zvoleff Special thanks to the following people and organizations for supporting the development of Octave: * The United States Department of Energy, through grant number DE-FG02-04ER25635. * Ashok Krishnamurthy, David Hudak, Juan Carlos Chaves, and Stanley C. Ahalt of the Ohio Supercomputer Center. * The National Science Foundation, through grant numbers CTS-0105360, CTS-9708497, CTS-9311420, CTS-8957123, and CNS-0540147. * The industrial members of the Texas-Wisconsin Modeling and Control Consortium (TWMCC (http://www.che.utexas.edu/twmcc)). * The Paul A. Elfers Endowed Chair in Chemical Engineering at the University of Wisconsin-Madison. * Digital Equipment Corporation, for an equipment grant as part of their External Research Program. * Sun Microsystems, Inc., for an Academic Equipment grant. * International Business Machines, Inc., for providing equipment as part of a grant to the University of Texas College of Engineering. * Texaco Chemical Company, for providing funding to continue the development of this software. * The University of Texas College of Engineering, for providing a Challenge for Excellence Research Supplement, and for providing an Academic Development Funds grant. * The State of Texas, for providing funding through the Texas Advanced Technology Program under Grant No. 003658-078. * Noel Bell, Senior Engineer, Texaco Chemical Company, Austin Texas. * John A. Turner, Group Leader, Continuum Dynamics (CCS-2), Los Alamos National Laboratory, for registering the `octave.org' domain name. * James B. Rawlings, Professor, University of Wisconsin-Madison, Department of Chemical and Biological Engineering. * Richard Stallman, for writing GNU. This project would not have been possible without the GNU software used in and to produce Octave.  File: octave.info, Node: How You Can Contribute to Octave, Next: Distribution, Prev: Acknowledgements, Up: Preface How You Can Contribute to Octave ================================ There are a number of ways that you can contribute to help make Octave a better system. Perhaps the most important way to contribute is to write high-quality code for solving new problems, and to make your code freely available for others to use. *Note Contributing Guidelines::, for detailed information on contributing new code. If you find Octave useful, consider providing additional funding to continue its development. Even a modest amount of additional funding could make a significant difference in the amount of time that is available for development and support. If you cannot provide funding or contribute code, you can still help make Octave better and more reliable by reporting any bugs you find and by offering suggestions for ways to improve Octave. *Note Trouble::, for tips on how to write useful bug reports.  File: octave.info, Node: Distribution, Prev: How You Can Contribute to Octave, Up: Preface Distribution ============ Octave is "free" software. This means that everyone is free to use it and free to redistribute it on certain conditions. Octave is not, however, in the public domain. It is copyrighted and there are restrictions on its distribution, but the restrictions are designed to ensure that others will have the same freedom to use and redistribute Octave that you have. The precise conditions can be found in the GNU General Public License that comes with Octave and that also appears in *note Copying::. Octave is available on CD-ROM, with various collections of other free software, from the Free Software Foundation. Ordering a copy of Octave from the Free Software Foundation helps to fund the development of more free software. For more information, write to Free Software Foundation 51 Franklin Street, Fifth Floor Boston, MA 02110-1301-1307 USA Octave can also be downloaded from `http://www.octave.org', where additional information is available.  File: octave.info, Node: Introduction, Next: Getting Started, Prev: Preface, Up: Top 1 A Brief Introduction to Octave ******************************** GNU Octave is a high-level language, primarily intended for numerical computations. It provides a convenient interactive command line interface for solving linear and nonlinear problems numerically, and for performing other numerical experiments. It may also be used as a batch-oriented language for data processing. GNU Octave is freely redistributable software. You may redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. The GPL is included in this manual in *note Copying::. This manual provides comprehensive documentation on how to install, run, use, and extend GNU Octave. Additional chapters describe how to report bugs and help contribute code. This document corresponds to Octave version 3.2.0. * Menu: * Running Octave:: * Simple Examples:: * Conventions::  File: octave.info, Node: Running Octave, Next: Simple Examples, Up: Introduction 1.1 Running Octave ================== On most systems, Octave is started with the shell command `octave'. Octave displays an initial message and then a prompt indicating it is ready to accept input. You can begin typing Octave commands immediately afterward. If you get into trouble, you can usually interrupt Octave by typing `Control-C' (written `C-c' for short). `C-c' gets its name from the fact that you type it by holding down and then pressing . Doing this will normally return you to Octave's prompt. To exit Octave, type `quit', or `exit' at the Octave prompt. On systems that support job control, you can suspend Octave by sending it a `SIGTSTP' signal, usually by typing `C-z'.  File: octave.info, Node: Simple Examples, Next: Conventions, Prev: Running Octave, Up: Introduction 1.2 Simple Examples =================== The following chapters describe all of Octave's features in detail, but before doing that, it might be helpful to give a sampling of some of its capabilities. If you are new to Octave, I recommend that you try these examples to begin learning Octave by using it. Lines marked with `octave:13>' are lines you type, ending each with a carriage return. Octave will respond with an answer, or by displaying a graph. 1.2.1 Elementary Calculations ----------------------------- Octave can easily be used for basic numerical calculations. Octave knows about arithmetic operations (+,-,*,/), exponentiation (^), natural logarithms/exponents (log, exp), and the trigonometric functions (sin, cos, ...). Moreover, Octave calculations work on real or imaginary numbers (i,j). In addition, some mathematical constants such as the base of the natural logarithm (e) and the ratio of a circle's circumference to its diameter (pi) are pre-defined. For example, to verify Euler's Identity, i*pi e = -1 type the following which will evaluate to `-1' within the tolerance of the calculation. octave:1> exp(i*pi) 1.2.2 Creating a Matrix ----------------------- Vectors and matrices are the basic building blocks for numerical analysis. To create a new matrix and store it in a variable so that you can refer to it later, type the command octave:1> A = [ 1, 1, 2; 3, 5, 8; 13, 21, 34 ] Octave will respond by printing the matrix in neatly aligned columns. Octave uses a comma or space to separate entries in a row, and a semicolon or carriage return to separate one row from the next. Ending a command with a semicolon tells Octave not to print the result of the command. For example, octave:2> B = rand (3, 2); will create a 3 row, 2 column matrix with each element set to a random value between zero and one. To display the value of a variable, simply type the name of the variable at the prompt. For example, to display the value stored in the matrix `B', type the command octave:3> B 1.2.3 Matrix Arithmetic ----------------------- Octave has a convenient operator notation for performing matrix arithmetic. For example, to multiply the matrix `A' by a scalar value, type the command octave:4> 2 * A To multiply the two matrices `A' and `B', type the command octave:5> A * B and to form the matrix product `transpose (A) * A', type the command octave:6> A' * A 1.2.4 Solving Systems of Linear Equations ----------------------------------------- Systems of linear equations are ubiquitous in numerical analysis. To solve the set of linear equations `AX = b', use the left division operator, `\': X = A \ b This is conceptually equivalent to `inv (a) * b', but avoids computing the inverse of a matrix directly. If the coefficient matrix is singular, Octave will print a warning message and compute a minimum norm solution. A simple example comes from chemistry and the need to obtain balanced chemical equations. Consider the burning of hydrogen and oxygen to produce water. H2 + O2 --> H2O The equation above is not accurate. The Law of Conservation of Mass requires that the number of molecules of each type balance on the left- and right-hand sides of the equation. Writing the variable overall reaction with individual equations for hydrogen and oxygen one finds: x1*H2 + x2*O2 --> H2O H: 2*x1 + 0*x2 --> 2 O: 0*x1 + 2*x2 --> 1 The solution in Octave is found in just three steps. octave:1> A = [ 2, 0; 0, 2 ]; octave:2> b = [ 2; 1 ]; octave:3> x = A \ b 1.2.5 Integrating Differential Equations ---------------------------------------- Octave has built-in functions for solving nonlinear differential equations of the form dx -- = f (x, t) dt with the initial condition x(t = t0) = x0 For Octave to integrate equations of this form, you must first provide a definition of the function `f(x,t)'. This is straightforward, and may be accomplished by entering the function body directly on the command line. For example, the following commands define the right-hand side function for an interesting pair of nonlinear differential equations. Note that while you are entering a function, Octave responds with a different prompt, to indicate that it is waiting for you to complete your input. octave:1> function xdot = f (x, t) > > r = 0.25; > k = 1.4; > a = 1.5; > b = 0.16; > c = 0.9; > d = 0.8; > > xdot(1) = r*x(1)*(1 - x(1)/k) - a*x(1)*x(2)/(1 + b*x(1)); > xdot(2) = c*a*x(1)*x(2)/(1 + b*x(1)) - d*x(2); > > endfunction Given the initial condition octave:2> x0 = [1; 2]; and the set of output times as a column vector (note that the first output time corresponds to the initial condition given above) octave:3> t = linspace (0, 50, 200)'; it is easy to integrate the set of differential equations: octave:4> x = lsode ("f", x0, t); The function `lsode' uses the Livermore Solver for Ordinary Differential Equations, described in A. C. Hindmarsh, `ODEPACK, a Systematized Collection of ODE Solvers', in: Scientific Computing, R. S. Stepleman et al. (Eds.), North-Holland, Amsterdam, 1983, pages 55-64. 1.2.6 Producing Graphical Output -------------------------------- To display the solution of the previous example graphically, use the command octave:1> plot (t, x) If you are using a graphical user interface, Octave will automatically create a separate window to display the plot. To save a plot once it has been displayed on the screen, use the print command. For example, print -deps foo.eps will create a file called `foo.eps' that contains a rendering of the current plot in Encapsulated PostScript format. The command help print explains more options for the `print' command and provides a list of additional output file formats. 1.2.7 Editing What You Have Typed --------------------------------- At the Octave prompt, you can recall, edit, and reissue previous commands using Emacs- or vi-style editing commands. The default keybindings use Emacs-style commands. For example, to recall the previous command, press `Control-p' (written `C-p' for short). Doing this will normally bring back the previous line of input. `C-n' will bring up the next line of input, `C-b' will move the cursor backward on the line, `C-f' will move the cursor forward on the line, etc. A complete description of the command line editing capability is given in this manual in *note Command Line Editing::. 1.2.8 Help and Documentation ---------------------------- Octave has an extensive help facility. The same documentation that is available in printed form is also available from the Octave prompt, because both forms of the documentation are created from the same input file. In order to get good help you first need to know the name of the command that you want to use. This name of the function may not always be obvious, but a good place to start is to just type `help'. This will show you all the operators, reserved words, functions, built-in variables, and function files. An alternative is to search the documentation using the `lookfor' function. This function is described in *note Getting Help::. Once you know the name of the function you wish to use, you can get more help on the function by simply including the name as an argument to help. For example, help plot will display the help text for the `plot' function. Octave sends output that is too long to fit on one screen through a pager like `less' or `more'. Type a to advance one line, a to advance one page, and to exit the pager. The part of Octave's help facility that allows you to read the complete text of the printed manual from within Octave normally uses a separate program called Info. When you invoke Info you will be put into a menu driven program that contains the entire Octave manual. Help for using Info is provided in this manual in *note Getting Help::.  File: octave.info, Node: Conventions, Prev: Simple Examples, Up: Introduction 1.3 Conventions =============== This section explains the notational conventions that are used in this manual. You may want to skip this section and refer back to it later. * Menu: * Fonts:: * Evaluation Notation:: * Printing Notation:: * Error Messages:: * Format of Descriptions::  File: octave.info, Node: Fonts, Next: Evaluation Notation, Up: Conventions 1.3.1 Fonts ----------- Examples of Octave code appear in this font or form: `svd (a)'. Names that represent variables or function arguments appear in this font or form: FIRST-NUMBER. Commands that you type at the shell prompt appear in this font or form: `octave --no-init-file'. Commands that you type at the Octave prompt sometimes appear in this font or form: `foo --bar --baz'. Specific keys on your keyboard appear in this font or form: .  File: octave.info, Node: Evaluation Notation, Next: Printing Notation, Prev: Fonts, Up: Conventions 1.3.2 Evaluation Notation ------------------------- In the examples in this manual, results from expressions that you evaluate are indicated with `=>'. For example, sqrt (2) => 1.4142 You can read this as "`sqrt (2)' evaluates to 1.4142". In some cases, matrix values that are returned by expressions are displayed like this [1, 2; 3, 4] == [1, 3; 2, 4] => [ 1, 0; 0, 1 ] and in other cases, they are displayed like this eye (3) => 1 0 0 0 1 0 0 0 1 in order to clearly show the structure of the result. Sometimes to help describe one expression, another expression is shown that produces identical results. The exact equivalence of expressions is indicated with `=='. For example, rot90 ([1, 2; 3, 4], -1) == rot90 ([1, 2; 3, 4], 3) == rot90 ([1, 2; 3, 4], 7)  File: octave.info, Node: Printing Notation, Next: Error Messages, Prev: Evaluation Notation, Up: Conventions 1.3.3 Printing Notation ----------------------- Many of the examples in this manual print text when they are evaluated. In this manual the printed text resulting from an example is indicated by `-|'. The value that is returned by evaluating the expression is displayed with `=>' (`1' in the next example) and follows on a separate line. printf ("foo %s\n", "bar") -| foo bar => 1  File: octave.info, Node: Error Messages, Next: Format of Descriptions, Prev: Printing Notation, Up: Conventions 1.3.4 Error Messages -------------------- Some examples signal errors. This normally displays an error message on your terminal. Error messages are shown on a line beginning with `error:'. fieldnames ([1, 2; 3, 4]) error: fieldnames: wrong type argument `matrix'  File: octave.info, Node: Format of Descriptions, Prev: Error Messages, Up: Conventions 1.3.5 Format of Descriptions ---------------------------- Functions, commands, and variables are described in this manual in a uniform format. The first line of a description contains the name of the item followed by its arguments, if any. The category--function, variable, or whatever--appears at the beginning of the line. The description follows on succeeding lines, sometimes with examples. * Menu: * A Sample Function Description:: * A Sample Command Description:: * A Sample Variable Description::  File: octave.info, Node: A Sample Function Description, Next: A Sample Command Description, Up: Format of Descriptions 1.3.5.1 A Sample Function Description ..................................... In a function description, the name of the function being described appears first. It is followed on the same line by a list of parameters. The names used for the parameters are also used in the body of the description. Here is a description of an imaginary function `foo': -- Function: foo (X, Y, ...) The function `foo' subtracts X from Y, then adds the remaining arguments to the result. If Y is not supplied, then the number 19 is used by default. foo (1, [3, 5], 3, 9) => [ 14, 16 ] foo (5) => 14 More generally, foo (W, X, Y, ...) == X - W + Y + ... Any parameter whose name contains the name of a type (e.g., INTEGER or MATRIX) is expected to be of that type. Parameters named OBJECT may be of any type. Parameters with other sorts of names (e.g., NEW_FILE) are discussed specifically in the description of the function. In some sections, features common to parameters of several functions are described at the beginning. Functions in Octave may be defined in several different ways. The category name for functions may include another name that indicates the way that the function is defined. These additional tags include Function File The function described is defined using Octave commands stored in a text file. *Note Function Files::. Built-in Function The function described is written in a language like C++, C, or Fortran, and is part of the compiled Octave binary. Loadable Function The function described is written in a language like C++, C, or Fortran. On systems that support dynamic linking of user-supplied functions, it may be automatically linked while Octave is running, but only if it is needed. *Note Dynamically Linked Functions::. Mapping Function The function described works element-by-element for matrix and vector arguments.  File: octave.info, Node: A Sample Command Description, Next: A Sample Variable Description, Prev: A Sample Function Description, Up: Format of Descriptions 1.3.5.2 A Sample Command Description .................................... Command descriptions have a format similar to function descriptions, except that the word `Function' is replaced by `Command'. Commands are functions that may be called without surrounding their arguments in parentheses. For example, here is the description for Octave's `cd' command: -- Command: cd dir -- Command: chdir dir Change the current working directory to DIR. For example, `cd ~/octave' changes the current working directory to `~/octave'. If the directory does not exist, an error message is printed and the working directory is not changed.  File: octave.info, Node: A Sample Variable Description, Prev: A Sample Command Description, Up: Format of Descriptions 1.3.5.3 A Sample Variable Description ..................................... A "variable" is a name that can hold a value. Although any variable can be set by the user, "built-in variables" typically exist specifically so that users can change them to alter the way Octave behaves (built-in variables are also sometimes called "user options"). Ordinary variables and built-in variables are described using a format like that for functions except that there are no arguments. Here is a description of the imaginary variable `do_what_i_mean_not_what_i_say'. -- Built-in Variable: do_what_i_mean_not_what_i_say If the value of this variable is nonzero, Octave will do what you actually wanted, even if you have typed a completely different and meaningless list of commands. Other variable descriptions have the same format, but `Built-in Variable' is replaced by `Variable', for ordinary variables, or `Constant' for symbolic constants whose values cannot be changed.  File: octave.info, Node: Getting Started, Next: Data Types, Prev: Introduction, Up: Top 2 Getting Started ***************** This chapter explains some of Octave's basic features, including how to start an Octave session, get help at the command prompt, edit the command line, and write Octave programs that can be executed as commands from your shell. * Menu: * Invoking Octave from the Command Line:: * Quitting Octave:: * Getting Help:: * Command Line Editing:: * Errors:: * Executable Octave Programs:: * Comments::  File: octave.info, Node: Invoking Octave from the Command Line, Next: Quitting Octave, Up: Getting Started 2.1 Invoking Octave from the Command Line ========================================= Normally, Octave is used interactively by running the program `octave' without any arguments. Once started, Octave reads commands from the terminal until you tell it to exit. You can also specify the name of a file on the command line, and Octave will read and execute the commands from the named file and then exit when it is finished. You can further control how Octave starts by using the command-line options described in the next section, and Octave itself can remind you of the options available. Type `octave --help' to display all available options and briefly describe their use (`octave -h' is a shorter equivalent). * Menu: * Command Line Options:: * Startup Files::  File: octave.info, Node: Command Line Options, Next: Startup Files, Up: Invoking Octave from the Command Line 2.1.1 Command Line Options -------------------------- Here is a complete list of the command line options that Octave accepts. `--debug' `-d' Enter parser debugging mode. Using this option will cause Octave's parser to print a lot of information about the commands it reads, and is probably only useful if you are actually trying to debug the parser. `--doc-cache-file FILENAME' Specify the name of the doc cache file to use. The value of FILENAME specified on the command line will override any value of `OCTAVE_DOC_CACHE_FILE' found in the environment, but not any commands in the system or user startup files that use the `doc_cache_file' function. `--echo-commands' `-x' Echo commands as they are executed. `--eval CODE' Evaluate CODE and exit when finished unless `--persist' is also specified. `--exec-path PATH' Specify the path to search for programs to run. The value of PATH specified on the command line will override any value of `OCTAVE_EXEC_PATH' found in the environment, but not any commands in the system or user startup files that set the built-in variable `EXEC_PATH'. `--help' `-h' `-?' Print short help message and exit. `--image-path PATH' Add path to the head of the search path for images. The value of PATH specified on the command line will override any value of `OCTAVE_IMAGE_PATH' found in the environment, but not any commands in the system or user startup files that set the built-in variable `IMAGE_PATH'. `--info-file FILENAME' Specify the name of the info file to use. The value of FILENAME specified on the command line will override any value of `OCTAVE_INFO_FILE' found in the environment, but not any commands in the system or user startup files that use the `info_file' function. `--info-program PROGRAM' Specify the name of the info program to use. The value of PROGRAM specified on the command line will override any value of `OCTAVE_INFO_PROGRAM' found in the environment, but not any commands in the system or user startup files that use the `info_program' function. `--interactive' `-i' Force interactive behavior. This can be useful for running Octave via a remote shell command or inside an Emacs shell buffer. For another way to run Octave within Emacs, see *note Emacs Octave Support::. `--line-editing' Force readline use for command-line editing. `--no-history' `-H' Disable recording of command-line history. `--no-init-file' Don't read the initialization files `~/.octaverc' and `.octaverc'. `--no-init-path' Don't initialize the search path for function files to include default locations. `--no-line-editing' Disable command-line editing. `--no-site-file' Don't read the site-wide `octaverc' initialization files. `--norc' `-f' Don't read any of the system or user initialization files at startup. This is equivalent to using both of the options `--no-init-file' and `--no-site-file'. `--path PATH' `-p PATH' Add path to the head of the search path for function files. The value of PATH specified on the command line will override any value of `OCTAVE_PATH' found in the environment, but not any commands in the system or user startup files that set the internal load path through one of the path functions. `--persist' Go to interactive mode after `--eval' or reading from a file named on the command line. `--silent' `--quiet' `-q' Don't print the usual greeting and version message at startup. `--traditional' `--braindead' For compatibility with MATLAB, set initial values for user preferences to the following values PS1 = ">> " PS2 = "" beep_on_error = true confirm_recursive_rmdir = false crash_dumps_octave_core = false default_save_options = "-mat-binary" fixed_point_format = true history_timestamp_format_string = "%%-- %D %I:%M %p --%%" page_screen_output = false print_empty_dimensions = false and disable the following warnings Octave:fopen-file-in-path Octave:function-name-clash Octave:load-file-in-path `--verbose' `-V' Turn on verbose output. `--version' `-v' Print the program version number and exit. `FILE' Execute commands from FILE. Exit when done unless `--persist' is also specified. Octave also includes several functions which return information about the command line, including the number of arguments and all of the options. -- Built-in Function: argv () Return the command line arguments passed to Octave. For example, if you invoked Octave using the command octave --no-line-editing --silent `argv' would return a cell array of strings with the elements `--no-line-editing' and `--silent'. If you write an executable Octave script, `argv' will return the list of arguments passed to the script. *Note Executable Octave Programs::, for an example of how to create an executable Octave script. -- Built-in Function: program_name () Return the last component of the value returned by `program_invocation_name'. *See also:* *note program_invocation_name: doc-program_invocation_name. -- Built-in Function: program_invocation_name () Return the name that was typed at the shell prompt to run Octave. If executing a script from the command line (e.g., `octave foo.m') or using an executable Octave script, the program name is set to the name of the script. *Note Executable Octave Programs::, for an example of how to create an executable Octave script. *See also:* *note program_name: doc-program_name. Here is an example of using these functions to reproduce the command line which invoked Octave. printf ("%s", program_name ()); arg_list = argv (); for i = 1:nargin printf (" %s", arg_list{i}); endfor printf ("\n"); *Note Indexing Cell Arrays::, for an explanation of how to retrieve objects from cell arrays, and *note Defining Functions::, for information about the variable `nargin'.  File: octave.info, Node: Startup Files, Prev: Command Line Options, Up: Invoking Octave from the Command Line 2.1.2 Startup Files ------------------- When Octave starts, it looks for commands to execute from the files in the following list. These files may contain any valid Octave commands, including function definitions. `OCTAVE-HOME/share/octave/site/m/startup/octaverc' where OCTAVE-HOME is the directory in which Octave is installed (the default is `/usr/local'). This file is provided so that changes to the default Octave environment can be made globally for all users at your site for all versions of Octave you have installed. Care should be taken when making changes to this file since all users of Octave at your site will be affected. The default file may be overridden by the environment variable `OCTAVE_SITE_INITFILE'. `OCTAVE-HOME/share/octave/VERSION/m/startup/octaverc' where OCTAVE-HOME is the directory in which Octave is installed (the default is `/usr/local'), and VERSION is the version number of Octave. This file is provided so that changes to the default Octave environment can be made globally for all users of a particular version of Octave. Care should be taken when making changes to this file since all users of Octave at your site will be affected. The default file may be overridden by the environment variable `OCTAVE_VERSION_INITFILE'. `~/.octaverc' This file is used to make personal changes to the default Octave environment. `.octaverc' This file can be used to make changes to the default Octave environment for a particular project. Octave searches for this file in the current directory after it reads `~/.octaverc'. Any use of the `cd' command in the `~/.octaverc' file will affect the directory where Octave searches for `.octaverc'. If you start Octave in your home directory, commands from the file `~/.octaverc' will only be executed once. A message will be displayed as each of the startup files is read if you invoke Octave with the `--verbose' option but without the `--silent' option.  File: octave.info, Node: Quitting Octave, Next: Getting Help, Prev: Invoking Octave from the Command Line, Up: Getting Started 2.2 Quitting Octave =================== -- Built-in Function: exit (STATUS) -- Built-in Function: quit (STATUS) Exit the current Octave session. If the optional integer value STATUS is supplied, pass that value to the operating system as the Octave's exit status. The default value is zero. -- Built-in Function: atexit (FCN) -- Built-in Function: atexit (FCN, FLAG) Register a function to be called when Octave exits. For example, function last_words () disp ("Bye bye"); endfunction atexit ("last_words"); will print the message "Bye bye" when Octave exits. The additional argument FLAG will register or unregister FCN from the list of functions to be called when Octave exits. If FLAG is true, the function is registered, and if FLAG is false, it is unregistered. For example, after registering the function `last_words' above, atexit ("last_words", false); will remove the function from the list and Octave will not call `last_words' when it exits. Note that `atexit' only removes the first occurrence of a function from the list, so if a function was placed in the list multiple times with `atexit', it must also be removed from the list multiple times.  File: octave.info, Node: Getting Help, Next: Command Line Editing, Prev: Quitting Octave, Up: Getting Started 2.3 Commands for Getting Help ============================= The entire text of this manual is available from the Octave prompt via the command `doc'. In addition, the documentation for individual user-written functions and variables is also available via the `help' command. This section describes the commands used for reading the manual and the documentation strings for user-supplied functions and variables. *Note Function Files::, for more information about how to document the functions you write. -- Command: help NAME Display the help text for NAME. If invoked without any arguments, `help' prints a list of all the available operators and functions. For example, the command `help help' prints a short message describing the `help' command. The help command can give you information about operators, but not the comma and semicolons that are used as command separators. To get help for those, you must type `help comma' or `help semicolon'. *See also:* *note doc: doc-doc, *note lookfor: doc-lookfor, *note which: doc-which. -- Command: doc FUNCTION_NAME Display documentation for the function FUNCTION_NAME directly from an on-line version of the printed manual, using the GNU Info browser. If invoked without any arguments, the manual is shown from the beginning. For example, the command `doc rand' starts the GNU Info browser at the `rand' node in the on-line version of the manual. Once the GNU Info browser is running, help for using it is available using the command `C-h'. *See also:* *note help: doc-help. -- Command: lookfor STR -- Command: lookfor -all STR -- Function: [FUNC, HELPSTRING] = lookfor (STR) -- Function: [FUNC, HELPSTRING] = lookfor ('-all', STR) Search for the string STR in all functions found in the current function search path. By default, `lookfor' searches for STR in the first sentence of the help string of each function found. The entire help text of each function can be searched if the '-all' argument is supplied. All searches are case insensitive. Called with no output arguments, `lookfor' prints the list of matching functions to the terminal. Otherwise, the output arguments FUNC and HELPSTRING define the matching functions and the first sentence of each of their help strings. The ability of `lookfor' to correctly identify the first sentence of the help text is dependent on the format of the function's help. All Octave core functions are correctly formatted, but the same can not be guaranteed for external packages and user-supplied functions. Therefore, the use of the '-all' argument may be necessary to find related functions that are not a part of Octave. *See also:* *note help: doc-help, *note doc: doc-doc, *note which: doc-which. To see what is new in the current release of Octave, use the `news' function. -- Function File: news () Display the current NEWS file for Octave. -- Function File: info () Display contact information for the GNU Octave community. -- Built-in Function: warranty () Describe the conditions for copying and distributing Octave. The following functions can be used to change which programs are used for displaying the documentation, and where the documentation can be found. -- Built-in Function: VAL = info_file () -- Built-in Function: OLD_VAL = info_file (NEW_VAL) Query or set the internal variable that specifies the name of the Octave info file. The default value is `OCTAVE-HOME/info/octave.info', in which OCTAVE-HOME is the root directory of the Octave installation. The default value may be overridden by the environment variable `OCTAVE_INFO_FILE', or the command line argument `--info-file NAME'. *See also:* *note info_program: doc-info_program, *note doc: doc-doc, *note help: doc-help, *note makeinfo_program: doc-makeinfo_program. -- Built-in Function: VAL = info_program () -- Built-in Function: OLD_VAL = info_program (NEW_VAL) Query or set the internal variable that specifies the name of the info program to run. The default value is `OCTAVE-HOME/libexec/octave/VERSION/exec/ARCH/info' in which OCTAVE-HOME is the root directory of the Octave installation, VERSION is the Octave version number, and ARCH is the system type (for example, `i686-pc-linux-gnu'). The default value may be overridden by the environment variable `OCTAVE_INFO_PROGRAM', or the command line argument `--info-program NAME'. *See also:* *note info_file: doc-info_file, *note doc: doc-doc, *note help: doc-help, *note makeinfo_program: doc-makeinfo_program. -- Built-in Function: VAL = makeinfo_program () -- Built-in Function: OLD_VAL = makeinfo_program (NEW_VAL) Query or set the internal variable that specifies the name of the program that Octave runs to format help text containing Texinfo markup commands. The default value is `makeinfo'. *See also:* *note info_file: doc-info_file, *note info_program: doc-info_program, *note doc: doc-doc, *note help: doc-help. -- Built-in Function: VAL = doc_cache_file () -- Built-in Function: OLD_VAL = doc_cache_file (NEW_VAL) Query or set the internal variable that specifies the name of the Octave documentation cache file. A cache file significantly improves the performance of the `lookfor' command. The default value is `OCTAVE-HOME/share/octave/VERSION/etc/doc-cache', in which OCTAVE-HOME is the root directory of the Octave installation, and VERSION is the Octave version number. The default value may be overridden by the environment variable `OCTAVE_DOC_CACHE_FILE', or the command line argument `--doc-cache-file NAME'. *See also:* *note lookfor: doc-lookfor, *note info_program: doc-info_program, *note doc: doc-doc, *note help: doc-help, *note makeinfo_program: doc-makeinfo_program. -- Built-in Function: VAL = suppress_verbose_help_message () -- Built-in Function: OLD_VAL = suppress_verbose_help_message (NEW_VAL) Query or set the internal variable that controls whether Octave will add additional help information to the end of the output from the `help' command and usage messages for built-in commands.  File: octave.info, Node: Command Line Editing, Next: Errors, Prev: Getting Help, Up: Getting Started 2.4 Command Line Editing ======================== Octave uses the GNU Readline library to provide an extensive set of command-line editing and history features. Only the most common features are described in this manual. In addition, all of the editing functions can be bound to different key strokes at the user's discretion. This manual assumes no changes from the default Emacs bindings. See the GNU Readline Library manual for more information on customizing Readline and for a complete feature list. To insert printing characters (letters, digits, symbols, etc.), simply type the character. Octave will insert the character at the cursor and advance the cursor forward. Many of the command-line editing functions operate using control characters. For example, the character `Control-a' moves the cursor to the beginning of the line. To type `C-a', hold down and then press . In the following sections, control characters such as `Control-a' are written as `C-a'. Another set of command-line editing functions use Meta characters. To type `M-u', hold down the key and press . Depending on the keyboard, the key may be labeled or even . If your terminal does not have a key, you can still type Meta characters using two-character sequences starting with `ESC'. Thus, to enter `M-u', you would type . The `ESC' character sequences are also allowed on terminals with real Meta keys. In the following sections, Meta characters such as `Meta-u' are written as `M-u'. * Menu: * Cursor Motion:: * Killing and Yanking:: * Commands For Text:: * Commands For Completion:: * Commands For History:: * Customizing readline:: * Customizing the Prompt:: * Diary and Echo Commands::  File: octave.info, Node: Cursor Motion, Next: Killing and Yanking, Up: Command Line Editing 2.4.1 Cursor Motion ------------------- The following commands allow you to position the cursor. `C-b' Move back one character. `C-f' Move forward one character. `' Delete the character to the left of the cursor. `C-d' Delete the character underneath the cursor. `M-f' Move forward a word. `M-b' Move backward a word. `C-a' Move to the start of the line. `C-e' Move to the end of the line. `C-l' Clear the screen, reprinting the current line at the top. `C-_' `C-/' Undo the last action. You can undo all the way back to an empty line. `M-r' Undo all changes made to this line. This is like typing the `undo' command enough times to get back to the beginning. The above table describes the most basic possible keystrokes that you need in order to do editing of the input line. On most terminals, you can also use the left and right arrow keys in place of `C-f' and `C-b' to move forward and backward. Notice how `C-f' moves forward a character, while `M-f' moves forward a word. It is a loose convention that control keystrokes operate on characters while meta keystrokes operate on words. The function `clc' will allow you to clear the screen from within Octave programs. -- Built-in Function: clc () -- Built-in Function: home () Clear the terminal screen and move the cursor to the upper left corner.  File: octave.info, Node: Killing and Yanking, Next: Commands For Text, Prev: Cursor Motion, Up: Command Line Editing 2.4.2 Killing and Yanking ------------------------- "Killing" text means to delete the text from the line, but to save it away for later use, usually by "yanking" it back into the line. If the description for a command says that it `kills' text, then you can be sure that you can get the text back in a different (or the same) place later. Here is the list of commands for killing text. `C-k' Kill the text from the current cursor position to the end of the line. `M-d' Kill from the cursor to the end of the current word, or if between words, to the end of the next word. `M-' Kill from the cursor to the start of the previous word, or if between words, to the start of the previous word. `C-w' Kill from the cursor to the previous whitespace. This is different than `M-' because the word boundaries differ. And, here is how to "yank" the text back into the line. Yanking means to copy the most-recently-killed text from the kill buffer. `C-y' Yank the most recently killed text back into the buffer at the cursor. `M-y' Rotate the kill-ring, and yank the new top. You can only do this if the prior command is `C-y' or `M-y'. When you use a kill command, the text is saved in a "kill-ring". Any number of consecutive kills save all of the killed text together, so that when you yank it back, you get it in one clean sweep. The kill ring is not line specific; the text that you killed on a previously typed line is available to be yanked back later, when you are typing another line.  File: octave.info, Node: Commands For Text, Next: Commands For Completion, Prev: Killing and Yanking, Up: Command Line Editing 2.4.3 Commands For Changing Text -------------------------------- The following commands can be used for entering characters that would otherwise have a special meaning (e.g., , `C-q', etc.), or for quickly correcting typing mistakes. `C-q' `C-v' Add the next character that you type to the line verbatim. This is how to insert things like `C-q' for example. `M-' Insert a tab character. `C-t' Drag the character before the cursor forward over the character at the cursor, also moving the cursor forward. If the cursor is at the end of the line, then transpose the two characters before it. `M-t' Drag the word behind the cursor past the word in front of the cursor moving the cursor over that word as well. `M-u' Uppercase the characters following the cursor to the end of the current (or following) word, moving the cursor to the end of the word. `M-l' Lowercase the characters following the cursor to the end of the current (or following) word, moving the cursor to the end of the word. `M-c' Uppercase the character following the cursor (or the beginning of the next word if the cursor is between words), moving the cursor to the end of the word.  File: octave.info, Node: Commands For Completion, Next: Commands For History, Prev: Commands For Text, Up: Command Line Editing 2.4.4 Letting Readline Type For You ----------------------------------- The following commands allow Octave to complete command and variable names for you. `' Attempt to do completion on the text before the cursor. Octave can complete the names of commands and variables. `M-?' List the possible completions of the text before the cursor. -- Built-in Function: VAL = completion_append_char () -- Built-in Function: OLD_VAL = completion_append_char (NEW_VAL) Query or set the internal character variable that is appended to successful command-line completion attempts. The default value is `" "' (a single space). -- Built-in Function: completion_matches (HINT) Generate possible completions given HINT. This function is provided for the benefit of programs like Emacs which might be controlling Octave and handling user input. The current command number is not incremented when this function is called. This is a feature, not a bug.  File: octave.info, Node: Commands For History, Next: Customizing readline, Prev: Commands For Completion, Up: Command Line Editing 2.4.5 Commands For Manipulating The History ------------------------------------------- Octave normally keeps track of the commands you type so that you can recall previous commands to edit or execute them again. When you exit Octave, the most recent commands you have typed, up to the number specified by the variable `history_size', are saved in a file. When Octave starts, it loads an initial list of commands from the file named by the variable `history_file'. Here are the commands for simple browsing and searching the history list. `' `' Accept the current line regardless of where the cursor is. If the line is non-empty, add it to the history list. If the line was a history line, then restore the history line to its original state. `C-p' Move `up' through the history list. `C-n' Move `down' through the history list. `M-<' Move to the first line in the history. `M->' Move to the end of the input history, i.e., the line you are entering! `C-r' Search backward starting at the current line and moving `up' through the history as necessary. This is an incremental search. `C-s' Search forward starting at the current line and moving `down' through the history as necessary. On most terminals, you can also use the up and down arrow keys in place of `C-p' and `C-n' to move through the history list. In addition to the keyboard commands for moving through the history list, Octave provides three functions for viewing, editing, and re-running chunks of commands from the history list. -- Command: history options If invoked with no arguments, `history' displays a list of commands that you have executed. Valid options are: `-w FILE' Write the current history to the file FILE. If the name is omitted, use the default history file (normally `~/.octave_hist'). `-r FILE' Read the file FILE, replacing the current history list with its contents. If the name is omitted, use the default history file (normally `~/.octave_hist'). `N' Display only the most recent N lines of history. `-q' Don't number the displayed lines of history. This is useful for cutting and pasting commands using the X Window System. For example, to display the five most recent commands that you have typed without displaying line numbers, use the command `history -q 5'. -- Command: edit_history [FIRST] [LAST] If invoked with no arguments, `edit_history' allows you to edit the history list using the editor named by the variable `EDITOR'. The commands to be edited are first copied to a temporary file. When you exit the editor, Octave executes the commands that remain in the file. It is often more convenient to use `edit_history' to define functions rather than attempting to enter them directly on the command line. By default, the block of commands is executed as soon as you exit the editor. To avoid executing any commands, simply delete all the lines from the buffer before exiting the editor. The `edit_history' command takes two optional arguments specifying the history numbers of first and last commands to edit. For example, the command edit_history 13 extracts all the commands from the 13th through the last in the history list. The command edit_history 13 169 only extracts commands 13 through 169. Specifying a larger number for the first command than the last command reverses the list of commands before placing them in the buffer to be edited. If both arguments are omitted, the previous command in the history list is used. *See also:* *note run_history: doc-run_history. -- Command: run_history [FIRST] [LAST] Similar to `edit_history', except that the editor is not invoked, and the commands are simply executed as they appear in the history list. *See also:* *note edit_history: doc-edit_history. Octave also allows you customize the details of when, where, and how history is saved. -- Built-in Function: VAL = saving_history () -- Built-in Function: OLD_VAL = saving_history (NEW_VAL) Query or set the internal variable that controls whether commands entered on the command line are saved in the history file. *See also:* *note history_file: doc-history_file, *note history_size: doc-history_size, *note history_timestamp_format_string: doc-history_timestamp_format_string. -- Built-in Function: VAL = history_file () -- Built-in Function: OLD_VAL = history_file (NEW_VAL) Query or set the internal variable that specifies the name of the file used to store command history. The default value is `~/.octave_hist', but may be overridden by the environment variable `OCTAVE_HISTFILE'. *See also:* *note history_size: doc-history_size, *note saving_history: doc-saving_history, *note history_timestamp_format_string: doc-history_timestamp_format_string. -- Built-in Function: VAL = history_size () -- Built-in Function: OLD_VAL = history_size (NEW_VAL) Query or set the internal variable that specifies how many entries to store in the history file. The default value is `1024', but may be overridden by the environment variable `OCTAVE_HISTSIZE'. *See also:* *note history_file: doc-history_file, *note history_timestamp_format_string: doc-history_timestamp_format_string, *note saving_history: doc-saving_history. -- Built-in Function: VAL = history_timestamp_format_string () -- Built-in Function: OLD_VAL = history_timestamp_format_string (NEW_VAL) Query or set the internal variable that specifies the format string for the comment line that is written to the history file when Octave exits. The format string is passed to `strftime'. The default value is "# Octave VERSION, %a %b %d %H:%M:%S %Y %Z " *See also:* *note strftime: doc-strftime, *note history_file: doc-history_file, *note history_size: doc-history_size, *note saving_history: doc-saving_history. -- Built-in Function: VAL = EDITOR () -- Built-in Function: OLD_VAL = EDITOR (NEW_VAL) Query or set the internal variable that specifies the editor to use with the `edit_history' command. The default value is taken from the environment variable `EDITOR' when Octave starts. If the environment variable is not initialized, `EDITOR' will be set to `"emacs"'. *See also:* *note edit_history: doc-edit_history.  File: octave.info, Node: Customizing readline, Next: Customizing the Prompt, Prev: Commands For History, Up: Command Line Editing 2.4.6 Customizing `readline' ---------------------------- Octave uses the GNU Readline library for command-line editing and history features. Readline is very flexible and can be modified through a configuration file of commands (See the GNU Readline library for the exact command syntax). The default configuration file is normally `~/.inputrc'. Octave provides two commands for initializing Readline and thereby changing the command line behavior. -- Built-in Function: read_readline_init_file (FILE) Read the readline library initialization file FILE. If FILE is omitted, read the default initialization file (normally `~/.inputrc'). *Note Readline Init File: (readline)Readline Init File, for details. -- Built-in Function: re_read_readline_init_file () Re-read the last readline library initialization file that was read. *Note Readline Init File: (readline)Readline Init File, for details.  File: octave.info, Node: Customizing the Prompt, Next: Diary and Echo Commands, Prev: Customizing readline, Up: Command Line Editing 2.4.7 Customizing the Prompt ---------------------------- The following variables are available for customizing the appearance of the command-line prompts. Octave allows the prompt to be customized by inserting a number of backslash-escaped special characters that are decoded as follows: `\t' The time. `\d' The date. `\n' Begins a new line by printing the equivalent of a carriage return followed by a line feed. `\s' The name of the program (usually just `octave'). `\w' The current working directory. `\W' The basename of the current working directory. `\u' The username of the current user. `\h' The hostname, up to the first `.'. `\H' The hostname. `\#' The command number of this command, counting from when Octave starts. `\!' The history number of this command. This differs from `\#' by the number of commands in the history list when Octave starts. `\$' If the effective UID is 0, a `#', otherwise a `$'. `\nnn' The character whose character code in octal is NNN. `\\' A backslash. -- Built-in Function: VAL = PS1 () -- Built-in Function: OLD_VAL = PS1 (NEW_VAL) Query or set the primary prompt string. When executing interactively, Octave displays the primary prompt when it is ready to read a command. The default value of the primary prompt string is `"\s:\#> "'. To change it, use a command like octave:13> PS1 ("\\u@\\H> ") which will result in the prompt `boris@kremvax> ' for the user `boris' logged in on the host `kremvax.kgb.su'. Note that two backslashes are required to enter a backslash into a double-quoted character string. *Note Strings::. *See also:* *note PS2: doc-PS2, *note PS4: doc-PS4. -- Built-in Function: VAL = PS2 () -- Built-in Function: OLD_VAL = PS2 (NEW_VAL) Query or set the secondary prompt string. The secondary prompt is printed when Octave is expecting additional input to complete a command. For example, if you are typing a `for' loop that spans several lines, Octave will print the secondary prompt at the beginning of each line after the first. The default value of the secondary prompt string is `"> "'. *See also:* *note PS1: doc-PS1, *note PS4: doc-PS4. -- Built-in Function: VAL = PS4 () -- Built-in Function: OLD_VAL = PS4 (NEW_VAL) Query or set the character string used to prefix output produced when echoing commands is enabled. The default value is `"+ "'. *Note Diary and Echo Commands::, for a description of echoing commands. *See also:* *note echo: doc-echo, *note echo_executing_commands: doc-echo_executing_commands, *note PS1: doc-PS1, *note PS2: doc-PS2.  File: octave.info, Node: Diary and Echo Commands, Prev: Customizing the Prompt, Up: Command Line Editing 2.4.8 Diary and Echo Commands ----------------------------- Octave's diary feature allows you to keep a log of all or part of an interactive session by recording the input you type and the output that Octave produces in a separate file. -- Command: diary options Record a list of all commands _and_ the output they produce, mixed together just as you see them on your terminal. Valid options are: `on' Start recording your session in a file called `diary' in your current working directory. `off' Stop recording your session in the diary file. `FILE' Record your session in the file named FILE. With no arguments, `diary' toggles the current diary state. Sometimes it is useful to see the commands in a function or script as they are being evaluated. This can be especially helpful for debugging some kinds of problems. -- Command: echo options Control whether commands are displayed as they are executed. Valid options are: `on' Enable echoing of commands as they are executed in script files. `off' Disable echoing of commands as they are executed in script files. `on all' Enable echoing of commands as they are executed in script files and functions. `off all' Disable echoing of commands as they are executed in script files and functions. With no arguments, `echo' toggles the current echo state. -- Built-in Function: VAL = echo_executing_commands () -- Built-in Function: OLD_VAL = echo_executing_commands (NEW_VAL) Query or set the internal variable that controls the echo state. It may be the sum of the following values: 1 Echo commands read from script files. 2 Echo commands from functions. 4 Echo commands read from command line. More than one state can be active at once. For example, a value of 3 is equivalent to the command `echo on all'. The value of `echo_executing_commands' may be set by the `echo' command or the command line option `--echo-commands'.  File: octave.info, Node: Errors, Next: Executable Octave Programs, Prev: Command Line Editing, Up: Getting Started 2.5 How Octave Reports Errors ============================= Octave reports two kinds of errors for invalid programs. A "parse error" occurs if Octave cannot understand something you have typed. For example, if you misspell a keyword, octave:13> function y = f (x) y = x***2; endfunction Octave will respond immediately with a message like this: parse error: syntax error >>> function y = f (x) y = x***2; endfunction ^ For most parse errors, Octave uses a caret (`^') to mark the point on the line where it was unable to make sense of your input. In this case, Octave generated an error message because the keyword for exponentiation (`**') was misspelled. It marked the error at the third `*' because the code leading up to this was correct but the final `*' was not understood. Another class of error message occurs at evaluation time. These errors are called "run-time errors", or sometimes "evaluation errors", because they occur when your program is being "run", or "evaluated". For example, if after correcting the mistake in the previous function definition, you type octave:13> f () Octave will respond with error: `x' undefined near line 1 column 24 error: called from: error: f at line 1, column 22 This error message has several parts, and gives quite a bit of information to help you locate the source of the error. The messages are generated from the point of the innermost error, and provide a traceback of enclosing expressions and function calls. In the example above, the first line indicates that a variable named `x' was found to be undefined near line 1 and column 24 of some function or expression. For errors occurring within functions, lines are counted from the beginning of the file containing the function definition. For errors occurring outside of an enclosing function, the line number indicates the input line number, which is usually displayed in the primary prompt string. The second and third lines of the error message indicate that the error occurred within the function `f'. If the function `f' had been called from within another function, for example, `g', the list of errors would have ended with one more line: error: g at line 1, column 17 These lists of function calls make it fairly easy to trace the path your program took before the error occurred, and to correct the error before trying again.  File: octave.info, Node: Executable Octave Programs, Next: Comments, Prev: Errors, Up: Getting Started 2.6 Executable Octave Programs ============================== Once you have learned Octave, you may want to write self-contained Octave scripts, using the `#!' script mechanism. You can do this on GNU systems and on many Unix systems (1). Self-contained Octave scripts are useful when you want to write a program which users can invoke without knowing that the program is written in the Octave language. Octave scripts are also used for batch processing of data files. Once an algorithm has been developed and tested in the interactive portion of Octave, it can be committed to an executable script and used again and again on new data files. As a trivial example of an executable Octave script, you might create a text file named `hello', containing the following lines: #! OCTAVE-INTERPRETER-NAME -qf # a sample Octave program printf ("Hello, world!\n"); (where OCTAVE-INTERPRETER-NAME should be replaced with the full path and name of your Octave binary). Note that this will only work if `#!' appears at the very beginning of the file. After making the file executable (with the `chmod' command on Unix systems), you can simply type: hello at the shell, and the system will arrange to run Octave as if you had typed: octave hello The line beginning with `#!' lists the full path and filename of an interpreter to be run, and an optional initial command line argument to pass to that interpreter. The operating system then runs the interpreter with the given argument and the full argument list of the executed program. The first argument in the list is the full file name of the Octave executable. The rest of the argument list will either be options to Octave, or data files, or both. The `-qf' options are usually specified in stand-alone Octave programs to prevent them from printing the normal startup message, and to keep them from behaving differently depending on the contents of a particular user's `~/.octaverc' file. *Note Invoking Octave from the Command Line::. Note that some operating systems may place a limit on the number of characters that are recognized after `#!'. Also, the arguments appearing in a `#!' line are parsed differently by various shells/systems. The majority of them group all the arguments together in one string and pass it to the interpreter as a single argument. In this case, the following script: #! OCTAVE-INTERPRETER-NAME -q -f # comment is equivalent to typing at the command line: octave "-q -f # comment" which will produce an error message. Unfortunately, it is not possible for Octave to determine whether it has been called from the command line or from a `#!' script, so some care is needed when using the `#!' mechanism. Note that when Octave is started from an executable script, the built-in function `argv' returns a cell array containing the command line arguments passed to the executable Octave script, not the arguments passed to the Octave interpreter on the `#!' line of the script. For example, the following program will reproduce the command line that was used to execute the script, not `-qf'. #! /bin/octave -qf printf ("%s", program_name ()); arg_list = argv (); for i = 1:nargin printf (" %s", arg_list{i}); endfor printf ("\n"); ---------- Footnotes ---------- (1) The `#!' mechanism works on Unix systems derived from Berkeley Unix, System V Release 4, and some System V Release 3 systems.  File: octave.info, Node: Comments, Prev: Executable Octave Programs, Up: Getting Started 2.7 Comments in Octave Programs =============================== A "comment" is some text that is included in a program for the sake of human readers, and which is NOT an executable part of the program. Comments can explain what the program does, and how it works. Nearly all programming languages have provisions for comments, because programs are typically hard to understand without them. * Menu: * Single Line Comments:: * Block Comments:: * Comments and the Help System::  File: octave.info, Node: Single Line Comments, Next: Block Comments, Up: Comments 2.7.1 Single Line Comments -------------------------- In the Octave language, a comment starts with either the sharp sign character, `#', or the percent symbol `%' and continues to the end of the line. Any text following the sharp sign or percent symbol is ignored by the Octave interpreter and not executed. The following example shows whole line and partial line comments. function countdown # Count down for main rocket engines disp(3); disp(2); disp(1); disp("Blast Off!"); # Rocket leaves pad endfunction  File: octave.info, Node: Block Comments, Next: Comments and the Help System, Prev: Single Line Comments, Up: Comments 2.7.2 Block Comments -------------------- Entire blocks of code can be commented by enclosing the code between matching `#{' and `#}' or `%{' and `%}' markers. For example, function quick_countdown # Count down for main rocket engines disp(3); #{ disp(2); disp(1); #} disp("Blast Off!"); # Rocket leaves pad endfunction will produce a very quick countdown from '3' to 'Blast Off' as the lines "`disp(2);'" and "`disp(1);'" won't be executed.  File: octave.info, Node: Comments and the Help System, Prev: Block Comments, Up: Comments 2.7.3 Comments and the Help System ---------------------------------- The `help' command (*note Getting Help::) is able to find the first block of comments in a function and return those as a documentation string. This means that the same commands used to get help on built-in functions are available for properly formatted user-defined functions. For example, after defining the function `f' below, function xdot = f (x, t) # usage: f (x, t) # # This function defines the right-hand # side functions for a set of nonlinear # differential equations. r = 0.25; ... endfunction the command `help f' produces the output usage: f (x, t) This function defines the right-hand side functions for a set of nonlinear differential equations. Although it is possible to put comment lines into keyboard-composed, throw-away Octave programs, it usually isn't very useful because the purpose of a comment is to help you or another person understand the program at a later time. The `help' parser currently only recognizes single line comments (*note Single Line Comments::) and not block comments for the initial help text.  File: octave.info, Node: Data Types, Next: Numeric Data Types, Prev: Getting Started, Up: Top 3 Data Types ************ All versions of Octave include a number of built-in data types, including real and complex scalars and matrices, character strings, a data structure type, and an array that can contain all data types. It is also possible to define new specialized data types by writing a small amount of C++ code. On some systems, new data types can be loaded dynamically while Octave is running, so it is not necessary to recompile all of Octave just to add a new type. *Note Dynamically Linked Functions::, for more information about Octave's dynamic linking capabilities. *note User-defined Data Types:: describes what you must do to define a new data type for Octave. -- Built-in Function: typeinfo (EXPR) Return the type of the expression EXPR, as a string. If EXPR is omitted, return an array of strings containing all the currently installed data types. * Menu: * Built-in Data Types:: * User-defined Data Types:: * Object Sizes::  File: octave.info, Node: Built-in Data Types, Next: User-defined Data Types, Up: Data Types 3.1 Built-in Data Types ======================= The standard built-in data types are real and complex scalars and matrices, ranges, character strings, a data structure type, and cell arrays. Additional built-in data types may be added in future versions. If you need a specialized data type that is not currently provided as a built-in type, you are encouraged to write your own user-defined data type and contribute it for distribution in a future release of Octave. The data type of a variable can be determined and changed through the use of the following functions. -- Built-in Function: class (EXPR) -- Built-in Function: class (S, ID) -- Built-in Function: class (S, ID, P, ...) Return the class of the expression EXPR or create a class with fields from structure S and name (string) ID. Additional arguments name a list of parent classes from which the new class is derived. -- Function File: isa (X, CLASS) Return true if X is a value from the class CLASS. -- Function File: cast (VAL, TYPE) Convert VAL to data type TYPE. *See also:* *note int8: doc-int8, *note uint8: doc-uint8, *note int16: doc-int16, *note uint16: doc-uint16, *note int32: doc-int32, *note uint32: doc-uint32, *note int64: doc-int64, *note uint64: doc-uint64, *note double: doc-double. -- Loadable Function: typecast (X, TYPE) Convert from one datatype to another without changing the underlying data. The argument TYPE defines the type of the return argument and must be one of 'uint8', 'uint16', 'uint32', 'uint64', 'int8', 'int16', 'int32', 'int64', 'single' or 'double'. An example of the use of typecast on a little-endian machine is X = uint16 ([1, 65535]); typecast (X, 'uint8') => [ 0, 1, 255, 255] *See also:* *note cast: doc-cast, *note swapbytes: doc-swapbytes. -- Function File: swapbytes (X) Swaps the byte order on values, converting from little endian to big endian and vice versa. For example swapbytes (uint16 (1:4)) => [ 256 512 768 1024] *See also:* *note typecast: doc-typecast, *note cast: doc-cast. * Menu: * Numeric Objects:: * Missing Data:: * String Objects:: * Data Structure Objects:: * Cell Array Objects::  File: octave.info, Node: Numeric Objects, Next: Missing Data, Up: Built-in Data Types 3.1.1 Numeric Objects --------------------- Octave's built-in numeric objects include real, complex, and integer scalars and matrices. All built-in floating point numeric data is currently stored as double precision numbers. On systems that use the IEEE floating point format, values in the range of approximately 2.2251e-308 to 1.7977e+308 can be stored, and the relative precision is approximately 2.2204e-16. The exact values are given by the variables `realmin', `realmax', and `eps', respectively. Matrix objects can be of any size, and can be dynamically reshaped and resized. It is easy to extract individual rows, columns, or submatrices using a variety of powerful indexing features. *Note Index Expressions::. *Note Numeric Data Types::, for more information.  File: octave.info, Node: Missing Data, Next: String Objects, Prev: Numeric Objects, Up: Built-in Data Types 3.1.2 Missing Data ------------------ It is possible to represent missing data explicitly in Octave using `NA' (short for "Not Available"). Missing data can only be represented when data is represented as floating point numbers. In this case missing data is represented as a special case of the representation of `NaN'. -- Built-in Function: NA (X) -- Built-in Function: NA (N, M) -- Built-in Function: NA (N, M, K, ...) -- Built-in Function: NA (..., CLASS) Return a matrix or N-dimensional array whose elements are all equal to the special constant used to designate missing values. -- Mapping Function: isna (X) Return 1 for elements of X that are NA (missing) values and zero otherwise. For example, isna ([13, Inf, NA, NaN]) => [ 0, 0, 1, 0 ]  File: octave.info, Node: String Objects, Next: Data Structure Objects, Prev: Missing Data, Up: Built-in Data Types 3.1.3 String Objects -------------------- A character string in Octave consists of a sequence of characters enclosed in either double-quote or single-quote marks. Internally, Octave currently stores strings as matrices of characters. All the indexing operations that work for matrix objects also work for strings. *Note Strings::, for more information.  File: octave.info, Node: Data Structure Objects, Next: Cell Array Objects, Prev: String Objects, Up: Built-in Data Types 3.1.4 Data Structure Objects ---------------------------- Octave's data structure type can help you to organize related objects of different types. The current implementation uses an associative array with indices limited to strings, but the syntax is more like C-style structures. *Note Data Structures::, for more information.  File: octave.info, Node: Cell Array Objects, Prev: Data Structure Objects, Up: Built-in Data Types 3.1.5 Cell Array Objects ------------------------ A Cell Array in Octave is general array that can hold any number of different data types. *Note Cell Arrays::, for more information.  File: octave.info, Node: User-defined Data Types, Next: Object Sizes, Prev: Built-in Data Types, Up: Data Types 3.2 User-defined Data Types =========================== Someday I hope to expand this to include a complete description of Octave's mechanism for managing user-defined data types. Until this feature is documented here, you will have to make do by reading the code in the `ov.h', `ops.h', and related files from Octave's `src' directory.  File: octave.info, Node: Object Sizes, Prev: User-defined Data Types, Up: Data Types 3.3 Object Sizes ================ The following functions allow you to determine the size of a variable or expression. These functions are defined for all objects. They return -1 when the operation doesn't make sense. For example, Octave's data structure type doesn't have rows or columns, so the `rows' and `columns' functions return -1 for structure arguments. -- Built-in Function: ndims (A) Returns the number of dimensions of array A. For any array, the result will always be larger than or equal to 2. Trailing singleton dimensions are not counted. -- Built-in Function: columns (A) Return the number of columns of A. *See also:* *note size: doc-size, *note numel: doc-numel, *note rows: doc-rows, *note length: doc-length, *note isscalar: doc-isscalar, *note isvector: doc-isvector, *note ismatrix: doc-ismatrix. -- Built-in Function: rows (A) Return the number of rows of A. *See also:* *note size: doc-size, *note numel: doc-numel, *note columns: doc-columns, *note length: doc-length, *note isscalar: doc-isscalar, *note isvector: doc-isvector, *note ismatrix: doc-ismatrix. -- Built-in Function: numel (A) Returns the number of elements in the object A. *See also:* *note size: doc-size. -- Built-in Function: length (A) Return the `length' of the object A. For matrix objects, the length is the number of rows or columns, whichever is greater (this odd definition is used for compatibility with MATLAB). -- Built-in Function: size (A, N) Return the number rows and columns of A. With one input argument and one output argument, the result is returned in a row vector. If there are multiple output arguments, the number of rows is assigned to the first, and the number of columns to the second, etc. For example, size ([1, 2; 3, 4; 5, 6]) => [ 3, 2 ] [nr, nc] = size ([1, 2; 3, 4; 5, 6]) => nr = 3 => nc = 2 If given a second argument, `size' will return the size of the corresponding dimension. For example size ([1, 2; 3, 4; 5, 6], 2) => 2 returns the number of columns in the given matrix. *See also:* *note numel: doc-numel. -- Built-in Function: isempty (A) Return 1 if A is an empty matrix (either the number of rows, or the number of columns, or both are zero). Otherwise, return 0. -- Built-in Function: isnull (X) Return 1 if X is a special null matrix, string or single quoted string. Indexed assignment with such a value as right-hand side should delete array elements. This function should be used when overloading indexed assignment for user-defined classes instead of `isempty', to distinguish the cases: `A(I) = []' This should delete elements if `I' is nonempty. `X = []; A(I) = X' This should give an error if `I' is nonempty. -- Built-in Function: sizeof (VAL) Return the size of VAL in bytes -- Built-in Function: size_equal (A, B, ...) Return true if the dimensions of all arguments agree. Trailing singleton dimensions are ignored. Called with a single argument, size_equal returns true. *See also:* *note size: doc-size, *note numel: doc-numel. -- Built-in Function: squeeze (X) Remove singleton dimensions from X and return the result. Note that for compatibility with MATLAB, all objects have a minimum of two dimensions and row vectors are left unchanged.  File: octave.info, Node: Numeric Data Types, Next: Strings, Prev: Data Types, Up: Top 4 Numeric Data Types ******************** A "numeric constant" may be a scalar, a vector, or a matrix, and it may contain complex values. The simplest form of a numeric constant, a scalar, is a single number that can be an integer, a decimal fraction, a number in scientific (exponential) notation, or a complex number. Note that by default numeric constants are represented within Octave in double-precision floating point format (complex constants are stored as pairs of double-precision floating point values). It is however possible to represent real integers as described in *note Integer Data Types::. Here are some examples of real-valued numeric constants, which all have the same value: 105 1.05e+2 1050e-1 To specify complex constants, you can write an expression of the form 3 + 4i 3.0 + 4.0i 0.3e1 + 40e-1i all of which are equivalent. The letter `i' in the previous example stands for the pure imaginary constant, defined as `sqrt (-1)'. For Octave to recognize a value as the imaginary part of a complex constant, a space must not appear between the number and the `i'. If it does, Octave will print an error message, like this: octave:13> 3 + 4 i parse error: syntax error >>> 3 + 4 i ^ You may also use `j', `I', or `J' in place of the `i' above. All four forms are equivalent. -- Built-in Function: double (X) Convert X to double precision type. -- Built-in Function: complex (VAL) -- Built-in Function: complex (RE, IM) Convert X to a complex value. * Menu: * Matrices:: * Ranges:: * Single Precision Data Types:: * Integer Data Types:: * Bit Manipulations:: * Logical Values:: * Promotion and Demotion of Data Types:: * Predicates for Numeric Objects::  File: octave.info, Node: Matrices, Next: Ranges, Up: Numeric Data Types 4.1 Matrices ============ It is easy to define a matrix of values in Octave. The size of the matrix is determined automatically, so it is not necessary to explicitly state the dimensions. The expression a = [1, 2; 3, 4] results in the matrix / \ | 1 2 | a = | | | 3 4 | \ / Elements of a matrix may be arbitrary expressions, provided that the dimensions all make sense when combining the various pieces. For example, given the above matrix, the expression [ a, a ] produces the matrix ans = 1 2 1 2 3 4 3 4 but the expression [ a, 1 ] produces the error error: number of rows must match (1 != 2) near line 13, column 6 (assuming that this expression was entered as the first thing on line 13, of course). Inside the square brackets that delimit a matrix expression, Octave looks at the surrounding context to determine whether spaces and newline characters should be converted into element and row separators, or simply ignored, so an expression like a = [ 1 2 3 4 ] will work. However, some possible sources of confusion remain. For example, in the expression [ 1 - 1 ] the `-' is treated as a binary operator and the result is the scalar 0, but in the expression [ 1 -1 ] the `-' is treated as a unary operator and the result is the vector `[ 1, -1 ]'. Similarly, the expression [ sin (pi) ] will be parsed as [ sin, (pi) ] and will result in an error since the `sin' function will be called with no arguments. To get around this, you must omit the space between `sin' and the opening parenthesis, or enclose the expression in a set of parentheses: [ (sin (pi)) ] Whitespace surrounding the single quote character (`'', used as a transpose operator and for delimiting character strings) can also cause confusion. Given `a = 1', the expression [ 1 a' ] results in the single quote character being treated as a transpose operator and the result is the vector `[ 1, 1 ]', but the expression [ 1 a ' ] produces the error message parse error: syntax error >>> [ 1 a ' ] ^ because not doing so would cause trouble when parsing the valid expression [ a 'foo' ] For clarity, it is probably best to always use commas and semicolons to separate matrix elements and rows. When you type a matrix or the name of a variable whose value is a matrix, Octave responds by printing the matrix in with neatly aligned rows and columns. If the rows of the matrix are too large to fit on the screen, Octave splits the matrix and displays a header before each section to indicate which columns are being displayed. You can use the following variables to control the format of the output. -- Built-in Function: VAL = output_max_field_width () -- Built-in Function: OLD_VAL = output_max_field_width (NEW_VAL) Query or set the internal variable that specifies the maximum width of a numeric output field. *See also:* *note format: doc-format, *note output_precision: doc-output_precision. -- Built-in Function: VAL = output_precision () -- Built-in Function: OLD_VAL = output_precision (NEW_VAL) Query or set the internal variable that specifies the minimum number of significant figures to display for numeric output. *See also:* *note format: doc-format, *note output_max_field_width: doc-output_max_field_width. It is possible to achieve a wide range of output styles by using different values of `output_precision' and `output_max_field_width'. Reasonable combinations can be set using the `format' function. *Note Basic Input and Output::. -- Built-in Function: VAL = split_long_rows () -- Built-in Function: OLD_VAL = split_long_rows (NEW_VAL) Query or set the internal variable that controls whether rows of a matrix may be split when displayed to a terminal window. If the rows are split, Octave will display the matrix in a series of smaller pieces, each of which can fit within the limits of your terminal width and each set of rows is labeled so that you can easily see which columns are currently being displayed. For example: octave:13> rand (2,10) ans = Columns 1 through 6: 0.75883 0.93290 0.40064 0.43818 0.94958 0.16467 0.75697 0.51942 0.40031 0.61784 0.92309 0.40201 Columns 7 through 10: 0.90174 0.11854 0.72313 0.73326 0.44672 0.94303 0.56564 0.82150 Octave automatically switches to scientific notation when values become very large or very small. This guarantees that you will see several significant figures for every value in a matrix. If you would prefer to see all values in a matrix printed in a fixed point format, you can set the built-in variable `fixed_point_format' to a nonzero value. But doing so is not recommended, because it can produce output that can easily be misinterpreted. -- Built-in Function: VAL = fixed_point_format () -- Built-in Function: OLD_VAL = fixed_point_format (NEW_VAL) Query or set the internal variable that controls whether Octave will use a scaled format to print matrix values such that the largest element may be written with a single leading digit with the scaling factor is printed on the first line of output. For example, octave:1> logspace (1, 7, 5)' ans = 1.0e+07 * 0.00000 0.00003 0.00100 0.03162 1.00000 Notice that first value appears to be zero when it is actually 1. For this reason, you should be careful when setting `fixed_point_format' to a nonzero value. * Menu: * Empty Matrices::  File: octave.info, Node: Empty Matrices, Up: Matrices 4.1.1 Empty Matrices -------------------- A matrix may have one or both dimensions zero, and operations on empty matrices are handled as described by Carl de Boor in `An Empty Exercise', SIGNUM, Volume 25, pages 2-6, 1990 and C. N. Nett and W. M. Haddad, in `A System-Theoretic Appropriate Realization of the Empty Matrix Concept', IEEE Transactions on Automatic Control, Volume 38, Number 5, May 1993. Briefly, given a scalar S, an M by N matrix `M(mxn)', and an M by N empty matrix `[](mxn)' (with either one or both dimensions equal to zero), the following are true: s * [](mxn) = [](mxn) * s = [](mxn) [](mxn) + [](mxn) = [](mxn) [](0xm) * M(mxn) = [](0xn) M(mxn) * [](nx0) = [](mx0) [](mx0) * [](0xn) = 0(mxn) By default, dimensions of the empty matrix are printed along with the empty matrix symbol, `[]'. The built-in variable `print_empty_dimensions' controls this behavior. -- Built-in Function: VAL = print_empty_dimensions () -- Built-in Function: OLD_VAL = print_empty_dimensions (NEW_VAL) Query or set the internal variable that controls whether the dimensions of empty matrices are printed along with the empty matrix symbol, `[]'. For example, the expression zeros (3, 0) will print ans = [](3x0) Empty matrices may also be used in assignment statements as a convenient way to delete rows or columns of matrices. *Note Assignment Expressions: Assignment Ops. When Octave parses a matrix expression, it examines the elements of the list to determine whether they are all constants. If they are, it replaces the list with a single matrix constant.  File: octave.info, Node: Ranges, Next: Single Precision Data Types, Prev: Matrices, Up: Numeric Data Types 4.2 Ranges ========== A "range" is a convenient way to write a row vector with evenly spaced elements. A range expression is defined by the value of the first element in the range, an optional value for the increment between elements, and a maximum value which the elements of the range will not exceed. The base, increment, and limit are separated by colons (the `:' character) and may contain any arithmetic expressions and function calls. If the increment is omitted, it is assumed to be 1. For example, the range 1 : 5 defines the set of values `[ 1, 2, 3, 4, 5 ]', and the range 1 : 3 : 5 defines the set of values `[ 1, 4 ]'. Although a range constant specifies a row vector, Octave does _not_ convert range constants to vectors unless it is necessary to do so. This allows you to write a constant like `1 : 10000' without using 80,000 bytes of storage on a typical 32-bit workstation. Note that the upper (or lower, if the increment is negative) bound on the range is not always included in the set of values, and that ranges defined by floating point values can produce surprising results because Octave uses floating point arithmetic to compute the values in the range. If it is important to include the endpoints of a range and the number of elements is known, you should use the `linspace' function instead (*note Special Utility Matrices::). When adding a scalar to a range, subtracting a scalar from it (or subtracting a range from a scalar) and multiplying by scalar, Octave will attempt to avoid unpacking the range and keep the result as a range, too, if it can determine that it is safe to do so. For instance, doing a = 2*(1:1e7) - 1; will produce the same result as `1:2:2e7-1', but without ever forming a vector with ten million elements. Using zero as an increment in the colon notation, as `1:0:1' is not allowed, because a division by zero would occur in determining the number of range elements. However, ranges with zero increment (i.e., all elements equal) are useful, especially in indexing, and Octave allows them to be constructed using the built-in function "ones". Note that because a range must be a row vector, `ones (1, 10)' produces a range, while `ones (10, 1)' does not. When Octave parses a range expression, it examines the elements of the expression to determine whether they are all constants. If they are, it replaces the range expression with a single range constant.  File: octave.info, Node: Single Precision Data Types, Next: Integer Data Types, Prev: Ranges, Up: Numeric Data Types 4.3 Single Precision Data Types =============================== Octave includes support for single precision data types, and most of the functions in Octave accept single precision values and return single precision answers. A single precision variable is created with the `single' function. -- Built-in Function: single (X) Convert X to single precision type. for example sngl = single (rand (2, 2)) => sngl = 0.37569 0.92982 0.11962 0.50876 class (sngl) => single Many functions can also return single precision values directly. For example ones (2, 2, "single") zeros (2, 2, "single") eye (2, 2, "single") rand (2, 2, "single") NaN (2, 2, "single") NA (2, 2, "single") Inf (2, 2, "single") will all return single precision matrices.  File: octave.info, Node: Integer Data Types, Next: Bit Manipulations, Prev: Single Precision Data Types, Up: Numeric Data Types 4.4 Integer Data Types ====================== Octave supports integer matrices as an alternative to using double precision. It is possible to use both signed and unsigned integers represented by 8, 16, 32, or 64 bits. It should be noted that most computations require floating point data, meaning that integers will often change type when involved in numeric computations. For this reason integers are most often used to store data, and not for calculations. In general most integer matrices are created by casting existing matrices to integers. The following example shows how to cast a matrix into 32 bit integers. float = rand (2, 2) => float = 0.37569 0.92982 0.11962 0.50876 integer = int32 (float) => integer = 0 1 0 1 As can be seen, floating point values are rounded to the nearest integer when converted. -- Built-in Function: isinteger (X) Return true if X is an integer object (int8, uint8, int16, etc.). Note that `isinteger (14)' is false because numeric constants in Octave are double precision floating point values. *See also:* *note isreal: doc-isreal, *note isnumeric: doc-isnumeric, *note class: doc-class, *note isa: doc-isa. -- Built-in Function: int8 (X) Convert X to 8-bit integer type. -- Built-in Function: uint8 (X) Convert X to unsigned 8-bit integer type. -- Built-in Function: int16 (X) Convert X to 16-bit integer type. -- Built-in Function: uint16 (X) Convert X to unsigned 16-bit integer type. -- Built-in Function: int32 (X) Convert X to 32-bit integer type. -- Built-in Function: uint32 (X) Convert X to unsigned 32-bit integer type. -- Built-in Function: int64 (X) Convert X to 64-bit integer type. -- Built-in Function: uint64 (X) Convert X to unsigned 64-bit integer type. -- Built-in Function: intmax (TYPE) Return the largest integer that can be represented in an integer type. The variable TYPE can be `int8' signed 8-bit integer. `int16' signed 16-bit integer. `int32' signed 32-bit integer. `int64' signed 64-bit integer. `uint8' unsigned 8-bit integer. `uint16' unsigned 16-bit integer. `uint32' unsigned 32-bit integer. `uint64' unsigned 64-bit integer. The default for TYPE is `uint32'. *See also:* *note intmin: doc-intmin, *note bitmax: doc-bitmax. -- Built-in Function: intmin (TYPE) Return the smallest integer that can be represented in an integer type. The variable TYPE can be `int8' signed 8-bit integer. `int16' signed 16-bit integer. `int32' signed 32-bit integer. `int64' signed 64-bit integer. `uint8' unsigned 8-bit integer. `uint16' unsigned 16-bit integer. `uint32' unsigned 32-bit integer. `uint64' unsigned 64-bit integer. The default for TYPE is `uint32'. *See also:* *note intmax: doc-intmax, *note bitmax: doc-bitmax. -- Function File: intwarning (ACTION) -- Function File: intwarning (S) -- Function File: S = intwarning (...) Control the state of the warning for integer conversions and math operations. "query" The state of the Octave integer conversion and math warnings is queried. If there is no output argument, then the state is printed. Otherwise it is returned in a structure with the fields "identifier" and "state". intwarning ("query") The state of warning "Octave:int-convert-nan" is "off" The state of warning "Octave:int-convert-non-int-val" is "off" The state of warning "Octave:int-convert-overflow" is "off" The state of warning "Octave:int-math-overflow" is "off" "on" Turn integer conversion and math warnings "on". If there is no output argument, then nothing is printed. Otherwise the original state of the state of the integer conversion and math warnings is returned in a structure array. "off" Turn integer conversion and math warnings "on". If there is no output argument, then nothing is printed. Otherwise the original state of the state of the integer conversion and math warnings is returned in a structure array. The original state of the integer warnings can be restored by passing the structure array returned by `intwarning' to a later call to `intwarning'. For example s = intwarning ("off"); ... intwarning (s); *See also:* *note warning: doc-warning. * Menu: * Integer Arithmetic::  File: octave.info, Node: Integer Arithmetic, Up: Integer Data Types 4.4.1 Integer Arithmetic ------------------------ While many numerical computations can't be carried out in integers, Octave does support basic operations like addition and multiplication on integers. The operators `+', `-', `.*', and `./' work on integers of the same type. So, it is possible to add two 32 bit integers, but not to add a 32 bit integer and a 16 bit integer. The arithmetic operations on integers are performed by casting the integer values to double precision values, performing the operation, and then re-casting the values back to the original integer type. As the double precision type of Octave is only capable of representing integers with up to 53 bits of precision, it is not possible to perform arithmetic with 64 bit integer types. When doing integer arithmetic one should consider the possibility of underflow and overflow. This happens when the result of the computation can't be represented using the chosen integer type. As an example it is not possible to represent the result of 10 - 20 when using unsigned integers. Octave makes sure that the result of integer computations is the integer that is closest to the true result. So, the result of 10 - 20 when using unsigned integers is zero. When doing integer division Octave will round the result to the nearest integer. This is different from most programming languages, where the result is often floored to the nearest integer. So, the result of `int32(5)./int32(8)' is `1'. -- Function File: idivide (X, Y, OP) Integer division with different round rules. The standard behavior of the an integer division such as `A ./ B' is to round the result to the nearest integer. This is not always the desired behavior and `idivide' permits integer element-by-element division to be performed with different treatment for the fractional part of the division as determined by the OP flag. OP is a string with one of the values: "fix" Calculate `A ./ B' with the fractional part rounded towards zero. "round" Calculate `A ./ B' with the fractional part rounded towards the nearest integer. "floor" Calculate `A ./ B' with the fractional part rounded downwards. "ceil" Calculate `A ./ B' with the fractional part rounded upwards. If OP is not given it is assumed that it is `"fix"'. An example demonstrating these rounding rules is idivide (int8 ([-3, 3]), int8 (4), "fix") => int8 ([0, 0]) idivide (int8 ([-3, 3]), int8 (4), "round") => int8 ([-1, 1]) idivide (int8 ([-3, 3]), int8 (4), "ceil") => int8 ([0, 1]) idivide (int8 ([-3, 3]), int8 (4), "floor") => int8 ([-1, 0]) *See also:* *note ldivide: doc-ldivide, *note rdivide: doc-rdivide.  File: octave.info, Node: Bit Manipulations, Next: Logical Values, Prev: Integer Data Types, Up: Numeric Data Types 4.5 Bit Manipulations ===================== Octave provides a number of functions for the manipulation of numeric values on a bit by bit basis. The basic functions to set and obtain the values of individual bits are `bitset' and `bitget'. -- Function File: X = bitset (A, N) -- Function File: X = bitset (A, N, V) Set or reset bit(s) N of unsigned integers in A. V = 0 resets and V = 1 sets the bits. The lowest significant bit is: N = 1 dec2bin (bitset (10, 1)) => 1011 *See also:* *note bitand: doc-bitand, *note bitor: doc-bitor, *note bitxor: doc-bitxor, *note bitget: doc-bitget, *note bitcmp: doc-bitcmp, *note bitshift: doc-bitshift, *note bitmax: doc-bitmax. -- Function File: X = bitget (A,N) Return the status of bit(s) N of unsigned integers in A the lowest significant bit is N = 1. bitget (100, 8:-1:1) => 0 1 1 0 0 1 0 0 *See also:* *note bitand: doc-bitand, *note bitor: doc-bitor, *note bitxor: doc-bitxor, *note bitset: doc-bitset, *note bitcmp: doc-bitcmp, *note bitshift: doc-bitshift, *note bitmax: doc-bitmax. The arguments to all of Octave's bitwise operations can be scalar or arrays, except for `bitcmp', whose K argument must a scalar. In the case where more than one argument is an array, then all arguments must have the same shape, and the bitwise operator is applied to each of the elements of the argument individually. If at least one argument is a scalar and one an array, then the scalar argument is duplicated. Therefore bitget (100, 8:-1:1) is the same as bitget (100 * ones (1, 8), 8:-1:1) It should be noted that all values passed to the bit manipulation functions of Octave are treated as integers. Therefore, even though the example for `bitset' above passes the floating point value `10', it is treated as the bits `[1, 0, 1, 0]' rather than the bits of the native floating point format representation of `10'. As the maximum value that can be represented by a number is important for bit manipulation, particularly when forming masks, Octave supplies the function `bitmax'. -- Built-in Function: bitmax () Return the largest integer that can be represented as a floating point value. On IEEE-754 compatible systems, `bitmax' is `2^53 - 1'. This is the double precision version of the functions `intmax', previously discussed. Octave also includes the basic bitwise 'and', 'or' and 'exclusive or' operators. -- Built-in Function: bitand (X, Y) Return the bitwise AND of non-negative integers. X, Y must be in the range [0,bitmax] *See also:* *note bitor: doc-bitor, *note bitxor: doc-bitxor, *note bitset: doc-bitset, *note bitget: doc-bitget, *note bitcmp: doc-bitcmp, *note bitshift: doc-bitshift, *note bitmax: doc-bitmax. -- Built-in Function: bitor (X, Y) Return the bitwise OR of non-negative integers. X, Y must be in the range [0,bitmax] *See also:* *note bitor: doc-bitor, *note bitxor: doc-bitxor, *note bitset: doc-bitset, *note bitget: doc-bitget, *note bitcmp: doc-bitcmp, *note bitshift: doc-bitshift, *note bitmax: doc-bitmax. -- Built-in Function: bitxor (X, Y) Return the bitwise XOR of non-negative integers. X, Y must be in the range [0,bitmax] *See also:* *note bitand: doc-bitand, *note bitor: doc-bitor, *note bitset: doc-bitset, *note bitget: doc-bitget, *note bitcmp: doc-bitcmp, *note bitshift: doc-bitshift, *note bitmax: doc-bitmax. The bitwise 'not' operator is a unary operator that performs a logical negation of each of the bits of the value. For this to make sense, the mask against which the value is negated must be defined. Octave's bitwise 'not' operator is `bitcmp'. -- Function File: bitcmp (A, K) Return the K-bit complement of integers in A. If K is omitted `k = log2 (bitmax) + 1' is assumed. bitcmp(7,4) => 8 dec2bin(11) => 1011 dec2bin(bitcmp(11, 6)) => 110100 *See also:* *note bitand: doc-bitand, *note bitor: doc-bitor, *note bitxor: doc-bitxor, *note bitset: doc-bitset, *note bitget: doc-bitget, *note bitcmp: doc-bitcmp, *note bitshift: doc-bitshift, *note bitmax: doc-bitmax. Octave also includes the ability to left-shift and right-shift values bitwise. -- Built-in Function: bitshift (A, K) -- Built-in Function: bitshift (A, K, N) Return a K bit shift of N-digit unsigned integers in A. A positive K leads to a left shift. A negative value to a right shift. If N is omitted it defaults to log2(bitmax)+1. N must be in the range [1,log2(bitmax)+1] usually [1,33] bitshift (eye (3), 1) => 2 0 0 0 2 0 0 0 2 bitshift (10, [-2, -1, 0, 1, 2]) => 2 5 10 20 40 *See also:* *note bitand: doc-bitand, *note bitor: doc-bitor, *note bitxor: doc-bitxor, *note bitset: doc-bitset, *note bitget: doc-bitget, *note bitcmp: doc-bitcmp, *note bitmax: doc-bitmax. Bits that are shifted out of either end of the value are lost. Octave also uses arithmetic shifts, where the sign bit of the value is kept during a right shift. For example bitshift (-10, -1) => -5 bitshift (int8 (-1), -1) => -1 Note that `bitshift (int8 (-1), -1)' is `-1' since the bit representation of `-1' in the `int8' data type is `[1, 1, 1, 1, 1, 1, 1, 1]'.  File: octave.info, Node: Logical Values, Next: Promotion and Demotion of Data Types, Prev: Bit Manipulations, Up: Numeric Data Types 4.6 Logical Values ================== Octave has built-in support for logical values, i.e., variables that are either `true' or `false'. When comparing two variables, the result will be a logical value whose value depends on whether or not the comparison is true. The basic logical operations are `&', `|', and `!', which correspond to "Logical And", "Logical Or", and "Logical Negation". These operations all follow the usual rules of logic. It is also possible to use logical values as part of standard numerical calculations. In this case `true' is converted to `1', and `false' to 0, both represented using double precision floating point numbers. So, the result of `true*22 - false/6' is `22'. Logical values can also be used to index matrices and cell arrays. When indexing with a logical array the result will be a vector containing the values corresponding to `true' parts of the logical array. The following example illustrates this. data = [ 1, 2; 3, 4 ]; idx = (data <= 2); data(idx) => ans = [ 1; 2 ] Instead of creating the `idx' array it is possible to replace `data(idx)' with `data( data <= 2 )' in the above code. Logical values can also be constructed by casting numeric objects to logical values, or by using the `true' or `false' functions. -- Function File: logical (ARG) Convert ARG to a logical value. For example, logical ([-1, 0, 1]) is equivalent to [-1, 0, 1] != 0 -- Built-in Function: true (X) -- Built-in Function: true (N, M) -- Built-in Function: true (N, M, K, ...) Return a matrix or N-dimensional array whose elements are all logical 1. The arguments are handled the same as the arguments for `eye'. -- Built-in Function: false (X) -- Built-in Function: false (N, M) -- Built-in Function: false (N, M, K, ...) Return a matrix or N-dimensional array whose elements are all logical 0. The arguments are handled the same as the arguments for `eye'.  File: octave.info, Node: Promotion and Demotion of Data Types, Next: Predicates for Numeric Objects, Prev: Logical Values, Up: Numeric Data Types 4.7 Promotion and Demotion of Data Types ======================================== Many operators and functions can work with mixed data types. For example uint8 (1) + 1 => 2 where the above operator works with an 8-bit integer and a double precision value and returns an 8-bit integer value. Note that the type is demoted to an 8-bit integer, rather than promoted to a double precision value as might be expected. The reason is that if Octave promoted values in expressions like the above with all numerical constants would need to be explicitly cast to the appropriate data type like uint8 (1) + uint8 (1) => 2 which becomes difficult for the user to apply uniformly and might allow hard to find bugs to be introduced. The same applies to single precision values where a mixed operation such as single (1) + 1 => 2 returns a single precision value. The mixed operations that are valid and their returned data types are Mixed Operation Result double OP single single double OP integer integer double OP char double double OP logical double single OP integer integer single OP char single single OP logical single The same logic applies to functions with mixed arguments such as min (single (1), 0) => 0 where the returned value is single precision. In the case of mixed type indexed assignments, the type is not changed. For example x = ones (2, 2); x (1, 1) = single (2) => x = 2 1 1 1 where `x' remains of the double precision type.  File: octave.info, Node: Predicates for Numeric Objects, Prev: Promotion and Demotion of Data Types, Up: Numeric Data Types 4.8 Predicates for Numeric Objects ================================== Since the type of a variable may change during the execution of a program, it can be necessary to do type checking at run-time. Doing this also allows you to change the behavior of a function depending on the type of the input. As an example, this naive implementation of `abs' returns the absolute value of the input if it is a real number, and the length of the input if it is a complex number. function a = abs (x) if (isreal (x)) a = sign (x) .* x; elseif (iscomplex (x)) a = sqrt (real(x).^2 + imag(x).^2); endif endfunction The following functions are available for determining the type of a variable. -- Built-in Function: isnumeric (X) Return nonzero if X is a numeric object. -- Built-in Function: isreal (X) Return true if X is a real-valued numeric object. -- Built-in Function: isfloat (X) Return true if X is a floating-point numeric object. -- Built-in Function: iscomplex (X) Return true if X is a complex-valued numeric object. -- Built-in Function: ismatrix (A) Return 1 if A is a matrix. Otherwise, return 0. -- Function File: isvector (A) Return 1 if A is a vector. Otherwise, return 0. *See also:* *note size: doc-size, *note rows: doc-rows, *note columns: doc-columns, *note length: doc-length, *note isscalar: doc-isscalar, *note ismatrix: doc-ismatrix. -- Function File: isscalar (A) Return 1 if A is a scalar. Otherwise, return 0. *See also:* *note size: doc-size, *note rows: doc-rows, *note columns: doc-columns, *note length: doc-length, *note isscalar: doc-isscalar, *note ismatrix: doc-ismatrix. -- Function File: issquare (X) If X is a square matrix, then return the dimension of X. Otherwise, return 0. *See also:* *note size: doc-size, *note rows: doc-rows, *note columns: doc-columns, *note length: doc-length, *note ismatrix: doc-ismatrix, *note isscalar: doc-isscalar, *note isvector: doc-isvector. -- Function File: issymmetric (X, TOL) If X is symmetric within the tolerance specified by TOL, then return the dimension of X. Otherwise, return 0. If TOL is omitted, use a tolerance equal to the machine precision. Matrix X is considered symmetric if `norm (X - X.', inf) / norm (X, inf) < TOL'. *See also:* *note size: doc-size, *note rows: doc-rows, *note columns: doc-columns, *note length: doc-length, *note ismatrix: doc-ismatrix, *note isscalar: doc-isscalar, *note issquare: doc-issquare, *note isvector: doc-isvector. -- Function File: isdefinite (X, TOL) Return 1 if X is symmetric positive definite within the tolerance specified by TOL or 0 if X is symmetric positive semidefinite. Otherwise, return -1. If TOL is omitted, use a tolerance equal to 100 times the machine precision. *See also:* *note issymmetric: doc-issymmetric. -- Built-in Function: islogical (X) Return true if X is a logical object. -- Function File: isprime (N) Return true if N is a prime number, false otherwise. Something like the following is much faster if you need to test a lot of small numbers: T = ismember (N, primes (max (N (:)))); If max(n) is very large, then you should be using special purpose factorization code. *See also:* *note primes: doc-primes, *note factor: doc-factor, *note gcd: doc-gcd, *note lcm: doc-lcm.  File: octave.info, Node: Strings, Next: Data Containers, Prev: Numeric Data Types, Up: Top 5 Strings ********* A "string constant" consists of a sequence of characters enclosed in either double-quote or single-quote marks. For example, both of the following expressions "parrot" 'parrot' represent the string whose contents are `parrot'. Strings in Octave can be of any length. Since the single-quote mark is also used for the transpose operator (*note Arithmetic Ops::) but double-quote marks have no other purpose in Octave, it is best to use double-quote marks to denote strings. Strings can be concatenated using the notation for defining matrices. For example, the expression [ "foo" , "bar" , "baz" ] produces the string whose contents are `foobarbaz'. *Note Numeric Data Types::, for more information about creating matrices. * Menu: * Escape Sequences in string constants:: * Character Arrays:: * Creating Strings:: * Comparing Strings:: * Manipulating Strings:: * String Conversions:: * Character Class Functions::  File: octave.info, Node: Escape Sequences in string constants, Next: Character Arrays, Up: Strings 5.1 Escape Sequences in string constants ======================================== In double-quoted strings, the backslash character is used to introduce "escape sequences" that represent other characters. For example, `\n' embeds a newline character in a double-quoted string and `\"' embeds a double quote character. In single-quoted strings, backslash is not a special character. Here is an example showing the difference: toascii ("\n") => 10 toascii ('\n') => [ 92 110 ] Here is a table of all the escape sequences used in Octave (within double quoted strings). They are the same as those used in the C programming language. `\\' Represents a literal backslash, `\'. `\"' Represents a literal double-quote character, `"'. `\'' Represents a literal single-quote character, `''. `\0' Represents the "nul" character, control-@, ASCII code 0. `\a' Represents the "alert" character, control-g, ASCII code 7. `\b' Represents a backspace, control-h, ASCII code 8. `\f' Represents a formfeed, control-l, ASCII code 12. `\n' Represents a newline, control-j, ASCII code 10. `\r' Represents a carriage return, control-m, ASCII code 13. `\t' Represents a horizontal tab, control-i, ASCII code 9. `\v' Represents a vertical tab, control-k, ASCII code 11. In a single-quoted string there is only one escape sequence: you may insert a single quote character using two single quote characters in succession. For example, 'I can''t escape' => I can't escape  File: octave.info, Node: Character Arrays, Next: Creating Strings, Prev: Escape Sequences in string constants, Up: Strings 5.2 Character Arrays ==================== The string representation used by Octave is an array of characters, so internally the string "dddddddddd" is actually a row vector of length 10 containing the value 100 in all places (100 is the ASCII code of "d"). This lends itself to the obvious generalization to character matrices. Using a matrix of characters, it is possible to represent a collection of same-length strings in one variable. The convention used in Octave is that each row in a character matrix is a separate string, but letting each column represent a string is equally possible. The easiest way to create a character matrix is to put several strings together into a matrix. collection = [ "String #1"; "String #2" ]; This creates a 2-by-9 character matrix. The function `ischar' can be used to test if an object is a character matrix. -- Built-in Function: ischar (A) Return 1 if A is a character array. Otherwise, return 0. To test if an object is a string (i.e., a character vector and not a character matrix) you can use the `ischar' function in combination with the `isvector' function as in the following example: ischar(collection) => ans = 1 ischar(collection) && isvector(collection) => ans = 0 ischar("my string") && isvector("my string") => ans = 1 One relevant question is, what happens when a character matrix is created from strings of different length. The answer is that Octave puts blank characters at the end of strings shorter than the longest string. It is possible to use a different character than the blank character using the `string_fill_char' function. -- Built-in Function: VAL = string_fill_char () -- Built-in Function: OLD_VAL = string_fill_char (NEW_VAL) Query or set the internal variable used to pad all rows of a character matrix to the same length. It must be a single character. The default value is `" "' (a single space). For example, string_fill_char ("X"); [ "these"; "are"; "strings" ] => "theseXX" "areXXXX" "strings" This shows a problem with character matrices. It simply isn't possible to represent strings of different lengths. The solution is to use a cell array of strings, which is described in *note Cell Arrays of Strings::.  File: octave.info, Node: Creating Strings, Next: Comparing Strings, Prev: Character Arrays, Up: Strings 5.3 Creating Strings ==================== The easiest way to create a string is, as illustrated in the introduction, to enclose a text in double-quotes or single-quotes. It is however possible to create a string without actually writing a text. The function `blanks' creates a string of a given length consisting only of blank characters (ASCII code 32). -- Function File: blanks (N) Return a string of N blanks, for example: blanks(10); whos ans; => Attr Name Size Bytes Class ==== ==== ==== ===== ===== ans 1x10 10 char *See also:* *note repmat: doc-repmat. * Menu: * Concatenating Strings:: * Conversion of Numerical Data to Strings::  File: octave.info, Node: Concatenating Strings, Next: Conversion of Numerical Data to Strings, Up: Creating Strings 5.3.1 Concatenating Strings --------------------------- It has been shown above that strings can be concatenated using matrix notation (*note Strings::, *note Character Arrays::). Apart from that, there are several functions to concatenate string objects: `char', `strvcat', `strcat' and `cstrcat'. In addition, the general purpose concatenation functions can be used: see *note cat: doc-cat, *note horzcat: doc-horzcat. and *note vertcat: doc-vertcat. * All string concatenation functions except `cstrcat' convert numerical input into character data by taking the corresponding ASCII character for each element, as in the following example: char([98, 97, 110, 97, 110, 97]) => ans = banana * `char' and `strvcat' concatenate vertically, while `strcat' and `cstrcat' concatenate horizontally. For example: char("an apple", "two pears") => ans = an apple two pears strcat("oc", "tave", " is", " good", " for you") => ans = octave is good for you * `char' generates an empty row in the output for each empty string in the input. `strvcat', on the other hand, eliminates empty strings. char("orange", "green", "", "red") => ans = orange green red strvcat("orange", "green", "", "red") => ans = orange green red * All string concatenation functions except `cstrcat' also accept cell array data (*note Cell Arrays::). `char' and `strvcat' convert cell arrays into character arrays, while `strcat' concatenates within the cells of the cell arrays: char({"red", "green", "", "blue"}) => ans = red green blue strcat({"abc"; "ghi"}, {"def"; "jkl"}) => ans = { [1,1] = abcdef [2,1] = ghijkl } * `strcat' removes trailing white space in the arguments (except within cell arrays), while `cstrcat' leaves white space untouched. Both kinds of behavior can be useful as can be seen in the examples: strcat(["dir1";"directory2"], ["/";"/"], ["file1";"file2"]) => ans = dir1/file1 directory2/file2 cstrcat(["thirteen apples"; "a banana"], [" 5$";" 1$"]) => ans = thirteen apples 5$ a banana 1$ Note that in the above example for `cstrcat', the white space originates from the internal representation of the strings in a string array (*note Character Arrays::). -- Built-in Function: char (X) -- Built-in Function: char (CELL_ARRAY) -- Built-in Function: char (S1, S2, ...) Create a string array from one or more numeric matrices, character matrices or cell arrays. For numerical input, each element is converted to the corresponding ASCII character. The arguments (and elements of cell array(s)) are concatenated vertically. The returned values are padded with blanks as needed to make each row of the string array have the same length. Empty strings are not removed. For example, char ([97, 98, 99], "", {"98", "99", 100}, ["num", "bers"]) => ["abc " " " "98 " "99 " "d " "numbers"] -- Built-in Function: strvcat (X) -- Built-in Function: strvcat (CELL_ARRAY) -- Built-in Function: strvcat (S1, S2, ...) Create a character array from one or more numeric matrices, character matrices or cell arrays. For numerical input, each element is converted to the corresponding ASCII character. The arguments (and elements of cell array(s)) are concatenated vertically. The returned values are padded with blanks as needed to make each row of the string array have the same length. Unlike `char', empty strings are removed. For example, strvcat ([97, 98, 99], "", {"98", "99", 100}, ["num", "bers"]) => ["abc " "98 " "99 " "d " "numbers"] *See also:* *note char: doc-char, *note strcat: doc-strcat, *note cstrcat: doc-cstrcat. -- Function File: strcat (S1, S2, ...) Return a string containing all the arguments concatenated horizontally. If the arguments are cells strings, `strcat' returns a cell string with the individual cells concatenated. For numerical input, each element is converted to the corresponding ASCII character. Trailing white space is eliminated. For example, s = [ "ab"; "cde" ]; strcat (s, s, s) => ans = "ab ab ab " "cdecdecde" s = { "ab"; "cde" }; strcat (s, s, s) => ans = { [1,1] = ababab [2,1] = cdecdecde } *See also:* *note cstrcat: doc-cstrcat, *note char: doc-char, *note strvcat: doc-strvcat. -- Function File: cstrcat (S1, S2, ...) Return a string containing all the arguments concatenated horizontally. Trailing white space is preserved. For example, cstrcat ("ab ", "cd") => "ab cd" s = [ "ab"; "cde" ]; cstrcat (s, s, s) => ans = "ab ab ab " "cdecdecde" *See also:* *note strcat: doc-strcat, *note char: doc-char, *note strvcat: doc-strvcat.  File: octave.info, Node: Conversion of Numerical Data to Strings, Prev: Concatenating Strings, Up: Creating Strings 5.3.2 Conversion of Numerical Data to Strings --------------------------------------------- Apart from the string concatenation functions (*note Concatenating Strings::) which cast numerical data to the corresponding ASCII characters, there are several functions that format numerical data as strings. `mat2str' and `num2str' convert real or complex matrices, while `int2str' converts integer matrices. `int2str' takes the real part of complex values and round fractional values to integer. A more flexible way to format numerical data as strings is the `sprintf' function (*note Formatted Output::, *note doc-sprintf::). -- Function File: S = mat2str (X, N) -- Function File: S = mat2str (..., 'class') Format real/complex numerical matrices as strings. This function returns values that are suitable for the use of the `eval' function. The precision of the values is given by N. If N is a scalar then both real and imaginary parts of the matrix are printed to the same precision. Otherwise `N (1)' defines the precision of the real part and `N (2)' defines the precision of the imaginary part. The default for N is 17. If the argument 'class' is given, then the class of X is included in the string in such a way that the eval will result in the construction of a matrix of the same class. mat2str ([ -1/3 + i/7; 1/3 - i/7 ], [4 2]) => "[-0.3333+0.14i;0.3333-0.14i]" mat2str ([ -1/3 +i/7; 1/3 -i/7 ], [4 2]) => "[-0.3333+0i,0+0.14i;0.3333+0i,-0-0.14i]" mat2str (int16([1 -1]), 'class') => "int16([1,-1])" *See also:* *note sprintf: doc-sprintf, *note num2str: doc-num2str, *note int2str: doc-int2str. -- Function File: num2str (X) -- Function File: num2str (X, PRECISION) -- Function File: num2str (X, FORMAT) Convert a number (or array) to a string (or a character array). The optional second argument may either give the number of significant digits (PRECISION) to be used in the output or a format template string (FORMAT) as in `sprintf' (*note Formatted Output::). `num2str' can also handle complex numbers. For example: num2str (123.456) => "123.46" num2str (123.456, 4) => "123.5" s = num2str ([1, 1.34; 3, 3.56], "%5.1f") => s = 1.0 1.3 3.0 3.6 whos s => Attr Name Size Bytes Class ==== ==== ==== ===== ===== s 2x8 16 char num2str (1.234 + 27.3i) => "1.234+27.3i" The `num2str' function is not very flexible. For better control over the results, use `sprintf' (*note Formatted Output::). Note that for complex X, the format string may only contain one output conversion specification and nothing else. Otherwise, you will get unpredictable results. *See also:* *note sprintf: doc-sprintf, *note int2str: doc-int2str, *note mat2str: doc-mat2str. -- Function File: int2str (N) Convert an integer (or array of integers) to a string (or a character array). int2str (123) => "123" s = int2str ([1, 2, 3; 4, 5, 6]) => s = 1 2 3 4 5 6 whos s => s = Attr Name Size Bytes Class ==== ==== ==== ===== ===== s 2x7 14 char This function is not very flexible. For better control over the results, use `sprintf' (*note Formatted Output::). *See also:* *note sprintf: doc-sprintf, *note num2str: doc-num2str, *note mat2str: doc-mat2str.  File: octave.info, Node: Comparing Strings, Next: Manipulating Strings, Prev: Creating Strings, Up: Strings 5.4 Comparing Strings ===================== Since a string is a character array, comparisons between strings work element by element as the following example shows: GNU = "GNU's Not UNIX"; spaces = (GNU == " ") => spaces = 0 0 0 0 0 1 0 0 0 1 0 0 0 0 To determine if two strings are identical it is necessary to use the `strcmp' function. It compares complete strings and is case sensitive. `strncmp' compares only the first `N' characters (with `N' given as a parameter). `strcmpi' and `strncmpi' are the corresponding functions for case-insensitive comparison. -- Built-in Function: strcmp (S1, S2) Return 1 if the character strings S1 and S2 are the same, and 0 otherwise. If either S1 or S2 is a cell array of strings, then an array of the same size is returned, containing the values described above for every member of the cell array. The other argument may also be a cell array of strings (of the same size or with only one element), char matrix or character string. *Caution:* For compatibility with MATLAB, Octave's strcmp function returns 1 if the character strings are equal, and 0 otherwise. This is just the opposite of the corresponding C library function. *See also:* *note strcmpi: doc-strcmpi, *note strncmp: doc-strncmp, *note strncmpi: doc-strncmpi. -- Built-in Function: strncmp (S1, S2, N) Return 1 if the first N characters of strings S1 and S2 are the same, and 0 otherwise. strncmp ("abce", "abcd", 3) => 1 If either S1 or S2 is a cell array of strings, then an array of the same size is returned, containing the values described above for every member of the cell array. The other argument may also be a cell array of strings (of the same size or with only one element), char matrix or character string. strncmp ("abce", {"abcd", "bca", "abc"}, 3) => [1, 0, 1] *Caution:* For compatibility with MATLAB, Octave's strncmp function returns 1 if the character strings are equal, and 0 otherwise. This is just the opposite of the corresponding C library function. *See also:* *note strncmpi: doc-strncmpi, *note strcmp: doc-strcmp, *note strcmpi: doc-strcmpi. -- Function File: strcmpi (S1, S2) Ignoring case, return 1 if the character strings (or character arrays) S1 and S2 are the same, and 0 otherwise. If either S1 or S2 is a cell array of strings, then an array of the same size is returned, containing the values described above for every member of the cell array. The other argument may also be a cell array of strings (of the same size or with only one element), char matrix or character string. *Caution:* For compatibility with MATLAB, Octave's strcmpi function returns 1 if the character strings are equal, and 0 otherwise. This is just the opposite of the corresponding C library function. *See also:* *note strcmp: doc-strcmp, *note strncmp: doc-strncmp, *note strncmpi: doc-strncmpi. -- Function File: strncmpi (S1, S2, N) Ignoring case, return 1 if the first N characters of character strings (or character arrays) S1 and S2 are the same, and 0 otherwise. If either S1 or S2 is a cell array of strings, then an array of the same size is returned, containing the values described above for every member of the cell array. The other argument may also be a cell array of strings (of the same size or with only one element), char matrix or character string. *Caution:* For compatibility with MATLAB, Octave's strncmpi function returns 1 if the character strings are equal, and 0 otherwise. This is just the opposite of the corresponding C library function. *See also:* *note strcmp: doc-strcmp, *note strcmpi: doc-strcmpi, *note strncmp: doc-strncmp. -- Function File: VALIDSTR = validatestring (STR, STRARRAY) -- Function File: VALIDSTR = validatestring (STR, STRARRAY, FUNCNAME) -- Function File: VALIDSTR = validatestring (STR, STRARRAY, FUNCNAME, VARNAME) -- Function File: VALIDSTR = validatestring (..., POSITION) Verify that STR is a string or substring of an element of STRARRAY. STR is a character string to be tested, and STRARRAY is a cellstr of valid values. VALIDSTR will be the validated form of STR where validation is defined as STR being a member or substring of VALIDSTR. If STR is a substring of VALIDSTR and there are multiple matches, the shortest match will be returned if all matches are substrings of each other, and an error will be raised if the matches are not substrings of each other. All comparisons are case insensitive. *See also:* *note strcmp: doc-strcmp, *note strcmpi: doc-strcmpi.  File: octave.info, Node: Manipulating Strings, Next: String Conversions, Prev: Comparing Strings, Up: Strings 5.5 Manipulating Strings ======================== Octave supports a wide range of functions for manipulating strings. Since a string is just a matrix, simple manipulations can be accomplished using standard operators. The following example shows how to replace all blank characters with underscores. quote = ... "First things first, but not necessarily in that order"; quote( quote == " " ) = "_" => quote = First_things_first,_but_not_necessarily_in_that_order For more complex manipulations, such as searching, replacing, and general regular expressions, the following functions come with Octave. -- Function File: deblank (S) Remove trailing blanks and nulls from S. If S is a matrix, DEBLANK trims each row to the length of longest string. If S is a cell array, operate recursively on each element of the cell array. -- Function File: strtrim (S) Remove leading and trailing blanks and nulls from S. If S is a matrix, STRTRIM trims each row to the length of longest string. If S is a cell array, operate recursively on each element of the cell array. For example: strtrim (" abc ") => "abc" strtrim ([" abc "; " def "]) => ["abc "; " def"] -- Function File: strtrunc (S, N) Truncate the character string S to length N. If S is a char matrix, then the number of columns is adjusted. If S is a cell array of strings, then the operation is performed on its members and the new cell array is returned. -- Function File: findstr (S, T, OVERLAP) Return the vector of all positions in the longer of the two strings S and T where an occurrence of the shorter of the two starts. If the optional argument OVERLAP is nonzero, the returned vector can include overlapping positions (this is the default). For example, findstr ("ababab", "a") => [1, 3, 5] findstr ("abababa", "aba", 0) => [1, 5] *See also:* *note strfind: doc-strfind, *note strmatch: doc-strmatch, *note strcmp: doc-strcmp, *note strncmp: doc-strncmp, *note strcmpi: doc-strcmpi, *note strncmpi: doc-strncmpi, *note find: doc-find. -- Function File: IDX = strchr (STR, CHARS) -- Function File: IDX = strchr (STR, CHARS, N) -- Function File: IDX = strchr (STR, CHARS, N, DIRECTION) Search for the string STR for occurrences of characters from the set CHARS. The return value, as well as the N and DIRECTION arguments behave identically as in `find'. This will be faster than using regexp in most cases. *See also:* *note find: doc-find. -- Function File: index (S, T) -- Function File: index (S, T, DIRECTION) Return the position of the first occurrence of the string T in the string S, or 0 if no occurrence is found. For example, index ("Teststring", "t") => 4 If DIRECTION is `"first"', return the first element found. If DIRECTION is `"last"', return the last element found. The `rindex' function is equivalent to `index' with DIRECTION set to `"last"'. *Caution:* This function does not work for arrays of character strings. *See also:* *note find: doc-find, *note rindex: doc-rindex. -- Function File: rindex (S, T) Return the position of the last occurrence of the character string T in the character string S, or 0 if no occurrence is found. For example, rindex ("Teststring", "t") => 6 *Caution:* This function does not work for arrays of character strings. *See also:* *note find: doc-find, *note index: doc-index. -- Function File: IDX = strfind (STR, PATTERN) -- Function File: IDX = strfind (CELLSTR, PATTERN) Search for PATTERN in the string STR and return the starting index of every such occurrence in the vector IDX. If there is no such occurrence, or if PATTERN is longer than STR, then IDX is the empty array `[]'. If the cell array of strings CELLSTR is specified instead of the string STR, then IDX is a cell array of vectors, as specified above. Examples: strfind ("abababa", "aba") => [1, 3, 5] strfind ({"abababa", "bebebe", "ab"}, "aba") => ans = { [1,1] = 1 3 5 [1,2] = [](1x0) [1,3] = [](1x0) } *See also:* *note findstr: doc-findstr, *note strmatch: doc-strmatch, *note strcmp: doc-strcmp, *note strncmp: doc-strncmp, *note strcmpi: doc-strcmpi, *note strncmpi: doc-strncmpi, *note find: doc-find. -- Function File: strmatch (S, A, "exact") Return indices of entries of A that match the string S. The second argument A may be a string matrix or a cell array of strings. If the third argument `"exact"' is not given, then S only needs to match A up to the length of S. Nul characters match blanks. Results are returned as a column vector. For example: strmatch ("apple", "apple juice") => 1 strmatch ("apple", ["apple pie"; "apple juice"; "an apple"]) => [1; 2] strmatch ("apple", {"apple pie"; "apple juice"; "tomato"}) => [1; 2] *See also:* *note strfind: doc-strfind, *note findstr: doc-findstr, *note strcmp: doc-strcmp, *note strncmp: doc-strncmp, *note strcmpi: doc-strcmpi, *note strncmpi: doc-strncmpi, *note find: doc-find. -- Function File: [TOK, REM] = strtok (STR, DELIM) Find all characters up to but not including the first character which is in the string delim. If REM is requested, it contains the remainder of the string, starting at the first delimiter. Leading delimiters are ignored. If DELIM is not specified, space is assumed. For example: strtok ("this is the life") => "this" [tok, rem] = strtok ("14*27+31", "+-*/") => tok = 14 rem = *27+31 *See also:* *note index: doc-index, *note strsplit: doc-strsplit. -- Function File: [S] = strsplit (P, SEP, STRIP_EMPTY) Split a single string using one or more delimiters and return a cell array of strings. Consecutive delimiters and delimiters at boundaries result in empty strings, unless STRIP_EMPTY is true. The default value of STRIP_EMPTY is false. *See also:* *note strtok: doc-strtok. -- Function File: strrep (S, X, Y) Replace all occurrences of the substring X of the string S with the string Y and return the result. For example, strrep ("This is a test string", "is", "&%$") => "Th&%$ &%$ a test string" *See also:* *note regexprep: doc-regexprep, *note strfind: doc-strfind, *note findstr: doc-findstr. -- Function File: substr (S, OFFSET, LEN) Return the substring of S which starts at character number OFFSET and is LEN characters long. If OFFSET is negative, extraction starts that far from the end of the string. If LEN is omitted, the substring extends to the end of S. For example, substr ("This is a test string", 6, 9) => "is a test" This function is patterned after AWK. You can get the same result by `S(OFFSET : (OFFSET + LEN - 1))'. -- Loadable Function: [S, E, TE, M, T, NM] = regexp (STR, PAT) -- Loadable Function: [...] = regexp (STR, PAT, OPTS, ...) Regular expression string matching. Matches PAT in STR and returns the position and matching substrings or empty values if there are none. The matched pattern PAT can include any of the standard regex operators, including: `.' Match any character `* + ? {}' Repetition operators, representing `*' Match zero or more times `+' Match one or more times `?' Match zero or one times `{}' Match range operator, which is of the form `{N}' to match exactly N times, `{M,}' to match M or more times, `{M,N}' to match between M and N times. `[...] [^...]' List operators, where for example `[ab]c' matches `ac' and `bc' `()' Grouping operator `|' Alternation operator. Match one of a choice of regular expressions. The alternatives must be delimited by the grouping operator `()' above `^ $' Anchoring operator. `^' matches the start of the string STR and `$' the end In addition the following escaped characters have special meaning. It should be noted that it is recommended to quote PAT in single quotes rather than double quotes, to avoid the escape sequences being interpreted by Octave before being passed to `regexp'. `\b' Match a word boundary `\B' Match within a word `\w' Matches any word character `\W' Matches any non word character `\<' Matches the beginning of a word `\>' Matches the end of a word `\s' Matches any whitespace character `\S' Matches any non whitespace character `\d' Matches any digit `\D' Matches any non-digit The outputs of `regexp' by default are in the order as given below S The start indices of each of the matching substrings E The end indices of each matching substring TE The extents of each of the matched token surrounded by `(...)' in PAT. M A cell array of the text of each match. T A cell array of the text of each token matched. NM A structure containing the text of each matched named token, with the name being used as the fieldname. A named token is denoted as `(?...)' Particular output arguments or the order of the output arguments can be selected by additional OPTS arguments. These are strings and the correspondence between the output arguments and the optional argument are 'start' S 'end' E 'tokenExtents' TE 'match' M 'tokens' T 'names' NM A further optional argument is 'once', that limits the number of returned matches to the first match. Additional arguments are matchcase Make the matching case sensitive. ignorecase Make the matching case insensitive. stringanchors Match the anchor characters at the beginning and end of the string. lineanchors Match the anchor characters at the beginning and end of the line. dotall The character `.' matches the newline character. dotexceptnewline The character `.' matches all but the newline character. freespacing The pattern can include arbitrary whitespace and comments starting with `#'. literalspacing The pattern is taken literally. *See also:* *note regexpi: doc-regexpi, *note regexprep: doc-regexprep. -- Loadable Function: [S, E, TE, M, T, NM] = regexpi (STR, PAT) -- Loadable Function: [...] = regexpi (STR, PAT, OPTS, ...) Case insensitive regular expression string matching. Matches PAT in STR and returns the position and matching substrings or empty values if there are none. *Note regexp: doc-regexp, for more details -- Loadable Function: STRING = regexprep (STRING, PAT, REPSTR, OPTIONS) Replace matches of PAT in STRING with REPSTR. The replacement can contain `$i', which substitutes for the ith set of parentheses in the match string. E.g., regexprep("Bill Dunn",'(\w+) (\w+)','$2, $1') returns "Dunn, Bill" OPTIONS may be zero or more of `once' Replace only the first occurrence of PAT in the result. `warnings' This option is present for compatibility but is ignored. `ignorecase or matchcase' Ignore case for the pattern matching (see `regexpi'). Alternatively, use (?i) or (?-i) in the pattern. `lineanchors and stringanchors' Whether characters ^ and $ match the beginning and ending of lines. Alternatively, use (?m) or (?-m) in the pattern. `dotexceptnewline and dotall' Whether . matches newlines in the string. Alternatively, use (?s) or (?-s) in the pattern. `freespacing or literalspacing' Whether whitespace and # comments can be used to make the regular expression more readable. Alternatively, use (?x) or (?-x) in the pattern. *See also:* *note regexp: doc-regexp, *note regexpi: doc-regexpi, *note strrep: doc-strrep. -- Function File: regexptranslate (OP, S) Translate a string for use in a regular expression. This might include either wildcard replacement or special character escaping. The behavior can be controlled by the OP that can have the values "wildcard" The wildcard characters `.', `*' and `?' are replaced with wildcards that are appropriate for a regular expression. For example: regexptranslate ("wildcard", "*.m") => ".*\.m" "escape" The characters `$.?[]', that have special meaning for regular expressions are escaped so that they are treated literally. For example: regexptranslate ("escape", "12.5") => "12\.5" *See also:* *note regexp: doc-regexp, *note regexpi: doc-regexpi, *note regexprep: doc-regexprep.  File: octave.info, Node: String Conversions, Next: Character Class Functions, Prev: Manipulating Strings, Up: Strings 5.6 String Conversions ====================== Octave supports various kinds of conversions between strings and numbers. As an example, it is possible to convert a string containing a hexadecimal number to a floating point number. hex2dec ("FF") => ans = 255 -- Function File: bin2dec (S) Return the decimal number corresponding to the binary number stored in the string S. For example, bin2dec ("1110") => 14 If S is a string matrix, returns a column vector of converted numbers, one per row of S. Invalid rows evaluate to NaN. *See also:* *note dec2hex: doc-dec2hex, *note base2dec: doc-base2dec, *note dec2base: doc-dec2base, *note hex2dec: doc-hex2dec, *note dec2bin: doc-dec2bin. -- Function File: dec2bin (N, LEN) Return a binary number corresponding to the non-negative decimal number N, as a string of ones and zeros. For example, dec2bin (14) => "1110" If N is a vector, returns a string matrix, one row per value, padded with leading zeros to the width of the largest value. The optional second argument, LEN, specifies the minimum number of digits in the result. *See also:* *note bin2dec: doc-bin2dec, *note dec2base: doc-dec2base, *note base2dec: doc-base2dec, *note hex2dec: doc-hex2dec, *note dec2hex: doc-dec2hex. -- Function File: dec2hex (N, LEN) Return the hexadecimal string corresponding to the non-negative integer N. For example, dec2hex (2748) => "ABC" If N is a vector, returns a string matrix, one row per value, padded with leading zeros to the width of the largest value. The optional second argument, LEN, specifies the minimum number of digits in the result. *See also:* *note hex2dec: doc-hex2dec, *note dec2base: doc-dec2base, *note base2dec: doc-base2dec, *note bin2dec: doc-bin2dec, *note dec2bin: doc-dec2bin. -- Function File: hex2dec (S) Return the integer corresponding to the hexadecimal number stored in the string S. For example, hex2dec ("12B") => 299 hex2dec ("12b") => 299 If S is a string matrix, returns a column vector of converted numbers, one per row of S. Invalid rows evaluate to NaN. *See also:* *note dec2hex: doc-dec2hex, *note base2dec: doc-base2dec, *note dec2base: doc-dec2base, *note bin2dec: doc-bin2dec, *note dec2bin: doc-dec2bin. -- Function File: dec2base (N, B, LEN) Return a string of symbols in base B corresponding to the non-negative integer N. dec2base (123, 3) => "11120" If N is a vector, return a string matrix with one row per value, padded with leading zeros to the width of the largest value. If B is a string then the characters of B are used as the symbols for the digits of N. Space (' ') may not be used as a symbol. dec2base (123, "aei") => "eeeia" The optional third argument, LEN, specifies the minimum number of digits in the result. *See also:* *note base2dec: doc-base2dec, *note dec2bin: doc-dec2bin, *note bin2dec: doc-bin2dec, *note hex2dec: doc-hex2dec, *note dec2hex: doc-dec2hex. -- Function File: base2dec (S, B) Convert S from a string of digits of base B into an integer. base2dec ("11120", 3) => 123 If S is a matrix, returns a column vector with one value per row of S. If a row contains invalid symbols then the corresponding value will be NaN. Rows are right-justified before converting so that trailing spaces are ignored. If B is a string, the characters of B are used as the symbols for the digits of S. Space (' ') may not be used as a symbol. base2dec ("yyyzx", "xyz") => 123 *See also:* *note dec2base: doc-dec2base, *note dec2bin: doc-dec2bin, *note bin2dec: doc-bin2dec, *note hex2dec: doc-hex2dec, *note dec2hex: doc-dec2hex. -- Loadable Function: S = num2hex (N) Typecast a double precision number or vector to a 16 character hexadecimal string of the IEEE 754 representation of the number. For example num2hex ([-1, 1, e, Inf, NaN, NA]); => "bff0000000000000 3ff0000000000000 4005bf0a8b145769 7ff0000000000000 fff8000000000000 7ff00000000007a2" *See also:* *note hex2num: doc-hex2num, *note hex2dec: doc-hex2dec, *note dec2hex: doc-dec2hex. -- Loadable Function: N = hex2num (S) Typecast the 16 character hexadecimal character matrix to an IEEE 754 double precision number. If fewer than 16 characters are given the strings are right padded with '0' characters. Given a string matrix, `hex2num' treats each row as a separate number. hex2num (["4005bf0a8b145769";"4024000000000000"]) => [2.7183; 10.000] *See also:* *note num2hex: doc-num2hex, *note hex2dec: doc-hex2dec, *note dec2hex: doc-dec2hex. -- Function File: [NUM, STATUS, STRARRAY] = str2double (STR, CDELIM, RDELIM, DDELIM) Convert strings into numeric values. `str2double' can replace `str2num', but avoids the use of `eval' on unknown data. STR can be the form `[+-]d[.]dd[[eE][+-]ddd]' in which `d' can be any of digit from 0 to 9, and `[]' indicate optional elements. NUM is the corresponding numeric value. If the conversion fails, status is -1 and NUM is NaN. STATUS is 0 if the conversion was successful and -1 otherwise. STRARRAY is a cell array of strings. Elements which are not defined or not valid return NaN and the STATUS becomes -1. If STR is a character array or a cell array of strings, then NUM and STATUS return matrices of appropriate size. STR can also contain multiple elements separated by row and column delimiters (CDELIM and RDELIM). The parameters CDELIM, RDELIM, and DDELIM are optional column, row, and decimal delimiters. The default row-delimiters are newline, carriage return and semicolon (ASCII 10, 13 and 59). The default column-delimiters are tab, space and comma (ASCII 9, 32, and 44). The default decimal delimiter is `.' (ASCII 46). CDELIM, RDELIM, and DDELIM must contain only nul, newline, carriage return, semicolon, colon, slash, tab, space, comma, or `()[]{}' (ASCII 0, 9, 10, 11, 12, 13, 14, 32, 33, 34, 40, 41, 44, 47, 58, 59, 91, 93, 123, 124, 125). Examples: str2double ("-.1e-5") => -1.0000e-006 str2double (".314e1, 44.44e-1, .7; -1e+1") => 3.1400 4.4440 0.7000 -10.0000 NaN NaN line = "200, 300, NaN, -inf, yes, no, 999, maybe, NaN"; [x, status] = str2double (line) => x = 200 300 NaN -Inf NaN NaN 999 NaN NaN => status = 0 0 0 0 -1 -1 0 -1 0 *See also:* *note str2num: doc-str2num. -- Function File: strjust (S, ["left"|"right"|"center"]) Shift the non-blank text of S to the left, right or center of the string. If S is a string array, justify each string in the array. Null characters are replaced by blanks. If no justification is specified, then all rows are right-justified. For example: strjust (["a"; "ab"; "abc"; "abcd"]) => ans = a ab abc abcd -- Function File: str2num (S) Convert the string (or character array) S to a number (or an array). Examples: str2num("3.141596") => 3.141596 str2num(["1, 2, 3"; "4, 5, 6"]); => ans = 1 2 3 4 5 6 *Caution:* As `str2num' uses the `eval' function to do the conversion, `str2num' will execute any code contained in the string S. Use `str2double' instead if you want to avoid the use of `eval'. *See also:* *note str2double: doc-str2double, *note eval: doc-eval. -- Mapping Function: toascii (S) Return ASCII representation of S in a matrix. For example, toascii ("ASCII") => [ 65, 83, 67, 73, 73 ] *See also:* *note char: doc-char. -- Mapping Function: tolower (S) -- Mapping Function: lower (S) Return a copy of the string or cell string S, with each upper-case character replaced by the corresponding lower-case one; non-alphabetic characters are left unchanged. For example, tolower ("MiXeD cAsE 123") => "mixed case 123" *See also:* *note toupper: doc-toupper. -- Built-in Function: toupper (S) -- Built-in Function: upper (S) Return a copy of the string or cell string S, with each lower-case character replaced by the corresponding upper-case one; non-alphabetic characters are left unchanged. For example, toupper ("MiXeD cAsE 123") => "MIXED CASE 123" *See also:* *note tolower: doc-tolower. -- Built-in Function: do_string_escapes (STRING) Convert special characters in STRING to their escaped forms. -- Built-in Function: undo_string_escapes (S) Converts special characters in strings back to their escaped forms. For example, the expression bell = "\a"; assigns the value of the alert character (control-g, ASCII code 7) to the string variable `bell'. If this string is printed, the system will ring the terminal bell (if it is possible). This is normally the desired outcome. However, sometimes it is useful to be able to print the original representation of the string, with the special characters replaced by their escape sequences. For example, octave:13> undo_string_escapes (bell) ans = \a replaces the unprintable alert character with its printable representation.  File: octave.info, Node: Character Class Functions, Prev: String Conversions, Up: Strings 5.7 Character Class Functions ============================= Octave also provides the following character class test functions patterned after the functions in the standard C library. They all operate on string arrays and return matrices of zeros and ones. Elements that are nonzero indicate that the condition was true for the corresponding character in the string array. For example, isalpha ("!Q@WERT^Y&") => [ 0, 1, 0, 1, 1, 1, 1, 0, 1, 0 ] -- Mapping Function: isalnum (S) Return 1 for characters that are letters or digits (`isalpha (S)' or `isdigit (S)' is true). -- Mapping Function: isalpha (S) -- Mapping Function: isletter (S) Return true for characters that are letters (`isupper (S)' or `islower (S)' is true). -- Mapping Function: isascii (S) Return 1 for characters that are ASCII (in the range 0 to 127 decimal). -- Mapping Function: iscntrl (S) Return 1 for control characters. -- Mapping Function: isdigit (S) Return 1 for characters that are decimal digits. -- Mapping Function: isgraph (S) Return 1 for printable characters (but not the space character). -- Function File: isletter (S) Returns true if S is a letter, false otherwise. *See also:* *note isalpha: doc-isalpha. -- Mapping Function: islower (S) Return 1 for characters that are lower case letters. -- Mapping Function: isprint (S) Return 1 for printable characters (including the space character). -- Mapping Function: ispunct (S) Return 1 for punctuation characters. -- Mapping Function: isspace (S) Return 1 for whitespace characters (space, formfeed, newline, carriage return, tab, and vertical tab). -- Mapping Function: isupper (S) Return 1 for upper case letters. -- Mapping Function: isxdigit (S) Return 1 for characters that are hexadecimal digits. -- Function File: isstrprop (STR, PRED) Test character string properties. For example, isstrprop ("abc123", "alpha") => [1, 1, 1, 0, 0, 0] If STR is a cell array, `isstrpop' is applied recursively to each element of the cell array. Numeric arrays are converted to character strings. The second argument PRED may be one of `"alpha"' True for characters that are alphabetic `"alnum"' `"alphanum"' True for characters that are alphabetic or digits. `"ascii"' True for characters that are in the range of ASCII encoding. `"cntrl"' True for control characters. `"digit"' True for decimal digits. `"graph"' `"graphic"' True for printing characters except space. `"lower"' True for lower-case letters. `"print"' True for printing characters including space. `"punct"' True for printing characters except space or letter or digit. `"space"' `"wspace"' True for whitespace characters (space, formfeed, newline, carriage return, tab, vertical tab). `"upper"' True for upper-case letters. `"xdigit"' True for hexadecimal digits. *See also:* *note isalnum: doc-isalnum, *note isalpha: doc-isalpha, *note isascii: doc-isascii, *note iscntrl: doc-iscntrl, *note isdigit: doc-isdigit, *note isgraph: doc-isgraph, *note islower: doc-islower, *note isprint: doc-isprint, *note ispunct: doc-ispunct, *note isspace: doc-isspace, *note isupper: doc-isupper, *note isxdigit: doc-isxdigit.  File: octave.info, Node: Data Containers, Next: Variables, Prev: Strings, Up: Top 6 Data Containers ***************** Octave includes support for two different mechanisms to contain arbitrary data types in the same variable. Structures, which are C-like, and are indexed with named fields, and cell arrays, where each element of the array can have a different data type and or shape. * Menu: * Data Structures:: * Cell Arrays:: * Comma Separated Lists::  File: octave.info, Node: Data Structures, Next: Cell Arrays, Up: Data Containers 6.1 Data Structures =================== Octave includes support for organizing data in structures. The current implementation uses an associative array with indices limited to strings, but the syntax is more like C-style structures. Here are some examples of using data structures in Octave. Elements of structures can be of any value type. For example, the three expressions x.a = 1 x.b = [1, 2; 3, 4] x.c = "string" create a structure with three elements. To print the value of the structure, you can type its name, just as for any other variable: octave:2> x x = { a = 1 b = 1 2 3 4 c = string } Note that Octave may print the elements in any order. Structures may be copied. octave:1> y = x y = { a = 1 b = 1 2 3 4 c = string } Since structures are themselves values, structure elements may reference other structures. The following statements change the value of the element `b' of the structure `x' to be a data structure containing the single element `d', which has a value of 3. octave:1> x.b.d = 3 x.b.d = 3 octave:2> x.b ans = { d = 3 } octave:3> x x = { a = 1 b = { d = 3 } c = string } Note that when Octave prints the value of a structure that contains other structures, only a few levels are displayed. For example, octave:1> a.b.c.d.e = 1; octave:2> a a = { b = { c = { d: 1x1 struct } } } This prevents long and confusing output from large deeply nested structures. -- Built-in Function: VAL = struct_levels_to_print () -- Built-in Function: OLD_VAL = struct_levels_to_print (NEW_VAL) Query or set the internal variable that specifies the number of structure levels to display. Functions can return structures. For example, the following function separates the real and complex parts of a matrix and stores them in two elements of the same structure variable. octave:1> function y = f (x) > y.re = real (x); > y.im = imag (x); > endfunction When called with a complex-valued argument, `f' returns the data structure containing the real and imaginary parts of the original function argument. octave:2> f (rand (2) + rand (2) * I) ans = { im = 0.26475 0.14828 0.18436 0.83669 re = 0.040239 0.242160 0.238081 0.402523 } Function return lists can include structure elements, and they may be indexed like any other variable. For example, octave:1> [ x.u, x.s(2:3,2:3), x.v ] = svd ([1, 2; 3, 4]) x.u = -0.40455 -0.91451 -0.91451 0.40455 x.s = 0.00000 0.00000 0.00000 0.00000 5.46499 0.00000 0.00000 0.00000 0.36597 x.v = -0.57605 0.81742 -0.81742 -0.57605 It is also possible to cycle through all the elements of a structure in a loop, using a special form of the `for' statement (*note Looping Over Structure Elements::) * Menu: * Structure Arrays:: * Creating Structures:: * Manipulating Structures:: * Processing Data in Structures::  File: octave.info, Node: Structure Arrays, Next: Creating Structures, Up: Data Structures 6.1.1 Structure Arrays ---------------------- A structure array is a particular instance of a structure, where each of the fields of the structure is represented by a cell array. Each of these cell arrays has the same dimensions. An example of the creation of a structure array is x(1).a = "string1" x(2).a = "string2" x(1).b = 1 x(2).b = 2 which creates a 2-by-1 structure array with two fields. As previously, to print the value of the structure array, you can type its name: octave:1> x x = { 1x2 struct array containing the fields: a b } Individual elements of the structure array can be returned by indexing the variable like `X (1)', which returns a structure with the two fields like octave:2> x(1) ans = { a = string1 b = 1 } Furthermore, the structure array can return a comma separated list (*note Comma Separated Lists::), if indexed by one of its own field names. For example octave:3> x.a ans = string1 ans = string2 Here is another example, using this comma separated list on the left-hand side of an assignment: octave:4> [x.a] = deal("new string1", "new string2"); octave:5> x(1).a ans = new string1 octave:6> x(2).a ans = new string2 Just as for numerical arrays, it is possible to use vectors as indices (*note Index Expressions::): octave:7> x(3:4) = x(1:2); octave:8> [x([1,3]).a] = deal("other string1", "other string2"); octave:9> x.a ans = other string1 ans = new string2 ans = other string2 ans = new string2 The function `size' will return the size of the structure. For the example above octave:10> size(x) ans = 1 4 Elements can be deleted from a structure array in a similar manner to a numerical array, by assigning the elements to an empty matrix. For example in = struct ("call1", {x, Inf, "last"}, "call2", {x, Inf, "first"}); in (1, :) = [] => in = { call1 = (, [1] = Inf [2] = last ,) call2 = (, [1] = Inf [2] = first ,) }  File: octave.info, Node: Creating Structures, Next: Manipulating Structures, Prev: Structure Arrays, Up: Data Structures 6.1.2 Creating Structures ------------------------- As well as indexing a structure with ".", Octave can create a structure with the `struct' command. `struct' takes pairs of arguments, where the first argument in the pair is the fieldname to include in the structure and the second is a scalar or cell array, representing the values to include in the structure or structure array. For example struct ("field1", 1, "field2", 2) => ans = { field1 = 1 field2 = 2 } If the values passed to `struct' are a mix of scalar and cell arrays, then the scalar arguments are expanded to create a structure array with a consistent dimension. For example struct ("field1", {1, "one"}, "field2", {2, "two"}, "field3", 3) => ans = { field1 = (, [1] = 1 [2] = one ,) field2 = (, [1] = 2 [2] = two ,) field3 = (, [1] = 3 [2] = 3 ,) } -- Built-in Function: struct ("field", VALUE, "field", VALUE, ...) Create a structure and initialize its value. If the values are cell arrays, create a structure array and initialize its values. The dimensions of each cell array of values must match. Singleton cells and non-cell values are repeated so that they fill the entire array. If the cells are empty, create an empty structure array with the specified field names. If the argument is an object, return the underlying struct. -- Built-in Function: isstruct (EXPR) Return 1 if the value of the expression EXPR is a structure. Additional functions that can manipulate the fields of a structure are listed below. -- Built-in Function: rmfield (S, F) Remove field F from the structure S. If F is a cell array of character strings or a character array, remove the named fields. *See also:* *note cellstr: doc-cellstr, *note iscellstr: doc-iscellstr, *note setfield: doc-setfield. -- Function File: [K1, ..., V1] = setfield (S, K1, V1, ...) Set field members in a structure. oo(1,1).f0 = 1; oo = setfield (oo, {1,2}, "fd", {3}, "b", 6); oo(1,2).fd(3).b == 6 => ans = 1 Note that this function could be written i1 = {1,2}; i2 = "fd"; i3 = {3}; i4 = "b"; oo(i1{:}).(i2)(i3{:}).(i4) == 6; *See also:* *note getfield: doc-getfield, *note rmfield: doc-rmfield, *note isfield: doc-isfield, *note isstruct: doc-isstruct, *note fieldnames: doc-fieldnames, *note struct: doc-struct. -- Function File: [T, P] = orderfields (S1, S2) Return a struct with fields arranged alphabetically or as specified by S2 and a corresponding permutation vector. Given one struct, arrange field names in S1 alphabetically. Given two structs, arrange field names in S1 as they appear in S2. The second argument may also specify the order in a permutation vector or a cell array of strings. *See also:* *note getfield: doc-getfield, *note rmfield: doc-rmfield, *note isfield: doc-isfield, *note isstruct: doc-isstruct, *note fieldnames: doc-fieldnames, *note struct: doc-struct.  File: octave.info, Node: Manipulating Structures, Next: Processing Data in Structures, Prev: Creating Structures, Up: Data Structures 6.1.3 Manipulating Structures ----------------------------- Other functions that can manipulate the fields of a structure are given below. -- Built-in Function: fieldnames (STRUCT) Return a cell array of strings naming the elements of the structure STRUCT. It is an error to call `fieldnames' with an argument that is not a structure. -- Built-in Function: isfield (EXPR, NAME) Return true if the expression EXPR is a structure and it includes an element named NAME. The first argument must be a structure and the second must be a string. -- Function File: [V1, ...] = getfield (S, KEY, ...) Extract fields from a structure. For example ss(1,2).fd(3).b = 5; getfield (ss, {1,2}, "fd", {3}, "b") => ans = 5 Note that the function call in the previous example is equivalent to the expression i1 = {1,2}; i2 = "fd"; i3 = {3}; i4= "b"; ss(i1{:}).(i2)(i3{:}).(i4) *See also:* *note setfield: doc-setfield, *note rmfield: doc-rmfield, *note isfield: doc-isfield, *note isstruct: doc-isstruct, *note fieldnames: doc-fieldnames, *note struct: doc-struct. -- Function File: substruct (TYPE, SUBS, ...) Create a subscript structure for use with `subsref' or `subsasgn'. *See also:* *note subsref: doc-subsref, *note subsasgn: doc-subsasgn.  File: octave.info, Node: Processing Data in Structures, Prev: Manipulating Structures, Up: Data Structures 6.1.4 Processing Data in Structures ----------------------------------- The simplest way to process data in a structure is within a `for' loop (*note Looping Over Structure Elements::). A similar effect can be achieved with the `structfun' function, where a user defined function is applied to each field of the structure. -- Function File: structfun (FUNC, S) -- Function File: [A, B] = structfun (...) -- Function File: structfun (..., "ErrorHandler", ERRFUNC) -- Function File: structfun (..., "UniformOutput", VAL) Evaluate the function named NAME on the fields of the structure S. The fields of S are passed to the function FUNC individually. `structfun' accepts an arbitrary function FUNC in the form of an inline function, function handle, or the name of a function (in a character string). In the case of a character string argument, the function must accept a single argument named X, and it must return a string value. If the function returns more than one argument, they are returned as separate output variables. If the parameter "UniformOutput" is set to true (the default), then the function must return a single element which will be concatenated into the return value. If "UniformOutput" is false, the outputs placed in a structure with the same fieldnames as the input structure. s.name1 = "John Smith"; s.name2 = "Jill Jones"; structfun (@(x) regexp (x, '(\w+)$', "matches"){1}, s, "UniformOutput", false) Given the parameter "ErrorHandler", then ERRFUNC defines a function to call in case FUNC generates an error. The form of the function is function [...] = errfunc (SE, ...) where there is an additional input argument to ERRFUNC relative to FUNC, given by SE. This is a structure with the elements "identifier", "message" and "index", giving respectively the error identifier, the error message, and the index into the input arguments of the element that caused the error. *See also:* *note cellfun: doc-cellfun, *note arrayfun: doc-arrayfun. Alternatively, to process the data in a structure, the structure might be converted to another type of container before being treated. -- Built-in Function: struct2cell (S) Create a new cell array from the objects stored in the struct object. If F is the number of fields in the structure, the resulting cell array will have a dimension vector corresponding to `[F size(S)]'. *See also:* *note cell2struct: doc-cell2struct, *note fieldnames: doc-fieldnames.  File: octave.info, Node: Cell Arrays, Next: Comma Separated Lists, Prev: Data Structures, Up: Data Containers 6.2 Cell Arrays =============== It can be both necessary and convenient to store several variables of different size or type in one variable. A cell array is a container class able to do just that. In general cell arrays work just like N-dimensional arrays, with the exception of the use of `{' and `}' as allocation and indexing operators. As an example, the following code creates a cell array containing a string and a 2-by-2 random matrix c = {"a string", rand(2, 2)}; And a cell array can be indexed with the { and } operators, so the variable created in the previous example can be indexed like this c{1} => ans = a string As with numerical arrays several elements of a cell array can be extracted by indexing with a vector of indexes c{1:2} => ans = (, [1] = a string [2] = 0.593993 0.627732 0.377037 0.033643 ,) The indexing operators can also be used to insert or overwrite elements of a cell array. The following code inserts the scalar 3 on the third place of the previously created cell array c{3} = 3 => c = { [1,1] = a string [1,2] = 0.593993 0.627732 0.377037 0.033643 [1,3] = 3 } In general nested cell arrays are displayed hierarchically as above. In some circumstances it makes sense to reference them by their index, and this can be performed by the `celldisp' function. -- Function File: celldisp (C, NAME) Recursively display the contents of a cell array. By default the values are displayed with the name of the variable C. However, this name can be replaced with the variable NAME. *See also:* *note disp: doc-disp. * Menu: * Creating Cell Arrays:: * Indexing Cell Arrays:: * Cell Arrays of Strings:: * Processing Data in Cell Arrays::  File: octave.info, Node: Creating Cell Arrays, Next: Indexing Cell Arrays, Up: Cell Arrays 6.2.1 Creating Cell Array ------------------------- The introductory example showed how to create a cell array containing currently available variables. In many situations, however, it is useful to create a cell array and then fill it with data. The `cell' function returns a cell array of a given size, containing empty matrices. This function is similar to the `zeros' function for creating new numerical arrays. The following example creates a 2-by-2 cell array containing empty matrices c = cell(2,2) => c = { [1,1] = [](0x0) [2,1] = [](0x0) [1,2] = [](0x0) [2,2] = [](0x0) } Just like numerical arrays, cell arrays can be multidimensional. The `cell' function accepts any number of positive integers to describe the size of the returned cell array. It is also possible to set the size of the cell array through a vector of positive integers. In the following example two cell arrays of equal size are created, and the size of the first one is displayed c1 = cell(3, 4, 5); c2 = cell( [3, 4, 5] ); size(c1) => ans = 3 4 5 As can be seen, the `size' function also works for cell arrays. As do the other functions describing the size of an object, such as `length', `numel', `rows', and `columns'. As an alternative to creating empty cell arrays, and then filling them, it is possible to convert numerical arrays into cell arrays using the `num2cell' and `mat2cell' functions. -- Built-in Function: cell (X) -- Built-in Function: cell (N, M) Create a new cell array object. If invoked with a single scalar argument, `cell' returns a square cell array with the dimension specified. If you supply two scalar arguments, `cell' takes them to be the number of rows and columns. If given a vector with two elements, `cell' uses the values of the elements as the number of rows and columns, respectively. -- Built-in Function: iscell (X) Return true if X is a cell array object. Otherwise, return false. -- Loadable Function: C = num2cell (M) -- Loadable Function: C = num2cell (M, DIM) Convert the matrix M into a cell array. If DIM is defined, the value C is of dimension 1 in this dimension and the elements of M are placed in slices in C. *See also:* *note mat2cell: doc-mat2cell. -- Loadable Function: B = mat2cell (A, M, N) -- Loadable Function: B = mat2cell (A, D1, D2, ...) -- Loadable Function: B = mat2cell (A, R) Convert the matrix A to a cell array. If A is 2-D, then it is required that `sum (M) == size (A, 1)' and `sum (N) == size (A, 2)'. Similarly, if A is a multi-dimensional and the number of dimensional arguments is equal to the dimensions of A, then it is required that `sum (DI) == size (A, i)'. Given a single dimensional argument R, the other dimensional arguments are assumed to equal `size (A,I)'. An example of the use of mat2cell is mat2cell (reshape(1:16,4,4),[3,1],[3,1]) => { [1,1] = 1 5 9 2 6 10 3 7 11 [2,1] = 4 8 12 [1,2] = 13 14 15 [2,2] = 16 } *See also:* *note num2cell: doc-num2cell, *note cell2mat: doc-cell2mat.  File: octave.info, Node: Indexing Cell Arrays, Next: Cell Arrays of Strings, Prev: Creating Cell Arrays, Up: Cell Arrays 6.2.2 Indexing Cell Arrays -------------------------- As shown in the introductory example elements can be inserted from cell arrays using the `{' and `}' operators. Besides the change of operators, indexing works for cell arrays like for multidimensional arrays. As an example, all the rows of the first and third column of a cell array can be set to `0' with the following code c{:, [1, 3]} = 0; Accessing values in a cell array is, however, different from the same operation for numerical arrays. Accessing a single element of a cell array is very similar to numerical arrays, for example element = c{1, 2}; This will, however, _not_ work when accessing multiple elements of a cell array, because it might not be possible to represent all elements with a single variable as is the case with numerical arrays. Accessing multiple elements of a cell array with the `{' and `}' operators will result in a comma-separated list (*note Comma Separated Lists::) of all the requested elements as discussed later. One distinction between `{' and `(' to index cell arrays is in the deletion of elements from the cell array. In a similar manner to a numerical array the `()' operator can be used to delete elements from the cell array. The `{}' operator however will remove the elements of the cell array, but not delete the space for them. For example x = {"1", "2"; "3", "4"}; x{1, :} = [] => x = { [1,1] = [](0x0) [2,1] = 3 [1,2] = [](0x0) [2,2] = 4 } x(1, :) = [] => x = { [1,1] = 3 [1,2] = 4 }  File: octave.info, Node: Cell Arrays of Strings, Next: Processing Data in Cell Arrays, Prev: Indexing Cell Arrays, Up: Cell Arrays 6.2.3 Cell Arrays of Strings ---------------------------- One common use of cell arrays is to store multiple strings in the same variable. It is possible to store multiple strings in a character matrix by letting each row be a string. This, however, introduces the problem that all strings must be of equal length. Therefore it is recommended to use cell arrays to store multiple strings. If, however, the character matrix representation is required for an operation, it can be converted to a cell array of strings using the `cellstr' function a = ["hello"; "world"]; c = cellstr (a) => c = { [1,1] = hello [2,1] = world } One further advantage of using cell arrays to store multiple strings is that most functions for string manipulations included with Octave support this representation. As an example, it is possible to compare one string with many others using the `strcmp' function. If one of the arguments to this function is a string and the other is a cell array of strings, each element of the cell array will be compared the string argument, c = {"hello", "world"}; strcmp ("hello", c) => ans = 1 0 The following functions for string manipulation support cell arrays of strings, `strcmp', `strcmpi', `strncmp', `strncmpi', `str2double', `char', `strappend', `strtrunc', `strvcat', `strfind', and `strmatch'. -- Built-in Function: cellstr (STRING) Create a new cell array object from the elements of the string array STRING. -- Built-in Function: iscellstr (CELL) Return true if every element of the cell array CELL is a character string -- Function File: [IDXVEC, ERRMSG] = cellidx (LISTVAR, STRLIST) Return indices of string entries in LISTVAR that match strings in STRLIST. Both LISTVAR and STRLIST may be passed as strings or string matrices. If they are passed as string matrices, each entry is processed by `deblank' prior to searching for the entries. The first output is the vector of indices in LISTVAR. If STRLIST contains a string not in LISTVAR, then an error message is returned in ERRMSG. If only one output argument is requested, then CELLIDX prints ERRMSG to the screen and exits with an error.  File: octave.info, Node: Processing Data in Cell Arrays, Prev: Cell Arrays of Strings, Up: Cell Arrays 6.2.4 Processing Data in Cell Arrays ------------------------------------ Data that is stored in a cell array can be processed in several ways depending on the actual data. The simplest way to process that data is to iterate through it using one or more `for' loops. The same idea can be implemented more easily through the use of the `cellfun' function that calls a user-specified function on all elements of a cell array. -- Loadable Function: cellfun (NAME, C) -- Loadable Function: cellfun ("size", C, K) -- Loadable Function: cellfun ("isclass", C, CLASS) -- Loadable Function: cellfun (FUNC, C) -- Loadable Function: cellfun (FUNC, C, D) -- Loadable Function: [A, B] = cellfun (...) -- Loadable Function: cellfun (..., 'ErrorHandler', ERRFUNC) -- Loadable Function: cellfun (..., 'UniformOutput', VAL) Evaluate the function named NAME on the elements of the cell array C. Elements in C are passed on to the named function individually. The function NAME can be one of the functions `isempty' Return 1 for empty elements. `islogical' Return 1 for logical elements. `isreal' Return 1 for real elements. `length' Return a vector of the lengths of cell elements. `ndims' Return the number of dimensions of each element. `prodofsize' Return the product of dimensions of each element. `size' Return the size along the K-th dimension. `isclass' Return 1 for elements of CLASS. Additionally, `cellfun' accepts an arbitrary function FUNC in the form of an inline function, function handle, or the name of a function (in a character string). In the case of a character string argument, the function must accept a single argument named X, and it must return a string value. The function can take one or more arguments, with the inputs args given by C, D, etc. Equally the function can return one or more output arguments. For example cellfun (@atan2, {1, 0}, {0, 1}) =>ans = [1.57080 0.00000] Note that the default output argument is an array of the same size as the input arguments. If the parameter 'UniformOutput' is set to true (the default), then the function must return a single element which will be concatenated into the return value. If 'UniformOutput' is false, the outputs are concatenated in a cell array. For example cellfun ("tolower(x)", {"Foo", "Bar", "FooBar"}, "UniformOutput",false) => ans = {"foo", "bar", "foobar"} Given the parameter 'ErrorHandler', then ERRFUNC defines a function to call in case FUNC generates an error. The form of the function is function [...] = errfunc (S, ...) where there is an additional input argument to ERRFUNC relative to FUNC, given by S. This is a structure with the elements 'identifier', 'message' and 'index', giving respectively the error identifier, the error message, and the index into the input arguments of the element that caused the error. For example function y = foo (s, x), y = NaN; endfunction cellfun (@factorial, {-1,2},'ErrorHandler',@foo) => ans = [NaN 2] *See also:* *note isempty: doc-isempty, *note islogical: doc-islogical, *note isreal: doc-isreal, *note length: doc-length, *note ndims: doc-ndims, *note numel: doc-numel, *note size: doc-size. An alternative is to convert the data to a different container, such as a matrix or a data structure. Depending on the data this is possible using the `cell2mat' and `cell2struct' functions. -- Function File: M = cell2mat (C) Convert the cell array C into a matrix by concatenating all elements of C into a hyperrectangle. Elements of C must be numeric, logical or char, and `cat' must be able to concatenate them together. *See also:* *note mat2cell: doc-mat2cell, *note num2cell: doc-num2cell. -- Built-in Function: cell2struct (CELL, FIELDS, DIM) Convert CELL to a structure. The number of fields in FIELDS must match the number of elements in CELL along dimension DIM, that is `numel (FIELDS) == size (CELL, DIM)'. A = cell2struct ({'Peter', 'Hannah', 'Robert'; 185, 170, 168}, {'Name','Height'}, 1); A(1) => ans = { Height = 185 Name = Peter }  File: octave.info, Node: Comma Separated Lists, Prev: Cell Arrays, Up: Data Containers 6.3 Comma Separated Lists ========================= Comma separated lists(1) are the basic argument type to all Octave functions. In the example max (A, B) `A, B' is a comma separated list. Comma separated lists can appear on both the right and left hand side of an equation. For example [I, J] = ceil (find (X, [], "last")); where `I, J' is equally a comma separated list. Comma separated lists cannot be directly manipulated by the user. However, both structures and cell arrays can be converted into comma separated lists, which makes them useful to keep the input arguments and return values of functions organized. Another example of where a comma separated list can be used is in the creation of a new array. If all the accessed elements of a cell array are scalars or column vectors, they can be concatenated into a new column vector containing the elements, by surrounding the list with `[' and `]' as in the following example a = {1, [2, 3], 4}; b = [a{:}] => b = 1 2 3 4 It is also possible to pass the accessed elements directly to a function. The list of elements from the cell array will be passed as an argument list to a given function as if it is called with the elements as arguments. The two calls to `printf' in the following example are identical but the latter is simpler and handles more situations c = {"GNU", "Octave", "is", "Free", "Software"}; printf ("%s ", c{1}, c{2}, c{3}, c{4}, c{5}); -| GNU Octave is Free Software printf ("%s ", c{:}); -| GNU Octave is Free Software Just like it is possible to create a numerical array from selected elements of a cell array, it is possible to create a new cell array containing the selected elements. By surrounding the list with `{' and `}' a new cell array will be created, as the following example illustrates a = {1, rand(2, 2), "three"}; b = { a{ [1, 3] } } => b = { [1,1] = 1 [1,2] = three } This syntax is however a bit cumbersome, and since this is a common operation, it is possible to achieve the same using the `(' and `)' operators for indexing. When a cell array is indexed using the `(' and `)' operators a new cell array containing the selected elements will be created. Using this syntax, the previous example can be simplified into the following a = {1, rand(2, 2), "three"}; b = a( [1, 3] ) => b = { [1,1] = 1 [1,2] = three } A comma separated list can equally appear on the left-hand side of an assignment. An example is in {1} = ceil (rand (10, 1)); in {2} = []; in {3} = "last"; in {4} = "first"; out = cell (4, 1); [out{1:2}] = find (in{1 : 3}); [out{3:4}] = find (in{[1, 2, 4]}); Structure arrays can equally be used to create comma separated lists. This is done by addressing one of the fields of a structure array. For example x = ceil (randn (10, 1)); in = struct ("call1", {x, Inf, "last"}, "call2", {x, Inf, "first"}); out = struct ("call1", cell (2, 1), "call2", cell (2, 1)); [out.call1] = find (in.call1); [out.call2] = find (in.call2); ---------- Footnotes ---------- (1) Comma-separated lists are also sometimes informally referred to as "cs-lists".  File: octave.info, Node: Variables, Next: Expressions, Prev: Data Containers, Up: Top 7 Variables *********** Variables let you give names to values and refer to them later. You have already seen variables in many of the examples. The name of a variable must be a sequence of letters, digits and underscores, but it may not begin with a digit. Octave does not enforce a limit on the length of variable names, but it is seldom useful to have variables with names longer than about 30 characters. The following are all valid variable names x x15 __foo_bar_baz__ fucnrdthsucngtagdjb However, names like `__foo_bar_baz__' that begin and end with two underscores are understood to be reserved for internal use by Octave. You should not use them in code you write, except to access Octave's documented internal variables and built-in symbolic constants. Case is significant in variable names. The symbols `a' and `A' are distinct variables. A variable name is a valid expression by itself. It represents the variable's current value. Variables are given new values with "assignment operators" and "increment operators". *Note Assignment Expressions: Assignment Ops. There is one built-in variable with a special meaning. The `ans' variable always contains the result of the last computation, where the output wasn't assigned to any variable. The code `a = cos (pi)' will assign the value -1 to the variable `a', but will not change the value of `ans'. However, the code `cos (pi)' will set the value of `ans' to -1. Variables in Octave do not have fixed types, so it is possible to first store a numeric value in a variable and then to later use the same name to hold a string value in the same program. Variables may not be used before they have been given a value. Doing so results in an error. -- Automatic Variable: ans The most recently computed result that was not explicitly assigned to a variable. For example, after the expression 3^2 + 4^2 is evaluated, the value returned by `ans' is 25. -- Built-in Function: isvarname (NAME) Return true if NAME is a valid variable name -- Function File: VARNAME = genvarname (STR) -- Function File: VARNAME = genvarname (STR, EXCLUSIONS) Create unique variable(s) from STR. If EXCLUSIONS is given, then the variable(s) will be unique to each other and to EXCLUSIONS (EXCLUSIONS may be either a string or a cellstr). If STR is a cellstr, then a unique variable is created for each cell in STR. x = 3.141; genvarname ("x", who ()) => x1 If WANTED is a cell array, genvarname will make sure the returned strings are distinct: genvarname ({"foo", "foo"}) => { [1,1] = foo [1,2] = foo1 } Note that the result is a char array/cell array of strings, not the variables themselves. To define a variable, `eval()' can be used. The following trivial example sets `x' to `42'. name = genvarname ("x"); eval([name " = 42"]); => x = 42 Also, this can be useful for creating unique struct field names. x = struct (); for i = 1:3 x.(genvarname ("a", fieldnames (x))) = i; endfor => x = { a = 1 a1 = 2 a2 = 3 } Since variable names may only contain letters, digits and underscores, genvarname replaces any sequence of disallowed characters with an underscore. Also, variables may not begin with a digit; in this case an underscore is added before the variable name. Variable names beginning and ending with two underscores "__" are valid but they are used internally by octave and should generally be avoided, therefore genvarname will not generate such names. genvarname will also make sure that returned names do not clash with keywords such as "for" and "if". A number will be appended if necessary. Note, however, that this does *not* include function names, such as "sin". Such names should be included in AVOID if necessary. *See also:* *note isvarname: doc-isvarname, *note exist: doc-exist, *note tmpnam: doc-tmpnam, *note eval: doc-eval. -- Function File: namelengthmax () Returns the MATLAB compatible maximum variable name length. Octave is capable of storing strings up to `2 ^ 31 - 1' in length. However for MATLAB compatibility all variable, function and structure field names should be shorter than the length supplied by `namelengthmax'. In particular variables stored to a MATLAB file format will have their names truncated to this length. * Menu: * Global Variables:: * Persistent Variables:: * Status of Variables::  File: octave.info, Node: Global Variables, Next: Persistent Variables, Up: Variables 7.1 Global Variables ==================== A variable that has been declared "global" may be accessed from within a function body without having to pass it as a formal parameter. A variable may be declared global using a `global' declaration statement. The following statements are all global declarations. global a global a b global c = 2 global d = 3 e f = 5 A global variable may only be initialized once in a `global' statement. For example, after executing the following code global gvar = 1 global gvar = 2 the value of the global variable `gvar' is 1, not 2. Issuing a `clear gvar' command does not change the above behavior, but `clear all' does. It is necessary declare a variable as global within a function body in order to access it. For example, global x function f () x = 1; endfunction f () does _not_ set the value of the global variable `x' to 1. In order to change the value of the global variable `x', you must also declare it to be global within the function body, like this function f () global x; x = 1; endfunction Passing a global variable in a function parameter list will make a local copy and not modify the global value. For example, given the function function f (x) x = 0 endfunction and the definition of `x' as a global variable at the top level, global x = 13 the expression f (x) will display the value of `x' from inside the function as 0, but the value of `x' at the top level remains unchanged, because the function works with a _copy_ of its argument. -- Built-in Function: isglobal (NAME) Return 1 if NAME is globally visible. Otherwise, return 0. For example, global x isglobal ("x") => 1  File: octave.info, Node: Persistent Variables, Next: Status of Variables, Prev: Global Variables, Up: Variables 7.2 Persistent Variables ======================== A variable that has been declared "persistent" within a function will retain its contents in memory between subsequent calls to the same function. The difference between persistent variables and global variables is that persistent variables are local in scope to a particular function and are not visible elsewhere. The following example uses a persistent variable to create a function that prints the number of times it has been called. function count_calls () persistent calls = 0; printf ("'count_calls' has been called %d times\n", ++calls); endfunction for i = 1:3 count_calls (); endfor -| 'count_calls' has been called 1 times -| 'count_calls' has been called 2 times -| 'count_calls' has been called 3 times As the example shows, a variable may be declared persistent using a `persistent' declaration statement. The following statements are all persistent declarations. persistent a persistent a b persistent c = 2 persistent d = 3 e f = 5 The behavior of persistent variables is equivalent to the behavior of static variables in C. The command `static' in Octave is also recognized and is equivalent to `persistent'. Like global variables, a persistent variable may only be initialized once. For example, after executing the following code persistent pvar = 1 persistent pvar = 2 the value of the persistent variable `pvar' is 1, not 2. If a persistent variable is declared but not initialized to a specific value, it will contain an empty matrix. So, it is also possible to initialize a persistent variable by checking whether it is empty, as the following example illustrates. function count_calls () persistent calls; if (isempty (calls)) calls = 0; endif printf ("'count_calls' has been called %d times\n", ++calls); endfunction This implementation behaves in exactly the same way as the previous implementation of `count_calls'. The value of a persistent variable is kept in memory until it is explicitly cleared. Assuming that the implementation of `count_calls' is saved on disc, we get the following behavior. for i = 1:2 count_calls (); endfor -| 'count_calls' has been called 1 times -| 'count_calls' has been called 2 times clear for i = 1:2 count_calls(); endfor -| 'count_calls' has been called 3 times -| 'count_calls' has been called 4 times clear all for i = 1:2 count_calls(); endfor -| 'count_calls' has been called 1 times -| 'count_calls' has been called 2 times clear count_calls for i = 1:2 count_calls(); endfor -| 'count_calls' has been called 1 times -| 'count_calls' has been called 2 times That is, the persistent variable is only removed from memory when the function containing the variable is removed. Note that if the function definition is typed directly into the Octave prompt, the persistent variable will be cleared by a simple `clear' command as the entire function definition will be removed from memory. If you do not want a persistent variable to be removed from memory even if the function is cleared, you should use the `mlock' function as described in *Note Function Locking::.  File: octave.info, Node: Status of Variables, Prev: Persistent Variables, Up: Variables 7.3 Status of Variables ======================= When creating simple one-shot programs it can be very convenient to see which variables are available at the prompt. The function `who' and its siblings `whos' and `whos_line_format' will show different information about what is in memory, as the following shows. str = "A random string"; who -variables -| *** local user variables: -| -| __nargin__ str -- Command: who options pattern ... -- Command: whos options pattern ... List currently defined symbols matching the given patterns. The following are valid options. They may be shortened to one character but may not be combined. `global' List the variables in the global scope rather than the current scope. `-regexp' The patterns are considered as regular expressions and will be used for matching the variables to display. The same pattern syntax as for the `regexp' function is used. `-file' The following argument is treated as a filename, and the variables that are found within this file are listed. Valid patterns are the same as described for the `clear' command above. If no patterns are supplied, all symbols from the given category are listed. By default, only user defined functions and variables visible in the local scope are displayed. The command `whos' is equivalent to `who -long'. *See also:* *note regexp: doc-regexp. -- Command: whos options pattern ... See who. -- Built-in Function: VAL = whos_line_format () -- Built-in Function: OLD_VAL = whos_line_format (NEW_VAL) Query or set the format string used by the `whos'. The following escape sequences may be used in the format: `%a' Prints attributes of variables (g=global, p=persistent, f=formal parameter, a=automatic variable). `%b' Prints number of bytes occupied by variables. `%c' Prints class names of variables. `%e' Prints elements held by variables. `%n' Prints variable names. `%s' Prints dimensions of variables. `%t' Prints type names of variables. Every command may also have a modifier: `l' Left alignment. `r' Right alignment (this is the default). `c' Centered (may only be applied to command %s). A command is composed like this: %[modifier][:size_of_parameter[:center-specific[:balance]]]; Command and modifier is already explained. The `size_of_parameter' parameter tells how many columns the parameter will need for printing. The `center-specific' parameter may only be applied to command `%s'. The `balance' parameter specifies the offset for printing the dimensions string. The default format is `" %a:4; %ln:6; %cs:16:6:1; %rb:12; %lc:-1;\n"'. Instead of displaying which variables are in memory, it is possible to determine if a given variable is available. That way it is possible to alter the behavior of a program depending on the existence of a variable. The following example illustrates this. if (! exist ("meaning", "var")) disp ("The program has no 'meaning'"); endif -- Built-in Function: exist (NAME, TYPE) Return 1 if the name exists as a variable, 2 if the name is an absolute file name, an ordinary file in Octave's `path', or (after appending `.m') a function file in Octave's `path', 3 if the name is a `.oct' or `.mex' file in Octave's `path', 5 if the name is a built-in function, 7 if the name is a directory, or 103 if the name is a function not associated with a file (entered on the command line). Otherwise, return 0. This function also returns 2 if a regular file called NAME exists in Octave's search path. If you want information about other types of files, you should use some combination of the functions `file_in_path' and `stat' instead. If the optional argument TYPE is supplied, check only for symbols of the specified type. Valid types are `"var"' Check only for variables. `"builtin"' Check only for built-in functions. `"file"' Check only for files. `"dir"' Check only for directories. Usually Octave will manage the memory, but sometimes it can be practical to remove variables from memory manually. This is usually needed when working with large variables that fill a substantial part of the memory. On a computer that uses the IEEE floating point format, the following program allocates a matrix that requires around 128 MB memory. large_matrix = zeros (4000, 4000); Since having this variable in memory might slow down other computations, it can be necessary to remove it manually from memory. The `clear' function allows this. -- Command: clear [options] pattern ... Delete the names matching the given patterns from the symbol table. The pattern may contain the following special characters: `?' Match any single character. `*' Match zero or more characters. `[ LIST ]' Match the list of characters specified by LIST. If the first character is `!' or `^', match all characters except those specified by LIST. For example, the pattern `[a-zA-Z]' will match all lower and upper case alphabetic characters. For example, the command clear foo b*r clears the name `foo' and all names that begin with the letter `b' and end with the letter `r'. If `clear' is called without any arguments, all user-defined variables (local and global) are cleared from the symbol table. If `clear' is called with at least one argument, only the visible names matching the arguments are cleared. For example, suppose you have defined a function `foo', and then hidden it by performing the assignment `foo = 2'. Executing the command `clear foo' once will clear the variable definition and restore the definition of `foo' as a function. Executing `clear foo' a second time will clear the function definition. The following options are available in both long and short form `-all, -a' Clears all local and global user-defined variables and all functions from the symbol table. `-exclusive, -x' Clears the variables that don't match the following pattern. `-functions, -f' Clears the function names and the built-in symbols names. `-global, -g' Clears the global symbol names. `-variables, -v' Clears the local variable names. `-classes, -c' Clears the class structure table and clears all objects. `-regexp, -r' The arguments are treated as regular expressions as any variables that match will be cleared. With the exception of `exclusive', all long options can be used without the dash as well. Information about a function or variable such as its location in the file system can also be acquired from within Octave. This is usually only useful during development of programs, and not within a program. -- Command: type options name ... Display the definition of each NAME that refers to a function. Normally also displays whether each NAME is user-defined or built-in; the `-q' option suppresses this behavior. If an output argument is requested nothing is displayed. Instead, a cell array of strings is returned, where each element corresponds to the definition of each requested function. -- Command: which name ... Display the type of each NAME. If NAME is defined from a function file, the full name of the file is also displayed. *See also:* *note help: doc-help, *note lookfor: doc-lookfor. -- Command: what -- Command: what DIR -- Function File: w = what (DIR) List the Octave specific files in a directory. If the variable DIR is given then check that directory rather than the current directory. If a return argument is requested, the files found are returned in the structure W. *See also:* *note which: doc-which.  File: octave.info, Node: Expressions, Next: Evaluation, Prev: Variables, Up: Top 8 Expressions ************* Expressions are the basic building block of statements in Octave. An expression evaluates to a value, which you can print, test, store in a variable, pass to a function, or assign a new value to a variable with an assignment operator. An expression can serve as a statement on its own. Most other kinds of statements contain one or more expressions which specify data to be operated on. As in other languages, expressions in Octave include variables, array references, constants, and function calls, as well as combinations of these with various operators. * Menu: * Index Expressions:: * Calling Functions:: * Arithmetic Ops:: * Comparison Ops:: * Boolean Expressions:: * Assignment Ops:: * Increment Ops:: * Operator Precedence::  File: octave.info, Node: Index Expressions, Next: Calling Functions, Up: Expressions 8.1 Index Expressions ===================== An "index expression" allows you to reference or extract selected elements of a matrix or vector. Indices may be scalars, vectors, ranges, or the special operator `:', which may be used to select entire rows or columns. Vectors are indexed using a single index expression. Matrices may be indexed using one or two indices. When using a single index expression, the elements of the matrix are taken in column-first order; the dimensions of the output match those of the index expression. For example, a (2) # a scalar a (1:2) # a row vector a ([1; 2]) # a column vector As a special case, when a colon is used as a single index, the output is a column vector containing all the elements of the vector or matrix. For example a (:) # a column vector Given the matrix a = [1, 2; 3, 4] all of the following expressions are equivalent a (1, [1, 2]) a (1, 1:2) a (1, :) and select the first row of the matrix. In general, an array with `n' dimensions can be indexed using `m' indices. If `n == m', each index corresponds to its respective dimension. The set of index tuples determining the result is formed by the Cartesian product of the index vectors (or ranges or scalars). If `n < m', then the array is padded by trailing singleton dimensions. If `n > m', the last `n-m+1' dimensions are folded into a single dimension with extent equal to product of extents of the original dimensions. Indexing a scalar with a vector of ones can be used to create a vector the same size as the index vector, with each element equal to the value of the original scalar. For example, the following statements a = 13; a (ones (1, 4)) produce a vector whose four elements are all equal to 13. Similarly, indexing a scalar with two vectors of ones can be used to create a matrix. For example the following statements a = 13; a (ones (1, 2), ones (1, 3)) create a 2 by 3 matrix with all elements equal to 13. The last example could also be written as 13 (ones (2, 3)) It should be, noted that `ones (1, n)' (a row vector of ones) results in a range (with zero increment), and is therefore more efficient when used in index expression than other forms of "ones". In particular, when `r' is a row vector, the expressions r(ones (1, n), :) r(ones (n, 1), :) will produce identical results, but the first one will be significantly faster, at least for `r' and `n' large enough. The reason is that in the first case the index is kept in a compressed form, which allows Octave to choose a more efficient algorithm to handle the expression. In general, for an user unaware of these subtleties, it is best to use the function "repmat" for spreading arrays into bigger ones. It is also possible to create a matrix with different values. The following example creates a 10 dimensional row vector a containing the values a(i) = sqrt(i). for i = 1:10 a(i) = sqrt (i); endfor Note that it is quite inefficient to create a vector using a loop like the one shown in the example above. In this particular case, it would have been much more efficient to use the expression a = sqrt (1:10); thus avoiding the loop entirely. In cases where a loop is still required, or a number of values must be combined to form a larger matrix, it is generally much faster to set the size of the matrix first, and then insert elements using indexing commands. For example, given a matrix `a', [nr, nc] = size (a); x = zeros (nr, n * nc); for i = 1:n x(:,(i-1)*nc+1:i*nc) = a; endfor is considerably faster than x = a; for i = 1:n-1 x = [x, a]; endfor particularly for large matrices because Octave does not have to repeatedly resize the result. -- Function File: IND = sub2ind (DIMS, I, J) -- Function File: IND = sub2ind (DIMS, S1, S2, ..., SN) Convert subscripts into a linear index. The following example shows how to convert the two-dimensional index `(2,3)' of a 3-by-3 matrix to a linear index. The matrix is linearly indexed moving from one column to next, filling up all rows in each column. linear_index = sub2ind ([3, 3], 2, 3) => 8 *See also:* *note ind2sub: doc-ind2sub. -- Function File: [S1, S2, ..., SN] = ind2sub (DIMS, IND) Convert a linear index into subscripts. The following example shows how to convert the linear index `8' in a 3-by-3 matrix into a subscript. The matrix is linearly indexed moving from one column to next, filling up all rows in each column. [r, c] = ind2sub ([3, 3], 8) => r = 2 c = 3 *See also:* *note sub2ind: doc-sub2ind.  File: octave.info, Node: Calling Functions, Next: Arithmetic Ops, Prev: Index Expressions, Up: Expressions 8.2 Calling Functions ===================== A "function" is a name for a particular calculation. Because it has a name, you can ask for it by name at any point in the program. For example, the function `sqrt' computes the square root of a number. A fixed set of functions are "built-in", which means they are available in every Octave program. The `sqrt' function is one of these. In addition, you can define your own functions. *Note Functions and Scripts::, for information about how to do this. The way to use a function is with a "function call" expression, which consists of the function name followed by a list of "arguments" in parentheses. The arguments are expressions which give the raw materials for the calculation that the function will do. When there is more than one argument, they are separated by commas. If there are no arguments, you can omit the parentheses, but it is a good idea to include them anyway, to clearly indicate that a function call was intended. Here are some examples: sqrt (x^2 + y^2) # One argument ones (n, m) # Two arguments rand () # No arguments Each function expects a particular number of arguments. For example, the `sqrt' function must be called with a single argument, the number to take the square root of: sqrt (ARGUMENT) Some of the built-in functions take a variable number of arguments, depending on the particular usage, and their behavior is different depending on the number of arguments supplied. Like every other expression, the function call has a value, which is computed by the function based on the arguments you give it. In this example, the value of `sqrt (ARGUMENT)' is the square root of the argument. A function can also have side effects, such as assigning the values of certain variables or doing input or output operations. Unlike most languages, functions in Octave may return multiple values. For example, the following statement [u, s, v] = svd (a) computes the singular value decomposition of the matrix `a' and assigns the three result matrices to `u', `s', and `v'. The left side of a multiple assignment expression is itself a list of expressions, and is allowed to be a list of variable names or index expressions. See also *note Index Expressions::, and *note Assignment Ops::. * Menu: * Call by Value:: * Recursion::  File: octave.info, Node: Call by Value, Next: Recursion, Up: Calling Functions 8.2.1 Call by Value ------------------- In Octave, unlike Fortran, function arguments are passed by value, which means that each argument in a function call is evaluated and assigned to a temporary location in memory before being passed to the function. There is currently no way to specify that a function parameter should be passed by reference instead of by value. This means that it is impossible to directly alter the value of a function parameter in the calling function. It can only change the local copy within the function body. For example, the function function f (x, n) while (n-- > 0) disp (x); endwhile endfunction displays the value of the first argument N times. In this function, the variable N is used as a temporary variable without having to worry that its value might also change in the calling function. Call by value is also useful because it is always possible to pass constants for any function parameter without first having to determine that the function will not attempt to modify the parameter. The caller may use a variable as the expression for the argument, but the called function does not know this: it only knows what value the argument had. For example, given a function called as foo = "bar"; fcn (foo) you should not think of the argument as being "the variable `foo'." Instead, think of the argument as the string value, `"bar"'. Even though Octave uses pass-by-value semantics for function arguments, values are not copied unnecessarily. For example, x = rand (1000); f (x); does not actually force two 1000 by 1000 element matrices to exist _unless_ the function `f' modifies the value of its argument. Then Octave must create a copy to avoid changing the value outside the scope of the function `f', or attempting (and probably failing!) to modify the value of a constant or the value of a temporary result.  File: octave.info, Node: Recursion, Prev: Call by Value, Up: Calling Functions 8.2.2 Recursion --------------- With some restrictions(1), recursive function calls are allowed. A "recursive function" is one which calls itself, either directly or indirectly. For example, here is an inefficient(2) way to compute the factorial of a given integer: function retval = fact (n) if (n > 0) retval = n * fact (n-1); else retval = 1; endif endfunction This function is recursive because it calls itself directly. It eventually terminates because each time it calls itself, it uses an argument that is one less than was used for the previous call. Once the argument is no longer greater than zero, it does not call itself, and the recursion ends. The built-in variable `max_recursion_depth' specifies a limit to the recursion depth and prevents Octave from recursing infinitely. -- Built-in Function: VAL = max_recursion_depth () -- Built-in Function: OLD_VAL = max_recursion_depth (NEW_VAL) Query or set the internal limit on the number of times a function may be called recursively. If the limit is exceeded, an error message is printed and control returns to the top level. ---------- Footnotes ---------- (1) Some of Octave's functions are implemented in terms of functions that cannot be called recursively. For example, the ODE solver `lsode' is ultimately implemented in a Fortran subroutine that cannot be called recursively, so `lsode' should not be called either directly or indirectly from within the user-supplied function that `lsode' requires. Doing so will result in an error. (2) It would be much better to use `prod (1:n)', or `gamma (n+1)' instead, after first checking to ensure that the value `n' is actually a positive integer.  File: octave.info, Node: Arithmetic Ops, Next: Comparison Ops, Prev: Calling Functions, Up: Expressions 8.3 Arithmetic Operators ======================== The following arithmetic operators are available, and work on scalars and matrices. `X + Y' Addition. If both operands are matrices, the number of rows and columns must both agree. If one operand is a scalar, its value is added to all the elements of the other operand. `X .+ Y' Element by element addition. This operator is equivalent to `+'. `X - Y' Subtraction. If both operands are matrices, the number of rows and columns of both must agree. `X .- Y' Element by element subtraction. This operator is equivalent to `-'. `X * Y' Matrix multiplication. The number of columns of X must agree with the number of rows of Y. `X .* Y' Element by element multiplication. If both operands are matrices, the number of rows and columns must both agree. `X / Y' Right division. This is conceptually equivalent to the expression (inverse (y') * x')' but it is computed without forming the inverse of Y'. If the system is not square, or if the coefficient matrix is singular, a minimum norm solution is computed. `X ./ Y' Element by element right division. `X \ Y' Left division. This is conceptually equivalent to the expression inverse (x) * y but it is computed without forming the inverse of X. If the system is not square, or if the coefficient matrix is singular, a minimum norm solution is computed. `X .\ Y' Element by element left division. Each element of Y is divided by each corresponding element of X. `X ^ Y' `X ** Y' Power operator. If X and Y are both scalars, this operator returns X raised to the power Y. If X is a scalar and Y is a square matrix, the result is computed using an eigenvalue expansion. If X is a square matrix, the result is computed by repeated multiplication if Y is an integer, and by an eigenvalue expansion if Y is not an integer. An error results if both X and Y are matrices. The implementation of this operator needs to be improved. `X .^ Y' `X .** Y' Element by element power operator. If both operands are matrices, the number of rows and columns must both agree. `-X' Negation. `+X' Unary plus. This operator has no effect on the operand. `X'' Complex conjugate transpose. For real arguments, this operator is the same as the transpose operator. For complex arguments, this operator is equivalent to the expression conj (x.') `X.'' Transpose. Note that because Octave's element by element operators begin with a `.', there is a possible ambiguity for statements like 1./m because the period could be interpreted either as part of the constant or as part of the operator. To resolve this conflict, Octave treats the expression as if you had typed (1) ./ m and not (1.) / m Although this is inconsistent with the normal behavior of Octave's lexer, which usually prefers to break the input into tokens by preferring the longest possible match at any given point, it is more useful in this case.  File: octave.info, Node: Comparison Ops, Next: Boolean Expressions, Prev: Arithmetic Ops, Up: Expressions 8.4 Comparison Operators ======================== "Comparison operators" compare numeric values for relationships such as equality. They are written using _relational operators_. All of Octave's comparison operators return a value of 1 if the comparison is true, or 0 if it is false. For matrix values, they all work on an element-by-element basis. For example, [1, 2; 3, 4] == [1, 3; 2, 4] => 1 0 0 1 If one operand is a scalar and the other is a matrix, the scalar is compared to each element of the matrix in turn, and the result is the same size as the matrix. `X < Y' True if X is less than Y. `X <= Y' True if X is less than or equal to Y. `X == Y' True if X is equal to Y. `X >= Y' True if X is greater than or equal to Y. `X > Y' True if X is greater than Y. `X != Y' `X ~= Y' True if X is not equal to Y. String comparisons may also be performed with the `strcmp' function, not with the comparison operators listed above. *Note Strings::. -- Function File: isequal (X1, X2, ...) Return true if all of X1, X2, ... are equal. *See also:* *note isequalwithequalnans: doc-isequalwithequalnans. -- Function File: isequalwithequalnans (X1, X2, ...) Assuming NaN == NaN, return true if all of X1, X2, ... are equal. *See also:* *note isequal: doc-isequal.  File: octave.info, Node: Boolean Expressions, Next: Assignment Ops, Prev: Comparison Ops, Up: Expressions 8.5 Boolean Expressions ======================= * Menu: * Element-by-element Boolean Operators:: * Short-circuit Boolean Operators::  File: octave.info, Node: Element-by-element Boolean Operators, Next: Short-circuit Boolean Operators, Up: Boolean Expressions 8.5.1 Element-by-element Boolean Operators ------------------------------------------ An "element-by-element boolean expression" is a combination of comparison expressions using the boolean operators "or" (`|'), "and" (`&'), and "not" (`!'), along with parentheses to control nesting. The truth of the boolean expression is computed by combining the truth values of the corresponding elements of the component expressions. A value is considered to be false if it is zero, and true otherwise. Element-by-element boolean expressions can be used wherever comparison expressions can be used. They can be used in `if' and `while' statements. However, a matrix value used as the condition in an `if' or `while' statement is only true if _all_ of its elements are nonzero. Like comparison operations, each element of an element-by-element boolean expression also has a numeric value (1 if true, 0 if false) that comes into play if the result of the boolean expression is stored in a variable, or used in arithmetic. Here are descriptions of the three element-by-element boolean operators. `BOOLEAN1 & BOOLEAN2' Elements of the result are true if both corresponding elements of BOOLEAN1 and BOOLEAN2 are true. `BOOLEAN1 | BOOLEAN2' Elements of the result are true if either of the corresponding elements of BOOLEAN1 or BOOLEAN2 is true. `! BOOLEAN' `~ BOOLEAN' Each element of the result is true if the corresponding element of BOOLEAN is false. For matrix operands, these operators work on an element-by-element basis. For example, the expression [1, 0; 0, 1] & [1, 0; 2, 3] returns a two by two identity matrix. For the binary operators, the dimensions of the operands must conform if both are matrices. If one of the operands is a scalar and the other a matrix, the operator is applied to the scalar and each element of the matrix. For the binary element-by-element boolean operators, both subexpressions BOOLEAN1 and BOOLEAN2 are evaluated before computing the result. This can make a difference when the expressions have side effects. For example, in the expression a & b++ the value of the variable B is incremented even if the variable A is zero. This behavior is necessary for the boolean operators to work as described for matrix-valued operands.  File: octave.info, Node: Short-circuit Boolean Operators, Prev: Element-by-element Boolean Operators, Up: Boolean Expressions 8.5.2 Short-circuit Boolean Operators ------------------------------------- Combined with the implicit conversion to scalar values in `if' and `while' conditions, Octave's element-by-element boolean operators are often sufficient for performing most logical operations. However, it is sometimes desirable to stop evaluating a boolean expression as soon as the overall truth value can be determined. Octave's "short-circuit" boolean operators work this way. `BOOLEAN1 && BOOLEAN2' The expression BOOLEAN1 is evaluated and converted to a scalar using the equivalent of the operation `all (BOOLEAN1(:))'. If it is false, the result of the overall expression is 0. If it is true, the expression BOOLEAN2 is evaluated and converted to a scalar using the equivalent of the operation `all (BOOLEAN1(:))'. If it is true, the result of the overall expression is 1. Otherwise, the result of the overall expression is 0. *Warning:* there is one exception to the rule of evaluating `all (BOOLEAN1(:))', which is when `boolean1' is the empty matrix. The truth value of an empty matrix is always `false' so `[] && true' evaluates to `false' even though `all ([])' is `true'. `BOOLEAN1 || BOOLEAN2' The expression BOOLEAN1 is evaluated and converted to a scalar using the equivalent of the operation `all (BOOLEAN1(:))'. If it is true, the result of the overall expression is 1. If it is false, the expression BOOLEAN2 is evaluated and converted to a scalar using the equivalent of the operation `all (BOOLEAN1(:))'. If it is true, the result of the overall expression is 1. Otherwise, the result of the overall expression is 0. *Warning:* the truth value of an empty matrix is always `false', see the previous list item for details. The fact that both operands may not be evaluated before determining the overall truth value of the expression can be important. For example, in the expression a && b++ the value of the variable B is only incremented if the variable A is nonzero. This can be used to write somewhat more concise code. For example, it is possible write function f (a, b, c) if (nargin > 2 && ischar (c)) ... instead of having to use two `if' statements to avoid attempting to evaluate an argument that doesn't exist. For example, without the short-circuit feature, it would be necessary to write function f (a, b, c) if (nargin > 2) if (ischar (c)) ... Writing function f (a, b, c) if (nargin > 2 & ischar (c)) ... would result in an error if `f' were called with one or two arguments because Octave would be forced to try to evaluate both of the operands for the operator `&'.  File: octave.info, Node: Assignment Ops, Next: Increment Ops, Prev: Boolean Expressions, Up: Expressions 8.6 Assignment Expressions ========================== An "assignment" is an expression that stores a new value into a variable. For example, the following expression assigns the value 1 to the variable `z': z = 1 After this expression is executed, the variable `z' has the value 1. Whatever old value `z' had before the assignment is forgotten. The `=' sign is called an "assignment operator". Assignments can store string values also. For example, the following expression would store the value `"this food is good"' in the variable `message': thing = "food" predicate = "good" message = [ "this " , thing , " is " , predicate ] (This also illustrates concatenation of strings.) Most operators (addition, concatenation, and so on) have no effect except to compute a value. If you ignore the value, you might as well not use the operator. An assignment operator is different. It does produce a value, but even if you ignore the value, the assignment still makes itself felt through the alteration of the variable. We call this a "side effect". The left-hand operand of an assignment need not be a variable (*note Variables::). It can also be an element of a matrix (*note Index Expressions::) or a list of return values (*note Calling Functions::). These are all called "lvalues", which means they can appear on the left-hand side of an assignment operator. The right-hand operand may be any expression. It produces the new value which the assignment stores in the specified variable, matrix element, or list of return values. It is important to note that variables do _not_ have permanent types. The type of a variable is simply the type of whatever value it happens to hold at the moment. In the following program fragment, the variable `foo' has a numeric value at first, and a string value later on: octave:13> foo = 1 foo = 1 octave:13> foo = "bar" foo = bar When the second assignment gives `foo' a string value, the fact that it previously had a numeric value is forgotten. Assignment of a scalar to an indexed matrix sets all of the elements that are referenced by the indices to the scalar value. For example, if `a' is a matrix with at least two columns, a(:, 2) = 5 sets all the elements in the second column of `a' to 5. Assigning an empty matrix `[]' works in most cases to allow you to delete rows or columns of matrices and vectors. *Note Empty Matrices::. For example, given a 4 by 5 matrix A, the assignment A (3, :) = [] deletes the third row of A, and the assignment A (:, 1:2:5) = [] deletes the first, third, and fifth columns. An assignment is an expression, so it has a value. Thus, `z = 1' as an expression has the value 1. One consequence of this is that you can write multiple assignments together: x = y = z = 0 stores the value 0 in all three variables. It does this because the value of `z = 0', which is 0, is stored into `y', and then the value of `y = z = 0', which is 0, is stored into `x'. This is also true of assignments to lists of values, so the following is a valid expression [a, b, c] = [u, s, v] = svd (a) that is exactly equivalent to [u, s, v] = svd (a) a = u b = s c = v In expressions like this, the number of values in each part of the expression need not match. For example, the expression [a, b] = [u, s, v] = svd (a) is equivalent to [u, s, v] = svd (a) a = u b = s The number of values on the left side of the expression can, however, not exceed the number of values on the right side. For example, the following will produce an error. [a, b, c, d] = [u, s, v] = svd (a); -| error: element number 4 undefined in return list A very common programming pattern is to increment an existing variable with a given value, like this a = a + 2; This can be written in a clearer and more condensed form using the `+=' operator a += 2; Similar operators also exist for subtraction (`-='), multiplication (`*='), and division (`/='). An expression of the form EXPR1 OP= EXPR2 is evaluated as EXPR1 = (EXPR1) OP (EXPR2) where OP can be either `+', `-', `*', or `/'. So, the expression a *= b+1 is evaluated as a = a * (b+1) and _not_ a = a * b + 1 You can use an assignment anywhere an expression is called for. For example, it is valid to write `x != (y = 1)' to set `y' to 1 and then test whether `x' equals 1. But this style tends to make programs hard to read. Except in a one-shot program, you should rewrite it to get rid of such nesting of assignments. This is never very hard.  File: octave.info, Node: Increment Ops, Next: Operator Precedence, Prev: Assignment Ops, Up: Expressions 8.7 Increment Operators ======================= _Increment operators_ increase or decrease the value of a variable by 1. The operator to increment a variable is written as `++'. It may be used to increment a variable either before or after taking its value. For example, to pre-increment the variable X, you would write `++X'. This would add one to X and then return the new value of X as the result of the expression. It is exactly the same as the expression `X = X + 1'. To post-increment a variable X, you would write `X++'. This adds one to the variable X, but returns the value that X had prior to incrementing it. For example, if X is equal to 2, the result of the expression `X++' is 2, and the new value of X is 3. For matrix and vector arguments, the increment and decrement operators work on each element of the operand. Here is a list of all the increment and decrement expressions. `++X' This expression increments the variable X. The value of the expression is the _new_ value of X. It is equivalent to the expression `X = X + 1'. `--X' This expression decrements the variable X. The value of the expression is the _new_ value of X. It is equivalent to the expression `X = X - 1'. `X++' This expression causes the variable X to be incremented. The value of the expression is the _old_ value of X. `X--' This expression causes the variable X to be decremented. The value of the expression is the _old_ value of X.  File: octave.info, Node: Operator Precedence, Prev: Increment Ops, Up: Expressions 8.8 Operator Precedence ======================= "Operator precedence" determines how operators are grouped, when different operators appear close by in one expression. For example, `*' has higher precedence than `+'. Thus, the expression `a + b * c' means to multiply `b' and `c', and then add `a' to the product (i.e., `a + (b * c)'). You can overrule the precedence of the operators by using parentheses. You can think of the precedence rules as saying where the parentheses are assumed if you do not write parentheses yourself. In fact, it is wise to use parentheses whenever you have an unusual combination of operators, because other people who read the program may not remember what the precedence is in this case. You might forget as well, and then you too could make a mistake. Explicit parentheses will help prevent any such mistake. When operators of equal precedence are used together, the leftmost operator groups first, except for the assignment and exponentiation operators, which group in the opposite order. Thus, the expression `a - b + c' groups as `(a - b) + c', but the expression `a = b = c' groups as `a = (b = c)'. The precedence of prefix unary operators is important when another operator follows the operand. For example, `-x^2' means `-(x^2)', because `-' has lower precedence than `^'. Here is a table of the operators in Octave, in order of increasing precedence. `statement separators' `;', `,'. `assignment' `=', `+=', `-=', `*=',`/='. This operator groups right to left. `logical "or" and "and"' `||', `&&'. `element-wise "or" and "and"' `|', `&'. `relational' `<', `<=', `==', `>=', `>', `!=', `~='. `colon' `:'. `add, subtract' `+', `-'. `multiply, divide' `*', `/', `\', `.\', `.*', `./'. `transpose' `'', `.'' `unary plus, minus, increment, decrement, and ``not''' `+', `-', `++', `--', `!', `~'. `exponentiation' `^', `**', `.^', `.**'.  File: octave.info, Node: Evaluation, Next: Statements, Prev: Expressions, Up: Top 9 Evaluation ************ Normally, you evaluate expressions simply by typing them at the Octave prompt, or by asking Octave to interpret commands that you have saved in a file. Sometimes, you may find it necessary to evaluate an expression that has been computed and stored in a string, which is exactly what the `eval' function lets you do. -- Built-in Function: eval (TRY, CATCH) Parse the string TRY and evaluate it as if it were an Octave program. If that fails, evaluate the optional string CATCH. The string TRY is evaluated in the current context, so any results remain available after `eval' returns. The following example makes the variable A with the approximate value 3.1416 available. eval("a = acos(-1);"); If an error occurs during the evaluation of TRY the CATCH string is evaluated, as the following example shows: eval ('error ("This is a bad example");', 'printf ("This error occurred:\n%s\n", lasterr ());'); -| This error occurred: This is a bad example * Menu: * Calling a Function by its Name:: * Evaluation in a Different Context::  File: octave.info, Node: Calling a Function by its Name, Next: Evaluation in a Different Context, Up: Evaluation 9.1 Calling a Function by its Name ================================== The `feval' function allows you to call a function from a string containing its name. This is useful when writing a function that needs to call user-supplied functions. The `feval' function takes the name of the function to call as its first argument, and the remaining arguments are given to the function. The following example is a simple-minded function using `feval' that finds the root of a user-supplied function of one variable using Newton's method. function result = newtroot (fname, x) # usage: newtroot (fname, x) # # fname : a string naming a function f(x). # x : initial guess delta = tol = sqrt (eps); maxit = 200; fx = feval (fname, x); for i = 1:maxit if (abs (fx) < tol) result = x; return; else fx_new = feval (fname, x + delta); deriv = (fx_new - fx) / delta; x = x - fx / deriv; fx = fx_new; endif endfor result = x; endfunction Note that this is only meant to be an example of calling user-supplied functions and should not be taken too seriously. In addition to using a more robust algorithm, any serious code would check the number and type of all the arguments, ensure that the supplied function really was a function, etc. *Note Predicates for Numeric Objects::, for example, for a list of predicates for numeric objects, and see *note Status of Variables::, for a description of the `exist' function. -- Built-in Function: feval (NAME, ...) Evaluate the function named NAME. Any arguments after the first are passed on to the named function. For example, feval ("acos", -1) => 3.1416 calls the function `acos' with the argument `-1'. The function `feval' is necessary in order to be able to write functions that call user-supplied functions, because Octave does not have a way to declare a pointer to a function (like C) or to declare a special kind of variable that can be used to hold the name of a function (like `EXTERNAL' in Fortran). Instead, you must refer to functions by name, and use `feval' to call them. A similar function `run' exists for calling user script files, that are not necessarily on the user path -- Function File: run (F) -- Command: run F Run scripts in the current workspace that are not necessarily on the path. If F is the script to run, including its path, then `run' change the directory to the directory where F is found. `run' then executes the script, and returns to the original directory. *See also:* *note system: doc-system.  File: octave.info, Node: Evaluation in a Different Context, Prev: Calling a Function by its Name, Up: Evaluation 9.2 Evaluation in a Different Context ===================================== Before you evaluate an expression you need to substitute the values of the variables used in the expression. These are stored in the symbol table. Whenever the interpreter starts a new function it saves the current symbol table and creates a new one, initializing it with the list of function parameters and a couple of predefined variables such as `nargin'. Expressions inside the function use the new symbol table. Sometimes you want to write a function so that when you call it, it modifies variables in your own context. This allows you to use a pass-by-name style of function, which is similar to using a pointer in programming languages such as C. Consider how you might write `save' and `load' as m-files. For example, function create_data x = linspace (0, 10, 10); y = sin (x); save mydata x y endfunction With `evalin', you could write `save' as follows: function save (file, name1, name2) f = open_save_file (file); save_var(f, name1, evalin ("caller", name1)); save_var(f, name2, evalin ("caller", name2)); endfunction Here, `caller' is the `create_data' function and `name1' is the string `"x"', which evaluates simply as the value of `x'. You later want to load the values back from `mydata' in a different context: function process_data load mydata ... do work ... endfunction With `assignin', you could write `load' as follows: function load (file) f = open_load_file (file); [name, val] = load_var (f); assignin ("caller", name, val); [name, val] = load_var (f); assignin ("caller", name, val); endfunction Here, `caller' is the `process_data' function. You can set and use variables at the command prompt using the context `base' rather than `caller'. These functions are rarely used in practice. One example is the `fail (`code', `pattern')' function which evaluates `code' in the caller's context and checks that the error message it produces matches the given pattern. Other examples such as `save' and `load' are written in C++ where all Octave variables are in the `caller' context and `evalin' is not needed. -- Built-in Function: evalin (CONTEXT, TRY, CATCH) Like `eval', except that the expressions are evaluated in the context CONTEXT, which may be either `"caller"' or `"base"'. -- Built-in Function: assignin (CONTEXT, VARNAME, VALUE) Assign VALUE to VARNAME in context CONTEXT, which may be either `"base"' or `"caller"'.  File: octave.info, Node: Statements, Next: Functions and Scripts, Prev: Evaluation, Up: Top 10 Statements ************* Statements may be a simple constant expression or a complicated list of nested loops and conditional statements. "Control statements" such as `if', `while', and so on control the flow of execution in Octave programs. All the control statements start with special keywords such as `if' and `while', to distinguish them from simple expressions. Many control statements contain other statements; for example, the `if' statement contains another statement which may or may not be executed. Each control statement has a corresponding "end" statement that marks the end of the control statement. For example, the keyword `endif' marks the end of an `if' statement, and `endwhile' marks the end of a `while' statement. You can use the keyword `end' anywhere a more specific end keyword is expected, but using the more specific keywords is preferred because if you use them, Octave is able to provide better diagnostics for mismatched or missing end tokens. The list of statements contained between keywords like `if' or `while' and the corresponding end statement is called the "body" of a control statement. * Menu: * The `if' Statement:: * The `switch' Statement:: * The `while' Statement:: * The `do-until' Statement:: * The `for' Statement:: * The `break' Statement:: * The `continue' Statement:: * The `unwind_protect' Statement:: * The `try' Statement:: * Continuation Lines::  File: octave.info, Node: The `if' Statement, Next: The `switch' Statement, Up: Statements 10.1 The `if' Statement ======================= The `if' statement is Octave's decision-making statement. There are three basic forms of an `if' statement. In its simplest form, it looks like this: if (CONDITION) THEN-BODY endif CONDITION is an expression that controls what the rest of the statement will do. The THEN-BODY is executed only if CONDITION is true. The condition in an `if' statement is considered true if its value is non-zero, and false if its value is zero. If the value of the conditional expression in an `if' statement is a vector or a matrix, it is considered true only if it is non-empty and _all_ of the elements are non-zero. The second form of an if statement looks like this: if (CONDITION) THEN-BODY else ELSE-BODY endif If CONDITION is true, THEN-BODY is executed; otherwise, ELSE-BODY is executed. Here is an example: if (rem (x, 2) == 0) printf ("x is even\n"); else printf ("x is odd\n"); endif In this example, if the expression `rem (x, 2) == 0' is true (that is, the value of `x' is divisible by 2), then the first `printf' statement is evaluated, otherwise the second `printf' statement is evaluated. The third and most general form of the `if' statement allows multiple decisions to be combined in a single statement. It looks like this: if (CONDITION) THEN-BODY elseif (CONDITION) ELSEIF-BODY else ELSE-BODY endif Any number of `elseif' clauses may appear. Each condition is tested in turn, and if one is found to be true, its corresponding BODY is executed. If none of the conditions are true and the `else' clause is present, its body is executed. Only one `else' clause may appear, and it must be the last part of the statement. In the following example, if the first condition is true (that is, the value of `x' is divisible by 2), then the first `printf' statement is executed. If it is false, then the second condition is tested, and if it is true (that is, the value of `x' is divisible by 3), then the second `printf' statement is executed. Otherwise, the third `printf' statement is performed. if (rem (x, 2) == 0) printf ("x is even\n"); elseif (rem (x, 3) == 0) printf ("x is odd and divisible by 3\n"); else printf ("x is odd\n"); endif Note that the `elseif' keyword must not be spelled `else if', as is allowed in Fortran. If it is, the space between the `else' and `if' will tell Octave to treat this as a new `if' statement within another `if' statement's `else' clause. For example, if you write if (C1) BODY-1 else if (C2) BODY-2 endif Octave will expect additional input to complete the first `if' statement. If you are using Octave interactively, it will continue to prompt you for additional input. If Octave is reading this input from a file, it may complain about missing or mismatched `end' statements, or, if you have not used the more specific `end' statements (`endif', `endfor', etc.), it may simply produce incorrect results, without producing any warning messages. It is much easier to see the error if we rewrite the statements above like this, if (C1) BODY-1 else if (C2) BODY-2 endif using the indentation to show how Octave groups the statements. *Note Functions and Scripts::.  File: octave.info, Node: The `switch' Statement, Next: The `while' Statement, Prev: The `if' Statement, Up: Statements 10.2 The `switch' Statement =========================== It is very common to take different actions depending on the value of one variable. This is possible using the `if' statement in the following way if (X == 1) do_something (); elseif (X == 2) do_something_else (); else do_something_completely_different (); endif This kind of code can however be very cumbersome to both write and maintain. To overcome this problem Octave supports the `switch' statement. Using this statement, the above example becomes switch (X) case 1 do_something (); case 2 do_something_else (); otherwise do_something_completely_different (); endswitch This code makes the repetitive structure of the problem more explicit, making the code easier to read, and hence maintain. Also, if the variable `X' should change its name, only one line would need changing compared to one line per case when `if' statements are used. The general form of the `switch' statement is switch EXPRESSION case LABEL COMMAND_LIST case LABEL COMMAND_LIST ... otherwise COMMAND_LIST endswitch where LABEL can be any expression. However, duplicate LABEL values are not detected, and only the COMMAND_LIST corresponding to the first match will be executed. For the `switch' statement to be meaningful at least one `case LABEL COMMAND_LIST' clause must be present, while the `otherwise COMMAND_LIST' clause is optional. If LABEL is a cell array the corresponding COMMAND_LIST is executed if _any_ of the elements of the cell array match EXPRESSION. As an example, the following program will print `Variable is either 6 or 7'. A = 7; switch A case { 6, 7 } printf ("variable is either 6 or 7\n"); otherwise printf ("variable is neither 6 nor 7\n"); endswitch As with all other specific `end' keywords, `endswitch' may be replaced by `end', but you can get better diagnostics if you use the specific forms. One advantage of using the `switch' statement compared to using `if' statements is that the LABELs can be strings. If an `if' statement is used it is _not_ possible to write if (X == "a string") # This is NOT valid since a character-to-character comparison between `X' and the string will be made instead of evaluating if the strings are equal. This special-case is handled by the `switch' statement, and it is possible to write programs that look like this switch (X) case "a string" do_something ... endswitch * Menu: * Notes for the C programmer::  File: octave.info, Node: Notes for the C programmer, Up: The `switch' Statement 10.2.1 Notes for the C programmer --------------------------------- The `switch' statement is also available in the widely used C programming language. There are, however, some differences between the statement in Octave and C * Cases are exclusive, so they don't `fall through' as do the cases in the `switch' statement of the C language. * The COMMAND_LIST elements are not optional. Making the list optional would have meant requiring a separator between the label and the command list. Otherwise, things like switch (foo) case (1) -2 ... would produce surprising results, as would switch (foo) case (1) case (2) doit (); ... particularly for C programmers. If `doit()' should be executed if FOO is either `1' or `2', the above code should be written with a cell array like this switch (foo) case { 1, 2 } doit (); ...  File: octave.info, Node: The `while' Statement, Next: The `do-until' Statement, Prev: The `switch' Statement, Up: Statements 10.3 The `while' Statement ========================== In programming, a "loop" means a part of a program that is (or at least can be) executed two or more times in succession. The `while' statement is the simplest looping statement in Octave. It repeatedly executes a statement as long as a condition is true. As with the condition in an `if' statement, the condition in a `while' statement is considered true if its value is non-zero, and false if its value is zero. If the value of the conditional expression in a `while' statement is a vector or a matrix, it is considered true only if it is non-empty and _all_ of the elements are non-zero. Octave's `while' statement looks like this: while (CONDITION) BODY endwhile Here BODY is a statement or list of statements that we call the "body" of the loop, and CONDITION is an expression that controls how long the loop keeps running. The first thing the `while' statement does is test CONDITION. If CONDITION is true, it executes the statement BODY. After BODY has been executed, CONDITION is tested again, and if it is still true, BODY is executed again. This process repeats until CONDITION is no longer true. If CONDITION is initially false, the body of the loop is never executed. This example creates a variable `fib' that contains the first ten elements of the Fibonacci sequence. fib = ones (1, 10); i = 3; while (i <= 10) fib (i) = fib (i-1) + fib (i-2); i++; endwhile Here the body of the loop contains two statements. The loop works like this: first, the value of `i' is set to 3. Then, the `while' tests whether `i' is less than or equal to 10. This is the case when `i' equals 3, so the value of the `i'-th element of `fib' is set to the sum of the previous two values in the sequence. Then the `i++' increments the value of `i' and the loop repeats. The loop terminates when `i' reaches 11. A newline is not required between the condition and the body; but using one makes the program clearer unless the body is very simple.  File: octave.info, Node: The `do-until' Statement, Next: The `for' Statement, Prev: The `while' Statement, Up: Statements 10.4 The `do-until' Statement ============================= The `do-until' statement is similar to the `while' statement, except that it repeatedly executes a statement until a condition becomes true, and the test of the condition is at the end of the loop, so the body of the loop is always executed at least once. As with the condition in an `if' statement, the condition in a `do-until' statement is considered true if its value is non-zero, and false if its value is zero. If the value of the conditional expression in a `do-until' statement is a vector or a matrix, it is considered true only if it is non-empty and _all_ of the elements are non-zero. Octave's `do-until' statement looks like this: do BODY until (CONDITION) Here BODY is a statement or list of statements that we call the "body" of the loop, and CONDITION is an expression that controls how long the loop keeps running. This example creates a variable `fib' that contains the first ten elements of the Fibonacci sequence. fib = ones (1, 10); i = 2; do i++; fib (i) = fib (i-1) + fib (i-2); until (i == 10) A newline is not required between the `do' keyword and the body; but using one makes the program clearer unless the body is very simple.  File: octave.info, Node: The `for' Statement, Next: The `break' Statement, Prev: The `do-until' Statement, Up: Statements 10.5 The `for' Statement ======================== The `for' statement makes it more convenient to count iterations of a loop. The general form of the `for' statement looks like this: for VAR = EXPRESSION BODY endfor where BODY stands for any statement or list of statements, EXPRESSION is any valid expression, and VAR may take several forms. Usually it is a simple variable name or an indexed variable. If the value of EXPRESSION is a structure, VAR may also be a vector with two elements. *Note Looping Over Structure Elements::, below. The assignment expression in the `for' statement works a bit differently than Octave's normal assignment statement. Instead of assigning the complete result of the expression, it assigns each column of the expression to VAR in turn. If EXPRESSION is a range, a row vector, or a scalar, the value of VAR will be a scalar each time the loop body is executed. If VAR is a column vector or a matrix, VAR will be a column vector each time the loop body is executed. The following example shows another way to create a vector containing the first ten elements of the Fibonacci sequence, this time using the `for' statement: fib = ones (1, 10); for i = 3:10 fib (i) = fib (i-1) + fib (i-2); endfor This code works by first evaluating the expression `3:10', to produce a range of values from 3 to 10 inclusive. Then the variable `i' is assigned the first element of the range and the body of the loop is executed once. When the end of the loop body is reached, the next value in the range is assigned to the variable `i', and the loop body is executed again. This process continues until there are no more elements to assign. Within Octave is it also possible to iterate over matrices or cell arrays using the `for' statement. For example consider disp("Loop over a matrix") for i = [1,3;2,4] i endfor disp("Loop over a cell array") for i = {1,"two";"three",4} i endfor In this case the variable `i' takes on the value of the columns of the matrix or cell matrix. So the first loop iterates twice, producing two column vectors `[1;2]', followed by `[3;4]', and likewise for the loop over the cell array. This can be extended to loops over multidimensional arrays. For example a = [1,3;2,4]; b = cat(3, a, 2*a); for i = c i endfor In the above case, the multidimensional matrix C is reshaped to a two-dimensional matrix as `reshape (c, rows(c), prod(size(c)(2:end)))' and then the same behavior as a loop over a two dimensional matrix is produced. Although it is possible to rewrite all `for' loops as `while' loops, the Octave language has both statements because often a `for' loop is both less work to type and more natural to think of. Counting the number of iterations is very common in loops and it can be easier to think of this counting as part of looping rather than as something to do inside the loop. * Menu: * Looping Over Structure Elements::  File: octave.info, Node: Looping Over Structure Elements, Up: The `for' Statement 10.5.1 Looping Over Structure Elements -------------------------------------- A special form of the `for' statement allows you to loop over all the elements of a structure: for [ VAL, KEY ] = EXPRESSION BODY endfor In this form of the `for' statement, the value of EXPRESSION must be a structure. If it is, KEY and VAL are set to the name of the element and the corresponding value in turn, until there are no more elements. For example, x.a = 1 x.b = [1, 2; 3, 4] x.c = "string" for [val, key] = x key val endfor -| key = a -| val = 1 -| key = b -| val = -| -| 1 2 -| 3 4 -| -| key = c -| val = string The elements are not accessed in any particular order. If you need to cycle through the list in a particular way, you will have to use the function `fieldnames' and sort the list yourself. The KEY variable may also be omitted. If it is, the brackets are also optional. This is useful for cycling through the values of all the structure elements when the names of the elements do not need to be known.  File: octave.info, Node: The `break' Statement, Next: The `continue' Statement, Prev: The `for' Statement, Up: Statements 10.6 The `break' Statement ========================== The `break' statement jumps out of the innermost `for' or `while' loop that encloses it. The `break' statement may only be used within the body of a loop. The following example finds the smallest divisor of a given integer, and also identifies prime numbers: num = 103; div = 2; while (div*div <= num) if (rem (num, div) == 0) break; endif div++; endwhile if (rem (num, div) == 0) printf ("Smallest divisor of %d is %d\n", num, div) else printf ("%d is prime\n", num); endif When the remainder is zero in the first `while' statement, Octave immediately "breaks out" of the loop. This means that Octave proceeds immediately to the statement following the loop and continues processing. (This is very different from the `exit' statement which stops the entire Octave program.) Here is another program equivalent to the previous one. It illustrates how the CONDITION of a `while' statement could just as well be replaced with a `break' inside an `if': num = 103; div = 2; while (1) if (rem (num, div) == 0) printf ("Smallest divisor of %d is %d\n", num, div); break; endif div++; if (div*div > num) printf ("%d is prime\n", num); break; endif endwhile  File: octave.info, Node: The `continue' Statement, Next: The `unwind_protect' Statement, Prev: The `break' Statement, Up: Statements 10.7 The `continue' Statement ============================= The `continue' statement, like `break', is used only inside `for' or `while' loops. It skips over the rest of the loop body, causing the next cycle around the loop to begin immediately. Contrast this with `break', which jumps out of the loop altogether. Here is an example: # print elements of a vector of random # integers that are even. # first, create a row vector of 10 random # integers with values between 0 and 100: vec = round (rand (1, 10) * 100); # print what we're interested in: for x = vec if (rem (x, 2) != 0) continue; endif printf ("%d\n", x); endfor If one of the elements of VEC is an odd number, this example skips the print statement for that element, and continues back to the first statement in the loop. This is not a practical example of the `continue' statement, but it should give you a clear understanding of how it works. Normally, one would probably write the loop like this: for x = vec if (rem (x, 2) == 0) printf ("%d\n", x); endif endfor  File: octave.info, Node: The `unwind_protect' Statement, Next: The `try' Statement, Prev: The `continue' Statement, Up: Statements 10.8 The `unwind_protect' Statement =================================== Octave supports a limited form of exception handling modelled after the unwind-protect form of Lisp. The general form of an `unwind_protect' block looks like this: unwind_protect BODY unwind_protect_cleanup CLEANUP end_unwind_protect where BODY and CLEANUP are both optional and may contain any Octave expressions or commands. The statements in CLEANUP are guaranteed to be executed regardless of how control exits BODY. This is useful to protect temporary changes to global variables from possible errors. For example, the following code will always restore the original value of the global variable `frobnosticate' even if an error occurs in the first part of the `unwind_protect' block. save_frobnosticate = frobnosticate; unwind_protect frobnosticate = true; ... unwind_protect_cleanup frobnosticate = save_frobnosticate; end_unwind_protect Without `unwind_protect', the value of FROBNOSTICATE would not be restored if an error occurs while evaluating the first part of the `unwind_protect' block because evaluation would stop at the point of the error and the statement to restore the value would not be executed.  File: octave.info, Node: The `try' Statement, Next: Continuation Lines, Prev: The `unwind_protect' Statement, Up: Statements 10.9 The `try' Statement ======================== In addition to unwind_protect, Octave supports another limited form of exception handling. The general form of a `try' block looks like this: try BODY catch CLEANUP end_try_catch where BODY and CLEANUP are both optional and may contain any Octave expressions or commands. The statements in CLEANUP are only executed if an error occurs in BODY. No warnings or error messages are printed while BODY is executing. If an error does occur during the execution of BODY, CLEANUP can use the function `lasterr' to access the text of the message that would have been printed. This is the same as `eval (TRY, CATCH)' but it is more efficient since the commands do not need to be parsed each time the TRY and CATCH statements are evaluated. *Note Errors and Warnings::, for more information about the `lasterr' function.  File: octave.info, Node: Continuation Lines, Prev: The `try' Statement, Up: Statements 10.10 Continuation Lines ======================== In the Octave language, most statements end with a newline character and you must tell Octave to ignore the newline character in order to continue a statement from one line to the next. Lines that end with the characters `...' or `\' are joined with the following line before they are divided into tokens by Octave's parser. For example, the lines x = long_variable_name ... + longer_variable_name \ - 42 form a single statement. The backslash character on the second line above is interpreted as a continuation character, _not_ as a division operator. For continuation lines that do not occur inside string constants, whitespace and comments may appear between the continuation marker and the newline character. For example, the statement x = long_variable_name ... # comment one + longer_variable_name \ # comment two - 42 # last comment is equivalent to the one shown above. Inside string constants, the continuation marker must appear at the end of the line just before the newline character. Input that occurs inside parentheses can be continued to the next line without having to use a continuation marker. For example, it is possible to write statements like if (fine_dining_destination == on_a_boat || fine_dining_destination == on_a_train) seuss (i, will, not, eat, them, sam, i, am, i, will, not, eat, green, eggs, and, ham); endif without having to add to the clutter with continuation markers.  File: octave.info, Node: Functions and Scripts, Next: Errors and Warnings, Prev: Statements, Up: Top 11 Functions and Scripts ************************ Complicated Octave programs can often be simplified by defining functions. Functions can be defined directly on the command line during interactive Octave sessions, or in external files, and can be called just like built-in functions. * Menu: * Defining Functions:: * Multiple Return Values:: * Variable-length Argument Lists:: * Variable-length Return Lists:: * Returning From a Function:: * Default Arguments:: * Function Files:: * Script Files:: * Function Handles Inline Functions and Anonymous Functions:: * Commands:: * Organization of Functions:: qtoctave-0.10.1/qtoctave-info-reader/test/texinfo-2.lzma0000644000175000017500000022712711511434230022122 0ustar lucaslucas]* 'd_>s4Frfs cJ{8iE%Q 1#P7uxki+_ Y PW&rKVt'X6 " 52!2{P&TF n(>-F2.+=yѪ-;ݐb% *IݓǕnea- Lya&1L2;۵ -۱@ . vKkgX+0aoW~)K2{v/3d*A1\^P_mz5)M%.C 1r;,֬m$"Ii}F3C:cpd؆";_?چ2aՎ4ṇ!2@|J|& JEy/ vmZgٿ6&}2W$Yyʏw9e}J: 9;\KxE-"1!XwKhqݱԣ#\etK(zҨ^.Kz,u!4;c%W-OU^]bMTm!ŝ|\M'8 Ӓs6@+D8G2ƽG%D64}Cahom|qF;U޶vꑭﻙi ).p(}WEе#T#R0 {HQ HNAZ a,d=KbGL\ H#"l_x@˳1qe8ZRނ2YFBnM[.[T%E.{" 8qɼtR@4F[/p%l5ԆZk"X[憮db%蒳6R+Fc1oAZ4 'I5'{"Rt𸉬ό7d>2$Lnشlqre7-vn[kY C3 eszOv$(.kSl*?Uz.. WɎ ;ۺ8,ZS5W9{eRcPYv8^9}#nuou"koγߒ|ǐi3ׯڃ *Ԃq~چ𴝯$xGx/p 9(o_J5sW Nz{'} h u5pED=eG\Vo)DFЮJHk8ڃ?Zu\PdR^ \j٨G ,>,Uxc{fžW" ^ܸ}g k]yp 2OT ɲoҌ;sl{ʺײ~Dք&Jd#KRoco\h|2^j?bϵ%Z5^9CXLsǮaP7֋XzSNDߘ P><U^i1cec:s?8!)|{ SUئh)NLy.Wb%f{gu(7E!VSFu3#ĨlCݾ \UE*ǚpnDtIid|c48 2Y3w_}8O,wQ= j_(KpH0i5#u AIYNDLSw FW}p2r7- *D9iqW2QIpBzn#gtGCHJoJM/<3Hle^lVm]6gwڠ/iGuU*~ amԋ2 ?+rgQš}JH%ºaWF#GіBr &mC96U\D:,oPbfVy\7֭kO SPTD3oHqI^ҫ5 /r$t>|R33݈KՂA9X!z+ÃffŊN3R#Pmj Kɬ VnWܟ7Ţ/3XU^.ʑ#\vG&-G!OKu1! &')[dA]/b7U{-yʐc__nx[;S޷ ro𛅪 ^KƛRAbxY[յ6(ԉii}=v\q ȗN<Đ⡷\7|Dž,|2HQ\JTֺ0o~lg\V=[NXZ o j%I&-&o۴8N. 2*<,ͦ&^ p @0I a8|~b/]'hȆ)/FM5zR15[l'myTя?4V`Ej+4E\a'ЁHNϚ{2?pM W̝T (HRn;UO]p~8)alʛ/Z n fUE/,s wo:kanE |-3lqz3ʜ=u[ K t`g,G›x3Ms+U/&^Xv1GAv EEj^IXI#U qo4nE I|ȩxҝG/s؅)@t[;¡rtR;YYt&J?]?k-]u94 ?Ё,R#aWZ8<7D1. drB P]N=~?s4w(g|Qs+LY w\@wEDq=ls40:{O5lj^n}&}yJ\"`N8*k kKZ㷷q"-KJ0BG{z8qs1|xJ=Nw~p:}׷%u4? ּt@)(ELt`T?b ėq%ܾx-"`pK9(=񊃗i\e!iՅ%7p}E&NYoZW&-\t=Z~_{"{dPu܄fBeuJ7 2YY҃ rʐxs!th鴇(aU^> '6|E7<{:5(gQNqJН "oHv"ƺ.bCAۥU2$u;K:p`Nn G_-8BGh}x!Q/m?X@-A9 }إp4"wԇWޫ"!<>[eL.̆Θ[ݦFdT(8J#jd2CHY3wQЄEO(q>' s~%!$`rs3MJtf_YC]O<1Nдtr*Nx=4oAbd} $cF0  {'f|wܷAy]3Az6XtRU`HaY[/T$pc| Yjp ~x*ΘHdR %Jv4@kX7P :y !="2np[efdc(}}t+@}^-Q&#?ZW`\oגyW#r P&4CNnMk({Y^\E~'gU ~-y4Y*MsY99"޴j'ۿ@Z#8e8*wʜ7{&E5syaJ@tWa-#nҤiIY EU7O.D9e+\qֹ^X1v>@!c?#NsMτMۤn16dra`N X❕#t:Dwmt 4vry@MMКཨ ҍ +n7˯xJi]b X"Xj!t~Z e(Ⱦa7uGzmΰ :&u$$2ȺiVoĵbb[ (ezZ"r3 (Đp{ b}42\Zx{S@4md.u?{5Q!g.N"ߩ{[0+)qZaA D G^"k/Cƅ!a܃`?nܩFA)5Jm[Fl@~f ˴vߖO=8ђva|O>28=Mnz(w\aӝ8tZߊ3`?F-wSzD-Sk !Ф)8ΗT 8 ʀylrш~^SFxuʼn="`݂gНrV9*U7C0i̒=pZă.ޚÂhrU CMB aўPƼ` x+-Sl'*}j}e)t& 57ÈPR=? R Q^pi4 <2|Ɓ_ k7vpA=F52U}Ma|]0.B(xc*^f7;ӃǙMcsGzW2]U"̞24 ܟz`C=ԈVF3C#t,pL1h(#3`~ϥS_Y{izXTZ;ÙWp6U^U q_7ˡYqSS:3VY?W~)R4~vA4HƱ\iv I|@kbϟ E7򷗚]2C-2x:+ d^wƳmm5\7A2f֪6#J\l/:0@WT8`71OwT?e-u(ARW>j9[Elub8gIbDh- ( ֛76e `J"ÙaV [CVhM|V'x_6#a: S`BE\g&xO~(3tf~ -3 V  s!CV;ϕ}+^odM>3ƈԊY xz{ʔ_;~EnSK c\XwY:N[?g(p!ǩD[~ʂQp9oo#QtͯϑFqmV*+Gy,l"TQ/e{9LEެuƞ'Ps)HWrOpG{ӿܥiHdV 7*:|sducEV<߮4>$"ٚ)S " 'upf麫~Yqb}9D롭Wd6б^uDPDMטD5Nh k@ q<;}i|<ޱi4EXV,>xeni-Vƍ< #L؄ @ v#ϨȚ;  ]=NJ rX3l6țOPoV`d^`Vx)n \7) f;35rֽӘ^d֤Q1,x4`!<_*c #ZdbWLp|~ bLLv$_84d=1撈|Rk3w?~]2C]Jw\[dI6H=֝ٶDt^4fJocm{B}w0"@wR9Ȣ܏ (Qu/a.ta1u u|j Z2LlAWliՃ ''U\R}zf lҦ1ĘSMК-xt}GHC"j1PG8 ^3 ~^ٛ`&-3?ﴆ'?oR, ޙis y tV.<݇4ObJK|b)Lj/#Q AtKsA1rL']v &}vcEW:.л&)m -Љ?b O0ªsY3ea8dz6Qn5c#Osw>JL>m6mSr?Zs.\8w\v5& yY`fxd?}TZ x@׫Yƚ=&-'^\©Y'%*Ņzf=Ee5%5%<}W#1i"PE0]SKcDdn`4>pWG>(^5]F;ifPX`:dr YM*IS~z4 ;0>U d4g$ʘށq=RW.\:c.y&6𧻓 2hW ͲGN.ƌzNJC`S2^~O8܆1WOr vyD2## ބlP(~WѱW6_ulU3l'*}r{8)m@44 JsȦ"9쎆*k;Ezl-JjFH8wUIkoŇ50ig'uBg-KzwHD\=;}PyrTFK4dW(sW:tsSo#EjZ:FX WZ[ Dž$V{W~=ձW>L^K8; b|':>/.qAAm6 [nB%t8.>hSL\8粣u:ej7*>$#wm5ͪ6/8ڇ˂z(?6 ? TBy2%Oh%KT /kEX{~=JJ0CRԍts #aF2ma ڷ.x6 Rqr `̲L} Kdztɲs?.J /^(ÝW<^^]]ۤ63w<Ӥd ) C 7f4rxmA53z\-ˆW#ESnww6gKA>z/DCERs.c׏۱ `n誏H @+c[6WL@쑁eW[ZBa$2ul9zжMЪNA{%Y8eVIs9 ;w$#Vv6O6`84䭀M.xPנY:`ԓPУ.NVXrCSB|ށ?oL@"^,"raAC#Jó1 D4W(}|Y$z73[񼽠\N_ϔa](s-j#oEC,{ $U[pE#ġn1Y< e&%`~b]*?7vSaY[0׽j}myl GI,qJ}# 놚);DVljZ; 9]w28-z&V0o}uuJ]"=DX _'xGPV9'ftP!hXP'}_mAj2(E%4 |ϗ-gvvKʷI(Zfh-*tŤ17:ۜ0ł׳zl$ zyun YRh'N֎#߈x3{C" !TXц' DJ/U>&N@e6 =!Dܦ،sGOէ$7wP7}bnL~։{'ε~Y|#<$1mz6;{nMif צmv/+2[9-ЍP_nӘe,xZsdHPq2ïۍ#G1&_Nbd+Ly³+PN" N#1A qjkRcN"PEj@M+>bJQv^Q2:{F..`uLe/:ʈ{ǮFfy#wstR>e1HhٔQV:x)wiRI(x:eK{M`0ժ 1] I)^s*G$һT#a a(gK~mi", ȣmn!pP45X#5B/X VT} auĄ4^`LƾY6עv zVDfLem8rdQm^u'rn/xl~59XdD 'y$~_r>zW&ZdK'N+ƼL#skY"b ^y %zќ?_HAuvT_d%4W5q6Lsㅛl "E6 v.`.:,D} T4~~a#lzJZŸ tf?ˀi#}_: 8 Q-#˾c]2vtC"ȶRS)tZ("nQ> 3Rnzg`r@ʬ G7CEoH:Pd!G;aݒu:z-fThX8}O 5~}챐dۻOC+8 0%s ԃ[мE)a͔i+=3 yLHQ3ZlR0jI m'6†B^Eo0}Ueā]weX@H8F~;ɼ #-MRw4VPY$ 9hlI}$D7ihrJ }~-'sVR&f%Yl._ʧ.OXc:#f0$g3M'VA3?K#xǠ=`X^`+znz&QoS:/qc_01Cjk"~n:Zpt^j$cjzǓTBj+9BYmVZ|&Qu?R3''m#:,Ȗ2z8?.Xİ/6m]Q"m1*niiЯ Lb_zٽO\VDwx$jj]ҳɦ&24`hz ۭ-MEV\OR8diћ'{JAUl׸7(T5B.?r)gs֒ޒ4u?I._`vx > (?uEUqNh /UHUl.| ZhGNg?QJ{{]q8=R UPԳ u"dNjB =Pw@{N&*&m^,F!UЅ4PCHd8Sxh/lCPѓ`:f)Blq4Yڜ}?5Y zW. @R&K>TڙhEUx6`IRwm׬1,$[( {bkiU~q2[VgUg|s6ƞcgg8CPCC;dpVkj .}{X MBXz8{nW{?Sa+bYya`\YV9z9bޒMwoIsxw&Fmֳwd^h>nǫf,Vf խA7cyi_k|D&C[-M`뀚KEd hF9Tj@\.jUwWSѳ* skX-NR.(ބ - \sa4&W@Do` P.Vc?kѴ2O,w?BUX'˷+ (ܠa-M4vF!rF;X9;dkY]$%Ӎ@lU)A0NBd0OfZiT}xDPr3_QK]k\nq0Vm3|W h2f4Ct[5ia5u+J1|uUf-QOZ=(l26j?ՠ&A2]hQ~joB&?:cRJׁ>|-@Owj#]}2 ÛQ|pZ(LǪ?ӳ?#d馫xi`@h?[dVg@$]X ImP5I T ~ɶ%o(8@&SkяσE:FDrVzֺ<йK[?|Vޞos9.IZSj!g@ҁq,@%Fc#`tfsp)##Jcgb3ZxQAEnu~hqA}WLYѭ11qNtYogĄ=.OX3M ]]X/4\ 7@bfAW.}wck1{|TK [(oWvslD,eTM6i^/iq=.;46$]MmH~T$W_)SllgjM.Vd+ǃdD:>p*!ʿ?kk X^]n3ntY'Ѯ7 -Cj@% ^sXxC:g:6(t/ >3 +hI}Mx~-d܊9k癏ƨ/9◙uqEt1+eJ<;5&* $,70b4#qguvk™x5Ru{+tL `ЛZ9LFljPGXiu^_LUW@Pc`}YduP:N( :Վoˆ GB- 9o$9!i(kMpVL.x}pnj_h6zcC.aޡe*븪)e$ !3EdC&VˁA!Zvؙ"u`gSkv5(_>F5İoھܞDIT¶HgQ[ru:3zFsxQMh1QܣƆsBP1$a:ƒ։Fywٸ/C'i!a[r^*BGȯ=!LZ*/bRDO/M3#9=51Cf$ՂٿhDL5D侹 ;:#1- :K<{O|@n"ӦHB,mG+ZTq5,>=QZ8דK,>%6Vo(KAM"Ej_أaL9"WrB!~I-_Ƹ(nT|T-٩ D҇ 0> QH`;սcrЂjR 1h7߶#ދ +D>#niPUf,иٔ.fDz`E.P /g~cIkVُ& '4 ,c*FUJ!:( n ̳(#ѥ5s@70ynuBAJ\iSڂXo|Ns)) *̲ 1M*n2buhbJqh"i&T |/O 1)͙ Z/_J QS`KpS=i CWDqVZ lc3)E4U<_pTI/؏@H7d]\ LZ~dӧS>I}iqf_/}W虔n"Ge!^]JXϊÅ\ft=VbIٺLQH!  w8/%\<ԷU&L(SBd Sn )Z)k2 οJ:ڎ SLEJf-eٙۀ~\i>ڢhH ӥ@)Jqvl|j֋KN|I5ϊY}#E`8|ך֬ג]hmOϕ0勨v`'jpVTѭ CgxP$|>vP+r=s~ vk,`|]7M>ljrV9m[x+SHa쇿z>)2 D^<3v.~xi7۬ ,]4B 㖱EY2/2ceCU=sQ̺ sR" m(|XF]s1PuUCņX|!e ޱĵ >C|$%@bJ"G:2~ W`>*- Go!ǟ ԳEʢI} : USX%%aTr ` ;]k΋S<|#^kf~L\B5:zcD0xXh/w.ZMjdpt9eie89G[$m֩$[n+]Y%ԾVdg 3>o @-?. )& =& ArԐ2=T}Oʕ;mzacglhv;z JcM,ooHȌ @*A)a:2rҶ_"UNU I0Efb'BU!h?GaNbaJ `#Ex-IyF u{r(7%Ae=plTCyF>_#3WZ7JZG|jM1:@ƌgOfrWPKQQ82we#&9W&|عݕ "0Wb%q\;rqlm >SO\6 m4!  >AS |S$->XՋbaYF8WTW;8 4穜B"%:U?J*]NZvѰ;L<;H?pliq&TF(FN!GH)2eJ'9[ư.&Fh׀S0~:TaM5vd<iڎ90Sյ|=霼bAU G]ȅ`/&Ef5Ul}m/P[K"eb%oPDr EyO,1q|7Jj&w_D@^G>  QFiз149Mz|aK @d£qqC$ \NljGPo"!3eص;u~| ꉋus=T Cbi9*TFgY¤TRu0$+ccN[Ei.nbk jk\묬猛<ޔs<~ja>-w5OY*(\*ϜS m>,8 jЄlzߌh7Py g@ gmVq^;.iXN+5ic-%Yt+n18 F_5̞[NFH]ݖIoFj`Cn FQOqN!K;ˉ B[vgmئ$(k˵l. :&tT3_lr?wKwt"Fz}ܴ S#K#L2\i/OReBl$ŝ@۶$ !{Kr4acmN&{yܻÛ^=W.%tekyp[ؔȏGzs`eK'4ǺA^%~1P^d:qlb!$Up/=i+oi(n槤&oL XҊ/DYf ?Ӷ5k,ۀFB۵O2ޟZlb!%UN6_&C ciŤ&kUw~U]|pI߭ߜEq8=sO{v9CqE/3qs 0@-Cdܾ ҩmjkL,[oLdѫmSΰ6 *W& uKS ͉uB`) & 47-jWk8T`lBt%q)2|4q*ʙfTh=R3"5ގ-`cw/ 7Ch-\^WluuRL=b<],IA]krZ#VkƌUyVZ7ЌvF;?H HyE6*WqVނ~C'udMhi6 86MBMwźN]xk! Xs^▄P?bIMU*WTLZ=@`Y8픠~O)0%BDN!b=>r[i%,5%X.e Dnvzd;g[}ugKzm&9aot!&#x~Mv#J1$v%ЫiRuKW]ФͩѾ "uG~jh>ça_9o\H&OW-4G]x]}Y9@hBa W0t&+&) -㖹̤v,fFש؏7275Dm4.~ QO&7),,mlLw>8P~DZHcQPkʘc-,3y&0Lt"A?z_tYuSYGt RES( /szEo8'šj7%[:Aj{T+tvFx[UWŀ5 }]ܬc źm9ޑ?&٤Ydkk\qwn$JtwӖQZd5~\)3.!$1ʖIkSbu^̾BzvvN N5/oV˿ Se:y ݙ()`C zi2]aI#jjĹONQR]tA@?GW[vU۲CB3 r0g6d@e_9gvQx[,V{rncr>1I,4^Z/ʲc,ϊV眽 [/xQBM[~ўcL{*iGj0Tq*jľb2ĭ&UO34)/5"YH<=RХqǦ%^j9{pEȲRH hGФ(lv OG3fLe07{2G⥄:'JlĬ_g%RVsCz^\cɗj=+srx&"c96!F =oɶ d (ȷנ> iץ?]isS |I'"xɞ/9>i.}!.B$`w=b# -S}W"v nΟ+ B3Q}b/_^FԽcl"6CirQ9B M?e1|kh0z+Eeay DEkB|u- n7 Ӹb>7Pydžk1C79%^VPؓ+rPx{q`5v"QC5zjr;UTIFre*GCIqRv_Z,%jpvmF^Um*KJPV ɕg,D0ݾ_|nC4}znt8Y#h(o;bQsn} qV{H$/'ua)zKSy9>'5tzBɈ& 5\ %Tި VQck_Ȓߤ J/ !rmX-Rhf 7e#{D 4ROS O6/Xsp ]@H, o]vI%=!&amPI ߎhkh@(~6{p"6-j ܙbxa,aEmCà,ύw[ .3N'Đ`D;ŪGbUd6E=WKBvGpa=V- 534F6VGQtYA-$؟>-U8anz%ӟsř&jw&-m W-68}.es0#> }\pAۇpF^2`ߍ!_!mĔ4בjv>!j2!R˅aZƳVߑ^Yу̀:N㽎qw s+3嚅ERaxT&D~=^6u(TtUzuR~G hY|$fai%e5H> *Ln &F0oe'cac?Rvl᮱ #2`uW Nc0Zmfv^UCJKS1K69bas.nDkg`"i/pAJ5w)R63SSMuLa"FMB* (_"L2('U+6"nY/RH?Z9=Pֽ嘮Zw-A`ƃLB ij]Jj`P'2 A?VW*xnUZB!Z'sԒ弐Ţ nSatxbjO Q706) Տ/)_V|jyˤ!/`a up8 )7m#X=&uYUOPvMg,SOXf! _ӱ#Y^9`& =K@^4d6ЌE$# ݬ| - `Uo\apz_246e>Nn.%٢氬Y?A/=^D~}ȱ㥣a^f$!dyK=/۸`mk9B MM>"`Etꇅ sHIa zgB*7&#kEZ8yy e6 orr|f f},}0@:k"ϣJ]3~~Ɣ,`-Jh`~ЌmEէmҘjx\q~&pXtlt>#hcz8Sd(Y m^&lnq (׼4"eg%.TtWbvL2 =Z%1-&4&>КBÏ" =j@" >:pPD @HvD H~iEU|F9ЦDKòY/Lkg)>9$ FE1:.YumjK e=}+ 5/rX>'m*n1l>}/O3o[J#g9)- 2 z|IlP>~x!/0-ip#|{hkR*Y%uzzrC6H8!'F~rAJey.ώCn25#f OݾmS`!.Ņ:7a|H@5Ø\/b1SSt*ߡBnH!C=ZM`@tAtqMxڊ),/wC|VDocX( 2u9K6w.p׳M킚>Mwmh}`P)puWe/"YdfAyIzffTɽ9$z&}qp PGyȈӼi+N }}Nkk"# ak[fa sg,@xVUum XT2.o}vxNJC$[=p#*P@ͶGDh NƴRH{ Pep#:pʣw @󄇓wc{Zb*XՁ|یrP˗׏G[F.@|VV5h4Z(;|T\?]SҚGacz{a_諍!H=[J"E\-t-4%Ek],x6@L:' +DGҽfh[eZ7 k39:4Q^ DD#qN%oة6EbhN#9X0BLL_\9W&~ICk OO='9?"%aЙYvW*яn],J;ͩvP΅N_gB!HCf[g\?^bNwa/;0uȭl"u~>Vnݔ}m]8m؃haU.dN6 | ɲoYDmoNQ&<.}SD+NtԲGI99clώ'8"¢^h(g&"}pZ~SxԾN|<ãZv= ^ -`jQoD?(/Ƀ,8* qɵngXqA4zE@m[*\$NTt1PGZ>~O84Ys6RV2 `, h9FxD=]wػ+oŰv8ysW{#6io? < zSD2AW6**=y,kizr߉,R?SKrQXK>2o-Jt:/Vr#soJ˱lsU+4:إYar=u&(wY"NcjyyT""> @V-iݷ רEiKbsxqȽ +3b2 eڨOxGshԯnk ϢڹfhF9c?į="?;ZR tEn9ܷCy.aڂO<3wU38JgFM^FP`ɇL;B[oΡW=Q%F6$J ! q\BY%49́sIO1(|Cn!,sv0B H[MW4att:5$LYp_Y5̟r*4 נ'¢JZ(ut?W<׃"l]fg_؊G˾ ̸ :ZɄo5-C-Qep0|59׺sHOuK|dє&Șy3v@]"]Vk5p"{YUT:;7tRF5kiV+e=h$̾,0)&ˌ|L%o2 Ñm/eV?vU=Tl>!)CWD]l W 5{RrR&~72Li3&vv`\Yθv^BV?GqO7dr%Τ{5Sc|ґbSԕg0 u~>a*=0ۄ>Ն(TIVֲ_m:J==&l_jSQv8`Dt~p>/nuUMeOV+ ¨Z|){L׉G'6a8AmY޷eOEn T|K6ץڶe]Uo y}qE1,ާ o&N<94o۷.MxUMIz?mXulYQVőq)'U~1tJǷ'8z,f(\l):=".!'f:Bau}ݭqUZyY/lX."xX2"=X{1~8v%3xICg+Ii!H]_ 1,M٬d@5Pyׁx5wS_GHq  ݛ}&Z[8֢266 1sT0h~ Vm0C* zdםRxNNgM=!Vt&qޤY{3XBIRHұ,!=X=Eڗ-]o-ۗT/62PpDE_PMUNb_!2ʺު،ROv&RA35rсĆE|U?K(}>Ҟ*K0(basʳHpSMڞ[[VkKr|*A槕]9)l]̮F8Mk\NQHTM;$8AHOAP`"yGN2b>q>U;rUք|Q89e)I H#Lqchy*6f؞y^UiuJM<ϖG3{6d{I0F\%c*Jkzt^C%?Gn= *g඼)Br?gS.vX  qئZ^ Ju=@'D( .4[,"S %**2䌰p軌Jt zޗD!FSP\~E5R-- ݼ--I"*0l'՘ GT}1 Kjl|{{N8spÚov '*@4;W~k=lNdg|iȈkEq"*oIhW;%W!'0@~:GK傻J&I"uS~Ö6+is=UKdS }B_Rڿc W/,lO禈/|Ft.l# ?P)i{pZkxq;AU2x_L[ ;u5D9kW@aK;O8qJs%v;`Er" Ծ:N6:TڞRj%,EUx:F|V:|UB F˒nUFA9 QU |r}%B&-'<(O<Z6 U#560TmcۏW;oq e%.Nюk1׈Z3Yv)isCSV<*&(M%A6|O:nEb쎏V^v~Lr3~2񏗖_0q•[ԩOp(@HȬ}%,ÊTC<3棅OY9l͏LYV׵TX}Tc{U}cm"90SKϬI=-K08?j- _v*7c.⨖Vk$>L W-ؠ^bӰKgxie(^y*q|Ve)BpB?_2tD<.8֬?rBrdď$ڢg=Kt@{-;%DU&sOLař {Y.CEr5xTIevQ>Фwjl"AWkWTx$|l$F+z6(rQ;j>]RbWʧ~0d)FPVKT |zFU#2gtlJl|՗HzG*}d[{K`N ZEOL)Lyw]lanrMILme M=}¦'( دD+[Ak1/K+37א[&"l$ ZxC[)n"`7^WY5d7\ ߄FOd||Ss<Vj䕴4ԝZmRM~tsyg }[s@B*V =2.S{v uB ^p 8Xp'fVn/`;{Rf]Xb>b Ӑ-`H(eFT*xdBܣb D½Dbj.K)pU[/ciUޭ?%4ZD_C|=o[Ju;{^mnjF#Na05#_X PO]|\*\]ĨmƶC;8`AkArr8JHo+=snv=ϮU9+U#lTQ6Zr\=$C}6h m1"ܢkT}:1jPsScJ$/e9]А)PW`Y+[@! *~.$.N*8 hw@*"MZ"u1f̴8'MrIU*  zŸ́DߎVpF/ZqtY°̆J(72L4Е)oyw!N`G7^pK8jMPӾ8!&QOwO_I<8B?@PLҫƝ>W3`BɊ @r9 s&$ǚS=cV7ǻ?NhÿQIClK"8 6e"_8ep_1r=Xp)qKN83 {\H+:;{Bh@mԞ(-pvp2';y,p݈6X9h➐ zz$ ;*<ikl6bW8ۏbR;ѶE|n\@S-?`9*ϳ)c~u WGA2cݞl E9rg@Ecme>=.R7cC۰h.Ș \$EX`dqѥkMbR 8nlLXWa"۲F-~+`l_E,೔b2 56Z婽YGi, 3' v4Y5ncrB}z$k-<`0*vlHf71nʾ3˖sjHErh;_TĻt;U."VSjec_g_׿5vb6d4f. % rgc JLb#"qM8@u"wϔ -O PSobF@j@ i#8Y.p[|Ȅ -׽\kdVb땵=VpoJ~E +jg.>jԖBOZnou~)f_qar Uv^M e Ex˪jR?F-~PIEԪza,=[8<^yrtJ5NSȰpj̚r[)XtM!y;JX*jӦ:"URdY,[O HG(-kL?{ո)uƓ+Tc|`.pX b vd~_b i1LR շs1 P>'hhAI }JJ(gseμt>`/8ɒ[omGCS GޘeɄC9<q*4fF?aƘW&/'8  ~;McegNHwN0^o>3cMۜ㵄+wZЀ{-NjJ_Ei.},ƻҵ41CM^T`tPG D /\1ck?10J̀c[ɔ7VA!_kj6{A!>a }m \rb|.Eyڵ1#G;l/ l>i/GZ1m^RU|h3էy Z[e,x흖<z؁̉Er[|}~fwҔ\7q=ƅQHRHGj]^h֎z)|qK% Xau1$LT:}P1ҰAI`f&.۝vύ׬5 |E={ÛomL 1q؛>D,Uㅲ4=Ta k񙙷ٓ0-"BR6CqhD-`o M]>A|'F܄^=bKLYB9j4p4M&.>p\4RBqY}#6a9Gi+rMjƫt(ж(4wL$sD`1\r:[::%1p$6.UW5`Q'eC,i^zEoVA^wd9WpQF!;eeC2U[ 筛?Z;yhzH(NCwap $8 ŜzX&TSlDU:᭨$-M\Ĺ-Ȋ) H S4)_(OT Q U~rL&xU2/6_ڀgU4?<.R8WT"7f\>LGm-vvRe%6"-(cp:uNk!&'L dB B_0wVEq4Cx11.!sta˼7WCE?ͺc!_e 0^܉!@td̜[ddECjU=DoӻAa^ AZ[p%!ilX>*v"buv[xP~<86j%0z$:E|S$tt&̒(3 ]F~18NɹH0GZ48~6 <O0ŢQ+`tmɆ$1N"/h:U̢&QB,3A{\K|Ȃ9*c\b1'$39o0HN7_Y|I!(.!PA^7og$m|]h&tki;b5 /vjkjkQ"u3M 0|E))ޯ@ <>R21T5FxsIq?٢{S!#tOILsD3J*rdۨOOQ/˥i0iڦ"Nw5IqPWZz2\.5\MPۏX>p(8o!X=dKLG=뜶XI]Fwm"ϡϙ/&'[ZJ;9/n=0@gˍp;i׻pX 9w:f j@KLl+3SAhaWoz9@= K|Ģ T>~~ hЙi($rU#,O[1QŋkSMtzdJ{=91E (#[2o5^_lW1,qg.-5h8 yfFU8>3q'\ T%pXfP{mf ˰Ys_H.:61e62fs:<\K_LYtIP83PXȧ&8.P؋Lj#%iaµKHλ_Z鵽5c(fߨ(g~%yib~3jW=DQݳIҋ ('dWE Mr8EzmE1[9ۉE='4Co&'vz ;\f$wCsC-"lrQθuoxIr~}-J0 †>ݱn=q?a*fKAl:A*^F'|~%iu|.G~0{\$l^=8+E gGsVcɣ!hXXLNI\v[O"Ii \ΩTGҹ/Yof;l1=4=A{wGWkvpmyq].!'Ƥqus $@ְ;DgGJ4,ŔM${-ߔG^o">n)]E0-dHT^v؄ `8O cUPjݨ]rUenD60uI?i; @? *I/6uO =XQc g؂FDzsvo+L'<-&G[&|hS#W_]`%'gp #'[ o~KP&sǛ)Yɾa]پ6cQl6?`o>H0vڟ^}-1Fd)ÐC"+ ;?Tze'goyٺGJNjhFw;W{?km*r)!53,ߒ.ocbL}\6W4*eޕ=Iׄiby&׶+ 62#Rvdh o|i|Ʈ:ǞKz i*pqLPXә%:YzL!9ߺ,ѤDE/D xl n}^[:ax& T(Z0}[a R/DhK5KDxۨ'9A3&tuHK(/u ̆aU ]x$W^XBW@6r2 ~8Qu&39\^\qe`QoRqWhvA ~N/%;C tao~),[jp89J_Svr([ا-YWsO Jxhݞ_ة*CI}[r;\N|{mnc߉0u=Zp+^tA<]t8_[rqun6zxlyC׵Ay` /o w,uw~Ž+;?έEG3w!$etoFX@70FƟMeYNt"r zrOj׵;N?YЁD'Wypp4L>\.9gQK殧\+7$A' G+[T]Z> g[̊$5昁sSsϓ?~K=MG2nI4{9m-iXU.m*u I+eG'{MAIoUwmd+0'(h@OpI`/NeZxɰ7שc?_j(~9Q3%.,1N\Dߘ&ʜeu=&=NI>IaN;tnD"Hg8L r5/j Gʸ Wz|(+S]ޝ 4tمםЇRbWOxj7\4j9zXZ>6Hffk;ĬÏ&l~,օhICsM,Nk4/9~ᣁ u eAuۿl槎^5hd${%"-g;f&M)^j՛}~ceZɿ6 `+.=TV'wWuc`^NLj(=VG% aIzJ߰>r\E ?/z>2ǠdZ;q_=)$m]A3%/Lm@_,gՑs{lt@GΐAL(dAun["2R>8J-Usp+i3aw8erkW qrX`#cu9'-1c`@]@!]΂8WK<+hTAX>ei|,'Ӂޫ}WՌaaC#W3Xճ mr¡B/5ڪ9oiXx#!'XqL 1~h_ P/{%* u?.$GҺI5J?T"h\"} .(9{ 5B8uZ2oyR14B<0<W= g8Ȝa m?=^:t8R >CBIYv''wuOލ;i`ؿ(a`Wk<}2l+ep[54Rg9Aפ0j(Ft^ڌO6Q@;Ji̧f".o*M!aN‡zs3:ީncF"!rRVՆ][4Lgcusn=zPCO$ֺ4,CF/ 7I.xښGP8Yv{ȁNU~׭2%}<&8 6hȊXģ1":@@0cteQ y #=Se8__1yHƴ`oK!ϭiT&ƬSTRK+eXZPSE8`P-h 1(ANX%01GzAU_SNZg.R CL(bؼF żHOILiMZ@Br0$4_CPL"_|rLS-!*7M$D:GڠMtep;&M61׹<.#bs̷ޖb51k8{(~+Eao/R 4 egH/G83ָ&=B'4?ߩE| [ma/ѶSmI76rliު8$ܑPo3__jGN,LGoۻ{bۤLǘ5[[,JGiڅVl6Cq(Z{L\_8E:N~[(ۖeGy%7=lE4_2&{|*Vמm,[I`.X)g~2")$)vHqܷ qP`i3W!`*) rOwEJ~M?Ʃ^'ߺw4 b *ܡCFE7vJ,폘Kz=qPTHm@&y("Q[;! 1eĬFL.PR ױ-)~ף3A\=sB3F86\DBT4'Pײ 5'WvsRiŬt: !}:n|F{<c\F*GCXW#be}YYGmt-)$;g0TShNȦ'onpA8Ez1ÖW4B/jF 60ֺ[[ m<rn@_h{1'R>Q3B4)!3qW0kv^*6m īob9u4/dPXnTG+隣l \ shCCy?'⋒pLmw{Nnaexn{|Ѷ Ba~ DB5]ܥ˙G[e.FUj[YflK"]PuPm>aMM̚& _NSV^[:Z\{TA6Z|.bʞ,rm}BSh! L_6^YJeBbX?m8h+׉ͣQCJ}}Km(}`hYq#4״ bKw?T)$O~ Ѿ~6VuL2m3=vSHwD`gC-)%*^?X2 dLhP.W ܍N !b dH`pͼeOSLp!侣;M}V0hI3Z:vK!sb\˞,3FYr_kDŽ>(ǁκk6Me a~A1JсŤK)ER{BF;UUd+!EGFP53J ,-1U7}{7 nّՅ=sH[pQ5[*)vecZ])fcmL`7Tk[No3*1R_209$ v/ǡkqo@/ϟ)B|NCV%i ǘ8RҚ:Q2mUK bD_Z$$n;ЄCRꆍ*Hʀ%eƟf3$+PfydF㛚|QLƻanQr@ a8)ENy' >=b Tyc bJDEo\ώVIt``:>`aO |_Q5oЮf$(µH>ǎyo{3;2*7Yd"TA}I-g0)C.]Fcm>{;%4@g6eWM =(dzh2sP}KSeoWӋk;nFL̄cFp(ǑwvK$H{GVuїv0`W ҵͱ>&ҟ5VB0mvX>-,ϺKM"۠ $RSV0ƗgljGbtA:e}C4c[ο~%HOttx=ՍXPm.N螬dCA) j64ʡ6.a;G9s)0,ngui{1 :3jy.=^3!~)V!d @OOYn?J`1kkPy/ϓmYtdDQ0.V < y|JCC <3 0D'yp4#vDF9'̠%`7|e55ʦ\ER|^Nw4 BQ==2G@6#M!Ie1|LheO!v| v*0d+jk>!NbiHp+^t21V26zJdԛ#MDtd^jh!_>Sᲆ/V@. ?\.##, "#a˳PQ3V|f:KV[)~Ɲ1>=4hd~;kFݒx%`yjd~Et6T#FXlasZ%.i?B 콖mAp%:'1u跿~i4:6$%#CiL0GZy"O6^n ~lI$p\+zfx[ _| ƙ IùWfqχgFo%6Xb#D'YHxR" YVl,'Y(B%EUSt>!}u?qviK:G]y N*"v] ϖ,r6 ϑhD֚nZaA o*c?W^څnNz=?pڝ[nP鳍chmhdx1$,H+: |J학yz>7a;ov?D)&So[ɋ y6kWZUS0UXgiYL U"xl0ݲڡ\SG$`Xyp#$,ς۷7*Ie_901ԌV C5]Yahj:[4I'$9xn.Z uь[35óR&5BXy vf:>"T+vн6%`1hF48~TwT< jd.W {p1CbC:Q*&Ŋ1F )udJޢ]JNk9;p&bޅ!?"bU/ST~>o+GOD}}uw-oIo:իX An@hIkә*Ajʹ0ƃ${dF_jؔHSa-W!{, "C5ju5e^&NO)e>b:+:eGD18bgQ\m'Q%Mؙp-`v}Hnu j}9K`x- V||*s$u//I%"hૂrC/nRbhTIځ _y%f̊ 諒Ѱ#V#uBS~`"1F)vT~K9MEb\EjO›roC}ֶgt', :j1s@UQ$Rw(`(|9IdP3ƊءӞ0d@ "]vMn&t!Y;kA\Cy, Dҳ-*8^^K7p ay >;>;״i˹e֮/^#N-Sn;.sVd i)[ aӮQy\RzabyPƛeד%g_CT' 7pǯI\Nvv5#Cff# +ɶ%(/X}$G5 TbT  9ܲr)/ɽLs*VqDM)01`h7lKL$Tłp!%?V(?*@;lu1yϿ3IbnCP|]90+bOwTf1u>BUpR6Z6n 稼кγV̦f{0=.;yW-_u~ ]ɱ=O8O&LSaw=(C#aLmJ:hbYj(he.2d* zNn2gOD&]=p^\5N8$r+݁h+0 r߂6WL:yƉ6^ b腪MAL[H6ܖ@lzUz\IY̠[Dt=R ȴQythg=[&,َ_ysødtmp] Hhc]?RaoBRi,2i6|xQbů yr-Qc'U|aܗ?bXMլ1r "\Ol>=s8T^cƹ,戴FkTGA"`?чY*4S[a{<]k'EƩfV#>喛|$IwxJFD ~Tt9$L[o0ݧCwT5`XUd$\a?D1E^q f$ )%'4~YNŭhGz ZS%Ya(vK}Y u!^`.^9*L26[{ yVijCڭe PEދ)Ō1KC)OKឃ.bNՙ= X P~QnY08D M.O1Mq}hg鱉h\Uܝ091=Y N6zEx"/)| 6#7jÎ/} T(,=oLMѧfEt%= xÎ$[2e Wdno/P4m4*6v/YK P Q6tػDuӤOrMr2) .H^)\zdv9x]Űjǝ! Bs_NR);ʿ}dAq (Kgoo4q@n\sydS,C1!v1R Y`!_ITkuD\NU֘[(v cEz3՚/:sics?ᑅ f\Ltwڥ|tÇ//otws~b,kgӅ M⺦M 2hTי/*M(~.a$%$@w8# F5懈e4RQr%c(wx+Kt'.畔]W1 BQ|FWakMo2GN?VNcckEY'U VkZV9"Rw=^.VKUr飳+v̫W@Ln~Q,pjѾ)$9Px WcjEqFE  Sb9d۪ONhJ+PA{f7CKlABܙdHi>C43px;IH_a`bfX5<}ZrXբmj(j` H(]t`9%geiaL'gj,Jhڭ)c&L_϶PO8P94 ަ+:O|9tzXU'_"N OMֵG9wC`JKd}%޺)ڧ-$z ,}첁*i'jHsIa 5 4*MpWFp4z'eh;E!$S$c͎F#^6~X%C,=<ä$l4}-H|o; +u[xZS0erN.ZOʐixd '%%bR7 V aHXuKPTE{D 6fث/]SsۤتX߶@m-~Or Oړ|Y=42( @Wf ,=@5]u Fp];Gt Whhp  oi6B:ɶ("Ud\y~:k]U2v8j&wΑmP *X Ҝ&VÙ$, oEFq5.jdma|q+]QBJ䂦5`OXg,j'qt?f^%\džlW 9^T+ڦn&/X$<#P Dq-ʎ\ͣAnkS󥢩*øyL4D "F_ԡ9)Tf+tU;z1>8zosIZ4$”4,|0Tʢn;7극D E6ꊪOd3xk9=3H3BCƭmc3ڧ`v'U kdqCӊcOLy_G>I&W=hZl R+g.d'8 \}ϫG)X\8rL'jE MԂzG(Xͮ_yX 7w=NMפj8Y0Mqlg:GP%dTJ4aD& >O~WDpQv s~3YHElOVa Ťb;$iU~"GnjtiaA:D3e'JGFXp:>ңI)wYR҆X7_GX$E%3O l: `Ԩpg.V:.3ξEuy-.Zv@tנJhk)Jt>9jGŁG5͵Co̮Oo"Y?"]Z1ȖQ>iQ*z UPa<`%?_dckB;V6SE4F}F>S(Wvs80Y6R9HyF#ISsB6|b_ؽ`( r~ڦ_!r-tN1KJ4&2#df}oAMF9J[Uʓ}0y]v_=Qmʤ9wu s~6?GjJE?aZ=gal@V_11G:K?bմ 5M0rvt?sSО>M\ p:{ciCtzV98Zϒg[5VPqٷ6'1N dLJZ"M:` ޸03 N̬>{ 4/_7s=3mJ^zLϧddGny !e9rt`7CmR2(_w"Vt.;ջ0r=So$U4LP@-Ca,-[C")e0PjDz.ؠE~\UÍf~> 'kT:y (Q1 ld?a$gBG"­Y\Ԣ7N@ u*r p^jW*h| d\ @ 2ɑZdm_r6Æd .>W'L'ZYq+&CBJ̏E|FkTa5cNm><#H&jIV-RLUHe!qӇbkX]ρjdCBӣ*"S!TznY?Eä,ƀd`z0'W\zC~u!۠WR྄D=NJu :W]歬>di[Jz:|wF@:ӗزZ'QĻ쳡sR|.!Fחrg$5z0b\[2;4\fI-7h/՜0;)MaI&{( $2*R1/bD\jfbˬn4RxCʯ#9 AN!Y"CvOaji dM5*c|g0;?:!MIDj3SMƩi]dU}A|+kM܀(4%xQd { ȕmvE١:. R;1'͍׈uU]K`zEIb;} |8:@tQ)&cV`9=owkq_XQaU ^Xȋ;Nc cP:?wѷ`N ނ R dڈEćI )j$Po5m5q씨X\ӏzhf#>6ս A,cC{_[adp pϮDIM<T}r>.^ 5@N+,ڢwuU)hI2Ճp8Ңܹ'7a N>(ՈPu4G8}Igζ9E$& 6o;qMIe=~%y/ѝGp"}v1__l=VW-x0iJɲٗ'g7\i,dzVr`Ee1etU"YIP=e`+pxwzLiޡ u O*~ :XnCqF)$?S ʺ̢F B SWH: 9dXLP!I*@7ekoC%=̈J* 80LDs}чiQrPbi,ݬlI5M0ע}2lkiXs}즰-.`p@^Z7`ERnvt뮟mXnhWؠXۃNOy𪼞%3YH>Lhf8>32/MktkPx^S#z=-:f0j`UI~518o"Y|ǖ 2:,$^ NnƃťjH0s8^O~o}'|ΪИo ײtv]2 j!GFWK,ض"lѦep8 p`gpU-GZfcdYh~ӪmٰQRT0ӱsLbχ &T&?D*]{o%cbzuCLigκR`]y%@k->`wG|#?jpᆳnds ժg lnjh#I;1B%mR(53y V,Yf&7#SYgP=)4v׉5sEYq{޿U*}AY5=]=I7;S* -1J/n:-{CѕdA{ýd|?_@6=XM$0 rm۠})t8[\JO;׾Lb\%YWG­sA@M1ߤ ~1اi_ʋ*E% mWzeXQV1VH)lZj4H-:Yczt@ ]%f<@B9;sABy2Ap`Γ"hSˋ̟nvKڍ"Z/ Tљ]L36D'[=kA]o=ou&{Nq(>o; Smm =P6o>)VexTJ lL)fG)fvT &yo~a:Xˆ:#85p&=%yh ߮iy5m81ԁWi`ڒ^7Y3i]6F A d\'i@m4-/%F!l+*TAZ5j(C۳yi7nc4̸gRgP5r%Ťx;2)ʨ{(꓇y(`)I)}wd=YNYʛA5ZyDigajK;S\:ԩaBGeZj: Ѩwd.X Wn0q=Q:^U.Y)P9rֵ*˽V͜>4e``L|@ 09,B)5(J7|KrV"Mmka$ԩzJ?$-/|bdP LNFd,_.X0Lea<",~lm9U!~?} BJ)PsDse%z p]Xڋњ_C4< l,ΚW[XV,]@!nbe/Hn\ouL\KBV<緝nktMך̔|(O%D5i.=[B 0㏥W±uzR(.+Q蛖6rSÇِ 坳H,&,ghّji2@=oK&0$B6VlE#fLx3a-ejCE JNNQOiȒΤ s̨sm¼VI]Sl0+ {FN{Z$cx`XD=B'*#]*0IjJ;-9_PmuI]ihxi7_RϚcj5gWv+* L~س߆i^_@(+p˚d-qV+5.K\Vh&~w y{֪.P)CU#CR\ ",3(\̱Oh? OWmW%т9qhY+uF~4"34&JRʼPO! 2,g@wqj;qL05~2{x(ؕC/e@[)Zg8(g#4ى-#95Xi:b!OΣ6k[7DŴגQ<[9x@T8(ʇrP{ξ 8z` ]tvHL dC"lJHv,z`BxJ" OX2;X@He9(Tbm왤|uԎmR(pT߹\nUl׭UG2(U_>F{h&Vhw`Ra37ysOOEe-{'zÝyC'fJ=`/G%e~AQrn洚C5'^(o<ܸ<, ldLxR#O)W{Pm5~n&`wCuLʾ-ߟP M*sq Kru($=v<#L΋M&,?<P#p9EtN /{J4Hxݑq$ sTf`MRGנ|~!JP4R5Ƀqʽf)vκ]6XI| 6VR^-^vuu?&Qh~Ml]MStԤVйiHK 7uw%{G%aҙ{+nB4C$$q#<ҷ.]˦7:Ca7 V EИ|{ 1Y#ptZ9iE%)ҹI볷Jlݑ,jO\Wc30v;-iπ (m3ܔܐ8E0@%ZzJ+jb!E{2gHbnkKwLBXHweޓVu;Wslj(,mNTNi0pힺ.I౔qgTشt"=R%!IzSu0>¸M%Z5pOR! ?SW`g' Z]bbM"+Fq`ׂ<"m; < K#@(lȚ$J7[B"}NuCiwt8(~ tcp327tzXP{C#OyB(aS+]q^lh!n{}PyJѕ me {sxSx[LȾ4/K^2I` K l/ FBּ6gV*rƞʘKL֝"<?15'B GlIZIaOpBfw`ᄤ|{@wkE37FKM+a"I}$;;ͅ=?%|gp QF!̎#4 Y50.3Ӛ d&jԛ)EAu3~AKo u|}}O]levybnjU= ypWVnqTXi lhd(ثAa_Ixu<%&ʼ0lDT8^ ,Lɨ_W3]|cԙ)*k i;Fb}Ě2}G Yn7)ps4S{1oo<؄JVrZ]cY;o~ONՎr Qi^Hnh᲋Ht&݅Kwt]Ys{DŽKx!|g#p52Rf>ֺrYy=WFo1rY j sdYZ./CMerD&bGZ/z{man.2Cq0>5'=iOSΆnM&$%Ʋ|O(kt[j.iVx5~W}B Ww*n7+9fXNhXi&p{QDhu/II0uէzhPu s ֬.w)fbQC4 k/d(K -V쪣i㩲&uG'ʾzfgZ-:kt%~bjO/ w GZ'yx(au+A./T"`87Ҭ"溶fl^|#1ed:fV;=cVσ-ůRO+\(߱j_INmw|dR<{y6>*"%ӠR.P}&RH&#(`6;]SQ9:W(2{gMQeh<>i#bw=S!|`xZVuhﰫ+W Oq>iPշV4 dw=SaΌς.N-)<}@PΆPu Qngq$>ٯͳOG#^]*}a\FyI_gcasЍ:iYB_´C`컶,~MFG:\ @"_TaXIbU*mx/ZjӯQ` ~L<)Ьa'׆2{2%E%O*S@k/ E<+Hw¨lYy}9Q9ӥiבF?ZY+2G͎_vsl`KksVҞON]5TTU3[|g˗ :\#e9+,}̢~TF]ӱ. S|KugN݋t6BK񿙆Amˆ) [ Fs]`2d_ Uh|/+pJEcET5܌~rq =RPV4+m gER_$e+TiiTtJ8Pzy/K5JkE CUءb/B'gD aͿ I٫YKϲ*\utc$dH\Y %l$VDM鿗dG+ YĜi!%JOr~m]i Avzx׹F[1geB+!odןBjiDD|s~"2.Hu9!Ս ZQyʖ006[:*+ 9qۯչr{ ]%I޶CВ1Fh sIr휔N{.2lk\M/)ކIWn$C\.[̿kϱ.Ѧ#Zȟ$n+F`TIzX? \zcwӼx#Rt~^)<BDP,|LZ(*bAe2S7{T׆ZF.Ļe<)3;)BdN$Jev W!]듍/&n$~7:,$mpj|ON,5D!M]- W[mG3\dCB"tRQ "!뛦_JeliGv&\2vqS$͆r|#1T% r-7=ڍ3cڭ5{9=e5$iM@mȠ& IwmF;'rj7QfsF (YFrOЁ'ӐhKq9/4ti}E{Fa}h6BUBUwF*#@#[J\'Y[N02G:kN aUҾRis](^Oe5ʗ& a(D vsB 퓇Jrps}7BBYvTvK;J~YUE`aeC #؎2v-Z:%SR(q1?Us+ą)]y>.(7!PfV|ɌH7/W?}!-:c῏{>` ɍڰiDaXnH -OR*Jk&%`hV,y*.o gϦmmG%"*9/G lv)c4̩BGHkk<ʏ+&V*deFcݽnS!+Vi]xQ&(mynģ 2cGْy Vؙ#|iܜ*F;Ē=n`Ѵx׺׃T)󳂷1xss7}?w|⠨?EM~t s|׆Ai!>J- F)x4bꎅ9WPa_H[S֑Y)5hbu,bw73bAG~ WB _ bÅQ-)r7u^ wD+ 3"7&kt^1&S[4;V <]+7a;t# ;.z16QSW9-b{v= MG w|j銫@;LG)Ehl\K E{+Nba0D',qLNY%pرB X!);icuuc ߪ3waj"(1NYL5`[|u~.rm0Fs9W r1U-~Mx͆FK Desf,Uwϊ[N4+2W(c8Aϡ 6_z"ӣ4$ waʫ)P }n('s'k Eq9&#\Z zY^pǧwK֕9_;ErBc[O71njrEO ՅjW: J(3MJf:si V6a6xWK=咲}$ B  B!Ua~;68nZ=6"cCQAݠ*3Vuh<rTcOкyr׀GsV?Žzc8(֚) K_}Um+ȒR‡{~xθ=NYm&NZ-H(S?LM( D,܈툉duRN5j[Ns\DjBeW}2_Qfh f@UM(= PȮW|pftMoAFpIp~Z׏ۘ\Ÿ:t(3̩t4@ suw9i3rwdBd!ùgN\`FΝŪ൱{2xH~fg7R Q:qh!lLche_W+êlXݯ@3WytmF%^%lKIϔ:j+Oєż-郼zq/,i'YLVJ^u12< LUs4d],(옎e|aY ӸTi\cT? ۽}IxډeZu-(ok_"Qx'z>bxKnJV3e]kxP`P3@}6h64:+zmsL-!TqrM62-gqx"٪\f'C6J9ƛgye} ۽1 Ǯ.Tɟ6ZgS.g 3Z#T/hL:yFDnBIB,zWe&#0 .*Lck-2[%:2^$>[&](Ga`O,MBbC0չWM':~F/b?ٖil:QΨ,[p{T}_ uḵfCb,tZkћ>NOx_w7eE~y>ƗW`h<%ҩ{2&8wDxL֮¨&l46awt8+a)f B*&R̠/7 ev1RC}vCiB-kd"MCͤ 4uj4ΩnX_t#6}y'>Z}bc_,aRn 4ɖ~tSՄK&e݌;BC^o\ oRvvf뉱VE?EI!Q v|Mă3fLM^Po(o>Yo"i  )(@jN<#~v6S9yo@;`tR\ Qk 9j ,}G w|= nj h{/ ٱ$60,n@JH&:kT8* mKJB v)] r]QΨa_TkSB7k9qb `kҳ2r' jTkHH"pZ_Rg8j˩ zZg8 Lܳmxf~.N ŨAᗏ7 /W~֟ci?]vjR_D a5ȵ@^zAr؁lΪvW~iә'If3]yXCюiyyk Qu#6;w?Pf4jΨg(`,Hv>ʪǸPt~.ڢ+Lh|B56+S7/ӼF/O٢m%SCJa/_3kf Or1~F P=쟀0F"Ap\ZvO, (k*hZq Xд2nsˍ9mk-;W8$Ɲݮ7=MCe.tcQoox'} W[#agS$f{n= ZUɹ',<]#Y ۏ 9PD[8"GWZ&W i ׮PLjCR6`E;E_hZ\ꕞJ77׭aW:9"=' ;]Ҫ-3 'y:L2Ȓz:)kSaqY`tfU9T.#GܲU V:>"돂8JeՄD8AFCRk7ݜ(bSE!&У|m[~*^&q1潵1IЭ?k&)fM#Vѝ 99kg SS8aݖ &%u#t+:!gIO*+QP$}T|4'P'AFRxI?5&t]:{H 6Wq%ɋi'K:0b13&׸[C#JaYJd5sA,# mVD`ȼE:.)jjMjg <{~_|t@J(u!3WZokϭ-';4E.+HK}?`9P^ .5S&s\<:tRd $" ;T' d9z;[ Lºp"T-qgSKTtL[)Nva_Wwr]j\ч|]p?.L@Al0/ `B3.Y.KhͥW1۷6٫p%,ˊ` -S1au„nVFU6Qb4cKKeYƈs>ؚr GL |xO Fi x:&bԒADk!uAaKk}tMD\|V7;Qa2uu#j*-]Fs62n2˒ڞ* ?:C;sbgyH$,`yS7G0؝C7@{ )v!'/p+ ߌ<[n^ UtOq:=uP!\`˶Z2w#G$)k/MRjFBѐ?lQ;="ݡ[AF Q/n޻:^>D'H}H7lV359LVg DweR"!p*Õ ߬N_Q1k|ky&y^a\r ;Lڎ-%'KX" >e,!*O .~dZ$KmlHv2/ =Χ* %ETڏ2!Xǘ}6B ހ ;ZnoΤKqHk$v~Q: yӷVCՏuϬWt614ׯgV+SvuL7=Ph.΄\y}4䮼][AHI ,BFjr"Ƕ4'lb#^0bO %r/U/n kefc_YZQbI^U<3,HsO? ѠԮ |_`syQn*ۑy|L,ָ=UlrOK'Fg;@y32}OIrZbKY }wx4ĿM8Clb(PNF3lQROdHP!jU~ ;nUKh]&l-KXMsN8U ZcQbV@:/G2n3 㢫gn"t?'ö RS:%3؁=)d|KMeA-T=LIcl8߆]XIp|Τ=͂y(=G[w^ 3#' .P]gpseuIꗄJSa:%)Nuzu|;<2+;8ʛ*#  h ^U 텩U|xW+"z#_[r{VٰvV .hlxG]tHeEV@:0G==x93i]cgJͶـQBvgō(n|E 5`~(]g9'{R6HJ f15TC)*QZQ_'u,uڬu ҚjC͹N !<3PCFv?7Iub`C8azMTI=i~8{]ۄ;FIC`]m[8 0sxv BlgFc!E3]=d݌LOmaUg(0jAFv oq a#VyI%ir* «pxީ TE>h ,$fGaEd$1Kp} يLRX@\y,1^HX_U1Nެ`V*tDQ.W ԱxU-Y&I`zq1/^DPsx"|w%cqzɈ9?\P#kOqZw(Q3D1t3(tUOO$u{О[9d1w\F0S\1Kpp9\;.G=ޒѷ8Hx{*Hi_ ՚Yb`P➊f4 W9.: 򃳵(bȣB:*\2 Zyx49"9񂥾0p+Ցq./;ҊCeRp72GD9i{= 0i'Q^5Tz0G/:1rP.pKʺ3> <,\m\}껾F0 yhzѱPLDQWbMnφ^yh`ޮ-[BxPTć{wHpGxn b/ܯl0:ET#s|Q `Mxz}Ѵc#uV*%;3ȽqS>Aʑ-dBDчV?/aXj2K( JBxFݞǴϳk>q[?V;Y1Tc/ayY^Ҿ/ ܯ%%j:#9'QUoR`֕2!$roG`>PM hR" 1fΙ&>/?kT xYgIeI1X#mY{b^\w5PJ%۝_;ag''Lu`{Ax&~> exX]lЈxF9 'Z]"#-'9VQX̂o "c:2*@O8PENYP̸:}DhLT D~,*R;V`HB)-I`'7U(еQo:_<-NDӾ m/;ydlilݬ/Igb*PBMvwA# gΘ8xXz &nRtݖZ>.ǗVnK2:ss3,*}cuJJy-׸RP \$@@\+P:]q €訊.Plx5 ~6dd~i;AI_JLfka_ mz$Ɣ͗, , @as5ɛ#J|ŷ߮ORu0|G TMj,AS ~_ְ=<@'*K*$RS^tFNaZMp؆F8CpT3py|WCwUվ#YkPQrh)mq|腪xlo^֜GRJC'< X3&CrC: K.C}zعmb`}40_-%<ݵ;)ƾ鈈C~3v~q\?=vcSh"q9t6 =-!^x%?m7dmC,=ІH֡6bt bQ.X1}ɐiVt 2zBP7gΨp|W+b@nEiyngaPyh$o?Պ:Qc{ěɤǛ1X#}[o7D:1d X߄P|;>aKAp݅ȵFZ10óU#]M@I]u/<+O*ђL3=ͣO8wܒuiͭLN ֗MBU Lw_]J9"T*1i&OTal''dûH"|.pn(uh/bEc%PRe=L} =R?M}n';ߝL}0#) ċZjgr#Ɔ&r=%mB wer.|83hٱtrHKϚho';>̬l-OpK~n/ F!P3IUSזunINZnL~o?P{Ǥo$Hͤ33*j$H'/] UrJ]t0^Jp'LUt93,G V%n8*>nIN""l99yLZfָ_fH^8_jpWZWvfXwl = R{>epw>b\`@^Yk&,[h6ʻ$PеН&N%շEFaj㾡dբT-2𨢧&vG~1(ܶ39:2 0C,i ;G<[\CgvP6_IQ0p q͟/45ʼ=l_yiśT^7$vKP ]H4_# wJgvEEq3lʆAsrHT[noA&J{ )7Of{_\\U| Oa:h $QKgUSf=CCDӐt'pVO9Pa{I~>AYg{yyMTF:F-uZŶͳCzuB"P7c´1@7PwA8\2Ncd:x$; &YBn$ mz>a&avBJ5L].\y&@`}%-r\T[:?[<.z`h{w|Ȼ pW$Kc&NI_E8d`=D*G3n[GB+Jhc$f ±gVV%1@\i_hxLƐgN߲J,Qwz뽞Y wYSPbfH&v^% ({|ײzֲ7(؊ؽCRZ#H[8,RK=ʫ .X4\}l E^ ei9IOlv}!qtoctave-0.10.1/qtoctave-info-reader/test/time.info0000644000175000017500000003614511511434230021233 0ustar lucaslucasThis is time.info, produced by makeinfo version 4.13 from time.texi. INFO-DIR-SECTION Individual utilities START-INFO-DIR-ENTRY * time: (time). Run programs and summarize system resource usage. END-INFO-DIR-ENTRY This file documents the the GNU `time' command for running programs and summarizing the system resources they use. Copyright (C) 1991, 92, 93, 96 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation.  File: time.info, Node: Top, Prev: (dir), Up: (dir) This file documents the the GNU `time' command for running programs and summarizing the system resources they use. This is edition 1.7, for version 1.7. * Menu: * Resource Measurement:: Measuring program resource use. --- The Detailed Node Listing --- Measuring Program Resource Use * Setting Format:: Selecting the information reported by `time'. * Format String:: The information `time' can report. * Redirecting:: Writing the information to a file. * Examples:: Examples of using `time'. * Accuracy:: Limitations on the accuracy of `time' output. * Invoking time:: Summary of the options to the `time' command. The Format String * Time Resources:: * Memory Resources:: * I/O Resources:: * Command Info::  File: time.info, Node: Resource Measurement, Up: Top 1 Measuring Program Resource Use ******************************** The `time' command runs another program, then displays information about the resources used by that program, collected by the system while the program was running. You can select which information is reported and the format in which it is shown (*note Setting Format::), or have `time' save the information in a file instead of displaying it on the screen (*note Redirecting::). The resources that `time' can report on fall into the general categories of time, memory, and I/O and IPC calls. Some systems do not provide much information about program resource use; `time' reports unavailable information as zero values (*note Accuracy::). The format of the `time' command is: time [option...] COMMAND [ARG...] `time' runs the program COMMAND, with any given arguments ARG.... When COMMAND finishes, `time' displays information about resources used by COMMAND. Here is an example of using `time' to measure the time and other resources used by running the program `grep': eg$ time grep nobody /etc/aliases nobody:/dev/null etc-files:nobody misc-group:nobody 0.07user 0.50system 0:06.69elapsed 8%CPU (0avgtext+489avgdata 324maxresident)k 46inputs+7outputs (43major+251minor)pagefaults 0swaps Mail suggestions and bug reports for GNU `time' to `bug-gnu-utils@prep.ai.mit.edu'. Please include the version of `time', which you can get by running `time --version', and the operating system and C compiler you used. * Menu: * Setting Format:: Selecting the information reported by `time'. * Format String:: The information `time' can report. * Redirecting:: Writing the information to a file. * Examples:: Examples of using `time'. * Accuracy:: Limitations on the accuracy of `time' output. * Invoking time:: Summary of the options to the `time' command.  File: time.info, Node: Setting Format, Next: Format String, Up: Resource Measurement 1.1 Setting the Output Format ============================= `time' uses a "format string" to determine which information to display about the resources used by the command it runs. *Note Format String::, for the interpretation of the format string contents. You can specify a format string with the command line options listed below. If no format is specified on the command line, but the `TIME' environment variable is set, its value is used as the format string. Otherwise, the default format built into `time' is used: %Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k %Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps The command line options to set the format are: `-f FORMAT' `--format=FORMAT' Use FORMAT as the format string. `-p' `--portability' Use the following format string, for conformance with POSIX standard 1003.2: real %e user %U sys %S `-q' `--quiet' Suppress non-zero error code from the executed program. `-v' `--verbose' Use the built-in verbose format, which displays each available piece of information on the program's resource use on its own line, with an English description of its meaning.  File: time.info, Node: Format String, Next: Redirecting, Prev: Setting Format, Up: Resource Measurement 1.2 The Format String ===================== The "format string" controls the contents of the `time' output. It consists of "resource specifiers" and "escapes", interspersed with plain text. A backslash introduces an "escape", which is translated into a single printing character upon output. The valid escapes are listed below. An invalid escape is output as a question mark followed by a backslash. `\t' a tab character `\n' a newline `\\' a literal backslash `time' always prints a newline after printing the resource use information, so normally format strings do not end with a newline character (or `\n'). A resource specifier consists of a percent sign followed by another character. An invalid resource specifier is output as a question mark followed by the invalid character. Use `%%' to output a literal percent sign. The resource specifiers, which are a superset of those recognized by the `tcsh' builtin `time' command, are listed below. Not all resources are measured by all versions of Unix, so some of the values might be reported as zero (*note Accuracy::). * Menu: * Time Resources:: * Memory Resources:: * I/O Resources:: * Command Info::  File: time.info, Node: Time Resources, Next: Memory Resources, Up: Format String 1.2.1 Time Resources -------------------- `E' Elapsed real (wall clock) time used by the process, in [hours:]minutes:seconds. `e' Elapsed real (wall clock) time used by the process, in seconds. `S' Total number of CPU-seconds used by the system on behalf of the process (in kernel mode), in seconds. `U' Total number of CPU-seconds that the process used directly (in user mode), in seconds. `P' Percentage of the CPU that this job got. This is just user + system times divied by the total running time.  File: time.info, Node: Memory Resources, Next: I/O Resources, Prev: Time Resources, Up: Format String 1.2.2 Memory Resources ---------------------- `M' Maximum resident set size of the process during its lifetime, in Kilobytes. `t' Average resident set size of the process, in Kilobytes. `K' Average total (data+stack+text) memory use of the process, in Kilobytes. `D' Average size of the process's unshared data area, in Kilobytes. `p' Average size of the process's unshared stack, in Kilobytes. `X' Average size of the process's shared text, in Kilobytes. `Z' System's page size, in bytes. This is a per-system constant, but varies between systems.  File: time.info, Node: I/O Resources, Next: Command Info, Prev: Memory Resources, Up: Format String 1.2.3 I/O Resources ------------------- `F' Number of major, or I/O-requiring, page faults that occurred while the process was running. These are faults where the page has actually migrated out of primary memory. `R' Number of minor, or recoverable, page faults. These are pages that are not valid (so they fault) but which have not yet been claimed by other virtual pages. Thus the data in the page is still valid but the system tables must be updated. `W' Number of times the process was swapped out of main memory. `c' Number of times the process was context-switched involuntarily (because the time slice expired). `w' Number of times that the program was context-switched voluntarily, for instance while waiting for an I/O operation to complete. `I' Number of file system inputs by the process. `O' Number of file system outputs by the process. `r' Number of socket messages received by the process. `s' Number of socket messages sent by the process. `k' Number of signals delivered to the process.  File: time.info, Node: Command Info, Prev: I/O Resources, Up: Format String 1.2.4 Command Info ------------------ `C' Name and command line arguments of the command being timed. `x' Exit status of the command.  File: time.info, Node: Redirecting, Next: Examples, Prev: Format String, Up: Resource Measurement 1.3 Redirecting Output ====================== By default, `time' writes the resource use statistics to the standard error stream. The options below make it write the statistics to a file instead. Doing this can be useful if the program you're running writes to the standard error or you're running `time' noninteractively or in the background. `-o FILE' `--output=FILE' Write the resource use statistics to FILE. By default, this _overwrites_ the file, destroying the file's previous contents. `-a' `--append' _Append_ the resource use information to the output file instead of overwriting it. This option is only useful with the `-o' or `--output' option.  File: time.info, Node: Examples, Next: Accuracy, Prev: Redirecting, Up: Resource Measurement 1.4 Examples ============ Run the command `wc /etc/hosts' and show the default information: eg$ time wc /etc/hosts 35 111 1134 /etc/hosts 0.00user 0.01system 0:00.04elapsed 25%CPU (0avgtext+0avgdata 0maxresident)k 1inputs+1outputs (0major+0minor)pagefaults 0swaps Run the command `ls -Fs' and show just the user, system, and wall-clock time: eg$ time -f "\t%E real,\t%U user,\t%S sys" ls -Fs total 16 1 account/ 1 db/ 1 mail/ 1 run/ 1 backups/ 1 emacs/ 1 msgs/ 1 rwho/ 1 crash/ 1 games/ 1 preserve/ 1 spool/ 1 cron/ 1 log/ 1 quotas/ 1 tmp/ 0:00.03 real, 0.00 user, 0.01 sys Edit the file `.bashrc' and have `time' append the elapsed time and number of signals to the file `log', reading the format string from the environment variable `TIME': eg$ export TIME="\t%E,\t%k" # If using bash or ksh eg$ setenv TIME "\t%E,\t%k" # If using csh or tcsh eg$ time -a -o log emacs .bashrc eg$ cat log 0:16.55, 726 Run the command `sleep 4' and show all of the information about it verbosely: eg$ time -v sleep 4 Command being timed: "sleep 4" User time (seconds): 0.00 System time (seconds): 0.05 Percent of CPU this job got: 1% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.26 Average shared text size (kbytes): 36 Average unshared data size (kbytes): 24 Average stack size (kbytes): 0 Average total size (kbytes): 60 Maximum resident set size (kbytes): 32 Average resident set size (kbytes): 24 Major (requiring I/O) page faults: 3 Minor (reclaiming a frame) page faults: 0 Voluntary context switches: 11 Involuntary context switches: 0 Swaps: 0 File system inputs: 3 File system outputs: 1 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 1 Page size (bytes): 4096 Exit status: 0  File: time.info, Node: Accuracy, Next: Invoking time, Prev: Examples, Up: Resource Measurement 1.5 Accuracy ============ The elapsed time is not collected atomically with the execution of the program; as a result, in bizarre circumstances (if the `time' command gets stopped or swapped out in between when the program being timed exits and when `time' calculates how long it took to run), it could be much larger than the actual execution time. When the running time of a command is very nearly zero, some values (e.g., the percentage of CPU used) may be reported as either zero (which is wrong) or a question mark. Most information shown by `time' is derived from the `wait3' system call. The numbers are only as good as those returned by `wait3'. Many systems do not measure all of the resources that `time' can report on; those resources are reported as zero. The systems that measure most or all of the resources are based on 4.2 or 4.3BSD. Later BSD releases use different memory management code that measures fewer resources. On systems that do not have a `wait3' call that returns status information, the `times' system call is used instead. It provides much less information than `wait3', so on those systems `time' reports most of the resources as zero. The `%I' and `%O' values are allegedly only "real" input and output and do not include those supplied by caching devices. The meaning of "real" I/O reported by `%I' and `%O' may be muddled for workstations, especially diskless ones.  File: time.info, Node: Invoking time, Prev: Accuracy, Up: Resource Measurement 1.6 Running the `time' Command ============================== The format of the `time' command is: time [option...] COMMAND [ARG...] `time' runs the program COMMAND, with any given arguments ARG.... When COMMAND finishes, `time' displays information about resources used by COMMAND (on the standard error output, by default). If COMMAND exits with non-zero status or is terminated by a signal, `time' displays a warning message and the exit status or signal number. Options to `time' must appear on the command line before COMMAND. Anything on the command line after COMMAND is passed as arguments to COMMAND. `-o FILE' `--output=FILE' Write the resource use statistics to FILE. `-a' `--append' _Append_ the resource use information to the output file instead of overwriting it. `-f FORMAT' `--format=FORMAT' Use FORMAT as the format string. `--help' Print a summary of the command line options to `time' and exit. `-p' `--portability' Use the POSIX format. `-v' `--verbose' Use the built-in verbose format. `-V' `--version' Print the version number of `time' and exit.  Tag Table: Node: Top1116 Node: Resource Measurement1909 Node: Setting Format3860 Node: Format String5171 Node: Time Resources6482 Node: Memory Resources7124 Node: I/O Resources7841 Node: Command Info9051 Node: Redirecting9280 Node: Examples10075 Node: Accuracy12393 Node: Invoking time13920  End Tag Table qtoctave-0.10.1/qtoctave-info-reader/test/texinfo.lzma0000644000175000017500000001003311511434230021745 0ustar lucaslucas]* 'd_>s4Frfs cJ{8iE%Q 1#P7uxki+_ Y PW&rKVt'X6 " 52!2{P&TF n(>-F2.+=yѪ-;ݐb% *IݓǕnea- Lya&1L2;۵ -۱@ . vKkgX+0aoW~)K2{v/3d*A1\^P_mz5)M%.C 1r;,֬m$"Ii}F3C:cpd؆";_?چ2aՎ4ṇ!2@|J|& JEy/ vmZgٿ6&}2W$Yyʏw9e}J: 9;\KxE-"1!XwKhqݱԣ#\etK(zҨ^.Kz,u!4;c%W-OU^]bMTm!ŝ|\M'8 Ӓs6@+D8G2ƽG%D64}Cahom|qF;U޶vꑭﻙi ).p(}WEе#T#R0 {HQ HNAZ a,d=KbGL\ H#"l_xS:t7 ,CAp^0ȗnzu S O2QNQmcjp^B՟;rh#5Dzyod#,U b6qɅEr<,xI$Iwȉs)K%./Wqo '} QGӬSfy}4c,v[E FO1i|7l80%\CE Ci>ptڷS#Tirܥѐkhਊ)l?4x*8`Rpsl=1o܋Y.hj-;EAD̳|=$<ylJ%*9j!kĠTN@JPe0cbbQ%2:GX +Lr!]*pqy'I̾A1[qD]bU#0GCU| P⼈}wT"=$u |" 7E\",%C. BpKk握J{*Hݯtmpv0{[ÂCOMqzϔ$Aup*]\toR!wLU /h^[^~4HZy0 qc1߃[bnU ZUT .H ҇SAq`T-d~06˜'nG3 eZ)Ts̃0_* !mPʱoTK5WʫcvSUyX1 aO>fl=~LoPY\cVG:.v/TA(hqA\LhlJ F /xB$Ygp#tHˁzR-2w5mC|V pʠτ_neX_8=y+6YZ{07m= /[Sswƫ1qYRy8=93$UO 34TU0%kH[(v'U0my"xP ر7u=pp0&СD)Csm_y,2 &~:Z_cx"/0qUWibk(ƅvHDpbEE}cqtdkخ,29ջʭY8gyZ|$w1,}a|_Mx !CsF.U]}Sӷbr)̻Qd/3ꐤr\Okqy($9P^~Y5Ji7@y&־46"mzTXB g{E0Ҭ?P HQ35i!ឬLx=  }7}r]%+ٯn4]C_㒿i_(ȊM ۍ(T(y kL? mvC kV%PR}xY"I( (h=@{js̫VL7 |tL|56[#/E+>u҉t$bӹMzeqgY߆S$HJ M-P-HDn{fQ dXY E(9EVj#YN=dqtoctave-0.10.1/qtoctave-info-reader/test/octave.info0000644000175000017500000013171111511434230021551 0ustar lucaslucasThis is octave.info, produced by makeinfo version 4.11 from ./octave.texi. START-INFO-DIR-ENTRY * Octave: (octave). Interactive language for numerical computations. END-INFO-DIR-ENTRY Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2005, 2006, 2007 John W. Eaton. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.  Indirect: octave.info-1: 838 octave.info-2: 300041 octave.info-3: 605763 octave.info-4: 922749 octave.info-5: 1231831 octave.info-6: 1522023  Tag Table: (Indirect) Node: Top838 Node: Preface14135 Node: Acknowledgements16517 Node: How You Can Contribute to Octave23781 Node: Distribution24811 Node: Introduction25918 Node: Running Octave26942 Node: Simple Examples27744 Node: Conventions35968 Node: Fonts36340 Node: Evaluation Notation36877 Node: Printing Notation37870 Node: Error Messages38395 Node: Format of Descriptions38792 Node: A Sample Function Description39396 Node: A Sample Command Description41540 Node: A Sample Variable Description42360 Node: Getting Started43477 Node: Invoking Octave from the Command Line44007 Node: Command Line Options44896 Ref: doc-argv49801 Ref: doc-program_name50328 Ref: doc-program_invocation_name50540 Node: Startup Files51418 Node: Quitting Octave53605 Ref: doc-quit53780 Ref: doc-atexit54053 Node: Getting Help55052 Ref: doc-help55678 Ref: doc-doc56260 Ref: doc-lookfor56801 Ref: doc-news58153 Ref: doc-info58229 Ref: doc-warranty58321 Ref: doc-info_file58574 Ref: doc-info_program59197 Ref: doc-makeinfo_program59956 Ref: doc-doc_cache_file60397 Ref: doc-suppress_verbose_help_message61232 Node: Command Line Editing61575 Node: Cursor Motion63440 Ref: doc-clc64810 Node: Killing and Yanking64956 Node: Commands For Text66659 Node: Commands For Completion68050 Ref: doc-completion_append_char68549 Ref: doc-completion_matches68842 Node: Commands For History69193 Ref: doc-history70922 Ref: doc-edit_history71822 Ref: doc-run_history73188 Ref: doc-saving_history73527 Ref: doc-history_file73953 Ref: doc-history_size74475 Ref: doc-history_timestamp_format_string74977 Ref: doc-EDITOR75600 Node: Customizing readline76043 Ref: doc-read_readline_init_file76638 Ref: doc-re_read_readline_init_file76924 Node: Customizing the Prompt77133 Ref: doc-PS178369 Ref: doc-PS279066 Ref: doc-PS479596 Node: Diary and Echo Commands80051 Ref: doc-diary80401 Ref: doc-echo81063 Ref: doc-echo_executing_commands81665 Node: Errors82318 Node: Executable Octave Programs84907 Ref: Executable Octave Programs-Footnote-188372 Node: Comments88506 Node: Single Line Comments89082 Node: Block Comments89730 Node: Comments and the Help System90359 Node: Data Types91657 Ref: doc-typeinfo92448 Node: Built-in Data Types92735 Ref: doc-class93410 Ref: doc-isa93750 Ref: doc-cast93841 Ref: doc-typecast94170 Ref: doc-swapbytes94728 Node: Numeric Objects95140 Node: Missing Data96019 Ref: doc-NA96458 Ref: doc-isna96742 Node: String Objects96945 Node: Data Structure Objects97428 Node: Cell Array Objects97892 Node: User-defined Data Types98186 Node: Object Sizes98645 Ref: doc-ndims99104 Ref: doc-columns99316 Ref: doc-rows99610 Ref: doc-numel99904 Ref: doc-length100032 Ref: doc-size100268 Ref: doc-isempty101040 Ref: doc-isnull101215 Ref: doc-sizeof101728 Ref: doc-size_equal101803 Ref: doc-squeeze102085 Node: Numeric Data Types102318 Ref: doc-double103801 Ref: doc-complex103878 Node: Matrices104199 Ref: doc-output_max_field_width107123 Ref: doc-output_precision107445 Ref: doc-split_long_rows108030 Ref: doc-fixed_point_format109359 Node: Empty Matrices110147 Ref: doc-print_empty_dimensions111146 Node: Ranges111881 Node: Single Precision Data Types114461 Ref: doc-single114880 Node: Integer Data Types115439 Ref: doc-isinteger116480 Ref: doc-int8116841 Ref: doc-uint8116913 Ref: doc-int16116995 Ref: doc-uint16117069 Ref: doc-int32117153 Ref: doc-uint32117227 Ref: doc-int64117311 Ref: doc-uint64117385 Ref: doc-intmax117469 Ref: doc-intmin118101 Ref: doc-intwarning118734 Node: Integer Arithmetic120425 Ref: doc-idivide121981 Node: Bit Manipulations123357 Ref: doc-bitset123721 Ref: doc-bitget124201 Ref: doc-bitmax125636 Ref: doc-bitand125996 Ref: doc-bitor126344 Ref: doc-bitxor126690 Ref: doc-bitcmp127287 Ref: doc-bitshift127888 Node: Logical Values129000 Ref: doc-logical130451 Ref: doc-true130619 Ref: doc-false130885 Node: Promotion and Demotion of Data Types131154 Node: Predicates for Numeric Objects133166 Ref: doc-isnumeric134032 Ref: doc-isreal134117 Ref: doc-isfloat134208 Ref: doc-iscomplex134303 Ref: doc-ismatrix134400 Ref: doc-isvector134492 Ref: doc-isscalar134766 Ref: doc-issquare135040 Ref: doc-issymmetric135383 Ref: doc-isdefinite135962 Ref: doc-islogical136306 Ref: doc-isprime136388 Node: Strings136844 Node: Escape Sequences in string constants137910 Node: Character Arrays139586 Ref: doc-ischar140584 Ref: doc-string_fill_char141394 Node: Creating Strings142095 Ref: doc-blanks142564 Node: Concatenating Strings143040 Ref: doc-char146008 Ref: doc-strvcat146817 Ref: doc-strcat147722 Ref: doc-cstrcat148547 Node: Conversion of Numerical Data to Strings149028 Ref: doc-mat2str149777 Ref: doc-num2str150910 Ref: doc-int2str152352 Node: Comparing Strings153127 Ref: doc-strcmp153869 Ref: doc-strncmp154642 Ref: doc-strcmpi155578 Ref: doc-strncmpi156390 Ref: doc-validatestring157232 Node: Manipulating Strings158169 Ref: doc-deblank158924 Ref: doc-strtrim159166 Ref: doc-strtrunc159578 Ref: doc-findstr159861 Ref: doc-strchr160546 Ref: doc-index160982 Ref: doc-rindex161618 Ref: doc-strfind162016 Ref: doc-strmatch163056 Ref: doc-strtok163922 Ref: doc-strsplit164547 Ref: doc-strrep164904 Ref: doc-substr165278 Ref: doc-regexp165794 Ref: doc-regexpi169917 Ref: doc-regexprep170265 Ref: doc-regexptranslate171585 Node: String Conversions172469 Ref: doc-bin2dec172871 Ref: doc-dec2bin173365 Ref: doc-dec2hex173988 Ref: doc-hex2dec174581 Ref: doc-dec2base175121 Ref: doc-base2dec175915 Ref: doc-num2hex176688 Ref: doc-hex2num177224 Ref: doc-str2double177743 Ref: doc-strjust179800 Ref: doc-str2num180301 Ref: doc-toascii180893 Ref: doc-tolower181105 Ref: doc-toupper181491 Ref: doc-do_string_escapes181879 Ref: doc-undo_string_escapes181997 Node: Character Class Functions182767 Ref: doc-isalnum183327 Ref: doc-isalpha183466 Ref: doc-isascii183634 Ref: doc-iscntrl183752 Ref: doc-isdigit183826 Ref: doc-isgraph183916 Ref: doc-isletter184022 Ref: doc-islower184155 Ref: doc-isprint184249 Ref: doc-ispunct184357 Ref: doc-isspace184435 Ref: doc-isupper184584 Ref: doc-isxdigit184658 Ref: doc-isstrprop184753 Node: Data Containers186412 Node: Data Structures186878 Ref: doc-struct_levels_to_print188706 Node: Structure Arrays190291 Node: Creating Structures192679 Ref: doc-struct193956 Ref: doc-isstruct194488 Ref: doc-rmfield194684 Ref: doc-setfield194974 Ref: doc-orderfields195563 Node: Manipulating Structures196194 Ref: doc-fieldnames196476 Ref: doc-isfield196691 Ref: doc-getfield196914 Ref: doc-substruct197514 Node: Processing Data in Structures197716 Ref: doc-structfun198155 Ref: doc-struct2cell200132 Node: Cell Arrays200490 Ref: doc-celldisp202203 Node: Creating Cell Arrays202600 Ref: doc-cell204251 Ref: doc-iscell204710 Ref: doc-num2cell204818 Ref: doc-mat2cell205124 Node: Indexing Cell Arrays206151 Node: Cell Arrays of Strings207951 Ref: doc-cellstr209537 Ref: doc-iscellstr209666 Ref: doc-cellidx209792 Node: Processing Data in Cell Arrays210417 Ref: doc-cellfun210954 Ref: doc-cell2mat214247 Ref: doc-cell2struct214586 Node: Comma Separated Lists215115 Ref: Comma Separated Lists-Footnote-1218549 Node: Variables218636 Ref: doc-ans220487 Ref: doc-isvarname220719 Ref: doc-genvarname220811 Ref: doc-namelengthmax223002 Node: Global Variables223526 Ref: doc-isglobal225250 Node: Persistent Variables225440 Ref: doc-persistent225610 Node: Status of Variables228971 Ref: doc-who229512 Ref: doc-whos230592 Ref: doc-whos_line_format230645 Ref: doc-exist232405 Ref: doc-clear234047 Ref: doc-type236412 Ref: doc-which236836 Ref: doc-what237061 Node: Expressions237423 Node: Index Expressions238282 Ref: doc-sub2ind242255 Ref: doc-ind2sub242750 Node: Calling Functions243194 Node: Call by Value245707 Node: Recursion247719 Ref: doc-max_recursion_depth248658 Ref: Recursion-Footnote-1249011 Ref: Recursion-Footnote-2249400 Node: Arithmetic Ops249561 Node: Comparison Ops252846 Ref: doc-isequal253994 Ref: doc-isequalwithequalnans254159 Node: Boolean Expressions254333 Node: Element-by-element Boolean Operators254582 Node: Short-circuit Boolean Operators257047 Node: Assignment Ops259968 Node: Increment Ops264758 Node: Operator Precedence266379 Node: Evaluation268435 Ref: doc-eval268873 Node: Calling a Function by its Name269706 Ref: doc-feval271414 Ref: doc-run272217 Node: Evaluation in a Different Context272596 Ref: doc-evalin274994 Ref: doc-assignin275181 Node: Statements275339 Node: The `if' Statement276862 Node: The `switch' Statement280394 Node: Notes for the C programmer283217 Node: The `while' Statement284320 Node: The `do-until' Statement286528 Node: The `for' Statement287942 Node: Looping Over Structure Elements291104 Node: The `break' Statement292375 Node: The `continue' Statement293894 Node: The `unwind_protect' Statement295188 Node: The `try' Statement296603 Node: Continuation Lines297639 Node: Functions and Scripts299324 Node: Defining Functions300041 Ref: doc-nargin305225 Ref: doc-inputname305780 Ref: doc-silent_functions305873 Node: Multiple Return Values306268 Ref: doc-nargout308617 Ref: doc-nargchk309323 Ref: doc-nargoutchk309927 Ref: doc-varargin310546 Ref: doc-varargout310546 Node: Variable-length Argument Lists310546 Ref: doc-parseparams312685 Node: Variable-length Return Lists313373 Ref: doc-deal314542 Node: Returning From a Function315046 Node: Default Arguments316634 Node: Function Files317923 Ref: doc-edit320531 Ref: doc-mfilename325341 Ref: doc-ignore_function_time_stamp325800 Ref: Function Files-Footnote-1326867 Node: Manipulating the load path326933 Ref: doc-addpath327748 Ref: doc-genpath328323 Ref: doc-rmpath328430 Ref: doc-savepath328727 Ref: doc-path329173 Ref: doc-pathdef329871 Ref: doc-pathsep330391 Ref: doc-rehash330644 Ref: doc-file_in_loadpath330733 Ref: doc-restoredefaultpath331461 Ref: doc-command_line_path331795 Ref: doc-find_dir_in_path332111 Node: Subfunctions332442 Node: Private Functions333238 Node: Overloading and Autoloading334321 Ref: doc-dispatch335206 Ref: doc-builtin335707 Ref: doc-autoload336673 Node: Function Locking337705 Ref: doc-mlock339641 Ref: doc-munlock339864 Ref: doc-mislocked340112 Node: Function Precedence340394 Node: Script Files341871 Ref: doc-source345681 Node: Function Handles Inline Functions and Anonymous Functions345890 Node: Function Handles346475 Ref: doc-functions347398 Ref: doc-func2str347533 Ref: doc-str2func347688 Node: Anonymous Functions347801 Node: Inline Functions348888 Ref: doc-inline349333 Ref: doc-argnames350299 Ref: doc-formula350565 Ref: doc-vectorize350846 Ref: doc-symvar351022 Node: Commands351364 Ref: doc-mark_as_command352588 Ref: doc-unmark_command352725 Ref: doc-iscommand352861 Ref: doc-mark_as_rawcommand352992 Ref: doc-unmark_rawcommand353132 Ref: doc-israwcommand353271 Node: Organization of Functions353405 Node: Errors and Warnings355521 Node: Handling Errors356126 Node: Raising Errors356858 Ref: doc-error357477 Ref: doc-print_usage360658 Ref: doc-usage360956 Ref: doc-beep361808 Ref: doc-beep_on_error362015 Node: Catching Errors362267 Ref: doc-lasterror363412 Ref: doc-lasterr364900 Ref: doc-rethrow365785 Ref: doc-errno366230 Ref: doc-errno_list366582 Node: Handling Warnings366691 Node: Issuing Warnings367270 Ref: doc-warning368518 Ref: doc-lastwarn369766 Node: Enabling and Disabling Warnings370014 Ref: doc-warning_ids370970 Node: Debugging378338 Node: Entering Debug Mode379017 Ref: doc-debug_on_interrupt379508 Ref: doc-debug_on_warning379924 Ref: doc-debug_on_error380170 Node: Leaving Debug Mode380535 Ref: doc-dbcont380761 Ref: doc-dbquit381013 Node: Breakpoints381282 Ref: doc-dbstop381497 Ref: doc-dbstatus382684 Ref: doc-dbclear383151 Ref: doc-keyboard384532 Node: Debug Mode385358 Ref: doc-dbwhere385721 Ref: doc-dbtype385899 Ref: doc-isdebugmode386172 Ref: doc-dbstep386493 Node: Call Stack387073 Ref: doc-dbstack387181 Ref: doc-dbup387452 Ref: doc-dbdown387636 Node: Input and Output387826 Node: Basic Input and Output388350 Node: Terminal Output388609 Ref: doc-disp389347 Ref: doc-format389760 Node: Paging Screen Output395052 Ref: doc-more396196 Ref: doc-PAGER396426 Ref: doc-PAGER_FLAGS396984 Ref: doc-page_screen_output397220 Ref: doc-page_output_immediately397667 Ref: doc-fflush398039 Node: Terminal Input398489 Ref: doc-input398900 Ref: doc-menu400025 Ref: doc-yes_or_no400561 Ref: doc-kbhit401177 Node: Simple File I/O401601 Ref: doc-save402426 Ref: doc-load405908 Ref: doc-default_save_options409491 Ref: doc-save_precision409879 Ref: doc-save_header_format_string410107 Ref: doc-native_float_format410828 Ref: doc-fdisp411409 Ref: doc-dlmwrite411837 Ref: doc-dlmread413479 Ref: doc-csvwrite414301 Ref: doc-csvread414572 Node: Saving Data on Unexpected Exits414885 Ref: doc-crash_dumps_octave_core415401 Ref: doc-sighup_dumps_octave_core415940 Ref: doc-sigterm_dumps_octave_core416239 Ref: doc-octave_core_file_options416543 Ref: doc-octave_core_file_limit417173 Ref: doc-octave_core_file_name418062 Node: Rational Approximations418585 Ref: doc-rat418754 Ref: doc-rats419243 Node: C-Style I/O Functions419675 Ref: doc-stdin420488 Ref: doc-stdout420773 Ref: doc-stderr421038 Node: Opening and Closing Files421842 Ref: doc-fopen422577 Ref: doc-fclose426061 Node: Simple Output426293 Ref: doc-fputs426838 Ref: doc-puts427358 Node: Line-Oriented Input427524 Ref: doc-fgetl428106 Ref: doc-fgets428557 Node: Formatted Output429061 Ref: doc-printf429576 Ref: doc-fprintf429885 Ref: doc-sprintf430301 Node: Output Conversion for Matrices432816 Node: Output Conversion Syntax433906 Node: Table of Output Conversions436874 Node: Integer Conversions439058 Node: Floating-Point Conversions441114 Node: Other Output Conversions443950 Node: Formatted Input445059 Ref: doc-fscanf445472 Ref: doc-scanf447083 Ref: doc-sscanf447453 Node: Input Conversion Syntax449144 Node: Table of Input Conversions451634 Node: Numeric Input Conversions453473 Node: String Input Conversions454513 Node: Binary I/O455544 Ref: doc-fread456006 Ref: doc-fwrite460459 Node: Temporary Files461161 Ref: doc-mkstemp461596 Ref: doc-tmpfile462638 Ref: doc-tmpnam463181 Node: EOF and Errors463815 Ref: doc-feof464696 Ref: doc-ferror465099 Ref: doc-fclear465379 Ref: doc-freport465469 Node: File Positioning465870 Ref: doc-ftell466128 Ref: doc-fseek466376 Ref: doc-SEEK_SET467032 Ref: doc-frewind467440 Node: Plotting467985 Node: Plotting Basics468163 Node: Two-Dimensional Plots468710 Ref: fig:plot469149 Ref: doc-plot469336 Ref: doc-plotyy473927 Ref: doc-semilogx475344 Ref: doc-semilogy475656 Ref: doc-loglog475968 Ref: fig:hist476520 Ref: doc-bar476689 Ref: doc-barh478159 Ref: doc-hist479317 Ref: doc-stairs480231 Ref: doc-stem481186 Ref: doc-stem3482726 Ref: doc-scatter483361 Ref: doc-scatter3484872 Ref: doc-plotmatrix486374 Ref: doc-pareto487781 Ref: doc-rose489238 Ref: doc-contour490360 Ref: doc-contourf491440 Ref: doc-contourc492876 Ref: doc-contour3493972 Ref: fig:errorbar495520 Ref: doc-errorbar495697 Ref: doc-semilogxerr497956 Ref: doc-semilogyerr498527 Ref: doc-loglogerr499098 Ref: fig:polar499931 Ref: doc-polar500102 Ref: doc-pie500327 Ref: doc-quiver501095 Ref: doc-quiver3502497 Ref: doc-compass504020 Ref: doc-feather504880 Ref: doc-pcolor505723 Ref: doc-area507031 Ref: doc-comet507940 Ref: doc-axis508696 Ref: doc-caxis511187 Ref: doc-ylim512009 Ref: doc-zlim512009 Ref: doc-xlim512009 Node: Two-dimensional Function Plotting512949 Ref: doc-fplot513644 Ref: doc-ezplot514518 Ref: doc-ezcontour516012 Ref: doc-ezcontourf517141 Ref: doc-ezpolar518281 Node: Three-Dimensional Plotting519160 Ref: fig:mesh519857 Ref: fig:plot3520452 Ref: doc-mesh520721 Ref: doc-meshc521157 Ref: doc-meshz521628 Ref: doc-hidden522095 Ref: doc-surf522481 Ref: doc-surfc522907 Ref: doc-surfl523381 Ref: doc-surfnorm524930 Ref: doc-diffuse526109 Ref: doc-specular526512 Ref: doc-meshgrid527102 Ref: doc-ndgrid527771 Ref: doc-plot3528339 Ref: doc-view530029 Ref: doc-slice530210 Ref: doc-ribbon532083 Ref: doc-shading532571 Node: Three-dimensional Function Plotting533172 Ref: doc-ezplot3533404 Ref: doc-ezmesh534395 Ref: doc-ezmeshc536054 Ref: doc-ezsurf537513 Ref: doc-ezsurfc539175 Node: Three-dimensional Geometric Shapes540637 Ref: doc-cylinder540867 Ref: doc-sphere541703 Ref: doc-ellipsoid542212 Node: Plot Annotations542630 Ref: doc-title543262 Ref: doc-legend543398 Ref: doc-text544846 Ref: doc-ylabel545298 Ref: doc-zlabel545298 Ref: doc-xlabel545298 Ref: doc-clabel545855 Ref: doc-box547487 Ref: doc-grid547755 Ref: doc-colorbar548370 Node: Multiple Plots on One Page549316 Ref: doc-subplot550192 Node: Multiple Plot Windows550970 Ref: doc-figure551466 Node: Printing Plots551788 Ref: doc-print552150 Ref: doc-orient556864 Node: Interacting with plots557094 Ref: doc-ginput557453 Ref: doc-waitforbuttonpress557747 Ref: doc-gtext557988 Node: Test Plotting Functions558370 Ref: doc-sombrero558725 Ref: doc-peaks559072 Node: Advanced Plotting560018 Node: Graphics Objects560344 Ref: doc-ishandle561388 Ref: doc-ishghandle561490 Ref: doc-isfigure561590 Ref: doc-gcf561937 Ref: doc-gca562525 Ref: doc-get564400 Ref: doc-set564663 Ref: doc-ancestor564800 Ref: doc-allchild565430 Ref: doc-axes566094 Ref: doc-line566254 Ref: doc-patch566655 Ref: doc-fill567419 Ref: doc-surface567701 Ref: doc-drawnow568733 Ref: doc-refresh569041 Ref: doc-newplot569866 Ref: doc-hold570047 Ref: doc-ishold570689 Ref: doc-clf571181 Ref: doc-cla571735 Ref: doc-shg572176 Ref: doc-delete572359 Ref: doc-close572472 Ref: doc-closereq572791 Node: Graphics Object Properties572979 Node: Root Figure Properties573398 Node: Figure Properties573646 Node: Axes Properties574336 Node: Line Properties578334 Node: Text Properties579163 Ref: tab:extended582189 Node: Image Properties585019 Node: Patch Properties585647 Node: Surface Properties586274 Node: Searching Properties586803 Ref: doc-findobj586974 Ref: doc-findall588650 Node: Managing Default Properties589190 Node: Colors591689 Node: Line Styles592048 Node: Marker Styles592551 Node: Callbacks593330 Ref: doc-gcbo595239 Ref: doc-gcbf595829 Node: Object Groups596316 Ref: doc-hggroup596772 Ref: doc-addproperty597695 Ref: doc-addlistener600566 Ref: doc-dellistener601712 Ref: doc-linkprop603328 Node: Data sources in object groups605763 Ref: doc-refreshdata606166 Ref: doc-linkdata606919 Node: Area series606919 Node: Bar series607792 Node: Contour groups609622 Node: Error bar series612263 Node: Line series613222 Node: Quiver group613973 Node: Scatter group615563 Node: Stair group616634 Node: Stem Series617457 Node: Surface group618910 Node: Graphics backends619809 Ref: doc-backend619953 Ref: doc-available_backends620425 Node: Interaction with gnuplot620555 Ref: doc-gnuplot_binary620706 Node: Matrix Manipulation620944 Node: Finding Elements and Checking Conditions621650 Ref: doc-any622103 Ref: doc-all622639 Ref: doc-xor623360 Ref: doc-is_duplicate_entry623583 Ref: doc-diff623699 Ref: doc-isinf624598 Ref: doc-isnan624791 Ref: doc-finite625029 Ref: doc-find625230 Ref: doc-common_size626827 Node: Rearranging Matrices627475 Ref: doc-fliplr627693 Ref: doc-flipud628116 Ref: doc-flipdim628607 Ref: doc-rot90628925 Ref: doc-rotdim629866 Ref: doc-cat630951 Ref: doc-horzcat631813 Ref: doc-vertcat632057 Ref: doc-permute632299 Ref: doc-ipermute632589 Ref: doc-reshape632821 Ref: doc-resize633451 Ref: doc-circshift634660 Ref: doc-shiftdim635452 Ref: doc-shift636372 Ref: doc-sort636663 Ref: doc-sortrows638127 Ref: doc-issorted638458 Ref: doc-triu639405 Ref: doc-tril639405 Ref: doc-vec640461 Ref: doc-vech640588 Ref: doc-postpad640777 Ref: doc-prepad640777 Ref: doc-diag641338 Ref: doc-blkdiag641965 Ref: Rearranging Matrices-Footnote-1642290 Node: Applying a Function to an Array642463 Ref: doc-arrayfun642687 Ref: doc-bsxfun646202 Node: Special Utility Matrices646730 Ref: doc-eye646935 Ref: doc-ones647989 Ref: doc-zeros648577 Ref: doc-repmat649022 Ref: doc-rand649282 Ref: doc-randn651854 Ref: doc-rande652614 Ref: doc-randp653338 Ref: doc-randg654841 Ref: doc-randperm658059 Ref: doc-linspace658329 Ref: doc-logspace658898 Ref: Special Utility Matrices-Footnote-1659410 Node: Famous Matrices659507 Ref: doc-hadamard659707 Ref: doc-hankel660342 Ref: doc-hilb661050 Ref: doc-invhilb661402 Ref: doc-magic662572 Ref: doc-pascal662720 Ref: doc-rosser663608 Ref: doc-sylvester_matrix664073 Ref: doc-toeplitz664326 Ref: doc-vander665175 Ref: doc-wilkinson665866 Node: Arithmetic666270 Node: Exponents and Logarithms666974 Ref: doc-exp667133 Ref: doc-expm1667314 Ref: doc-log667453 Ref: doc-log1p667768 Ref: doc-log10667956 Ref: doc-log2668162 Ref: doc-nextpow2668570 Ref: doc-nthroot668803 Ref: doc-pow2669040 Ref: doc-reallog669290 Ref: doc-realpow669563 Ref: doc-realsqrt669859 Ref: doc-sqrt670128 Node: Complex Arithmetic670383 Ref: doc-abs670667 Ref: doc-arg670832 Ref: doc-conj671051 Ref: doc-cplxpair671218 Ref: doc-imag672178 Ref: doc-real672327 Node: Trigonometry672454 Ref: doc-sin673117 Ref: doc-cos673294 Ref: doc-tan673473 Ref: doc-sec673653 Ref: doc-csc673832 Ref: doc-cot674013 Ref: doc-asin674195 Ref: doc-acos674354 Ref: doc-atan674515 Ref: doc-asec674677 Ref: doc-acsc674838 Ref: doc-acot675001 Ref: doc-sinh675165 Ref: doc-cosh675345 Ref: doc-tanh675527 Ref: doc-sech675706 Ref: doc-csch675838 Ref: doc-coth675972 Ref: doc-asinh676107 Ref: doc-acosh676245 Ref: doc-atanh676385 Ref: doc-asech676526 Ref: doc-acsch676665 Ref: doc-acoth676806 Ref: doc-atan2676948 Ref: doc-sind677435 Ref: doc-cosd677644 Ref: doc-tand677860 Ref: doc-secd678133 Ref: doc-cscd678283 Ref: doc-cotd678435 Ref: doc-asind678588 Ref: doc-acosd678745 Ref: doc-atand678904 Ref: doc-asecd679064 Ref: doc-acscd679223 Ref: doc-acotd679384 Node: Sums and Products679546 Ref: doc-sum679704 Ref: doc-prod680403 Ref: doc-cumsum680756 Ref: doc-cumprod681393 Ref: doc-sumsq681833 Ref: doc-accumarray682344 Node: Utility Functions683829 Ref: doc-ceil683992 Ref: doc-cross684354 Ref: doc-del2684825 Ref: doc-factor686047 Ref: doc-factorial686438 Ref: doc-fix686824 Ref: doc-floor687189 Ref: doc-fmod687556 Ref: doc-gcd687849 Ref: doc-gradient688785 Ref: doc-hypot690695 Ref: doc-lcm690956 Ref: doc-list_primes691335 Ref: doc-max691591 Ref: doc-min692681 Ref: doc-cummax693761 Ref: doc-cummin694572 Ref: doc-mod695385 Ref: doc-primes695935 Ref: doc-rem696409 Ref: doc-round696753 Ref: doc-roundb697042 Ref: doc-sign697314 Node: Special Functions697560 Ref: doc-airy697732 Ref: doc-besselj698851 Ref: doc-beta701000 Ref: doc-betainc701148 Ref: doc-betaln701637 Ref: doc-bincoeff701889 Ref: doc-commutation_matrix702424 Ref: doc-duplication_matrix702811 Ref: doc-erf703143 Ref: doc-erfc703468 Ref: doc-erfinv703628 Ref: doc-gamma703772 Ref: doc-gammainc704062 Ref: doc-legendre704816 Ref: doc-gammaln707120 Ref: doc-lgamma707120 Node: Coordinate Transformations707324 Ref: doc-cart2pol707519 Ref: doc-pol2cart707965 Ref: doc-cart2sph708415 Ref: doc-sph2cart708845 Node: Mathematical Constants709275 Ref: doc-e709436 Ref: doc-pi710254 Ref: doc-I711107 Ref: doc-Inf712037 Ref: doc-NaN713093 Ref: doc-eps714388 Ref: doc-realmax715478 Ref: doc-realmin716625 Node: Linear Algebra717753 Node: Techniques used for Linear Algebra718289 Node: Basic Matrix Functions720232 Ref: doc-balance720435 Ref: doc-cond721912 Ref: doc-det722386 Ref: doc-dmult722599 Ref: doc-dot722765 Ref: doc-eig723043 Ref: doc-givens723609 Ref: doc-planerot723932 Ref: doc-inv724140 Ref: doc-matrix_type724717 Ref: doc-norm727848 Ref: doc-null729108 Ref: doc-orth729416 Ref: doc-pinv729722 Ref: doc-rank730025 Ref: doc-rcond730452 Ref: doc-trace730879 Ref: doc-rref730957 Node: Matrix Factorizations731269 Ref: doc-chol731457 Ref: doc-cholinv732927 Ref: doc-chol2inv733143 Ref: doc-cholupdate733522 Ref: doc-cholinsert734170 Ref: doc-choldelete734856 Ref: doc-cholshift735235 Ref: doc-hess735724 Ref: doc-lu736303 Ref: doc-qr738822 Ref: doc-qrupdate741023 Ref: doc-qrinsert741746 Ref: doc-qrdelete742890 Ref: doc-qrshift743950 Ref: doc-qz744393 Ref: doc-qzhess746317 Ref: doc-schur747055 Ref: doc-subspace748504 Ref: doc-svd748658 Ref: doc-housh749705 Ref: doc-krylov750304 Node: Functions of a Matrix751490 Ref: doc-expm751675 Ref: doc-logm752559 Ref: doc-sqrtm752778 Ref: doc-kron753147 Ref: doc-syl753438 Node: Specialized Solvers753719 Ref: doc-bicgstab753870 Ref: doc-cgs755039 Node: Nonlinear Equations755747 Ref: doc-fsolve756243 Ref: doc-fzero762087 Node: Diagonal and Permutation Matrices763143 Node: Basic Usage763707 Node: Creating Diagonal Matrices764942 Node: Creating Permutation Matrices766050 Node: Explicit and Implicit Conversions767812 Node: Matrix Algebra769082 Node: Expressions Involving Diagonal Matrices769709 Node: Expressions Involving Permutation Matrices772952 Node: Function Support775073 Node: Diagonal Matrix Functions775709 Node: Permutation Matrix Functions776396 Node: Example Codes777164 Node: Zeros Treatment778422 Node: Sparse Matrices781555 Node: Basics781981 Node: Storage of Sparse Matrices783280 Ref: Storage of Sparse Matrices-Footnote-1787477 Node: Creating Sparse Matrices787625 Ref: doc-spdiags789557 Ref: doc-speye790626 Ref: doc-spfun791121 Ref: doc-spmax791364 Ref: doc-spmin791508 Ref: doc-spones791652 Ref: doc-sprand791802 Ref: doc-sprandn792385 Ref: doc-sprandsym792989 Ref: doc-full795721 Ref: doc-spalloc795900 Ref: doc-sparse796663 Ref: doc-spconvert798132 Node: Information798872 Ref: doc-issparse799940 Ref: doc-nnz800051 Ref: doc-nonzeros800187 Ref: doc-nzmax800290 Ref: doc-spstats800757 Ref: fig:spmatrix802850 Ref: doc-spy804808 Ref: doc-etree805239 Ref: doc-etreeplot805812 Ref: doc-gplot806150 Ref: doc-treeplot806805 Ref: doc-treelayout807236 Node: Operators and Functions807701 Node: Sparse Functions808007 Node: Return Types of Operators and Functions809914 Ref: doc-sparse_auto_mutate812396 Node: Mathematical Considerations813021 Ref: fig:simplematrix816175 Ref: fig:simplechol817946 Ref: fig:simplecholperm818737 Ref: doc-amd819902 Ref: doc-ccolamd821217 Ref: doc-colamd825134 Ref: doc-colperm828738 Ref: doc-csymamd829055 Ref: doc-dmperm831841 Ref: doc-symamd832635 Ref: doc-symrcm836096 Node: Sparse Linear Algebra837134 Ref: doc-normest841341 Ref: doc-onenormest841794 Ref: doc-condest843208 Ref: doc-spparms844909 Ref: doc-sprank847305 Ref: doc-symbfact847753 Ref: doc-spaugment849098 Ref: doc-eigs850617 Ref: doc-svds856494 Ref: Sparse Linear Algebra-Footnote-1858636 Node: Iterative Techniques858775 Ref: doc-pcg859298 Ref: doc-pcr865475 Ref: doc-luinc870182 Node: Real Life Example872636 Node: Numerical Integration878066 Node: Functions of One Variable878499 Ref: doc-quad879322 Ref: doc-quad_options880765 Ref: doc-quadl882867 Ref: doc-quadgk883978 Ref: doc-quadv887929 Ref: doc-trapz889177 Ref: doc-cumtrapz889617 Node: Orthogonal Collocation890124 Ref: doc-colloc890301 Node: Functions of Multiple Variables891313 Ref: doc-dblquad892832 Ref: doc-triplequad893603 Node: Differential Equations895308 Node: Ordinary Differential Equations895739 Ref: doc-lsode896078 Ref: doc-lsode_options898824 Node: Differential-Algebraic Equations901916 Ref: doc-daspk902344 Ref: doc-daspk_options904934 Ref: doc-dassl911431 Ref: doc-dassl_options914099 Ref: doc-dasrt916558 Ref: doc-dasrt_options920776 Node: Optimization922749 Node: Linear Programming923221 Ref: doc-glpk923603 Node: Quadratic Programming936178 Ref: doc-qp936539 Node: Nonlinear Programming937641 Ref: doc-sqp937930 Node: Linear Least Squares942063 Ref: doc-ols942623 Ref: doc-gls943403 Ref: doc-lsqnonneg944005 Ref: doc-optimset945285 Ref: doc-optimget945508 Node: Statistics945808 Node: Descriptive Statistics946797 Ref: doc-mean947033 Ref: doc-median947734 Ref: doc-quantile948273 Ref: doc-prctile950994 Ref: doc-meansq951753 Ref: doc-std952081 Ref: doc-var952939 Ref: doc-mode953528 Ref: doc-cov954053 Ref: doc-cor954368 Ref: doc-corrcoef954865 Ref: doc-kurtosis955254 Ref: doc-skewness955616 Ref: doc-statistics955964 Ref: doc-moment956294 Node: Basic Statistical Functions956837 Ref: doc-mahalanobis957096 Ref: doc-center957348 Ref: doc-studentize957606 Ref: doc-nchoosek957893 Ref: doc-histc958720 Ref: doc-perms959830 Ref: doc-values960189 Ref: doc-table960389 Ref: doc-spearman960646 Ref: doc-run_count961272 Ref: doc-ranks961517 Ref: doc-range961717 Ref: doc-probit962039 Ref: doc-logit962181 Ref: doc-cloglog962312 Ref: doc-kendall962451 Ref: doc-iqr963342 Ref: doc-cut963674 Node: Statistical Plots964221 Ref: doc-qqplot964688 Ref: doc-ppplot965628 Node: Tests966492 Ref: doc-anova968070 Ref: doc-bartlett_test969080 Ref: doc-chisquare_test_homogeneity969569 Ref: doc-chisquare_test_independence970188 Ref: doc-cor_test970647 Ref: doc-f_test_regression972052 Ref: doc-hotelling_test972566 Ref: doc-hotelling_test_2973134 Ref: doc-kolmogorov_smirnov_test973818 Ref: doc-kolmogorov_smirnov_test_2975187 Ref: doc-kruskal_wallis_test976359 Ref: doc-manova977494 Ref: doc-mcnemar_test978141 Ref: doc-prop_test_2978693 Ref: doc-run_test979561 Ref: doc-sign_test979896 Ref: doc-t_test980854 Ref: doc-t_test_2981706 Ref: doc-t_test_regression982592 Ref: doc-u_test983449 Ref: doc-var_test984343 Ref: doc-welch_test985231 Ref: doc-wilcoxon_test986131 Ref: doc-z_test987087 Ref: doc-z_test_2987938 Node: Models988822 Ref: doc-logistic_regression988936 Node: Distributions990618 Ref: doc-betacdf993206 Ref: doc-betainv993385 Ref: doc-betapdf993560 Ref: doc-binocdf993703 Ref: doc-binoinv993850 Ref: doc-binopdf994002 Ref: doc-cauchy_cdf994180 Ref: doc-cauchy_inv994458 Ref: doc-cauchy_pdf994731 Ref: doc-chi2cdf995009 Ref: doc-chi2inv995196 Ref: doc-chi2pdf995373 Ref: doc-discrete_cdf995557 Ref: doc-discrete_inv995785 Ref: doc-discrete_pdf996003 Ref: doc-empirical_cdf996227 Ref: doc-empirical_inv996438 Ref: doc-empirical_pdf996644 Ref: doc-expcdf996851 Ref: doc-expinv997088 Ref: doc-exppdf997262 Ref: doc-fcdf997432 Ref: doc-finv997605 Ref: doc-fpdf997774 Ref: doc-gamcdf997950 Ref: doc-gaminv998321 Ref: doc-gampdf998684 Ref: doc-geocdf999045 Ref: doc-geoinv999182 Ref: doc-geopdf999324 Ref: doc-hygecdf999492 Ref: doc-hygeinv999962 Ref: doc-hygepdf1000221 Ref: doc-kolmogorov_smirnov_cdf1000633 Ref: doc-laplace_cdf1001001 Ref: doc-laplace_inv1001156 Ref: doc-laplace_pdf1001306 Ref: doc-logistic_cdf1001457 Ref: doc-logistic_inv1001581 Ref: doc-logistic_pdf1001735 Ref: doc-logncdf1001859 Ref: doc-logninv1002241 Ref: doc-lognpdf1002616 Ref: doc-nbincdf1002994 Ref: doc-nbininv1003297 Ref: doc-nbinpdf1003605 Ref: doc-normcdf1003944 Ref: doc-norminv1004181 Ref: doc-normpdf1004413 Ref: doc-poisscdf1004646 Ref: doc-poissinv1004833 Ref: doc-poisspdf1005012 Ref: doc-tcdf1005190 Ref: doc-tinv1005400 Ref: doc-tpdf1005712 Ref: doc-unidcdf1005894 Ref: doc-unidinv1006116 Ref: doc-unidpdf1006336 Ref: doc-unifcdf1006554 Ref: doc-unifinv1006735 Ref: doc-unifpdf1006936 Ref: doc-wblcdf1007107 Ref: doc-wblinv1007369 Ref: doc-wblpdf1007558 Node: Random Number Generation1007862 Ref: doc-betarnd1009336 Ref: doc-binornd1009686 Ref: doc-cauchy_rnd1010042 Ref: doc-chi2rnd1010433 Ref: doc-discrete_rnd1010764 Ref: doc-empirical_rnd1011203 Ref: doc-exprnd1011587 Ref: doc-frnd1011960 Ref: doc-gamrnd1012364 Ref: doc-geornd1012902 Ref: doc-hygernd1013249 Ref: doc-laplace_rnd1013740 Ref: doc-logistic_rnd1013947 Ref: doc-lognrnd1014156 Ref: doc-nbinrnd1014576 Ref: doc-normrnd1014988 Ref: doc-poissrnd1015364 Ref: doc-trnd1015649 Ref: doc-unidrnd1016008 Ref: doc-unifrnd1016487 Ref: doc-wblrnd1016827 Ref: doc-wienrnd1017240 Node: Sets1017695 Ref: doc-unique1017992 Node: Set Operations1019018 Ref: doc-ismember1019527 Ref: doc-union1020788 Ref: doc-intersect1021547 Ref: doc-complement1022026 Ref: doc-setdiff1022310 Ref: doc-setxor1022956 Node: Polynomial Manipulations1023505 Node: Evaluating Polynomials1024061 Ref: doc-polyval1024969 Ref: doc-polyvalm1025989 Node: Finding Roots1026581 Ref: doc-roots1026953 Ref: doc-compan1027442 Ref: doc-mpoles1028533 Node: Products of Polynomials1029588 Ref: doc-conv1029787 Ref: doc-convn1030280 Ref: doc-deconv1031009 Ref: doc-conv21031558 Ref: doc-polygcd1032142 Ref: doc-residue1033107 Node: Derivatives and Integrals1035645 Ref: doc-polyderiv1036241 Ref: doc-polyder1036981 Ref: doc-polyinteg1037117 Ref: doc-polyint1037660 Node: Polynomial Interpolation1038212 Ref: doc-polyfit1038920 Ref: doc-ppval1040650 Ref: doc-mkpp1040991 Ref: doc-unmkpp1041860 Node: Miscellaneous Functions1042810 Ref: doc-poly1042986 Ref: doc-polyout1043874 Ref: doc-polyreduce1044423 Node: Interpolation1044882 Node: One-dimensional Interpolation1045100 Ref: doc-interp11045507 Ref: doc-interp1q1048864 Ref: doc-interpft1049806 Ref: doc-spline1051278 Ref: doc-lookup1052861 Node: Multi-dimensional Interpolation1054346 Ref: doc-interp21054732 Ref: doc-interp31056605 Ref: doc-interpn1058432 Ref: doc-bicubic1061354 Node: Geometry1061728 Ref: Geometry-Footnote-11062227 Node: Delaunay Triangulation1062413 Ref: doc-delaunay1063133 Ref: doc-delaunay31064482 Ref: doc-delaunayn1065035 Node: Plotting the Triangulation1066712 Ref: doc-triplot1067029 Ref: doc-trimesh1067541 Node: Identifying points in Triangulation1068407 Ref: doc-tsearch1070680 Ref: doc-tsearchn1071017 Ref: doc-dsearch1072246 Ref: doc-dsearchn1072598 Node: Voronoi Diagrams1073537 Ref: doc-voronoi1074183 Ref: doc-voronoin1075151 Ref: doc-polyarea1076244 Ref: doc-rectint1077181 Ref: doc-inpolygon1077657 Node: Convex Hull1078287 Ref: doc-convhull1078673 Ref: doc-convhulln1079162 Node: Interpolation on Scattered Data1080072 Ref: doc-griddata1080748 Ref: doc-griddata31081287 Ref: doc-griddatan1081739 Node: Signal Processing1082465 Ref: doc-detrend1082818 Ref: doc-fft1083186 Ref: doc-fftw1084748 Ref: doc-ifft1087855 Ref: doc-fft21088832 Ref: doc-ifft21089287 Ref: doc-fftn1089752 Ref: doc-ifftn1090268 Ref: doc-fftconv1090803 Ref: doc-fftfilt1091250 Ref: doc-filter1091562 Ref: doc-filter21093138 Ref: doc-freqz1093714 Ref: doc-freqz_plot1094957 Ref: doc-sinc1095056 Ref: doc-unwrap1095117 Ref: doc-arch_fit1095477 Ref: doc-arch_rnd1096369 Ref: doc-arch_test1096748 Ref: doc-arma_rnd1097715 Ref: doc-autocor1098295 Ref: doc-autocov1098525 Ref: doc-autoreg_matrix1098752 Ref: doc-bartlett1099107 Ref: doc-blackman1099359 Ref: doc-diffpara1099593 Ref: doc-durbinlevinson1100329 Ref: doc-fftshift1100732 Ref: doc-ifftshift1101400 Ref: doc-fractdiff1101612 Ref: doc-hamming1101764 Ref: doc-hanning1101995 Ref: doc-hurst1102224 Ref: doc-pchip1102416 Ref: doc-periodogram1103616 Ref: doc-rectangle_lw1103732 Ref: doc-rectangle_sw1103858 Ref: doc-sinetone1103989 Ref: doc-sinewave1104283 Ref: doc-spectral_adf1104486 Ref: doc-spectral_xdf1104876 Ref: doc-spencer1105252 Ref: doc-stft1105365 Ref: doc-synthesis1106352 Ref: doc-triangle_lw1106617 Ref: doc-triangle_sw1106741 Ref: doc-yulewalker1106870 Node: Image Processing1107108 Node: Loading and Saving Images1107933 Ref: doc-imread1108614 Ref: doc-imwrite1109149 Ref: doc-IMAGE_PATH1109843 Ref: doc-imfinfo1110319 Node: Displaying Images1112659 Ref: doc-imshow1113288 Ref: doc-image1114489 Ref: doc-imagesc1115275 Ref: doc-image_viewer1116048 Node: Representing Images1117883 Ref: doc-gray2ind1119180 Ref: doc-ind2gray1119408 Ref: doc-rgb2ind1119742 Ref: doc-ind2rgb1119970 Ref: doc-colormap1120469 Ref: doc-brighten1121089 Ref: doc-autumn1121816 Ref: doc-bone1122090 Ref: doc-cool1122372 Ref: doc-copper1122630 Ref: doc-flag1122904 Ref: doc-gray1123186 Ref: doc-hot1123416 Ref: doc-hsv1123715 Ref: doc-jet1124219 Ref: doc-ocean1124527 Ref: doc-pink1124699 Ref: doc-prism1124984 Ref: doc-rainbow1125288 Ref: doc-spring1125588 Ref: doc-summer1125851 Ref: doc-white1126112 Ref: doc-winter1126373 Ref: doc-contrast1126632 Ref: doc-gmap401127291 Ref: doc-spinmap1127924 Node: Plotting on top of Images1128276 Node: Color Conversion1129347 Ref: doc-rgb2hsv1129581 Ref: doc-hsv2rgb1130086 Ref: doc-rgb2ntsc1130252 Ref: doc-ntsc2rgb1130389 Node: Audio Processing1130526 Ref: doc-lin2mu1131812 Ref: doc-mu2lin1132354 Ref: doc-loadaudio1132849 Ref: doc-saveaudio1133504 Ref: doc-playaudio1134441 Ref: doc-record1134802 Ref: doc-setaudio1135290 Ref: doc-wavread1135399 Ref: doc-wavwrite1136209 Node: Object Oriented Programming1136637 Node: Creating a Class1137499 Ref: doc-isobject1141117 Ref: doc-methods1141276 Ref: doc-ismethod1141569 Node: Manipulating Classes1141793 Ref: doc-display1142402 Ref: doc-saveobj1146344 Ref: doc-loadobj1147272 Node: Indexing Objects1147807 Ref: doc-subsref1148432 Ref: doc-subsasgn1150624 Ref: doc-subsindex1152522 Ref: doc-colon1153511 Node: Overloading Objects1153855 Node: Function Overloading1154136 Node: Operator Overloading1155736 Ref: tab:overload_ops1155928 Ref: doc-rdivide1155928 Ref: doc-plus1155928 Ref: doc-minus1155928 Ref: doc-uminus1155928 Ref: doc-uplus1155928 Ref: doc-times1155928 Ref: doc-mtimes1155928 Ref: doc-mrdivide1155928 Ref: doc-ldivide1155928 Ref: doc-mldivide1155928 Ref: doc-power1155928 Ref: doc-mpower1155928 Ref: doc-lt1155928 Ref: doc-le1155928 Ref: doc-gt1155928 Ref: doc-ge1155928 Ref: doc-eq1155928 Ref: doc-ne1155928 Ref: doc-and1155928 Ref: doc-or1155928 Ref: doc-not1155928 Ref: doc-ctranspose1155928 Ref: doc-transpose1155928 Node: Precedence of Objects1159565 Ref: doc-superiorto1160111 Ref: doc-inferiorto1160429 Node: Inheritance and Aggregation1162235 Node: System Utilities1169305 Node: Timing Utilities1170123 Ref: doc-time1171093 Ref: doc-now1171796 Ref: doc-ctime1172310 Ref: doc-gmtime1172668 Ref: doc-localtime1173632 Ref: doc-mktime1174598 Ref: doc-asctime1175224 Ref: doc-strftime1175526 Ref: doc-strptime1178731 Ref: doc-clock1179723 Ref: doc-date1180055 Ref: doc-etime1180218 Ref: doc-cputime1180692 Ref: doc-is_leap_year1181383 Ref: doc-toc1181635 Ref: doc-tic1181635 Ref: doc-pause1183055 Ref: doc-sleep1183497 Ref: doc-usleep1183618 Ref: doc-datenum1183924 Ref: doc-datestr1185531 Ref: doc-datevec1189736 Ref: doc-addtodate1190598 Ref: doc-calendar1190859 Ref: doc-weekday1191476 Ref: doc-eomday1192006 Ref: doc-datetick1192207 Node: Filesystem Utilities1192884 Ref: doc-rename1193242 Ref: doc-link1193535 Ref: doc-symlink1193847 Ref: doc-readlink1194177 Ref: doc-unlink1194564 Ref: doc-readdir1194789 Ref: doc-mkdir1195191 Ref: doc-rmdir1195625 Ref: doc-confirm_recursive_rmdir1196222 Ref: doc-mkfifo1196497 Ref: doc-umask1196758 Ref: doc-lstat1197079 Ref: doc-stat1197079 Ref: doc-fstat1199572 Ref: doc-fileattrib1199736 Ref: doc-isdir1200974 Ref: doc-glob1201043 Ref: doc-fnmatch1201556 Ref: doc-file_in_path1201871 Ref: doc-tilde_expand1202733 Ref: doc-canonicalize_file_name1203426 Ref: doc-movefile1203556 Ref: doc-copyfile1204041 Ref: doc-fileparts1204648 Ref: doc-filesep1204846 Ref: doc-filemarker1205357 Ref: doc-fullfile1206040 Ref: doc-tempdir1206225 Ref: doc-tempname1206330 Ref: doc-P_tmpdir1206418 Ref: doc-is_absolute_filename1206591 Ref: doc-is_rooted_relative_filename1206694 Ref: doc-make_absolute_filename1206810 Node: File Archiving Utilities1206935 Ref: doc-bunzip21207131 Ref: doc-gzip1207521 Ref: doc-gunzip1208086 Ref: doc-tar1208577 Ref: doc-untar1209098 Ref: doc-zip1209461 Ref: doc-unzip1209865 Ref: doc-pack1210228 Ref: doc-unpack1210361 Ref: doc-bzip21211076 Node: Networking Utilities1211620 Ref: doc-urlread1211812 Ref: doc-urlwrite1213067 Node: Controlling Subprocesses1214470 Ref: doc-system1215131 Ref: doc-unix1216525 Ref: doc-dos1217070 Ref: doc-perl1217642 Ref: doc-popen1217972 Ref: doc-pclose1218861 Ref: doc-popen21219010 Ref: doc-EXEC_PATH1220089 Ref: doc-fork1221038 Ref: doc-exec1221723 Ref: doc-pipe1222226 Ref: doc-dup21222547 Ref: doc-waitpid1222799 Ref: doc-WCONTINUE1224519 Ref: doc-WCOREDUMP1224874 Ref: doc-WEXITSTATUS1225548 Ref: doc-WIFCONTINUED1226052 Ref: doc-WIFSIGNALED1226515 Ref: doc-WIFSTOPPED1226969 Ref: doc-WIFEXITED1227555 Ref: doc-WNOHANG1227996 Ref: doc-WSTOPSIG1228343 Ref: doc-WTERMSIG1228878 Ref: doc-WUNTRACED1229426 Ref: doc-fcntl1229796 Ref: doc-kill1231132 Ref: doc-SIG1231715 Node: Process ID Information1231831 Ref: doc-getpgrp1232038 Ref: doc-getpid1232137 Ref: doc-getppid1232228 Ref: doc-geteuid1232319 Ref: doc-getuid1232419 Ref: doc-getegid1232512 Ref: doc-getgid1232613 Node: Environment Variables1232707 Ref: doc-getenv1232901 Ref: doc-putenv1233093 Node: Current Working Directory1233243 Ref: doc-cd1233450 Ref: doc-ls1233937 Ref: doc-ls_command1234539 Ref: doc-dir1234800 Ref: doc-pwd1235814 Node: Password Database Functions1235945 Ref: doc-getpwent1236605 Ref: doc-getpwuid1236826 Ref: doc-getpwnam1237058 Ref: doc-setpwent1237296 Ref: doc-endpwent1237414 Node: Group Database Functions1237485 Ref: doc-getgrent1238041 Ref: doc-getgrgid1238231 Ref: doc-getgrnam1238440 Ref: doc-setgrent1238654 Ref: doc-endgrent1238764 Node: System Information1238832 Ref: doc-computer1239013 Ref: doc-uname1239698 Ref: doc-ispc1240250 Ref: doc-isunix1240419 Ref: doc-ismac1240593 Ref: doc-isieee1240762 Ref: doc-OCTAVE_HOME1240905 Ref: doc-OCTAVE_VERSION1241014 Ref: doc-license1241112 Ref: doc-version1242261 Ref: doc-ver1242414 Ref: doc-octave_config_info1243260 Ref: doc-getrusage1243506 Node: Hashing Functions1244973 Ref: doc-md5sum1245934 Node: Packages1246166 Node: Installing and Removing Packages1246987 Ref: doc-pkg1249454 Node: Using Packages1255985 Node: Administrating Packages1256599 Node: Creating Packages1258080 Ref: doc-PKG_ADD1259193 Node: The DESCRIPTION File1261944 Node: The INDEX file1265936 Node: PKG_ADD and PKG_DEL directives1268209 Node: Dynamically Linked Functions1269336 Node: Oct-Files1271371 Node: Getting Started with Oct-Files1271997 Ref: doc-mkoctfile1272306 Node: Matrices and Arrays in Oct-Files1277853 Node: Character Strings in Oct-Files1284685 Node: Cell Arrays in Oct-Files1287136 Node: Structures in Oct-Files1288437 Node: Sparse Matrices in Oct-Files1290872 Node: Array and Sparse Differences1292318 Node: Creating Sparse Matrices in Oct-Files1295376 Node: Using Sparse Matrices in Oct-Files1302309 Node: Accessing Global Variables in Oct-Files1303256 Node: Calling Octave Functions from Oct-Files1304808 Node: Calling External Code from Oct-Files1307980 Node: Allocating Local Memory in Oct-Files1312230 Node: Input Parameter Checking in Oct-Files1312905 Node: Exception and Error Handling in Oct-Files1315594 Node: Documentation and Test of Oct-Files1319026 Node: Mex-Files1321269 Node: Getting Started with Mex-Files1322412 Ref: doc-mex1322894 Ref: doc-mexext1323120 Node: Working with Matrices and Arrays in Mex-Files1326307 Node: Character Strings in Mex-Files1330072 Node: Cell Arrays with Mex-Files1331807 Node: Structures with Mex-Files1333337 Node: Sparse Matrices with Mex-Files1336998 Node: Calling Other Functions in Mex-Files1342183 Node: Standalone Programs1343511 Node: Test and Demo Functions1346305 Node: Test Functions1346706 Ref: doc-test1346851 Ref: doc-assert1355360 Ref: doc-fail1356796 Node: Demonstration Functions1357529 Ref: doc-demo1357692 Ref: doc-rundemos1359753 Ref: doc-example1359795 Ref: doc-speed1360305 Node: Tips and Standards1365357 Node: Style Tips1366034 Node: Coding Tips1367785 Node: Comment Tips1369326 Node: Function Headers1370492 Node: Documentation Tips1374895 Node: Contributing Guidelines1384081 Node: How to Contribute1384451 Node: General Guidelines1387696 Node: Octave Sources (m-files)1390118 Node: C++ Sources1391617 Node: Other Sources1394481 Node: Trouble1396142 Node: Actual Bugs1396875 Node: Reporting Bugs1397697 Ref: doc-bug_report1398843 Node: Bug Criteria1399272 Node: Bug Lists1400497 Node: Bug Reporting1401511 Node: Sending Patches1406976 Node: Service1409801 Node: Installation1410520 Node: Installation Problems1420019 Node: Emacs Octave Support1427131 Node: Installing EOS1428356 Node: Using Octave Mode1429091 Node: Running Octave From Within Emacs1439973 Node: Using the Emacs Info Reader for Octave1444239 Node: Copying1445385 Node: Concept Index1482961 Node: Function Index1522023 Node: Operator Index1657116  End Tag Table qtoctave-0.10.1/qtoctave-info-reader/test/octave.info-20000644000175000017500000112660011511434230021712 0ustar lucaslucasThis is octave.info, produced by makeinfo version 4.11 from ./octave.texi. START-INFO-DIR-ENTRY * Octave: (octave). Interactive language for numerical computations. END-INFO-DIR-ENTRY Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2005, 2006, 2007 John W. Eaton. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.  File: octave.info, Node: Defining Functions, Next: Multiple Return Values, Up: Functions and Scripts 11.1 Defining Functions ======================= In its simplest form, the definition of a function named NAME looks like this: function NAME BODY endfunction A valid function name is like a valid variable name: a sequence of letters, digits and underscores, not starting with a digit. Functions share the same pool of names as variables. The function BODY consists of Octave statements. It is the most important part of the definition, because it says what the function should actually _do_. For example, here is a function that, when executed, will ring the bell on your terminal (assuming that it is possible to do so): function wakeup printf ("\a"); endfunction The `printf' statement (*note Input and Output::) simply tells Octave to print the string `"\a"'. The special character `\a' stands for the alert character (ASCII 7). *Note Strings::. Once this function is defined, you can ask Octave to evaluate it by typing the name of the function. Normally, you will want to pass some information to the functions you define. The syntax for passing parameters to a function in Octave is function NAME (ARG-LIST) BODY endfunction where ARG-LIST is a comma-separated list of the function's arguments. When the function is called, the argument names are used to hold the argument values given in the call. The list of arguments may be empty, in which case this form is equivalent to the one shown above. To print a message along with ringing the bell, you might modify the `wakeup' to look like this: function wakeup (message) printf ("\a%s\n", message); endfunction Calling this function using a statement like this wakeup ("Rise and shine!"); will cause Octave to ring your terminal's bell and print the message `Rise and shine!', followed by a newline character (the `\n' in the first argument to the `printf' statement). In most cases, you will also want to get some information back from the functions you define. Here is the syntax for writing a function that returns a single value: function RET-VAR = NAME (ARG-LIST) BODY endfunction The symbol RET-VAR is the name of the variable that will hold the value to be returned by the function. This variable must be defined before the end of the function body in order for the function to return a value. Variables used in the body of a function are local to the function. Variables named in ARG-LIST and RET-VAR are also local to the function. *Note Global Variables::, for information about how to access global variables inside a function. For example, here is a function that computes the average of the elements of a vector: function retval = avg (v) retval = sum (v) / length (v); endfunction If we had written `avg' like this instead, function retval = avg (v) if (isvector (v)) retval = sum (v) / length (v); endif endfunction and then called the function with a matrix instead of a vector as the argument, Octave would have printed an error message like this: error: value on right hand side of assignment is undefined because the body of the `if' statement was never executed, and `retval' was never defined. To prevent obscure errors like this, it is a good idea to always make sure that the return variables will always have values, and to produce meaningful error messages when problems are encountered. For example, `avg' could have been written like this: function retval = avg (v) retval = 0; if (isvector (v)) retval = sum (v) / length (v); else error ("avg: expecting vector argument"); endif endfunction There is still one additional problem with this function. What if it is called without an argument? Without additional error checking, Octave will probably print an error message that won't really help you track down the source of the error. To allow you to catch errors like this, Octave provides each function with an automatic variable called `nargin'. Each time a function is called, `nargin' is automatically initialized to the number of arguments that have actually been passed to the function. For example, we might rewrite the `avg' function like this: function retval = avg (v) retval = 0; if (nargin != 1) usage ("avg (vector)"); endif if (isvector (v)) retval = sum (v) / length (v); else error ("avg: expecting vector argument"); endif endfunction Although Octave does not automatically report an error if you call a function with more arguments than expected, doing so probably indicates that something is wrong. Octave also does not automatically report an error if a function is called with too few arguments, but any attempt to use a variable that has not been given a value will result in an error. To avoid such problems and to provide useful messages, we check for both possibilities and issue our own error message. -- Built-in Function: nargin () -- Built-in Function: nargin (FCN_NAME) Within a function, return the number of arguments passed to the function. At the top level, return the number of command line arguments passed to Octave. If called with the optional argument FCN_NAME, return the maximum number of arguments the named function can accept, or -1 if the function accepts a variable number of arguments. *See also:* *note nargout: doc-nargout, *note varargin: doc-varargin, *note varargout: doc-varargout. -- Function File: inputname (N) Return the text defining N-th input to the function. -- Built-in Function: VAL = silent_functions () -- Built-in Function: OLD_VAL = silent_functions (NEW_VAL) Query or set the internal variable that controls whether internal output from a function is suppressed. If this option is disabled, Octave will display the results produced by evaluating expressions within a function body that are not terminated with a semicolon.  File: octave.info, Node: Multiple Return Values, Next: Variable-length Argument Lists, Prev: Defining Functions, Up: Functions and Scripts 11.2 Multiple Return Values =========================== Unlike many other computer languages, Octave allows you to define functions that return more than one value. The syntax for defining functions that return multiple values is function [RET-LIST] = NAME (ARG-LIST) BODY endfunction where NAME, ARG-LIST, and BODY have the same meaning as before, and RET-LIST is a comma-separated list of variable names that will hold the values returned from the function. The list of return values must have at least one element. If RET-LIST has only one element, this form of the `function' statement is equivalent to the form described in the previous section. Here is an example of a function that returns two values, the maximum element of a vector and the index of its first occurrence in the vector. function [max, idx] = vmax (v) idx = 1; max = v (idx); for i = 2:length (v) if (v (i) > max) max = v (i); idx = i; endif endfor endfunction In this particular case, the two values could have been returned as elements of a single array, but that is not always possible or convenient. The values to be returned may not have compatible dimensions, and it is often desirable to give the individual return values distinct names. In addition to setting `nargin' each time a function is called, Octave also automatically initializes `nargout' to the number of values that are expected to be returned. This allows you to write functions that behave differently depending on the number of values that the user of the function has requested. The implicit assignment to the built-in variable `ans' does not figure in the count of output arguments, so the value of `nargout' may be zero. The `svd' and `lu' functions are examples of built-in functions that behave differently depending on the value of `nargout'. It is possible to write functions that only set some return values. For example, calling the function function [x, y, z] = f () x = 1; z = 2; endfunction as [a, b, c] = f () produces: a = 1 b = [](0x0) c = 2 along with a warning. -- Built-in Function: nargout () -- Built-in Function: nargout (FCN_NAME) Within a function, return the number of values the caller expects to receive. If called with the optional argument FCN_NAME, return the maximum number of values the named function can produce, or -1 if the function can produce a variable number of values. For example, f () will cause `nargout' to return 0 inside the function `f' and [s, t] = f () will cause `nargout' to return 2 inside the function `f'. At the top level, `nargout' is undefined. *See also:* *note nargin: doc-nargin, *note varargin: doc-varargin, *note varargout: doc-varargout. -- Function File: MSGSTR = nargchk (MINARGS, MAXARGS, NARGS) -- Function File: MSGSTR = nargchk (MINARGS, MAXARGS, NARGS, "string") -- Function File: MSGSTRUCT = nargchk (MINARGS, MAXARGS, NARGS, "struct") Return an appropriate error message string (or structure) if the number of inputs requested is invalid. This is useful for checking to see that the number of input arguments supplied to a function is within an acceptable range. *See also:* *note nargoutchk: doc-nargoutchk, *note error: doc-error, *note nargin: doc-nargin, *note nargout: doc-nargout. -- Function File: MSGSTR = nargoutchk (MINARGS, MAXARGS, NARGS) -- Function File: MSGSTR = nargoutchk (MINARGS, MAXARGS, NARGS, "string") -- Function File: MSGSTRUCT = nargoutchk (MINARGS, MAXARGS, NARGS, "struct") Return an appropriate error message string (or structure) if the number of outputs requested is invalid. This is useful for checking to see that the number of output arguments supplied to a function is within an acceptable range. *See also:* *note nargchk: doc-nargchk, *note error: doc-error, *note nargout: doc-nargout, *note nargin: doc-nargin.  File: octave.info, Node: Variable-length Argument Lists, Next: Variable-length Return Lists, Prev: Multiple Return Values, Up: Functions and Scripts 11.3 Variable-length Argument Lists =================================== Sometimes the number of input arguments is not known when the function is defined. As an example think of a function that returns the smallest of all its input arguments. For example, a = smallest (1, 2, 3); b = smallest (1, 2, 3, 4); In this example both `a' and `b' would be 1. One way to write the `smallest' function is function val = smallest (arg1, arg2, arg3, arg4, arg5) BODY endfunction and then use the value of `nargin' to determine which of the input arguments should be considered. The problem with this approach is that it can only handle a limited number of input arguments. If the special parameter name `varargin' appears at the end of a function parameter list it indicates that the function takes a variable number of input arguments. Using `varargin' the function looks like this function val = smallest (varargin) BODY endfunction In the function body the input arguments can be accessed through the variable `varargin'. This variable is a cell array containing all the input arguments. *Note Cell Arrays::, for details on working with cell arrays. The `smallest' function can now be defined like this function val = smallest (varargin) val = min ([varargin{:}]); endfunction This implementation handles any number of input arguments, but it's also a very simple solution to the problem. A slightly more complex example of `varargin' is a function `print_arguments' that prints all input arguments. Such a function can be defined like this function print_arguments (varargin) for i = 1:length (varargin) printf ("Input argument %d: ", i); disp (varargin{i}); endfor endfunction This function produces output like this print_arguments (1, "two", 3); -| Input argument 1: 1 -| Input argument 2: two -| Input argument 3: 3 -- Function File: [REG, PROP] = parseparams (PARAMS) Return in REG the cell elements of PARAM up to the first string element and in PROP all remaining elements beginning with the first string element. For example [reg, prop] = parseparams ({1, 2, "linewidth", 10}) reg = { [1,1] = 1 [1,2] = 2 } prop = { [1,1] = linewidth [1,2] = 10 } The parseparams function may be used to separate 'regular' arguments and additional arguments given as property/value pairs of the VARARGIN cell array. *See also:* *note varargin: doc-varargin.  File: octave.info, Node: Variable-length Return Lists, Next: Returning From a Function, Prev: Variable-length Argument Lists, Up: Functions and Scripts 11.4 Variable-length Return Lists ================================= It is possible to return a variable number of output arguments from a function using a syntax that's similar to the one used with the special `varargin' parameter name. To let a function return a variable number of output arguments the special output parameter name `varargout' is used. As with `varargin', `varargout' is a cell array that will contain the requested output arguments. As an example the following function sets the first output argument to 1, the second to 2, and so on. function varargout = one_to_n () for i = 1:nargout varargout{i} = i; endfor endfunction When called this function returns values like this [a, b, c] = one_to_n () => a = 1 => b = 2 => c = 3 If `varargin' (`varargout') does not appear as the last element of the input (output) parameter list, then it is not special, and is handled the same as any other parameter name. -- Function File: [R1, R2, ..., RN] = deal (A) -- Function File: [R1, R2, ..., RN] = deal (A1, A2, ..., AN) Copy the input parameters into the corresponding output parameters. If only one input parameter is supplied, its value is copied to each of the outputs. For example, [a, b, c] = deal (x, y, z); is equivalent to a = x; b = y; c = z; and [a, b, c] = deal (x); is equivalent to a = b = c = x;  File: octave.info, Node: Returning From a Function, Next: Default Arguments, Prev: Variable-length Return Lists, Up: Functions and Scripts 11.5 Returning From a Function ============================== The body of a user-defined function can contain a `return' statement. This statement returns control to the rest of the Octave program. It looks like this: return Unlike the `return' statement in C, Octave's `return' statement cannot be used to return a value from a function. Instead, you must assign values to the list of return variables that are part of the `function' statement. The `return' statement simply makes it easier to exit a function from a deeply nested loop or conditional statement. Here is an example of a function that checks to see if any elements of a vector are nonzero. function retval = any_nonzero (v) retval = 0; for i = 1:length (v) if (v (i) != 0) retval = 1; return; endif endfor printf ("no nonzero elements found\n"); endfunction Note that this function could not have been written using the `break' statement to exit the loop once a nonzero value is found without adding extra logic to avoid printing the message if the vector does contain a nonzero element. -- Keyword: return When Octave encounters the keyword `return' inside a function or script, it returns control to the caller immediately. At the top level, the return statement is ignored. A `return' statement is assumed at the end of every function definition.  File: octave.info, Node: Default Arguments, Next: Function Files, Prev: Returning From a Function, Up: Functions and Scripts 11.6 Default Arguments ====================== Since Octave supports variable number of input arguments, it is very useful to assign default values to some input arguments. When an input argument is declared in the argument list it is possible to assign a default value to the argument like this function NAME (ARG1 = VAL1, ...) BODY endfunction If no value is assigned to ARG1 by the user, it will have the value VAL1. As an example, the following function implements a variant of the classic "Hello, World" program. function hello (who = "World") printf ("Hello, %s!\n", who); endfunction When called without an input argument the function prints the following hello (); -| Hello, World! and when it's called with an input argument it prints the following hello ("Beautiful World of Free Software"); -| Hello, Beautiful World of Free Software! Sometimes it is useful to explicitly tell Octave to use the default value of an input argument. This can be done writing a `:' as the value of the input argument when calling the function. hello (:); -| Hello, World!  File: octave.info, Node: Function Files, Next: Script Files, Prev: Default Arguments, Up: Functions and Scripts 11.7 Function Files =================== Except for simple one-shot programs, it is not practical to have to define all the functions you need each time you need them. Instead, you will normally want to save them in a file so that you can easily edit them, and save them for use at a later time. Octave does not require you to load function definitions from files before using them. You simply need to put the function definitions in a place where Octave can find them. When Octave encounters an identifier that is undefined, it first looks for variables or functions that are already compiled and currently listed in its symbol table. If it fails to find a definition there, it searches a list of directories (the "path") for files ending in `.m' that have the same base name as the undefined identifier.(1) Once Octave finds a file with a name that matches, the contents of the file are read. If it defines a _single_ function, it is compiled and executed. *Note Script Files::, for more information about how you can define more than one function in a single file. When Octave defines a function from a function file, it saves the full name of the file it read and the time stamp on the file. If the time stamp on the file changes, Octave may reload the file. When Octave is running interactively, time stamp checking normally happens at most once each time Octave prints the prompt. Searching for new function definitions also occurs if the current working directory changes. Checking the time stamp allows you to edit the definition of a function while Octave is running, and automatically use the new function definition without having to restart your Octave session. To avoid degrading performance unnecessarily by checking the time stamps on functions that are not likely to change, Octave assumes that function files in the directory tree `OCTAVE-HOME/share/octave/VERSION/m' will not change, so it doesn't have to check their time stamps every time the functions defined in those files are used. This is normally a very good assumption and provides a significant improvement in performance for the function files that are distributed with Octave. If you know that your own function files will not change while you are running Octave, you can improve performance by calling `ignore_function_time_stamp ("all")', so that Octave will ignore the time stamps for all function files. Passing `"system"' to this function resets the default behavior. -- Command: edit NAME -- Command: edit FIELD VALUE -- Command: VALUE = edit get FIELD Edit the named function, or change editor settings. If `edit' is called with the name of a file or function as its argument it will be opened in a text editor. * If the function NAME is available in a file on your path and that file is modifiable, then it will be edited in place. If it is a system function, then it will first be copied to the directory `HOME' (see further down) and then edited. If no file is found, then the m-file variant, ending with ".m", will be considered. If still no file is found, then variants with a leading "@" and then with both a leading "@" and trailing ".m" will be considered. * If NAME is the name of a function defined in the interpreter but not in an m-file, then an m-file will be created in `HOME' to contain that function along with its current definition. * If `name.cc' is specified, then it will search for `name.cc' in the path and try to modify it, otherwise it will create a new `.cc' file in `HOME'. If NAME happens to be an m-file or interpreter defined function, then the text of that function will be inserted into the .cc file as a comment. * If NAME.EXT is on your path then it will be edited, otherwise the editor will be started with `HOME/name.ext' as the filename. If `name.ext' is not modifiable, it will be copied to `HOME' before editing. *WARNING!* You may need to clear name before the new definition is available. If you are editing a .cc file, you will need to mkoctfile `name.cc' before the definition will be available. If `edit' is called with FIELD and VALUE variables, the value of the control field FIELD will be VALUE. If an output argument is requested and the first argument is `get' then `edit' will return the value of the control field FIELD. If the control field does not exist, edit will return a structure containing all fields and values. Thus, `edit get all' returns a complete control structure. The following control fields are used: `editor' This is the editor to use to modify the functions. By default it uses Octave's `EDITOR' built-in function, which comes from `getenv("EDITOR")' and defaults to `emacs'. Use `%s' In place of the function name. For example, `[EDITOR, " %s"]' Use the editor which Octave uses for `bug_report'. `"xedit %s &"' pop up simple X11 editor in a separate window `"gnudoit -q \"(find-file \\\"%s\\\")\""' Send it to current Emacs; must have `(gnuserv-start)' in `.emacs'. See also field 'mode', which controls how the editor is run by Octave. On Cygwin, you will need to convert the Cygwin path to a Windows path if you are using a native Windows editor. For example '"C:/Program Files/Good Editor/Editor.exe" "$(cygpath -wa %s)"' `home' This is the location of user local m-files. Be be sure it is in your path. The default is `~/octave'. `author' This is the name to put after the "## Author:" field of new functions. By default it guesses from the `gecos' field of password database. `email' This is the e-mail address to list after the name in the author field. By default it guesses `<$LOGNAME@$HOSTNAME>', and if `$HOSTNAME' is not defined it uses `uname -n'. You probably want to override this. Be sure to use `' as your format. `license' `gpl' GNU General Public License (default). `bsd' BSD-style license without advertising clause. `pd' Public domain. `"text"' Your own default copyright and license. Unless you specify `pd', edit will prepend the copyright statement with "Copyright (C) yyyy Function Author". `mode' This value determines whether the editor should be started in async mode (editor is started in the background and Octave continues) or sync mode (Octave waits until the editor exits). Set it to "async" to start the editor in async mode. The default is "sync" (see also "system"). `editinplace' Determines whether files should be edited in place, without regard to whether they are modifiable or not. The default is `false'. -- Built-in Function: mfilename () -- Built-in Function: mfilename (`"fullpath"') -- Built-in Function: mfilename (`"fullpathext"') Return the name of the currently executing file. At the top-level, return the empty string. Given the argument `"fullpath"', include the directory part of the file name, but not the extension. Given the argument `"fullpathext"', include the directory part of the file name and the extension. -- Built-in Function: VAL = ignore_function_time_stamp () -- Built-in Function: OLD_VAL = ignore_function_time_stamp (NEW_VAL) Query or set the internal variable that controls whether Octave checks the time stamp on files each time it looks up functions defined in function files. If the internal variable is set to `"system"', Octave will not automatically recompile function files in subdirectories of `OCTAVE-HOME/lib/VERSION' if they have changed since they were last compiled, but will recompile other function files in the search path if they change. If set to `"all"', Octave will not recompile any function files unless their definitions are removed with `clear'. If set to "none", Octave will always check time stamps on files to determine whether functions defined in function files need to recompiled. * Menu: * Manipulating the load path:: * Subfunctions:: * Private Functions:: * Overloading and Autoloading:: * Function Locking:: * Function Precedence:: ---------- Footnotes ---------- (1) The `.m' suffix was chosen for compatibility with MATLAB.  File: octave.info, Node: Manipulating the load path, Next: Subfunctions, Up: Function Files 11.7.1 Manipulating the load path --------------------------------- When a function is called, Octave searches a list of directories for a file that contains the function declaration. This list of directories is known as the load path. By default the load path contains a list of directories distributed with Octave plus the current working directory. To see your current load path call the `path' function without any input or output arguments. It is possible to add or remove directories to or from the load path using `addpath' and `rmpath'. As an example, the following code adds `~/Octave' to the load path. addpath("~/Octave") After this the directory `~/Octave' will be searched for functions. -- Built-in Function: addpath (DIR1, ...) -- Built-in Function: addpath (DIR1, ..., OPTION) Add DIR1, ... to the current function search path. If OPTION is `"-begin"' or 0 (the default), prepend the directory name to the current path. If OPTION is `"-end"' or 1, append the directory name to the current path. Directories added to the path must exist. *See also:* *note path: doc-path, *note rmpath: doc-rmpath, *note genpath: doc-genpath, *note pathdef: doc-pathdef, *note savepath: doc-savepath, *note pathsep: doc-pathsep. -- Built-in Function: genpath (DIR) Return a path constructed from DIR and all its subdirectories. -- Built-in Function: rmpath (DIR1, ...) Remove DIR1, ... from the current function search path. *See also:* *note path: doc-path, *note addpath: doc-addpath, *note genpath: doc-genpath, *note pathdef: doc-pathdef, *note savepath: doc-savepath, *note pathsep: doc-pathsep. -- Function File: savepath (FILE) Save the portion of the current function search path, that is not set during Octave's initialization process, to FILE. If FILE is omitted, `~/.octaverc' is used. If successful, `savepath' returns 0. *See also:* *note path: doc-path, *note addpath: doc-addpath, *note rmpath: doc-rmpath, *note genpath: doc-genpath, *note pathdef: doc-pathdef, *note pathsep: doc-pathsep. -- Built-in Function: path (...) Modify or display Octave's load path. If NARGIN and NARGOUT are zero, display the elements of Octave's load path in an easy to read format. If NARGIN is zero and nargout is greater than zero, return the current load path. If NARGIN is greater than zero, concatenate the arguments, separating them with `pathsep()'. Set the internal search path to the result and return it. No checks are made for duplicate elements. *See also:* *note addpath: doc-addpath, *note rmpath: doc-rmpath, *note genpath: doc-genpath, *note pathdef: doc-pathdef, *note savepath: doc-savepath, *note pathsep: doc-pathsep. -- Function File: VAL = pathdef () Return the default path for Octave. The path information is extracted from one of three sources. In order of preference, those are; 1. `~/.octaverc' 2. `/...//m/startup/octaverc' 3. Octave's path prior to changes by any octaverc. *See also:* *note path: doc-path, *note addpath: doc-addpath, *note rmpath: doc-rmpath, *note genpath: doc-genpath, *note savepath: doc-savepath, *note pathsep: doc-pathsep. -- Built-in Function: VAL = pathsep () -- Built-in Function: OLD_VAL = pathsep (NEW_VAL) Query or set the character used to separate directories in a path. *See also:* *note filesep: doc-filesep, *note dir: doc-dir, *note ls: doc-ls. -- Built-in Function: rehash () Reinitialize Octave's load path directory cache. -- Built-in Function: file_in_loadpath (FILE) -- Built-in Function: file_in_loadpath (FILE, "all") Return the absolute name of FILE if it can be found in the list of directories specified by `path'. If no file is found, return an empty matrix. If the first argument is a cell array of strings, search each directory of the loadpath for element of the cell array and return the first that matches. If the second optional argument `"all"' is supplied, return a cell array containing the list of all files that have the same name in the path. If no files are found, return an empty cell array. *See also:* *note file_in_path: doc-file_in_path, *note path: doc-path. -- Built-in Function: restoredefaultpath (...) Restore Octave's path to it's initial state at startup. *See also:* *note path: doc-path, *note addpath: doc-addpath, *note rmpath: doc-rmpath, *note genpath: doc-genpath, *note pathdef: doc-pathdef, *note savepath: doc-savepath, *note pathsep: doc-pathsep. -- Built-in Function: command_line_path (...) Return the command line path variable. *See also:* *note path: doc-path, *note addpath: doc-addpath, *note rmpath: doc-rmpath, *note genpath: doc-genpath, *note pathdef: doc-pathdef, *note savepath: doc-savepath, *note pathsep: doc-pathsep. -- Built-in Function: find_dir_in_path (DIR) Return the full name of the path element matching DIR. The match is performed at the end of each path element. For example, if DIR is `"foo/bar"', it matches the path element `"/some/dir/foo/bar"', but not `"/some/dir/foo/bar/baz"' or `"/some/dir/allfoo/bar"'.  File: octave.info, Node: Subfunctions, Next: Private Functions, Prev: Manipulating the load path, Up: Function Files 11.7.2 Subfunctions ------------------- A function file may contain secondary functions called "subfunctions". These secondary functions are only visible to the other functions in the same function file. For example, a file `f.m' containing function f () printf ("in f, calling g\n"); g () endfunction function g () printf ("in g, calling h\n"); h () endfunction function h () printf ("in h\n") endfunction defines a main function `f' and two subfunctions. The subfunctions `g' and `h' may only be called from the main function `f' or from the other subfunctions, but not from outside the file `f.m'.  File: octave.info, Node: Private Functions, Next: Overloading and Autoloading, Prev: Subfunctions, Up: Function Files 11.7.3 Private Functions ------------------------ In many cases one function needs to access one or more helper functions. If the helper function is limited to the scope of a single function, then subfunctions as discussed above might be used. However, if a single helper function is used by more than one function, then this is no longer possible. In this case the helper functions might be placed in a subdirectory, called "private", of the directory in which the functions needing access to this helper function are found. As a simple example, consider a function `func1', that calls a helper function `func2' to do much of the work. For example function y = func1 (x) y = func2 (x); endfunction Then if the path to `func1' is `/func1.m', and if `func2' is found in the directory `/private/func2.m', then `func2' is only available for use of the functions, like `func1', that are found in `'.  File: octave.info, Node: Overloading and Autoloading, Next: Function Locking, Prev: Private Functions, Up: Function Files 11.7.4 Overloading and Autoloading ---------------------------------- The `dispatch' function can be used to alias one function name to another. It can be used to alias all calls to a particular function name to another function, or the alias can be limited to only a particular variable type. Consider the example function y = spsin (x) printf ("Calling spsin\n"); fflush(stdout); y = spfun ("sin", x); endfunction dispatch ("sin", "spsin", "sparse matrix"); y0 = sin(eye(3)); y1 = sin(speye(3)); which aliases the user-defined function `spsin' to `sin', but only for real sparse matrices. Note that the builtin `sin' already correctly treats sparse matrices and so this example is only illustrative. -- Loadable Function: dispatch (F, R, TYPE) Replace the function F with a dispatch so that function R is called when F is called with the first argument of the named TYPE. If the type is ANY then call R if no other type matches. The original function F is accessible using `builtin (F, ...)'. If R is omitted, clear dispatch function associated with TYPE. If both R and TYPE are omitted, list dispatch functions for F. *See also:* *note builtin: doc-builtin. -- Loadable Function: [...] builtin (F, ...) Call the base function F even if F is overloaded to some other function for the given type signature. *See also:* *note dispatch: doc-dispatch. A single dynamically linked file might define several functions. However, as Octave searches for functions based on the functions filename, Octave needs a manner in which to find each of the functions in the dynamically linked file. On operating systems that support symbolic links, it is possible to create a symbolic link to the original file for each of the functions which it contains. However, there is at least one well known operating system that doesn't support symbolic links. Making copies of the original file for each of the functions is undesirable as it increases the amount of disk space used by Octave. Instead Octave supplies the `autoload' function, that permits the user to define in which file a certain function will be found. -- Built-in Function: autoload (FUNCTION, FILE) Define FUNCTION to autoload from FILE. The second argument, FILE, should be an absolute file name or a file name in the same directory as the function or script from which the autoload command was run. FILE should not depend on the Octave load path. Normally, calls to `autoload' appear in PKG_ADD script files that are evaluated when a directory is added to the Octave's load path. To avoid having to hardcode directory names in FILE, if FILE is in the same directory as the PKG_ADD script then autoload ("foo", "bar.oct"); will load the function `foo' from the file `bar.oct'. The above when `bar.oct' is not in the same directory or uses like autoload ("foo", file_in_loadpath ("bar.oct")) are strongly discouraged, as their behavior might be unpredictable. With no arguments, return a structure containing the current autoload map. *See also:* *note PKG_ADD: doc-PKG_ADD.  File: octave.info, Node: Function Locking, Next: Function Precedence, Prev: Overloading and Autoloading, Up: Function Files 11.7.5 Function Locking ----------------------- It is sometime desirable to lock a function into memory with the `mlock' function. This is typically used for dynamically linked functions in Oct-files or mex-files that contain some initialization, and it is desirable that calling `clear' does not remove this initialization. As an example, mlock ("my_function"); prevents `my_function' from being removed from memory, even if `clear' is called. It is possible to determine if a function is locked into memory with the `mislocked', and to unlock a function with `munlock', which the following illustrates. mlock ("my_function"); mislocked ("my_function") => ans = 1 munlock ("my_function"); mislocked ("my_function") => ans = 0 A common use of `mlock' is to prevent persistent variables from being removed from memory, as the following example shows: function count_calls() persistent calls = 0; printf ("'count_calls' has been called %d times\n", ++calls); endfunction mlock ("count_calls"); count_calls (); -| 'count_calls' has been called 1 times clear count_calls count_calls (); -| 'count_calls' has been called 2 times It is, however, often inconvenient to lock a function from the prompt, so it is also possible to lock a function from within its body. This is simply done by calling `mlock' from within the function. function count_calls () mlock (); persistent calls = 0; printf ("'count_calls' has been called %d times\n", ++calls); endfunction `mlock' might equally be used to prevent changes to a function from having effect in Octave, though a similar effect can be had with the `ignore_function_time_stamp' function. -- Built-in Function: mlock () Lock the current function into memory so that it can't be cleared. *See also:* *note munlock: doc-munlock, *note mislocked: doc-mislocked, *note persistent: doc-persistent. -- Built-in Function: munlock (FCN) Unlock the named function. If no function is named then unlock the current function. *See also:* *note mlock: doc-mlock, *note mislocked: doc-mislocked, *note persistent: doc-persistent. -- Built-in Function: mislocked (FCN) Return true if the named function is locked. If no function is named then return true if the current function is locked. *See also:* *note mlock: doc-mlock, *note munlock: doc-munlock, *note persistent: doc-persistent.  File: octave.info, Node: Function Precedence, Prev: Function Locking, Up: Function Files 11.7.6 Function Precedence -------------------------- Given the numerous different ways that Octave can define a function, it is possible and even likely that multiple versions of a function, might be defined within a particular scope. The precedence of which function will be used within a particular scope is given by 1. Subfunction A subfunction with the required function name in the given scope. 2. Private function A function defined within a private directory of the directory which contains the current function. 3. Class constructor A function that constuctors a user class as defined in chapter *note Object Oriented Programming::. 4. Class method An overloaded function of a class as in chapter *note Object Oriented Programming::. 5. Legacy Dispatch An overloaded function as defined by *Note doc-dispatch::. 6. Command-line Function A function that has been defined on the command-line. 7. Autoload function A function that is marked as autoloaded with *Note doc-autoload::. 8. A Function on the Path A function that can be found on the users load-path. There can also be Oct-file, mex-file or m-file versions of this function and the precedence between these versions are in that order. 9. Built-in function A function that is builtin to Octave itself such as `numel', `size', etc.  File: octave.info, Node: Script Files, Next: Function Handles Inline Functions and Anonymous Functions, Prev: Function Files, Up: Functions and Scripts 11.8 Script Files ================= A script file is a file containing (almost) any sequence of Octave commands. It is read and evaluated just as if you had typed each command at the Octave prompt, and provides a convenient way to perform a sequence of commands that do not logically belong inside a function. Unlike a function file, a script file must _not_ begin with the keyword `function'. If it does, Octave will assume that it is a function file, and that it defines a single function that should be evaluated as soon as it is defined. A script file also differs from a function file in that the variables named in a script file are not local variables, but are in the same scope as the other variables that are visible on the command line. Even though a script file may not begin with the `function' keyword, it is possible to define more than one function in a single script file and load (but not execute) all of them at once. To do this, the first token in the file (ignoring comments and other white space) must be something other than `function'. If you have no other statements to evaluate, you can use a statement that has no effect, like this: # Prevent Octave from thinking that this # is a function file: 1; # Define function one: function one () ... To have Octave read and compile these functions into an internal form, you need to make sure that the file is in Octave's load path (accessible through the `path' function), then simply type the base name of the file that contains the commands. (Octave uses the same rules to search for script files as it does to search for function files.) If the first token in a file (ignoring comments) is `function', Octave will compile the function and try to execute it, printing a message warning about any non-whitespace characters that appear after the function definition. Note that Octave does not try to look up the definition of any identifier until it needs to evaluate it. This means that Octave will compile the following statements if they appear in a script file, or are typed at the command line, # not a function file: 1; function foo () do_something (); endfunction function do_something () do_something_else (); endfunction even though the function `do_something' is not defined before it is referenced in the function `foo'. This is not an error because Octave does not need to resolve all symbols that are referenced by a function until the function is actually evaluated. Since Octave doesn't look for definitions until they are needed, the following code will always print `bar = 3' whether it is typed directly on the command line, read from a script file, or is part of a function body, even if there is a function or script file called `bar.m' in Octave's path. eval ("bar = 3"); bar Code like this appearing within a function body could fool Octave if definitions were resolved as the function was being compiled. It would be virtually impossible to make Octave clever enough to evaluate this code in a consistent fashion. The parser would have to be able to perform the call to `eval' at compile time, and that would be impossible unless all the references in the string to be evaluated could also be resolved, and requiring that would be too restrictive (the string might come from user input, or depend on things that are not known until the function is evaluated). Although Octave normally executes commands from script files that have the name `FILE.m', you can use the function `source' to execute commands from any file. -- Built-in Function: source (FILE) Parse and execute the contents of FILE. This is equivalent to executing commands from a script file, but without requiring the file to be named `FILE.m'.  File: octave.info, Node: Function Handles Inline Functions and Anonymous Functions, Next: Commands, Prev: Script Files, Up: Functions and Scripts 11.9 Function Handles, Inline Functions, and Anonymous Functions ================================================================ It can be very convenient store a function in a variable so that it can be passed to a different function. For example, a function that performs numerical minimization needs access to the function that should be minimized. * Menu: * Function Handles:: * Anonymous Functions:: * Inline Functions::  File: octave.info, Node: Function Handles, Next: Anonymous Functions, Up: Function Handles Inline Functions and Anonymous Functions 11.9.1 Function Handles ----------------------- A function handle is a pointer to another function and is defined with the syntax @FUNCTION-NAME For example f = @sin; Creates a function handle called `f' that refers to the function `sin'. Function handles are used to call other functions indirectly, or to pass a function as an argument to another function like `quad' or `fsolve'. For example f = @sin; quad (f, 0, pi) => 2 You may use `feval' to call a function using function handle, or simply write the name of the function handle followed by an argument list. If there are no arguments, you must use an empty argument list `()'. For example f = @sin; feval (f, pi/4) => 0.70711 f (pi/4) => 0.70711 -- Built-in Function: functions (FCN_HANDLE) Return a struct containing information about the function handle FCN_HANDLE. -- Built-in Function: func2str (FCN_HANDLE) Return a string containing the name of the function referenced by the function handle FCN_HANDLE. -- Built-in Function: str2func (FCN_NAME) Return a function handle constructed from the string FCN_NAME.  File: octave.info, Node: Anonymous Functions, Next: Inline Functions, Prev: Function Handles, Up: Function Handles Inline Functions and Anonymous Functions 11.9.2 Anonymous Functions -------------------------- Anonymous functions are defined using the syntax @(ARGUMENT-LIST) EXPRESSION Any variables that are not found in the argument list are inherited from the enclosing scope. Anonymous functions are useful for creating simple unnamed functions from expressions or for wrapping calls to other functions to adapt them for use by functions like `quad'. For example, f = @(x) x.^2; quad (f, 0, 10) => 333.33 creates a simple unnamed function from the expression `x.^2' and passes it to `quad', quad (@(x) sin (x), 0, pi) => 2 wraps another function, and a = 1; b = 2; quad (@(x) betainc (x, a, b), 0, 0.4) => 0.13867 adapts a function with several parameters to the form required by `quad'. In this example, the values of A and B that are passed to `betainc' are inherited from the current environment.  File: octave.info, Node: Inline Functions, Prev: Anonymous Functions, Up: Function Handles Inline Functions and Anonymous Functions 11.9.3 Inline Functions ----------------------- An inline function is created from a string containing the function body using the `inline' function. The following code defines the function f(x) = x^2 + 2. f = inline("x^2 + 2"); After this it is possible to evaluate f at any x by writing `f(x)'. -- Built-in Function: inline (STR) -- Built-in Function: inline (STR, ARG1, ...) -- Built-in Function: inline (STR, N) Create an inline function from the character string STR. If called with a single argument, the arguments of the generated function are extracted from the function itself. The generated function arguments will then be in alphabetical order. It should be noted that i, and j are ignored as arguments due to the ambiguity between their use as a variable or their use as an inbuilt constant. All arguments followed by a parenthesis are considered to be functions. If the second and subsequent arguments are character strings, they are the names of the arguments of the function. If the second argument is an integer N, the arguments are `"x"', `"P1"', ..., `"PN"'. *See also:* *note argnames: doc-argnames, *note formula: doc-formula, *note vectorize: doc-vectorize. -- Built-in Function: argnames (FUN) Return a cell array of character strings containing the names of the arguments of the inline function FUN. *See also:* *note inline: doc-inline, *note formula: doc-formula, *note vectorize: doc-vectorize. -- Built-in Function: formula (FUN) Return a character string representing the inline function FUN. Note that `char (FUN)' is equivalent to `formula (FUN)'. *See also:* *note argnames: doc-argnames, *note inline: doc-inline, *note vectorize: doc-vectorize. -- Built-in Function: vectorize (FUN) Create a vectorized version of the inline function FUN by replacing all occurrences of `*', `/', etc., with `.*', `./', etc. -- Function File: symvar (S) Identifies the argument names in the function defined by a string. Common constant names such as `pi', `NaN', `Inf', `eps', `i' or `j' are ignored. The arguments that are found are returned in a cell array of strings. If no variables are found then the returned cell array is empty.  File: octave.info, Node: Commands, Next: Organization of Functions, Prev: Function Handles Inline Functions and Anonymous Functions, Up: Functions and Scripts 11.10 Commands ============== Commands are a special class of functions that only accept string input arguments. A command can be called as an ordinary function, but it can also be called without the parentheses like the following example shows my_command hello world which is the same as my_command("hello", "world") The general form of a command call is NAME ARG1 ARG2 ... which translates directly to NAME ("ARG1", "ARG2", ...) A function can be used as a command if it accepts string input arguments. To do this, the function must be marked as a command, which can be done with the `mark_as_command' command like this mark_as_command name where `name' is the function to be marked as a command. One difficulty of commands occurs when one of the string input arguments are stored in a variable. Since Octave can't tell the difference between a variable name, and an ordinary string, it is not possible to pass a variable as input to a command. In such a situation a command must be called as a function. -- Built-in Function: mark_as_command (NAME) This function is obsolete and will be removed from a future version of Octave. -- Built-in Function: unmark_command (NAME) This function is obsolete and will be removed from a future version of Octave. -- Built-in Function: iscommand (NAME) This function is obsolete and will be removed from a future version of Octave. -- Built-in Function: mark_as_rawcommand (NAME) This function is obsolete and will be removed from a future version of Octave. -- Built-in Function: unmark_rawcommand (NAME) This function is obsolete and will be removed from a future version of Octave. -- Built-in Function: israwcommand (NAME) This function is obsolete and will be removed from a future version of Octave.  File: octave.info, Node: Organization of Functions, Prev: Commands, Up: Functions and Scripts 11.11 Organization of Functions Distributed with Octave ======================================================= Many of Octave's standard functions are distributed as function files. They are loosely organized by topic, in subdirectories of `OCTAVE-HOME/lib/octave/VERSION/m', to make it easier to find them. The following is a list of all the function file subdirectories, and the types of functions you will find there. `audio' Functions for playing and recording sounds. `control' Functions for design and simulation of automatic control systems. `elfun' Elementary functions. `finance' Functions for computing interest payments, investment values, and rates of return. `general' Miscellaneous matrix manipulations, like `flipud', `rot90', and `triu', as well as other basic functions, like `ismatrix', `nargchk', etc. `image' Image processing tools. These functions require the X Window System. `io' Input-output functions. `linear-algebra' Functions for linear algebra. `miscellaneous' Functions that don't really belong anywhere else. `optimization' Minimization of functions. `path' Functions to manage the directory path Octave uses to find functions. `pkg' Install external packages of functions in Octave. `plot' Functions for displaying and printing two- and three-dimensional graphs. `polynomial' Functions for manipulating polynomials. `set' Functions for creating and manipulating sets of unique values. `signal' Functions for signal processing applications. `sparse' Functions for handling sparse matrices. `specfun' Special functions. `special-matrix' Functions that create special matrix forms. `startup' Octave's system-wide startup file. `statistics' Statistical functions. `strings' Miscellaneous string-handling functions. `testfun' Perform unit tests on other functions. `time' Functions related to time keeping.  File: octave.info, Node: Errors and Warnings, Next: Debugging, Prev: Functions and Scripts, Up: Top 12 Errors and Warnings ********************** Octave includes several functions for printing error and warning messages. When you write functions that need to take special action when they encounter abnormal conditions, you should print the error messages using the functions described in this chapter. Since many of Octave's functions use these functions, it is also useful to understand them, so that errors and warnings can be handled. * Menu: * Handling Errors:: * Handling Warnings::  File: octave.info, Node: Handling Errors, Next: Handling Warnings, Up: Errors and Warnings 12.1 Handling Errors ==================== An error is something that occurs when a program is in a state where it doesn't make sense to continue. An example is when a function is called with too few input arguments. In this situation the function should abort with an error message informing the user of the lacking input arguments. Since an error can occur during the evaluation of a program, it is very convenient to be able to detect that an error occurred, so that the error can be fixed. This is possible with the `try' statement described in *note The `try' Statement::. * Menu: * Raising Errors:: * Catching Errors::  File: octave.info, Node: Raising Errors, Next: Catching Errors, Up: Handling Errors 12.1.1 Raising Errors --------------------- The most common use of errors is for checking input arguments to functions. The following example calls the `error' function if the function `f' is called without any input arguments. function f (arg1) if (nargin == 0) error("not enough input arguments"); endif endfunction When the `error' function is called, it prints the given message and returns to the Octave prompt. This means that no code following a call to `error' will be executed. -- Built-in Function: error (TEMPLATE, ...) -- Built-in Function: error (ID, TEMPLATE, ...) Format the optional arguments under the control of the template string TEMPLATE using the same rules as the `printf' family of functions (*note Formatted Output::) and print the resulting message on the `stderr' stream. The message is prefixed by the character string `error: '. Calling `error' also sets Octave's internal error state such that control will return to the top level without evaluating any more commands. This is useful for aborting from functions or scripts. If the error message does not end with a new line character, Octave will print a traceback of all the function calls leading to the error. For example, given the following function definitions: function f () g (); end function g () h (); end function h () nargin == 1 || error ("nargin != 1"); end calling the function `f' will result in a list of messages that can help you to quickly locate the exact location of the error: f () error: nargin != 1 error: called from: error: error at line -1, column -1 error: h at line 1, column 27 error: g at line 1, column 15 error: f at line 1, column 15 If the error message ends in a new line character, Octave will print the message but will not display any traceback messages as it returns control to the top level. For example, modifying the error message in the previous example to end in a new line causes Octave to only print a single message: function h () nargin == 1 || error ("nargin != 1\n"); end f () error: nargin != 1 Since it is common to use errors when there is something wrong with the input to a function, Octave supports functions to simplify such code. When the `print_usage' function is called, it reads the help text of the function calling `print_usage', and presents a useful error. If the help text is written in Texinfo it is possible to present an error message that only contains the function prototypes as described by the `@deftypefn' parts of the help text. When the help text isn't written in Texinfo, the error message contains the entire help message. Consider the following function. ## -*- texinfo -*- ## @deftypefn {Function File} f (@var{arg1}) ## Function help text goes here... ## @end deftypefn function f (arg1) if (nargin == 0) print_usage (); endif endfunction When it is called with no input arguments it produces the following error. f () -| error: Invalid call to f. Correct usage is: -| -| -- Function File: f (ARG1) -| -| -| Additional help for built-in functions and operators is -| available in the on-line version of the manual. Use the command -| `doc ' to search the manual index. -| -| Help and information about Octave is also available on the WWW -| at http://www.octave.org and via the help@octave.org -| mailing list. -- Function File: print_usage () -- Function File: print_usage (NAME) Print the usage message for a function. When called with no input arguments the `print_usage' function displays the usage message of the currently executing function. *See also:* *note help: doc-help. -- Built-in Function: usage (MSG) Print the message MSG, prefixed by the string `usage: ', and set Octave's internal error state such that control will return to the top level without evaluating any more commands. This is useful for aborting from functions. After `usage' is evaluated, Octave will print a traceback of all the function calls leading to the usage message. You should use this function for reporting problems errors that result from an improper call to a function, such as calling a function with an incorrect number of arguments, or with arguments of the wrong type. For example, most functions distributed with Octave begin with code like this if (nargin != 2) usage ("foo (a, b)"); endif to check for the proper number of arguments. -- Function File: beep () Produce a beep from the speaker (or visual bell). *See also:* *note puts: doc-puts, *note fputs: doc-fputs, *note printf: doc-printf, *note fprintf: doc-fprintf. -- Built-in Function: VAL = beep_on_error () -- Built-in Function: OLD_VAL = beep_on_error (NEW_VAL) Query or set the internal variable that controls whether Octave will try to ring the terminal bell before printing an error message.  File: octave.info, Node: Catching Errors, Prev: Raising Errors, Up: Handling Errors 12.1.2 Catching Errors ---------------------- When an error occurs, it can be detected and handled using the `try' statement as described in *note The `try' Statement::. As an example, the following piece of code counts the number of errors that occurs during a `for' loop. number_of_errors = 0; for n = 1:100 try ... catch number_of_errors++; end_try_catch endfor The above example treats all errors the same. In many situations it can however be necessary to discriminate between errors, and take different actions depending on the error. The `lasterror' function returns a structure containing information about the last error that occurred. As an example, the code above could be changed to count the number of errors related to the `*' operator. number_of_errors = 0; for n = 1:100 try ... catch msg = lasterror.message; if (strfind (msg, "operator *")) number_of_errors++; endif end_try_catch endfor -- Built-in Function: ERR = lasterror (ERR) -- Built-in Function: lasterror ('reset') Returns or sets the last error message. Called without any arguments returns a structure containing the last error message, as well as other information related to this error. The elements of this structure are: 'message' The text of the last error message 'identifier' The message identifier of this error message 'stack' A structure containing information on where the message occurred. This might be an empty structure if this in the case where this information cannot be obtained. The fields of this structure are: 'file' The name of the file where the error occurred 'name' The name of function in which the error occurred 'line' The line number at which the error occurred 'column' An optional field with the column number at which the error occurred The ERR structure may also be passed to `lasterror' to set the information about the last error. The only constraint on ERR in that case is that it is a scalar structure. Any fields of ERR that match the above are set to the value passed in ERR, while other fields are set to their default values. If `lasterror' is called with the argument 'reset', all values take their default values. -- Built-in Function: [MSG, MSGID] = lasterr (MSG, MSGID) Without any arguments, return the last error message. With one argument, set the last error message to MSG. With two arguments, also set the last message identifier. When an error has been handled it is possible to raise it again. This can be useful when an error needs to be detected, but the program should still abort. This is possible using the `rethrow' function. The previous example can now be changed to count the number of errors related to the `*' operator, but still abort if another kind of error occurs. number_of_errors = 0; for n = 1:100 try ... catch msg = lasterror.message; if (strfind (msg, "operator *")) number_of_errors++; else rethrow (lasterror); endif end_try_catch endfor -- Built-in Function: rethrow (ERR) Reissues a previous error as defined by ERR. ERR is a structure that must contain at least the 'message' and 'identifier' fields. ERR can also contain a field 'stack' that gives information on the assumed location of the error. Typically ERR is returned from `lasterror'. *See also:* *note lasterror: doc-lasterror, *note lasterr: doc-lasterr, *note error: doc-error. -- Built-in Function: ERR = errno () -- Built-in Function: ERR = errno (VAL) -- Built-in Function: ERR = errno (NAME) Return the current value of the system-dependent variable errno, set its value to VAL and return the previous value, or return the named error code given NAME as a character string, or -1 if NAME is not found. -- Built-in Function: errno_list () Return a structure containing the system-dependent errno values.  File: octave.info, Node: Handling Warnings, Prev: Handling Errors, Up: Errors and Warnings 12.2 Handling Warnings ====================== Like an error, a warning is issued when something unexpected happens. Unlike an error, a warning doesn't abort the currently running program. A simple example of a warning is when a number is divided by zero. In this case Octave will issue a warning and assign the value `Inf' to the result. a = 1/0 -| warning: division by zero => a = Inf * Menu: * Issuing Warnings:: * Enabling and Disabling Warnings::  File: octave.info, Node: Issuing Warnings, Next: Enabling and Disabling Warnings, Up: Handling Warnings 12.2.1 Issuing Warnings ----------------------- It is possible to issue warnings from any code using the `warning' function. In its most simple form, the `warning' function takes a string describing the warning as its input argument. As an example, the following code controls if the variable `a' is non-negative, and if not issues a warning and sets `a' to zero. a = -1; if (a < 0) warning ("'a' must be non-negative. Setting 'a' to zero."); a = 0; endif -| 'a' must be non-negative. Setting 'a' to zero. Since warnings aren't fatal to a running program, it is not possible to catch a warning using the `try' statement or something similar. It is however possible to access the last warning as a string using the `lastwarn' function. It is also possible to assign an identification string to a warning. If a warning has such an ID the user can enable and disable this warning as will be described in the next section. To assign an ID to a warning, simply call `warning' with two string arguments, where the first is the identification string, and the second is the actual warning. -- Built-in Function: warning (TEMPLATE, ...) -- Built-in Function: warning (ID, TEMPLATE, ...) Format the optional arguments under the control of the template string TEMPLATE using the same rules as the `printf' family of functions (*note Formatted Output::) and print the resulting message on the `stderr' stream. The message is prefixed by the character string `warning: '. You should use this function when you want to notify the user of an unusual condition, but only when it makes sense for your program to go on. The optional message identifier allows users to enable or disable warnings tagged by ID. The special identifier `"all"' may be used to set the state of all warnings. -- Built-in Function: warning ("on", ID) -- Built-in Function: warning ("off", ID) -- Built-in Function: warning ("error", ID) -- Built-in Function: warning ("query", ID) Set or query the state of a particular warning using the identifier ID. If the identifier is omitted, a value of `"all"' is assumed. If you set the state of a warning to `"error"', the warning named by ID is handled as if it were an error instead. *See also:* *note warning_ids: doc-warning_ids. -- Built-in Function: [MSG, MSGID] = lastwarn (MSG, MSGID) Without any arguments, return the last warning message. With one argument, set the last warning message to MSG. With two arguments, also set the last message identifier.  File: octave.info, Node: Enabling and Disabling Warnings, Prev: Issuing Warnings, Up: Handling Warnings 12.2.2 Enabling and Disabling Warnings -------------------------------------- The `warning' function also allows you to control which warnings are actually printed to the screen. If the `warning' function is called with a string argument that is either `"on"' or `"off"' all warnings will be enabled or disabled. It is also possible to enable and disable individual warnings through their string identifications. The following code will issue a warning warning ("non-negative-variable", "'a' must be non-negative. Setting 'a' to zero."); while the following won't issue a warning warning ("off", "non-negative-variable"); warning ("non-negative-variable", "'a' must be non-negative. Setting 'a' to zero."); The functions distributed with Octave can issue one of the following warnings. `Octave:array-to-scalar' If the `Octave:array-to-scalar' warning is enabled, Octave will warn when an implicit conversion from an array to a scalar value is attempted. By default, the `Octave:array-to-scalar' warning is disabled. `Octave:array-to-vector' If the `Octave:array-to-vector' warning is enabled, Octave will warn when an implicit conversion from an array to a vector value is attempted. By default, the `Octave:array-to-vector' warning is disabled. `Octave:assign-as-truth-value' If the `Octave:assign-as-truth-value' warning is enabled, a warning is issued for statements like if (s = t) ... since such statements are not common, and it is likely that the intent was to write if (s == t) ... instead. There are times when it is useful to write code that contains assignments within the condition of a `while' or `if' statement. For example, statements like while (c = getc()) ... are common in C programming. It is possible to avoid all warnings about such statements by disabling the `Octave:assign-as-truth-value' warning, but that may also let real errors like if (x = 1) # intended to test (x == 1)! ... slip by. In such cases, it is possible suppress errors for specific statements by writing them with an extra set of parentheses. For example, writing the previous example as while ((c = getc())) ... will prevent the warning from being printed for this statement, while allowing Octave to warn about other assignments used in conditional contexts. By default, the `Octave:assign-as-truth-value' warning is enabled. `Octave:associativity-change' If the `Octave:associativity-change' warning is enabled, Octave will warn about possible changes in the meaning of some code due to changes in associativity for some operators. Associativity changes have typically been made for MATLAB compatibility. By default, the `Octave:associativity-change' warning is enabled. `Octave:divide-by-zero' If the `Octave:divide-by-zero' warning is enabled, a warning is issued when Octave encounters a division by zero. By default, the `Octave:divide-by-zero' warning is enabled. `Octave:empty-list-elements' If the `Octave:empty-list-elements' warning is enabled, a warning is issued when an empty matrix is found in a matrix list. For example, a = [1, [], 3, [], 5] By default, the `Octave:empty-list-elements' warning is enabled. `Octave:fortran-indexing' If the `Octave:fortran-indexing' warning is enabled, a warning is printed for expressions which select elements of a two-dimensional matrix using a single index. By default, the `Octave:fortran-indexing' warning is disabled. `Octave:function-name-clash' If the `Octave:function-name-clash' warning is enabled, a warning is issued when Octave finds that the name of a function defined in a function file differs from the name of the file. (If the names disagree, the name declared inside the file is ignored.) By default, the `Octave:function-name-clash' warning is enabled. `Octave:future-time-stamp' If the `Octave:future-time-stamp' warning is enabled, Octave will print a warning if it finds a function file with a time stamp that is in the future. By default, the `Octave:future-time-stamp' warning is enabled. `Octave:imag-to-real' If the `Octave:imag-to-real' warning is enabled, a warning is printed for implicit conversions of complex numbers to real numbers. By default, the `Octave:imag-to-real' warning is disabled. `Octave:matlab-incompatible' Print warnings for Octave language features that may cause compatibility problems with MATLAB. `Octave:missing-semicolon' If the `Octave:missing-semicolon' warning is enabled, Octave will warn when statements in function definitions don't end in semicolons. By default the `Octave:missing-semicolon' warning is disabled. `Octave:neg-dim-as-zero' If the `Octave:neg-dim-as-zero' warning is enabled, print a warning for expressions like eye (-1) By default, the `Octave:neg-dim-as-zero' warning is disabled. `Octave:num-to-str' If the `Octave:num-to-str' warning is enable, a warning is printed for implicit conversions of numbers to their ASCII character equivalents when strings are constructed using a mixture of strings and numbers in matrix notation. For example, [ "f", 111, 111 ] => "foo" elicits a warning if the `Octave:num-to-str' warning is enabled. By default, the `Octave:num-to-str' warning is enabled. `Octave:precedence-change' If the `Octave:precedence-change' warning is enabled, Octave will warn about possible changes in the meaning of some code due to changes in precedence for some operators. Precedence changes have typically been made for MATLAB compatibility. By default, the `Octave:precedence-change' warning is enabled. `Octave:reload-forces-clear' If several functions have been loaded from the same file, Octave must clear all the functions before any one of them can be reloaded. If the `Octave:reload-forces-clear' warning is enabled, Octave will warn you when this happens, and print a list of the additional functions that it is forced to clear. By default, the `Octave:reload-forces-clear' warning is enabled. `Octave:resize-on-range-error' If the `Octave:resize-on-range-error' warning is enabled, print a warning when a matrix is resized by an indexed assignment with indices outside the current bounds. By default, the `Octave:resize-on-range-error' warning is disabled. `Octave:separator-insert' Print warning if commas or semicolons might be inserted automatically in literal matrices. `Octave:single-quote-string' Print warning if a single quote character is used to introduce a string constant. `Octave:str-to-num' If the `Octave:str-to-num' warning is enabled, a warning is printed for implicit conversions of strings to their numeric ASCII equivalents. For example, "abc" + 0 => 97 98 99 elicits a warning if the `Octave:str-to-num' warning is enabled. By default, the `Octave:str-to-num' warning is disabled. `Octave:string-concat' If the `Octave:string-concat' warning is enabled, print a warning when concatenating a mixture of double and single quoted strings. By default, the `Octave:string-concat' warning is disabled. `Octave:undefined-return-values' If the `Octave:undefined-return-values' warning is disabled, print a warning if a function does not define all the values in the return list which are expected. By default, the `Octave:undefined-return-values' warning is enabled. `Octave:variable-switch-label' If the `Octave:variable-switch-label' warning is enabled, Octave will print a warning if a switch label is not a constant or constant expression. By default, the `Octave:variable-switch-label' warning is disabled.  File: octave.info, Node: Debugging, Next: Input and Output, Prev: Errors and Warnings, Up: Top 13 Debugging ************ Octave includes a built-in debugger to aid in the development of scripts. This can be used to interrupt the execution of an Octave script at a certain point, or when certain conditions are met. Once execution has stopped, and debug mode is entered, the symbol table at the point where execution has stopped can be examined and modified to check for errors. The normal command-line editing and history functions are available in debug mode. * Menu: * Entering Debug Mode:: * Leaving Debug Mode:: * Breakpoints:: * Debug Mode:: * Call Stack::  File: octave.info, Node: Entering Debug Mode, Next: Leaving Debug Mode, Up: Debugging 13.1 Entering Debug Mode ======================== There are two basic means of interrupting the execution of an Octave script. These are breakpoints *note Breakpoints::, discussed in the next section and interruption based on some condition. Octave supports three means to stop execution based on the values set in the functions `debug_on_interrupt', `debug_on_warning' and `debug_on_error'. -- Built-in Function: VAL = debug_on_interrupt () -- Built-in Function: OLD_VAL = debug_on_interrupt (NEW_VAL) Query or set the internal variable that controls whether Octave will try to enter debugging mode when it receives an interrupt signal (typically generated with `C-c'). If a second interrupt signal is received before reaching the debugging mode, a normal interrupt will occur. -- Built-in Function: VAL = debug_on_warning () -- Built-in Function: OLD_VAL = debug_on_warning (NEW_VAL) Query or set the internal variable that controls whether Octave will try to enter the debugger when a warning is encountered. -- Built-in Function: VAL = debug_on_error () -- Built-in Function: OLD_VAL = debug_on_error (NEW_VAL) Query or set the internal variable that controls whether Octave will try to enter the debugger when an error is encountered. This will also inhibit printing of the normal traceback message (you will only see the top-level error message).  File: octave.info, Node: Leaving Debug Mode, Next: Breakpoints, Prev: Entering Debug Mode, Up: Debugging 13.2 Leavinging Debug Mode ========================== To leave the debug mode, use either `dbcont' or `return'. -- Command: dbcont () In debugging mode, quit debugging mode and continue execution. *See also:* *note dbstep: doc-dbstep, *note dbstep: doc-dbstep. To quit debug mode and return directly to the prompt `dbquit' should be used instead -- Command: dbquit () In debugging mode, quit debugging mode and return to the top level. *See also:* *note dbstep: doc-dbstep, *note dbcont: doc-dbcont. Finally, typing `exit' or `quit' at the debug prompt will result in Octave terminating normally.  File: octave.info, Node: Breakpoints, Next: Debug Mode, Prev: Leaving Debug Mode, Up: Debugging 13.3 Breakpoints ================ Breakpoints can be set in any Octave function, using the `dbstop' function. -- Loadable Function: RLINE = dbstop (FUNC, LINE, ...) Set a breakpoint in a function `func' String representing the function name. When already in debug mode this should be left out and only the line should be given. `line' Line number you would like the breakpoint to be set on. Multiple lines might be given as separate arguments or as a vector. The rline returned is the real line that the breakpoint was set at. *See also:* *note dbclear: doc-dbclear, *note dbstatus: doc-dbstatus, *note dbstep: doc-dbstep. Note that breakpoints cannot be set in built-in functions (e.g., `sin', etc.) or dynamically loaded function (i.e., oct-files). To set a breakpoint immediately on entering a function, the breakpoint should be set to line 1. The leading comment block will be ignored and the breakpoint will be set to the first executable statement in the function. For example dbstop ("asind", 1) => 27 Note that the return value of `27' means that the breakpoint was effectively set to line 27. The status of breakpoints in a function can be queried with the `dbstatus' function. -- Loadable Function: lst = dbstatus (FUNC) Return a vector containing the lines on which a function has breakpoints set. `func' String representing the function name. When already in debug mode this should be left out. *See also:* *note dbclear: doc-dbclear, *note dbwhere: doc-dbwhere. Taking the above as an example, `dbstatus ("asind")' should return 27. The breakpoints can then be cleared with the `dbclear' function -- Loadable Function: dbclear (FUNC, LINE, ...) Delete a breakpoint in a function `func' String representing the function name. When already in debug mode this should be left out and only the line should be given. `line' Line number where you would like to remove the breakpoint. Multiple lines might be given as separate arguments or as a vector. No checking is done to make sure that the line you requested is really a breakpoint. If you get the wrong line nothing will happen. *See also:* *note dbstop: doc-dbstop, *note dbstatus: doc-dbstatus, *note dbwhere: doc-dbwhere. These functions can be used to clear all the breakpoints in a function. For example, dbclear ("asind", dbstatus ("asind")); A breakpoint can be set in a subfunction. For example if a file contains the functions function y = func1 (x) y = func2 (x); endfunction function y = func2 (x) y = x + 1; endfunction then a breakpoint can be set at the start of the subfunction directly with dbstop (["func1", filemarker(), "func2"]) => 5 Note that `filemarker' returns a character that marks the subfunctions from the file containing them. Another simple way of setting a breakpoint in an Octave script is the use of the `keyboard' function. -- Built-in Function: keyboard (PROMPT) This function is normally used for simple debugging. When the `keyboard' function is executed, Octave prints a prompt and waits for user input. The input strings are then evaluated and the results are printed. This makes it possible to examine the values of variables within a function, and to assign new values to variables. No value is returned from the `keyboard' function, and it continues to prompt for input until the user types `quit', or `exit'. If `keyboard' is invoked without any arguments, a default prompt of `debug> ' is used. The `keyboard' function is typically placed in a script at the point where the user desires that the execution is stopped. It automatically sets the running script into the debug mode.  File: octave.info, Node: Debug Mode, Next: Call Stack, Prev: Breakpoints, Up: Debugging 13.4 Debug Mode =============== There are two additional support functions that allow the user to interrogate where in the execution of a script Octave entered the debug mode and to print the code in the script surrounding the point where Octave entered debug mode. -- Loadable Function: dbwhere () Show where we are in the code *See also:* *note dbclear: doc-dbclear, *note dbstatus: doc-dbstatus, *note dbstop: doc-dbstop. -- Loadable Function: dbtype () List script file with line numbers. *See also:* *note dbclear: doc-dbclear, *note dbstatus: doc-dbstatus, *note dbstop: doc-dbstop. You may also use `isdebugmode' to determine whether the debugger is currently active. -- Command: isdebugmode () Return true if debug mode is on, otherwise false. *See also:* *note dbstack: doc-dbstack, *note dbclear: doc-dbclear, *note dbstop: doc-dbstop, *note dbstatus: doc-dbstatus. Debug mode also allows single line stepping through a function using the commands `dbstep'. -- Command: dbstep N -- Command: dbstep in -- Command: dbstep out In debugging mode, execute the next N lines of code. If N is omitted execute the next line of code. If the next line of code is itself defined in terms of an m-file remain in the existing function. Using `dbstep in' will cause execution of the next line to step into any m-files defined on the next line. Using `dbstep out' with cause execution to continue until the current function returns. *See also:* *note dbcont: doc-dbcont, *note dbquit: doc-dbquit.  File: octave.info, Node: Call Stack, Prev: Debug Mode, Up: Debugging 13.5 Call Stack =============== -- Loadable Function: [STACK, IDX] dbstack (N) Print or return current stack information. With optional argument N, omit the N innermost stack frames. *See also:* *note dbclear: doc-dbclear, *note dbstatus: doc-dbstatus, *note dbstop: doc-dbstop. -- Loadable Function: dbup (N) In debugging mode, move up the execution stack N frames. If N is omitted, move up one frame. *See also:* *note dbstack: doc-dbstack. -- Loadable Function: dbdown (N) In debugging mode, move down the execution stack N frames. If N is omitted, move down one frame. *See also:* *note dbstack: doc-dbstack.  File: octave.info, Node: Input and Output, Next: Plotting, Prev: Debugging, Up: Top 14 Input and Output ******************* Octave supports several ways of reading and writing data to or from the prompt or a file. The simplest functions for data Input and Output (I/O) are easy to use, but only provides limited control of how data is processed. For more control, a set of functions modelled after the C standard library are also provided by Octave. * Menu: * Basic Input and Output:: * C-Style I/O Functions::  File: octave.info, Node: Basic Input and Output, Next: C-Style I/O Functions, Up: Input and Output 14.1 Basic Input and Output =========================== * Menu: * Terminal Output:: * Terminal Input:: * Simple File I/O:: * Rational Approximations::  File: octave.info, Node: Terminal Output, Next: Terminal Input, Up: Basic Input and Output 14.1.1 Terminal Output ---------------------- Since Octave normally prints the value of an expression as soon as it has been evaluated, the simplest of all I/O functions is a simple expression. For example, the following expression will display the value of `pi' pi -| pi = 3.1416 This works well as long as it is acceptable to have the name of the variable (or `ans') printed along with the value. To print the value of a variable without printing its name, use the function `disp'. The `format' command offers some control over the way Octave prints values with `disp' and through the normal echoing mechanism. -- Built-in Function: disp (X) Display the value of X. For example, disp ("The value of pi is:"), disp (pi) -| the value of pi is: -| 3.1416 Note that the output from `disp' always ends with a newline. If an output value is requested, `disp' prints nothing and returns the formatted output in a string. *See also:* *note fdisp: doc-fdisp. -- Command: format options Control the format of the output produced by `disp' and Octave's normal echoing mechanism. Valid options are listed in the following table. `short' Octave will try to print numbers with at least 5 significant figures within a field that is a maximum of 10 characters wide (not counting additional spacing that is added between columns of a matrix). If Octave is unable to format a matrix so that columns line up on the decimal point and all the numbers fit within the maximum field width, it switches to an `e' format. `long' Octave will try to print numbers with at least 15 significant figures within a field that is a maximum of 20 characters wide (not counting additional spacing that is added between columns of a matrix). As will the `short' format, Octave will switch to an `e' format if it is unable to format a matrix so that columns line up on the decimal point and all the numbers fit within the maximum field width. `long e' `short e' The same as `format long' or `format short' but always display output with an `e' format. For example, with the `short e' format, `pi' is displayed as `3.14e+00'. `long E' `short E' The same as `format long e' or `format short e' but always display output with an uppercase `E' format. For example, with the `long E' format, `pi' is displayed as `3.14159265358979E+00'. `long g' `short g' Choose between normal `long' (or `short') and `long e' (or `short e') formats based on the magnitude of the number. For example, with the `short g' format, `pi .^ [2; 4; 8; 16; 32]' is displayed as ans = 9.8696 97.409 9488.5 9.0032e+07 8.1058e+15 `long G' `short G' The same as `format long g' or `format short g' but use an uppercase `E' format. For example, with the `short G' format, `pi .^ [2; 4; 8; 16; 32]' is displayed as ans = 9.8696 97.409 9488.5 9.0032E+07 8.1058E+15 `free' `none' Print output in free format, without trying to line up columns of matrices on the decimal point. This also causes complex numbers to be formatted like this `(0.604194, 0.607088)' instead of like this `0.60419 + 0.60709i'. `bank' Print in a fixed format with two places to the right of the decimal point. `+' `+ CHARS' `plus' `plus CHARS' Print a `+' symbol for nonzero matrix elements and a space for zero matrix elements. This format can be very useful for examining the structure of a large matrix. The optional argument CHARS specifies a list of 3 characters to use for printing values greater than zero, less than zero and equal to zero. For example, with the `+ "+-."' format, `[1, 0, -1; -1, 0, 1]' is displayed as ans = +.- -.+ `native-hex' Print the hexadecimal representation numbers as they are stored in memory. For example, on a workstation which stores 8 byte real values in IEEE format with the least significant byte first, the value of `pi' when printed in `hex' format is `400921fb54442d18'. This format only works for numeric values. `hex' The same as `native-hex', but always print the most significant byte first. `native-bit' Print the bit representation of numbers as stored in memory. For example, the value of `pi' is 01000000000010010010000111111011 01010100010001000010110100011000 (shown here in two 32 bit sections for typesetting purposes) when printed in bit format on a workstation which stores 8 byte real values in IEEE format with the least significant byte first. This format only works for numeric types. `bit' The same as `native-bit', but always print the most significant bits first. `compact' Remove extra blank space around column number labels. `loose' Insert blank lines above and below column number labels (this is the default). `rat' Print a rational approximation. That is the values are approximated by one small integer divided by another. By default, Octave will try to print numbers with at least 5 significant figures within a field that is a maximum of 10 characters wide. If Octave is unable to format a matrix so that columns line up on the decimal point and all the numbers fit within the maximum field width, it switches to an `e' format. If `format' is invoked without any options, the default format state is restored. * Menu: * Paging Screen Output::  File: octave.info, Node: Paging Screen Output, Up: Terminal Output 14.1.1.1 Paging Screen Output ............................. When running interactively, Octave normally sends any output intended for your terminal that is more than one screen long to a paging program, such as `less' or `more'. This avoids the problem of having a large volume of output stream by before you can read it. With `less' (and some versions of `more') you can also scan forward and backward, and search for specific items. Normally, no output is displayed by the pager until just before Octave is ready to print the top level prompt, or read from the standard input (for example, by using the `fscanf' or `scanf' functions). This means that there may be some delay before any output appears on your screen if you have asked Octave to perform a significant amount of work with a single command statement. The function `fflush' may be used to force output to be sent to the pager (or any other stream) immediately. You can select the program to run as the pager using the `PAGER' function, and you can turn paging off by using the function `more'. -- Command: more -- Command: more on -- Command: more off Turn output pagination on or off. Without an argument, `more' toggles the current state. The current state can be determined via `page_screen_output'. -- Built-in Function: VAL = PAGER () -- Built-in Function: OLD_VAL = PAGER (NEW_VAL) Query or set the internal variable that specifies the program to use to display terminal output on your system. The default value is normally `"less"', `"more"', or `"pg"', depending on what programs are installed on your system. *Note Installation::. *See also:* *note more: doc-more, *note page_screen_output: doc-page_screen_output, *note page_output_immediately: doc-page_output_immediately, *note PAGER_FLAGS: doc-PAGER_FLAGS. -- Built-in Function: VAL = PAGER_FLAGS () -- Built-in Function: OLD_VAL = PAGER_FLAGS (NEW_VAL) Query or set the internal variable that specifies the options to pass to the pager. *See also:* *note PAGER: doc-PAGER. -- Built-in Function: VAL = page_screen_output () -- Built-in Function: OLD_VAL = page_screen_output (NEW_VAL) Query or set the internal variable that controls whether output intended for the terminal window that is longer than one page is sent through a pager. This allows you to view one screenful at a time. Some pagers (such as `less'--see *note Installation::) are also capable of moving backward on the output. -- Built-in Function: VAL = page_output_immediately () -- Built-in Function: VAL = page_output_immediately (NEW_VAL) Query or set the internal variable that controls whether Octave sends output to the pager as soon as it is available. Otherwise, Octave buffers its output and waits until just before the prompt is printed to flush it to the pager. -- Built-in Function: fflush (FID) Flush output to FID. This is useful for ensuring that all pending output makes it to the screen before some other event occurs. For example, it is always a good idea to flush the standard output stream before calling `input'. `fflush' returns 0 on success and an OS dependent error value (-1 on unix) on error. *See also:* *note fopen: doc-fopen, *note fclose: doc-fclose.  File: octave.info, Node: Terminal Input, Next: Simple File I/O, Prev: Terminal Output, Up: Basic Input and Output 14.1.2 Terminal Input --------------------- Octave has three functions that make it easy to prompt users for input. The `input' and `menu' functions are normally used for managing an interactive dialog with a user, and the `keyboard' function is normally used for doing simple debugging. -- Built-in Function: input (PROMPT) -- Built-in Function: input (PROMPT, "s") Print a prompt and wait for user input. For example, input ("Pick a number, any number! ") prints the prompt Pick a number, any number! and waits for the user to enter a value. The string entered by the user is evaluated as an expression, so it may be a literal constant, a variable name, or any other valid expression. Currently, `input' only returns one value, regardless of the number of values produced by the evaluation of the expression. If you are only interested in getting a literal string value, you can call `input' with the character string `"s"' as the second argument. This tells Octave to return the string entered by the user directly, without evaluating it first. Because there may be output waiting to be displayed by the pager, it is a good idea to always call `fflush (stdout)' before calling `input'. This will ensure that all pending output is written to the screen before your prompt. *Note Input and Output::. -- Function File: menu (TITLE, OPT1, ...) Print a title string followed by a series of options. Each option will be printed along with a number. The return value is the number of the option selected by the user. This function is useful for interactive programs. There is no limit to the number of options that may be passed in, but it may be confusing to present more than will fit easily on one screen. *See also:* *note disp: doc-disp, *note printf: doc-printf, *note input: doc-input. -- Built-in Function: yes_or_no (PROMPT) Ask the user a yes-or-no question. Return 1 if the answer is yes. Takes one argument, which is the string to display to ask the question. It should end in a space; `yes-or-no-p' adds `(yes or no) ' to it. The user must confirm the answer with RET and can edit it until it has been confirmed. For `input', the normal command line history and editing functions are available at the prompt. Octave also has a function that makes it possible to get a single character from the keyboard without requiring the user to type a carriage return. -- Built-in Function: kbhit () Read a single keystroke from the keyboard. If called with one argument, don't wait for a keypress. For example, x = kbhit (); will set X to the next character typed at the keyboard as soon as it is typed. x = kbhit (1); identical to the above example, but don't wait for a keypress, returning the empty string if no key is available.  File: octave.info, Node: Simple File I/O, Next: Rational Approximations, Prev: Terminal Input, Up: Basic Input and Output 14.1.3 Simple File I/O ---------------------- The `save' and `load' commands allow data to be written to and read from disk files in various formats. The default format of files written by the `save' command can be controlled using the functions `default_save_options' and `save_precision'. As an example the following code creates a 3-by-3 matrix and saves it to the file `myfile.mat'. A = [ 1:3; 4:6; 7:9 ]; save myfile.mat A Once one or more variables have been saved to a file, they can be read into memory using the `load' command. load myfile.mat A -| A = -| -| 1 2 3 -| 4 5 6 -| 7 8 9 -- Command: save options file V1 V2 ... -- Command: save options file -struct STR F1 F2 ... Save the named variables V1, V2, ..., in the file FILE. The special filename `-' may be used to write the output to your terminal. If no variable names are listed, Octave saves all the variables in the current scope. If the `-struct' modifier is used, fields F1 F2 ... of the scalar structure STR are saved as if they were variables with corresponding names. Valid options for the `save' command are listed in the following table. Options that modify the output format override the format specified by `default_save_options'. If save is invoked using the functional form save ("-option1", ..., "file", "v1", ...) then the OPTIONS, FILE, and variable name arguments (V1, ...) must be specified as character strings. `-ascii' Save a single matrix in a text file. `-binary' Save the data in Octave's binary data format. `-float-binary' Save the data in Octave's binary data format but only using single precision. You should use this format only if you know that all the values to be saved can be represented in single precision. `-V7' `-v7' `-7' `-mat7-binary' Save the data in MATLAB's v7 binary data format. `-V6' `-v6' `-6' `-mat' `-mat-binary' Save the data in MATLAB's v6 binary data format. `-V4' `-v4' `-4' `-mat4-binary' Save the data in the binary format written by MATLAB version 4. `-hdf5' Save the data in HDF5 format. (HDF5 is a free, portable binary format developed by the National Center for Supercomputing Applications at the University of Illinois.) `-float-hdf5' Save the data in HDF5 format but only using single precision. You should use this format only if you know that all the values to be saved can be represented in single precision. `-zip' `-z' Use the gzip algorithm to compress the file. This works equally on files that are compressed with gzip outside of octave, and gzip can equally be used to convert the files for backward compatibility. The list of variables to save may include wildcard patterns containing the following special characters: `?' Match any single character. `*' Match zero or more characters. `[ LIST ]' Match the list of characters specified by LIST. If the first character is `!' or `^', match all characters except those specified by LIST. For example, the pattern `[a-zA-Z]' will match all lower and upper case alphabetic characters. Wildcards may also be used in the field names specifications when using the `-struct' modifier (but not in the struct name itself). `-text' Save the data in Octave's text data format. Except when using the MATLAB binary data file format, saving global variables also saves the global status of the variable, so that if it is restored at a later time using `load', it will be restored as a global variable. The command save -binary data a b* saves the variable `a' and all variables beginning with `b' to the file `data' in Octave's binary format. -- Command: load options file v1 v2 ... Load the named variables V1, V2, ..., from the file FILE. As with `save', you may specify a list of variables and `load' will only extract those variables with names that match. For example, to restore the variables saved in the file `data', use the command load data If load is invoked using the functional form load ("-option1", ..., "file", "v1", ...) then the OPTIONS, FILE, and variable name arguments (V1, ...) must be specified as character strings. If a variable that is not marked as global is loaded from a file when a global symbol with the same name already exists, it is loaded in the global symbol table. Also, if a variable is marked as global in a file and a local symbol exists, the local symbol is moved to the global symbol table and given the value from the file. Since it seems that both of these cases are likely to be the result of some sort of error, they will generate warnings. If invoked with a single output argument, Octave returns data instead of inserting variables in the symbol table. If the data file contains only numbers (TAB- or space-delimited columns), a matrix of values is returned. Otherwise, `load' returns a structure with members corresponding to the names of the variables in the file. The `load' command can read data stored in Octave's text and binary formats, and MATLAB's binary format. If compiled with zlib support, it can load gzip-compressed files as well. It will automatically detect the type of file and do conversion from different floating point formats (currently only IEEE big and little endian, though other formats may added in the future). Valid options for `load' are listed in the following table. `-force' The `-force' option is accepted but ignored for backward compatibility. Octave now overwrites variables currently in memory with the same name as those found in the file. `-ascii' Force Octave to assume the file contains columns of numbers in text format without any header or other information. Data in the file will be loaded as a single numeric matrix with the name of the variable derived from the name of the file. `-binary' Force Octave to assume the file is in Octave's binary format. `-mat' `-mat-binary' `-6' `-v6' `-7' `-v7' Force Octave to assume the file is in MATLAB's version 6 or 7 binary format. `-V4' `-v4' `-4' `-mat4-binary' Force Octave to assume the file is in the binary format written by MATLAB version 4. `-hdf5' Force Octave to assume the file is in HDF5 format. (HDF5 is a free, portable binary format developed by the National Center for Supercomputing Applications at the University of Illinois.) Note that Octave can read HDF5 files not created by itself, but may skip some datasets in formats that it cannot support. `-import' The `-import' is accepted but ignored for backward compatibility. Octave can now support multi-dimensional HDF data and automatically modifies variable names if they are invalid Octave identifiers. `-text' Force Octave to assume the file is in Octave's text format. There are three functions that modify the behavior of `save'. -- Built-in Function: VAL = default_save_options () -- Built-in Function: OLD_VAL = default_save_options (NEW_VAL) Query or set the internal variable that specifies the default options for the `save' command, and defines the default format. Typical values include `"-ascii"', `"-ascii -zip"'. The default value is `-ascii'. *See also:* *note save: doc-save. -- Built-in Function: VAL = save_precision () -- Built-in Function: OLD_VAL = save_precision (NEW_VAL) Query or set the internal variable that specifies the number of digits to keep when saving data in text format. -- Built-in Function: VAL = save_header_format_string () -- Built-in Function: OLD_VAL = save_header_format_string (NEW_VAL) Query or set the internal variable that specifies the format string used for the comment line written at the beginning of text-format data files saved by Octave. The format string is passed to `strftime' and should begin with the character `#' and contain no newline characters. If the value of `save_header_format_string' is the empty string, the header comment is omitted from text-format data files. The default value is "# Created by Octave VERSION, %a %b %d %H:%M:%S %Y %Z " *See also:* *note strftime: doc-strftime. -- Built-in Function: native_float_format () Return the native floating point format as a string It is possible to write data to a file in a similar way to the `disp' function for writing data to the screen. The `fdisp' works just like `disp' except its first argument is a file pointer as created by `fopen'. As an example, the following code writes to data `myfile.txt'. fid = fopen ("myfile.txt", "w"); fdisp (fid, "3/8 is "); fdisp (fid, 3/8); fclose (fid); *Note Opening and Closing Files::, for details on how to use `fopen' and `fclose'. -- Built-in Function: fdisp (FID, X) Display the value of X on the stream FID. For example, fdisp (stdout, "The value of pi is:"), fdisp (stdout, pi) -| the value of pi is: -| 3.1416 Note that the output from `fdisp' always ends with a newline. *See also:* *note disp: doc-disp. Octave can also read and write matrices text files such as comma separated lists. -- Function File: dlmwrite (FILE, A) -- Function File: dlmwrite (FILE, A, DELIM, R, C) -- Function File: dlmwrite (FILE, A, KEY, VAL ...) -- Function File: dlmwrite (FILE, A, "-append", ...) Write the matrix A to the named file using delimiters. The parameter DELIM specifies the delimiter to use to separate values on a row. The value of R specifies the number of delimiter-only lines to add to the start of the file. The value of C specifies the number of delimiters to prepend to each line of data. If the argument `"-append"' is given, append to the end of the FILE. In addition, the following keyword value pairs may appear at the end of the argument list: `"append"' Either `"on"' or `"off"'. See `"-append"' above. `"delimiter"' See DELIM above. `"newline"' The character(s) to use to separate each row. Three special cases exist for this option. `"unix"' is changed into '\n', `"pc"' is changed into '\r\n', and `"mac"' is changed into '\r'. Other values for this option are kept as is. `"roffset"' See R above. `"coffset"' See C above. `"precision"' The precision to use when writing the file. It can either be a format string (as used by fprintf) or a number of significant digits. dlmwrite ("file.csv", reshape (1:16, 4, 4)); dlmwrite ("file.tex", a, "delimiter", "&", "newline", "\\n") *See also:* *note dlmread: doc-dlmread, *note csvread: doc-csvread, *note csvwrite: doc-csvwrite. -- Loadable Function: DATA = dlmread (FILE) -- Loadable Function: DATA = dlmread (FILE, SEP) -- Loadable Function: DATA = dlmread (FILE, SEP, R0, C0) -- Loadable Function: DATA = dlmread (FILE, SEP, RANGE) Read the matrix DATA from a text file. If not defined the separator between fields is determined from the file itself. Otherwise the separation character is defined by SEP. Given two scalar arguments R0 and C0, these define the starting row and column of the data to be read. These values are indexed from zero, such that the first row corresponds to an index of zero. The RANGE parameter must be a 4 element vector containing the upper left and lower right corner `[R0,C0,R1,C1]' or a spreadsheet style range such as 'A2..Q15'. The lowest index value is zero. -- Function File: X = csvwrite (FILENAME, X) Write the matrix X to a file. This function is equivalent to dlmwrite (FILENAME, X, ",", ...) *See also:* *note dlmread: doc-dlmread, *note dlmwrite: doc-dlmwrite, *note csvread: doc-csvread. -- Function File: X = csvread (FILENAME) Read the matrix X from a file. This function is equivalent to dlmread (FILENAME, "," , ...) *See also:* *note dlmread: doc-dlmread, *note dlmwrite: doc-dlmwrite, *note csvwrite: doc-csvwrite. * Menu: * Saving Data on Unexpected Exits::  File: octave.info, Node: Saving Data on Unexpected Exits, Up: Simple File I/O 14.1.3.1 Saving Data on Unexpected Exits ........................................ If Octave for some reason exits unexpectedly it will by default save the variables available in the workspace to a file in the current directory. By default this file is named `octave-core' and can be loaded into memory with the `load' command. While the default behavior most often is reasonable it can be changed through the following functions. -- Built-in Function: VAL = crash_dumps_octave_core () -- Built-in Function: OLD_VAL = crash_dumps_octave_core (NEW_VAL) Query or set the internal variable that controls whether Octave tries to save all current variables to the file "octave-core" if it crashes or receives a hangup, terminate or similar signal. *See also:* *note octave_core_file_limit: doc-octave_core_file_limit, *note octave_core_file_name: doc-octave_core_file_name, *note octave_core_file_options: doc-octave_core_file_options. -- Built-in Function: VAL = sighup_dumps_octave_core () -- Built-in Function: OLD_VAL = sighup_dumps_octave_core (NEW_VAL) Query or set the internal variable that controls whether Octave tries to save all current variables to the file "octave-core" if it receives a hangup signal. -- Built-in Function: VAL = sigterm_dumps_octave_core () -- Built-in Function: OLD_VAL = sigterm_dumps_octave_core (NEW_VAL) Query or set the internal variable that controls whether Octave tries to save all current variables to the file "octave-core" if it receives a terminate signal. -- Built-in Function: VAL = octave_core_file_options () -- Built-in Function: OLD_VAL = octave_core_file_options (NEW_VAL) Query or set the internal variable that specifies the options used for saving the workspace data if Octave aborts. The value of `octave_core_file_options' should follow the same format as the options for the `save' function. The default value is Octave's binary format. *See also:* *note crash_dumps_octave_core: doc-crash_dumps_octave_core, *note octave_core_file_name: doc-octave_core_file_name, *note octave_core_file_limit: doc-octave_core_file_limit. -- Built-in Function: VAL = octave_core_file_limit () -- Built-in Function: OLD_VAL = octave_core_file_limit (NEW_VAL) Query or set the internal variable that specifies the maximum amount of memory (in kilobytes) of the top-level workspace that Octave will attempt to save when writing data to the crash dump file (the name of the file is specified by OCTAVE_CORE_FILE_NAME). If OCTAVE_CORE_FILE_OPTIONS flags specify a binary format, then OCTAVE_CORE_FILE_LIMIT will be approximately the maximum size of the file. If a text file format is used, then the file could be much larger than the limit. The default value is -1 (unlimited) *See also:* *note crash_dumps_octave_core: doc-crash_dumps_octave_core, *note octave_core_file_name: doc-octave_core_file_name, *note octave_core_file_options: doc-octave_core_file_options. -- Built-in Function: VAL = octave_core_file_name () -- Built-in Function: OLD_VAL = octave_core_file_name (NEW_VAL) Query or set the internal variable that specifies the name of the file used for saving data from the top-level workspace if Octave aborts. The default value is `"octave-core"' *See also:* *note crash_dumps_octave_core: doc-crash_dumps_octave_core, *note octave_core_file_name: doc-octave_core_file_name, *note octave_core_file_options: doc-octave_core_file_options.  File: octave.info, Node: Rational Approximations, Prev: Simple File I/O, Up: Basic Input and Output 14.1.4 Rational Approximations ------------------------------ -- Function File: S = rat (X, TOL) -- Function File: [N, D] = rat (X, TOL) Find a rational approximation to X within the tolerance defined by TOL using a continued fraction expansion. For example, rat(pi) = 3 + 1/(7 + 1/16) = 355/113 rat(e) = 3 + 1/(-4 + 1/(2 + 1/(5 + 1/(-2 + 1/(-7))))) = 1457/536 Called with two arguments returns the numerator and denominator separately as two matrices. *See also:* *note rats: doc-rats. -- Built-in Function: rats (X, LEN) Convert X into a rational approximation represented as a string. You can convert the string back into a matrix as follows: r = rats(hilb(4)); x = str2num(r) The optional second argument defines the maximum length of the string representing the elements of X. By default LEN is 9. *See also:* *note format: doc-format, *note rat: doc-rat.  File: octave.info, Node: C-Style I/O Functions, Prev: Basic Input and Output, Up: Input and Output 14.2 C-Style I/O Functions ========================== Octave's C-style input and output functions provide most of the functionality of the C programming language's standard I/O library. The argument lists for some of the input functions are slightly different, however, because Octave has no way of passing arguments by reference. In the following, FILE refers to a file name and `fid' refers to an integer file number, as returned by `fopen'. There are three files that are always available. Although these files can be accessed using their corresponding numeric file ids, you should always use the symbolic names given in the table below, since it will make your programs easier to understand. -- Built-in Function: stdin () Return the numeric value corresponding to the standard input stream. When Octave is used interactively, this is filtered through the command line editing functions. *See also:* *note stdout: doc-stdout, *note stderr: doc-stderr. -- Built-in Function: stdout () Return the numeric value corresponding to the standard output stream. Data written to the standard output is normally filtered through the pager. *See also:* *note stdin: doc-stdin, *note stderr: doc-stderr. -- Built-in Function: stderr () Return the numeric value corresponding to the standard error stream. Even if paging is turned on, the standard error is not sent to the pager. It is useful for error messages and prompts. *See also:* *note stdin: doc-stdin, *note stdout: doc-stdout. * Menu: * Opening and Closing Files:: * Simple Output:: * Line-Oriented Input:: * Formatted Output:: * Output Conversion for Matrices:: * Output Conversion Syntax:: * Table of Output Conversions:: * Integer Conversions:: * Floating-Point Conversions:: * Other Output Conversions:: * Formatted Input:: * Input Conversion Syntax:: * Table of Input Conversions:: * Numeric Input Conversions:: * String Input Conversions:: * Binary I/O:: * Temporary Files:: * EOF and Errors:: * File Positioning::  File: octave.info, Node: Opening and Closing Files, Next: Simple Output, Up: C-Style I/O Functions 14.2.1 Opening and Closing Files -------------------------------- When reading data from a file it must be opened for reading first, and likewise when writing to a file. The `fopen' function returns a pointer to an open file that is ready to be read or written. Once all data has been read from or written to the opened file it should be closed. The `fclose' function does this. The following code illustrates the basic pattern for writing to a file, but a very similar pattern is used when reading a file. filename = "myfile.txt"; fid = fopen (filename, "w"); # Do the actual I/O here... fclose (fid); -- Built-in Function: [FID, MSG] = fopen (NAME, MODE, ARCH) -- Built-in Function: FID_LIST = fopen ("all") -- Built-in Function: [FILE, MODE, ARCH] = fopen (FID) The first form of the `fopen' function opens the named file with the specified mode (read-write, read-only, etc.) and architecture interpretation (IEEE big endian, IEEE little endian, etc.), and returns an integer value that may be used to refer to the file later. If an error occurs, FID is set to -1 and MSG contains the corresponding system error message. The MODE is a one or two character string that specifies whether the file is to be opened for reading, writing, or both. The second form of the `fopen' function returns a vector of file ids corresponding to all the currently open files, excluding the `stdin', `stdout', and `stderr' streams. The third form of the `fopen' function returns information about the open file given its file id. For example, myfile = fopen ("splat.dat", "r", "ieee-le"); opens the file `splat.dat' for reading. If necessary, binary numeric values will be read assuming they are stored in IEEE format with the least significant bit first, and then converted to the native representation. Opening a file that is already open simply opens it again and returns a separate file id. It is not an error to open a file several times, though writing to the same file through several different file ids may produce unexpected results. The possible values `mode' may have are `r' Open a file for reading. `w' Open a file for writing. The previous contents are discarded. `a' Open or create a file for writing at the end of the file. `r+' Open an existing file for reading and writing. `w+' Open a file for reading or writing. The previous contents are discarded. `a+' Open or create a file for reading or writing at the end of the file. Append a "t" to the mode string to open the file in text mode or a "b" to open in binary mode. On Windows and Macintosh systems, text mode reading and writing automatically converts linefeeds to the appropriate line end character for the system (carriage-return linefeed on Windows, carriage-return on Macintosh). The default if no mode is specified is binary mode. Additionally, you may append a "z" to the mode string to open a gzipped file for reading or writing. For this to be successful, you must also open the file in binary mode. The parameter ARCH is a string specifying the default data format for the file. Valid values for ARCH are: `native' The format of the current machine (this is the default). `ieee-be' IEEE big endian format. `ieee-le' IEEE little endian format. `vaxd' VAX D floating format. `vaxg' VAX G floating format. `cray' Cray floating format. however, conversions are currently only supported for `native' `ieee-be', and `ieee-le' formats. *See also:* *note fclose: doc-fclose, *note fgets: doc-fgets, *note fputs: doc-fputs, *note fread: doc-fread, *note fseek: doc-fseek, *note ferror: doc-ferror, *note fprintf: doc-fprintf, *note fscanf: doc-fscanf, *note ftell: doc-ftell, *note fwrite: doc-fwrite. -- Built-in Function: fclose (FID) Closes the specified file. If successful, `fclose' returns 0, otherwise, it returns -1. *See also:* *note fopen: doc-fopen, *note fseek: doc-fseek, *note ftell: doc-ftell.  File: octave.info, Node: Simple Output, Next: Line-Oriented Input, Prev: Opening and Closing Files, Up: C-Style I/O Functions 14.2.2 Simple Output -------------------- Once a file has been opened for writing a string can be written to the file using the `fputs' function. The following example shows how to write the string `Free Software is needed for Free Science' to the file `free.txt'. filename = "free.txt"; fid = fopen (filename, "w"); fputs (fid, "Free Software is needed for Free Science"); fclose (fid); -- Built-in Function: fputs (FID, STRING) Write a string to a file with no formatting. Return a non-negative number on success and EOF on error. *See also:* *note scanf: doc-scanf, *note sscanf: doc-sscanf, *note fread: doc-fread, *note fprintf: doc-fprintf, *note fgets: doc-fgets, *note fscanf: doc-fscanf. A function much similar to `fputs' is available for writing data to the screen. The `puts' function works just like `fputs' except it doesn't take a file pointer as its input. -- Built-in Function: puts (STRING) Write a string to the standard output with no formatting. Return a non-negative number on success and EOF on error.  File: octave.info, Node: Line-Oriented Input, Next: Formatted Output, Prev: Simple Output, Up: C-Style I/O Functions 14.2.3 Line-Oriented Input -------------------------- To read from a file it must be opened for reading using `fopen'. Then a line can be read from the file using `fgetl' as the following code illustrates fid = fopen ("free.txt"); txt = fgetl (fid) -| Free Software is needed for Free Science fclose (fid); This of course assumes that the file `free.txt' exists and contains the line `Free Software is needed for Free Science'. -- Built-in Function: fgetl (FID, LEN) Read characters from a file, stopping after a newline, or EOF, or LEN characters have been read. The characters read, excluding the possible trailing newline, are returned as a string. If LEN is omitted, `fgetl' reads until the next newline character. If there are no more characters to read, `fgetl' returns -1. *See also:* *note fread: doc-fread, *note fscanf: doc-fscanf. -- Built-in Function: fgets (FID, LEN) Read characters from a file, stopping after a newline, or EOF, or LEN characters have been read. The characters read, including the possible trailing newline, are returned as a string. If LEN is omitted, `fgets' reads until the next newline character. If there are no more characters to read, `fgets' returns -1. *See also:* *note fputs: doc-fputs, *note fopen: doc-fopen, *note fread: doc-fread, *note fscanf: doc-fscanf.  File: octave.info, Node: Formatted Output, Next: Output Conversion for Matrices, Prev: Line-Oriented Input, Up: C-Style I/O Functions 14.2.4 Formatted Output ----------------------- This section describes how to call `printf' and related functions. The following functions are available for formatted output. They are modelled after the C language functions of the same name, but they interpret the format template differently in order to improve the performance of printing vector and matrix values. -- Built-in Function: printf (TEMPLATE, ...) Print optional arguments under the control of the template string TEMPLATE to the stream `stdout' and return the number of characters printed. *See also:* *note fprintf: doc-fprintf, *note sprintf: doc-sprintf, *note scanf: doc-scanf. -- Built-in Function: fprintf (FID, TEMPLATE, ...) This function is just like `printf', except that the output is written to the stream FID instead of `stdout'. If FID is omitted, the output is written to `stdout'. *See also:* *note printf: doc-printf, *note sprintf: doc-sprintf, *note fread: doc-fread, *note fscanf: doc-fscanf, *note fopen: doc-fopen, *note fclose: doc-fclose. -- Built-in Function: sprintf (TEMPLATE, ...) This is like `printf', except that the output is returned as a string. Unlike the C library function, which requires you to provide a suitably sized string as an argument, Octave's `sprintf' function returns the string, automatically sized to hold all of the items converted. *See also:* *note printf: doc-printf, *note fprintf: doc-fprintf, *note sscanf: doc-sscanf. The `printf' function can be used to print any number of arguments. The template string argument you supply in a call provides information not only about the number of additional arguments, but also about their types and what style should be used for printing them. Ordinary characters in the template string are simply written to the output stream as-is, while "conversion specifications" introduced by a `%' character in the template cause subsequent arguments to be formatted and written to the output stream. For example, pct = 37; filename = "foo.txt"; printf ("Processed %d%% of `%s'.\nPlease be patient.\n", pct, filename); produces output like Processed 37% of `foo.txt'. Please be patient. This example shows the use of the `%d' conversion to specify that a scalar argument should be printed in decimal notation, the `%s' conversion to specify printing of a string argument, and the `%%' conversion to print a literal `%' character. There are also conversions for printing an integer argument as an unsigned value in octal, decimal, or hexadecimal radix (`%o', `%u', or `%x', respectively); or as a character value (`%c'). Floating-point numbers can be printed in normal, fixed-point notation using the `%f' conversion or in exponential notation using the `%e' conversion. The `%g' conversion uses either `%e' or `%f' format, depending on what is more appropriate for the magnitude of the particular number. You can control formatting more precisely by writing "modifiers" between the `%' and the character that indicates which conversion to apply. These slightly alter the ordinary behavior of the conversion. For example, most conversion specifications permit you to specify a minimum field width and a flag indicating whether you want the result left- or right-justified within the field. The specific flags and modifiers that are permitted and their interpretation vary depending on the particular conversion. They're all described in more detail in the following sections.  File: octave.info, Node: Output Conversion for Matrices, Next: Output Conversion Syntax, Prev: Formatted Output, Up: C-Style I/O Functions 14.2.5 Output Conversion for Matrices ------------------------------------- When given a matrix value, Octave's formatted output functions cycle through the format template until all the values in the matrix have been printed. For example, printf ("%4.2f %10.2e %8.4g\n", hilb (3)); -| 1.00 5.00e-01 0.3333 -| 0.50 3.33e-01 0.25 -| 0.33 2.50e-01 0.2 If more than one value is to be printed in a single call, the output functions do not return to the beginning of the format template when moving on from one value to the next. This can lead to confusing output if the number of elements in the matrices are not exact multiples of the number of conversions in the format template. For example, printf ("%4.2f %10.2e %8.4g\n", [1, 2], [3, 4]); -| 1.00 2.00e+00 3 -| 4.00 If this is not what you want, use a series of calls instead of just one.  File: octave.info, Node: Output Conversion Syntax, Next: Table of Output Conversions, Prev: Output Conversion for Matrices, Up: C-Style I/O Functions 14.2.6 Output Conversion Syntax ------------------------------- This section provides details about the precise syntax of conversion specifications that can appear in a `printf' template string. Characters in the template string that are not part of a conversion specification are printed as-is to the output stream. The conversion specifications in a `printf' template string have the general form: % FLAGS WIDTH [ . PRECISION ] TYPE CONVERSION For example, in the conversion specifier `%-10.8ld', the `-' is a flag, `10' specifies the field width, the precision is `8', the letter `l' is a type modifier, and `d' specifies the conversion style. (This particular type specifier says to print a numeric argument in decimal notation, with a minimum of 8 digits left-justified in a field at least 10 characters wide.) In more detail, output conversion specifications consist of an initial `%' character followed in sequence by: * Zero or more "flag characters" that modify the normal behavior of the conversion specification. * An optional decimal integer specifying the "minimum field width". If the normal conversion produces fewer characters than this, the field is padded with spaces to the specified width. This is a _minimum_ value; if the normal conversion produces more characters than this, the field is _not_ truncated. Normally, the output is right-justified within the field. You can also specify a field width of `*'. This means that the next argument in the argument list (before the actual value to be printed) is used as the field width. The value is rounded to the nearest integer. If the value is negative, this means to set the `-' flag (see below) and to use the absolute value as the field width. * An optional "precision" to specify the number of digits to be written for the numeric conversions. If the precision is specified, it consists of a period (`.') followed optionally by a decimal integer (which defaults to zero if omitted). You can also specify a precision of `*'. This means that the next argument in the argument list (before the actual value to be printed) is used as the precision. The value must be an integer, and is ignored if it is negative. * An optional "type modifier character". This character is ignored by Octave's `printf' function, but is recognized to provide compatibility with the C language `printf'. * A character that specifies the conversion to be applied. The exact options that are permitted and how they are interpreted vary between the different conversion specifiers. See the descriptions of the individual conversions for information about the particular options that they use.  File: octave.info, Node: Table of Output Conversions, Next: Integer Conversions, Prev: Output Conversion Syntax, Up: C-Style I/O Functions 14.2.7 Table of Output Conversions ---------------------------------- Here is a table summarizing what all the different conversions do: `%d', `%i' Print an integer as a signed decimal number. *Note Integer Conversions::, for details. `%d' and `%i' are synonymous for output, but are different when used with `scanf' for input (*note Table of Input Conversions::). `%o' Print an integer as an unsigned octal number. *Note Integer Conversions::, for details. `%u' Print an integer as an unsigned decimal number. *Note Integer Conversions::, for details. `%x', `%X' Print an integer as an unsigned hexadecimal number. `%x' uses lower-case letters and `%X' uses upper-case. *Note Integer Conversions::, for details. `%f' Print a floating-point number in normal (fixed-point) notation. *Note Floating-Point Conversions::, for details. `%e', `%E' Print a floating-point number in exponential notation. `%e' uses lower-case letters and `%E' uses upper-case. *Note Floating-Point Conversions::, for details. `%g', `%G' Print a floating-point number in either normal (fixed-point) or exponential notation, whichever is more appropriate for its magnitude. `%g' uses lower-case letters and `%G' uses upper-case. *Note Floating-Point Conversions::, for details. `%c' Print a single character. *Note Other Output Conversions::. `%s' Print a string. *Note Other Output Conversions::. `%%' Print a literal `%' character. *Note Other Output Conversions::. If the syntax of a conversion specification is invalid, unpredictable things will happen, so don't do this. If there aren't enough function arguments provided to supply values for all the conversion specifications in the template string, or if the arguments are not of the correct types, the results are unpredictable. If you supply more arguments than conversion specifications, the extra argument values are simply ignored; this is sometimes useful.  File: octave.info, Node: Integer Conversions, Next: Floating-Point Conversions, Prev: Table of Output Conversions, Up: C-Style I/O Functions 14.2.8 Integer Conversions -------------------------- This section describes the options for the `%d', `%i', `%o', `%u', `%x', and `%X' conversion specifications. These conversions print integers in various formats. The `%d' and `%i' conversion specifications both print an numeric argument as a signed decimal number; while `%o', `%u', and `%x' print the argument as an unsigned octal, decimal, or hexadecimal number (respectively). The `%X' conversion specification is just like `%x' except that it uses the characters `ABCDEF' as digits instead of `abcdef'. The following flags are meaningful: `-' Left-justify the result in the field (instead of the normal right-justification). `+' For the signed `%d' and `%i' conversions, print a plus sign if the value is positive. ` ' For the signed `%d' and `%i' conversions, if the result doesn't start with a plus or minus sign, prefix it with a space character instead. Since the `+' flag ensures that the result includes a sign, this flag is ignored if you supply both of them. `#' For the `%o' conversion, this forces the leading digit to be `0', as if by increasing the precision. For `%x' or `%X', this prefixes a leading `0x' or `0X' (respectively) to the result. This doesn't do anything useful for the `%d', `%i', or `%u' conversions. `0' Pad the field with zeros instead of spaces. The zeros are placed after any indication of sign or base. This flag is ignored if the `-' flag is also specified, or if a precision is specified. If a precision is supplied, it specifies the minimum number of digits to appear; leading zeros are produced if necessary. If you don't specify a precision, the number is printed with as many digits as it needs. If you convert a value of zero with an explicit precision of zero, then no characters at all are produced.  File: octave.info, Node: Floating-Point Conversions, Next: Other Output Conversions, Prev: Integer Conversions, Up: C-Style I/O Functions 14.2.9 Floating-Point Conversions --------------------------------- This section discusses the conversion specifications for floating-point numbers: the `%f', `%e', `%E', `%g', and `%G' conversions. The `%f' conversion prints its argument in fixed-point notation, producing output of the form [`-']DDD`.'DDD, where the number of digits following the decimal point is controlled by the precision you specify. The `%e' conversion prints its argument in exponential notation, producing output of the form [`-']D`.'DDD`e'[`+'|`-']DD. Again, the number of digits following the decimal point is controlled by the precision. The exponent always contains at least two digits. The `%E' conversion is similar but the exponent is marked with the letter `E' instead of `e'. The `%g' and `%G' conversions print the argument in the style of `%e' or `%E' (respectively) if the exponent would be less than -4 or greater than or equal to the precision; otherwise they use the `%f' style. Trailing zeros are removed from the fractional portion of the result and a decimal-point character appears only if it is followed by a digit. The following flags can be used to modify the behavior: `-' Left-justify the result in the field. Normally the result is right-justified. `+' Always include a plus or minus sign in the result. ` ' If the result doesn't start with a plus or minus sign, prefix it with a space instead. Since the `+' flag ensures that the result includes a sign, this flag is ignored if you supply both of them. `#' Specifies that the result should always include a decimal point, even if no digits follow it. For the `%g' and `%G' conversions, this also forces trailing zeros after the decimal point to be left in place where they would otherwise be removed. `0' Pad the field with zeros instead of spaces; the zeros are placed after any sign. This flag is ignored if the `-' flag is also specified. The precision specifies how many digits follow the decimal-point character for the `%f', `%e', and `%E' conversions. For these conversions, the default precision is `6'. If the precision is explicitly `0', this suppresses the decimal point character entirely. For the `%g' and `%G' conversions, the precision specifies how many significant digits to print. Significant digits are the first digit before the decimal point, and all the digits after it. If the precision is `0' or not specified for `%g' or `%G', it is treated like a value of `1'. If the value being printed cannot be expressed precisely in the specified number of digits, the value is rounded to the nearest number that fits.  File: octave.info, Node: Other Output Conversions, Next: Formatted Input, Prev: Floating-Point Conversions, Up: C-Style I/O Functions 14.2.10 Other Output Conversions -------------------------------- This section describes miscellaneous conversions for `printf'. The `%c' conversion prints a single character. The `-' flag can be used to specify left-justification in the field, but no other flags are defined, and no precision or type modifier can be given. For example: printf ("%c%c%c%c%c", "h", "e", "l", "l", "o"); prints `hello'. The `%s' conversion prints a string. The corresponding argument must be a string. A precision can be specified to indicate the maximum number of characters to write; otherwise characters in the string up to but not including the terminating null character are written to the output stream. The `-' flag can be used to specify left-justification in the field, but no other flags or type modifiers are defined for this conversion. For example: printf ("%3s%-6s", "no", "where"); prints ` nowhere ' (note the leading and trailing spaces).  File: octave.info, Node: Formatted Input, Next: Input Conversion Syntax, Prev: Other Output Conversions, Up: C-Style I/O Functions 14.2.11 Formatted Input ----------------------- Octave provides the `scanf', `fscanf', and `sscanf' functions to read formatted input. There are two forms of each of these functions. One can be used to extract vectors of data from a file, and the other is more `C-like'. -- Built-in Function: [VAL, COUNT] = fscanf (FID, TEMPLATE, SIZE) -- Built-in Function: [V1, V2, ..., COUNT] = fscanf (FID, TEMPLATE, "C") In the first form, read from FID according to TEMPLATE, returning the result in the matrix VAL. The optional argument SIZE specifies the amount of data to read and may be one of `Inf' Read as much as possible, returning a column vector. `NR' Read up to NR elements, returning a column vector. `[NR, Inf]' Read as much as possible, returning a matrix with NR rows. If the number of elements read is not an exact multiple of NR, the last column is padded with zeros. `[NR, NC]' Read up to `NR * NC' elements, returning a matrix with NR rows. If the number of elements read is not an exact multiple of NR, the last column is padded with zeros. If SIZE is omitted, a value of `Inf' is assumed. A string is returned if TEMPLATE specifies only character conversions. The number of items successfully read is returned in COUNT. In the second form, read from FID according to TEMPLATE, with each conversion specifier in TEMPLATE corresponding to a single scalar return value. This form is more `C-like', and also compatible with previous versions of Octave. The number of successful conversions is returned in COUNT *See also:* *note scanf: doc-scanf, *note sscanf: doc-sscanf, *note fread: doc-fread, *note fprintf: doc-fprintf, *note fgets: doc-fgets, *note fputs: doc-fputs. -- Built-in Function: [VAL, COUNT] = scanf (TEMPLATE, SIZE) -- Built-in Function: [V1, V2, ..., COUNT]] = scanf (TEMPLATE, "C") This is equivalent to calling `fscanf' with FID = `stdin'. It is currently not useful to call `scanf' in interactive programs. *See also:* *note fscanf: doc-fscanf, *note sscanf: doc-sscanf, *note printf: doc-printf. -- Built-in Function: [VAL, COUNT] = sscanf (STRING, TEMPLATE, SIZE) -- Built-in Function: [V1, V2, ..., COUNT] = sscanf (STRING, TEMPLATE, "C") This is like `fscanf', except that the characters are taken from the string STRING instead of from a stream. Reaching the end of the string is treated as an end-of-file condition. *See also:* *note fscanf: doc-fscanf, *note scanf: doc-scanf, *note sprintf: doc-sprintf. Calls to `scanf' are superficially similar to calls to `printf' in that arbitrary arguments are read under the control of a template string. While the syntax of the conversion specifications in the template is very similar to that for `printf', the interpretation of the template is oriented more towards free-format input and simple pattern matching, rather than fixed-field formatting. For example, most `scanf' conversions skip over any amount of "white space" (including spaces, tabs, and newlines) in the input file, and there is no concept of precision for the numeric input conversions as there is for the corresponding output conversions. Ordinarily, non-whitespace characters in the template are expected to match characters in the input stream exactly. When a "matching failure" occurs, `scanf' returns immediately, leaving the first non-matching character as the next character to be read from the stream, and `scanf' returns all the items that were successfully converted. The formatted input functions are not used as frequently as the formatted output functions. Partly, this is because it takes some care to use them properly. Another reason is that it is difficult to recover from a matching error.  File: octave.info, Node: Input Conversion Syntax, Next: Table of Input Conversions, Prev: Formatted Input, Up: C-Style I/O Functions 14.2.12 Input Conversion Syntax ------------------------------- A `scanf' template string is a string that contains ordinary multibyte characters interspersed with conversion specifications that start with `%'. Any whitespace character in the template causes any number of whitespace characters in the input stream to be read and discarded. The whitespace characters that are matched need not be exactly the same whitespace characters that appear in the template string. For example, write ` , ' in the template to recognize a comma with optional whitespace before and after. Other characters in the template string that are not part of conversion specifications must match characters in the input stream exactly; if this is not the case, a matching failure occurs. The conversion specifications in a `scanf' template string have the general form: % FLAGS WIDTH TYPE CONVERSION In more detail, an input conversion specification consists of an initial `%' character followed in sequence by: * An optional "flag character" `*', which says to ignore the text read for this specification. When `scanf' finds a conversion specification that uses this flag, it reads input as directed by the rest of the conversion specification, but it discards this input, does not return any value, and does not increment the count of successful assignments. * An optional decimal integer that specifies the "maximum field width". Reading of characters from the input stream stops either when this maximum is reached or when a non-matching character is found, whichever happens first. Most conversions discard initial whitespace characters, and these discarded characters don't count towards the maximum field width. Conversions that do not discard initial whitespace are explicitly documented. * An optional type modifier character. This character is ignored by Octave's `scanf' function, but is recognized to provide compatibility with the C language `scanf'. * A character that specifies the conversion to be applied. The exact options that are permitted and how they are interpreted vary between the different conversion specifiers. See the descriptions of the individual conversions for information about the particular options that they allow.  File: octave.info, Node: Table of Input Conversions, Next: Numeric Input Conversions, Prev: Input Conversion Syntax, Up: C-Style I/O Functions 14.2.13 Table of Input Conversions ---------------------------------- Here is a table that summarizes the various conversion specifications: `%d' Matches an optionally signed integer written in decimal. *Note Numeric Input Conversions::. `%i' Matches an optionally signed integer in any of the formats that the C language defines for specifying an integer constant. *Note Numeric Input Conversions::. `%o' Matches an unsigned integer written in octal radix. *Note Numeric Input Conversions::. `%u' Matches an unsigned integer written in decimal radix. *Note Numeric Input Conversions::. `%x', `%X' Matches an unsigned integer written in hexadecimal radix. *Note Numeric Input Conversions::. `%e', `%f', `%g', `%E', `%G' Matches an optionally signed floating-point number. *Note Numeric Input Conversions::. `%s' Matches a string containing only non-whitespace characters. *Note String Input Conversions::. `%c' Matches a string of one or more characters; the number of characters read is controlled by the maximum field width given for the conversion. *Note String Input Conversions::. `%%' This matches a literal `%' character in the input stream. No corresponding argument is used. If the syntax of a conversion specification is invalid, the behavior is undefined. If there aren't enough function arguments provided to supply addresses for all the conversion specifications in the template strings that perform assignments, or if the arguments are not of the correct types, the behavior is also undefined. On the other hand, extra arguments are simply ignored.  File: octave.info, Node: Numeric Input Conversions, Next: String Input Conversions, Prev: Table of Input Conversions, Up: C-Style I/O Functions 14.2.14 Numeric Input Conversions --------------------------------- This section describes the `scanf' conversions for reading numeric values. The `%d' conversion matches an optionally signed integer in decimal radix. The `%i' conversion matches an optionally signed integer in any of the formats that the C language defines for specifying an integer constant. For example, any of the strings `10', `0xa', or `012' could be read in as integers under the `%i' conversion. Each of these specifies a number with decimal value `10'. The `%o', `%u', and `%x' conversions match unsigned integers in octal, decimal, and hexadecimal radices, respectively. The `%X' conversion is identical to the `%x' conversion. They both permit either uppercase or lowercase letters to be used as digits. Unlike the C language `scanf', Octave ignores the `h', `l', and `L' modifiers.  File: octave.info, Node: String Input Conversions, Next: Binary I/O, Prev: Numeric Input Conversions, Up: C-Style I/O Functions 14.2.15 String Input Conversions -------------------------------- This section describes the `scanf' input conversions for reading string and character values: `%s' and `%c'. The `%c' conversion is the simplest: it matches a fixed number of characters, always. The maximum field with says how many characters to read; if you don't specify the maximum, the default is 1. This conversion does not skip over initial whitespace characters. It reads precisely the next N characters, and fails if it cannot get that many. The `%s' conversion matches a string of non-whitespace characters. It skips and discards initial whitespace, but stops when it encounters more whitespace after having read something. For example, reading the input: hello, world with the conversion `%10c' produces `" hello, wo"', but reading the same input with the conversion `%10s' produces `"hello,"'.  File: octave.info, Node: Binary I/O, Next: Temporary Files, Prev: String Input Conversions, Up: C-Style I/O Functions 14.2.16 Binary I/O ------------------ Octave can read and write binary data using the functions `fread' and `fwrite', which are patterned after the standard C functions with the same names. They are able to automatically swap the byte order of integer data and convert among the supported floating point formats as the data are read. -- Built-in Function: [VAL, COUNT] = fread (FID, SIZE, PRECISION, SKIP, ARCH) Read binary data of type PRECISION from the specified file ID FID. The optional argument SIZE specifies the amount of data to read and may be one of `Inf' Read as much as possible, returning a column vector. `NR' Read up to NR elements, returning a column vector. `[NR, Inf]' Read as much as possible, returning a matrix with NR rows. If the number of elements read is not an exact multiple of NR, the last column is padded with zeros. `[NR, NC]' Read up to `NR * NC' elements, returning a matrix with NR rows. If the number of elements read is not an exact multiple of NR, the last column is padded with zeros. If SIZE is omitted, a value of `Inf' is assumed. The optional argument PRECISION is a string specifying the type of data to read and may be one of `"schar"' `"signed char"' Signed character. `"uchar"' `"unsigned char"' Unsigned character. `"int8"' `"integer*1"' 8-bit signed integer. `"int16"' `"integer*2"' 16-bit signed integer. `"int32"' `"integer*4"' 32-bit signed integer. `"int64"' `"integer*8"' 64-bit signed integer. `"uint8"' 8-bit unsigned integer. `"uint16"' 16-bit unsigned integer. `"uint32"' 32-bit unsigned integer. `"uint64"' 64-bit unsigned integer. `"single"' `"float32"' `"real*4"' 32-bit floating point number. `"double"' `"float64"' `"real*8"' 64-bit floating point number. `"char"' `"char*1"' Single character. `"short"' Short integer (size is platform dependent). `"int"' Integer (size is platform dependent). `"long"' Long integer (size is platform dependent). `"ushort"' `"unsigned short"' Unsigned short integer (size is platform dependent). `"uint"' `"unsigned int"' Unsigned integer (size is platform dependent). `"ulong"' `"unsigned long"' Unsigned long integer (size is platform dependent). `"float"' Single precision floating point number (size is platform dependent). The default precision is `"uchar"'. The PRECISION argument may also specify an optional repeat count. For example, `32*single' causes `fread' to read a block of 32 single precision floating point numbers. Reading in blocks is useful in combination with the SKIP argument. The PRECISION argument may also specify a type conversion. For example, `int16=>int32' causes `fread' to read 16-bit integer values and return an array of 32-bit integer values. By default, `fread' returns a double precision array. The special form `*TYPE' is shorthand for `TYPE=>TYPE'. The conversion and repeat counts may be combined. For example, the specification `32*single=>single' causes `fread' to read blocks of single precision floating point values and return an array of single precision values instead of the default array of double precision values. The optional argument SKIP specifies the number of bytes to skip after each element (or block of elements) is read. If it is not specified, a value of 0 is assumed. If the final block read is not complete, the final skip is omitted. For example, fread (f, 10, "3*single=>single", 8) will omit the final 8-byte skip because the last read will not be a complete block of 3 values. The optional argument ARCH is a string specifying the data format for the file. Valid values are `"native"' The format of the current machine. `"ieee-be"' IEEE big endian. `"ieee-le"' IEEE little endian. `"vaxd"' VAX D floating format. `"vaxg"' VAX G floating format. `"cray"' Cray floating format. Conversions are currently only supported for `"ieee-be"' and `"ieee-le"' formats. The data read from the file is returned in VAL, and the number of values read is returned in `count' *See also:* *note fwrite: doc-fwrite, *note fopen: doc-fopen, *note fclose: doc-fclose. -- Built-in Function: COUNT = fwrite (FID, DATA, PRECISION, SKIP, ARCH) Write data in binary form of type PRECISION to the specified file ID FID, returning the number of values successfully written to the file. The argument DATA is a matrix of values that are to be written to the file. The values are extracted in column-major order. The remaining arguments PRECISION, SKIP, and ARCH are optional, and are interpreted as described for `fread'. The behavior of `fwrite' is undefined if the values in DATA are too large to fit in the specified precision. *See also:* *note fread: doc-fread, *note fopen: doc-fopen, *note fclose: doc-fclose.  File: octave.info, Node: Temporary Files, Next: EOF and Errors, Prev: Binary I/O, Up: C-Style I/O Functions 14.2.17 Temporary Files ----------------------- Sometimes one needs to write data to a file that is only temporary. This is most commonly used when an external program launched from within Octave needs to access data. When Octave exits all temporary files will be deleted, so this step need not be executed manually. -- Built-in Function: [FID, NAME, MSG] = mkstemp (TEMPLATE, DELETE) Return the file ID corresponding to a new temporary file with a unique name created from TEMPLATE. The last six characters of TEMPLATE must be `XXXXXX' and these are replaced with a string that makes the filename unique. The file is then created with mode read/write and permissions that are system dependent (on GNU/Linux systems, the permissions will be 0600 for versions of glibc 2.0.7 and later). The file is opened with the `O_EXCL' flag. If the optional argument DELETE is supplied and is true, the file will be deleted automatically when Octave exits, or when the function `purge_tmp_files' is called. If successful, FID is a valid file ID, NAME is the name of the file, and MSG is an empty string. Otherwise, FID is -1, NAME is empty, and MSG contains a system-dependent error message. *See also:* *note tmpfile: doc-tmpfile, *note tmpnam: doc-tmpnam, *note P_tmpdir: doc-P_tmpdir. -- Built-in Function: [FID, MSG] = tmpfile () Return the file ID corresponding to a new temporary file with a unique name. The file is opened in binary read/write (`"w+b"') mode. The file will be deleted automatically when it is closed or when Octave exits. If successful, FID is a valid file ID and MSG is an empty string. Otherwise, FID is -1 and MSG contains a system-dependent error message. *See also:* *note tmpnam: doc-tmpnam, *note mkstemp: doc-mkstemp, *note P_tmpdir: doc-P_tmpdir. -- Built-in Function: tmpnam (DIR, PREFIX) Return a unique temporary file name as a string. If PREFIX is omitted, a value of `"oct-"' is used. If DIR is also omitted, the default directory for temporary files is used. If DIR is provided, it must exist, otherwise the default directory for temporary files is used. Since the named file is not opened, by `tmpnam', it is possible (though relatively unlikely) that it will not be available by the time your program attempts to open it. *See also:* *note tmpfile: doc-tmpfile, *note mkstemp: doc-mkstemp, *note P_tmpdir: doc-P_tmpdir.  File: octave.info, Node: EOF and Errors, Next: File Positioning, Prev: Temporary Files, Up: C-Style I/O Functions 14.2.18 End of File and Errors ------------------------------ Once a file has been opened its status can be acquired. As an example the `feof' functions determines if the end of the file has been reached. This can be very useful when reading small parts of a file at a time. The following example shows how to read one line at a time from a file until the end has been reached. filename = "myfile.txt"; fid = fopen (filename, "r"); while (! feof (fid) ) text_line = fgetl (fid); endwhile fclose (fid); Note that in some situations it is more efficient to read the entire contents of a file and then process it, than it is to read it line by line. This has the potential advantage of removing the loop in the above code. -- Built-in Function: feof (FID) Return 1 if an end-of-file condition has been encountered for a given file and 0 otherwise. Note that it will only return 1 if the end of the file has already been encountered, not if the next read operation will result in an end-of-file condition. *See also:* *note fread: doc-fread, *note fopen: doc-fopen, *note fclose: doc-fclose. -- Built-in Function: ferror (FID) Return 1 if an error condition has been encountered for a given file and 0 otherwise. Note that it will only return 1 if an error has already been encountered, not if the next operation will result in an error condition. -- Built-in Function: fclear (FID) Clear the stream state for the specified file. -- Built-in Function: freport () Print a list of which files have been opened, and whether they are open for reading, writing, or both. For example, freport () -| number mode name -| -| 0 r stdin -| 1 w stdout -| 2 w stderr -| 3 r myfile  File: octave.info, Node: File Positioning, Prev: EOF and Errors, Up: C-Style I/O Functions 14.2.19 File Positioning ------------------------ Three functions are available for setting and determining the position of the file pointer for a given file. -- Built-in Function: ftell (FID) Return the position of the file pointer as the number of characters from the beginning of the file FID. *See also:* *note fseek: doc-fseek, *note fopen: doc-fopen, *note fclose: doc-fclose. -- Built-in Function: fseek (FID, OFFSET, ORIGIN) Set the file pointer to any location within the file FID. The pointer is positioned OFFSET characters from the ORIGIN, which may be one of the predefined variables `SEEK_CUR' (current position), `SEEK_SET' (beginning), or `SEEK_END' (end of file) or strings "cof", "bof" or "eof". If ORIGIN is omitted, `SEEK_SET' is assumed. The offset must be zero, or a value returned by `ftell' (in which case ORIGIN must be `SEEK_SET'). Return 0 on success and -1 on error. *See also:* *note ftell: doc-ftell, *note fopen: doc-fopen, *note fclose: doc-fclose. -- Built-in Function: SEEK_SET () -- Built-in Function: SEEK_CUR () -- Built-in Function: SEEK_END () Return the value required to request that `fseek' perform one of the following actions: `SEEK_SET' Position file relative to the beginning. `SEEK_CUR' Position file relative to the current position. `SEEK_END' Position file relative to the end. -- Built-in Function: frewind (FID) Move the file pointer to the beginning of the file FID, returning 0 for success, and -1 if an error was encountered. It is equivalent to `fseek (FID, 0, SEEK_SET)'. The following example stores the current file position in the variable `marker', moves the pointer to the beginning of the file, reads four characters, and then returns to the original position. marker = ftell (myfile); frewind (myfile); fourch = fgets (myfile, 4); fseek (myfile, marker, SEEK_SET);  File: octave.info, Node: Plotting, Next: Matrix Manipulation, Prev: Input and Output, Up: Top 15 Plotting *********** * Menu: * Plotting Basics:: * Advanced Plotting::  File: octave.info, Node: Plotting Basics, Next: Advanced Plotting, Up: Plotting 15.1 Plotting Basics ==================== Octave makes it easy to create many different types of two- and three-dimensional plots using a few high-level functions. If you need finer control over graphics, see *note Advanced Plotting::. * Menu: * Two-Dimensional Plots:: * Three-Dimensional Plotting:: * Plot Annotations:: * Multiple Plots on One Page:: * Multiple Plot Windows:: * Printing Plots:: * Interacting with plots:: * Test Plotting Functions::  File: octave.info, Node: Two-Dimensional Plots, Next: Three-Dimensional Plotting, Up: Plotting Basics 15.1.1 Two-Dimensional Plots ---------------------------- The `plot' function allows you to create simple x-y plots with linear axes. For example, x = -10:0.1:10; plot (x, sin (x)); displays a sine wave shown in *note fig:plot::. On most systems, this command will open a separate plot window to display the graph. [image src="plot.png" text=" +---------------------------------+ | Image unavailable in text mode. | +---------------------------------+ "] Figure 15.1: Simple Two-Dimensional Plot. -- Function File: plot (Y) -- Function File: plot (X, Y) -- Function File: plot (X, Y, PROPERTY, VALUE, ...) -- Function File: plot (X, Y, FMT) -- Function File: plot (H, ...) Produces two-dimensional plots. Many different combinations of arguments are possible. The simplest form is plot (Y) where the argument is taken as the set of Y coordinates and the X coordinates are taken to be the indices of the elements, starting with 1. To save a plot, in one of several image formats such as PostScript or PNG, use the `print' command. If more than one argument is given, they are interpreted as plot (Y, PROPERTY, VALUE, ...) or plot (X, Y, PROPERTY, VALUE, ...) or plot (X, Y, FMT, ...) and so on. Any number of argument sets may appear. The X and Y values are interpreted as follows: * If a single data argument is supplied, it is taken as the set of Y coordinates and the X coordinates are taken to be the indices of the elements, starting with 1. * If the X is a vector and Y is a matrix, then the columns (or rows) of Y are plotted versus X. (using whichever combination matches, with columns tried first.) * If the X is a matrix and Y is a vector, Y is plotted versus the columns (or rows) of X. (using whichever combination matches, with columns tried first.) * If both arguments are vectors, the elements of Y are plotted versus the elements of X. * If both arguments are matrices, the columns of Y are plotted versus the columns of X. In this case, both matrices must have the same number of rows and columns and no attempt is made to transpose the arguments to make the number of rows match. If both arguments are scalars, a single point is plotted. Multiple property-value pairs may be specified, but they must appear in pairs. These arguments are applied to the lines drawn by `plot'. If the FMT argument is supplied, it is interpreted as follows. If FMT is missing, the default gnuplot line style is assumed. `-' Set lines plot style (default). `.' Set dots plot style. `N' Interpreted as the plot color if N is an integer in the range 1 to 6. `NM' If NM is a two digit integer and M is an integer in the range 1 to 6, M is interpreted as the point style. This is only valid in combination with the `@' or `-@' specifiers. `C' If C is one of `"k"' (black), `"r"' (red), `"g"' (green), `"b"' (blue), `"m"' (magenta), `"c"' (cyan), or `"w"' (white), it is interpreted as the line plot color. `";title;"' Here `"title"' is the label for the key. `+' `*' `o' `x' `^' Used in combination with the points or linespoints styles, set the point style. The FMT argument may also be used to assign key titles. To do so, include the desired title between semi-colons after the formatting sequence described above, e.g., "+3;Key Title;" Note that the last semi-colon is required and will generate an error if it is left out. Here are some plot examples: plot (x, y, "@12", x, y2, x, y3, "4", x, y4, "+") This command will plot `y' with points of type 2 (displayed as `+') and color 1 (red), `y2' with lines, `y3' with lines of color 4 (magenta) and `y4' with points displayed as `+'. plot (b, "*", "markersize", 3) This command will plot the data in the variable `b', with points displayed as `*' with a marker size of 3. t = 0:0.1:6.3; plot (t, cos(t), "-;cos(t);", t, sin(t), "+3;sin(t);"); This will plot the cosine and sine functions and label them accordingly in the key. If the first argument is an axis handle, then plot into these axes, rather than the current axis handle returned by `gca'. *See also:* *note semilogx: doc-semilogx, *note semilogy: doc-semilogy, *note loglog: doc-loglog, *note polar: doc-polar, *note mesh: doc-mesh, *note contour: doc-contour, *note bar: doc-bar, *note stairs: doc-stairs, *note errorbar: doc-errorbar, *note xlabel: doc-xlabel, *note ylabel: doc-ylabel, *note title: doc-title, *note print: doc-print. The `plotyy' function may be used to create a plot with two independent y axes. -- Function File: plotyy (X1, Y1, X2, Y2) -- Function File: plotyy (..., FUN) -- Function File: plotyy (..., FUN1, FUN2) -- Function File: plotyy (H, ...) -- Function File: [AX, H1, H2] = plotyy (...) Plots two sets of data with independent y-axes. The arguments X1 and Y1 define the arguments for the first plot and X1 and Y2 for the second. By default the arguments are evaluated with `feval (@plot, X, Y)'. However the type of plot can be modified with the FUN argument, in which case the plots are generated by `feval (FUN, X, Y)'. FUN can be a function handle, an inline function or a string of a function name. The function to use for each of the plots can be independently defined with FUN1 and FUN2. If given, H defines the principal axis in which to plot the X1 and Y1 data. The return value AX is a two element vector with the axis handles of the two plots. H1 and H2 are handles to the objects generated by the plot commands. x = 0:0.1:2*pi; y1 = sin (x); y2 = exp (x - 1); ax = plotyy (x, y1, x - 1, y2, @plot, @semilogy); xlabel ("X"); ylabel (ax(1), "Axis 1"); ylabel (ax(2), "Axis 2"); The functions `semilogx', `semilogy', and `loglog' are similar to the `plot' function, but produce plots in which one or both of the axes use log scales. -- Function File: semilogx (ARGS) Produce a two-dimensional plot using a log scale for the X axis. See the description of `plot' for a description of the arguments that `semilogx' will accept. *See also:* *note plot: doc-plot, *note semilogy: doc-semilogy, *note loglog: doc-loglog. -- Function File: semilogy (ARGS) Produce a two-dimensional plot using a log scale for the Y axis. See the description of `plot' for a description of the arguments that `semilogy' will accept. *See also:* *note plot: doc-plot, *note semilogx: doc-semilogx, *note loglog: doc-loglog. -- Function File: loglog (ARGS) Produce a two-dimensional plot using log scales for both axes. See the description of `plot' for a description of the arguments that `loglog' will accept. *See also:* *note plot: doc-plot, *note semilogx: doc-semilogx, *note semilogy: doc-semilogy. The functions `bar', `barh', `stairs', and `stem' are useful for displaying discrete data. For example, hist (randn (10000, 1), 30); produces the histogram of 10,000 normally distributed random numbers shown in *note fig:hist::. [image src="hist.png" text=" +---------------------------------+ | Image unavailable in text mode. | +---------------------------------+ "] Figure 15.2: Histogram. -- Function File: bar (X, Y) -- Function File: bar (Y) -- Function File: bar (X, Y, W) -- Function File: bar (X, Y, W, STYLE) -- Function File: H = bar (..., PROP, VAL) -- Function File: bar (H, ...) Produce a bar graph from two vectors of x-y data. If only one argument is given, it is taken as a vector of y-values and the x coordinates are taken to be the indices of the elements. The default width of 0.8 for the bars can be changed using W. If Y is a matrix, then each column of Y is taken to be a separate bar graph plotted on the same graph. By default the columns are plotted side-by-side. This behavior can be changed by the STYLE argument, which can take the values `"grouped"' (the default), or `"stacked"'. The optional return value H provides a handle to the "bar series" object with one handle per column of the variable Y. This series allows common elements of the group of bar series objects to be changed in a single bar series and the same properties are changed in the other "bar series". For example h = bar (rand (5, 10)); set (h(1), "basevalue", 0.5); changes the position on the base of all of the bar series. The optional input handle H allows an axis handle to be passed. Properties of the patch graphics object can be changed using PROP, VAL pairs. *See also:* *note barh: doc-barh, *note plot: doc-plot. -- Function File: barh (X, Y) -- Function File: barh (Y) -- Function File: barh (X, Y, W) -- Function File: barh (X, Y, W, STYLE) -- Function File: H = barh (..., PROP, VAL) -- Function File: barh (H, ...) Produce a horizontal bar graph from two vectors of x-y data. If only one argument is given, it is taken as a vector of y-values and the x coordinates are taken to be the indices of the elements. The default width of 0.8 for the bars can be changed using W. If Y is a matrix, then each column of Y is taken to be a separate bar graph plotted on the same graph. By default the columns are plotted side-by-side. This behavior can be changed by the STYLE argument, which can take the values `"grouped"' (the default), or `"stacked"'. The optional return value H provides a handle to the bar series object. See `bar' for a description of the use of the bar series. The optional input handle H allows an axis handle to be passed. Properties of the patch graphics object can be changed using PROP, VAL pairs. *See also:* *note bar: doc-bar, *note plot: doc-plot. -- Function File: hist (Y, X, NORM) Produce histogram counts or plots. With one vector input argument, plot a histogram of the values with 10 bins. The range of the histogram bins is determined by the range of the data. With one matrix input argument, plot a histogram where each bin contains a bar per input column. Given a second scalar argument, use that as the number of bins. Given a second vector argument, use that as the centers of the bins, with the width of the bins determined from the adjacent values in the vector. If third argument is provided, the histogram is normalized such that the sum of the bars is equal to NORM. Extreme values are lumped in the first and last bins. With two output arguments, produce the values NN and XX such that `bar (XX, NN)' will plot the histogram. *See also:* *note bar: doc-bar. -- Function File: stairs (X, Y) -- Function File: stairs (..., STYLE) -- Function File: stairs (..., PROP, VAL) -- Function File: stairs (H, ...) -- Function File: H = stairs (...) Produce a stairstep plot. The arguments may be vectors or matrices. If only one argument is given, it is taken as a vector of y-values and the x coordinates are taken to be the indices of the elements. If two output arguments are specified, the data are generated but not plotted. For example, stairs (x, y); and [xs, ys] = stairs (x, y); plot (xs, ys); are equivalent. *See also:* *note plot: doc-plot, *note semilogx: doc-semilogx, *note semilogy: doc-semilogy, *note loglog: doc-loglog, *note polar: doc-polar, *note mesh: doc-mesh, *note contour: doc-contour, *note bar: doc-bar, *note xlabel: doc-xlabel, *note ylabel: doc-ylabel, *note title: doc-title. -- Function File: H = stem (X, Y, LINESPEC) -- Function File: H = stem (..., "filled") Plot a stem graph from two vectors of x-y data. If only one argument is given, it is taken as the y-values and the x coordinates are taken from the indices of the elements. If Y is a matrix, then each column of the matrix is plotted as a separate stem graph. In this case X can either be a vector, the same length as the number of rows in Y, or it can be a matrix of the same size as Y. The default color is `"r"' (red). The default line style is `"-"' and the default marker is `"o"'. The line style can be altered by the `linespec' argument in the same manner as the `plot' command. For example x = 1:10; y = ones (1, length (x))*2.*x; stem (x, y, "b"); plots 10 stems with heights from 2 to 20 in blue; The return value of `stem' is a vector if "stem series" graphics handles, with one handle per column of the variable Y. This handle regroups the elements of the stem graph together as the children of the "stem series" handle, allowing them to be altered together. For example x = [0 : 10].'; y = [sin(x), cos(x)] h = stem (x, y); set (h(2), "color", "g"); set (h(1), "basevalue", -1) changes the color of the second "stem series" and moves the base line of the first. *See also:* *note bar: doc-bar, *note barh: doc-barh, *note plot: doc-plot. -- Function File: H = stem3 (X, Y, Z, LINESPEC) Plot a three-dimensional stem graph and return the handles of the line and marker objects used to draw the stems as "stem series" object. The default color is `"r"' (red). The default line style is `"-"' and the default marker is `"o"'. For example, theta = 0:0.2:6; stem3 (cos (theta), sin (theta), theta) plots 31 stems with heights from 0 to 6 lying on a circle. Color definitions with rgb-triples are not valid! *See also:* *note bar: doc-bar, *note barh: doc-barh, *note stem: doc-stem, *note plot: doc-plot. -- Function File: scatter (X, Y, S, C) -- Function File: scatter (..., 'filled') -- Function File: scatter (..., STYLE) -- Function File: scatter (..., PROP, VAL) -- Function File: scatter (H, ...) -- Function File: H = scatter (...) Plot a scatter plot of the data. A marker is plotted at each point defined by the points in the vectors X and Y. The size of the markers used is determined by the S, which can be a scalar, a vector of the same length of X and Y. If S is not given or is an empty matrix, then the default value of 8 points is used. The color of the markers is determined by C, which can be a string defining a fixed color, a 3 element vector giving the red, green and blue components of the color, a vector of the same length as X that gives a scaled index into the current colormap, or a N-by-3 matrix defining the colors of each of the markers individually. The marker to use can be changed with the STYLE argument, that is a string defining a marker in the same manner as the `plot' command. If the argument 'filled' is given then the markers as filled. All additional arguments are passed to the underlying patch command. The optional return value H provides a handle to the patch object x = randn (100, 1); y = randn (100, 1); scatter (x, y, [], sqrt(x.^2 + y.^2)); *See also:* *note plot: doc-plot, *note patch: doc-patch, *note scatter3: doc-scatter3. -- Function File: scatter3 (X, Y, Z, S, C) -- Function File: scatter3 (..., 'filled') -- Function File: scatter3 (..., STYLE) -- Function File: scatter3 (..., PROP, VAL) -- Function File: scatter3 (H, ...) -- Function File: H = scatter3 (...) Plot a scatter plot of the data in 3D. A marker is plotted at each point defined by the points in the vectors X, Y and Z. The size of the markers used is determined by S, which can be a scalar or a vector of the same length of X, Y and Z. If S is not given or is an empty matrix, then the default value of 8 points is used. The color of the markers is determined by C, which can be a string defining a fixed color, a 3 element vector giving the red, green and blue components of the color, a vector of the same length as X that gives a scaled index into the current colormap, or a N-by-3 matrix defining the colors of each of the markers individually. The marker to use can be changed with the STYLE argument, that is a string defining a marker in the same manner as the `plot' command. If the argument 'filled' is given then the markers as filled. All additional arguments are passed to the underlying patch command. The optional return value H provides a handle to the patch object [x, y, z] = peaks (20); scatter3 (x(:), y(:), z(:), [], z(:)); *See also:* *note plot: doc-plot, *note patch: doc-patch, *note scatter: doc-scatter. -- Function File: plotmatrix (X, Y) -- Function File: plotmatrix (X) -- Function File: plotmatrix (..., STYLE) -- Function File: plotmatrix (H, ...) -- Function File: [H, AX, BIGAX, P, PAX] = plotmatrix (...) Scatter plot of the columns of one matrix against another. Given the arguments X and Y, that have a matching number of rows, `plotmatrix' plots a set of axes corresponding to plot (X (:, i), Y (:, j) Given a single argument X, then this is equivalent to plotmatrix (X, X) except that the diagonal of the set of axes will be replaced with the histogram `hist (X (:, i))'. The marker to use can be changed with the STYLE argument, that is a string defining a marker in the same manner as the `plot' command. If a leading axes handle H is passed to `plotmatrix', then this axis will be used for the plot. The optional return value H provides handles to the individual graphics objects in the scatter plots, whereas AX returns the handles to the scatter plot axis objects. BIGAX is a hidden axis object that surrounds the other axes, such that the commands `xlabel', `title', etc., will be associated with this hidden axis. Finally P returns the graphics objects associated with the histogram and PAX the corresponding axes objects. plotmatrix (randn (100, 3), 'g+') -- Function File: pareto (X) -- Function File: pareto (X, Y) -- Function File: pareto (H, ...) -- Function File: H = pareto (...) Draw a Pareto chart, also called ABC chart. A Pareto chart is a bar graph used to arrange information in such a way that priorities for process improvement can be established. It organizes and displays information to show the relative importance of data. The chart is similar to the histogram or bar chart, except that the bars are arranged in decreasing order from left to right along the abscissa. The fundamental idea (Pareto principle) behind the use of Pareto diagrams is that the majority of an effect is due to a small subset of the causes, so for quality improvement the first few (as presented on the diagram) contributing causes to a problem usually account for the majority of the result. Thus, targeting these "major causes" for elimination results in the most cost-effective improvement scheme. The data are passed as X and the abscissa as Y. If Y is absent, then the abscissa are assumed to be `1 : length (X)'. Y can be a string array, a cell array of strings or a numerical vector. An example of the use of `pareto' is Cheese = {"Cheddar", "Swiss", "Camembert", ... "Munster", "Stilton", "Blue"}; Sold = [105, 30, 70, 10, 15, 20]; pareto(Sold, Cheese); -- Function File: rose (TH, R) -- Function File: rose (H, ...) -- Function File: H = rose (...) -- Function File: [R, TH] = rose (...) Plot an angular histogram. With one vector argument TH, plots the histogram with 20 angular bins. If TH is a matrix, then each column of TH produces a separate histogram. If R is given and is a scalar, then the histogram is produced with R bins. If R is a vector, then the center of each bin are defined by the values of R. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). If two output arguments are requested, then rather than plotting the histogram, the polar vectors necessary to plot the histogram are returned. [r, t] = rose ([2*randn(1e5,1), pi + 2 * randn(1e5,1)]); polar (r, t); *See also:* *note plot: doc-plot, *note compass: doc-compass, *note polar: doc-polar, *note hist: doc-hist. The `contour', `contourf' and `contourc' functions produce two-dimensional contour plots from three-dimensional data. -- Function File: contour (Z) -- Function File: contour (Z, VN) -- Function File: contour (X, Y, Z) -- Function File: contour (X, Y, Z, VN) -- Function File: contour (..., STYLE) -- Function File: contour (H, ...) -- Function File: [C, H] = contour (...) Plot level curves (contour lines) of the matrix Z, using the contour matrix C computed by `contourc' from the same arguments; see the latter for their interpretation. The set of contour levels, C, is only returned if requested. For example: x = 0:2; y = x; z = x' * y; contour (x, y, z, 2:3) The style to use for the plot can be defined with a line style STYLE in a similar manner to the line styles used with the `plot' command. Any markers defined by STYLE are ignored. The optional input and output argument H allows an axis handle to be passed to `contour' and the handles to the contour objects to be returned. *See also:* *note contourc: doc-contourc, *note patch: doc-patch, *note plot: doc-plot. -- Function File: [C, H] = contourf (X, Y, Z, LVL) -- Function File: [C, H] = contourf (X, Y, Z, N) -- Function File: [C, H] = contourf (X, Y, Z) -- Function File: [C, H] = contourf (Z, N) -- Function File: [C, H] = contourf (Z, LVL) -- Function File: [C, H] = contourf (Z) -- Function File: [C, H] = contourf (AX, ...) -- Function File: [C, H] = contourf (..., "PROPERTY", VAL) Compute and plot filled contours of the matrix Z. Parameters X, Y and N or LVL are optional. The return value C is a 2xn matrix containing the contour lines as described in the help to the contourc function. The return value H is handle-vector to the patch objects creating the filled contours. If X and Y are omitted they are taken as the row/column index of Z. N is a scalar denoting the number of lines to compute. Alternatively LVL is a vector containing the contour levels. If only one value (e.g., lvl0) is wanted, set LVL to [lvl0, lvl0]. If both N or LVL are omitted a default value of 10 contour level is assumed. If provided, the filled contours are added to the axes object AX instead of the current axis. The following example plots filled contours of the `peaks' function. [x, y, z] = peaks (50); contourf (x, y, z, -7:9) *See also:* *note contour: doc-contour, *note contourc: doc-contourc, *note patch: doc-patch. -- Function File: [C, LEV] = contourc (X, Y, Z, VN) Compute isolines (contour lines) of the matrix Z. Parameters X, Y and VN are optional. The return value LEV is a vector of the contour levels. The return value C is a 2 by N matrix containing the contour lines in the following format C = [lev1, x1, x2, ..., levn, x1, x2, ... len1, y1, y2, ..., lenn, y1, y2, ...] in which contour line N has a level (height) of LEVN and length of LENN. If X and Y are omitted they are taken as the row/column index of Z. VN is either a scalar denoting the number of lines to compute or a vector containing the values of the lines. If only one value is wanted, set `VN = [val, val]'; If VN is omitted it defaults to 10. For example, x = 0:2; y = x; z = x' * y; contourc (x, y, z, 2:3) => 2.0000 2.0000 1.0000 3.0000 1.5000 2.0000 2.0000 1.0000 2.0000 2.0000 2.0000 1.5000 *See also:* *note contour: doc-contour. -- Function File: contour3 (Z) -- Function File: contour3 (Z, VN) -- Function File: contour3 (X, Y, Z) -- Function File: contour3 (X, Y, Z, VN) -- Function File: contour3 (..., STYLE) -- Function File: contour3 (H, ...) -- Function File: [C, H] = contour3 (...) Plot level curves (contour lines) of the matrix Z, using the contour matrix C computed by `contourc' from the same arguments; see the latter for their interpretation. The contours are plotted at the Z level corresponding to their contour. The set of contour levels, C, is only returned if requested. For example: contour3 (peaks (19)); hold on surface (peaks (19), "facecolor", "none", "EdgeColor", "black") colormap hot The style to use for the plot can be defined with a line style STYLE in a similar manner to the line styles used with the `plot' command. Any markers defined by STYLE are ignored. The optional input and output argument H allows an axis handle to be passed to `contour' and the handles to the contour objects to be returned. *See also:* *note contourc: doc-contourc, *note patch: doc-patch, *note plot: doc-plot. The `errorbar', `semilogxerr', `semilogyerr', and `loglogerr' functions produce plots with error bar markers. For example, x = 0:0.1:10; y = sin (x); yp = 0.1 .* randn (size (x)); ym = -0.1 .* randn (size (x)); errorbar (x, sin (x), ym, yp); produces the figure shown in *note fig:errorbar::. [image src="errorbar.png" text=" +---------------------------------+ | Image unavailable in text mode. | +---------------------------------+ "] Figure 15.3: Errorbar plot. -- Function File: errorbar (ARGS) This function produces two-dimensional plots with errorbars. Many different combinations of arguments are possible. The simplest form is errorbar (Y, EY) where the first argument is taken as the set of Y coordinates and the second argument EY is taken as the errors of the Y values. X coordinates are taken to be the indices of the elements, starting with 1. If more than two arguments are given, they are interpreted as errorbar (X, Y, ..., FMT, ...) where after X and Y there can be up to four error parameters such as EY, EX, LY, UY, etc., depending on the plot type. Any number of argument sets may appear, as long as they are separated with a format string FMT. If Y is a matrix, X and error parameters must also be matrices having same dimensions. The columns of Y are plotted versus the corresponding columns of X and errorbars are drawn from the corresponding columns of error parameters. If FMT is missing, yerrorbars ("~") plot style is assumed. If the FMT argument is supplied, it is interpreted as in normal plots. In addition the following plot styles are supported by errorbar: `~' Set yerrorbars plot style (default). `>' Set xerrorbars plot style. `~>' Set xyerrorbars plot style. `#' Set boxes plot style. `#~' Set boxerrorbars plot style. `#~>' Set boxxyerrorbars plot style. Examples: errorbar (X, Y, EX, ">") produces an xerrorbar plot of Y versus X with X errorbars drawn from X-EX to X+EX. errorbar (X, Y1, EY, "~", X, Y2, LY, UY) produces yerrorbar plots with Y1 and Y2 versus X. Errorbars for Y1 are drawn from Y1-EY to Y1+EY, errorbars for Y2 from Y2-LY to Y2+UY. errorbar (X, Y, LX, UX, LY, UY, "~>") produces an xyerrorbar plot of Y versus X in which X errorbars are drawn from X-LX to X+UX and Y errorbars from Y-LY to Y+UY. *See also:* *note semilogxerr: doc-semilogxerr, *note semilogyerr: doc-semilogyerr, *note loglogerr: doc-loglogerr. -- Function File: semilogxerr (ARGS) Produce two-dimensional plots on a semilogarithm axis with errorbars. Many different combinations of arguments are possible. The most used form is semilogxerr (X, Y, EY, FMT) which produces a semi-logarithm plot of Y versus X with errors in the Y-scale defined by EY and the plot format defined by FMT. See errorbar for available formats and additional information. *See also:* *note errorbar: doc-errorbar, *note loglogerr: doc-loglogerr, *note semilogyerr: doc-semilogyerr. -- Function File: semilogyerr (ARGS) Produce two-dimensional plots on a semilogarithm axis with errorbars. Many different combinations of arguments are possible. The most used form is semilogyerr (X, Y, EY, FMT) which produces a semi-logarithm plot of Y versus X with errors in the Y-scale defined by EY and the plot format defined by FMT. See errorbar for available formats and additional information. *See also:* *note errorbar: doc-errorbar, *note loglogerr: doc-loglogerr, *note semilogxerr: doc-semilogxerr. -- Function File: loglogerr (ARGS) Produce two-dimensional plots on double logarithm axis with errorbars. Many different combinations of arguments are possible. The most used form is loglogerr (X, Y, EY, FMT) which produces a double logarithm plot of Y versus X with errors in the Y-scale defined by EY and the plot format defined by FMT. See errorbar for available formats and additional information. *See also:* *note errorbar: doc-errorbar, *note semilogxerr: doc-semilogxerr, *note semilogyerr: doc-semilogyerr. Finally, the `polar' function allows you to easily plot data in polar coordinates. However, the display coordinates remain rectangular and linear. For example, polar (0:0.1:10*pi, 0:0.1:10*pi); produces the spiral plot shown in *note fig:polar::. [image src="polar.png" text=" +---------------------------------+ | Image unavailable in text mode. | +---------------------------------+ "] Figure 15.4: Polar plot. -- Function File: polar (THETA, RHO, FMT) Make a two-dimensional plot given the polar coordinates THETA and RHO. The optional third argument specifies the line type. *See also:* *note plot: doc-plot. -- Function File: pie (Y) -- Function File: pie (Y, EXPLODE) -- Function File: pie (..., LABELS) -- Function File: pie (H, ...); -- Function File: H = pie (...); Produce a pie chart. Called with a single vector argument, produces a pie chart of the elements in X, with the size of the slice determined by percentage size of the values of X. The variable EXPLODE is a vector of the same length as X that if non zero 'explodes' the slice from the pie chart. If given LABELS is a cell array of strings of the same length as X, giving the labels of each of the slices of the pie chart. The optional return value H provides a handle to the patch object. *See also:* *note bar: doc-bar, *note stem: doc-stem. -- Function File: quiver (U, V) -- Function File: quiver (X, Y, U, V) -- Function File: quiver (..., S) -- Function File: quiver (..., STYLE) -- Function File: quiver (..., 'filled') -- Function File: quiver (H, ...) -- Function File: H = quiver (...) Plot the `(U, V)' components of a vector field in an `(X, Y)' meshgrid. If the grid is uniform, you can specify X and Y as vectors. If X and Y are undefined they are assumed to be `(1:M, 1:N)' where `[M, N] = size(U)'. The variable S is a scalar defining a scaling factor to use for the arrows of the field relative to the mesh spacing. A value of 0 disables all scaling. The default value is 1. The style to use for the plot can be defined with a line style STYLE in a similar manner to the line styles used with the `plot' command. If a marker is specified then markers at the grid points of the vectors are printed rather than arrows. If the argument 'filled' is given then the markers as filled. The optional return value H provides a quiver group that regroups the components of the quiver plot (body, arrow and marker), and allows them to be changed together [x, y] = meshgrid (1:2:20); h = quiver (x, y, sin (2*pi*x/10), sin (2*pi*y/10)); set (h, "maxheadsize", 0.33); *See also:* *note plot: doc-plot. -- Function File: quiver3 (U, V, W) -- Function File: quiver3 (X, Y, Z, U, V, W) -- Function File: quiver3 (..., S) -- Function File: quiver3 (..., STYLE) -- Function File: quiver3 (..., 'filled') -- Function File: quiver3 (H, ...) -- Function File: H = quiver3 (...) Plot the `(U, V, W)' components of a vector field in an `(X, Y), Z' meshgrid. If the grid is uniform, you can specify X, Y Z as vectors. If X, Y and Z are undefined they are assumed to be `(1:M, 1:N, 1:P)' where `[M, N] = size(U)' and `P = max (size (W))'. The variable S is a scalar defining a scaling factor to use for the arrows of the field relative to the mesh spacing. A value of 0 disables all scaling. The default value is 1. The style to use for the plot can be defined with a line style STYLE in a similar manner to the line styles used with the `plot' command. If a marker is specified then markers at the grid points of the vectors are printed rather than arrows. If the argument 'filled' is given then the markers as filled. The optional return value H provides a quiver group that regroups the components of the quiver plot (body, arrow and marker), and allows them to be changed together [x, y, z] = peaks (25); surf (x, y, z); hold on; [u, v, w] = surfnorm (x, y, z / 10); h = quiver3 (x, y, z, u, v, w); set (h, "maxheadsize", 0.33); *See also:* *note plot: doc-plot. -- Function File: compass (U, V) -- Function File: compass (Z) -- Function File: compass (..., STYLE) -- Function File: compass (H, ...) -- Function File: H = compass (...) Plot the `(U, V)' components of a vector field emanating from the origin of a polar plot. If a single complex argument Z is given, then `U = real (Z)' and `V = imag (Z)'. The style to use for the plot can be defined with a line style STYLE in a similar manner to the line styles used with the `plot' command. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). a = toeplitz([1;randn(9,1)],[1,randn(1,9)]); compass (eig (a)) *See also:* *note plot: doc-plot, *note polar: doc-polar, *note quiver: doc-quiver, *note feather: doc-feather. -- Function File: feather (U, V) -- Function File: feather (Z) -- Function File: feather (..., STYLE) -- Function File: feather (H, ...) -- Function File: H = feather (...) Plot the `(U, V)' components of a vector field emanating from equidistant points on the x-axis. If a single complex argument Z is given, then `U = real (Z)' and `V = imag (Z)'. The style to use for the plot can be defined with a line style STYLE in a similar manner to the line styles used with the `plot' command. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). phi = [0 : 15 : 360] * pi / 180; feather (sin (phi), cos (phi)) *See also:* *note plot: doc-plot, *note quiver: doc-quiver, *note compass: doc-compass. -- Function File: pcolor (X, Y, C) -- Function File: pcolor (C) Density plot for given matrices X, and Y from `meshgrid' and a matrix C corresponding to the X and Y coordinates of the mesh's vertices. If X and Y are vectors, then a typical vertex is (X(j), Y(i), C(i,j)). Thus, columns of C correspond to different X values and rows of C correspond to different Y values. The `colormap' is scaled to the extents of C. Limits may be placed on the color axis by the command `caxis', or by setting the `clim' property of the parent axis. The face color of each cell of the mesh is determined by interpolating the values of C for the cell's vertices. Contrast this with `imagesc' which renders one cell for each element of C. `shading' modifies an attribute determining the manner by which the face color of each cell is interpolated from the values of C, and the visibility of the cells' edges. By default the attribute is "faceted", which renders a single color for each cell's face with the edge visible. H is the handle to the surface object. *See also:* *note caxis: doc-caxis, *note contour: doc-contour, *note meshgrid: doc-meshgrid, *note imagesc: doc-imagesc, *note shading: doc-shading. -- Function File: area (X, Y) -- Function File: area (X, Y, LVL) -- Function File: area (..., PROP, VAL, ...) -- Function File: area (Y, ...) -- Function File: area (H, ...) -- Function File: H = area (...) Area plot of cumulative sum of the columns of Y. This shows the contributions of a value to a sum, and is functionally similar to `plot (X, cumsum (Y, 2))', except that the area under the curve is shaded. If the X argument is omitted it is assumed to be given by `1 : rows (Y)'. A value LVL can be defined that determines where the base level of the shading under the curve should be defined. Additional arguments to the `area' function are passed to the `patch'. The optional return value H provides a handle to area series object representing the patches of the areas. *See also:* *note plot: doc-plot, *note patch: doc-patch. -- Function File: comet (Y) -- Function File: comet (X, Y) -- Function File: comet (X, Y, P) -- Function File: comet (AX, ...) Produce a simple comet style animation along the trajectory provided by the input coordinate vectors (X, Y), where X will default to the indices of Y. The speed of the comet may be controlled by P, which represents the time which passes as the animation passes from one point to the next. The default for P is 0.1 seconds. If AX is specified the animation is produced in that axis rather than the `gca'. The axis function may be used to change the axis limits of an existing plot and various other axis properties, such as the aspect ratio and the appearance of tic marks. -- Function File: axis (LIMITS) Set axis limits for plots. The argument LIMITS should be a 2, 4, or 6 element vector. The first and second elements specify the lower and upper limits for the x axis. The third and fourth specify the limits for the y-axis, and the fifth and sixth specify the limits for the z-axis. Without any arguments, `axis' turns autoscaling on. With one output argument, `x = axis' returns the current axes The vector argument specifying limits is optional, and additional string arguments may be used to specify various axis properties. For example, axis ([1, 2, 3, 4], "square"); forces a square aspect ratio, and axis ("labely", "tic"); turns tic marks on for all axes and tic mark labels on for the y-axis only. The following options control the aspect ratio of the axes. `"square"' Force a square aspect ratio. `"equal"' Force x distance to equal y-distance. `"normal"' Restore the balance. The following options control the way axis limits are interpreted. `"auto"' Set the specified axes to have nice limits around the data or all if no axes are specified. `"manual"' Fix the current axes limits. `"tight"' Fix axes to the limits of the data. The option `"image"' is equivalent to `"tight"' and `"equal"'. The following options affect the appearance of tic marks. `"on"' Turn tic marks and labels on for all axes. `"off"' Turn tic marks off for all axes. `"tic[xyz]"' Turn tic marks on for all axes, or turn them on for the specified axes and off for the remainder. `"label[xyz]"' Turn tic labels on for all axes, or turn them on for the specified axes and off for the remainder. `"nolabel"' Turn tic labels off for all axes. Note, if there are no tic marks for an axis, there can be no labels. The following options affect the direction of increasing values on the axes. `"ij"' Reverse y-axis, so lower values are nearer the top. `"xy"' Restore y-axis, so higher values are nearer the top. If an axes handle is passed as the first argument, then operate on this axes rather than the current axes. Similarly the axis limits of the colormap can be changed with the caxis function. -- Function File: caxis (LIMITS) -- Function File: caxis (H, ...) Set color axis limits for plots. The argument LIMITS should be a 2 element vector specifying the lower and upper limits to assign to the first and last value in the colormap. Values outside this range are clamped to the first and last colormap entries. If LIMITS is 'auto', then automatic colormap scaling is applied, whereas if LIMITS is 'manual' the colormap scaling is set to manual. Called without any arguments to current color axis limits are returned. If an axes handle is passed as the first argument, then operate on this axes rather than the current axes. The `xlim', `ylim', and `zlim' functions may be used to get or set individual axis limits. Each has the same form. -- Function File: XL = xlim () -- Function File: xlim (XL) -- Function File: M = xlim ('mode') -- Function File: xlim (M) -- Function File: xlim (H, ...) Get or set the limits of the x-axis of the current plot. Called without arguments `xlim' returns the x-axis limits of the current plot. If passed a two element vector XL, the limits of the x-axis are set to this value. The current mode for calculation of the x-axis can be returned with a call `xlim ('mode')', and can be either 'auto' or 'manual'. The current plotting mode can be set by passing either 'auto' or 'manual' as the argument. If passed an handle as the first argument, then operate on this handle rather than the current axes handle. *See also:* *note ylim: doc-ylim, *note zlim: doc-zlim, *note set: doc-set, *note get: doc-get, *note gca: doc-gca. * Menu: * Two-dimensional Function Plotting::  File: octave.info, Node: Two-dimensional Function Plotting, Up: Two-Dimensional Plots 15.1.1.1 Two-dimensional Function Plotting .......................................... Octave can plot a function from a function handle inline function or string defining the function without the user needing to explicitly create the data to be plotted. The function `fplot' also generates two-dimensional plots with linear axes using a function name and limits for the range of the x-coordinate instead of the x and y data. For example, fplot (@sin, [-10, 10], 201); produces a plot that is equivalent to the one above, but also includes a legend displaying the name of the plotted function. -- Function File: fplot (FN, LIMITS) -- Function File: fplot (FN, LIMITS, TOL) -- Function File: fplot (FN, LIMITS, N) -- Function File: fplot (..., FMT) Plot a function FN, within the defined limits. FN an be either a string, a function handle or an inline function. The limits of the plot are given by LIMITS of the form `[XLO, XHI]' or `[XLO, XHI, YLO, YHI]'. TOL is the default tolerance to use for the plot, and if TOL is an integer it is assumed that it defines the number points to use in the plot. The FMT argument is passed to the plot command. fplot ("cos", [0, 2*pi]) fplot ("[cos(x), sin(x)]", [0, 2*pi]) *See also:* *note plot: doc-plot. Other functions that can create two-dimensional plots directly from a function include `ezplot', `ezcontour', `ezcontourf' and `ezpolar'. -- Function File: ezplot (F) -- Function File: ezplot (FX, FY) -- Function File: ezplot (..., DOM) -- Function File: ezplot (..., N) -- Function File: ezplot (H, ...) -- Function File: H = ezplot (...) Plots in two-dimensions the curve defined by F. The function F may be a string, inline function or function handle and can have either one or two variables. If F has one variable, then the function is plotted over the domain `-2*pi < X < 2*pi' with 500 points. If F has two variables then `F(X,Y) = 0' is calculated over the meshed domain `-2*pi < X | Y < 2*pi' with 60 by 60 in the mesh. For example ezplot (@(X, Y) X .^ 2 - Y .^ 2 - 1) If two functions are passed as strings, inline functions or function handles, then the parametric function X = FX (T) Y = FY (T) is plotted over the domain `-2*pi < T < 2*pi' with 500 points. If DOM is a two element vector, it represents the minimum and maximum value of X, Y and T. If it is a four element vector, then the minimum and maximum values of X and T are determined by the first two elements and the minimum and maximum of Y by the second pair of elements. N is a scalar defining the number of points to use in plotting the function. The optional return value H provides a list of handles to the the line objects plotted. *See also:* *note plot: doc-plot, *note ezplot3: doc-ezplot3. -- Function File: ezcontour (F) -- Function File: ezcontour (..., DOM) -- Function File: ezcontour (..., N) -- Function File: ezcontour (H, ...) -- Function File: H = ezcontour (...) Plots the contour lines of a function. F is a string, inline function or function handle with two arguments defining the function. By default the plot is over the domain `-2*pi < X < 2*pi' and `-2*pi < Y < 2*pi' with 60 points in each dimension. If DOM is a two element vector, it represents the minimum and maximum value of both X and Y. If DOM is a four element vector, then the minimum and maximum value of X and Y are specify separately. N is a scalar defining the number of points to use in each dimension. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). f = @(x,y) sqrt(abs(x .* y)) ./ (1 + x.^2 + y.^2); ezcontour (f, [-3, 3]); *See also:* *note ezplot: doc-ezplot, *note ezcontourf: doc-ezcontourf, *note ezsurfc: doc-ezsurfc, *note ezmeshc: doc-ezmeshc. -- Function File: ezcontourf (F) -- Function File: ezcontourf (..., DOM) -- Function File: ezcontourf (..., N) -- Function File: ezcontourf (H, ...) -- Function File: H = ezcontourf (...) Plots the filled contour lines of a function. F is a string, inline function or function handle with two arguments defining the function. By default the plot is over the domain `-2*pi < X < 2*pi' and `-2*pi < Y < 2*pi' with 60 points in each dimension. If DOM is a two element vector, it represents the minimum and maximum value of both X and Y. If DOM is a four element vector, then the minimum and maximum value of X and Y are specify separately. N is a scalar defining the number of points to use in each dimension. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). f = @(x,y) sqrt(abs(x .* y)) ./ (1 + x.^2 + y.^2); ezcontourf (f, [-3, 3]); *See also:* *note ezplot: doc-ezplot, *note ezcontour: doc-ezcontour, *note ezsurfc: doc-ezsurfc, *note ezmeshc: doc-ezmeshc. -- Function File: ezpolar (F) -- Function File: ezpolar (..., DOM) -- Function File: ezpolar (..., N) -- Function File: ezpolar (H, ...) -- Function File: H = ezpolar (...) Plots in polar plot defined by a function. The function F is either a string, inline function or function handle with one arguments defining the function. By default the plot is over the domain `0 < X < 2*pi' with 60 points. If DOM is a two element vector, it represents the minimum and maximum value of both T. N is a scalar defining the number of points to use. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). ezpolar (@(t) 1 + sin (t)); *See also:* *note polar: doc-polar, *note ezplot: doc-ezplot, *note ezsurf: doc-ezsurf, *note ezmesh: doc-ezmesh.  File: octave.info, Node: Three-Dimensional Plotting, Next: Plot Annotations, Prev: Two-Dimensional Plots, Up: Plotting Basics 15.1.2 Three-Dimensional Plotting --------------------------------- The function `mesh' produces mesh surface plots. For example, tx = ty = linspace (-8, 8, 41)'; [xx, yy] = meshgrid (tx, ty); r = sqrt (xx .^ 2 + yy .^ 2) + eps; tz = sin (r) ./ r; mesh (tx, ty, tz); produces the familiar "sombrero" plot shown in *note fig:mesh::. Note the use of the function `meshgrid' to create matrices of X and Y coordinates to use for plotting the Z data. The `ndgrid' function is similar to `meshgrid', but works for N-dimensional matrices. [image src="mesh.png" text=" +---------------------------------+ | Image unavailable in text mode. | +---------------------------------+ "] Figure 15.5: Mesh plot. The `meshc' function is similar to `mesh', but also produces a plot of contours for the surface. The `plot3' function displays arbitrary three-dimensional data, without requiring it to form a surface. For example t = 0:0.1:10*pi; r = linspace (0, 1, numel (t)); z = linspace (0, 1, numel (t)); plot3 (r.*sin(t), r.*cos(t), z); displays the spiral in three dimensions shown in *note fig:plot3::. [image src="plot3.png" text=" +---------------------------------+ | Image unavailable in text mode. | +---------------------------------+ "] Figure 15.6: Three dimensional spiral. Finally, the `view' function changes the viewpoint for three-dimensional plots. -- Function File: mesh (X, Y, Z) Plot a mesh given matrices X, and Y from `meshgrid' and a matrix Z corresponding to the X and Y coordinates of the mesh. If X and Y are vectors, then a typical vertex is (X(j), Y(i), Z(i,j)). Thus, columns of Z correspond to different X values and rows of Z correspond to different Y values. *See also:* *note meshgrid: doc-meshgrid, *note contour: doc-contour. -- Function File: meshc (X, Y, Z) Plot a mesh and contour given matrices X, and Y from `meshgrid' and a matrix Z corresponding to the X and Y coordinates of the mesh. If X and Y are vectors, then a typical vertex is (X(j), Y(i), Z(i,j)). Thus, columns of Z correspond to different X values and rows of Z correspond to different Y values. *See also:* *note meshgrid: doc-meshgrid, *note mesh: doc-mesh, *note contour: doc-contour. -- Function File: meshz (X, Y, Z) Plot a curtain mesh given matrices X, and Y from `meshgrid' and a matrix Z corresponding to the X and Y coordinates of the mesh. If X and Y are vectors, then a typical vertex is (X(j), Y(i), Z(i,j)). Thus, columns of Z correspond to different X values and rows of Z correspond to different Y values. *See also:* *note meshgrid: doc-meshgrid, *note mesh: doc-mesh, *note contour: doc-contour. -- Function File: hidden (MODE) -- Function File: hidden () Manipulation the mesh hidden line removal. Called with no argument the hidden line removal is toggled. The argument MODE can be either 'on' or 'off' and the set of the hidden line removal is set accordingly. *See also:* *note mesh: doc-mesh, *note meshc: doc-meshc, *note surf: doc-surf. -- Function File: surf (X, Y, Z) Plot a surface given matrices X, and Y from `meshgrid' and a matrix Z corresponding to the X and Y coordinates of the mesh. If X and Y are vectors, then a typical vertex is (X(j), Y(i), Z(i,j)). Thus, columns of Z correspond to different X values and rows of Z correspond to different Y values. *See also:* *note mesh: doc-mesh, *note surface: doc-surface. -- Function File: surfc (X, Y, Z) Plot a surface and contour given matrices X, and Y from `meshgrid' and a matrix Z corresponding to the X and Y coordinates of the mesh. If X and Y are vectors, then a typical vertex is (X(j), Y(i), Z(i,j)). Thus, columns of Z correspond to different X values and rows of Z correspond to different Y values. *See also:* *note meshgrid: doc-meshgrid, *note surf: doc-surf, *note contour: doc-contour. -- Function File: surfl (X, Y, Z) -- Function File: surfl (Z) -- Function File: surfl (X, Y, Z, L) -- Function File: surfl (X, Y, Z, L, P) -- Function File: surfl (...,"light") Plot a lighted surface given matrices X, and Y from `meshgrid' and a matrix Z corresponding to the X and Y coordinates of the mesh. If X and Y are vectors, then a typical vertex is (X(j), Y(i), Z(i,j)). Thus, columns of Z correspond to different X values and rows of Z correspond to different Y values. The light direction can be specified using L. It can be given as 2-element vector [azimuth, elevation] in degrees or as 3-element vector [lx, ly, lz]. The default value is rotated 45° counter-clockwise from the current view. The material properties of the surface can specified using a 4-element vector P = [AM D SP EXP] which defaults to P = [0.55 0.6 0.4 10]. `"AM" strength of ambient light' `"D" strength of diffuse reflection' `"SP" strength of specular reflection' `"EXP" specular exponent' The default lighting mode "cdata", changes the cdata property to give the impression of a lighted surface. Please note: the alternative "light" mode, which creates a light object to illuminate the surface is not implemented (yet). Example: colormap(bone); surfl(peaks); shading interp; *See also:* *note surf: doc-surf, *note diffuse: doc-diffuse, *note specular: doc-specular, *note surface: doc-surface. -- Function File: surfnorm (X, Y, Z) -- Function File: surfnorm (Z) -- Function File: [NX, NY, NZ] = surfnorm (...) -- Function File: surfnorm (H, ...) Find the vectors normal to a meshgridded surface. The meshed gridded surface is defined by X, Y, and Z. If X and Y are not defined, then it is assumed that they are given by [X, Y] = meshgrid (1:size(Z, 1), 1:size(Z, 2)); If no return arguments are requested, a surface plot with the normal vectors to the surface is plotted. Otherwise the components of the normal vectors at the mesh gridded points are returned in NX, NY, and NZ. The normal vectors are calculated by taking the cross product of the diagonals of each of the quadrilaterals in the meshgrid to find the normal vectors of the centers of these quadrilaterals. The four nearest normal vectors to the meshgrid points are then averaged to obtain the normal to the surface at the meshgridded points. An example of the use of `surfnorm' is surfnorm (peaks (25)); *See also:* *note surf: doc-surf, *note quiver3: doc-quiver3. -- Function File: diffuse (SX, SY, SZ, L) Calculate diffuse reflection strength of a surface defined by the normal vector elements SX, SY, SZ. The light vector can be specified using parameter L. It can be given as 2-element vector [azimuth, elevation] in degrees or as 3-element vector [lx, ly, lz]. *See also:* *note specular: doc-specular, *note surfl: doc-surfl. -- Function File: specular (SX, SY, SZ, L, V) -- Function File: specular (SX, SY, SZ, L, V, SE) Calculate specular reflection strength of a surface defined by the normal vector elements SX, SY, SZ using Phong's approximation. The light and view vectors can be specified using parameter L and V respectively. Both can be given as 2-element vectors [azimuth, elevation] in degrees or as 3-element vector [x, y, z]. An optional 6th argument describes the specular exponent (spread) SE. *See also:* *note surfl: doc-surfl, *note diffuse: doc-diffuse. -- Function File: [XX, YY, ZZ] = meshgrid (X, Y, Z) -- Function File: [XX, YY] = meshgrid (X, Y) -- Function File: [XX, YY] = meshgrid (X) Given vectors of X and Y and Z coordinates, and returning 3 arguments, return three-dimensional arrays corresponding to the X, Y, and Z coordinates of a mesh. When returning only 2 arguments, return matrices corresponding to the X and Y coordinates of a mesh. The rows of XX are copies of X, and the columns of YY are copies of Y. If Y is omitted, then it is assumed to be the same as X, and Z is assumed the same as Y. *See also:* *note mesh: doc-mesh, *note contour: doc-contour. -- Function File: [Y1, Y2, ..., Yn] = ndgrid (X1, X2, ..., Xn) -- Function File: [Y1, Y2, ..., Yn] = ndgrid (X) Given n vectors X1, ... Xn, `ndgrid' returns n arrays of dimension n. The elements of the i-th output argument contains the elements of the vector Xi repeated over all dimensions different from the i-th dimension. Calling ndgrid with only one input argument X is equivalent of calling ndgrid with all n input arguments equal to X: [Y1, Y2, ..., Yn] = ndgrid (X, ..., X) *See also:* *note meshgrid: doc-meshgrid. -- Function File: plot3 (ARGS) Produce three-dimensional plots. Many different combinations of arguments are possible. The simplest form is plot3 (X, Y, Z) in which the arguments are taken to be the vertices of the points to be plotted in three dimensions. If all arguments are vectors of the same length, then a single continuous line is drawn. If all arguments are matrices, then each column of the matrices is treated as a separate line. No attempt is made to transpose the arguments to make the number of rows match. If only two arguments are given, as plot3 (X, C) the real and imaginary parts of the second argument are used as the Y and Z coordinates, respectively. If only one argument is given, as plot3 (C) the real and imaginary parts of the argument are used as the Y and Z values, and they are plotted versus their index. Arguments may also be given in groups of three as plot3 (X1, Y1, Z1, X2, Y2, Z2, ...) in which each set of three arguments is treated as a separate line or set of lines in three dimensions. To plot multiple one- or two-argument groups, separate each group with an empty format string, as plot3 (X1, C1, "", C2, "", ...) An example of the use of `plot3' is z = [0:0.05:5]; plot3 (cos(2*pi*z), sin(2*pi*z), z, ";helix;"); plot3 (z, exp(2i*pi*z), ";complex sinusoid;"); *See also:* *note plot: doc-plot, *note xlabel: doc-xlabel, *note ylabel: doc-ylabel, *note zlabel: doc-zlabel, *note title: doc-title, *note print: doc-print. -- Function File: view (AZIMUTH, ELEVATION) -- Function File: view (DIMS) -- Function File: [AZIMUTH, ELEVATION] = view () Set or get the viewpoint for the current axes. -- Function File: slice (X, Y, Z, V, SX, SY, SZ) -- Function File: slice (X, Y, Z, V, XI, YI, ZI) -- Function File: slice (V, SX, SY, SZ) -- Function File: slice (V, XI, YI, ZI) -- Function File: H = slice (...) -- Function File: H = slice (..., METHOD) Plot slices of 3D data/scalar fields. Each element of the 3-dimensional array V represents a scalar value at a location given by the parameters X, Y, and Z. The parameters X, X, and Z are either 3-dimensional arrays of the same size as the array V in the "meshgrid" format or vectors. The parameters XI, etc. respect a similar format to X, etc., and they represent the points at which the array VI is interpolated using interp3. The vectors SX, SY, and SZ contain points of orthogonal slices of the respective axes. If X, Y, Z are omitted, they are assumed to be `x = 1:size (V, 2)', `y = 1:size (V, 1)' and `z = 1:size (V, 3)'. METHOD is one of: `"nearest"' Return the nearest neighbor. `"linear"' Linear interpolation from nearest neighbors. `"cubic"' Cubic interpolation from four nearest neighbors (not implemented yet). `"spline"' Cubic spline interpolation--smooth first and second derivatives throughout the curve. The default method is `"linear"'. The optional return value H is a vector of handles to the surface graphic objects. Examples: [x, y, z] = meshgrid (linspace (-8, 8, 32)); v = sin (sqrt (x.^2 + y.^2 + z.^2)) ./ (sqrt (x.^2 + y.^2 + z.^2)); slice (x, y, z, v, [], 0, []); [xi, yi] = meshgrid (linspace (-7, 7)); zi = xi + yi; slice (x, y, z, v, xi, yi, zi); *See also:* *note interp3: doc-interp3, *note surface: doc-surface, *note pcolor: doc-pcolor. -- Function File: ribbon (X, Y, WIDTH) -- Function File: ribbon (Y) -- Function File: H = ribbon (...) Plot a ribbon plot for the columns of Y vs. X. The optional parameter WIDTH specifies the width of a single ribbon (default is 0.75). If X is omitted, a vector containing the row numbers is assumed (1:rows(Y)). If requested, return a vector H of the handles to the surface objects. *See also:* *note gca: doc-gca, *note colorbar: doc-colorbar. -- Function File: shading (TYPE) -- Function File: shading (AX, ...) Set the shading of surface or patch graphic objects. Valid arguments for TYPE are `"flat"' Single colored patches with invisible edges. `"faceted"' Single colored patches with visible edges. `"interp"' Color between patch vertices are interpolated and the patch edges are invisible. If AX is given the shading is applied to axis AX instead of the current axis. * Menu: * Three-dimensional Function Plotting:: * Three-dimensional Geometric Shapes::  File: octave.info, Node: Three-dimensional Function Plotting, Next: Three-dimensional Geometric Shapes, Up: Three-Dimensional Plotting 15.1.2.1 Three-dimensional Function Plotting ............................................ -- Function File: ezplot3 (FX, FY, FZ) -- Function File: ezplot3 (..., DOM) -- Function File: ezplot3 (..., N) -- Function File: ezplot3 (H, ...) -- Function File: H = ezplot3 (...) Plots in three-dimensions the curve defined parametrically. FX, FY, and FZ are strings, inline functions or function handles with one arguments defining the function. By default the plot is over the domain `-2*pi < X < 2*pi' with 60 points. If DOM is a two element vector, it represents the minimum and maximum value of T. N is a scalar defining the number of points to use. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). fx = @(t) cos (t); fy = @(t) sin (t); fz = @(t) t; ezplot3 (fx, fy, fz, [0, 10*pi], 100); *See also:* *note plot3: doc-plot3, *note ezplot: doc-ezplot, *note ezsurf: doc-ezsurf, *note ezmesh: doc-ezmesh. -- Function File: ezmesh (F) -- Function File: ezmesh (FX, FY, FZ) -- Function File: ezmesh (..., DOM) -- Function File: ezmesh (..., N) -- Function File: ezmesh (..., 'circ') -- Function File: ezmesh (H, ...) -- Function File: H = ezmesh (...) Plots the mesh defined by a function. F is a string, inline function or function handle with two arguments defining the function. By default the plot is over the domain `-2*pi < X < 2*pi' and `-2*pi < Y < 2*pi' with 60 points in each dimension. If DOM is a two element vector, it represents the minimum and maximum value of both X and Y. If DOM is a four element vector, then the minimum and maximum value of X and Y are specify separately. N is a scalar defining the number of points to use in each dimension. If three functions are passed, then plot the parametrically defined function `[FX (S, T), FY (S, T), FZ (S, T)]'. If the argument 'circ' is given, then the function is plotted over a disk centered on the middle of the domain DOM. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). f = @(x,y) sqrt(abs(x .* y)) ./ (1 + x.^2 + y.^2); ezmesh (f, [-3, 3]); An example of a parametrically defined function is fx = @(s,t) cos (s) .* cos(t); fy = @(s,t) sin (s) .* cos(t); fz = @(s,t) sin(t); ezmesh (fx, fy, fz, [-pi, pi, -pi/2, pi/2], 20); *See also:* *note ezplot: doc-ezplot, *note ezsurf: doc-ezsurf, *note ezsurfc: doc-ezsurfc, *note ezmeshc: doc-ezmeshc. -- Function File: ezmeshc (F) -- Function File: ezmeshc (FX, FY, FZ) -- Function File: ezmeshc (..., DOM) -- Function File: ezmeshc (..., N) -- Function File: ezmeshc (..., 'circ') -- Function File: ezmeshc (H, ...) -- Function File: H = ezmeshc (...) Plots the mesh and contour lines defined by a function. F is a string, inline function or function handle with two arguments defining the function. By default the plot is over the domain `-2*pi < X < 2*pi' and `-2*pi < Y < 2*pi' with 60 points in each dimension. If DOM is a two element vector, it represents the minimum and maximum value of both X and Y. If DOM is a four element vector, then the minimum and maximum value of X and Y are specify separately. N is a scalar defining the number of points to use in each dimension. If three functions are passed, then plot the parametrically defined function `[FX (S, T), FY (S, T), FZ (S, T)]'. If the argument 'circ' is given, then the function is plotted over a disk centered on the middle of the domain DOM. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). f = @(x,y) sqrt(abs(x .* y)) ./ (1 + x.^2 + y.^2); ezmeshc (f, [-3, 3]); *See also:* *note ezplot: doc-ezplot, *note ezsurfc: doc-ezsurfc, *note ezsurf: doc-ezsurf, *note ezmesh: doc-ezmesh. -- Function File: ezsurf (F) -- Function File: ezsurf (FX, FY, FZ) -- Function File: ezsurf (..., DOM) -- Function File: ezsurf (..., N) -- Function File: ezsurf (..., 'circ') -- Function File: ezsurf (H, ...) -- Function File: H = ezsurf (...) Plots the surface defined by a function. F is a string, inline function or function handle with two arguments defining the function. By default the plot is over the domain `-2*pi < X < 2*pi' and `-2*pi < Y < 2*pi' with 60 points in each dimension. If DOM is a two element vector, it represents the minimum and maximum value of both X and Y. If DOM is a four element vector, then the minimum and maximum value of X and Y are specify separately. N is a scalar defining the number of points to use in each dimension. If three functions are passed, then plot the parametrically defined function `[FX (S, T), FY (S, T), FZ (S, T)]'. If the argument 'circ' is given, then the function is plotted over a disk centered on the middle of the domain DOM. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). f = @(x,y) sqrt(abs(x .* y)) ./ (1 + x.^2 + y.^2); ezsurf (f, [-3, 3]); An example of a parametrically defined function is fx = @(s,t) cos (s) .* cos(t); fy = @(s,t) sin (s) .* cos(t); fz = @(s,t) sin(t); ezsurf (fx, fy, fz, [-pi, pi, -pi/2, pi/2], 20); *See also:* *note ezplot: doc-ezplot, *note ezmesh: doc-ezmesh, *note ezsurfc: doc-ezsurfc, *note ezmeshc: doc-ezmeshc. -- Function File: ezsurfc (F) -- Function File: ezsurfc (FX, FY, FZ) -- Function File: ezsurfc (..., DOM) -- Function File: ezsurfc (..., N) -- Function File: ezsurfc (..., 'circ') -- Function File: ezsurfc (H, ...) -- Function File: H = ezsurfc (...) Plots the surface and contour lines defined by a function. F is a string, inline function or function handle with two arguments defining the function. By default the plot is over the domain `-2*pi < X < 2*pi' and `-2*pi < Y < 2*pi' with 60 points in each dimension. If DOM is a two element vector, it represents the minimum and maximum value of both X and Y. If DOM is a four element vector, then the minimum and maximum value of X and Y are specify separately. N is a scalar defining the number of points to use in each dimension. If three functions are passed, then plot the parametrically defined function `[FX (S, T), FY (S, T), FZ (S, T)]'. If the argument 'circ' is given, then the function is plotted over a disk centered on the middle of the domain DOM. The optional return value H provides a list of handles to the the parts of the vector field (body, arrow and marker). f = @(x,y) sqrt(abs(x .* y)) ./ (1 + x.^2 + y.^2); ezsurfc (f, [-3, 3]); *See also:* *note ezplot: doc-ezplot, *note ezmeshc: doc-ezmeshc, *note ezsurf: doc-ezsurf, *note ezmesh: doc-ezmesh.  File: octave.info, Node: Three-dimensional Geometric Shapes, Prev: Three-dimensional Function Plotting, Up: Three-Dimensional Plotting 15.1.2.2 Three-dimensional Geometric Shapes ........................................... -- Function File: cylinder -- Function File: cylinder (R) -- Function File: cylinder (R, N) -- Function File: [X, Y, Z] = cylinder (...) -- Function File: cylinder (AX, ...) Generates three matrices in `meshgrid' format, such that `surf (X, Y, Z)' generates a unit cylinder. The matrices are of size `N+1'-by-`N+1'. R is a vector containing the radius along the z-axis. If N or R are omitted then default values of 20 or [1 1] are assumed. Called with no return arguments, `cylinder' calls directly `surf (X, Y, Z)'. If an axes handle AX is passed as the first argument, the surface is plotted to this set of axes. Examples: disp ("plotting a cone") [x, y, z] = cylinder (10:-1:0,50); surf (x, y, z); *See also:* *note sphere: doc-sphere. -- Function File: [X, Y, Z] = sphere (N) -- Function File: sphere (H, ...) Generates three matrices in `meshgrid' format, such that `surf (X, Y, Z)' generates a unit sphere. The matrices of `N+1'-by-`N+1'. If N is omitted then a default value of 20 is assumed. Called with no return arguments, `sphere' call directly `surf (X, Y, Z)'. If an axes handle is passed as the first argument, the surface is plotted to this set of axes. *See also:* *note peaks: doc-peaks. -- Function File: [X, Y, Z] = ellipsoid (XC,YC, ZC, XR, YR, ZR, N) -- Function File: ellipsoid (H, ...) Generate three matrices in `meshgrid' format that define an ellipsoid. Called with no return arguments, `ellipsoid' calls directly `surf (X, Y, Z)'. If an axes handle is passed as the first argument, the surface is plotted to this set of axes. *See also:* *note sphere: doc-sphere.  File: octave.info, Node: Plot Annotations, Next: Multiple Plots on One Page, Prev: Three-Dimensional Plotting, Up: Plotting Basics 15.1.3 Plot Annotations ----------------------- You can add titles, axis labels, legends, and arbitrary text to an existing plot. For example, x = -10:0.1:10; plot (x, sin (x)); title ("sin(x) for x = -10:0.1:10"); xlabel ("x"); ylabel ("sin (x)"); text (pi, 0.7, "arbitrary text"); legend ("sin (x)"); The functions `grid' and `box' may also be used to add grid and border lines to the plot. By default, the grid is off and the border lines are on. -- Function File: title (TITLE) -- Function File: title (TITLE, P1, V1, ...) Create a title object and return a handle to it. -- Function File: legend (ST1, ST2, ...) -- Function File: legend (ST1, ST2, ..., "location", POS) -- Function File: legend (MATSTR) -- Function File: legend (MATSTR, "location", POS) -- Function File: legend (CELL) -- Function File: legend (CELL, "location", POS) -- Function File: legend ('FUNC') Display a legend for the current axes using the specified strings as labels. Legend entries may be specified as individual character string arguments, a character array, or a cell array of character strings. Legend works on line graphs, bar graphs, etc. A plot must exist before legend is called. The optional parameter POS specifies the location of the legend as follows: north center top south center bottom east right center west left center northeast right top (default) northwest left top southeast right bottom southwest left bottom outside can be appended to any location string Some specific functions are directly available using FUNC: "show" Show legends from the plot "hide" "off" Hide legends from the plot "boxon" Draw a box around legends "boxoff" Withdraw the box around legends "left" Text is to the left of the keys "right" Text is to the right of the keys -- Function File: H = text (X, Y, LABEL) -- Function File: H = text (X, Y, Z, LABEL) -- Function File: H = text (X, Y, LABEL, P1, V1, ...) -- Function File: H = text (X, Y, Z, LABEL, P1, V1, ...) Create a text object with text LABEL at position X, Y, Z on the current axes. Property-value pairs following LABEL may be used to specify the appearance of the text. See *note Text Properties:: for the properties that you can set. -- Function File: xlabel (STRING) -- Function File: ylabel (STRING) -- Function File: zlabel (STRING) -- Function File: xlabel (H, STRING) Specify x, y, and z axis labels for the current figure. If H is specified then label the axis defined by H. *See also:* *note plot: doc-plot, *note semilogx: doc-semilogx, *note semilogy: doc-semilogy, *note loglog: doc-loglog, *note polar: doc-polar, *note mesh: doc-mesh, *note contour: doc-contour, *note bar: doc-bar, *note stairs: doc-stairs, *note title: doc-title. -- Function File: clabel (C, H) -- Function File: clabel (C, H, V) -- Function File: clabel (C, H, "manual") -- Function File: clabel (C) -- Function File: clabel (C, H) -- Function File: clabel (..., PROP, VAL, ...) -- Function File: H = clabel (...) Adds labels to the contours of a contour plot. The contour plot is specified by the contour matrix C and optionally the contourgroup object H that are returned by `contour', `contourf' and `contour3'. The contour labels are rotated and placed in the contour itself. By default, all contours are labelled. However, the contours to label can be specified by the vector V. If the "manual" argument is given then the contours to label can be selected with the mouse. Additional property/value pairs that are valid properties of text objects can be given and are passed to the underlying text objects. Additionally, the property "LabelSpacing" is available allowing the spacing between labels on a contour (in points) to be specified. The default is 144 points, or 2 inches. The returned value H is the set of text object that represent the contour labels. The "userdata" property of the text objects contains the numerical value of the contour label. An example of the use of `clabel' is [c, h] = contour (peaks(), -4 : 6); clabel (c, h, -4 : 2 : 6, 'fontsize', 12); *See also:* *note contour: doc-contour, *note contourf: doc-contourf, *note contour3: doc-contour3, *note meshc: doc-meshc, *note surfc: doc-surfc, *note text: doc-text. -- Function File: box (ARG) -- Function File: box (H, ...) Control the display of a border around the plot. The argument may be either `"on"' or `"off"'. If it is omitted, the current box state is toggled. *See also:* *note grid: doc-grid. -- Function File: grid (ARG) -- Function File: grid ("minor", ARG2) -- Function File: grid (HAX, ...) Force the display of a grid on the plot. The argument may be either `"on"', or `"off"'. If it is omitted, the current grid state is toggled. If ARG is `"minor"' then the minor grid is toggled. When using a minor grid a second argument ARG2 is allowed, which can be either `"on"' or `"off"' to explicitly set the state of the minor grid. If the first argument is an axis handle, HAX, operate on the specified axis object. *See also:* *note plot: doc-plot. -- Function File: colorbar (S) -- Function File: colorbar ("peer", H, ...) Adds a colorbar to the current axes. Valid values for S are "EastOutside" Place the colorbar outside the plot to the right. This is the default. "East" Place the colorbar inside the plot to the right. "WestOutside" Place the colorbar outside the plot to the left. "West" Place the colorbar inside the plot to the left. "NorthOutside" Place the colorbar above the plot. "North" Place the colorbar at the top of the plot. "SouthOutside" Place the colorbar under the plot. "South" Place the colorbar at the bottom of the plot. "Off", "None" Remove any existing colorbar from the plot. If the argument "peer" is given, then the following argument is treated as the axes handle on which to add the colorbar.  File: octave.info, Node: Multiple Plots on One Page, Next: Multiple Plot Windows, Prev: Plot Annotations, Up: Plotting Basics 15.1.4 Multiple Plots on One Page --------------------------------- Octave can display more than one plot in a single figure. The simplest way to do this is to use the `subplot' function to divide the plot area into a series of subplot windows that are indexed by an integer. For example, subplot (2, 1, 1) fplot (@sin, [-10, 10]); subplot (2, 1, 2) fplot (@cos, [-10, 10]); creates a figure with two separate axes, one displaying a sine wave and the other a cosine wave. The first call to subplot divides the figure into two plotting areas (two rows and one column) and makes the first plot area active. The grid of plot areas created by `subplot' is numbered in column-major order (top to bottom, left to right). -- Function File: subplot (ROWS, COLS, INDEX) -- Function File: subplot (RCN) Set up a plot grid with COLS by ROWS subwindows and plot in location given by INDEX. If only one argument is supplied, then it must be a three digit value specifying the location in digits 1 (rows) and 2 (columns) and the plot index in digit 3. The plot index runs row-wise. First all the columns in a row are filled and then the next row is filled. For example, a plot with 2 by 3 grid will have plot indices running as follows: +-----+-----+-----+ | 1 | 2 | 3 | +-----+-----+-----+ | 4 | 5 | 6 | +-----+-----+-----+ *See also:* *note plot: doc-plot.  File: octave.info, Node: Multiple Plot Windows, Next: Printing Plots, Prev: Multiple Plots on One Page, Up: Plotting Basics 15.1.5 Multiple Plot Windows ---------------------------- You can open multiple plot windows using the `figure' function. For example figure (1); fplot (@sin, [-10, 10]); figure (2); fplot (@cos, [-10, 10]); creates two figures, with the first displaying a sine wave and the second a cosine wave. Figure numbers must be positive integers. -- Function File: figure (N) -- Function File: figure (N, PROPERTY, VALUE, ...) Set the current plot window to plot window N. If no arguments are specified, the next available window number is chosen. Multiple property-value pairs may be specified for the figure, but they must appear in pairs.  File: octave.info, Node: Printing Plots, Next: Interacting with plots, Prev: Multiple Plot Windows, Up: Plotting Basics 15.1.6 Printing Plots --------------------- The `print' command allows you to save plots in a variety of formats. For example, print -deps foo.eps writes the current figure to an encapsulated PostScript file called `foo.eps'. -- Function File: print (FILENAME, OPTIONS) -- Function File: print (H, FILENAME, OPTIONS) Print a graph, or save it to a file FILENAME defines the file name of the output file. If no filename is specified, output is sent to the printer. H specifies the figure handle. If no handle is specified the handle for the current figure is used. OPTIONS: `-PPRINTER' Set the PRINTER name to which the graph is sent if no FILENAME is specified. `-GGHOSTSCRIPT_COMMAND' Specify the command for calling Ghostscript. For Unix and Windows, the defaults are 'gs' and 'gswin32c', respectively. `-color' `-mono' Monochrome or color lines. `-solid' `-dashed' Solid or dashed lines. `-portrait' `-landscape' Plot orientation, as returned by "orient". `-dDEVICE' Output device, where DEVICE is one of: `ps' `ps2' `psc' `psc2' Postscript (level 1 and 2, mono and color) `eps' `eps2' `epsc' `epsc2' Encapsulated postscript (level 1 and 2, mono and color) `tex' `epslatex' `epslatexstandalone' `pstex' `pslatex' Generate a LaTeX (or TeX) file for labels, and eps/ps for graphics. The file produced by `epslatexstandalone' can be processed directly by LaTeX. The other formats are intended to be included in a LaTeX (or TeX) document. The `tex' device is the same as the `epslatex' device. `ill' `aifm' Adobe Illustrator `cdr' `corel' CorelDraw `dxf' AutoCAD `emf' `meta' Microsoft Enhanced Metafile `fig' XFig. If this format is selected the additional options `-textspecial' or `-textnormal' can be used to control whether the special flag should be set for the text in the figure (default is `-textnormal'). `hpgl' HP plotter language `mf' Metafont `png' Portable network graphics `jpg' `jpeg' JPEG image `gif' GIF image `pbm' PBMplus `svg' Scalable vector graphics `pdf' Portable document format If the device is omitted, it is inferred from the file extension, or if there is no filename it is sent to the printer as postscript. `-dGS_DEVICE' Additional devices are supported by Ghostscript. Some examples are; `ljet2p' HP LaserJet IIP `ljet3' HP LaserJet III `deskjet' HP DeskJet and DeskJet Plus `cdj550' HP DeskJet 550C `paintjet' HP PointJet `pcx24b' 24-bit color PCX file format `ppm' Portable Pixel Map file format For a complete list, type `system ("gs -h")' to see what formats and devices are available. For output sent to a printer, the size is determined by the figure's "papersize" property. For output to a file the, size is determined by the "paperposition" property. `-rNUM' Resolution of bitmaps in pixels per inch. For both metafiles and SVG the default is the screen resolution, for other it is 150 dpi. To specify screen resolution, use "-r0". `-tight' Forces a tight bounding box for eps-files. Since the ghostscript devices are conversion of an eps-file, this option works the those devices as well. `-SXSIZE,YSIZE' Plot size in pixels for EMF, GIF, JPEG, PBM, PNG and SVG. If using the command form of the print function, you must quote the XSIZE,YSIZE option. For example, by writing `"-S640,480"'. The size defaults to that specified by the figure's paperposition property. `-FFONTNAME' `-FFONTNAME:SIZE' `-F:SIZE' FONTNAME set the postscript font (for use with postscript, aifm, corel and fig). By default, 'Helvetica' is set for PS/Aifm, and 'SwitzerlandLight' for Corel. It can also be 'Times-Roman'. SIZE is given in points. FONTNAME is ignored for the fig device. The filename and options can be given in any order. -- Function File: orient (ORIENTATION) Set the default print orientation. Valid values for ORIENTATION include `"landscape"' and `"portrait"'. If called with no arguments, return the default print orientation.  File: octave.info, Node: Interacting with plots, Next: Test Plotting Functions, Prev: Printing Plots, Up: Plotting Basics 15.1.7 Interacting with plots ----------------------------- The user can select points on a plot with the `ginput' function or selection the position at which to place text on the plot with the `gtext' function using the mouse. -- Function File: [X, Y, BUTTONS] = ginput (N) Return which mouse buttons were pressed and keys were hit on the current figure. If N is defined, then wait for N mouse clicks before returning. If N is not defined, then `ginput' will loop until the return key is pressed. -- Function File: B = waitforbuttonpress () Wait for button or mouse press.over a figure window. The value of B returns 0 if a mouse button was pressed or 1 is a key was pressed. *See also:* *note ginput: doc-ginput. -- Function File: gtext (S) -- Function File: gtext (..., PROP, VAL) Place text on the current figure. The text can be defined by the string S. If S is a cell array, each element of the cell array is written to a separate line. Additional arguments are passed to the underlying text object as properties. *See also:* *note ginput: doc-ginput.  File: octave.info, Node: Test Plotting Functions, Prev: Interacting with plots, Up: Plotting Basics 15.1.8 Test Plotting Functions ------------------------------ The functions `sombrero' and `peaks' provide a way to check that plotting is working. Typing either `sombrero' or `peaks' at the Octave prompt should display a three-dimensional plot. -- Function File: sombrero (N) Produce the familiar three-dimensional sombrero plot using N grid lines. If N is omitted, a value of 41 is assumed. The function plotted is z = sin (sqrt (x^2 + y^2)) / (sqrt (x^2 + y^2)) *See also:* *note surf: doc-surf, *note meshgrid: doc-meshgrid, *note mesh: doc-mesh. -- Function File: peaks () -- Function File: peaks (N) -- Function File: peaks (X, Y) -- Function File: Z = peaks (...) -- Function File: [X, Y, Z] = peaks (...) Generate a function with lots of local maxima and minima. The function has the form f(x,y) = 3*(1-x)^2*exp(-x^2 - (y+1)^2) ... - 10*(x/5 - x^3 - y^5)*exp(-x^2-y^2) ... - 1/3*exp(-(x+1)^2 - y^2) Called without a return argument, `peaks' plots the surface of the above function using `mesh'. If N is a scalar, the `peaks' returns the values of the above function on a N-by-N mesh over the range `[-3,3]'. The default value for N is 49. If N is a vector, then it represents the X and Y values of the grid on which to calculate the above function. The X and Y values can be specified separately. *See also:* *note surf: doc-surf, *note mesh: doc-mesh, *note meshgrid: doc-meshgrid.  File: octave.info, Node: Advanced Plotting, Prev: Plotting Basics, Up: Plotting 15.2 Advanced Plotting ====================== * Menu: * Graphics Objects:: * Graphics Object Properties:: * Managing Default Properties:: * Colors:: * Line Styles:: * Marker Styles:: * Callbacks:: * Object Groups:: * Graphics backends::  File: octave.info, Node: Graphics Objects, Next: Graphics Object Properties, Up: Advanced Plotting 15.2.1 Graphics Objects ----------------------- Plots in Octave are constructed from the following "graphics objects". Each graphics object has a set of properties that define its appearance and may also contain links to other graphics objects. Graphics objects are only referenced by a numeric index, or "handle". root figure The parent of all figure objects. The index for the root figure is defined to be 0. figure A figure window. axes An set of axes. This object is a child of a figure object and may be a parent of line, text, image, patch, or surface objects. line A line in two or three dimensions. text Text annotations. image A bitmap image. patch A filled polygon, currently limited to two dimensions. surface A three-dimensional surface. To determine whether an object is a graphics object index or a figure index, use the functions `ishandle' and `isfigure'. -- Built-in Function: ishandle (H) Return true if H is a graphics handle and false otherwise. -- Function File: ishghandle (H) Return true if H is a graphics handle and false otherwise. -- Function File: isfigure (H) Return true if H is a graphics handle that contains a figure object and false otherwise. The function `gcf' returns an index to the current figure object, or creates one if none exists. Similarly, `gca' returns the current axes object, or creates one (and its parent figure object) if none exists. -- Function File: gcf () Return the current figure handle. If a figure does not exist, create one and return its handle. The handle may then be used to examine or set properties of the figure. For example, fplot (@sin, [-10, 10]); fig = gcf (); set (fig, "visible", "off"); plots a sine wave, finds the handle of the current figure, and then makes that figure invisible. Setting the visible property of the figure to `"on"' will cause it to be displayed again. *See also:* *note get: doc-get, *note set: doc-set. -- Function File: gca () Return a handle to the current axis object. If no axis object exists, create one and return its handle. The handle may then be used to examine or set properties of the axes. For example, ax = gca (); set (ax, "position", [0.5, 0.5, 0.5, 0.5]); creates an empty axes object, then changes its location and size in the figure window. *See also:* *note get: doc-get, *note set: doc-set. The `get' and `set' functions may be used to examine and set properties for graphics objects. For example, get (0) => ans = { type = root figure currentfigure = [](0x0) children = [](0x0) visible = on } returns a structure containing all the properties of the root figure. As with all functions in Octave, the structure is returned by value, so modifying it will not modify the internal root figure plot object. To do that, you must use the `set' function. Also, note that in this case, the `currentfigure' property is empty, which indicates that there is no current figure window. The `get' function may also be used to find the value of a single property. For example, get (gca (), "xlim") => [ 0 1 ] returns the range of the x-axis for the current axes object in the current figure. To set graphics object properties, use the set function. For example, set (gca (), "xlim", [-10, 10]); sets the range of the x-axis for the current axes object in the current figure to `[-10, 10]'. Additionally, calling set with a graphics object index as the only argument returns a structure containing the default values for all the properties for the given object type. For example, set (gca ()) returns a structure containing the default property values for axes objects. -- Built-in Function: get (H, P) Return the named property P from the graphics handle H. If P is omitted, return the complete property list for H. If H is a vector, return a cell array including the property values or lists respectively. -- Built-in Function: set (H, P, V, ...) Set the named property value or vector P to the value V for the graphics handle H. -- Function File: PARENT = ancestor (H, TYPE) -- Function File: PARENT = ancestor (H, TYPE, 'toplevel') Return the first ancestor of handle object H whose type matches TYPE, where TYPE is a character string. If TYPE is a cell array of strings, return the first parent whose type matches any of the given type strings. If the handle object H is of type TYPE, return H. If `"toplevel"' is given as a 3rd argument, return the highest parent in the object hierarchy that matches the condition, instead of the first (nearest) one. *See also:* *note get: doc-get, *note set: doc-set. -- Function File: H = allchild (HANDLES) Find all children including hidden children of an object. This function is similar to `get (h, "children")', but also returns includes hidden objects. If HANDLES is a scalar, H will be a vector, and if not, H will be a cell matrix with the same size as HANDLES and each cell will contain a vector of handles. *See also:* *note get: doc-get, *note set: doc-set, *note findall: doc-findall, *note findobj: doc-findobj. You can create axes, line, and patch objects directly using the `axes', `line', and `patch' functions. These objects become children of the current axes object. -- Function File: axes () -- Function File: axes (PROPERTY, VALUE, ...) -- Function File: axes (H) Create an axes object and return a handle to it. -- Function File: line () -- Function File: line (X, Y) -- Function File: line (X, Y, Z) -- Function File: line (X, Y, Z, PROPERTY, VALUE, ...) Create line object from X and Y and insert in current axes object. Return a handle (or vector of handles) to the line objects created. Multiple property-value pairs may be specified for the line, but they must appear in pairs. -- Function File: patch () -- Function File: patch (X, Y, C) -- Function File: patch (X, Y, Z, C) -- Function File: patch (FV) -- Function File: patch ('Faces', F, 'Vertices', V, ...) -- Function File: patch (..., PROP, VAL) -- Function File: patch (H, ...) -- Function File: H = patch (...) Create patch object from X and Y with color C and insert in the current axes object. Return handle to patch object. For a uniform colored patch, C can be given as an RGB vector, scalar value referring to the current colormap, or string value (for example, "r" or "red"). If passed a structure FV contain the fields "vertices", "faces" and optionally "facevertexcdata", create the patch based on these properties. -- Function File: fill (X, Y, C) -- Function File: fill (X1, Y1, C1, X2, Y2, C2) -- Function File: fill (..., PROP, VAL) -- Function File: fill (H, ...) -- Function File: H = fill (...) Create one or more filled patch objects, returning a patch object for each. -- Function File: surface (X, Y, Z, C) -- Function File: surface (X, Y, Z) -- Function File: surface (Z, C) -- Function File: surface (Z) -- Function File: surface (..., PROP, VAL) -- Function File: surface (H, ...) -- Function File: H = surface (...) Plot a surface graphic object given matrices X, and Y from `meshgrid' and a matrix Z corresponding to the X and Y coordinates of the surface. If X and Y are vectors, then a typical vertex is (X(j), Y(i), Z(i,j)). Thus, columns of Z correspond to different X values and rows of Z correspond to different Y values. If X and Y are missing, they are constructed from size of the matrix Z. Any additional properties passed are assigned to the surface. *See also:* *note surf: doc-surf, *note mesh: doc-mesh, *note patch: doc-patch, *note line: doc-line. By default, Octave refreshes the plot window when a prompt is printed, or when waiting for input. To force an update at other times, call the `drawnow' function. -- Built-in Function: __go_drawnow__ () -- Built-in Function: __go_drawnow__ (TERM, FILE, MONO, DEBUG_FILE) Undocumented internal function. Only figures that are modified will be updated. The `refresh' function can also be to force an update of the current figure, even if it is nor modified. -- Function File: refresh () -- Function File: refresh (H) Refresh a figure, forcing it to be redrawn. Called without an argument the current figure is redrawn, otherwise the figure pointed to by H is redrawn. *See also:* *note drawnow: doc-drawnow. Normally, high-level plot functions like `plot' or `mesh' call `newplot' to initialize the state of the current axes so that the next plot is drawn in a blank window with default property settings. To have two plots superimposed over one another, call the `hold' function. For example, hold ("on"); x = -10:0.1:10; plot (x, sin (x)); plot (x, cos (x)); hold ("off"); displays sine and cosine waves on the same axes. If the hold state is off, consecutive plotting commands like this will only display the last plot. -- Function File: newplot () Prepare graphics engine to produce a new plot. This function should be called at the beginning of all high-level plotting functions. -- Function File: hold ARGS Tell Octave to `hold' the current data on the graph when executing subsequent plotting commands. This allows you to execute a series of plot commands and have all the lines end up on the same graph. The default is for each new plot command to clear the plot device first. For example, the command hold on turns the hold state on. An argument of `"off"' turns the hold state off, and `hold' with no arguments toggles the current hold state. -- Function File: hold (H, ...) Applies to a specific axis or axes, associated with the handle(s), H. -- Function File: ishold Return true if the next line will be added to the current plot, or false if the plot device will be cleared before drawing the next line. To clear the current figure, call the `clf' function. To clear the current axis, call the `cla' function. To bring the current figure to the top of the window stack, call the `shg' function. To delete a graphics object, call `delete' on its index. To close the figure window, call the `close' function. -- Function File: clf () -- Function File: clf ("reset") -- Function File: clf (HFIG) -- Function File: clf (HFIG, "reset") -- Function File: HFIG = clf (...) Delete the children of the current figure with visible handles. If HFIG is specified and is an figure object handle, operate on it instead of the current figure. If the optional argument `"reset"' is specified, also delete the figure's children with hidden handles. *See also:* *note cla: doc-cla, *note close: doc-close, *note delete: doc-delete. -- Function File: cla () -- Function File: cla ("reset") -- Function File: cla (HAX) -- Function File: cla (HAX, "reset") Delete the children of the current axes with visible handles. If HAX is specified and is an axes object handle, operate on it instead of the current axes. If the optional argument `"reset"' is specified, also delete the children with hidden handles. *See also:* *note clf: doc-clf. -- Function File: shg Show the graph window. Currently, this is the same as executing `drawnow'. *See also:* *note drawnow: doc-drawnow, *note figure: doc-figure. -- Function File: delete (FILE) -- Function File: delete (H) Delete the named file or graphics handle. -- Command: close -- Command: close (N) -- Command: close all -- Command: close all hidden Close figure window(s) by calling the function specified by the `"closerequestfcn"' property for each figure. By default, the function `closereq' is used. *See also:* *note closereq: doc-closereq. -- Function File: closereq () Close the current figure and delete all graphics objects associated with it. *See also:* *note close: doc-close, *note delete: doc-delete.  File: octave.info, Node: Graphics Object Properties, Next: Managing Default Properties, Prev: Graphics Objects, Up: Advanced Plotting 15.2.2 Graphics Object Properties --------------------------------- * Menu: * Root Figure Properties:: * Figure Properties:: * Axes Properties:: * Line Properties:: * Text Properties:: * Image Properties:: * Patch Properties:: * Surface Properties:: * Searching Properties::  File: octave.info, Node: Root Figure Properties, Next: Figure Properties, Up: Graphics Object Properties 15.2.2.1 Root Figure Properties ............................... `currentfigure' Index to graphics object for the current figure.  File: octave.info, Node: Figure Properties, Next: Axes Properties, Prev: Root Figure Properties, Up: Graphics Object Properties 15.2.2.2 Figure Properties .......................... `nextplot' May be one of `"new"' `"add"' `"replace"' `"replacechildren"' `closerequestfcn' Handle of function to call when a figure is closed. `currentaxes' Index to graphics object of current axes. `colormap' An N-by-3 matrix containing the color map for the current axes. `visible' Either `"on"' or `"off"' to toggle display of the figure. `paperorientation' Indicates the orientation for printing. Either `"landscape"' or `"portrait"'.  File: octave.info, Node: Axes Properties, Next: Line Properties, Prev: Figure Properties, Up: Graphics Object Properties 15.2.2.3 Axes Properties ........................ `position' A vector specifying the position of the plot, excluding titles, axes and legend. The four elements of the vector are the coordinates of the lower left corner and width and height of the plot, in units normalized to the width and height of the plot window. For example, `[0.2, 0.3, 0.4, 0.5]' sets the lower left corner of the axes at (0.2, 0.3) and the width and height to be 0.4 and 0.5 respectively. See also the `outerposition' property. `title' Index of text object for the axes title. `box' Either `"on"' or `"off"' to toggle display of the box around the axes. `key' Either `"on"' or `"off"' to toggle display of the legend. Note that this property is not compatible with MATLAB and may be removed in a future version of Octave. `keybox' Either `"on"' or `"off"' to toggle display of a box around the legend. Note that this property is not compatible with MATLAB and may be removed in a future version of Octave. `keypos' An integer from 1 to 4 specifying the position of the legend. 1 indicates upper right corner, 2 indicates upper left, 3 indicates lower left, and 4 indicates lower right. Note that this property is not compatible with MATLAB and may be removed in a future version of Octave. `dataaspectratio' A two-element vector specifying the relative height and width of the data displayed in the axes. Setting `dataaspectratio' to `1, 2]' causes the length of one unit as displayed on the y-axis to be the same as the length of 2 units on the x-axis. Setting `dataaspectratio' also forces the `dataaspectratiomode' property to be set to `"manual"'. `dataaspectratiomode' Either `"manual"' or `"auto"'. `xlim' `ylim' `zlim' `clim' Two-element vectors defining the limits for the x, y, and z axes and the Setting one of these properties also forces the corresponding mode property to be set to `"manual"'. `xlimmode' `ylimmode' `zlimmode' `climmode' Either `"manual"' or `"auto"'. `xlabel' `ylabel' `zlabel' Indices to text objects for the axes labels. `xgrid' `ygrid' `zgrid' Either `"on"' or `"off"' to toggle display of grid lines. `xminorgrid' `yminorgrid' `zminorgrid' Either `"on"' or `"off"' to toggle display of minor grid lines. `xtick' `ytick' `ztick' Setting one of these properties also forces the corresponding mode property to be set to `"manual"'. `xtickmode' `ytickmode' `ztickmode' Either `"manual"' or `"auto"'. `xticklabel' `yticklabel' `zticklabel' Setting one of these properties also forces the corresponding mode property to be set to `"manual"'. `xticklabelmode' `yticklabelmode' `zticklabelmode' Either `"manual"' or `"auto"'. `xscale' `yscale' `zscale' Either `"linear"' or `"log"'. `xdir' `ydir' `zdir' Either `"forward"' or `"reverse"'. `xaxislocation' `yaxislocation' Either `"top"' or `"bottom"' for the x-axis and `"left"' or `"right"' for the y-axis. `view' A three element vector specifying the view point for three-dimensional plots. `visible' Either `"on"' or `"off"' to toggle display of the axes. `nextplot' May be one of `"new"' `"add"' `"replace"' `"replacechildren"' `outerposition' A vector specifying the position of the plot, including titles, axes and legend. The four elements of the vector are the coordinates of the lower left corner and width and height of the plot, in units normalized to the width and height of the plot window. For example, `[0.2, 0.3, 0.4, 0.5]' sets the lower left corner of the axes at (0.2, 0.3) and the width and height to be 0.4 and 0.5 respectively. See also the `position' property.  File: octave.info, Node: Line Properties, Next: Text Properties, Prev: Axes Properties, Up: Graphics Object Properties 15.2.2.4 Line Properties ........................ `xdata' `ydata' `zdata' `ldata' `udata' `xldata' `xudata' The data to be plotted. The `ldata' and `udata' elements are for errorbars in the y direction, and the `xldata' and `xudata' elements are for errorbars in the x direction. `color' The RGB color of the line, or a color name. *Note Colors::. `linestyle' `linewidth' *Note Line Styles::. `marker' `markeredgecolor' `markerfacecolor' `markersize' *Note Marker Styles::. `keylabel' The text of the legend entry corresponding to this line. Note that this property is not compatible with MATLAB and may be removed in a future version of Octave.  File: octave.info, Node: Text Properties, Next: Image Properties, Prev: Line Properties, Up: Graphics Object Properties 15.2.2.5 Text Properties ........................ `string' The character string contained by the text object. `units' May be `"normalized"' or `"graph"'. `position' The coordinates of the text object. `rotation' The angle of rotation for the displayed text, measured in degrees. `horizontalalignment' May be `"left"', `"center"', or `"right"'. `color' The color of the text. *Note Colors::. `fontname' The font used for the text. `fontsize' The size of the font, in points to use. `fontangle' Flag whether the font is italic or normal. Valid values are 'normal', 'italic' and 'oblique'. `fontweight' Flag whether the font is bold, etc. Valid values are 'normal', 'bold', 'demi' or 'light'. `interpreter' Determines how the text is rendered. Valid values are 'none', 'tex' or 'latex'. All text objects, including titles, labels, legends, and text, include the property 'interpreter', this property determines the manner in which special control sequences in the text are rendered. If the interpreter is set to 'none', then no rendering occurs. At this point the 'latex' option is not implemented and so the 'latex' interpreter also does not interpret the text. The 'tex' option implements a subset of TEX functionality in the rendering of the text. This allows the insertion of special characters such as Greek or mathematical symbols within the text. The special characters are also inserted with a code starting with the back-slash (\) character, as in the table *note tab:extended::. In addition, the formatting of the text can be changed within the string with the codes \bf Bold font \it Italic font \sl Oblique Font \rm Normal font These are be used in conjunction with the { and } characters to limit the change in the font to part of the string. For example xlabel ('{\bf H} = a {\bf V}') where the character 'a' will not appear in a bold font. Note that to avoid having Octave interpret the backslash characters in the strings, the strings should be in single quotes. It is also possible to change the fontname and size within the text \fontname{FONTNAME} Specify the font to use \fontsize{SIZE} Specify the size of the font to use Finally, the superscript and subscripting can be controlled with the '^' and '_' characters. If the '^' or '_' is followed by a { character, then all of the block surrounded by the { } pair is super- or sub-scripted. Without the { } pair, only the character immediately following the '^' or '_' is super- or sub-scripted. \forall \exists \ni \cong \Delta \Phi \Gamma \vartheta \Lambda \Pi \Theta \Sigma \varsigma \Omega \Xi \Psi \perp \alpha \beta \chi \delta \epsilon \phi \gamma \eta \iota \varphi \kappa \lambda \mu \nu \o \pi \theta \rho \sigma \tau \upsilon \varpi \omega \xi \psi \zeta \sim \Upsilon \prime \leq \infty \clubsuit \diamondsuit \heartsuit \spadesuit \leftrightarrow \leftarrow \uparrow \rightarrow \downarrow \circ \pm \geq \times \propto \partial \bullet \div \neq \equiv \approx \ldots \mid \aleph \Im \Re \wp \otimes \oplus \oslash \cap \cup \supset \supseteq \subset \subseteq \in \notin \angle \bigrightriangledown \langle \rangle \nabla \prod \surd \cdot \neg \wedge \vee \Leftrightarrow \Leftarrow \Uparrow \Rightarrow \Downarrow \diamond \copyright \lfloor \lceil \rfloor \rceil \int Table 15.1: Available special characters in TEX mode A complete example showing the capabilities of the extended text is x = 0:0.01:3; plot(x,erf(x)); hold on; plot(x,x,"r"); axis([0, 3, 0, 1]); text(0.65, 0.6175, strcat('\leftarrow x = {2/\surd\pi', ' {\fontsize{16}\int_{\fontsize{8}0}^{\fontsize{8}x}}', ' e^{-t^2} dt} = 0.6175'))  File: octave.info, Node: Image Properties, Next: Patch Properties, Prev: Text Properties, Up: Graphics Object Properties 15.2.2.6 Image Properties ......................... `cdata' The data for the image. Each pixel of the image corresponds to an element of `cdata'. The value of an element of `cdata' specifies the row-index into the colormap of the axes object containing the image. The color value found in the color map for the given index determines the color of the pixel. `xdata' `ydata' Two-element vectors specifying the range of the x- and y- coordinates for the image.  File: octave.info, Node: Patch Properties, Next: Surface Properties, Prev: Image Properties, Up: Graphics Object Properties 15.2.2.7 Patch Properties ......................... `cdata' `xdata' `ydata' `zdata' Data defining the patch object. `facecolor' The fill color of the patch. *Note Colors::. `facealpha' A number in the range [0, 1] indicating the transparency of the patch. `edgecolor' The color of the line defining the patch. *Note Colors::. `linestyle' `linewidth' *Note Line Styles::. `marker' `markeredgecolor' `markerfacecolor' `markersize' *Note Marker Styles::.  File: octave.info, Node: Surface Properties, Next: Searching Properties, Prev: Patch Properties, Up: Graphics Object Properties 15.2.2.8 Surface Properties ........................... `xdata' `ydata' `zdata' The data determining the surface. The `xdata' and `ydata' elements are vectors and `zdata' must be a matrix. `keylabel' The text of the legend entry corresponding to this surface. Note that this property is not compatible with MATLAB and may be removed in a future version of Octave.  File: octave.info, Node: Searching Properties, Prev: Surface Properties, Up: Graphics Object Properties 15.2.2.9 Searching Properties ............................. -- Function File: H = findobj () -- Function File: H = findobj (PROP_NAME, PROP_VALUE) -- Function File: H = findobj ('-property', PROP_NAME) -- Function File: H = findobj ('-regexp', PROP_NAME, PATTERN) -- Function File: H = findobj ('flat', ...) -- Function File: H = findobj (H, ...) -- Function File: H = findobj (H, '-depth', D, ...) Find object with specified property values. The simplest form is findobj (PROP_NAME, PROP_VALUE) which returns all of the handles to the objects with the name PROP_NAME and the name PROP_VALUE. The search can be limited to a particular object or set of objects and their descendants by passing a handle or set of handles H as the first argument to `findobj'. The depth of hierarchy of objects to which to search to can be limited with the '-depth' argument. To limit the number depth of the hierarchy to search to D generations of children, and example is findobj (H, '-depth', D, PROP_NAME, PROP_VALUE) Specifying a depth D of 0, limits the search to the set of object passed in H. A depth D of 0 is equivalent to the '-flat' argument. A specified logical operator may be applied to the pairs of PROP_NAME and PROP_VALUE. The supported logical operators are '-and', '-or', '-xor', '-not'. The objects may also be matched by comparing a regular expression to the property values, where property values that match `regexp (PROP_VALUE, PATTERN)' are returned. Finally, objects may be matched by property name only, using the '-property' option. *See also:* *note get: doc-get, *note set: doc-set. -- Function File: H = findall () -- Function File: H = findall (PROP_NAME, PROP_VALUE) -- Function File: H = findall (H, ...) -- Function File: H = findall (H, "-depth", D, ...) Find object with specified property values including hidden handles. This function performs the same function as `findobj', but it includes hidden objects in its search. For full documentation, see `findobj'. *See also:* *note get: doc-get, *note set: doc-set, *note findobj: doc-findobj, *note allchild: doc-allchild.  File: octave.info, Node: Managing Default Properties, Next: Colors, Prev: Graphics Object Properties, Up: Advanced Plotting 15.2.3 Managing Default Properties ---------------------------------- Object properties have two classes of default values, "factory defaults" (the initial values) and "user-defined defaults", which may override the factory defaults. Although default values may be set for any object, they are set in parent objects and apply to child objects. For example, set (0, "defaultlinecolor", "green"); sets the default line color for all objects. The rule for constructing the property name to set a default value is default + OBJECT-TYPE + PROPERTY-NAME This rule can lead to some strange looking names, for example `defaultlinelinewidth"' specifies the default `linewidth' property for `line' objects. The example above used the root figure object, 0, so the default property value will apply to all line objects. However, default values are hierarchical, so defaults set in a figure objects override those set in the root figure object. Likewise, defaults set in axes objects override those set in figure or root figure objects. For example, subplot (2, 1, 1); set (0, "defaultlinecolor", "red"); set (1, "defaultlinecolor", "green"); set (gca (), "defaultlinecolor", "blue"); line (1:10, rand (1, 10)); subplot (2, 1, 2); line (1:10, rand (1, 10)); figure (2) line (1:10, rand (1, 10)); produces two figures. The line in first subplot window of the first figure is blue because it inherits its color from its parent axes object. The line in the second subplot window of the first figure is green because it inherits its color from its parent figure object. The line in the second figure window is red because it inherits its color from the global root figure parent object. To remove a user-defined default setting, set the default property to the value `"remove"'. For example, set (gca (), "defaultlinecolor", "remove"); removes the user-defined default line color setting from the current axes object. Getting the `"default"' property of an object returns a list of user-defined defaults set for the object. For example, get (gca (), "default"); returns a list of user-defined default values for the current axes object. Factory default values are stored in the root figure object. The command get (0, "factory"); returns a list of factory defaults.  File: octave.info, Node: Colors, Next: Line Styles, Prev: Managing Default Properties, Up: Advanced Plotting 15.2.4 Colors ------------- Colors may be specified as RGB triplets with values ranging from zero to one, or by name. Recognized color names include `"blue"', `"black"', `"cyan"', `"green"', `"magenta"', `"red"', `"white"', and `"yellow"'.  File: octave.info, Node: Line Styles, Next: Marker Styles, Prev: Colors, Up: Advanced Plotting 15.2.5 Line Styles ------------------ Line styles are specified by the following properties: `linestyle' May be one of `"-"' Solid lines. `"--"' Dashed lines. `":"' Points. `"-."' A dash-dot line. `linewidth' A number specifying the width of the line. The default is 1. A value of 2 is twice as wide as the default, etc.  File: octave.info, Node: Marker Styles, Next: Callbacks, Prev: Line Styles, Up: Advanced Plotting 15.2.6 Marker Styles -------------------- Marker styles are specified by the following properties: `marker' A character indicating a plot marker to be place at each data point, or `"none"', meaning no markers should be displayed. `markeredgecolor' The color of the edge around the marker, or `"auto"', meaning that the edge color is the same as the face color. *Note Colors::. `markerfacecolor' The color of the marker, or `"none"' to indicate that the marker should not be filled. *Note Colors::. `markersize' A number specifying the size of the marker. The default is 1. A value of 2 is twice as large as the default, etc.  File: octave.info, Node: Callbacks, Next: Object Groups, Prev: Marker Styles, Up: Advanced Plotting 15.2.7 Callbacks ---------------- Callback functions can be associated with graphics objects and triggered after certain events occur. The basic structure of all callback function is function mycallback (src, data) ... endfunction where `src' gives a handle to the source of the callback, and `code' gives some event specific data. This can then be associated with an object either at the objects creation or later with the `set' function. For example plot (x, "DeleteFcn", @(s, e) disp("Window Deleted")) where at the moment that the plot is deleted, the message "Window Deleted" will be displayed. Additional user arguments can be passed to callback functions, and will be passed after the 2 default arguments. For example plot (x, "DeleteFcn", {@mycallback, "1"}) ... function mycallback (src, data, a1) fprintf ("Closing plot %d\n", a1); endfunction The basic callback functions that are available for all graphics objects are * CreateFcn This is the callback that is called at the moment of the objects creation. It is not called if the object is altered in any way, and so it only makes sense to define this callback in the function call that defines the object. Callbacks that are added to `CreateFcn' later with the `set' function will never be executed. * DeleteFcn This is the callback that is called at the moment an object is deleted. * ButtonDownFcn This is the callback that is called if a mouse button is pressed while the pointer is over this object. Note, that the gnuplot interface does not respect this callback. The object and figure that the event occurred in that resulted in the callback being called can be found with the `gcbo' and `gcbf' functions. -- Function File: H = gcbo () -- Function File: [H, FIG] = gcbo () Return a handle to the object whose callback is currently executing. If no callback is executing, this function returns the empty matrix. This handle is obtained from the root object property "CallbackObject". Additionally return the handle of the figure containing the object whose callback is currently executing. If no callback is executing, the second output is also set to the empty matrix. *See also:* *note gcf: doc-gcf, *note gca: doc-gca, *note gcbf: doc-gcbf. -- Function File: FIG = gcbf () Return a handle to the figure containing the object whose callback is currently executing. If no callback is executing, this function returns the empty matrix. The handle returned by this function is the same as the second output argument of gcbo. *See also:* *note gcf: doc-gcf, *note gca: doc-gca, *note gcbo: doc-gcbo. Callbacks can equally be added to properties with the `addlistener' function described below.  File: octave.info, Node: Object Groups, Next: Graphics backends, Prev: Callbacks, Up: Advanced Plotting 15.2.8 Object Groups -------------------- A number of Octave high level plot functions return groups of other graphics objects or they return graphics objects that are have their properties linked in such a way that changes to one of the properties results in changes in the others. A graphic object that groups other objects is an `hggroup' -- Function File: hggroup () -- Function File: hggroup (H) -- Function File: hggroup (..., PROPERTY, VALUE, ...) Create group object with parent H. If no parent is specified, the group is created in the current axes. Return the handle of the group object created. Multiple property-value pairs may be specified for the group, but they must appear in pairs. For example a simple use of a `hggroup' might be x = 0:0.1:10; hg = hggroup (); plot (x, sin (x), "color", [1, 0, 0], "parent", hg); hold on plot (x, cos (x), "color", [0, 1, 0], "parent", hg); set (hg, "visible", "off"); which groups the two plots into a single object and controls their visibility directly. The default properties of an `hggroup' are the same as the set of common properties for the other graphics objects. Additional properties can be added with the `addproperty' function. -- Built-in Function: addproperty (NAME, H, TYPE, [ARG, ...]) Create a new property named NAME in graphics object H. TYPE determines the type of the property to create. ARGS usually contains the default value of the property, but additional arguments might be given, depending on the type of the property. The supported property types are: `string' A string property. ARG contains the default string value. `any' An un-typed property. This kind of property can hold any octave value. ARGS contains the default value. `radio' A string property with a limited set of accepted values. The first argument must be a string with all accepted values separated by a vertical bar ('|'). The default value can be marked by enclosing it with a '{' '}' pair. The default value may also be given as an optional second string argument. `boolean' A boolean property. This property type is equivalent to a radio property with "on|off" as accepted values. ARG contains the default property value. `double' A scalar double property. ARG contains the default value. `handle' A handle property. This kind of property holds the handle of a graphics object. ARG contains the default handle value. When no default value is given, the property is initialized to the empty matrix. `data' A data (matrix) property. ARG contains the default data value. When no default value is given, the data is initialized to the empty matrix. `color' A color property. ARG contains the default color value. When no default color is given, the property is set to black. An optional second string argument may be given to specify an additional set of accepted string values (like a radio property). TYPE may also be the concatenation of a core object type and a valid property name for that object type. The property created then has the same characteristics as the referenced property (type, possible values, hidden state...). This allows to clone an existing property into the graphics object H. Examples: addproperty ("my_property", gcf, "string", "a string value"); addproperty ("my_radio", gcf, "radio", "val_1|val_2|{val_3}"); addproperty ("my_style", gcf, "linelinestyle", "--"); Once a property in added to an `hggroup', it is not linked to any other property of either the children of the group, or any other graphics object. Add so to control the way in which this newly added property is used, the `addlistener' function is used to define a callback function that is executed when the property is altered. -- Built-in Function: addlistener (H, PROP, FCN) Register FCN as listener for the property PROP of the graphics object H. Property listeners are executed (in order of registration) when the property is set. The new value is already available when the listeners are executed. PROP must be a string naming a valid property in H. FCN can be a function handle, a string or a cell array whose first element is a function handle. If FCN is a function handle, the corresponding function should accept at least 2 arguments, that will be set to the object handle and the empty matrix respectively. If FCN is a string, it must be any valid octave expression. If FCN is a cell array, the first element must be a function handle with the same signature as described above. The next elements of the cell array are passed as additional arguments to the function. Example: function my_listener (h, dummy, p1) fprintf ("my_listener called with p1=%s\n", p1); endfunction addlistener (gcf, "position", {@my_listener, "my string"}) -- Built-in Function: dellistener (H, PROP, FCN) Remove the registration of FCN as a listener for the property PROP of the graphics object H. The function FCN must be the same variable (not just the same value), as was passed to the original call to `addlistener'. If FCN is not defined then all listener functions of PROP are removed. Example: function my_listener (h, dummy, p1) fprintf ("my_listener called with p1=%s\n", p1); endfunction c = {@my_listener, "my string"}; addlistener (gcf, "position", c); dellistener (gcf, "position", c); An example of the use of these two functions might be x = 0:0.1:10; hg = hggroup (); h = plot (x, sin (x), "color", [1, 0, 0], "parent", hg); addproperty ("linestyle", hg, "linelinestyle", get (h, "linestyle")); addlistener (hg, "linestyle", @update_props); hold on plot (x, cos (x), "color", [0, 1, 0], "parent", hg); function update_props (h, d) set (get (h, "children"), "linestyle", get (h, "linestyle")); endfunction that adds a `linestyle' property to the `hggroup' and propagating any changes its value to the children of the group. The `linkprop' function can be used to simplify the above to be x = 0:0.1:10; hg = hggroup (); h1 = plot (x, sin (x), "color", [1, 0, 0], "parent", hg); addproperty ("linestyle", hg, "linelinestyle", get (h, "linestyle")); hold on h2 = plot (x, cos (x), "color", [0, 1, 0], "parent", hg); hlink = linkprop ([hg, h1, h2], "color"); -- Function File: HLINK = linkprop (H, PROP) Links graphics object properties, such that a change in one is propagated to the others. The properties to link are given as a string of cell string array by PROP and the objects containing these properties by the handle array H. An example of the use of linkprops is x = 0:0.1:10; subplot (1, 2, 1); h1 = plot (x, sin (x)); subplot (1, 2, 2); h2 = plot (x, cos (x)); hlink = linkprop ([h1, h2], {"color","linestyle"}); set (h1, "color", "green"); set (h2, "linestyle", "--"); These capabilities are used in a number of basic graphics objects. The `hggroup' objects created by the functions of Octave contain one or more graphics object and are used to: * group together multiple graphics objects, * create linked properties between different graphics objects, and * to hide the nominal user data, from the actual data of the objects. For example the `stem' function creates a stem series where each `hggroup' of the stem series contains two line objects representing the body and head of the stem. The `ydata' property of the `hggroup' of the stem series represents the head of the stem, whereas the body of the stem is between the baseline and this value. For example h = stem (1:4) get (h, "xdata") => [ 1 2 3 4]' get (get (h, "children")(1), "xdata") => [ 1 1 NaN 2 2 NaN 3 3 NaN 4 4 NaN]' shows the difference between the `xdata' of the `hggroup' of a stem series object and the underlying line. The basic properties of such group objects is that they consist of one or more linked `hggroup', and that changes in certain properties of these groups are propagated to other members of the group. Whereas, certain properties of the members of the group only apply to the current member. In addition the members of the group can also be linked to other graphics objects through callback functions. For example the baseline of the `bar' or `stem' functions is a line object, whose length and position are automatically adjusted, based on changes to the corresponding hggroup elements. * Menu: * Data sources in object groups:: * Area series:: * Bar series:: * Contour groups:: * Error bar series:: * Line series:: * Quiver group:: * Scatter group:: * Stair group:: * Stem Series:: * Surface group:: qtoctave-0.10.1/qtoctave-info-reader/test/octave.info-30000644000175000017500000115460011511434230021714 0ustar lucaslucasThis is octave.info, produced by makeinfo version 4.11 from ./octave.texi. START-INFO-DIR-ENTRY * Octave: (octave). Interactive language for numerical computations. END-INFO-DIR-ENTRY Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2005, 2006, 2007 John W. Eaton. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.  File: octave.info, Node: Data sources in object groups, Next: Area series, Up: Object Groups 15.2.8.1 Data sources in object groups ...................................... All of the group objects contain data source parameters. There are string parameters that contain an expression that is evaluated to update the relevant data property of the group when the `refreshdata' function is called. -- Function File: refreshdata () -- Function File: refreshdata (H) -- Function File: refreshdata (H, WS) Evaluates any datasource properties of the current figure and updates the corresponding data. If call with one or more arguments H is a scalar or array of figure handles which to refresh. The data sources are by default evaluated in the "base" workspace but can also be set in the "caller" workspace. An example of the use of refreshdata is x = 0:0.1:10; y = sin (x); plot (x, y, "ydatasource", "y"); for i = 1 : 100 pause(0.1) y = sin (x + 0.1 * i); refreshdata(); endfor *See also:* *note linkdata: doc-linkdata.  File: octave.info, Node: Area series, Next: Bar series, Prev: Data sources in object groups, Up: Object Groups 15.2.8.2 Area series .................... Area series objects are created by the `area' function. Each of the `hggroup' elements contains a single patch object. The properties of the area series are `basevalue' The value where the base of the area plot is drawn. `linewidth' `linestyle' The line width and style of the edge of the patch objects making up the areas. *Note Line Styles::. `edgecolor' `facecolor' The line and fill color of the patch objects making up the areas. *Note Colors::. `xdata' `ydata' The x and y coordinates of the original columns of the data passed to `area' prior to the cumulative summation used in the `area' function. `xdatasource' `ydatasource' Data source variables.  File: octave.info, Node: Bar series, Next: Contour groups, Prev: Area series, Up: Object Groups 15.2.8.3 Bar series ................... Bar series objects are created by the `bar' or `barh' functions. Each `hggroup' element contains a single patch object. The properties of the bar series are `showbaseline' `baseline' `basevalue' The property `showbaseline' flags whether the baseline of the bar series is displayed (default is "on"). The handle of the graphics object representing the baseline is given by the `baseline' property and the y-value of the baseline by the `basevalue' property. Changes to any of these property are propagated to the other members of the bar series and to the baseline itself. Equally changes in the properties of the base line itself are propagated to the members of the corresponding bar series. `barwidth' `barlayout' `horizontal' The property `barwidth' is the width of the bar corresponding to the WIDTH variable passed to `bar' or BARH. Whether the bar series is "grouped" or "stacked" is determined by the `barlayout' property and whether the bars are horizontal or vertical by the `horizontal' property. Changes to any of these property are propagated to the other members of the bar series. `linewidth' `linestyle' The line width and style of the edge of the patch objects making up the bars. *Note Line Styles::. `edgecolor' `facecolor' The line and fill color of the patch objects making up the bars. *Note Colors::. `xdata' The nominal x positions of the bars. Changes in this property and propagated to the other members of the bar series. `ydata' The y value of the bars in the `hggroup'. `xdatasource' `ydatasource' Data source variables.  File: octave.info, Node: Contour groups, Next: Error bar series, Prev: Bar series, Up: Object Groups 15.2.8.4 Contour groups ....................... Contour group objects are created by the `contour', `contourf' and `contour3' functions. The are equally one of the handles returned by the `surfc' and `meshc' functions. The properties of the contour group are `contourmatrix' A read only property that contains the data return by `contourc' used to create the contours of the plot. `fill' A radio property that can have the values "on" or "off" that flags whether the contours to plot are to be filled. `zlevelmode' `zlevel' The radio property `zlevelmode' can have the values "none", "auto" or "manual". When its value is "none" there is no z component to the plotted contours. When its value is "auto" the z value of the plotted contours is at the same value as the contour itself. If the value is "manual", then the z value at which to plot the contour is determined by the `zlevel' property. `levellistmode' `levellist' `levelstepmode' `levelstep' If `levellistmode' is "manual", then the levels at which to plot the contours is determined by `levellist'. If `levellistmode' is set to "auto", then the distance between contours is determined by `levelstep'. If both `levellistmode' and `levelstepmode' are set to "auto", then there are assumed to be 10 equal spaced contours. `textlistmode' `textlist' `textstepmode' `textstep' If `textlistmode' is "manual", then the labelled contours is determined by `textlist'. If `textlistmode' is set to "auto", then the distance between labelled contours is determined by `textstep'. If both `textlistmode' and `textstepmode' are set to "auto", then there are assumed to be 10 equal spaced labelled contours. `showtext' Flag whether the contour labels are shown or not. `labelspacing' The distance between labels on a single contour in points. `linewidth' `linestyle' `linecolor' The properties of the contour lines. The properties `linewidth' and `linestyle' are similar to the corresponding properties for lines. The property `linecolor' is a color property (*note Colors::), that can also have the values of "none" or "auto". If `linecolor' is "none", then no contour line is drawn. If `linecolor' is "auto" then the line color is determined by the colormap. `xdata' `ydata' `zdata' The original x, y, and z data of the contour lines. `xdatasource' `ydatasource' `zdatasource' Data source variables.  File: octave.info, Node: Error bar series, Next: Line series, Prev: Contour groups, Up: Object Groups 15.2.8.5 Error bar series ......................... Error bar series are created by the `errorbar' function. Each `hggroup' element contains two line objects representing the data and the errorbars separately. The properties of the error bar series are `color' The RGB color or color name of the line objects of the error bars. *Note Colors::. `linewidth' `linestyle' The line width and style of the line objects of the error bars. *Note Line Styles::. `marker' `markeredgecolor' `markerfacecolor' `markersize' The line and fill color of the markers on the error bars. *Note Colors::. `xdata' `ydata' `ldata' `udata' `xldata' `xudata' The original x, y, l, u, xl, xu data of the error bars. `xdatasource' `ydatasource' `ldatasource' `udatasource' `xldatasource' `xudatasource' Data source variables.  File: octave.info, Node: Line series, Next: Quiver group, Prev: Error bar series, Up: Object Groups 15.2.8.6 Line series .................... Line series objects are created by the `plot' and `plot3' functions and are of the type `line'. The properties of the line series with the ability to add data sources. `color' The RGB color or color name of the line objects. *Note Colors::. `linewidth' `linestyle' The line width and style of the line objects. *Note Line Styles::. `marker' `markeredgecolor' `markerfacecolor' `markersize' The line and fill color of the markers. *Note Colors::. `xdata' `ydata' `zdata' The original x, y and z data. `xdatasource' `ydatasource' `zdatasource' Data source variables.  File: octave.info, Node: Quiver group, Next: Scatter group, Prev: Line series, Up: Object Groups 15.2.8.7 Quiver group ..................... Quiver series objects are created by the `quiver' or `quiver3' functions. Each `hggroup' element of the series contains three line objects as children representing the body and head of the arrow, together with a marker as the point of original of the arrows. The properties of the quiver series are `autoscale' `autoscalefactor' Flag whether the length of the arrows is scaled or defined directly from the U, V and W data. If the arrow length is flagged as being scaled by the `autoscale' property, then the length of the autoscaled arrow is controlled by the `autoscalefactor'. `maxheadsize' This property controls the size of the head of the arrows in the quiver series. The default value is 0.2. `showarrowhead' Flag whether the arrow heads are displayed in the quiver plot. `color' The RGB color or color name of the line objects of the quiver. *Note Colors::. `linewidth' `linestyle' The line width and style of the line objects of the quiver. *Note Line Styles::. `marker' `markerfacecolor' `markersize' The line and fill color of the marker objects at the original of the arrows. *Note Colors::. `xdata' `ydata' `zdata' The origins of the values of the vector field. `udata' `vdata' `wdata' The values of the vector field to plot. `xdatasource' `ydatasource' `zdatasource' `udatasource' `vdatasource' `wdatasource' Data source variables.  File: octave.info, Node: Scatter group, Next: Stair group, Prev: Quiver group, Up: Object Groups 15.2.8.8 Scatter group ...................... Scatter series objects are created by the `scatter' or `scatter3' functions. A single hggroup element contains as many children as there are points in the scatter plot, with each child representing one of the points. The properties of the stem series are `linewidth' The line width of the line objects of the points. *Note Line Styles::. `marker' `markeredgecolor' `markerfacecolor' The line and fill color of the markers of the points. *Note Colors::. `xdata' `ydata' `zdata' The original x, y and z data of the stems. `cdata' The color data for the points of the plot. Each point can have a separate color, or a unique color can be specified. `sizedata' The size data for the points of the plot. Each point can its own size or a unique size can be specified. `xdatasource' `ydatasource' `zdatasource' `cdatasource' `sizedatasource' Data source variables.  File: octave.info, Node: Stair group, Next: Stem Series, Prev: Scatter group, Up: Object Groups 15.2.8.9 Stair group .................... Stair series objects are created by the `stair' function. Each `hggroup' element of the series contains a single line object as a child representing the stair. The properties of the stair series are `color' The RGB color or color name of the line objects of the stairs. *Note Colors::. `linewidth' `linestyle' The line width and style of the line objects of the stairs. *Note Line Styles::. `marker' `markeredgecolor' `markerfacecolor' `markersize' The line and fill color of the markers on the stairs. *Note Colors::. `xdata' `ydata' The original x and y data of the stairs. `xdatasource' `ydatasource' Data source variables.  File: octave.info, Node: Stem Series, Next: Surface group, Prev: Stair group, Up: Object Groups 15.2.8.10 Stem Series ..................... Stem series objects are created by the `stem' or `stem3' functions. Each `hggroup' element contains a single line object as a child representing the stems. The properties of the stem series are `showbaseline' `baseline' `basevalue' The property `showbaseline' flags whether the baseline of the stem series is displayed (default is "on"). The handle of the graphics object representing the baseline is given by the `baseline' property and the y-value (or z-value for `stem3') of the baseline by the `basevalue' property. Changes to any of these property are propagated to the other members of the stem series and to the baseline itself. Equally changes in the properties of the base line itself are propagated to the members of the corresponding stem series. `color' The RGB color or color name of the line objects of the stems. *Note Colors::. `linewidth' `linestyle' The line width and style of the line objects of the stems. *Note Line Styles::. `marker' `markeredgecolor' `markerfacecolor' `markersize' The line and fill color of the markers on the stems. *Note Colors::. `xdata' `ydata' `zdata' The original x, y and z data of the stems. `xdatasource' `ydatasource' `zdatasource' Data source variables.  File: octave.info, Node: Surface group, Prev: Stem Series, Up: Object Groups 15.2.8.11 Surface group ....................... Surface group objects are created by the `surf' or `mesh' functions, but are equally one of the handles returned by the `surfc' or `meshc' functions. The surface group is of the type `surface'. The properties of the surface group are `edgecolor' `facecolor' The RGB color or color name of the edges or faces of the surface. *Note Colors::. `linewidth' `linestyle' The line width and style of the lines on the surface. *Note Line Styles::. `marker' `markeredgecolor' `markerfacecolor' `markersize' The line and fill color of the markers on the surface. *Note Colors::. `xdata' `ydata' `zdata' `cdata' The original x, y, z and c data. `xdatasource' `ydatasource' `zdatasource' `cdatasource' Data source variables.  File: octave.info, Node: Graphics backends, Prev: Object Groups, Up: Advanced Plotting 15.2.9 Graphics backends ------------------------ -- Function File: backend (NAME) -- Function File: backend (HLIST, NAME) Change the default graphics backend to NAME. If the backend is not already loaded, it is first initialized (initialization is done through the execution of __init_NAME__). HLIST is a list of figure handles. When given, this function only switches the default backend for the corresponding figures. *See also:* *note available_backends: doc-available_backends. -- Built-in Function: available_backends () Returns resgistered graphics backends. * Menu: * Interaction with gnuplot::  File: octave.info, Node: Interaction with gnuplot, Up: Graphics backends 15.2.9.1 Interaction with `gnuplot' ................................... -- Loadable Function: VAL = gnuplot_binary () -- Loadable Function: OLD_VAL = gnuplot_binary (NEW_VAL) Query or set the name of the program invoked by the plot command. The default value `\"gnuplot\"'. *Note Installation::.  File: octave.info, Node: Matrix Manipulation, Next: Arithmetic, Prev: Plotting, Up: Top 16 Matrix Manipulation ********************** There are a number of functions available for checking to see if the elements of a matrix meet some condition, and for rearranging the elements of a matrix. For example, Octave can easily tell you if all the elements of a matrix are finite, or are less than some specified value. Octave can also rotate the elements, extract the upper- or lower-triangular parts, or sort the columns of a matrix. * Menu: * Finding Elements and Checking Conditions:: * Rearranging Matrices:: * Applying a Function to an Array:: * Special Utility Matrices:: * Famous Matrices::  File: octave.info, Node: Finding Elements and Checking Conditions, Next: Rearranging Matrices, Up: Matrix Manipulation 16.1 Finding Elements and Checking Conditions ============================================= The functions `any' and `all' are useful for determining whether any or all of the elements of a matrix satisfy some condition. The `find' function is also useful in determining which elements of a matrix meet a specified condition. -- Built-in Function: any (X, DIM) For a vector argument, return 1 if any element of the vector is nonzero. For a matrix argument, return a row vector of ones and zeros with each element indicating whether any of the elements of the corresponding column of the matrix are nonzero. For example, any (eye (2, 4)) => [ 1, 1, 0, 0 ] If the optional argument DIM is supplied, work along dimension DIM. For example, any (eye (2, 4), 2) => [ 1; 1 ] -- Built-in Function: all (X, DIM) The function `all' behaves like the function `any', except that it returns true only if all the elements of a vector, or all the elements along dimension DIM of a matrix, are nonzero. Since the comparison operators (*note Comparison Ops::) return matrices of ones and zeros, it is easy to test a matrix for many things, not just whether the elements are nonzero. For example, all (all (rand (5) < 0.9)) => 0 tests a random 5 by 5 matrix to see if all of its elements are less than 0.9. Note that in conditional contexts (like the test clause of `if' and `while' statements) Octave treats the test as if you had typed `all (all (condition))'. -- Mapping Function: xor (X, Y) Return the `exclusive or' of the entries of X and Y. For boolean expressions X and Y, `xor (X, Y)' is true if and only if X or Y is true, but not if both X and Y are true. -- Function File: is_duplicate_entry (X) Return non-zero if any entries in X are duplicates of one another. -- Function File: diff (X, K, DIM) If X is a vector of length N, `diff (X)' is the vector of first differences X(2) - X(1), ..., X(n) - X(n-1). If X is a matrix, `diff (X)' is the matrix of column differences along the first non-singleton dimension. The second argument is optional. If supplied, `diff (X, K)', where K is a non-negative integer, returns the K-th differences. It is possible that K is larger than then first non-singleton dimension of the matrix. In this case, `diff' continues to take the differences along the next non-singleton dimension. The dimension along which to take the difference can be explicitly stated with the optional variable DIM. In this case the K-th order differences are calculated along this dimension. In the case where K exceeds `size (X, DIM)' then an empty matrix is returned. -- Mapping Function: isinf (X) Return 1 for elements of X that are infinite and zero otherwise. For example, isinf ([13, Inf, NA, NaN]) => [ 0, 1, 0, 0 ] -- Mapping Function: isnan (X) Return 1 for elements of X that are NaN values and zero otherwise. NA values are also considered NaN values. For example, isnan ([13, Inf, NA, NaN]) => [ 0, 0, 1, 1 ] -- Mapping Function: finite (X) Return 1 for elements of X that are finite values and zero otherwise. For example, finite ([13, Inf, NA, NaN]) => [ 1, 0, 0, 0 ] -- Loadable Function: find (X) -- Loadable Function: find (X, N) -- Loadable Function: find (X, N, DIRECTION) Return a vector of indices of nonzero elements of a matrix, as a row if X is a row or as a column otherwise. To obtain a single index for each matrix element, Octave pretends that the columns of a matrix form one long vector (like Fortran arrays are stored). For example, find (eye (2)) => [ 1; 4 ] If two outputs are requested, `find' returns the row and column indices of nonzero elements of a matrix. For example, [i, j] = find (2 * eye (2)) => i = [ 1; 2 ] => j = [ 1; 2 ] If three outputs are requested, `find' also returns a vector containing the nonzero values. For example, [i, j, v] = find (3 * eye (2)) => i = [ 1; 2 ] => j = [ 1; 2 ] => v = [ 3; 3 ] If two inputs are given, N indicates the number of elements to find from the beginning of the matrix or vector. If three inputs are given, DIRECTION should be one of "first" or "last" indicating that it should start counting found elements from the first or last element. Note that this function is particularly useful for sparse matrices, as it extracts the non-zero elements as vectors, which can then be used to create the original matrix. For example, sz = size(a); [i, j, v] = find (a); b = sparse(i, j, v, sz(1), sz(2)); *See also:* *note sparse: doc-sparse. -- Function File: [ERR, Y1, ...] = common_size (X1, ...) Determine if all input arguments are either scalar or of common size. If so, ERR is zero, and YI is a matrix of the common size with all entries equal to XI if this is a scalar or XI otherwise. If the inputs cannot be brought to a common size, errorcode is 1, and YI is XI. For example, [errorcode, a, b] = common_size ([1 2; 3 4], 5) => errorcode = 0 => a = [ 1, 2; 3, 4 ] => b = [ 5, 5; 5, 5 ] This is useful for implementing functions where arguments can either be scalars or of common size.  File: octave.info, Node: Rearranging Matrices, Next: Applying a Function to an Array, Prev: Finding Elements and Checking Conditions, Up: Matrix Manipulation 16.2 Rearranging Matrices ========================= -- Function File: fliplr (X) Return a copy of X with the order of the columns reversed. For example, fliplr ([1, 2; 3, 4]) => 2 1 4 3 Note that `fliplr' only work with 2-D arrays. To flip N-d arrays use `flipdim' instead. *See also:* *note flipud: doc-flipud, *note flipdim: doc-flipdim, *note rot90: doc-rot90, *note rotdim: doc-rotdim. -- Function File: flipud (X) Return a copy of X with the order of the rows reversed. For example, flipud ([1, 2; 3, 4]) => 3 4 1 2 Due to the difficulty of defining which axis about which to flip the matrix `flipud' only work with 2-d arrays. To flip N-d arrays use `flipdim' instead. *See also:* *note fliplr: doc-fliplr, *note flipdim: doc-flipdim, *note rot90: doc-rot90, *note rotdim: doc-rotdim. -- Function File: flipdim (X, DIM) Return a copy of X flipped about the dimension DIM. For example flipdim ([1, 2; 3, 4], 2) => 2 1 4 3 *See also:* *note fliplr: doc-fliplr, *note flipud: doc-flipud, *note rot90: doc-rot90, *note rotdim: doc-rotdim. -- Function File: rot90 (X, N) Return a copy of X with the elements rotated counterclockwise in 90-degree increments. The second argument is optional, and specifies how many 90-degree rotations are to be applied (the default value is 1). Negative values of N rotate the matrix in a clockwise direction. For example, rot90 ([1, 2; 3, 4], -1) => 3 1 4 2 rotates the given matrix clockwise by 90 degrees. The following are all equivalent statements: rot90 ([1, 2; 3, 4], -1) rot90 ([1, 2; 3, 4], 3) rot90 ([1, 2; 3, 4], 7) Due to the difficulty of defining an axis about which to rotate the matrix `rot90' only work with 2-D arrays. To rotate N-d arrays use `rotdim' instead. *See also:* *note rotdim: doc-rotdim, *note flipud: doc-flipud, *note fliplr: doc-fliplr, *note flipdim: doc-flipdim. -- Function File: rotdim (X, N, PLANE) Return a copy of X with the elements rotated counterclockwise in 90-degree increments. The second argument is optional, and specifies how many 90-degree rotations are to be applied (the default value is 1). The third argument is also optional and defines the plane of the rotation. As such PLANE is a two element vector containing two different valid dimensions of the matrix. If PLANE is not given Then the first two non-singleton dimensions are used. Negative values of N rotate the matrix in a clockwise direction. For example, rotdim ([1, 2; 3, 4], -1, [1, 2]) => 3 1 4 2 rotates the given matrix clockwise by 90 degrees. The following are all equivalent statements: rotdim ([1, 2; 3, 4], -1, [1, 2]) rotdim ([1, 2; 3, 4], 3, [1, 2]) rotdim ([1, 2; 3, 4], 7, [1, 2]) *See also:* *note rot90: doc-rot90, *note flipud: doc-flipud, *note fliplr: doc-fliplr, *note flipdim: doc-flipdim. -- Built-in Function: cat (DIM, ARRAY1, ARRAY2, ..., ARRAYN) Return the concatenation of N-d array objects, ARRAY1, ARRAY2, ..., ARRAYN along dimension DIM. A = ones (2, 2); B = zeros (2, 2); cat (2, A, B) => ans = 1 1 0 0 1 1 0 0 Alternatively, we can concatenate A and B along the second dimension the following way: [A, B]. DIM can be larger than the dimensions of the N-d array objects and the result will thus have DIM dimensions as the following example shows: cat (4, ones(2, 2), zeros (2, 2)) => ans = ans(:,:,1,1) = 1 1 1 1 ans(:,:,1,2) = 0 0 0 0 *See also:* *note horzcat: doc-horzcat, *note vertcat: doc-vertcat. -- Built-in Function: horzcat (ARRAY1, ARRAY2, ..., ARRAYN) Return the horizontal concatenation of N-d array objects, ARRAY1, ARRAY2, ..., ARRAYN along dimension 2. *See also:* *note cat: doc-cat, *note vertcat: doc-vertcat. -- Built-in Function: vertcat (ARRAY1, ARRAY2, ..., ARRAYN) Return the vertical concatenation of N-d array objects, ARRAY1, ARRAY2, ..., ARRAYN along dimension 1. *See also:* *note cat: doc-cat, *note horzcat: doc-horzcat. -- Built-in Function: permute (A, PERM) Return the generalized transpose for an N-d array object A. The permutation vector PERM must contain the elements `1:ndims(a)' (in any order, but each element must appear just once). *See also:* *note ipermute: doc-ipermute. -- Built-in Function: ipermute (A, IPERM) The inverse of the `permute' function. The expression ipermute (permute (a, perm), perm) returns the original array A. *See also:* *note permute: doc-permute. -- Built-in Function: reshape (A, M, N, ...) -- Built-in Function: reshape (A, SIZE) Return a matrix with the given dimensions whose elements are taken from the matrix A. The elements of the matrix are accessed in column-major order (like Fortran arrays are stored). For example, reshape ([1, 2, 3, 4], 2, 2) => 1 3 2 4 Note that the total number of elements in the original matrix must match the total number of elements in the new matrix. A single dimension of the return matrix can be unknown and is flagged by an empty argument. -- Built-in Function: resize (X, M) -- Built-in Function: resize (X, M, N) -- Built-in Function: resize (X, M, N, ...) Resize X cutting off elements as necessary. In the result, element with certain indices is equal to the corresponding element of X if the indices are within the bounds of X; otherwise, the element is set to zero. In other words, the statement y = resize (x, dv); is equivalent to the following code: y = zeros (dv, class (x)); sz = min (dv, size (x)); for i = 1:length (sz), idx{i} = 1:sz(i); endfor y(idx{:}) = x(idx{:}); but is performed more efficiently. If only M is supplied and it is a scalar, the dimension of the result is M-by-M. If M is a vector, then the dimensions of the result are given by the elements of M. If both M and N are scalars, then the dimensions of the result are M-by-N. An object can be resized to more dimensions than it has; in such case the missing dimensions are assumed to be 1. Resizing an object to fewer dimensions is not possible. *See also:* *note reshape: doc-reshape, *note postpad: doc-postpad. -- Function File: Y = circshift (X, N) Circularly shifts the values of the array X. N must be a vector of integers no longer than the number of dimensions in X. The values of N can be either positive or negative, which determines the direction in which the values or X are shifted. If an element of N is zero, then the corresponding dimension of X will not be shifted. For example x = [1, 2, 3; 4, 5, 6; 7, 8, 9]; circshift (x, 1) => 7, 8, 9 1, 2, 3 4, 5, 6 circshift (x, -2) => 7, 8, 9 1, 2, 3 4, 5, 6 circshift (x, [0,1]) => 3, 1, 2 6, 4, 5 9, 7, 8 *See also:* permute, ipermute, shiftdim. -- Function File: Y = shiftdim (X, N) -- Function File: [Y, NS] = shiftdim (X) Shifts the dimension of X by N, where N must be an integer scalar. When N is positive, the dimensions of X are shifted to the left, with the leading dimensions circulated to the end. If N is negative, then the dimensions of X are shifted to the right, with N leading singleton dimensions added. Called with a single argument, `shiftdim', removes the leading singleton dimensions, returning the number of dimensions removed in the second output argument NS. For example x = ones (1, 2, 3); size (shiftdim (x, -1)) => [1, 1, 2, 3] size (shiftdim (x, 1)) => [2, 3] [b, ns] = shiftdim (x); => b = [1, 1, 1; 1, 1, 1] => ns = 1 *See also:* reshape, permute, ipermute, circshift, squeeze. -- Function File: shift (X, B) -- Function File: shift (X, B, DIM) If X is a vector, perform a circular shift of length B of the elements of X. If X is a matrix, do the same for each column of X. If the optional DIM argument is given, operate along this dimension -- Loadable Function: [S, I] = sort (X) -- Loadable Function: [S, I] = sort (X, DIM) -- Loadable Function: [S, I] = sort (X, MODE) -- Loadable Function: [S, I] = sort (X, DIM, MODE) Return a copy of X with the elements arranged in increasing order. For matrices, `sort' orders the elements in each column. For example, sort ([1, 2; 2, 3; 3, 1]) => 1 1 2 2 3 3 The `sort' function may also be used to produce a matrix containing the original row indices of the elements in the sorted matrix. For example, [s, i] = sort ([1, 2; 2, 3; 3, 1]) => s = 1 1 2 2 3 3 => i = 1 3 2 1 3 2 If the optional argument DIM is given, then the matrix is sorted along the dimension defined by DIM. The optional argument `mode' defines the order in which the values will be sorted. Valid values of `mode' are `ascend' or `descend'. For equal elements, the indices are such that the equal elements are listed in the order that appeared in the original list. The `sort' function may also be used to sort strings and cell arrays of strings, in which case the dictionary order of the strings is used. The algorithm used in `sort' is optimized for the sorting of partially ordered lists. -- Function File: sortrows (A, C) Sort the rows of the matrix A according to the order of the columns specified in C. If C is omitted, a lexicographical sort is used. By default ascending order is used however if elements of C are negative then the corresponding column is sorted in descending order. -- Function File: issorted (A, ROWS) Returns true if the array is sorted, ascending or descending. NaNs are treated as by `sort'. If ROWS is supplied and has the value "rows", checks whether the array is sorted by rows as if output by `sortrows' (with no options). This function does not yet support sparse matrices. *See also:* *note sortrows: doc-sortrows, *note sort: doc-sort. Since the `sort' function does not allow sort keys to be specified, it can't be used to order the rows of a matrix according to the values of the elements in various columns(1) in a single call. Using the second output, however, it is possible to sort all rows based on the values in a given column. Here's an example that sorts the rows of a matrix based on the values in the second column. a = [1, 2; 2, 3; 3, 1]; [s, i] = sort (a (:, 2)); a (i, :) => 3 1 1 2 2 3 -- Function File: tril (A, K) -- Function File: triu (A, K) Return a new matrix formed by extracting the lower (`tril') or upper (`triu') triangular part of the matrix A, and setting all other elements to zero. The second argument is optional, and specifies how many diagonals above or below the main diagonal should also be set to zero. The default value of K is zero, so that `triu' and `tril' normally include the main diagonal as part of the result matrix. If the value of K is negative, additional elements above (for `tril') or below (for `triu') the main diagonal are also selected. The absolute value of K must not be greater than the number of sub- or super-diagonals. For example, tril (ones (3), -1) => 0 0 0 1 0 0 1 1 0 and tril (ones (3), 1) => 1 1 0 1 1 1 1 1 1 *See also:* *note triu: doc-triu, *note diag: doc-diag. -- Function File: vec (X) Return the vector obtained by stacking the columns of the matrix X one above the other. -- Function File: vech (X) Return the vector obtained by eliminating all supradiagonal elements of the square matrix X and stacking the result one column above the other. -- Function File: prepad (X, L, C) -- Function File: prepad (X, L, C, DIM) Prepend (append) the scalar value C to the vector X until it is of length L. If the third argument is not supplied, a value of 0 is used. If `length (X) > L', elements from the beginning (end) of X are removed until a vector of length L is obtained. If X is a matrix, elements are prepended or removed from each row. If the optional DIM argument is given, then operate along this dimension. *See also:* *note postpad: doc-postpad. -- Built-in Function: diag (V, K) Return a diagonal matrix with vector V on diagonal K. The second argument is optional. If it is positive, the vector is placed on the K-th super-diagonal. If it is negative, it is placed on the -K-th sub-diagonal. The default value of K is 0, and the vector is placed on the main diagonal. For example, diag ([1, 2, 3], 1) => 0 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 Given a matrix argument, instead of a vector, `diag' extracts the K-th diagonal of the matrix. -- Function File: blkdiag (A, B, C, ...) Build a block diagonal matrix from A, B, C, .... All the arguments must be numeric and are two-dimensional matrices or scalars. *See also:* *note diag: doc-diag, *note horzcat: doc-horzcat, *note vertcat: doc-vertcat. ---------- Footnotes ---------- (1) For example, to first sort based on the values in column 1, and then, for any values that are repeated in column 1, sort based on the values found in column 2, etc.  File: octave.info, Node: Applying a Function to an Array, Next: Special Utility Matrices, Prev: Rearranging Matrices, Up: Matrix Manipulation 16.3 Applying a Function to an Array ==================================== -- Function File: arrayfun (FUNC, A) -- Function File: X = arrayfun (FUNC, A) -- Function File: X = arrayfun (FUNC, A, B, ...) -- Function File: [X, Y, ...] = arrayfun (FUNC, A, ...) -- Function File: arrayfun (..., "UniformOutput", VAL) -- Function File: arrayfun (..., "ErrorHandler", ERRFUNC) Execute a function on each element of an array. This is useful for functions that do not accept array arguments. If the function does accept array arguments it is better to call the function directly. The first input argument FUNC can be a string, a function handle, an inline function or an anonymous function. The input argument A can be a logic array, a numeric array, a string array, a structure array or a cell array. By a call of the function `arrayfun' all elements of A are passed on to the named function FUNC individually. The named function can also take more than two input arguments, with the input arguments given as third input argument B, fourth input argument C, ... If given more than one array input argument then all input arguments must have the same sizes, for example arrayfun (@atan2, [1, 0], [0, 1]) => ans = [1.5708 0.0000] If the parameter VAL after a further string input argument "UniformOutput" is set `true' (the default), then the named function FUNC must return a single element which then will be concatenated into the return value and is of type matrix. Otherwise, if that parameter is set to `false', then the outputs are concatenated in a cell array. For example arrayfun (@(x,y) x:y, "abc", "def", "UniformOutput", false) => ans = { [1,1] = abcd [1,2] = bcde [1,3] = cdef } If more than one output arguments are given then the named function must return the number of return values that also are expected, for example [A, B, C] = arrayfun (@find, [10; 0], "UniformOutput", false) => A = { [1,1] = 1 [2,1] = [](0x0) } B = { [1,1] = 1 [2,1] = [](0x0) } C = { [1,1] = 10 [2,1] = [](0x0) } If the parameter ERRFUNC after a further string input argument "ErrorHandler" is another string, a function handle, an inline function or an anonymous function, then ERRFUNC defines a function to call in the case that FUNC generates an error. The definition of the function must be of the form function [...] = errfunc (S, ...) where there is an additional input argument to ERRFUNC relative to FUNC, given by S. This is a structure with the elements "identifier", "message" and "index", giving respectively the error identifier, the error message and the index of the array elements that caused the error. The size of the output argument of ERRFUNC must have the same size as the output argument of FUNC, otherwise a real error is thrown. For example function y = ferr (s, x), y = "MyString"; endfunction arrayfun (@str2num, [1234], \ "UniformOutput", false, "ErrorHandler", @ferr) => ans = { [1,1] = MyString } *See also:* *note cellfun: doc-cellfun, *note spfun: doc-spfun, *note structfun: doc-structfun. -- Loadable Function: bsxfun (F, A, B) Applies a binary function F element-wise to two matrix arguments A and B. The function F must be capable of accepting two column vector arguments of equal length, or one column vector argument and a scalar. The dimensions of A and B must be equal or singleton. The singleton dimensions of the matrices will be expanded to the same dimensionality as the other matrix. *See also:* *note arrayfun: doc-arrayfun, *note cellfun: doc-cellfun.  File: octave.info, Node: Special Utility Matrices, Next: Famous Matrices, Prev: Applying a Function to an Array, Up: Matrix Manipulation 16.4 Special Utility Matrices ============================= -- Built-in Function: eye (X) -- Built-in Function: eye (N, M) -- Built-in Function: eye (..., CLASS) Return an identity matrix. If invoked with a single scalar argument, `eye' returns a square matrix with the dimension specified. If you supply two scalar arguments, `eye' takes them to be the number of rows and columns. If given a vector with two elements, `eye' uses the values of the elements as the number of rows and columns, respectively. For example, eye (3) => 1 0 0 0 1 0 0 0 1 The following expressions all produce the same result: eye (2) == eye (2, 2) == eye (size ([1, 2; 3, 4]) The optional argument CLASS, allows `eye' to return an array of the specified type, like val = zeros (n,m, "uint8") Calling `eye' with no arguments is equivalent to calling it with an argument of 1. This odd definition is for compatibility with MATLAB. -- Built-in Function: ones (X) -- Built-in Function: ones (N, M) -- Built-in Function: ones (N, M, K, ...) -- Built-in Function: ones (..., CLASS) Return a matrix or N-dimensional array whose elements are all 1. The arguments are handled the same as the arguments for `eye'. If you need to create a matrix whose values are all the same, you should use an expression like val_matrix = val * ones (n, m) The optional argument CLASS, allows `ones' to return an array of the specified type, for example val = ones (n,m, "uint8") -- Built-in Function: zeros (X) -- Built-in Function: zeros (N, M) -- Built-in Function: zeros (N, M, K, ...) -- Built-in Function: zeros (..., CLASS) Return a matrix or N-dimensional array whose elements are all 0. The arguments are handled the same as the arguments for `eye'. The optional argument CLASS, allows `zeros' to return an array of the specified type, for example val = zeros (n,m, "uint8") -- Function File: repmat (A, M, N) -- Function File: repmat (A, [M N]) -- Function File: repmat (A, [M N P ...]) Form a block matrix of size M by N, with a copy of matrix A as each element. If N is not specified, form an M by M block matrix. -- Loadable Function: rand (X) -- Loadable Function: rand (N, M) -- Loadable Function: rand ("state", X) -- Loadable Function: rand ("seed", X) Return a matrix with random elements uniformly distributed on the interval (0, 1). The arguments are handled the same as the arguments for `eye'. You can query the state of the random number generator using the form v = rand ("state") This returns a column vector V of length 625. Later, you can restore the random number generator to the state V using the form rand ("state", v) You may also initialize the state vector from an arbitrary vector of length <= 625 for V. This new state will be a hash based on the value of V, not V itself. By default, the generator is initialized from `/dev/urandom' if it is available, otherwise from cpu time, wall clock time and the current fraction of a second. To compute the pseudo-random sequence, `rand' uses the Mersenne Twister with a period of 2^19937-1 (See M. Matsumoto and T. Nishimura, `Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator', ACM Trans. on Modeling and Computer Simulation Vol. 8, No. 1, January pp.3-30 1998, `http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html'). Do *not* use for cryptography without securely hashing several returned values together, otherwise the generator state can be learned after reading 624 consecutive values. Older versions of Octave used a different random number generator. The new generator is used by default as it is significantly faster than the old generator, and produces random numbers with a significantly longer cycle time. However, in some circumstances it might be desirable to obtain the same random sequences as used by the old generators. To do this the keyword "seed" is used to specify that the old generators should be use, as in rand ("seed", val) which sets the seed of the generator to VAL. The seed of the generator can be queried with s = rand ("seed") However, it should be noted that querying the seed will not cause `rand' to use the old generators, only setting the seed will. To cause `rand' to once again use the new generators, the keyword "state" should be used to reset the state of the `rand'. *See also:* *note randn: doc-randn, *note rande: doc-rande, *note randg: doc-randg, *note randp: doc-randp. -- Loadable Function: randn (X) -- Loadable Function: randn (N, M) -- Loadable Function: randn ("state", X) -- Loadable Function: randn ("seed", X) Return a matrix with normally distributed pseudo-random elements having zero mean and variance one. The arguments are handled the same as the arguments for `rand'. By default, `randn' uses the Marsaglia and Tsang "Ziggurat technique" to transform from a uniform to a normal distribution. (G. Marsaglia and W.W. Tsang, `Ziggurat method for generating random variables', J. Statistical Software, vol 5, 2000, `http://www.jstatsoft.org/v05/i08/') *See also:* *note rand: doc-rand, *note rande: doc-rande, *note randg: doc-randg, *note randp: doc-randp. -- Loadable Function: rande (X) -- Loadable Function: rande (N, M) -- Loadable Function: rande ("state", X) -- Loadable Function: rande ("seed", X) Return a matrix with exponentially distributed random elements. The arguments are handled the same as the arguments for `rand'. By default, `randn' uses the Marsaglia and Tsang "Ziggurat technique" to transform from a uniform to a exponential distribution. (G. Marsaglia and W.W. Tsang, `Ziggurat method for generating random variables', J. Statistical Software, vol 5, 2000, `http://www.jstatsoft.org/v05/i08/') *See also:* *note rand: doc-rand, *note randn: doc-randn, *note randg: doc-randg, *note randp: doc-randp. -- Loadable Function: randp (L, X) -- Loadable Function: randp (L, N, M) -- Loadable Function: randp ("state", X) -- Loadable Function: randp ("seed", X) Return a matrix with Poisson distributed random elements with mean value parameter given by the first argument, L. The arguments are handled the same as the arguments for `rand', except for the argument L. Five different algorithms are used depending on the range of L and whether or not L is a scalar or a matrix. For scalar L <= 12, use direct method. Press, et al., 'Numerical Recipes in C', Cambridge University Press, 1992. For scalar L > 12, use rejection method.[1] Press, et al., 'Numerical Recipes in C', Cambridge University Press, 1992. For matrix L <= 10, use inversion method.[2] Stadlober E., et al., WinRand source code, available via FTP. For matrix L > 10, use patchwork rejection method. Stadlober E., et al., WinRand source code, available via FTP, or H. Zechner, 'Efficient sampling from continuous and discrete unimodal distributions', Doctoral Dissertation, 156pp., Technical University Graz, Austria, 1994. For L > 1e8, use normal approximation. L. Montanet, et al., 'Review of Particle Properties', Physical Review D 50 p1284, 1994 *See also:* *note rand: doc-rand, *note randn: doc-randn, *note rande: doc-rande, *note randg: doc-randg. -- Loadable Function: randg (A, X) -- Loadable Function: randg (A, N, M) -- Loadable Function: randg ("state", X) -- Loadable Function: randg ("seed", X) Return a matrix with `gamma(A,1)' distributed random elements. The arguments are handled the same as the arguments for `rand', except for the argument A. This can be used to generate many distributions: `gamma (a, b)' for `a > -1', `b > 0' r = b * randg (a) `beta (a, b)' for `a > -1', `b > -1' r1 = randg (a, 1) r = r1 / (r1 + randg (b, 1)) `Erlang (a, n)' r = a * randg (n) `chisq (df)' for `df > 0' r = 2 * randg (df / 2) `t(df)' for `0 < df < inf' (use randn if df is infinite) r = randn () / sqrt (2 * randg (df / 2) / df) `F (n1, n2)' for `0 < n1', `0 < n2' ## r1 equals 1 if n1 is infinite r1 = 2 * randg (n1 / 2) / n1 ## r2 equals 1 if n2 is infinite r2 = 2 * randg (n2 / 2) / n2 r = r1 / r2 negative `binomial (n, p)' for `n > 0', `0 < p <= 1' r = randp ((1 - p) / p * randg (n)) non-central `chisq (df, L)', for `df >= 0' and `L > 0' (use chisq if `L = 0') r = randp (L / 2) r(r > 0) = 2 * randg (r(r > 0)) r(df > 0) += 2 * randg (df(df > 0)/2) `Dirichlet (a1, ... ak)' r = (randg (a1), ..., randg (ak)) r = r / sum (r) *See also:* *note rand: doc-rand, *note randn: doc-randn, *note rande: doc-rande, *note randp: doc-randp. The generators operate in the new or old style together, it is not possible to mix the two. Initializing any generator with `"state"' or `"seed"' causes the others to switch to the same style for future calls. The state of each generator is independent and calls to different generators can be interleaved without affecting the final result. For example, rand ("state", [11, 22, 33]); randn ("state", [44, 55, 66]); u = rand (100, 1); n = randn (100, 1); and rand ("state", [11, 22, 33]); randn ("state", [44, 55, 66]); u = zeros (100, 1); n = zeros (100, 1); for i = 1:100 u(i) = rand (); n(i) = randn (); end produce equivalent results. When the generators are initialized in the old style with `"seed"' only `rand' and `randn' are independent, because the old `rande', `randg' and `randp' generators make calls to `rand' and `randn'. The generators are initialized with random states at start-up, so that the sequences of random numbers are not the same each time you run Octave.(1) If you really do need to reproduce a sequence of numbers exactly, you can set the state or seed to a specific value. If invoked without arguments, `rand' and `randn' return a single element of a random sequence. The original `rand' and `randn' functions use Fortran code from RANLIB, a library of fortran routines for random number generation, compiled by Barry W. Brown and James Lovato of the Department of Biomathematics at The University of Texas, M.D. Anderson Cancer Center, Houston, TX 77030. -- Function File: randperm (N) Return a row vector containing a random permutation of the integers from 1 to N. The functions `linspace' and `logspace' make it very easy to create vectors with evenly or logarithmically spaced elements. *Note Ranges::. -- Built-in Function: linspace (BASE, LIMIT, N) Return a row vector with N linearly spaced elements between BASE and LIMIT. If the number of elements is greater than one, then the BASE and LIMIT are always included in the range. If BASE is greater than LIMIT, the elements are stored in decreasing order. If the number of points is not specified, a value of 100 is used. The `linspace' function always returns a row vector. For compatibility with MATLAB, return the second argument if fewer than two values are requested. -- Function File: logspace (BASE, LIMIT, N) Similar to `linspace' except that the values are logarithmically spaced from 10^base to 10^limit. If LIMIT is equal to pi, the points are between 10^base and pi, _not_ 10^base and 10^pi, in order to be compatible with the corresponding MATLAB function. Also for compatibility, return the second argument if fewer than two values are requested. *See also:* *note linspace: doc-linspace. ---------- Footnotes ---------- (1) The old versions of `rand' and `randn' obtain their initial seeds from the system clock.  File: octave.info, Node: Famous Matrices, Prev: Special Utility Matrices, Up: Matrix Manipulation 16.5 Famous Matrices ==================== The following functions return famous matrix forms. -- Function File: hadamard (N) Construct a Hadamard matrix HN of size N-by-N. The size N must be of the form `2 ^ K * P' in which P is one of 1, 12, 20 or 28. The returned matrix is normalized, meaning `Hn(:,1) == 1' and `H(1,:) == 1'. Some of the properties of Hadamard matrices are: * `kron (HM, HN)' is a Hadamard matrix of size M-by-N. * `Hn * Hn' == N * eye (N)'. * The rows of HN are orthogonal. * `det (A) <= abs(det (HN))' for all A with `abs (A (I, J)) <= 1'. * Multiply any row or column by -1 and still have a Hadamard matrix. -- Function File: hankel (C, R) Return the Hankel matrix constructed given the first column C, and (optionally) the last row R. If the last element of C is not the same as the first element of R, the last element of C is used. If the second argument is omitted, it is assumed to be a vector of zeros with the same size as C. A Hankel matrix formed from an m-vector C, and an n-vector R, has the elements H(i,j) = c(i+j-1), i+j-1 <= m; H(i,j) = r(i+j-m), otherwise *See also:* *note vander: doc-vander, *note sylvester_matrix: doc-sylvester_matrix, *note hilb: doc-hilb, *note invhilb: doc-invhilb, *note toeplitz: doc-toeplitz. -- Function File: hilb (N) Return the Hilbert matrix of order N. The i, j element of a Hilbert matrix is defined as H (i, j) = 1 / (i + j - 1) *See also:* *note hankel: doc-hankel, *note vander: doc-vander, *note sylvester_matrix: doc-sylvester_matrix, *note invhilb: doc-invhilb, *note toeplitz: doc-toeplitz. -- Function File: invhilb (N) Return the inverse of a Hilbert matrix of order N. This can be computed exactly using (i+j) /n+i-1\ /n+j-1\ /i+j-2\ 2 A(i,j) = -1 (i+j-1)( )( ) ( ) \ n-j / \ n-i / \ i-2 / = p(i) p(j) / (i+j-1) where k /k+n-1\ /n\ p(k) = -1 ( ) ( ) \ k-1 / \k/ The validity of this formula can easily be checked by expanding the binomial coefficients in both formulas as factorials. It can be derived more directly via the theory of Cauchy matrices: see J. W. Demmel, Applied Numerical Linear Algebra, page 92. Compare this with the numerical calculation of `inverse (hilb (n))', which suffers from the ill-conditioning of the Hilbert matrix, and the finite precision of your computer's floating point arithmetic. *See also:* *note hankel: doc-hankel, *note vander: doc-vander, *note sylvester_matrix: doc-sylvester_matrix, *note hilb: doc-hilb, *note toeplitz: doc-toeplitz. -- Function File: magic (N) Create an N-by-N magic square. Note that `magic (2)' is undefined since there is no 2-by-2 magic square. -- Function File: pascal (N, T) Return the Pascal matrix of order N if `T = 0'. T defaults to 0. Return lower triangular Cholesky factor of the Pascal matrix if `T = 1'. This matrix is its own inverse, that is `pascal (N, 1) ^ 2 == eye (N)'. If `T = -1', return its absolute value. This is the standard pascal triangle as a lower-triangular matrix. If `T = 2', return a transposed and permuted version of `pascal (N, 1)', which is the cube-root of the identity matrix. That is `pascal (N, 2) ^ 3 == eye (N)'. *See also:* *note hankel: doc-hankel, *note vander: doc-vander, *note sylvester_matrix: doc-sylvester_matrix, *note hilb: doc-hilb, *note invhilb: doc-invhilb, *note toeplitz: doc-toeplitz, *note hadamard: doc-hadamard, *note wilkinson: doc-wilkinson, *note compan: doc-compan, *note rosser: doc-rosser. -- Function File: rosser () Returns the Rosser matrix. This is a difficult test case used to test eigenvalue algorithms. *See also:* *note hankel: doc-hankel, *note vander: doc-vander, *note sylvester_matrix: doc-sylvester_matrix, *note hilb: doc-hilb, *note invhilb: doc-invhilb, *note toeplitz: doc-toeplitz, *note hadamard: doc-hadamard, *note wilkinson: doc-wilkinson, *note compan: doc-compan, *note pascal: doc-pascal. -- Function File: sylvester_matrix (K) Return the Sylvester matrix of order n = 2^k. *See also:* *note hankel: doc-hankel, *note vander: doc-vander, *note hilb: doc-hilb, *note invhilb: doc-invhilb, *note toeplitz: doc-toeplitz. -- Function File: toeplitz (C, R) Return the Toeplitz matrix constructed given the first column C, and (optionally) the first row R. If the first element of C is not the same as the first element of R, the first element of C is used. If the second argument is omitted, the first row is taken to be the same as the first column. A square Toeplitz matrix has the form: c(0) r(1) r(2) ... r(n) c(1) c(0) r(1) ... r(n-1) c(2) c(1) c(0) ... r(n-2) . , , . . . , , . . . , , . . c(n) c(n-1) c(n-2) ... c(0) *See also:* *note hankel: doc-hankel, *note vander: doc-vander, *note sylvester_matrix: doc-sylvester_matrix, *note hilb: doc-hilb, *note invhilb: doc-invhilb. -- Function File: vander (C, N) Return the Vandermonde matrix whose next to last column is C. If N is specified, it determines the number of columns; otherwise, N is taken to be equal to the length of C. A Vandermonde matrix has the form: c(1)^(n-1) ... c(1)^2 c(1) 1 c(2)^(n-1) ... c(2)^2 c(2) 1 . . . . . . . . . . . . . . . c(n)^(n-1) ... c(n)^2 c(n) 1 *See also:* *note hankel: doc-hankel, *note sylvester_matrix: doc-sylvester_matrix, *note hilb: doc-hilb, *note invhilb: doc-invhilb, *note toeplitz: doc-toeplitz. -- Function File: wilkinson (N) Return the Wilkinson matrix of order N. *See also:* *note hankel: doc-hankel, *note vander: doc-vander, *note sylvester_matrix: doc-sylvester_matrix, *note hilb: doc-hilb, *note invhilb: doc-invhilb, *note toeplitz: doc-toeplitz, *note hadamard: doc-hadamard, *note rosser: doc-rosser, *note compan: doc-compan, *note pascal: doc-pascal.  File: octave.info, Node: Arithmetic, Next: Linear Algebra, Prev: Matrix Manipulation, Up: Top 17 Arithmetic ************* Unless otherwise noted, all of the functions described in this chapter will work for real and complex scalar, vector, or matrix arguments. Functions described as "mapping functions" apply the given operation individually to each element when given a matrix argument. For example, sin ([1, 2; 3, 4]) => 0.84147 0.90930 0.14112 -0.75680 * Menu: * Exponents and Logarithms:: * Complex Arithmetic:: * Trigonometry:: * Sums and Products:: * Utility Functions:: * Special Functions:: * Coordinate Transformations:: * Mathematical Constants::  File: octave.info, Node: Exponents and Logarithms, Next: Complex Arithmetic, Up: Arithmetic 17.1 Exponents and Logarithms ============================= -- Mapping Function: exp (X) Compute `e^x' for each element of X. To compute the matrix exponential, see *note Linear Algebra::. *See also:* *note log: doc-log. -- Mapping Function: expm1 (X) Compute `exp (X) - 1' accurately in the neighborhood of zero. *See also:* *note exp: doc-exp. -- Mapping Function: log (X) Compute the natural logarithm, `ln (X)', for each element of X. To compute the matrix logarithm, see *note Linear Algebra::. *See also:* *note exp: doc-exp, *note log1p: doc-log1p, *note log2: doc-log2, *note log10: doc-log10, *note logspace: doc-logspace. -- Mapping Function: log1p (X) Compute `log (1 + X)' accurately in the neighborhood of zero. *See also:* *note log: doc-log, *note exp: doc-exp, *note expm1: doc-expm1. -- Mapping Function: log10 (X) Compute the base-10 logarithm of each element of X. *See also:* *note log: doc-log, *note log2: doc-log2, *note logspace: doc-logspace, *note exp: doc-exp. -- Mapping Function: log2 (X) -- Mapping Function: [F, E] = log2 (X) Compute the base-2 logarithm of each element of X. If called with two output arguments, split X into binary mantissa and exponent so that `1/2 <= abs(f) < 1' and E is an integer. If `x = 0', `f = e = 0'. *See also:* *note pow2: doc-pow2, *note log: doc-log, *note log10: doc-log10, *note exp: doc-exp. -- Function File: nextpow2 (X) If X is a scalar, return the first integer N such that 2^n >= abs (x). If X is a vector, return `nextpow2 (length (X))'. *See also:* *note pow2: doc-pow2, *note log2: doc-log2. -- Function File: nthroot (X, N) Compute the n-th root of X, returning real results for real components of X. For example nthroot (-1, 3) => -1 (-1) ^ (1 / 3) => 0.50000 - 0.86603i -- Mapping Function: pow2 (X) -- Mapping Function: pow2 (F, E) With one argument, computes 2 .^ x for each element of X. With two arguments, returns f .* (2 .^ e). *See also:* *note log2: doc-log2, *note nextpow2: doc-nextpow2. -- Function File: reallog (X) Return the real-valued natural logarithm of each element of X. Report an error if any element results in a complex return value. *See also:* *note log: doc-log, *note realpow: doc-realpow, *note realsqrt: doc-realsqrt. -- Function File: realpow (X, Y) Compute the real-valued, element-by-element power operator. This is equivalent to `X .^ Y', except that `realpow' reports an error if any return value is complex. *See also:* *note reallog: doc-reallog, *note realsqrt: doc-realsqrt. -- Function File: realsqrt (X) Return the real-valued square root of each element of X. Report an error if any element results in a complex return value. *See also:* *note sqrt: doc-sqrt, *note realpow: doc-realpow, *note reallog: doc-reallog. -- Mapping Function: sqrt (X) Compute the square root of each element of X. If X is negative, a complex result is returned. To compute the matrix square root, see *note Linear Algebra::. *See also:* *note realsqrt: doc-realsqrt.  File: octave.info, Node: Complex Arithmetic, Next: Trigonometry, Prev: Exponents and Logarithms, Up: Arithmetic 17.2 Complex Arithmetic ======================= In the descriptions of the following functions, Z is the complex number X + IY, where I is defined as `sqrt (-1)'. -- Mapping Function: abs (Z) Compute the magnitude of Z, defined as |Z| = `sqrt (x^2 + y^2)'. For example, abs (3 + 4i) => 5 -- Mapping Function: arg (Z) -- Mapping Function: angle (Z) Compute the argument of Z, defined as, THETA = `atan2 (Y, X)', in radians. For example, arg (3 + 4i) => 0.92730 -- Mapping Function: conj (Z) Return the complex conjugate of Z, defined as `conj (Z)' = X - IY. *See also:* *note real: doc-real, *note imag: doc-imag. -- Function File: cplxpair (Z) -- Function File: cplxpair (Z, TOL) -- Function File: cplxpair (Z, TOL, DIM) Sort the numbers Z into complex conjugate pairs ordered by increasing real part. Place the negative imaginary complex number first within each pair. Place all the real numbers (those with `abs (imag (Z) / Z) < TOL)') after the complex pairs. If TOL is unspecified the default value is 100*`eps'. By default the complex pairs are sorted along the first non-singleton dimension of Z. If DIM is specified, then the complex pairs are sorted along this dimension. Signal an error if some complex numbers could not be paired. Signal an error if all complex numbers are not exact conjugates (to within TOL). Note that there is no defined order for pairs with identical real parts but differing imaginary parts. cplxpair (exp(2i*pi*[0:4]'/5)) == exp(2i*pi*[3; 2; 4; 1; 0]/5) -- Mapping Function: imag (Z) Return the imaginary part of Z as a real number. *See also:* *note real: doc-real, *note conj: doc-conj. -- Mapping Function: real (Z) Return the real part of Z. *See also:* *note imag: doc-imag, *note conj: doc-conj.  File: octave.info, Node: Trigonometry, Next: Sums and Products, Prev: Complex Arithmetic, Up: Arithmetic 17.3 Trigonometry ================= Octave provides the following trigonometric functions where angles are specified in radians. To convert from degrees to radians multiply by `pi/180' (e.g., `sin (30 * pi/180)' returns the sine of 30 degrees). As an alternative, Octave provides a number of trigonometric functions which work directly on an argument specified in degrees. These functions are named after the base trigonometric function with a `d' suffix. For example, `sin' expects an angle in radians while `sind' expects an angle in degrees. -- Mapping Function: sin (X) Compute the sine for each element of X in radians. *See also:* *note asin: doc-asin, *note sind: doc-sind, *note sinh: doc-sinh. -- Mapping Function: cos (X) Compute the cosine for each element of X in radians. *See also:* *note acos: doc-acos, *note cosd: doc-cosd, *note cosh: doc-cosh. -- Mapping Function: tan (Z) Compute the tangent for each element of X in radians. *See also:* *note atan: doc-atan, *note tand: doc-tand, *note tanh: doc-tanh. -- Mapping Function: sec (X) Compute the secant for each element of X in radians. *See also:* *note asec: doc-asec, *note secd: doc-secd, *note sech: doc-sech. -- Mapping Function: csc (X) Compute the cosecant for each element of X in radians. *See also:* *note acsc: doc-acsc, *note cscd: doc-cscd, *note csch: doc-csch. -- Mapping Function: cot (X) Compute the cotangent for each element of X in radians. *See also:* *note acot: doc-acot, *note cotd: doc-cotd, *note coth: doc-coth. -- Mapping Function: asin (X) Compute the inverse sine in radians for each element of X. *See also:* *note sin: doc-sin, *note asind: doc-asind. -- Mapping Function: acos (X) Compute the inverse cosine in radians for each element of X. *See also:* *note cos: doc-cos, *note acosd: doc-acosd. -- Mapping Function: atan (X) Compute the inverse tangent in radians for each element of X. *See also:* *note tan: doc-tan, *note atand: doc-atand. -- Mapping Function: asec (X) Compute the inverse secant in radians for each element of X. *See also:* *note sec: doc-sec, *note asecd: doc-asecd. -- Mapping Function: acsc (X) Compute the inverse cosecant in radians for each element of X. *See also:* *note csc: doc-csc, *note acscd: doc-acscd. -- Mapping Function: acot (X) Compute the inverse cotangent in radians for each element of X. *See also:* *note cot: doc-cot, *note acotd: doc-acotd. -- Mapping Function: sinh (X) Compute the hyperbolic sine for each element of X. *See also:* *note asinh: doc-asinh, *note cosh: doc-cosh, *note tanh: doc-tanh. -- Mapping Function: cosh (X) Compute the hyperbolic cosine for each element of X. *See also:* *note acosh: doc-acosh, *note sinh: doc-sinh, *note tanh: doc-tanh. -- Mapping Function: tanh (X) Compute hyperbolic tangent for each element of X. *See also:* *note atanh: doc-atanh, *note sinh: doc-sinh, *note cosh: doc-cosh. -- Mapping Function: sech (X) Compute the hyperbolic secant of each element of X. *See also:* *note asech: doc-asech. -- Mapping Function: csch (X) Compute the hyperbolic cosecant of each element of X. *See also:* *note acsch: doc-acsch. -- Mapping Function: coth (X) Compute the hyperbolic cotangent of each element of X. *See also:* *note acoth: doc-acoth. -- Mapping Function: asinh (X) Compute the inverse hyperbolic sine for each element of X. *See also:* *note sinh: doc-sinh. -- Mapping Function: acosh (X) Compute the inverse hyperbolic cosine for each element of X. *See also:* *note cosh: doc-cosh. -- Mapping Function: atanh (X) Compute the inverse hyperbolic tangent for each element of X. *See also:* *note tanh: doc-tanh. -- Mapping Function: asech (X) Compute the inverse hyperbolic secant of each element of X. *See also:* *note sech: doc-sech. -- Mapping Function: acsch (X) Compute the inverse hyperbolic cosecant of each element of X. *See also:* *note csch: doc-csch. -- Mapping Function: acoth (X) Compute the inverse hyperbolic cotangent of each element of X. *See also:* *note coth: doc-coth. -- Mapping Function: atan2 (Y, X) Compute atan (Y / X) for corresponding elements of Y and X. Signal an error if Y and X do not match in size and orientation. Octave provides the following trigonometric functions where angles are specified in degrees. These functions produce true zeros at the appropriate intervals rather than the small roundoff error that occurs when using radians. For example: cosd (90) => 0 cos (pi/2) => 6.1230e-17 -- Function File: sind (X) Compute the sine for each element of X in degrees. Returns zero for elements where `X/180' is an integer. *See also:* *note asind: doc-asind, *note sin: doc-sin. -- Function File: cosd (X) Compute the cosine for each element of X in degrees. Returns zero for elements where `(X-90)/180' is an integer. *See also:* *note acosd: doc-acosd, *note cos: doc-cos. -- Function File: tand (X) Compute the tangent for each element of X in degrees. Returns zero for elements where `X/180' is an integer and `Inf' for elements where `(X-90)/180' is an integer. *See also:* *note atand: doc-atand, *note tan: doc-tan. -- Function File: secd (X) Compute the secant for each element of X in degrees. *See also:* *note asecd: doc-asecd, *note sec: doc-sec. -- Function File: cscd (X) Compute the cosecant for each element of X in degrees. *See also:* *note acscd: doc-acscd, *note csc: doc-csc. -- Function File: cotd (X) Compute the cotangent for each element of X in degrees. *See also:* *note acotd: doc-acotd, *note cot: doc-cot. -- Function File: asind (X) Compute the inverse sine in degrees for each element of X. *See also:* *note sind: doc-sind, *note asin: doc-asin. -- Function File: acosd (X) Compute the inverse cosine in degrees for each element of X. *See also:* *note cosd: doc-cosd, *note acos: doc-acos. -- Function File: atand (X) Compute the inverse tangent in degrees for each element of X. *See also:* *note tand: doc-tand, *note atan: doc-atan. -- Function File: asecd (X) Compute the inverse secant in degrees for each element of X. *See also:* *note secd: doc-secd, *note asec: doc-asec. -- Function File: acscd (X) Compute the inverse cosecant in degrees for each element of X. *See also:* *note cscd: doc-cscd, *note acsc: doc-acsc. -- Function File: acotd (X) Compute the inverse cotangent in degrees for each element of X. *See also:* *note cotd: doc-cotd, *note acot: doc-acot.  File: octave.info, Node: Sums and Products, Next: Utility Functions, Prev: Trigonometry, Up: Arithmetic 17.4 Sums and Products ====================== -- Built-in Function: sum (X) -- Built-in Function: sum (X, DIM) -- Built-in Function: sum (..., 'native') Sum of elements along dimension DIM. If DIM is omitted, it defaults to 1 (column-wise sum). As a special case, if X is a vector and DIM is omitted, return the sum of the elements. If the optional argument 'native' is given, then the sum is performed in the same type as the original argument, rather than in the default double type. For example sum ([true, true]) => 2 sum ([true, true], 'native') => true *See also:* *note cumsum: doc-cumsum, *note sumsq: doc-sumsq, *note prod: doc-prod. -- Built-in Function: prod (X) -- Built-in Function: prod (X, DIM) Product of elements along dimension DIM. If DIM is omitted, it defaults to 1 (column-wise products). As a special case, if X is a vector and DIM is omitted, return the product of the elements. *See also:* *note cumprod: doc-cumprod, *note sum: doc-sum. -- Built-in Function: cumsum (X) -- Built-in Function: cumsum (X, DIM) -- Built-in Function: cumsum (..., 'native') Cumulative sum of elements along dimension DIM. If DIM is omitted, it defaults to 1 (column-wise cumulative sums). As a special case, if X is a vector and DIM is omitted, return the cumulative sum of the elements as a vector with the same orientation as X. The "native" argument implies the summation is performed in native type. See `sum' for a complete description and example of the use of "native". *See also:* *note sum: doc-sum, *note cumprod: doc-cumprod. -- Built-in Function: cumprod (X) -- Built-in Function: cumprod (X, DIM) Cumulative product of elements along dimension DIM. If DIM is omitted, it defaults to 1 (column-wise cumulative products). As a special case, if X is a vector and DIM is omitted, return the cumulative product of the elements as a vector with the same orientation as X. *See also:* *note prod: doc-prod, *note cumsum: doc-cumsum. -- Built-in Function: sumsq (X) -- Built-in Function: sumsq (X, DIM) Sum of squares of elements along dimension DIM. If DIM is omitted, it defaults to 1 (column-wise sum of squares). As a special case, if X is a vector and DIM is omitted, return the sum of squares of the elements. This function is conceptually equivalent to computing sum (x .* conj (x), dim) but it uses less memory and avoids calling `conj' if X is real. *See also:* *note sum: doc-sum. -- Function File: accumarray (SUBS, VALS, SZ, FUNC, FILLVAL, ISSPARSE) -- Function File: accumarray (CSUBS, VALS, ...) Create an array by accumulating the elements of a vector into the positions defined by their subscripts. The subscripts are defined by the rows of the matrix SUBS and the values by VALS. Each row of SUBS corresponds to one of the values in VALS. The size of the matrix will be determined by the subscripts themselves. However, if SZ is defined it determines the matrix size. The length of SZ must correspond to the number of columns in SUBS. The default action of `accumarray' is to sum the elements with the same subscripts. This behavior can be modified by defining the FUNC function. This should be a function or function handle that accepts a column vector and returns a scalar. The result of the function should not depend on the order of the subscripts. The elements of the returned array that have no subscripts associated with them are set to zero. Defining FILLVAL to some other value allows these values to be defined. By default `accumarray' returns a full matrix. If ISSPARSE is logically true, then a sparse matrix is returned instead. An example of the use of `accumarray' is: accumarray ([1,1,1;2,1,2;2,3,2;2,1,2;2,3,2], 101:105) => ans(:,:,1) = [101, 0, 0; 0, 0, 0] ans(:,:,2) = [0, 0, 0; 206, 0, 208]  File: octave.info, Node: Utility Functions, Next: Special Functions, Prev: Sums and Products, Up: Arithmetic 17.5 Utility Functions ====================== -- Mapping Function: ceil (X) Return the smallest integer not less than X. This is equivalent to rounding towards positive infinity. If X is complex, return `ceil (real (X)) + ceil (imag (X)) * I'. ceil ([-2.7, 2.7]) => -2 3 *See also:* *note floor: doc-floor, *note round: doc-round, *note fix: doc-fix. -- Function File: cross (X, Y) -- Function File: cross (X, Y, DIM) Compute the vector cross product of two 3-dimensional vectors X and Y. cross ([1,1,0], [0,1,1]) => [ 1; -1; 1 ] If X and Y are matrices, the cross product is applied along the first dimension with 3 elements. The optional argument DIM forces the cross product to be calculated along the specified dimension. *See also:* *note dot: doc-dot. -- Function File: D = del2 (M) -- Function File: D = del2 (M, H) -- Function File: D = del2 (M, DX, DY, ...) Calculate the discrete Laplace operator. For a 2-dimensional matrix M this is defined as 1 / d^2 d^2 \ D = --- * | --- M(x,y) + --- M(x,y) | 4 \ dx^2 dy^2 / For N-dimensional arrays the sum in parentheses is expanded to include second derivatives over the additional higher dimensions. The spacing between evaluation points may be defined by H, which is a scalar defining the equidistant spacing in all dimensions. Alternatively, the spacing in each dimension may be defined separately by DX, DY, etc. A scalar spacing argument defines equidistant spacing, whereas a vector argument can be used to specify variable spacing. The length of the spacing vectors must match the respective dimension of M. The default spacing value is 1. At least 3 data points are needed for each dimension. Boundary points are calculated from the linear extrapolation of interior points. *See also:* *note gradient: doc-gradient, *note diff: doc-diff. -- Function File: P = factor (Q) -- Function File: [P, N] = factor (Q) Return prime factorization of Q. That is, `prod (P) == Q' and every element of P is a prime number. If `Q == 1', returns 1. With two output arguments, return the unique primes P and their multiplicities. That is, `prod (P .^ N) == Q'. *See also:* *note gcd: doc-gcd, *note lcm: doc-lcm. -- Function File: factorial (N) Return the factorial of N where N is a positive integer. If N is a scalar, this is equivalent to `prod (1:N)'. For vector or matrix arguments, return the factorial of each element in the array. For non-integers see the generalized factorial function `gamma'. *See also:* *note prod: doc-prod, *note gamma: doc-gamma. -- Mapping Function: fix (X) Truncate fractional portion of X and return the integer portion. This is equivalent to rounding towards zero. If X is complex, return `fix (real (X)) + fix (imag (X)) * I'. fix ([-2.7, 2.7]) => -2 2 *See also:* *note ceil: doc-ceil, *note floor: doc-floor, *note round: doc-round. -- Mapping Function: floor (X) Return the largest integer not greater than X. This is equivalent to rounding towards negative infinity. If X is complex, return `floor (real (X)) + floor (imag (X)) * I'. floor ([-2.7, 2.7]) => -3 2 *See also:* *note ceil: doc-ceil, *note round: doc-round, *note fix: doc-fix. -- Mapping Function: fmod (X, Y) Compute the floating point remainder of dividing X by Y using the C library function `fmod'. The result has the same sign as X. If Y is zero, the result is implementation-dependent. *See also:* *note mod: doc-mod, *note rem: doc-rem. -- Loadable Function: G = gcd (A) -- Loadable Function: G = gcd (A1, A2, ...) -- Loadable Function: [G, V1, ...] = gcd (A1, A2, ...) Compute the greatest common divisor of the elements of A. If more than one argument is given all arguments must be the same size or scalar. In this case the greatest common divisor is calculated for each element individually. All elements must be integers. For example, gcd ([15, 20]) => 5 and gcd ([15, 9], [20, 18]) => 5 9 Optional return arguments V1, etc., contain integer vectors such that, G = V1 .* A1 + V2 .* A2 + ... For backward compatibility with previous versions of this function, when all arguments are scalar, a single return argument V1 containing all of the values of V1, ... is acceptable. *See also:* *note lcm: doc-lcm, *note factor: doc-factor. -- Function File: DX = gradient (M) -- Function File: [DX, DY, DZ, ...] = gradient (M) -- Function File: [...] = gradient (M, S) -- Function File: [...] = gradient (M, X, Y, Z, ...) -- Function File: [...] = gradient (F, X0) -- Function File: [...] = gradient (F, X0, S) -- Function File: [...] = gradient (F, X0, X, Y, ...) Calculate the gradient of sampled data or a function. If M is a vector, calculate the one-dimensional gradient of M. If M is a matrix the gradient is calculated for each dimension. `[DX, DY] = gradient (M)' calculates the one dimensional gradient for X and Y direction if M is a matrix. Additional return arguments can be use for multi-dimensional matrices. A constant spacing between two points can be provided by the S parameter. If S is a scalar, it is assumed to be the spacing for all dimensions. Otherwise, separate values of the spacing can be supplied by the X, ... arguments. Scalar values specify an equidistant spacing. Vector values for the X, ... arguments specify the coordinate for that dimension. The length must match their respective dimension of M. At boundary points a linear extrapolation is applied. Interior points are calculated with the first approximation of the numerical gradient y'(i) = 1/(x(i+1)-x(i-1)) * (y(i-1)-y(i+1)). If the first argument F is a function handle, the gradient of the function at the points in X0 is approximated using central difference. For example, `gradient (@cos, 0)' approximates the gradient of the cosine function in the point x0 = 0. As with sampled data, the spacing values between the points from which the gradient is estimated can be set via the S or DX, DY, ... arguments. By default a spacing of 1 is used. *See also:* *note diff: doc-diff, *note del2: doc-del2. -- Built-in Function: hypot (X, Y) Compute the element-by-element square root of the sum of the squares of X and Y. This is equivalent to `sqrt (X.^2 + Y.^2)', but calculated in a manner that avoids overflows for large values of X or Y. -- Mapping Function: lcm (X) -- Mapping Function: lcm (X, ...) Compute the least common multiple of the elements of X, or of the list of all arguments. For example, lcm (a1, ..., ak) is the same as lcm ([a1, ..., ak]). All elements must be the same size or scalar. *See also:* *note factor: doc-factor, *note gcd: doc-gcd. -- Function File: list_primes (N) List the first N primes. If N is unspecified, the first 25 primes are listed. The algorithm used is from page 218 of the TeXbook. *See also:* *note primes: doc-primes, *note isprime: doc-isprime. -- Loadable Function: max (X) -- Loadable Function: max (X, Y) -- Loadable Function: max (X, Y, DIM) -- Loadable Function: [W, IW] = max (X) For a vector argument, return the maximum value. For a matrix argument, return the maximum value from each column, as a row vector, or over the dimension DIM if defined. For two matrices (or a matrix and scalar), return the pair-wise maximum. Thus, max (max (X)) returns the largest element of the matrix X, and max (2:5, pi) => 3.1416 3.1416 4.0000 5.0000 compares each element of the range `2:5' with `pi', and returns a row vector of the maximum values. For complex arguments, the magnitude of the elements are used for comparison. If called with one input and two output arguments, `max' also returns the first index of the maximum value(s). Thus, [x, ix] = max ([1, 3, 5, 2, 5]) => x = 5 ix = 3 *See also:* *note min: doc-min, *note cummax: doc-cummax, *note cummin: doc-cummin. -- Loadable Function: min (X) -- Loadable Function: min (X, Y) -- Loadable Function: min (X, Y, DIM) -- Loadable Function: [W, IW] = min (X) For a vector argument, return the minimum value. For a matrix argument, return the minimum value from each column, as a row vector, or over the dimension DIM if defined. For two matrices (or a matrix and scalar), return the pair-wise minimum. Thus, min (min (X)) returns the smallest element of X, and min (2:5, pi) => 2.0000 3.0000 3.1416 3.1416 compares each element of the range `2:5' with `pi', and returns a row vector of the minimum values. For complex arguments, the magnitude of the elements are used for comparison. If called with one input and two output arguments, `min' also returns the first index of the minimum value(s). Thus, [x, ix] = min ([1, 3, 0, 2, 0]) => x = 0 ix = 3 *See also:* *note max: doc-max, *note cummin: doc-cummin, *note cummax: doc-cummax. -- Loadable Function: cummax (X) -- Loadable Function: cummax (X, DIM) -- Loadable Function: [W, IW] = cummax (X) Return the cumulative maximum values along dimension DIM. If DIM is unspecified it defaults to column-wise operation. For example, cummax ([1 3 2 6 4 5]) => 1 3 3 6 6 6 The call [w, iw] = cummax (x, dim) is equivalent to the following code: w = iw = zeros (size (x)); idxw = idxx = repmat ({':'}, 1, ndims (x)); for i = 1:size (x, dim) idxw{dim} = i; idxx{dim} = 1:i; [w(idxw{:}), iw(idxw{:})] = max(x(idxx{:}), [], dim); endfor but computed in a much faster manner. *See also:* *note cummin: doc-cummin, *note max: doc-max, *note min: doc-min. -- Loadable Function: cummin (X) -- Loadable Function: cummin (X, DIM) -- Loadable Function: [W, IW] = cummin (X) Return the cumulative minimum values along dimension DIM. If DIM is unspecified it defaults to column-wise operation. For example, cummin ([5 4 6 2 3 1]) => 5 4 4 2 2 1 The call [w, iw] = cummin (x, dim) is equivalent to the following code: w = iw = zeros (size (x)); idxw = idxx = repmat ({':'}, 1, ndims (x)); for i = 1:size (x, dim) idxw{dim} = i; idxx{dim} = 1:i; [w(idxw{:}), iw(idxw{:})] = min(x(idxx{:}), [], dim); endfor but computed in a much faster manner. *See also:* *note cummax: doc-cummax, *note min: doc-min, *note max: doc-max. -- Mapping Function: mod (X, Y) Compute the modulo of X and Y. Conceptually this is given by x - y .* floor (x ./ y) and is written such that the correct modulus is returned for integer types. This function handles negative values correctly. That is, `mod (-1, 3)' is 2, not -1, as `rem (-1, 3)' returns. `mod (X, 0)' returns X. An error results if the dimensions of the arguments do not agree, or if either of the arguments is complex. *See also:* *note rem: doc-rem, *note fmod: doc-fmod. -- Function File: primes (N) Return all primes up to N. The algorithm used is the Sieve of Erastothenes. Note that if you need a specific number of primes you can use the fact the distance from one prime to the next is, on average, proportional to the logarithm of the prime. Integrating, one finds that there are about k primes less than k*log(5*k). *See also:* *note list_primes: doc-list_primes, *note isprime: doc-isprime. -- Mapping Function: rem (X, Y) Return the remainder of the division `X / Y', computed using the expression x - y .* fix (x ./ y) An error message is printed if the dimensions of the arguments do not agree, or if either of the arguments is complex. *See also:* *note mod: doc-mod, *note fmod: doc-fmod. -- Mapping Function: round (X) Return the integer nearest to X. If X is complex, return `round (real (X)) + round (imag (X)) * I'. round ([-2.7, 2.7]) => -3 3 *See also:* *note ceil: doc-ceil, *note floor: doc-floor, *note fix: doc-fix. -- Mapping Function: roundb (X) Return the integer nearest to X. If there are two nearest integers, return the even one (banker's rounding). If X is complex, return `roundb (real (X)) + roundb (imag (X)) * I'. *See also:* *note round: doc-round. -- Mapping Function: sign (X) Compute the "signum" function, which is defined as -1, x < 0; sign (x) = 0, x = 0; 1, x > 0. For complex arguments, `sign' returns `x ./ abs (X)'.  File: octave.info, Node: Special Functions, Next: Coordinate Transformations, Prev: Utility Functions, Up: Arithmetic 17.6 Special Functions ====================== -- Loadable Function: [A, IERR] = airy (K, Z, OPT) Compute Airy functions of the first and second kind, and their derivatives. K Function Scale factor (if 'opt' is supplied) --- -------- --------------------------------------- 0 Ai (Z) exp ((2/3) * Z * sqrt (Z)) 1 dAi(Z)/dZ exp ((2/3) * Z * sqrt (Z)) 2 Bi (Z) exp (-abs (real ((2/3) * Z *sqrt (Z)))) 3 dBi(Z)/dZ exp (-abs (real ((2/3) * Z *sqrt (Z)))) The function call `airy (Z)' is equivalent to `airy (0, Z)'. The result is the same size as Z. If requested, IERR contains the following status information and is the same size as the result. 0. Normal return. 1. Input error, return `NaN'. 2. Overflow, return `Inf'. 3. Loss of significance by argument reduction results in less than half of machine accuracy. 4. Complete loss of significance by argument reduction, return `NaN'. 5. Error--no computation, algorithm termination condition not met, return `NaN'. -- Loadable Function: [J, IERR] = besselj (ALPHA, X, OPT) -- Loadable Function: [Y, IERR] = bessely (ALPHA, X, OPT) -- Loadable Function: [I, IERR] = besseli (ALPHA, X, OPT) -- Loadable Function: [K, IERR] = besselk (ALPHA, X, OPT) -- Loadable Function: [H, IERR] = besselh (ALPHA, K, X, OPT) Compute Bessel or Hankel functions of various kinds: `besselj' Bessel functions of the first kind. If the argument OPT is supplied, the result is multiplied by `exp(-abs(imag(x)))'. `bessely' Bessel functions of the second kind. If the argument OPT is supplied, the result is multiplied by `exp(-abs(imag(x)))'. `besseli' Modified Bessel functions of the first kind. If the argument OPT is supplied, the result is multiplied by `exp(-abs(real(x)))'. `besselk' Modified Bessel functions of the second kind. If the argument OPT is supplied, the result is multiplied by `exp(x)'. `besselh' Compute Hankel functions of the first (K = 1) or second (K = 2) kind. If the argument OPT is supplied, the result is multiplied by `exp (-I*X)' for K = 1 or `exp (I*X)' for K = 2. If ALPHA is a scalar, the result is the same size as X. If X is a scalar, the result is the same size as ALPHA. If ALPHA is a row vector and X is a column vector, the result is a matrix with `length (X)' rows and `length (ALPHA)' columns. Otherwise, ALPHA and X must conform and the result will be the same size. The value of ALPHA must be real. The value of X may be complex. If requested, IERR contains the following status information and is the same size as the result. 0. Normal return. 1. Input error, return `NaN'. 2. Overflow, return `Inf'. 3. Loss of significance by argument reduction results in less than half of machine accuracy. 4. Complete loss of significance by argument reduction, return `NaN'. 5. Error--no computation, algorithm termination condition not met, return `NaN'. -- Mapping Function: beta (A, B) For real inputs, return the Beta function, beta (a, b) = gamma (a) * gamma (b) / gamma (a + b). -- Mapping Function: betainc (X, A, B) Return the incomplete Beta function, x / betainc (x, a, b) = beta (a, b)^(-1) | t^(a-1) (1-t)^(b-1) dt. / t=0 If x has more than one component, both A and B must be scalars. If X is a scalar, A and B must be of compatible dimensions. -- Mapping Function: betaln (A, B) Return the log of the Beta function, betaln (a, b) = gammaln (a) + gammaln (b) - gammaln (a + b) *See also:* *note beta: doc-beta, *note betainc: doc-betainc, *note gammaln: doc-gammaln. -- Mapping Function: bincoeff (N, K) Return the binomial coefficient of N and K, defined as / \ | n | n (n-1) (n-2) ... (n-k+1) | | = ------------------------- | k | k! \ / For example, bincoeff (5, 2) => 10 In most cases, the `nchoosek' function is faster for small scalar integer arguments. It also warns about loss of precision for big arguments. *See also:* *note nchoosek: doc-nchoosek. -- Function File: commutation_matrix (M, N) Return the commutation matrix K(m,n) which is the unique M*N by M*N matrix such that K(m,n) * vec(A) = vec(A') for all m by n matrices A. If only one argument M is given, K(m,m) is returned. See Magnus and Neudecker (1988), Matrix differential calculus with applications in statistics and econometrics. -- Function File: duplication_matrix (N) Return the duplication matrix Dn which is the unique n^2 by n*(n+1)/2 matrix such that Dn vech (A) = vec (A) for all symmetric n by n matrices A. See Magnus and Neudecker (1988), Matrix differential calculus with applications in statistics and econometrics. -- Mapping Function: erf (Z) Computes the error function, z / erf (z) = (2/sqrt (pi)) | e^(-t^2) dt / t=0 *See also:* *note erfc: doc-erfc, *note erfinv: doc-erfinv. -- Mapping Function: erfc (Z) Computes the complementary error function, `1 - erf (Z)'. *See also:* *note erf: doc-erf, *note erfinv: doc-erfinv. -- Mapping Function: erfinv (Z) Computes the inverse of the error function. *See also:* *note erf: doc-erf, *note erfc: doc-erfc. -- Mapping Function: gamma (Z) Computes the Gamma function, infinity / gamma (z) = | t^(z-1) exp (-t) dt. / t=0 *See also:* *note gammainc: doc-gammainc, *note lgamma: doc-lgamma. -- Mapping Function: gammainc (X, A) Compute the normalized incomplete gamma function, x 1 / gammainc (x, a) = --------- | exp (-t) t^(a-1) dt gamma (a) / t=0 with the limiting value of 1 as X approaches infinity. The standard notation is P(a,x), e.g., Abramowitz and Stegun (6.5.1). If A is scalar, then `gammainc (X, A)' is returned for each element of X and vice versa. If neither X nor A is scalar, the sizes of X and A must agree, and GAMMAINC is applied element-by-element. *See also:* *note gamma: doc-gamma, *note lgamma: doc-lgamma. -- Function File: L = legendre (N, X) -- Function File: L = legendre (N, X, NORMALIZATION) Compute the Legendre function of degree N and order M = 0 ... N. The optional argument, NORMALIZATION, may be one of `"unnorm"', `"sch"', or `"norm"'. The default is `"unnorm"'. The value of N must be a non-negative scalar integer. If the optional argument NORMALIZATION is missing or is `"unnorm"', compute the Legendre function of degree N and order M and return all values for M = 0 ... N. The return value has one dimension more than X. The Legendre Function of degree N and order M: m m 2 m/2 d^m P(x) = (-1) * (1-x ) * ---- P (x) n dx^m n with Legendre polynomial of degree N: 1 d^n 2 n P (x) = ------ [----(x - 1) ] n 2^n n! dx^n `legendre (3, [-1.0, -0.9, -0.8])' returns the matrix: x | -1.0 | -0.9 | -0.8 ------------------------------------ m=0 | -1.00000 | -0.47250 | -0.08000 m=1 | 0.00000 | -1.99420 | -1.98000 m=2 | 0.00000 | -2.56500 | -4.32000 m=3 | 0.00000 | -1.24229 | -3.24000 If the optional argument `normalization' is `"sch"', compute the Schmidt semi-normalized associated Legendre function. The Schmidt semi-normalized associated Legendre function is related to the unnormalized Legendre functions by the following: For Legendre functions of degree n and order 0: 0 0 SP (x) = P (x) n n For Legendre functions of degree n and order m: m m m 2(n-m)! 0.5 SP (x) = P (x) * (-1) * [-------] n n (n+m)! If the optional argument NORMALIZATION is `"norm"', compute the fully normalized associated Legendre function. The fully normalized associated Legendre function is related to the unnormalized Legendre functions by the following: For Legendre functions of degree N and order M m m m (n+0.5)(n-m)! 0.5 NP (x) = P (x) * (-1) * [-------------] n n (n+m)! -- Mapping Function: lgamma (X) -- Mapping Function: gammaln (X) Return the natural logarithm of the gamma function of X. *See also:* *note gamma: doc-gamma, *note gammainc: doc-gammainc.  File: octave.info, Node: Coordinate Transformations, Next: Mathematical Constants, Prev: Special Functions, Up: Arithmetic 17.7 Coordinate Transformations =============================== -- Function File: [THETA, R] = cart2pol (X, Y) -- Function File: [THETA, R, Z] = cart2pol (X, Y, Z) Transform Cartesian to polar or cylindrical coordinates. X, Y (and Z) must be the same shape, or scalar. THETA describes the angle relative to the positive x-axis. R is the distance to the z-axis (0, 0, z). *See also:* *note pol2cart: doc-pol2cart, *note cart2sph: doc-cart2sph, *note sph2cart: doc-sph2cart. -- Function File: [X, Y] = pol2cart (THETA, R) -- Function File: [X, Y, Z] = pol2cart (THETA, R, Z) Transform polar or cylindrical to Cartesian coordinates. THETA, R (and Z) must be the same shape, or scalar. THETA describes the angle relative to the positive x-axis. R is the distance to the z-axis (0, 0, z). *See also:* *note cart2pol: doc-cart2pol, *note cart2sph: doc-cart2sph, *note sph2cart: doc-sph2cart. -- Function File: [THETA, PHI, R] = cart2sph (X, Y, Z) Transform Cartesian to spherical coordinates. X, Y and Z must be the same shape, or scalar. THETA describes the angle relative to the positive x-axis. PHI is the angle relative to the xy-plane. R is the distance to the origin (0, 0, 0). *See also:* *note pol2cart: doc-pol2cart, *note cart2pol: doc-cart2pol, *note sph2cart: doc-sph2cart. -- Function File: [X, Y, Z] = sph2cart (THETA, PHI, R) Transform spherical to Cartesian coordinates. X, Y and Z must be the same shape, or scalar. THETA describes the angle relative to the positive x-axis. PHI is the angle relative to the xy-plane. R is the distance to the origin (0, 0, 0). *See also:* *note pol2cart: doc-pol2cart, *note cart2pol: doc-cart2pol, *note cart2sph: doc-cart2sph.  File: octave.info, Node: Mathematical Constants, Prev: Coordinate Transformations, Up: Arithmetic 17.8 Mathematical Constants =========================== -- Built-in Function: e -- Built-in Function: e (N) -- Built-in Function: e (N, M) -- Built-in Function: e (N, M, K, ...) -- Built-in Function: e (..., CLASS) Return a scalar, matrix, or N-dimensional array whose elements are all equal to the base of natural logarithms. The constant `e' satisfies the equation `log' (e) = 1. When called with no arguments, return a scalar with the value e. When called with a single argument, return a square matrix with the dimension specified. When called with more than one scalar argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". -- Built-in Function: pi -- Built-in Function: pi (N) -- Built-in Function: pi (N, M) -- Built-in Function: pi (N, M, K, ...) -- Built-in Function: pi (..., CLASS) Return a scalar, matrix, or N-dimensional array whose elements are all equal to the ratio of the circumference of a circle to its diameter. Internally, `pi' is computed as `4.0 * atan (1.0)'. When called with no arguments, return a scalar with the value of pi. When called with a single argument, return a square matrix with the dimension specified. When called with more than one scalar argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". -- Built-in Function: I -- Built-in Function: I (N) -- Built-in Function: I (N, M) -- Built-in Function: I (N, M, K, ...) -- Built-in Function: I (..., CLASS) Return a scalar, matrix, or N-dimensional array whose elements are all equal to the pure imaginary unit, defined as `sqrt (-1)'. I, and its equivalents i, J, and j, are functions so any of the names may be reused for other purposes (such as i for a counter variable). When called with no arguments, return a scalar with the value i. When called with a single argument, return a square matrix with the dimension specified. When called with more than one scalar argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". -- Built-in Function: Inf -- Built-in Function: Inf (N) -- Built-in Function: Inf (N, M) -- Built-in Function: Inf (N, M, K, ...) -- Built-in Function: Inf (..., CLASS) Return a scalar, matrix or N-dimensional array whose elements are all equal to the IEEE representation for positive infinity. Infinity is produced when results are too large to be represented using the the IEEE floating point format for numbers. Two common examples which produce infinity are division by zero and overflow. [1/0 e^800] => Inf Inf When called with no arguments, return a scalar with the value `Inf'. When called with a single argument, return a square matrix with the dimension specified. When called with more than one scalar argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". -- Built-in Function: NaN -- Built-in Function: NaN (N) -- Built-in Function: NaN (N, M) -- Built-in Function: NaN (N, M, K, ...) -- Built-in Function: NaN (..., CLASS) Return a scalar, matrix, or N-dimensional array whose elements are all equal to the IEEE symbol NaN (Not a Number). NaN is the result of operations which do not produce a well defined numerical result. Common operations which produce a NaN are arithmetic with infinity (Inf - Inf), zero divided by zero (0/0), and any operation involving another NaN value (5 + NaN). Note that NaN always compares not equal to NaN (NaN != NaN). This behavior is specified by the IEEE standard for floating point arithmetic. To find NaN values, use the `isnan' function. When called with no arguments, return a scalar with the value `NaN'. When called with a single argument, return a square matrix with the dimension specified. When called with more than one scalar argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". *See also:* *note isnan: doc-isnan. -- Built-in Function: eps -- Built-in Function: eps (X) -- Built-in Function: eps (N, M) -- Built-in Function: eps (N, M, K, ...) -- Built-in Function: eps (..., CLASS) Return a scalar, matrix or N-dimensional array whose elements are all eps, the machine precision. More precisely, `eps' is the relative spacing between any two adjacent numbers in the machine's floating point system. This number is obviously system dependent. On machines that support IEEE floating point arithmetic, `eps' is approximately 2.2204e-16 for double precision and 1.1921e-07 for single precision. When called with no arguments, return a scalar with the value `eps(1.0)'. Given a single argument X, return the distance between X and the next largest value. When called with more than one argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". -- Built-in Function: realmax -- Built-in Function: realmax (N) -- Built-in Function: realmax (N, M) -- Built-in Function: realmax (N, M, K, ...) -- Built-in Function: realmax (..., CLASS) Return a scalar, matrix or N-dimensional array whose elements are all equal to the largest floating point number that is representable. The actual value is system dependent. On machines that support IEEE floating point arithmetic, `realmax' is approximately 1.7977e+308 for double precision and 3.4028e+38 for single precision. When called with no arguments, return a scalar with the value `realmax("double")'. When called with a single argument, return a square matrix with the dimension specified. When called with more than one scalar argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". *See also:* *note realmin: doc-realmin, *note intmax: doc-intmax, *note bitmax: doc-bitmax. -- Built-in Function: realmin -- Built-in Function: realmin (N) -- Built-in Function: realmin (N, M) -- Built-in Function: realmin (N, M, K, ...) -- Built-in Function: realmin (..., CLASS) Return a scalar, matrix or N-dimensional array whose elements are all equal to the smallest normalized floating point number that is representable. The actual value is system dependent. On machines that support IEEE floating point arithmetic, `realmin' is approximately 2.2251e-308 for double precision and 1.1755e-38 for single precision. When called with no arguments, return a scalar with the value `realmin("double")'. When called with a single argument, return a square matrix with the dimension specified. When called with more than one scalar argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". *See also:* *note realmax: doc-realmax, *note intmin: doc-intmin.  File: octave.info, Node: Linear Algebra, Next: Nonlinear Equations, Prev: Arithmetic, Up: Top 18 Linear Algebra ***************** This chapter documents the linear algebra functions of Octave. Reference material for many of these functions may be found in Golub and Van Loan, `Matrix Computations, 2nd Ed.', Johns Hopkins, 1989, and in the `LAPACK Users' Guide', SIAM, 1992. * Menu: * Techniques used for Linear Algebra:: * Basic Matrix Functions:: * Matrix Factorizations:: * Functions of a Matrix:: * Specialized Solvers::  File: octave.info, Node: Techniques used for Linear Algebra, Next: Basic Matrix Functions, Up: Linear Algebra 18.1 Techniques used for Linear Algebra ======================================= Octave includes a polymorphic solver, that selects an appropriate matrix factorization depending on the properties of the matrix itself. Generally, the cost of determining the matrix type is small relative to the cost of factorizing the matrix itself, but in any case the matrix type is cached once it is calculated, so that it is not re-determined each time it is used in a linear equation. The selection tree for how the linear equation is solve or a matrix inverse is form is given by 1. If the matrix is upper or lower triangular sparse a forward or backward substitution using the LAPACK xTRTRS function, and goto 4. 2. If the matrix is square, hermitian with a real positive diagonal, attempt Cholesky factorization using the LAPACK xPOTRF function. 3. If the Cholesky factorization failed or the matrix is not hermitian with a real positive diagonal, and the matrix is square, factorize using the LAPACK xGETRF function. 4. If the matrix is not square, or any of the previous solvers flags a singular or near singular matrix, find a least squares solution using the LAPACK xGELSD function. The user can force the type of the matrix with the `matrix_type' function. This overcomes the cost of discovering the type of the matrix. However, it should be noted that identifying the type of the matrix incorrectly will lead to unpredictable results, and so `matrix_type' should be used with care. It should be noted that the test for whether a matrix is a candidate for Cholesky factorization, performed above and by the `matrix_type' function, does not give a certainty that the matrix is Hermitian. However, the attempt to factorize the matrix will quickly flag a non-Hermitian matrix.  File: octave.info, Node: Basic Matrix Functions, Next: Matrix Factorizations, Prev: Techniques used for Linear Algebra, Up: Linear Algebra 18.2 Basic Matrix Functions =========================== -- Loadable Function: AA = balance (A, OPT) -- Loadable Function: [DD, AA] = balance (A, OPT) -- Loadable Function: [D, P, AA] = balance (A, OPT) -- Loadable Function: [CC, DD, AA, BB] = balance (A, B, OPT) Compute `aa = dd \ a * dd' in which `aa' is a matrix whose row and column norms are roughly equal in magnitude, and `dd' = `p * d', in which `p' is a permutation matrix and `d' is a diagonal matrix of powers of two. This allows the equilibration to be computed without roundoff. Results of eigenvalue calculation are typically improved by balancing first. If two output values are requested, `balance' returns the diagonal `d' and the permutation `p' separately as vectors. In this case, `dd = eye(n)(p,:) * diag (d)', where `n' is the matrix size. If four output values are requested, compute `aa = cc*a*dd' and `bb = cc*b*dd)', in which `aa' and `bb' have non-zero elements of approximately the same magnitude and `cc' and `dd' are permuted diagonal matrices as in `dd' for the algebraic eigenvalue problem. The eigenvalue balancing option `opt' may be one of: `"noperm"', `"S"' Scale only; do not permute. `"noscal"', `"P"' Permute only; do not scale. Algebraic eigenvalue balancing uses standard LAPACK routines. Generalized eigenvalue problem balancing uses Ward's algorithm (SIAM Journal on Scientific and Statistical Computing, 1981). -- Function File: cond (A,P) Compute the P-norm condition number of a matrix. `cond (A)' is defined as `norm (A, P) * norm (inv (A), P)'. By default `P=2' is used which implies a (relatively slow) singular value decomposition. Other possible selections are `P= 1, Inf, inf, 'Inf', 'fro'' which are generally faster. *See also:* *note norm: doc-norm, *note inv: doc-inv, *note det: doc-det, *note svd: doc-svd, *note rank: doc-rank. -- Loadable Function: [D, RCOND] = det (A) Compute the determinant of A using LAPACK for full and UMFPACK for sparse matrices. Return an estimate of the reciprocal condition number if requested. -- Function File: dmult (A, B) This function has been deprecated. Use the direct syntax `diag(A)*B' which is more readable and now also more efficient. -- Function File: dot (X, Y, DIM) Computes the dot product of two vectors. If X and Y are matrices, calculate the dot-product along the first non-singleton dimension. If the optional argument DIM is given, calculate the dot-product along this dimension. -- Loadable Function: LAMBDA = eig (A) -- Loadable Function: LAMBDA = eig (A, B) -- Loadable Function: [V, LAMBDA] = eig (A) -- Loadable Function: [V, LAMBDA] = eig (A, B) The eigenvalues (and eigenvectors) of a matrix are computed in a several step process which begins with a Hessenberg decomposition, followed by a Schur decomposition, from which the eigenvalues are apparent. The eigenvectors, when desired, are computed by further manipulations of the Schur decomposition. The eigenvalues returned by `eig' are not ordered. -- Loadable Function: G = givens (X, Y) -- Loadable Function: [C, S] = givens (X, Y) Return a 2 by 2 orthogonal matrix `G = [C S; -S' C]' such that `G [X; Y] = [*; 0]' with X and Y scalars. For example, givens (1, 1) => 0.70711 0.70711 -0.70711 0.70711 -- Function File: [G, Y] = planerot (X) Given a two-element column vector, returns the 2 by 2 orthogonal matrix G such that `Y = G * X' and `Y(2) = 0'. *See also:* *note givens: doc-givens. -- Loadable Function: [X, RCOND] = inv (A) -- Loadable Function: [X, RCOND] = inverse (A) Compute the inverse of the square matrix A. Return an estimate of the reciprocal condition number if requested, otherwise warn of an ill-conditioned matrix if the reciprocal condition number is small. If called with a sparse matrix, then in general X will be a full matrix, and so if possible forming the inverse of a sparse matrix should be avoided. It is significantly more accurate and faster to do `Y = A \ B', rather than `Y = inv (A) * B'. -- Loadable Function: TYPE = matrix_type (A) -- Loadable Function: A = matrix_type (A, TYPE) -- Loadable Function: A = matrix_type (A, 'upper', PERM) -- Loadable Function: A = matrix_type (A, 'lower', PERM) -- Loadable Function: A = matrix_type (A, 'banded', NL, NU) Identify the matrix type or mark a matrix as a particular type. This allows rapid for solutions of linear equations involving A to be performed. Called with a single argument, `matrix_type' returns the type of the matrix and caches it for future use. Called with more than one argument, `matrix_type' allows the type of the matrix to be defined. The possible matrix types depend on whether the matrix is full or sparse, and can be one of the following 'unknown' Remove any previously cached matrix type, and mark type as unknown 'full' Mark the matrix as full. 'positive definite' Probable full positive definite matrix. 'diagonal' Diagonal Matrix. (Sparse matrices only) 'permuted diagonal' Permuted Diagonal matrix. The permutation does not need to be specifically indicated, as the structure of the matrix explicitly gives this. (Sparse matrices only) 'upper' Upper triangular. If the optional third argument PERM is given, the matrix is assumed to be a permuted upper triangular with the permutations defined by the vector PERM. 'lower' Lower triangular. If the optional third argument PERM is given, the matrix is assumed to be a permuted lower triangular with the permutations defined by the vector PERM. 'banded' 'banded positive definite' Banded matrix with the band size of NL below the diagonal and NU above it. If NL and NU are 1, then the matrix is tridiagonal and treated with specialized code. In addition the matrix can be marked as probably a positive definite (Sparse matrices only) 'singular' The matrix is assumed to be singular and will be treated with a minimum norm solution Note that the matrix type will be discovered automatically on the first attempt to solve a linear equation involving A. Therefore `matrix_type' is only useful to give Octave hints of the matrix type. Incorrectly defining the matrix type will result in incorrect results from solutions of linear equations, and so it is entirely the responsibility of the user to correctly identify the matrix type. Also the test for positive definiteness is a low-cost test for a hermitian matrix with a real positive diagonal. This does not guarantee that the matrix is positive definite, but only that it is a probable candidate. When such a matrix is factorized, a Cholesky factorization is first attempted, and if that fails the matrix is then treated with an LU factorization. Once the matrix has been factorized, `matrix_type' will return the correct classification of the matrix. -- Function File: norm (A, P, OPT) Compute the p-norm of the matrix A. If the second argument is missing, `p = 2' is assumed. If A is a matrix (or sparse matrix): P = `1' 1-norm, the largest column sum of the absolute values of A. P = `2' Largest singular value of A. P = `Inf' or `"inf"' Infinity norm, the largest row sum of the absolute values of A. P = `"fro"' Frobenius norm of A, `sqrt (sum (diag (A' * A)))'. other P, `P > 1' maximum `norm (A*x, p)' such that `norm (x, p) == 1' If A is a vector or a scalar: P = `Inf' or `"inf"' `max (abs (A))'. P = `-Inf' `min (abs (A))'. P = `"fro"' Frobenius norm of A, `sqrt (sumsq (abs (a)))'. P = 0 Hamming norm - the number of nonzero elements. other P, `P > 1' p-norm of A, `(sum (abs (A) .^ P)) ^ (1/P)'. other P `P < 1' the p-pseudonorm defined as above. If `"rows"' is given as OPT, the norms of all rows of the matrix A are returned as a column vector. Similarly, if `"columns"' or `"cols"' is passed column norms are computed. *See also:* *note cond: doc-cond, *note svd: doc-svd. -- Function File: null (A, TOL) Return an orthonormal basis of the null space of A. The dimension of the null space is taken as the number of singular values of A not greater than TOL. If the argument TOL is missing, it is computed as max (size (A)) * max (svd (A)) * eps -- Function File: orth (A, TOL) Return an orthonormal basis of the range space of A. The dimension of the range space is taken as the number of singular values of A greater than TOL. If the argument TOL is missing, it is computed as max (size (A)) * max (svd (A)) * eps -- Loadable Function: pinv (X, TOL) Return the pseudoinverse of X. Singular values less than TOL are ignored. If the second argument is omitted, it is assumed that tol = max (size (X)) * sigma_max (X) * eps, where `sigma_max (X)' is the maximal singular value of X. -- Function File: rank (A, TOL) Compute the rank of A, using the singular value decomposition. The rank is taken to be the number of singular values of A that are greater than the specified tolerance TOL. If the second argument is omitted, it is taken to be tol = max (size (A)) * sigma(1) * eps; where `eps' is machine precision and `sigma(1)' is the largest singular value of A. -- Loadable Function: C = rcond (A) Compute the 1-norm estimate of the reciprocal condition as returned by LAPACK. If the matrix is well-conditioned then C will be near 1 and if the matrix is poorly conditioned it will be close to zero. The matrix A must not be sparse. If the matrix is sparse then `condest (A)' or `rcond (full (A))' should be used instead. *See also:* *note inv: doc-inv. -- Function File: trace (A) Compute the trace of A, `sum (diag (A))'. -- Function File: [R, K] = rref (A, TOL) Returns the reduced row echelon form of A. TOL defaults to `eps * max (size (A)) * norm (A, inf)'. Called with two return arguments, K returns the vector of "bound variables", which are those columns on which elimination has been performed.  File: octave.info, Node: Matrix Factorizations, Next: Functions of a Matrix, Prev: Basic Matrix Functions, Up: Linear Algebra 18.3 Matrix Factorizations ========================== -- Loadable Function: R = chol (A) -- Loadable Function: [R, P] = chol (A) -- Loadable Function: [R, P, Q] = chol (S) -- Loadable Function: [R, P, Q] = chol (S, 'vector') -- Loadable Function: [L, ...] = chol (..., 'lower') Compute the Cholesky factor, R, of the symmetric positive definite matrix A, where R' * R = A. Called with one output argument `chol' fails if A or S is not positive definite. With two or more output arguments P flags whether the matrix was positive definite and `chol' does not fail. A zero value indicated that the matrix was positive definite and the R gives the factorization, and P will have a positive value otherwise. If called with 3 outputs then a sparsity preserving row/column permutation is applied to A prior to the factorization. That is R is the factorization of `A(Q,Q)' such that R' * R = Q' * A * Q. The sparsity preserving permutation is generally returned as a matrix. However, given the flag 'vector', Q will be returned as a vector such that R' * R = a (Q, Q). Called with either a sparse or full matrix and using the 'lower' flag, `chol' returns the lower triangular factorization such that L * L' = A. In general the lower triangular factorization is significantly faster for sparse matrices. *See also:* *note cholinv: doc-cholinv, *note chol2inv: doc-chol2inv. -- Loadable Function: cholinv (A) Use the Cholesky factorization to compute the inverse of the symmetric positive definite matrix A. *See also:* *note chol: doc-chol, *note chol2inv: doc-chol2inv. -- Loadable Function: chol2inv (U) Invert a symmetric, positive definite square matrix from its Cholesky decomposition, U. Note that U should be an upper-triangular matrix with positive diagonal elements. `chol2inv (U)' provides `inv (U'*U)' but it is much faster than using `inv'. *See also:* *note chol: doc-chol, *note cholinv: doc-cholinv. -- Loadable Function: [R1, INFO] = cholupdate (R, U, OP) Update or downdate a Cholesky factorization. Given an upper triangular matrix R and a column vector U, attempt to determine another upper triangular matrix R1 such that * R1'*R1 = R'*R + U*U' if OP is "+" * R1'*R1 = R'*R - U*U' if OP is "-" If OP is "-", INFO is set to * 0 if the downdate was successful, * 1 if R'*R - U*U' is not positive definite, * 2 if R is singular. If INFO is not present, an error message is printed in cases 1 and 2. *See also:* *note chol: doc-chol, *note qrupdate: doc-qrupdate. -- Loadable Function: [R1, INFO] = cholinsert (R, J, U) Given a Cholesky factorization of a real symmetric or complex hermitian positive definite matrix A = R'*R, R upper triangular, return the Cholesky factorization of A1, where A1(p,p) = A, A1(:,j) = A1(j,:)' = u and p = [1:j-1,j+1:n+1]. u(j) should be positive. On return, INFO is set to * 0 if the insertion was successful, * 1 if A1 is not positive definite, * 2 if R is singular. If INFO is not present, an error message is printed in cases 1 and 2. *See also:* *note chol: doc-chol, *note cholupdate: doc-cholupdate, *note choldelete: doc-choldelete. -- Loadable Function: R1 = choldelete (R, J) Given a Cholesky factorization of a real symmetric or complex hermitian positive definite matrix A = R'*R, R upper triangular, return the Cholesky factorization of A(p,p), where p = [1:j-1,j+1:n+1]. *See also:* *note chol: doc-chol, *note cholupdate: doc-cholupdate, *note cholinsert: doc-cholinsert. -- Loadable Function: R1 = cholshift (R, I, J) Given a Cholesky factorization of a real symmetric or complex hermitian positive definite matrix A = R'*R, R upper triangular, return the Cholesky factorization of A(p,p), where p is the permutation `p = [1:i-1, shift(i:j, 1), j+1:n]' if I < J or `p = [1:j-1, shift(j:i,-1), i+1:n]' if J < I. *See also:* *note chol: doc-chol, *note cholinsert: doc-cholinsert, *note choldelete: doc-choldelete. -- Loadable Function: H = hess (A) -- Loadable Function: [P, H] = hess (A) Compute the Hessenberg decomposition of the matrix A. The Hessenberg decomposition is usually used as the first step in an eigenvalue computation, but has other applications as well (see Golub, Nash, and Van Loan, IEEE Transactions on Automatic Control, 1979). The Hessenberg decomposition is `p * h * p' = a' where `p' is a square unitary matrix (`p' * p = I', using complex-conjugate transposition) and `h' is upper Hessenberg (`i >= j+1 => h (i, j) = 0'). -- Loadable Function: [L, U, P] = lu (A) -- Loadable Function: [L, U, P, Q] = lu (S) -- Loadable Function: [L, U, P, Q, R] = lu (S) -- Loadable Function: [...] = lu (S, THRES) -- Loadable Function: Y = lu (...) -- Loadable Function: [...] = lu (..., 'vector') Compute the LU decomposition of A. If A is full subroutines from LAPACK are used and if A is sparse then UMFPACK is used. The result is returned in a permuted form, according to the optional return value P. For example, given the matrix `a = [1, 2; 3, 4]', [l, u, p] = lu (a) returns l = 1.00000 0.00000 0.33333 1.00000 u = 3.00000 4.00000 0.00000 0.66667 p = 0 1 1 0 The matrix is not required to be square. Called with two or three output arguments and a spare input matrix, then "lu" does not attempt to perform sparsity preserving column permutations. Called with a fourth output argument, the sparsity preserving column transformation Q is returned, such that `P * A * Q = L * U'. Called with a fifth output argument and a sparse input matrix, then "lu" attempts to use a scaling factor R on the input matrix such that `P * (R \ A) * Q = L * U'. This typically leads to a sparser and more stable factorization. An additional input argument THRES, that defines the pivoting threshold can be given. THRES can be a scalar, in which case it defines UMFPACK pivoting tolerance for both symmetric and unsymmetric cases. If THRES is a two element vector, then the first element defines the pivoting tolerance for the unsymmetric UMFPACK pivoting strategy and the second the symmetric strategy. By default, the values defined by `spparms' are used and are by default `[0.1, 0.001]'. Given the string argument 'vector', "lu" returns the values of P Q as vector values, such that for full matrix, `A (P,:) = L * U', and `R(P,:) * A (:, Q) = L * U'. With two output arguments, returns the permuted forms of the upper and lower triangular matrices, such that `A = L * U'. With one output argument Y, then the matrix returned by the LAPACK routines is returned. If the input matrix is sparse then the matrix L is embedded into U to give a return value similar to the full case. For both full and sparse matrices, "lu" looses the permutation information. -- Loadable Function: [Q, R, P] = qr (A) -- Loadable Function: [Q, R, P] = qr (A, '0') Compute the QR factorization of A, using standard LAPACK subroutines. For example, given the matrix `a = [1, 2; 3, 4]', [q, r] = qr (a) returns q = -0.31623 -0.94868 -0.94868 0.31623 r = -3.16228 -4.42719 0.00000 -0.63246 The `qr' factorization has applications in the solution of least squares problems `min norm(A x - b)' for overdetermined systems of equations (i.e., `a' is a tall, thin matrix). The QR factorization is `q * r = a' where `q' is an orthogonal matrix and `r' is upper triangular. If given a second argument of '0', `qr' returns an economy-sized QR factorization, omitting zero rows of R and the corresponding columns of Q. If the matrix A is full, the permuted QR factorization `[Q, R, P] = qr (A)' forms the QR factorization such that the diagonal entries of `r' are decreasing in magnitude order. For example,given the matrix `a = [1, 2; 3, 4]', [q, r, p] = qr(a) returns q = -0.44721 -0.89443 -0.89443 0.44721 r = -4.47214 -3.13050 0.00000 0.44721 p = 0 1 1 0 The permuted `qr' factorization `[q, r, p] = qr (a)' factorization allows the construction of an orthogonal basis of `span (a)'. If the matrix A is sparse, then compute the sparse QR factorization of A, using CSPARSE. As the matrix Q is in general a full matrix, this function returns the Q-less factorization R of A, such that `R = chol (A' * A)'. If the final argument is the scalar `0' and the number of rows is larger than the number of columns, then an economy factorization is returned. That is R will have only `size (A,1)' rows. If an additional matrix B is supplied, then `qr' returns C, where `C = Q' * B'. This allows the least squares approximation of `A \ B' to be calculated as [C,R] = spqr (A,B) X = R \ C -- Loadable Function: [Q1, R1] = qrupdate (Q, R, U, V) Given a QR factorization of a real or complex matrix A = Q*R, Q unitary and R upper trapezoidal, return the QR factorization of A + U*V', where U and V are column vectors (rank-1 update) or matrices with equal number of columns (rank-k update). Notice that the latter case is done as a sequence of rank-1 updates; thus, for k large enough, it will be both faster and more accurate to recompute the factorization from scratch. The QR factorization supplied may be either full (Q is square) or economized (R is square). *See also:* *note qr: doc-qr, *note qrinsert: doc-qrinsert, *note qrdelete: doc-qrdelete. -- Loadable Function: [Q1, R1] = qrinsert (Q, R, J, X, ORIENT) Given a QR factorization of a real or complex matrix A = Q*R, Q unitary and R upper trapezoidal, return the QR factorization of [A(:,1:j-1) x A(:,j:n)], where U is a column vector to be inserted into A (if ORIENT is `"col"'), or the QR factorization of [A(1:j-1,:);x;A(:,j:n)], where X is a row vector to be inserted into A (if ORIENT is `"row"'). The default value of ORIENT is `"col"'. If ORIENT is `"col"', U may be a matrix and J an index vector resulting in the QR factorization of a matrix B such that B(:,J) gives U and B(:,J) = [] gives A. Notice that the latter case is done as a sequence of k insertions; thus, for k large enough, it will be both faster and more accurate to recompute the factorization from scratch. If ORIENT is `"col"', the QR factorization supplied may be either full (Q is square) or economized (R is square). If ORIENT is `"row"', full factorization is needed. *See also:* *note qr: doc-qr, *note qrupdate: doc-qrupdate, *note qrdelete: doc-qrdelete. -- Loadable Function: [Q1, R1] = qrdelete (Q, R, J, ORIENT) Given a QR factorization of a real or complex matrix A = Q*R, Q unitary and R upper trapezoidal, return the QR factorization of [A(:,1:j-1) A(:,j+1:n)], i.e., A with one column deleted (if ORIENT is "col"), or the QR factorization of [A(1:j-1,:);A(:,j+1:n)], i.e., A with one row deleted (if ORIENT is "row"). The default value of ORIENT is "col". If ORIENT is `"col"', J may be an index vector resulting in the QR factorization of a matrix B such that A(:,J) = [] gives B. Notice that the latter case is done as a sequence of k deletions; thus, for k large enough, it will be both faster and more accurate to recompute the factorization from scratch. If ORIENT is `"col"', the QR factorization supplied may be either full (Q is square) or economized (R is square). If ORIENT is `"row"', full factorization is needed. *See also:* *note qr: doc-qr, *note qrinsert: doc-qrinsert, *note qrupdate: doc-qrupdate. -- Loadable Function: [Q1, R1] = qrshift (Q, R, I, J) Given a QR factorization of a real or complex matrix A = Q*R, Q unitary and R upper trapezoidal, return the QR factorization of A(:,p), where p is the permutation `p = [1:i-1, shift(i:j, 1), j+1:n]' if I < J or `p = [1:j-1, shift(j:i,-1), i+1:n]' if J < I. *See also:* *note qr: doc-qr, *note qrinsert: doc-qrinsert, *note qrdelete: doc-qrdelete. -- Loadable Function: LAMBDA = qz (A, B) Generalized eigenvalue problem A x = s B x, QZ decomposition. There are three ways to call this function: 1. `lambda = qz(A,B)' Computes the generalized eigenvalues LAMBDA of (A - s B). 2. `[AA, BB, Q, Z, V, W, lambda] = qz (A, B)' Computes qz decomposition, generalized eigenvectors, and generalized eigenvalues of (A - sB) A*V = B*V*diag(lambda) W'*A = diag(lambda)*W'*B AA = Q'*A*Z, BB = Q'*B*Z with Q and Z orthogonal (unitary)= I 3. `[AA,BB,Z{, lambda}] = qz(A,B,opt)' As in form [2], but allows ordering of generalized eigenpairs for (e.g.) solution of discrete time algebraic Riccati equations. Form 3 is not available for complex matrices, and does not compute the generalized eigenvectors V, W, nor the orthogonal matrix Q. OPT for ordering eigenvalues of the GEP pencil. The leading block of the revised pencil contains all eigenvalues that satisfy: `"N"' = unordered (default) `"S"' = small: leading block has all |lambda| <=1 `"B"' = big: leading block has all |lambda| >= 1 `"-"' = negative real part: leading block has all eigenvalues in the open left half-plane `"+"' = non-negative real part: leading block has all eigenvalues in the closed right half-plane Note: qz performs permutation balancing, but not scaling (see balance). Order of output arguments was selected for compatibility with MATLAB *See also:* *note balance: doc-balance, *note eig: doc-eig, *note schur: doc-schur. -- Function File: [AA, BB, Q, Z] = qzhess (A, B) Compute the Hessenberg-triangular decomposition of the matrix pencil `(A, B)', returning `AA = Q * A * Z', `BB = Q * B * Z', with Q and Z orthogonal. For example, [aa, bb, q, z] = qzhess ([1, 2; 3, 4], [5, 6; 7, 8]) => aa = [ -3.02244, -4.41741; 0.92998, 0.69749 ] => bb = [ -8.60233, -9.99730; 0.00000, -0.23250 ] => q = [ -0.58124, -0.81373; -0.81373, 0.58124 ] => z = [ 1, 0; 0, 1 ] The Hessenberg-triangular decomposition is the first step in Moler and Stewart's QZ decomposition algorithm. Algorithm taken from Golub and Van Loan, `Matrix Computations, 2nd edition'. -- Loadable Function: S = schur (A) -- Loadable Function: [U, S] = schur (A, OPT) The Schur decomposition is used to compute eigenvalues of a square matrix, and has applications in the solution of algebraic Riccati equations in control (see `are' and `dare'). `schur' always returns `s = u' * a * u' where `u' is a unitary matrix (`u'* u' is identity) and `s' is upper triangular. The eigenvalues of `a' (and `s') are the diagonal elements of `s'. If the matrix `a' is real, then the real Schur decomposition is computed, in which the matrix `u' is orthogonal and `s' is block upper triangular with blocks of size at most `2 x 2' along the diagonal. The diagonal elements of `s' (or the eigenvalues of the `2 x 2' blocks, when appropriate) are the eigenvalues of `a' and `s'. The eigenvalues are optionally ordered along the diagonal according to the value of `opt'. `opt = "a"' indicates that all eigenvalues with negative real parts should be moved to the leading block of `s' (used in `are'), `opt = "d"' indicates that all eigenvalues with magnitude less than one should be moved to the leading block of `s' (used in `dare'), and `opt = "u"', the default, indicates that no ordering of eigenvalues should occur. The leading `k' columns of `u' always span the `a'-invariant subspace corresponding to the `k' leading eigenvalues of `s'. -- Function File: ANGLE = subspace (A, B) Determine the largest principal angle between two subspaces spanned by columns of matrices A and B. -- Loadable Function: S = svd (A) -- Loadable Function: [U, S, V] = svd (A) Compute the singular value decomposition of A A = U*S*V' The function `svd' normally returns the vector of singular values. If asked for three return values, it computes U, S, and V. For example, svd (hilb (3)) returns ans = 1.4083189 0.1223271 0.0026873 and [u, s, v] = svd (hilb (3)) returns u = -0.82704 0.54745 0.12766 -0.45986 -0.52829 -0.71375 -0.32330 -0.64901 0.68867 s = 1.40832 0.00000 0.00000 0.00000 0.12233 0.00000 0.00000 0.00000 0.00269 v = -0.82704 0.54745 0.12766 -0.45986 -0.52829 -0.71375 -0.32330 -0.64901 0.68867 If given a second argument, `svd' returns an economy-sized decomposition, eliminating the unnecessary rows or columns of U or V. -- Function File: [HOUSV, BETA, ZER] = housh (X, J, Z) Compute Householder reflection vector HOUSV to reflect X to be the j-th column of identity, i.e., (I - beta*housv*housv')x = norm(x)*e(j) if x(1) < 0, (I - beta*housv*housv')x = -norm(x)*e(j) if x(1) >= 0 Inputs X vector J index into vector Z threshold for zero (usually should be the number 0) Outputs (see Golub and Van Loan): BETA If beta = 0, then no reflection need be applied (zer set to 0) HOUSV householder vector -- Function File: [U, H, NU] = krylov (A, V, K, EPS1, PFLG) Construct an orthogonal basis U of block Krylov subspace [v a*v a^2*v ... a^(k+1)*v] Using Householder reflections to guard against loss of orthogonality. If V is a vector, then H contains the Hessenberg matrix such that `a*u == u*h+rk*ek'', in which `rk = a*u(:,k)-u*h(:,k)', and `ek'' is the vector `[0, 0, ..., 1]' of length `k'. Otherwise, H is meaningless. If V is a vector and K is greater than `length(A)-1', then H contains the Hessenberg matrix such that `a*u == u*h'. The value of NU is the dimension of the span of the krylov subspace (based on EPS1). If B is a vector and K is greater than M-1, then H contains the Hessenberg decomposition of A. The optional parameter EPS1 is the threshold for zero. The default value is 1e-12. If the optional parameter PFLG is nonzero, row pivoting is used to improve numerical behavior. The default value is 0. Reference: Hodel and Misra, "Partial Pivoting in the Computation of Krylov Subspaces", to be submitted to Linear Algebra and its Applications  File: octave.info, Node: Functions of a Matrix, Next: Specialized Solvers, Prev: Matrix Factorizations, Up: Linear Algebra 18.4 Functions of a Matrix ========================== -- Function File: expm (A) Return the exponential of a matrix, defined as the infinite Taylor series expm(a) = I + a + a^2/2! + a^3/3! + ... The Taylor series is _not_ the way to compute the matrix exponential; see Moler and Van Loan, `Nineteen Dubious Ways to Compute the Exponential of a Matrix', SIAM Review, 1978. This routine uses Ward's diagonal Pade' approximation method with three step preconditioning (SIAM Journal on Numerical Analysis, 1977). Diagonal Pade' approximations are rational polynomials of matrices -1 D (a) N (a) whose Taylor series matches the first `2q+1' terms of the Taylor series above; direct evaluation of the Taylor series (with the same preconditioning steps) may be desirable in lieu of the Pade' approximation when `Dq(a)' is ill-conditioned. -- Function File: logm (A) Compute the matrix logarithm of the square matrix A. Note that this is currently implemented in terms of an eigenvalue expansion and needs to be improved to be more robust. -- Loadable Function: [RESULT, ERROR_ESTIMATE] = sqrtm (A) Compute the matrix square root of the square matrix A. Ref: Nicholas J. Higham. A new sqrtm for MATLAB. Numerical Analysis Report No. 336, Manchester Centre for Computational Mathematics, Manchester, England, January 1999. *See also:* *note expm: doc-expm, *note logm: doc-logm. -- Loadable Function: kron (A, B) Form the kronecker product of two matrices, defined block by block as x = [a(i, j) b] For example, kron (1:4, ones (3, 1)) => 1 2 3 4 1 2 3 4 1 2 3 4 -- Loadable Function: X = syl (A, B, C) Solve the Sylvester equation A X + X B + C = 0 using standard LAPACK subroutines. For example, syl ([1, 2; 3, 4], [5, 6; 7, 8], [9, 10; 11, 12]) => [ -0.50000, -0.66667; -0.66667, -0.50000 ]  File: octave.info, Node: Specialized Solvers, Prev: Functions of a Matrix, Up: Linear Algebra 18.5 Specialized Solvers ======================== -- Function File: bicgstab (A, B) -- Function File: bicgstab (A, B, TOL, MAXIT, M1, M2, X0) This procedure attempts to solve a system of linear equations A*x = b for x. The A must be square, symmetric and positive definite real matrix N*N. The B must be a one column vector with a length of N. The TOL specifies the tolerance of the method, the default value is 1e-6. The MAXIT specifies the maximum number of iterations, the default value is min(20,N). The M1 specifies a preconditioner, can also be a function handler which returns M\X. The M2 combined with M1 defines preconditioner as preconditioner=M1*M2. The X0 is the initial guess, the default value is zeros(N,1). The value X is a computed result of this procedure. The value FLAG can be 0 when we reach tolerance in MAXIT iterations, 1 when we don't reach tolerance in MAXIT iterations and 3 when the procedure stagnates. The value RELRES is a relative residual - norm(b-A*x)/norm(b). The value ITER is an iteration number in which x was computed. The value RESVEC is a vector of RELRES for each iteration. -- Function File: cgs (A, B) -- Function File: cgs (A, B, TOL, MAXIT, M1, M2, X0) This procedure attempts to solve a system of linear equations A*x = b for x. The A must be square, symmetric and positive definite real matrix N*N. The B must be a one column vector with a length of N. The TOL specifies the tolerance of the method, default value is 1e-6. The MAXIT specifies the maximum number of iteration, default value is MIN(20,N). The M1 specifies a preconditioner, can also be a function handler which returns M\X. The M2 combined with M1 defines preconditioner as preconditioner=M1*M2. The X0 is initial guess, default value is zeros(N,1).  File: octave.info, Node: Nonlinear Equations, Next: Diagonal and Permutation Matrices, Prev: Linear Algebra, Up: Top 19 Nonlinear Equations ********************** Octave can solve sets of nonlinear equations of the form F (x) = 0 using the function `fsolve', which is based on the MINPACK subroutine `hybrd'. This is an iterative technique so a starting point will have to be provided. This also has the consequence that convergence is not guaranteed even if a solution exists. -- Function File: fsolve (FCN, X0, OPTIONS) -- Function File: [X, FVEC, INFO, OUTPUT, FJAC] = fsolve (FCN, ...) Solve a system of nonlinear equations defined by the function FCN. FCN should accepts a vector (array) defining the unknown variables, and return a vector of left-hand sides of the equations. Right-hand sides are defined to be zeros. In other words, this function attempts to determine a vector X such that `FCN (X)' gives (approximately) all zeros. X0 determines a starting guess. The shape of X0 is preserved in all calls to FCN, but otherwise it is treated as a column vector. OPTIONS is a structure specifying additional options. Currently, `fsolve' recognizes these options: `"FunValCheck"', `"OutputFcn"', `"TolX"', `"TolFun"', `"MaxIter"', `"MaxFunEvals"', `"Jacobian"', `"Updating"' and `"ComplexEqn"'. If `"Jacobian"' is `"on"', it specifies that FCN, called with 2 output arguments, also returns the Jacobian matrix of right-hand sides at the requested point. `"TolX"' specifies the termination tolerance in the unknown variables, while `"TolFun"' is a tolerance for equations. Default is `1e-7' for both `"TolX"' and `"TolFun"'. If `"Updating"' is "on", the function will attempt to use Broyden updates to update the Jacobian, in order to reduce the amount of jacobian calculations. If your user function always calculates the Jacobian (regardless of number of output arguments), this option provides no advantage and should be set to false. `"ComplexEqn"' is `"on"', `fsolve' will attempt to solve complex equations in complex variables, assuming that the equations possess a complex derivative (i.e., are holomorphic). If this is not what you want, should unpack the real and imaginary parts of the system to get a real system. For description of the other options, see `optimset'. On return, FVAL contains the value of the function FCN evaluated at X, and INFO may be one of the following values: 1 Converged to a solution point. Relative residual error is less than specified by TolFun. 2 Last relative step size was less that TolX. 3 Last relative decrease in residual was less than TolF. 0 Iteration limit exceeded. -3 The trust region radius became excessively small. Note: If you only have a single nonlinear equation of one variable, using `fzero' is usually a much better idea. *See also:* *note fzero: doc-fzero, *note optimset: doc-optimset. Note about user-supplied jacobians: As an inherent property of the algorithm, jacobian is always requested for a solution vector whose residual vector is already known, and it is the last accepted successful step. Often this will be one of the last two calls, but not always. If the savings by reusing intermediate results from residual calculation in jacobian calculation are significant, the best strategy is to employ OutputFcn: After a vector is evaluated for residuals, if OutputFcn is called with that vector, then the intermediate results should be saved for future jacobian evaluation, and should be kept until a jacobian evaluation is requested or until outputfcn is called with a different vector, in which case they should be dropped in favor of this most recent vector. A short example how this can be achieved follows: function [fvec, fjac] = user_func (x, optimvalues, state) persistent sav = [], sav0 = []; if (nargin == 1) ## evaluation call if (nargout == 1) sav0.x = x; # mark saved vector ## calculate fvec, save results to sav0. elseif (nargout == 2) ## calculate fjac using sav. endif else ## outputfcn call. if (all (x == sav0.x)) sav = sav0; endif ## maybe output iteration status, etc. endif endfunction .... fsolve (@user_func, x0, optimset ("OutputFcn", @user_func, ...)) Here is a complete example. To solve the set of equations -2x^2 + 3xy + 4 sin(y) = 6 3x^2 - 2xy^2 + 3 cos(x) = -4 you first need to write a function to compute the value of the given function. For example: function y = f (x) y(1) = -2*x(1)^2 + 3*x(1)*x(2) + 4*sin(x(2)) - 6; y(2) = 3*x(1)^2 - 2*x(1)*x(2)^2 + 3*cos(x(1)) + 4; endfunction Then, call `fsolve' with a specified initial condition to find the roots of the system of equations. For example, given the function `f' defined above, [x, fval, info] = fsolve (@f, [1; 2]) results in the solution x = 0.57983 2.54621 fval = -5.7184e-10 5.5460e-10 info = 1 A value of `info = 1' indicates that the solution has converged. The function `perror' may be used to print English messages corresponding to the numeric error codes. For example, perror ("fsolve", 1) -| solution converged to requested tolerance When no Jacobian is supplied (as in the example above) it is approximated numerically. This requires more function evaluations, and hence is less efficient. In the example above we could compute the Jacobian analytically as function J = jacobian(x) J(1,1) = 3*x(2) - 4*x(1); J(1,2) = 4*cos(x(2)) + 3*x(1); J(2,1) = -2*x(2)^2 - 3*sin(x(1)) + 6*x(1); J(2,2) = -4*x(1)*x(2); endfunction The Jacobian can then be used with the following call to `fsolve': [x, fval, info] = fsolve ({@f, @jacobian}, [1; 2]); which gives the same solution as before. -- Function File: [X, FVAL, INFO, OUTPUT] = fzero (FUN, X0, OPTIONS) Find a zero point of a univariate function. FUN should be a function handle or name. X0 specifies a starting point. OPTIONS is a structure specifying additional options. Currently, `fzero' recognizes these options: `"FunValCheck"', `"OutputFcn"', `"TolX"', `"MaxIter"', `"MaxFunEvals"'. For description of these options, see *note optimset: doc-optimset. On exit, the function returns X, the approximate zero point and FVAL, the function value thereof. INFO is an exit flag that can have these values: * 1 The algorithm converged to a solution. * 0 Maximum number of iterations or function evaluations has been exhausted. * -1 The algorithm has been terminated from user output function. * -2 A general unexpected error. * -3 A non-real value encountered. * -4 A NaN value encountered. *See also:* *note optimset: doc-optimset, *note fsolve: doc-fsolve.  File: octave.info, Node: Diagonal and Permutation Matrices, Next: Sparse Matrices, Prev: Nonlinear Equations, Up: Top 20 Diagonal and Permutation Matrices ************************************ * Menu: * Basic Usage:: Creation and Manipulation of Diagonal and Permutation Matrices * Matrix Algebra:: Linear Algebra with Diagonal and Permutation Matrices * Function Support:: Functions That Are Aware of These Matrices * Example Codes:: Some Examples of Usage * Zeros Treatment:: The Differences in Treatment of Zero Elements  File: octave.info, Node: Basic Usage, Next: Matrix Algebra, Up: Diagonal and Permutation Matrices 20.1 Creating and Manipulating Diagonal and Permutation Matrices ================================================================ A diagonal matrix is defined as a matrix that has zero entries outside the main diagonal; that is, `D(i,j) == 0' if `i != j'. Most often, square diagonal matrices are considered; however, the definition can equally be applied to nonsquare matrices, in which case we usually speak of a rectangular diagonal matrix. A permutation matrix is defined as a square matrix that has a single element equal to unity in each row and each column; all other elements are zero. That is, there exists a permutation (vector) `p' such that `P(i,j) == 1' if `j == p(i)' and `P(i,j) == 0' otherwise. Octave provides special treatment of real and complex rectangular diagonal matrices, as well as permutation matrices. They are stored as special objects, using efficient storage and algorithms, facilitating writing both readable and efficient matrix algebra expressions in the Octave language. * Menu: * Creating Diagonal Matrices:: * Creating Permutation Matrices:: * Explicit and Implicit Conversions::  File: octave.info, Node: Creating Diagonal Matrices, Next: Creating Permutation Matrices, Up: Basic Usage 20.1.1 Creating Diagonal Matrices --------------------------------- The most common and easiest way to create a diagonal matrix is using the built-in function "diag". The expression `diag (v)', with V a vector, will create a square diagonal matrix with elements on the main diagonal given by the elements of V, and size equal to the length of V. `diag (v, m, n)' can be used to construct a rectangular diagonal matrix. The result of these expressions will be a special diagonal matrix object, rather than a general matrix object. Diagonal matrix with unit elements can be created using "eye". Some other built-in functions can also return diagonal matrices. Examples include "balance" or "inv". Example: diag (1:4) => Diagonal Matrix 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 diag(1:3,5,3) => Diagonal Matrix 1 0 0 0 2 0 0 0 3 0 0 0 0 0 0  File: octave.info, Node: Creating Permutation Matrices, Next: Explicit and Implicit Conversions, Prev: Creating Diagonal Matrices, Up: Basic Usage 20.1.2 Creating Permutation Matrices ------------------------------------ For creating permutation matrices, Octave does not introduce a new function, but rather overrides an existing syntax: permutation matrices can be conveniently created by indexing an identity matrix by permutation vectors. That is, if Q is a permutation vector of length N, the expression P = eye (n) (:, q); will create a permutation matrix - a special matrix object. eye (n) (q, :) will also work (and create a row permutation matrix), as well as eye (n) (q1, q2). For example: eye (4) ([1,3,2,4],:) => Permutation Matrix 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 eye (4) (:,[1,3,2,4]) => Permutation Matrix 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 Mathematically, an identity matrix is both diagonal and permutation matrix. In Octave, `eye (n)' returns a diagonal matrix, because a matrix can only have one class. You can convert this diagonal matrix to a permutation matrix by indexing it by an identity permutation, as shown below. This is a special property of the identity matrix; indexing other diagonal matrices generally produces a full matrix. eye (3) => Diagonal Matrix 1 0 0 0 1 0 0 0 1 eye(3)(1:3,:) => Permutation Matrix 1 0 0 0 1 0 0 0 1 Some other built-in functions can also return permutation matrices. Examples include "inv" or "lu".  File: octave.info, Node: Explicit and Implicit Conversions, Prev: Creating Permutation Matrices, Up: Basic Usage 20.1.3 Explicit and Implicit Conversions ---------------------------------------- The diagonal and permutation matrices are special objects in their own right. A number of operations and built-in functions are defined for these matrices to use special, more efficient code than would be used for a full matrix in the same place. Examples are given in further sections. To facilitate smooth mixing with full matrices, backward compatibility, and compatibility with MATLAB, the diagonal and permutation matrices should allow any operation that works on full matrices, and will either treat it specially, or implicitly convert themselves to full matrices. Instances include matrix indexing, except for extracting a single element or a leading submatrix, indexed assignment, or applying most mapper functions, such as "exp". An explicit conversion to a full matrix can be requested using the built-in function "full". It should also be noted that the diagonal and permutation matrix objects will cache the result of the conversion after it is first requested (explicitly or implicitly), so that subsequent conversions will be very cheap.  File: octave.info, Node: Matrix Algebra, Next: Function Support, Prev: Basic Usage, Up: Diagonal and Permutation Matrices 20.2 Linear Algebra with Diagonal and Permutation Matrices ========================================================== As has been already said, diagonal and permutation matrices make it possible to use efficient algorithms while preserving natural linear algebra syntax. This section describes in detail the operations that are treated specially when performed on these special matrix objects. * Menu: * Expressions Involving Diagonal Matrices:: * Expressions Involving Permutation Matrices::  File: octave.info, Node: Expressions Involving Diagonal Matrices, Next: Expressions Involving Permutation Matrices, Up: Matrix Algebra 20.2.1 Expressions Involving Diagonal Matrices ---------------------------------------------- Assume D is a diagonal matrix. If M is a full matrix, then `D*M' will scale the rows of M. That means, if `S = D*M', then for each pair of indices i,j it holds S(i,j) = D(i,i) * M(i,j). Similarly, `M*D' will do a column scaling. The matrix D may also be rectangular, m-by-n where `m != n'. If `m < n', then the expression `D*M' is equivalent to D(:,1:m) * M(1:m,:), i.e., trailing `n-m' rows of M are ignored. If `m > n', then `D*M' is equivalent to [D(1:n,n) * M; zeros(m-n, columns (M))], i.e., null rows are appended to the result. The situation for right-multiplication `M*D' is analogous. The expressions `D \ M' and `M / D' perform inverse scaling. They are equivalent to solving a diagonal (or rectangular diagonal) in a least-squares minimum-norm sense. In exact arithmetics, this is equivalent to multiplying by a pseudoinverse. The pseudoinverse of a rectangular diagonal matrix is again a rectangular diagonal matrix with swapped dimensions, where each nonzero diagonal element is replaced by its reciprocal. The matrix division algorithms do, in fact, use division rather than multiplication by reciprocals for better numerical accuracy; otherwise, they honor the above definition. Note that a diagonal matrix is never truncated due to ill-conditioning; otherwise, it would not be much useful for scaling. This is typically consistent with linear algebra needs. A full matrix that only happens to be diagonal (an is thus not a special object) is of course treated normally. Multiplication and division by diagonal matrices works efficiently also when combined with sparse matrices, i.e., `D*S', where D is a diagonal matrix and S is a sparse matrix scales the rows of the sparse matrix and returns a sparse matrix. The expressions `S*D', `D\S', `S/D' work analogically. If D1 and D2 are both diagonal matrices, then the expressions D1 + D2 D1 - D2 D1 * D2 D1 / D2 D1 \ D2 again produce diagonal matrices, provided that normal dimension matching rules are obeyed. The relations used are same as described above. Also, a diagonal matrix D can be multiplied or divided by a scalar, or raised to a scalar power if it is square, producing diagonal matrix result in all cases. A diagonal matrix can also be transposed or conjugate-transposed, giving the expected result. Extracting a leading submatrix of a diagonal matrix, i.e., `D(1:m,1:n)', will produce a diagonal matrix, other indexing expressions will implicitly convert to full matrix. Adding a diagonal matrix to a full matrix only operates on the diagonal elements. Thus, A = A + eps * eye (n) is an efficient method of augmenting the diagonal of a matrix. Subtraction works analogically. When involved in expressions with other element-by-element operators, `.*', `./', `.\' or `.^', an implicit conversion to full matrix will take place. This is not always strictly necessary but chosen to facilitate better consistency with MATLAB.  File: octave.info, Node: Expressions Involving Permutation Matrices, Prev: Expressions Involving Diagonal Matrices, Up: Matrix Algebra 20.2.2 Expressions Involving Permutation Matrices ------------------------------------------------- If P is a permutation matrix and M a matrix, the expression `P*M' will permute the rows of M. Similarly, `M*P' will yield a column permutation. Matrix division `P\M' and `M/P' can be used to do inverse permutation. The previously described syntax for creating permutation matrices can actually help an user to understand the connection between a permutation matrix and a permuting vector. Namely, the following holds, where `I = eye (n)' is an identity matrix: I(p,:) * M = (I*M) (p,:) = M(p,:) Similarly, M * I(:,p) = (M*I) (:,p) = M(:,p) The expressions `I(p,:)' and `I(:,p)' are permutation matrices. A permutation matrix can be transposed (or conjugate-transposed, which is the same, because a permutation matrix is never complex), inverting the permutation, or equivalently, turning a row-permutation matrix into a column-permutation one. For permutation matrices, transpose is equivalent to inversion, thus `P\M' is equivalent to `P'*M'. Transpose of a permutation matrix (or inverse) is a constant-time operation, flipping only a flag internally, and thus the choice between the two above equivalent expressions for inverse permuting is completely up to the user's taste. Multiplication and division by permutation matrices works efficiently also when combined with sparse matrices, i.e., `P*S', where P is a permutation matrix and S is a sparse matrix permutes the rows of the sparse matrix and returns a sparse matrix. The expressions `S*P', `P\S', `S/P' work analogically. Two permutation matrices can be multiplied or divided (if their sizes match), performing a composition of permutations. Also a permutation matrix can be indexed by a permutation vector (or two vectors), giving again a permutation matrix. Any other operations do not generally yield a permutation matrix and will thus trigger the implicit conversion.  File: octave.info, Node: Function Support, Next: Example Codes, Prev: Matrix Algebra, Up: Diagonal and Permutation Matrices 20.3 Functions That Are Aware of These Matrices =============================================== This section lists the built-in functions that are aware of diagonal and permutation matrices on input, or can return them as output. Passed to other functions, these matrices will in general trigger an implicit conversion. (Of course, user-defined dynamically linked functions may also work with diagonal or permutation matrices). * Menu: * Diagonal Matrix Functions:: * Permutation Matrix Functions::  File: octave.info, Node: Diagonal Matrix Functions, Next: Permutation Matrix Functions, Up: Function Support 20.3.1 Diagonal Matrix Functions -------------------------------- "inv" and "pinv" can be applied to a diagonal matrix, yielding again a diagonal matrix. "det" will use an efficient straightforward calculation when given a diagonal matrix, as well as "cond". The following mapper functions can be applied to a diagonal matrix without converting it to a full one: "abs", "real", "imag", "conj", "sqrt". A diagonal matrix can also be returned from the "balance" and "svd" functions. The "sparse" function will convert a diagonal matrix efficiently to a sparse matrix.  File: octave.info, Node: Permutation Matrix Functions, Prev: Diagonal Matrix Functions, Up: Function Support 20.3.2 Permutation Matrix Functions ----------------------------------- "inv" and "pinv" will invert a permutation matrix, preserving its specialness. "det" can be applied to a permutation matrix, efficiently calculating the sign of the permutation (which is equal to the determinant). A permutation matrix can also be returned from the built-in functions "lu" and "qr", if a pivoted factorization is requested. The "sparse" function will convert a permutation matrix efficiently to a sparse matrix. The "find" function will also work efficiently with a permutation matrix, making it possible to conveniently obtain the permutation indices.  File: octave.info, Node: Example Codes, Next: Zeros Treatment, Prev: Function Support, Up: Diagonal and Permutation Matrices 20.4 Some Examples of Usage =========================== The following can be used to solve a linear system `A*x = b' using the pivoted LU factorization: [L, U, P] = lu (A); ## now L*U = P*A x = U \ L \ P*b; This is how you normalize columns of a matrix X to unit norm: s = norm (X, "columns"); X = diag (s) \ X; The following expression is a way to efficiently calculate the sign of a permutation, given by a permutation vector P. It will also work in earlier versions of Octave, but slowly. det (eye (length (p))(p, :)) Finally, here's how you solve a linear system `A*x = b' with Tikhonov regularization (ridge regression) using SVD (a skeleton only): m = rows (A); n = columns (A); [U, S, V] = svd (A); ## determine the regularization factor alpha ## alpha = ... ## transform to orthogonal basis b = U'*b; ## Use the standard formula, replacing A with S. ## S is diagonal, so the following will be very fast and accurate. x = (S'*S + alpha^2 * eye (n)) \ (S' * b); ## transform to solution basis x = V*x;  File: octave.info, Node: Zeros Treatment, Prev: Example Codes, Up: Diagonal and Permutation Matrices 20.5 The Differences in Treatment of Zero Elements ================================================== Making diagonal and permutation matrices special matrix objects in their own right and the consequent usage of smarter algorithms for certain operations implies, as a side effect, small differences in treating zeros. The contents of this section applies also to sparse matrices, discussed in the following chapter. The IEEE standard defines the result of the expressions `0*Inf' and `0*NaN' as `NaN', as it has been generally agreed that this is the best compromise. Numerical software dealing with structured and sparse matrices (including Octave) however, almost always makes a distinction between a "numerical zero" and an "assumed zero". A "numerical zero" is a zero value occurring in a place where any floating-point value could occur. It is normally stored somewhere in memory as an explicit value. An "assumed zero", on the contrary, is a zero matrix element implied by the matrix structure (diagonal, triangular) or a sparsity pattern; its value is usually not stored explicitly anywhere, but is implied by the underlying data structure. The primary distinction is that an assumed zero, when multiplied by any number, or divided by any nonzero number, yields *always* a zero, even when, e.g., multiplied by `Inf' or divided by `NaN'. The reason for this behavior is that the numerical multiplication is not actually performed anywhere by the underlying algorithm; the result is just assumed to be zero. Equivalently, one can say that the part of the computation involving assumed zeros is performed symbolically, not numerically. This behavior not only facilitates the most straightforward and efficient implementation of algorithms, but also preserves certain useful invariants, like: * scalar * diagonal matrix is a diagonal matrix * sparse matrix / scalar preserves the sparsity pattern * permutation matrix * matrix is equivalent to permuting rows all of these natural mathematical truths would be invalidated by treating assumed zeros as numerical ones. Note that certain competing software does not strictly follow this principle and converts assumed zeros to numerical zeros in certain cases, while not doing so in other cases. As of today, there are no intentions to mimic such behavior in Octave. Examples of effects of assumed zeros vs. numerical zeros: Inf * eye (3) => Inf 0 0 0 Inf 0 0 0 Inf Inf * speye (3) => Compressed Column Sparse (rows = 3, cols = 3, nnz = 3 [33%]) (1, 1) -> Inf (2, 2) -> Inf (3, 3) -> Inf Inf * full (eye (3)) => Inf NaN NaN NaN Inf NaN NaN NaN Inf diag(1:3) * [NaN; 1; 1] => NaN 2 3 sparse(1:3,1:3,1:3) * [NaN; 1; 1] => NaN 2 3 [1,0,0;0,2,0;0,0,3] * [NaN; 1; 1] => NaN NaN NaN  File: octave.info, Node: Sparse Matrices, Next: Numerical Integration, Prev: Diagonal and Permutation Matrices, Up: Top 21 Sparse Matrices ****************** * Menu: * Basics:: Creation and Manipulation of Sparse Matrices * Sparse Linear Algebra:: Linear Algebra on Sparse Matrices * Iterative Techniques:: Iterative Techniques * Real Life Example:: Using Sparse Matrices  File: octave.info, Node: Basics, Next: Sparse Linear Algebra, Up: Sparse Matrices 21.1 The Creation and Manipulation of Sparse Matrices ===================================================== The size of mathematical problems that can be treated at any particular time is generally limited by the available computing resources. Both, the speed of the computer and its available memory place limitation on the problem size. There are many classes of mathematical problems which give rise to matrices, where a large number of the elements are zero. In this case it makes sense to have a special matrix type to handle this class of problems where only the non-zero elements of the matrix are stored. Not only does this reduce the amount of memory to store the matrix, but it also means that operations on this type of matrix can take advantage of the a-priori knowledge of the positions of the non-zero elements to accelerate their calculations. A matrix type that stores only the non-zero elements is generally called sparse. It is the purpose of this document to discuss the basics of the storage and creation of sparse matrices and the fundamental operations on them. * Menu: * Storage of Sparse Matrices:: * Creating Sparse Matrices:: * Information:: * Operators and Functions::  File: octave.info, Node: Storage of Sparse Matrices, Next: Creating Sparse Matrices, Up: Basics 21.1.1 Storage of Sparse Matrices --------------------------------- It is not strictly speaking necessary for the user to understand how sparse matrices are stored. However, such an understanding will help to get an understanding of the size of sparse matrices. Understanding the storage technique is also necessary for those users wishing to create their own oct-files. There are many different means of storing sparse matrix data. What all of the methods have in common is that they attempt to reduce the complexity and storage given a-priori knowledge of the particular class of problems that will be solved. A good summary of the available techniques for storing sparse matrix is given by Saad (1). With full matrices, knowledge of the point of an element of the matrix within the matrix is implied by its position in the computers memory. However, this is not the case for sparse matrices, and so the positions of the non-zero elements of the matrix must equally be stored. An obvious way to do this is by storing the elements of the matrix as triplets, with two elements being their position in the array (rows and column) and the third being the data itself. This is conceptually easy to grasp, but requires more storage than is strictly needed. The storage technique used within Octave is the compressed column format. In this format the position of each element in a row and the data are stored as previously. However, if we assume that all elements in the same column are stored adjacent in the computers memory, then we only need to store information on the number of non-zero elements in each column, rather than their positions. Thus assuming that the matrix has more non-zero elements than there are columns in the matrix, we win in terms of the amount of memory used. In fact, the column index contains one more element than the number of columns, with the first element always being zero. The advantage of this is a simplification in the code, in that there is no special case for the first or last columns. A short example, demonstrating this in C is. for (j = 0; j < nc; j++) for (i = cidx (j); i < cidx(j+1); i++) printf ("non-zero element (%i,%i) is %d\n", ridx(i), j, data(i)); A clear understanding might be had by considering an example of how the above applies to an example matrix. Consider the matrix 1 2 0 0 0 0 0 3 0 0 0 4 The non-zero elements of this matrix are (1, 1) => 1 (1, 2) => 2 (2, 4) => 3 (3, 4) => 4 This will be stored as three vectors CIDX, RIDX and DATA, representing the column indexing, row indexing and data respectively. The contents of these three vectors for the above matrix will be CIDX = [0, 1, 2, 2, 4] RIDX = [0, 0, 1, 2] DATA = [1, 2, 3, 4] Note that this is the representation of these elements with the first row and column assumed to start at zero, while in Octave itself the row and column indexing starts at one. Thus the number of elements in the I-th column is given by `CIDX (I + 1) - CIDX (I)'. Although Octave uses a compressed column format, it should be noted that compressed row formats are equally possible. However, in the context of mixed operations between mixed sparse and dense matrices, it makes sense that the elements of the sparse matrices are in the same order as the dense matrices. Octave stores dense matrices in column major ordering, and so sparse matrices are equally stored in this manner. A further constraint on the sparse matrix storage used by Octave is that all elements in the rows are stored in increasing order of their row index, which makes certain operations faster. However, it imposes the need to sort the elements on the creation of sparse matrices. Having disordered elements is potentially an advantage in that it makes operations such as concatenating two sparse matrices together easier and faster, however it adds complexity and speed problems elsewhere. ---------- Footnotes ---------- (1) Youcef Saad "SPARSKIT: A basic toolkit for sparse matrix computation", 1994, `http://www-users.cs.umn.edu/~saad/software/SPARSKIT/paper.ps'  File: octave.info, Node: Creating Sparse Matrices, Next: Information, Prev: Storage of Sparse Matrices, Up: Basics 21.1.2 Creating Sparse Matrices ------------------------------- There are several means to create sparse matrix. Returned from a function There are many functions that directly return sparse matrices. These include "speye", "sprand", "diag", etc. Constructed from matrices or vectors The function "sparse" allows a sparse matrix to be constructed from three vectors representing the row, column and data. Alternatively, the function "spconvert" uses a three column matrix format to allow easy importation of data from elsewhere. Created and then filled The function "sparse" or "spalloc" can be used to create an empty matrix that is then filled by the user From a user binary program The user can directly create the sparse matrix within an oct-file. There are several basic functions to return specific sparse matrices. For example the sparse identity matrix, is a matrix that is often needed. It therefore has its own function to create it as `speye (N)' or `speye (R, C)', which creates an N-by-N or R-by-C sparse identity matrix. Another typical sparse matrix that is often needed is a random distribution of random elements. The functions "sprand" and "sprandn" perform this for uniform and normal random distributions of elements. They have exactly the same calling convention, where `sprand (R, C, D)', creates an R-by-C sparse matrix with a density of filled elements of D. Other functions of interest that directly create sparse matrices, are "diag" or its generalization "spdiags", that can take the definition of the diagonals of the matrix and create the sparse matrix that corresponds to this. For example s = diag (sparse(randn(1,n)), -1); creates a sparse (N+1)-by-(N+1) sparse matrix with a single diagonal defined. -- Function File: [B, C] = spdiags (A) -- Function File: B = spdiags (A, C) -- Function File: B = spdiags (V, C, A) -- Function File: B = spdiags (V, C, M, N) A generalization of the function `diag'. Called with a single input argument, the non-zero diagonals C of A are extracted. With two arguments the diagonals to extract are given by the vector C. The other two forms of `spdiags' modify the input matrix by replacing the diagonals. They use the columns of V to replace the columns represented by the vector C. If the sparse matrix A is defined then the diagonals of this matrix are replaced. Otherwise a matrix of M by N is created with the diagonals given by V. Negative values of C represent diagonals below the main diagonal, and positive values of C diagonals above the main diagonal. For example spdiags (reshape (1:12, 4, 3), [-1 0 1], 5, 4) => 5 10 0 0 1 6 11 0 0 2 7 12 0 0 3 8 0 0 0 4 -- Function File: Y = speye (M) -- Function File: Y = speye (M, N) -- Function File: Y = speye (SZ) Returns a sparse identity matrix. This is significantly more efficient than `sparse (eye (M))' as the full matrix is not constructed. Called with a single argument a square matrix of size M by M is created. Otherwise a matrix of M by N is created. If called with a single vector argument, this argument is taken to be the size of the matrix to create. -- Function File: Y = spfun (F,X) Compute `f(X)' for the non-zero values of X. This results in a sparse matrix with the same structure as X. The function F can be passed as a string, a function handle or an inline function. -- Mapping Function: spmax (X, Y, DIM) -- Mapping Function: [W, IW] = spmax (X) This function has been deprecated. Use `max' instead. -- Mapping Function: spmin (X, Y, DIM) -- Mapping Function: [W, IW] = spmin (X) This function has been deprecated. Use `min' instead. -- Function File: Y = spones (X) Replace the non-zero entries of X with ones. This creates a sparse matrix with the same structure as X. -- Function File: sprand (M, N, D) -- Function File: sprand (S) Generate a random sparse matrix. The size of the matrix will be M by N, with a density of values given by D. D should be between 0 and 1. Values will be uniformly distributed between 0 and 1. Note: sometimes the actual density may be a bit smaller than D. This is unlikely to happen for large really sparse matrices. If called with a single matrix argument, a random sparse matrix is generated wherever the matrix S is non-zero. *See also:* *note sprandn: doc-sprandn. -- Function File: sprandn (M, N, D) -- Function File: sprandn (S) Generate a random sparse matrix. The size of the matrix will be M by N, with a density of values given by D. D should be between 0 and 1. Values will be normally distributed with mean of zero and variance 1. Note: sometimes the actual density may be a bit smaller than D. This is unlikely to happen for large really sparse matrices. If called with a single matrix argument, a random sparse matrix is generated wherever the matrix S is non-zero. *See also:* *note sprand: doc-sprand. -- Function File: sprandsym (N, D) -- Function File: sprandsym (S) Generate a symmetric random sparse matrix. The size of the matrix will be N by N, with a density of values given by D. D should be between 0 and 1. Values will be normally distributed with mean of zero and variance 1. Note: sometimes the actual density may be a bit smaller than D. This is unlikely to happen for large really sparse matrices. If called with a single matrix argument, a random sparse matrix is generated wherever the matrix S is non-zero in its lower triangular part. *See also:* *note sprand: doc-sprand, *note sprandn: doc-sprandn. The recommended way for the user to create a sparse matrix, is to create two vectors containing the row and column index of the data and a third vector of the same size containing the data to be stored. For example ri = ci = d = []; for j = 1:c ri = [ri; randperm(r)(1:n)']; ci = [ci; j*ones(n,1)]; d = [d; rand(n,1)]; endfor s = sparse (ri, ci, d, r, c); creates an R-by-C sparse matrix with a random distribution of N ( Compressed Column Sparse (rows=4, cols=4, nnz=3) (1 , 1) -> 1 (2 , 3) -> 2 (3 , 4) -> 3 An example of creating and filling a matrix might be k = 5; nz = r * k; s = spalloc (r, c, nz) for j = 1:c idx = randperm (r); s (:, j) = [zeros(r - k, 1); ... rand(k, 1)] (idx); endfor It should be noted, that due to the way that the Octave assignment functions are written that the assignment will reallocate the memory used by the sparse matrix at each iteration of the above loop. Therefore the "spalloc" function ignores the NZ argument and does not preassign the memory for the matrix. Therefore, it is vitally important that code using to above structure should be vectorized as much as possible to minimize the number of assignments and reduce the number of memory allocations. -- Loadable Function: FM = full (SM) returns a full storage matrix from a sparse, diagonal, permutation matrix or a range. *See also:* *note sparse: doc-sparse. -- Function File: S = spalloc (R, C, NZ) Returns an empty sparse matrix of size R-by-C. As Octave resizes sparse matrices at the first opportunity, so that no additional space is needed, the argument NZ is ignored. This function is provided only for compatibility reasons. It should be noted that this means that code like k = 5; nz = r * k; s = spalloc (r, c, nz) for j = 1:c idx = randperm (r); s (:, j) = [zeros(r - k, 1); rand(k, 1)] (idx); endfor will reallocate memory at each step. It is therefore vitally important that code like this is vectorized as much as possible. *See also:* *note sparse: doc-sparse, *note nzmax: doc-nzmax. -- Loadable Function: S = sparse (A) -- Loadable Function: S = sparse (I, J, SV, M, N, NZMAX) -- Loadable Function: S = sparse (I, J, SV) -- Loadable Function: S = sparse (I, J, S, M, N, "unique") -- Loadable Function: S = sparse (M, N) Create a sparse matrix from the full matrix or row, column, value triplets. If A is a full matrix, convert it to a sparse matrix representation, removing all zero values in the process. Given the integer index vectors I and J, a 1-by-`nnz' vector of real of complex values SV, overall dimensions M and N of the sparse matrix. The argument `nzmax' is ignored but accepted for compatibility with MATLAB. If M or N are not specified their values are derived from the maximum index in the vectors I and J as given by `M = max (I)', `N = max (J)'. *Note*: if multiple values are specified with the same I, J indices, the corresponding values in S will be added. The following are all equivalent: s = sparse (i, j, s, m, n) s = sparse (i, j, s, m, n, "summation") s = sparse (i, j, s, m, n, "sum") Given the option "unique". if more than two values are specified for the same I, J indices, the last specified value will be used. `sparse(M, N)' is equivalent to `sparse ([], [], [], M, N, 0)' If any of SV, I or J are scalars, they are expanded to have a common size. *See also:* *note full: doc-full. -- Function File: X = spconvert (M) This function converts for a simple sparse matrix format easily produced by other programs into Octave's internal sparse format. The input X is either a 3 or 4 column real matrix, containing the row, column, real and imaginary parts of the elements of the sparse matrix. An element with a zero real and imaginary part can be used to force a particular matrix size. The above problem of memory reallocation can be avoided in oct-files. However, the construction of a sparse matrix from an oct-file is more complex than can be discussed here, and you are referred to chapter *note Dynamically Linked Functions::, to have a full description of the techniques involved.  File: octave.info, Node: Information, Next: Operators and Functions, Prev: Creating Sparse Matrices, Up: Basics 21.1.3 Finding out Information about Sparse Matrices ---------------------------------------------------- There are a number of functions that allow information concerning sparse matrices to be obtained. The most basic of these is "issparse" that identifies whether a particular Octave object is in fact a sparse matrix. Another very basic function is "nnz" that returns the number of non-zero entries there are in a sparse matrix, while the function "nzmax" returns the amount of storage allocated to the sparse matrix. Note that Octave tends to crop unused memory at the first opportunity for sparse objects. There are some cases of user created sparse objects where the value returned by "nzmax" will not be the same as "nnz", but in general they will give the same result. The function "spstats" returns some basic statistics on the columns of a sparse matrix including the number of elements, the mean and the variance of each column. -- Loadable Function: issparse (EXPR) Return 1 if the value of the expression EXPR is a sparse matrix. -- Built-in Function: SCALAR = nnz (A) Returns the number of non zero elements in A. *See also:* *note sparse: doc-sparse. -- Function File: nonzeros (S) Returns a vector of the non-zero values of the sparse matrix S. -- Built-in Function: SCALAR = nzmax (SM) Return the amount of storage allocated to the sparse matrix SM. Note that Octave tends to crop unused memory at the first opportunity for sparse objects. There are some cases of user created sparse objects where the value returned by "nzmax" will not be the same as "nnz", but in general they will give the same result. *See also:* *note sparse: doc-sparse, *note spalloc: doc-spalloc. -- Function File: [COUNT, MEAN, VAR] = spstats (S) -- Function File: [COUNT, MEAN, VAR] = spstats (S, J) Return the stats for the non-zero elements of the sparse matrix S. COUNT is the number of non-zeros in each column, MEAN is the mean of the non-zeros in each column, and VAR is the variance of the non-zeros in each column. Called with two input arguments, if S is the data and J is the bin number for the data, compute the stats for each bin. In this case, bins can contain data values of zero, whereas with `spstats (S)' the zeros may disappear. When solving linear equations involving sparse matrices Octave determines the means to solve the equation based on the type of the matrix as discussed in *note Sparse Linear Algebra::. Octave probes the matrix type when the div (/) or ldiv (\) operator is first used with the matrix and then caches the type. However the "matrix_type" function can be used to determine the type of the sparse matrix prior to use of the div or ldiv operators. For example a = tril (sprandn(1024, 1024, 0.02), -1) ... + speye(1024); matrix_type (a); ans = Lower show that Octave correctly determines the matrix type for lower triangular matrices. "matrix_type" can also be used to force the type of a matrix to be a particular type. For example a = matrix_type (tril (sprandn (1024, ... 1024, 0.02), -1) + speye(1024), 'Lower'); This allows the cost of determining the matrix type to be avoided. However, incorrectly defining the matrix type will result in incorrect results from solutions of linear equations, and so it is entirely the responsibility of the user to correctly identify the matrix type There are several graphical means of finding out information about sparse matrices. The first is the "spy" command, which displays the structure of the non-zero elements of the matrix. *Note fig:spmatrix::, for an example of the use of "spy". More advanced graphical information can be obtained with the "treeplot", "etreeplot" and "gplot" commands. [image src="spmatrix.png" text=" | * * | * * * * | * * * * | * * * * 5 - * * * * | * * * * | * * * * | * * * | * * 10 - * * | * * | * * | * * | * * 15 - * * |----------|---------|---------| 5 10 15"] Figure 21.1: Structure of simple sparse matrix. One use of sparse matrices is in graph theory, where the interconnections between nodes are represented as an adjacency matrix. That is, if the i-th node in a graph is connected to the j-th node. Then the ij-th node (and in the case of undirected graphs the ji-th node) of the sparse adjacency matrix is non-zero. If each node is then associated with a set of coordinates, then the "gplot" command can be used to graphically display the interconnections between nodes. As a trivial example of the use of "gplot", consider the example A = sparse([2,6,1,3,2,4,3,5,4,6,1,5], [1,1,2,2,3,3,4,4,5,5,6,6],1,6,6); xy = [0,4,8,6,4,2;5,0,5,7,5,7]'; gplot(A,xy) which creates an adjacency matrix `A' where node 1 is connected to nodes 2 and 6, node 2 with nodes 1 and 3, etc. The coordinates of the nodes are given in the n-by-2 matrix `xy'. The dependencies between the nodes of a Cholesky factorization can be calculated in linear time without explicitly needing to calculate the Cholesky factorization by the `etree' command. This command returns the elimination tree of the matrix and can be displayed graphically by the command `treeplot(etree(A))' if `A' is symmetric or `treeplot(etree(A+A'))' otherwise. -- Function File: spy (X) -- Function File: spy (..., MARKERSIZE) -- Function File: spy (..., LINE_SPEC) Plot the sparsity pattern of the sparse matrix X. If the argument MARKERSIZE is given as an scalar value, it is used to determine the point size in the plot. If the string LINE_SPEC is given it is passed to `plot' and determines the appearance of the plot. *See also:* *note plot: doc-plot. -- Loadable Function: P = etree (S) -- Loadable Function: P = etree (S, TYP) -- Loadable Function: [P, Q] = etree (S, TYP) Returns the elimination tree for the matrix S. By default S is assumed to be symmetric and the symmetric elimination tree is returned. The argument TYP controls whether a symmetric or column elimination tree is returned. Valid values of TYP are 'sym' or 'col', for symmetric or column elimination tree respectively Called with a second argument, "etree" also returns the postorder permutations on the tree. -- Function File: etreeplot (TREE) -- Function File: etreeplot (TREE, NODE_STYLE, EDGE_STYLE) Plot the elimination tree of the matrix S or `S+S'' if S in non-symmetric. The optional parameters LINE_STYLE and EDGE_STYLE define the output style. *See also:* *note treeplot: doc-treeplot, *note gplot: doc-gplot. -- Function File: gplot (A, XY) -- Function File: gplot (A, XY, LINE_STYLE) -- Function File: [X, Y] = gplot (A, XY) Plot a graph defined by A and XY in the graph theory sense. A is the adjacency matrix of the array to be plotted and XY is an N-by-2 matrix containing the coordinates of the nodes of the graph. The optional parameter LINE_STYLE defines the output style for the plot. Called with no output arguments the graph is plotted directly. Otherwise, return the coordinates of the plot in X and Y. *See also:* *note treeplot: doc-treeplot, *note etreeplot: doc-etreeplot, *note spy: doc-spy. -- Function File: treeplot (TREE) -- Function File: treeplot (TREE, LINE_STYLE, EDGE_STYLE) Produces a graph of tree or forest. The first argument is vector of predecessors, optional parameters LINE_STYLE and EDGE_STYLE define the output style. The complexity of the algorithm is O(n) in terms of is time and memory requirements. *See also:* *note etreeplot: doc-etreeplot, *note gplot: doc-gplot. -- Function File: treelayout (TREE) -- Function File: treelayout (TREE, PERMUTATION) treelayout lays out a tree or a forest. The first argument TREE is a vector of predecessors, optional parameter PERMUTATION is an optional postorder permutation. The complexity of the algorithm is O(n) in terms of time and memory requirements. *See also:* *note etreeplot: doc-etreeplot, *note gplot: doc-gplot, *note treeplot: doc-treeplot.  File: octave.info, Node: Operators and Functions, Prev: Information, Up: Basics 21.1.4 Basic Operators and Functions on Sparse Matrices ------------------------------------------------------- * Menu: * Sparse Functions:: * Return Types of Operators and Functions:: * Mathematical Considerations::  File: octave.info, Node: Sparse Functions, Next: Return Types of Operators and Functions, Up: Operators and Functions 21.1.4.1 Sparse Functions ......................... An important consideration in the use of the sparse functions of Octave is that many of the internal functions of Octave, such as "diag", cannot accept sparse matrices as an input. The sparse implementation in Octave therefore uses the "dispatch" function to overload the normal Octave functions with equivalent functions that work with sparse matrices. However, at any time the sparse matrix specific version of the function can be used by explicitly calling its function name. The table below lists all of the sparse functions of Octave. Note that the names of the specific sparse forms of the functions are typically the same as the general versions with a "sp" prefix. In the table below, and the rest of this article the specific sparse versions of the functions are used. Generate sparse matrices: "spalloc", "spdiags", "speye", "sprand", "sprandn", "sprandsym" Sparse matrix conversion: "full", "sparse", "spconvert" Manipulate sparse matrices "issparse", "nnz", "nonzeros", "nzmax", "spfun", "spones", "spy" Graph Theory: "etree", "etreeplot", "gplot", "treeplot" Sparse matrix reordering: "amd", "ccolamd", "colamd", "colperm", "csymamd", "dmperm", "symamd", "randperm", "symrcm" Linear algebra: "condest", "eigs", "matrix_type", "normest", "sprank", "spaugment", "svds" Iterative techniques: "luinc", "pcg", "pcr" Miscellaneous: "spparms", "symbfact", "spstats" In addition all of the standard Octave mapper functions (i.e., basic math functions that take a single argument) such as "abs", etc. can accept sparse matrices. The reader is referred to the documentation supplied with these functions within Octave itself for further details.  File: octave.info, Node: Return Types of Operators and Functions, Next: Mathematical Considerations, Prev: Sparse Functions, Up: Operators and Functions 21.1.4.2 The Return Types of Operators and Functions .................................................... The two basic reasons to use sparse matrices are to reduce the memory usage and to not have to do calculations on zero elements. The two are closely related in that the computation time on a sparse matrix operator or function is roughly linear with the number of non-zero elements. Therefore, there is a certain density of non-zero elements of a matrix where it no longer makes sense to store it as a sparse matrix, but rather as a full matrix. For this reason operators and functions that have a high probability of returning a full matrix will always return one. For example adding a scalar constant to a sparse matrix will almost always make it a full matrix, and so the example speye(3) + 0 => 1 0 0 0 1 0 0 0 1 returns a full matrix as can be seen. Additionally, if `sparse_auto_mutate' is true, all sparse functions test the amount of memory occupied by the sparse matrix to see if the amount of storage used is larger than the amount used by the full equivalent. Therefore `speye (2) * 1' will return a full matrix as the memory used is smaller for the full version than the sparse version. As all of the mixed operators and functions between full and sparse matrices exist, in general this does not cause any problems. However, one area where it does cause a problem is where a sparse matrix is promoted to a full matrix, where subsequent operations would resparsify the matrix. Such cases are rare, but can be artificially created, for example `(fliplr(speye(3)) + speye(3)) - speye(3)' gives a full matrix when it should give a sparse one. In general, where such cases occur, they impose only a small memory penalty. There is however one known case where this behavior of Octave's sparse matrices will cause a problem. That is in the handling of the "diag" function. Whether "diag" returns a sparse or full matrix depending on the type of its input arguments. So a = diag (sparse([1,2,3]), -1); should return a sparse matrix. To ensure this actually happens, the "sparse" function, and other functions based on it like "speye", always returns a sparse matrix, even if the memory used will be larger than its full representation. -- Built-in Function: VAL = sparse_auto_mutate () -- Built-in Function: OLD_VAL = sparse_auto_mutate (NEW_VAL) Query or set the internal variable that controls whether Octave will automatically mutate sparse matrices to real matrices to save memory. For example, s = speye(3); sparse_auto_mutate (false) s (:, 1) = 1; typeinfo (s) => sparse matrix sparse_auto_mutate (true) s (1, :) = 1; typeinfo (s) => matrix Note that the `sparse_auto_mutate' option is incompatible with MATLAB, and so it is off by default.  File: octave.info, Node: Mathematical Considerations, Prev: Return Types of Operators and Functions, Up: Operators and Functions 21.1.4.3 Mathematical Considerations .................................... The attempt has been made to make sparse matrices behave in exactly the same manner as there full counterparts. However, there are certain differences and especially differences with other products sparse implementations. Firstly, the "./" and ".^" operators must be used with care. Consider what the examples s = speye (4); a1 = s .^ 2; a2 = s .^ s; a3 = s .^ -2; a4 = s ./ 2; a5 = 2 ./ s; a6 = s ./ s; will give. The first example of S raised to the power of 2 causes no problems. However S raised element-wise to itself involves a large number of terms `0 .^ 0' which is 1. There `S .^ S' is a full matrix. Likewise `S .^ -2' involves terms like `0 .^ -2' which is infinity, and so `S .^ -2' is equally a full matrix. For the "./" operator `S ./ 2' has no problems, but `2 ./ S' involves a large number of infinity terms as well and is equally a full matrix. The case of `S ./ S' involves terms like `0 ./ 0' which is a `NaN' and so this is equally a full matrix with the zero elements of S filled with `NaN' values. The above behavior is consistent with full matrices, but is not consistent with sparse implementations in other products. A particular problem of sparse matrices comes about due to the fact that as the zeros are not stored, the sign-bit of these zeros is equally not stored. In certain cases the sign-bit of zero is important. For example a = 0 ./ [-1, 1; 1, -1]; b = 1 ./ a => -Inf Inf Inf -Inf c = 1 ./ sparse (a) => Inf Inf Inf Inf To correct this behavior would mean that zero elements with a negative sign-bit would need to be stored in the matrix to ensure that their sign-bit was respected. This is not done at this time, for reasons of efficiency, and so the user is warned that calculations where the sign-bit of zero is important must not be done using sparse matrices. In general any function or operator used on a sparse matrix will result in a sparse matrix with the same or a larger number of non-zero elements than the original matrix. This is particularly true for the important case of sparse matrix factorizations. The usual way to address this is to reorder the matrix, such that its factorization is sparser than the factorization of the original matrix. That is the factorization of `L * U = P * S * Q' has sparser terms `L' and `U' than the equivalent factorization `L * U = S'. Several functions are available to reorder depending on the type of the matrix to be factorized. If the matrix is symmetric positive-definite, then "symamd" or "csymamd" should be used. Otherwise "amd", "colamd" or "ccolamd" should be used. For completeness the reordering functions "colperm" and "randperm" are also available. *Note fig:simplematrix::, for an example of the structure of a simple positive definite matrix. [image src="spmatrix.png" text=" | * * | * * * * | * * * * | * * * * 5 - * * * * | * * * * | * * * * | * * * | * * 10 - * * | * * | * * | * * | * * 15 - * * |----------|---------|---------| 5 10 15"] Figure 21.2: Structure of simple sparse matrix. The standard Cholesky factorization of this matrix can be obtained by the same command that would be used for a full matrix. This can be visualized with the command `r = chol(A); spy(r);'. *Note fig:simplechol::. The original matrix had 43 non-zero terms, while this Cholesky factorization has 71, with only half of the symmetric matrix being stored. This is a significant level of fill in, and although not an issue for such a small test case, can represents a large overhead in working with other sparse matrices. The appropriate sparsity preserving permutation of the original matrix is given by "symamd" and the factorization using this reordering can be visualized using the command `q = symamd(A); r = chol(A(q,q)); spy(r)'. This gives 29 non-zero terms which is a significant improvement. The Cholesky factorization itself can be used to determine the appropriate sparsity preserving reordering of the matrix during the factorization, In that case this might be obtained with three return arguments as r`[r, p, q] = chol(A); spy(r)'. [image src="spchol.png" text=" | * * | * * * | * * * * | * * * * * 5 - * * * * * * | * * * * * * * | * * * * * * * * | * * * * * * * * | * * * * * * * 10 - * * * * * * | * * * * * | * * * * | * * * | * * 15 - * |----------|---------|---------| 5 10 15"] Figure 21.3: Structure of the un-permuted Cholesky factorization of the above matrix. [image src="spcholperm.png" text=" | * * | * * | * * | * * 5 - * * | * * | * * | * * | * * 10 - * * | * * | * * | * * | * * 15 - * |----------|---------|---------| 5 10 15"] Figure 21.4: Structure of the permuted Cholesky factorization of the above matrix. In the case of an asymmetric matrix, the appropriate sparsity preserving permutation is "colamd" and the factorization using this reordering can be visualized using the command `q = colamd(A); [l, u, p] = lu(A(:,q)); spy(l+u)'. Finally, Octave implicitly reorders the matrix when using the div (/) and ldiv (\) operators, and so no the user does not need to explicitly reorder the matrix to maximize performance. -- Loadable Function: P = amd (S) -- Loadable Function: P = amd (S, OPTS) Returns the approximate minimum degree permutation of a matrix. This permutation such that the Cholesky factorization of `S (P, P)' tends to be sparser than the Cholesky factorization of S itself. `amd' is typically faster than `symamd' but serves a similar purpose. The optional parameter OPTS is a structure that controls the behavior of `amd'. The fields of these structure are opts.dense Determines what `amd' considers to be a dense row or column of the input matrix. Rows or columns with more than `max(16, (dense * sqrt (N)' entries, where N is the order of the matrix S, are ignored by `amd' during the calculation of the permutation The value of dense must be a positive scalar and its default value is 10.0 opts.aggressive If this value is a non zero scalar, then `amd' performs aggressive absorption. The default is not to perform aggressive absorption. The author of the code itself is Timothy A. Davis (davis@cise.ufl.edu), University of Florida (see `http://www.cise.ufl.edu/research/sparse/amd'). *See also:* *note symamd: doc-symamd, *note colamd: doc-colamd. -- Loadable Function: P = ccolamd (S) -- Loadable Function: P = ccolamd (S, KNOBS) -- Loadable Function: P = ccolamd (S, KNOBS, CMEMBER) -- Loadable Function: [P, STATS] = ccolamd (...) Constrained column approximate minimum degree permutation. `P = ccolamd (S)' returns the column approximate minimum degree permutation vector for the sparse matrix S. For a non-symmetric matrix S, `S (:, P)' tends to have sparser LU factors than S. `chol (S (:, P)' * S (:, P))' also tends to be sparser than `chol (S' * S)'. `P = ccolamd (S, 1)' optimizes the ordering for `lu (S (:, P))'. The ordering is followed by a column elimination tree post-ordering. KNOBS is an optional one- to five-element input vector, with a default value of `[0 10 10 1 0]' if not present or empty. Entries not present are set to their defaults. `KNOBS(1)' if nonzero, the ordering is optimized for `lu (S (:, p))'. It will be a poor ordering for `chol (S (:, P)' * S (:, P))'. This is the most important knob for ccolamd. `KNOB(2)' if S is m-by-n, rows with more than `max (16, KNOBS (2) * sqrt (n))' entries are ignored. `KNOB(3)' columns with more than `max (16, KNOBS (3) * sqrt (min (M, N)))' entries are ignored and ordered last in the output permutation (subject to the cmember constraints). `KNOB(4)' if nonzero, aggressive absorption is performed. `KNOB(5)' if nonzero, statistics and knobs are printed. CMEMBER is an optional vector of length n. It defines the constraints on the column ordering. If `CMEMBER (j) = C', then column J is in constraint set C (C must be in the range 1 to N). In the output permutation P, all columns in set 1 appear first, followed by all columns in set 2, and so on. `CMEMBER = ones(1,n)' if not present or empty. `ccolamd (S, [], 1 : N)' returns `1 : N' `P = ccolamd (S)' is about the same as `P = colamd (S)'. KNOBS and its default values differ. `colamd' always does aggressive absorption, and it finds an ordering suitable for both `lu (S (:, P))' and `chol (S (:, P)' * S (:, P))'; it cannot optimize its ordering for `lu (S (:, P))' to the extent that `ccolamd (S, 1)' can. STATS is an optional 20-element output vector that provides data about the ordering and the validity of the input matrix S. Ordering statistics are in `STATS (1 : 3)'. `STATS (1)' and `STATS (2)' are the number of dense or empty rows and columns ignored by CCOLAMD and `STATS (3)' is the number of garbage collections performed on the internal data structure used by CCOLAMD (roughly of size `2.2 * nnz (S) + 4 * M + 7 * N' integers). `STATS (4 : 7)' provide information if CCOLAMD was able to continue. The matrix is OK if `STATS (4)' is zero, or 1 if invalid. `STATS (5)' is the rightmost column index that is unsorted or contains duplicate entries, or zero if no such column exists. `STATS (6)' is the last seen duplicate or out-of-order row index in the column index given by `STATS (5)', or zero if no such row index exists. `STATS (7)' is the number of duplicate or out-of-order row indices. `STATS (8 : 20)' is always zero in the current version of CCOLAMD (reserved for future use). The authors of the code itself are S. Larimore, T. Davis (Uni of Florida) and S. Rajamanickam in collaboration with J. Bilbert and E. Ng. Supported by the National Science Foundation (DMS-9504974, DMS-9803599, CCR-0203270), and a grant from Sandia National Lab. See `http://www.cise.ufl.edu/research/sparse' for ccolamd, csymamd, amd, colamd, symamd, and other related orderings. *See also:* *note colamd: doc-colamd, *note csymamd: doc-csymamd. -- Loadable Function: P = colamd (S) -- Loadable Function: P = colamd (S, KNOBS) -- Loadable Function: [P, STATS] = colamd (S) -- Loadable Function: [P, STATS] = colamd (S, KNOBS) Column approximate minimum degree permutation. `P = colamd (S)' returns the column approximate minimum degree permutation vector for the sparse matrix S. For a non-symmetric matrix S, `S (:,P)' tends to have sparser LU factors than S. The Cholesky factorization of `S (:,P)' * S (:,P)' also tends to be sparser than that of `S' * S'. KNOBS is an optional one- to three-element input vector. If S is m-by-n, then rows with more than `max(16,KNOBS(1)*sqrt(n))' entries are ignored. Columns with more than `max(16,knobs(2)*sqrt(min(m,n)))' entries are removed prior to ordering, and ordered last in the output permutation P. Only completely dense rows or columns are removed if `KNOBS (1)' and `KNOBS (2)' are < 0, respectively. If `KNOBS (3)' is nonzero, STATS and KNOBS are printed. The default is `KNOBS = [10 10 0]'. Note that KNOBS differs from earlier versions of colamd STATS is an optional 20-element output vector that provides data about the ordering and the validity of the input matrix S. Ordering statistics are in `STATS (1:3)'. `STATS (1)' and `STATS (2)' are the number of dense or empty rows and columns ignored by COLAMD and `STATS (3)' is the number of garbage collections performed on the internal data structure used by COLAMD (roughly of size `2.2 * nnz(S) + 4 * M + 7 * N' integers). Octave built-in functions are intended to generate valid sparse matrices, with no duplicate entries, with ascending row indices of the nonzeros in each column, with a non-negative number of entries in each column (!) and so on. If a matrix is invalid, then COLAMD may or may not be able to continue. If there are duplicate entries (a row index appears two or more times in the same column) or if the row indices in a column are out of order, then COLAMD can correct these errors by ignoring the duplicate entries and sorting each column of its internal copy of the matrix S (the input matrix S is not repaired, however). If a matrix is invalid in other ways then COLAMD cannot continue, an error message is printed, and no output arguments (P or STATS) are returned. COLAMD is thus a simple way to check a sparse matrix to see if it's valid. `STATS (4:7)' provide information if COLAMD was able to continue. The matrix is OK if `STATS (4)' is zero, or 1 if invalid. `STATS (5)' is the rightmost column index that is unsorted or contains duplicate entries, or zero if no such column exists. `STATS (6)' is the last seen duplicate or out-of-order row index in the column index given by `STATS (5)', or zero if no such row index exists. `STATS (7)' is the number of duplicate or out-of-order row indices. `STATS (8:20)' is always zero in the current version of COLAMD (reserved for future use). The ordering is followed by a column elimination tree post-ordering. The authors of the code itself are Stefan I. Larimore and Timothy A. Davis (davis@cise.ufl.edu), University of Florida. The algorithm was developed in collaboration with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory. (see `http://www.cise.ufl.edu/research/sparse/colamd') *See also:* *note colperm: doc-colperm, *note symamd: doc-symamd. -- Function File: P = colperm (S) Returns the column permutations such that the columns of `S (:, P)' are ordered in terms of increase number of non-zero elements. If S is symmetric, then P is chosen such that `S (P, P)' orders the rows and columns with increasing number of non zeros elements. -- Loadable Function: P = csymamd (S) -- Loadable Function: P = csymamd (S, KNOBS) -- Loadable Function: P = csymamd (S, KNOBS, CMEMBER) -- Loadable Function: [P, STATS] = csymamd (...) For a symmetric positive definite matrix S, returns the permutation vector P such that `S(P,P)' tends to have a sparser Cholesky factor than S. Sometimes `csymamd' works well for symmetric indefinite matrices too. The matrix S is assumed to be symmetric; only the strictly lower triangular part is referenced. S must be square. The ordering is followed by an elimination tree post-ordering. KNOBS is an optional one- to three-element input vector, with a default value of `[10 1 0]' if present or empty. Entries not present are set to their defaults. `KNOBS(1)' If S is n-by-n, then rows and columns with more than `max(16,KNOBS(1)*sqrt(n))' entries are ignored, and ordered last in the output permutation (subject to the cmember constraints). `KNOBS(2)' If nonzero, aggressive absorption is performed. `KNOBS(3)' If nonzero, statistics and knobs are printed. CMEMBER is an optional vector of length n. It defines the constraints on the ordering. If `CMEMBER(j) = S', then row/column j is in constraint set C (C must be in the range 1 to n). In the output permutation P, rows/columns in set 1 appear first, followed by all rows/columns in set 2, and so on. `CMEMBER = ones(1,n)' if not present or empty. `csymamd(S,[],1:n)' returns `1:n'. `P = csymamd(S)' is about the same as `P = symamd(S)'. KNOBS and its default values differ. `STATS (4:7)' provide information if CCOLAMD was able to continue. The matrix is OK if `STATS (4)' is zero, or 1 if invalid. `STATS (5)' is the rightmost column index that is unsorted or contains duplicate entries, or zero if no such column exists. `STATS (6)' is the last seen duplicate or out-of-order row index in the column index given by `STATS (5)', or zero if no such row index exists. `STATS (7)' is the number of duplicate or out-of-order row indices. `STATS (8:20)' is always zero in the current version of CCOLAMD (reserved for future use). The authors of the code itself are S. Larimore, T. Davis (Uni of Florida) and S. Rajamanickam in collaboration with J. Bilbert and E. Ng. Supported by the National Science Foundation (DMS-9504974, DMS-9803599, CCR-0203270), and a grant from Sandia National Lab. See `http://www.cise.ufl.edu/research/sparse' for ccolamd, csymamd, amd, colamd, symamd, and other related orderings. *See also:* *note symamd: doc-symamd, *note ccolamd: doc-ccolamd. -- Loadable Function: P = dmperm (S) -- Loadable Function: [P, Q, R, S] = dmperm (S) Perform a Dulmage-Mendelsohn permutation on the sparse matrix S. With a single output argument "dmperm" performs the row permutations P such that `S (P,:)' has no zero elements on the diagonal. Called with two or more output arguments, returns the row and column permutations, such that `S (P, Q)' is in block triangular form. The values of R and S define the boundaries of the blocks. If S is square then `R == S'. The method used is described in: A. Pothen & C.-J. Fan. Computing the block triangular form of a sparse matrix. ACM Trans. Math. Software, 16(4):303-324, 1990. *See also:* *note colamd: doc-colamd, *note ccolamd: doc-ccolamd. -- Loadable Function: P = symamd (S) -- Loadable Function: P = symamd (S, KNOBS) -- Loadable Function: [P, STATS] = symamd (S) -- Loadable Function: [P, STATS] = symamd (S, KNOBS) For a symmetric positive definite matrix S, returns the permutation vector p such that `S (P, P)' tends to have a sparser Cholesky factor than S. Sometimes SYMAMD works well for symmetric indefinite matrices too. The matrix S is assumed to be symmetric; only the strictly lower triangular part is referenced. S must be square. KNOBS is an optional one- to two-element input vector. If S is n-by-n, then rows and columns with more than `max(16,KNOBS(1)*sqrt(n))' entries are removed prior to ordering, and ordered last in the output permutation P. No rows/columns are removed if `KNOBS(1) < 0'. If `KNOBS (2)' is nonzero, `stats' and KNOBS are printed. The default is `KNOBS = [10 0]'. Note that KNOBS differs from earlier versions of symamd. STATS is an optional 20-element output vector that provides data about the ordering and the validity of the input matrix S. Ordering statistics are in `STATS (1:3)'. `STATS (1) = STATS (2)' is the number of dense or empty rows and columns ignored by SYMAMD and `STATS (3)' is the number of garbage collections performed on the internal data structure used by SYMAMD (roughly of size `8.4 * nnz (tril (S, -1)) + 9 * N' integers). Octave built-in functions are intended to generate valid sparse matrices, with no duplicate entries, with ascending row indices of the nonzeros in each column, with a non-negative number of entries in each column (!) and so on. If a matrix is invalid, then SYMAMD may or may not be able to continue. If there are duplicate entries (a row index appears two or more times in the same column) or if the row indices in a column are out of order, then SYMAMD can correct these errors by ignoring the duplicate entries and sorting each column of its internal copy of the matrix S (the input matrix S is not repaired, however). If a matrix is invalid in other ways then SYMAMD cannot continue, an error message is printed, and no output arguments (P or STATS) are returned. SYMAMD is thus a simple way to check a sparse matrix to see if it's valid. `STATS (4:7)' provide information if SYMAMD was able to continue. The matrix is OK if `STATS (4)' is zero, or 1 if invalid. `STATS (5)' is the rightmost column index that is unsorted or contains duplicate entries, or zero if no such column exists. `STATS (6)' is the last seen duplicate or out-of-order row index in the column index given by `STATS (5)', or zero if no such row index exists. `STATS (7)' is the number of duplicate or out-of-order row indices. `STATS (8:20)' is always zero in the current version of SYMAMD (reserved for future use). The ordering is followed by a column elimination tree post-ordering. The authors of the code itself are Stefan I. Larimore and Timothy A. Davis (davis@cise.ufl.edu), University of Florida. The algorithm was developed in collaboration with John Gilbert, Xerox PARC, and Esmond Ng, Oak Ridge National Laboratory. (see `http://www.cise.ufl.edu/research/sparse/colamd') *See also:* *note colperm: doc-colperm, *note colamd: doc-colamd. -- Loadable Function: P = symrcm (S) Symmetric reverse Cuthill-McKee permutation of S. Return a permutation vector P such that `S (P, P)' tends to have its diagonal elements closer to the diagonal than S. This is a good preordering for LU or Cholesky factorization of matrices that come from 'long, skinny' problems. It works for both symmetric and asymmetric S. The algorithm represents a heuristic approach to the NP-complete bandwidth minimization problem. The implementation is based in the descriptions found in E. Cuthill, J. McKee: Reducing the Bandwidth of Sparse Symmetric Matrices. Proceedings of the 24th ACM National Conference, 157-172 1969, Brandon Press, New Jersey. Alan George, Joseph W. H. Liu: Computer Solution of Large Sparse Positive Definite Systems, Prentice Hall Series in Computational Mathematics, ISBN 0-13-165274-5, 1981. *See also:* *note colperm: doc-colperm, *note colamd: doc-colamd, *note symamd: doc-symamd.  File: octave.info, Node: Sparse Linear Algebra, Next: Iterative Techniques, Prev: Basics, Up: Sparse Matrices 21.2 Linear Algebra on Sparse Matrices ====================================== Octave includes a polymorphic solver for sparse matrices, where the exact solver used to factorize the matrix, depends on the properties of the sparse matrix itself. Generally, the cost of determining the matrix type is small relative to the cost of factorizing the matrix itself, but in any case the matrix type is cached once it is calculated, so that it is not re-determined each time it is used in a linear equation. The selection tree for how the linear equation is solve is 1. If the matrix is diagonal, solve directly and goto 8 2. If the matrix is a permuted diagonal, solve directly taking into account the permutations. Goto 8 3. If the matrix is square, banded and if the band density is less than that given by `spparms ("bandden")' continue, else goto 4. a. If the matrix is tridiagonal and the right-hand side is not sparse continue, else goto 3b. 1. If the matrix is hermitian, with a positive real diagonal, attempt Cholesky factorization using LAPACK xPTSV. 2. If the above failed or the matrix is not hermitian with a positive real diagonal use Gaussian elimination with pivoting using LAPACK xGTSV, and goto 8. b. If the matrix is hermitian with a positive real diagonal, attempt Cholesky factorization using LAPACK xPBTRF. c. if the above failed or the matrix is not hermitian with a positive real diagonal use Gaussian elimination with pivoting using LAPACK xGBTRF, and goto 8. 4. If the matrix is upper or lower triangular perform a sparse forward or backward substitution, and goto 8 5. If the matrix is a upper triangular matrix with column permutations or lower triangular matrix with row permutations, perform a sparse forward or backward substitution, and goto 8 6. If the matrix is square, hermitian with a real positive diagonal, attempt sparse Cholesky factorization using CHOLMOD. 7. If the sparse Cholesky factorization failed or the matrix is not hermitian with a real positive diagonal, and the matrix is square, factorize using UMFPACK. 8. If the matrix is not square, or any of the previous solvers flags a singular or near singular matrix, find a minimum norm solution using CXSPARSE(1). The band density is defined as the number of non-zero values in the matrix divided by the number of non-zero values in the matrix. The banded matrix solvers can be entirely disabled by using "spparms" to set `bandden' to 1 (i.e., `spparms ("bandden", 1)'). The QR solver factorizes the problem with a Dulmage-Mendelsohn, to separate the problem into blocks that can be treated as over-determined, multiple well determined blocks, and a final over-determined block. For matrices with blocks of strongly connected nodes this is a big win as LU decomposition can be used for many blocks. It also significantly improves the chance of finding a solution to over-determined problems rather than just returning a vector of "NaN"'s. All of the solvers above, can calculate an estimate of the condition number. This can be used to detect numerical stability problems in the solution and force a minimum norm solution to be used. However, for narrow banded, triangular or diagonal matrices, the cost of calculating the condition number is significant, and can in fact exceed the cost of factoring the matrix. Therefore the condition number is not calculated in these cases, and Octave relies on simpler techniques to detect singular matrices or the underlying LAPACK code in the case of banded matrices. The user can force the type of the matrix with the `matrix_type' function. This overcomes the cost of discovering the type of the matrix. However, it should be noted that identifying the type of the matrix incorrectly will lead to unpredictable results, and so `matrix_type' should be used with care. -- Function File: [N, C] = normest (A, TOL) Estimate the 2-norm of the matrix A using a power series analysis. This is typically used for large matrices, where the cost of calculating the `norm (A)' is prohibitive and an approximation to the 2-norm is acceptable. TOL is the tolerance to which the 2-norm is calculated. By default TOL is 1e-6. C returns the number of iterations needed for `normest' to converge. -- Function File: [EST, V, W, ITER] = onenormest (A, T) -- Function File: [EST, V, W, ITER] = onenormest (APPLY, APPLY_T, N, T) Apply Higham and Tisseur's randomized block 1-norm estimator to matrix A using T test vectors. If T exceeds 5, then only 5 test vectors are used. If the matrix is not explicit, e.g., when estimating the norm of `inv (A)' given an LU factorization, `onenormest' applies A and its conjugate transpose through a pair of functions APPLY and APPLY_T, respectively, to a dense matrix of size N by T. The implicit version requires an explicit dimension N. Returns the norm estimate EST, two vectors V and W related by norm `(W, 1) = EST * norm (V, 1)', and the number of iterations ITER. The number of iterations is limited to 10 and is at least 2. References: * Nicholas J. Higham and Françoise Tisseur, "A Block Algorithm for Matrix 1-Norm Estimation, with an Application to 1-Norm Pseudospectra." SIMAX vol 21, no 4, pp 1185-1201. `http://dx.doi.org/10.1137/S0895479899356080' * Nicholas J. Higham and Françoise Tisseur, "A Block Algorithm for Matrix 1-Norm Estimation, with an Application to 1-Norm Pseudospectra." `http://citeseer.ist.psu.edu/223007.html' *See also:* *note condest: doc-condest, *note norm: doc-norm, *note cond: doc-cond. -- Function File: [EST, V] = condest (A, T) -- Function File: [EST, V] = condest (A, SOLVE, SOLVE_T, T) -- Function File: [EST, V] = condest (APPLY, APPLY_T, SOLVE, SOLVE_T, N, T) Estimate the 1-norm condition number of a matrix A using T test vectors using a randomized 1-norm estimator. If T exceeds 5, then only 5 test vectors are used. If the matrix is not explicit, e.g., when estimating the condition number of A given an LU factorization, `condest' uses the following functions: APPLY `A*x' for a matrix `x' of size N by T. APPLY_T `A'*x' for a matrix `x' of size N by T. SOLVE `A \ b' for a matrix `b' of size N by T. SOLVE_T `A' \ b' for a matrix `b' of size N by T. The implicit version requires an explicit dimension N. `condest' uses a randomized algorithm to approximate the 1-norms. `condest' returns the 1-norm condition estimate EST and a vector V satisfying `norm (A*v, 1) == norm (A, 1) * norm (V, 1) / EST'. When EST is large, V is an approximate null vector. References: * Nicholas J. Higham and Françoise Tisseur, "A Block Algorithm for Matrix 1-Norm Estimation, with an Application to 1-Norm Pseudospectra." SIMAX vol 21, no 4, pp 1185-1201. `http://dx.doi.org/10.1137/S0895479899356080' * Nicholas J. Higham and Françoise Tisseur, "A Block Algorithm for Matrix 1-Norm Estimation, with an Application to 1-Norm Pseudospectra." `http://citeseer.ist.psu.edu/223007.html' *See also:* *note norm: doc-norm, *note cond: doc-cond, *note onenormest: doc-onenormest. -- Loadable Function: spparms () -- Loadable Function: VALS = spparms () -- Loadable Function: [KEYS, VALS] = spparms () -- Loadable Function: VAL = spparms (KEY) -- Loadable Function: spparms (VALS) -- Loadable Function: spparms ('defaults') -- Loadable Function: spparms ('tight') -- Loadable Function: spparms (KEY, VAL) Sets or displays the parameters used by the sparse solvers and factorization functions. The first four calls above get information about the current settings, while the others change the current settings. The parameters are stored as pairs of keys and values, where the values are all floats and the keys are one of the following strings: `spumoni' Printing level of debugging information of the solvers (default 0) `ths_rel' Included for compatibility. Not used. (default 1) `ths_abs' Included for compatibility. Not used. (default 1) `exact_d' Included for compatibility. Not used. (default 0) `supernd' Included for compatibility. Not used. (default 3) `rreduce' Included for compatibility. Not used. (default 3) `wh_frac' Included for compatibility. Not used. (default 0.5) `autommd' Flag whether the LU/QR and the '\' and '/' operators will automatically use the sparsity preserving mmd functions (default 1) `autoamd' Flag whether the LU and the '\' and '/' operators will automatically use the sparsity preserving amd functions (default 1) `piv_tol' The pivot tolerance of the UMFPACK solvers (default 0.1) `sym_tol' The pivot tolerance of the UMFPACK symmetric solvers (default 0.001) `bandden' The density of non-zero elements in a banded matrix before it is treated by the LAPACK banded solvers (default 0.5) `umfpack' Flag whether the UMFPACK or mmd solvers are used for the LU, '\' and '/' operations (default 1) The value of individual keys can be set with `spparms (KEY, VAL)'. The default values can be restored with the special keyword 'defaults'. The special keyword 'tight' can be used to set the mmd solvers to attempt for a sparser solution at the potential cost of longer running time. -- Loadable Function: P = sprank (S) Calculates the structural rank of a sparse matrix S. Note that only the structure of the matrix is used in this calculation based on a Dulmage-Mendelsohn permutation to block triangular form. As such the numerical rank of the matrix S is bounded by `sprank (S) >= rank (S)'. Ignoring floating point errors `sprank (S) == rank (S)'. *See also:* *note dmperm: doc-dmperm. -- Loadable Function: [COUNT, H, PARENT, POST, R] = symbfact (S, TYP, MODE) Performs a symbolic factorization analysis on the sparse matrix S. Where S S is a complex or real sparse matrix. TYP Is the type of the factorization and can be one of `sym' Factorize S. This is the default. `col' Factorize `S' * S'. `row' Factorize `S * S''. `lo' Factorize `S'' MODE The default is to return the Cholesky factorization for R, and if MODE is 'L', the conjugate transpose of the Cholesky factorization is returned. The conjugate transpose version is faster and uses less memory, but returns the same values for COUNT, H, PARENT and POST outputs. The output variables are COUNT The row counts of the Cholesky factorization as determined by TYP. H The height of the elimination tree. PARENT The elimination tree itself. POST A sparse boolean matrix whose structure is that of the Cholesky factorization as determined by TYP. For non square matrices, the user can also utilize the `spaugment' function to find a least squares solution to a linear equation. -- Function File: S = spaugment (A, C) Creates the augmented matrix of A. This is given by [C * eye(M, M),A; A', zeros(N, N)] This is related to the least squares solution of `A \\ B', by S * [ R / C; x] = [B, zeros(N, columns(B)] where R is the residual error R = B - A * X As the matrix S is symmetric indefinite it can be factorized with `lu', and the minimum norm solution can therefore be found without the need for a `qr' factorization. As the residual error will be `zeros (M, M)' for under determined problems, and example can be m = 11; n = 10; mn = max(m ,n); a = spdiags ([ones(mn,1), 10*ones(mn,1), -ones(mn,1)], [-1, 0, 1], m, n); x0 = a \ ones (m,1); s = spaugment (a); [L, U, P, Q] = lu (s); x1 = Q * (U \ (L \ (P * [ones(m,1); zeros(n,1)]))); x1 = x1(end - n + 1 : end); To find the solution of an overdetermined problem needs an estimate of the residual error R and so it is more complex to formulate a minimum norm solution using the `spaugment' function. In general the left division operator is more stable and faster than using the `spaugment' function. Finally, the function `eigs' can be used to calculate a limited number of eigenvalues and eigenvectors based on a selection criteria and likewise for `svds' which calculates a limited number of singular values and vectors. -- Loadable Function: D = eigs (A) -- Loadable Function: D = eigs (A, K) -- Loadable Function: D = eigs (A, K, SIGMA) -- Loadable Function: D = eigs (A, K, SIGMA,OPTS) -- Loadable Function: D = eigs (A, B) -- Loadable Function: D = eigs (A, B, K) -- Loadable Function: D = eigs (A, B, K, SIGMA) -- Loadable Function: D = eigs (A, B, K, SIGMA, OPTS) -- Loadable Function: D = eigs (AF, N) -- Loadable Function: D = eigs (AF, N, B) -- Loadable Function: D = eigs (AF, N, K) -- Loadable Function: D = eigs (AF, N, B, K) -- Loadable Function: D = eigs (AF, N, K, SIGMA) -- Loadable Function: D = eigs (AF, N, B, K, SIGMA) -- Loadable Function: D = eigs (AF, N, K, SIGMA, OPTS) -- Loadable Function: D = eigs (AF, N, B, K, SIGMA, OPTS) -- Loadable Function: [V, D] = eigs (A, ...) -- Loadable Function: [V, D] = eigs (AF, N, ...) -- Loadable Function: [V, D, FLAG] = eigs (A, ...) -- Loadable Function: [V, D, FLAG] = eigs (AF, N, ...) Calculate a limited number of eigenvalues and eigenvectors of A, based on a selection criteria. The number eigenvalues and eigenvectors to calculate is given by K whose default value is 6. By default `eigs' solve the equation `A * v = lambda * v' , where `lambda' is a scalar representing one of the eigenvalues, and `v' is the corresponding eigenvector. If given the positive definite matrix B then `eigs' solves the general eigenvalue equation `A * v = lambda * B * v' . The argument SIGMA determines which eigenvalues are returned. SIGMA can be either a scalar or a string. When SIGMA is a scalar, the K eigenvalues closest to SIGMA are returned. If SIGMA is a string, it must have one of the values 'lm' Largest magnitude (default). 'sm' Smallest magnitude. 'la' Largest Algebraic (valid only for real symmetric problems). 'sa' Smallest Algebraic (valid only for real symmetric problems). 'be' Both ends, with one more from the high-end if K is odd (valid only for real symmetric problems). 'lr' Largest real part (valid only for complex or unsymmetric problems). 'sr' Smallest real part (valid only for complex or unsymmetric problems). 'li' Largest imaginary part (valid only for complex or unsymmetric problems). 'si' Smallest imaginary part (valid only for complex or unsymmetric problems). If OPTS is given, it is a structure defining some of the options that `eigs' should use. The fields of the structure OPTS are `issym' If AF is given, then flags whether the function AF defines a symmetric problem. It is ignored if A is given. The default is false. `isreal' If AF is given, then flags whether the function AF defines a real problem. It is ignored if A is given. The default is true. `tol' Defines the required convergence tolerance, given as `tol * norm (A)'. The default is `eps'. `maxit' The maximum number of iterations. The default is 300. `p' The number of Lanzcos basis vectors to use. More vectors will result in faster convergence, but a larger amount of memory. The optimal value of 'p' is problem dependent and should be in the range K to N. The default value is `2 * K'. `v0' The starting vector for the computation. The default is to have ARPACK randomly generate a starting vector. `disp' The level of diagnostic printout. If `disp' is 0 then there is no printout. The default value is 1. `cholB' Flag if `chol (B)' is passed rather than B. The default is false. `permB' The permutation vector of the Cholesky factorization of B if `cholB' is true. That is `chol ( B (permB, permB))'. The default is `1:N'. It is also possible to represent A by a function denoted AF. AF must be followed by a scalar argument N defining the length of the vector argument accepted by AF. AF can be passed either as an inline function, function handle or as a string. In the case where AF is passed as a string, the name of the string defines the function to use. AF is a function of the form `function y = af (x), y = ...; endfunction', where the required return value of AF is determined by the value of SIGMA, and are `A * x' If SIGMA is not given or is a string other than 'sm'. `A \ x' If SIGMA is 'sm'. `(A - sigma * I) \ x' for standard eigenvalue problem, where `I' is the identity matrix of the same size as `A'. If SIGMA is zero, this reduces the `A \ x'. `(A - sigma * B) \ x' for the general eigenvalue problem. The return arguments of `eigs' depends on the number of return arguments. With a single return argument, a vector D of length K is returned, represent the K eigenvalues that have been found. With two return arguments, V is a N-by-K matrix whose columns are the K eigenvectors corresponding to the returned eigenvalues. The eigenvalues themselves are then returned in D in the form of a N-by-K matrix, where the elements on the diagonal are the eigenvalues. Given a third return argument FLAG, `eigs' also returns the status of the convergence. If FLAG is 0, then all eigenvalues have converged, otherwise not. This function is based on the ARPACK package, written by R Lehoucq, K Maschhoff, D Sorensen and C Yang. For more information see `http://www.caam.rice.edu/software/ARPACK/'. *See also:* *note eig: doc-eig, *note svds: doc-svds. -- Function File: S = svds (A) -- Function File: S = svds (A, K) -- Function File: S = svds (A, K, SIGMA) -- Function File: S = svds (A, K, SIGMA, OPTS) -- Function File: [U, S, V, FLAG] = svds (...) Find a few singular values of the matrix A. The singular values are calculated using [M, N] = size(A) S = eigs([sparse(M, M), A; ... A', sparse(N, N)]) The eigenvalues returned by `eigs' correspond to the singular values of A. The number of singular values to calculate is given by K, whose default value is 6. The argument SIGMA can be used to specify which singular values to find. SIGMA can be either the string 'L', the default, in which case the largest singular values of A are found. Otherwise SIGMA should be a real scalar, in which case the singular values closest to SIGMA are found. Note that for relatively small values of SIGMA, there is the chance that the requested number of singular values are not returned. In that case SIGMA should be increased. If OPTS is given, then it is a structure that defines options that `svds' will pass to EIGS. The possible fields of this structure are therefore determined by `eigs'. By default three fields of this structure are set by `svds'. `tol' The required convergence tolerance for the singular values. `eigs' is passed TOL divided by `sqrt(2)'. The default value is 1e-10. `maxit' The maximum number of iterations. The default is 300. `disp' The level of diagnostic printout. If `disp' is 0 then there is no printout. The default value is 0. If more than one output argument is given, then `svds' also calculates the left and right singular vectors of A. FLAG is used to signal the convergence of `svds'. If `svds' converges to the desired tolerance, then FLAG given by norm (A * V - U * S, 1) <= ... TOL * norm (A, 1) will be zero. *See also:* *note eigs: doc-eigs. ---------- Footnotes ---------- (1) The CHOLMOD, UMFPACK and CXSPARSE packages were written by Tim Davis and are available at http://www.cise.ufl.edu/research/sparse/  File: octave.info, Node: Iterative Techniques, Next: Real Life Example, Prev: Sparse Linear Algebra, Up: Sparse Matrices 21.3 Iterative Techniques applied to sparse matrices ==================================================== The left division `\' and right division `/' operators, discussed in the previous section, use direct solvers to resolve a linear equation of the form `X = A \ B' or `X = B / A'. Octave equally includes a number of functions to solve sparse linear equations using iterative techniques. -- Function File: X = pcg (A, B, TOL, MAXIT, M1, M2, X0, ...) -- Function File: [X, FLAG, RELRES, ITER, RESVEC, EIGEST] = pcg (...) Solves the linear system of equations `A * X = B' by means of the Preconditioned Conjugate Gradient iterative method. The input arguments are * A can be either a square (preferably sparse) matrix or a function handle, inline function or string containing the name of a function which computes `A * X'. In principle A should be symmetric and positive definite; if `pcg' finds A to not be positive definite, you will get a warning message and the FLAG output parameter will be set. * B is the right hand side vector. * TOL is the required relative tolerance for the residual error, `B - A * X'. The iteration stops if `norm (B - A * X) <= TOL * norm (B - A * X0)'. If TOL is empty or is omitted, the function sets `TOL = 1e-6' by default. * MAXIT is the maximum allowable number of iterations; if `[]' is supplied for `maxit', or `pcg' has less arguments, a default value equal to 20 is used. * M = M1 * M2 is the (left) preconditioning matrix, so that the iteration is (theoretically) equivalent to solving by `pcg' `P * X = M \ B', with `P = M \ A'. Note that a proper choice of the preconditioner may dramatically improve the overall performance of the method. Instead of matrices M1 and M2, the user may pass two functions which return the results of applying the inverse of M1 and M2 to a vector (usually this is the preferred way of using the preconditioner). If `[]' is supplied for M1, or M1 is omitted, no preconditioning is applied. If M2 is omitted, M = M1 will be used as preconditioner. * X0 is the initial guess. If X0 is empty or omitted, the function sets X0 to a zero vector by default. The arguments which follow X0 are treated as parameters, and passed in a proper way to any of the functions (A or M) which are passed to `pcg'. See the examples below for further details. The output arguments are * X is the computed approximation to the solution of `A * X = B'. * FLAG reports on the convergence. `FLAG = 0' means the solution converged and the tolerance criterion given by TOL is satisfied. `FLAG = 1' means that the MAXIT limit for the iteration count was reached. `FLAG = 3' reports that the (preconditioned) matrix was found not positive definite. * RELRES is the ratio of the final residual to its initial value, measured in the Euclidean norm. * ITER is the actual number of iterations performed. * RESVEC describes the convergence history of the method. `RESVEC (i,1)' is the Euclidean norm of the residual, and `RESVEC (i,2)' is the preconditioned residual norm, after the (I-1)-th iteration, `I = 1, 2, ..., ITER+1'. The preconditioned residual norm is defined as `norm (R) ^ 2 = R' * (M \ R)' where `R = B - A * X', see also the description of M. If EIGEST is not required, only `RESVEC (:,1)' is returned. * EIGEST returns the estimate for the smallest `EIGEST (1)' and largest `EIGEST (2)' eigenvalues of the preconditioned matrix `P = M \ A'. In particular, if no preconditioning is used, the estimates for the extreme eigenvalues of A are returned. `EIGEST (1)' is an overestimate and `EIGEST (2)' is an underestimate, so that `EIGEST (2) / EIGEST (1)' is a lower bound for `cond (P, 2)', which nevertheless in the limit should theoretically be equal to the actual value of the condition number. The method which computes EIGEST works only for symmetric positive definite A and M, and the user is responsible for verifying this assumption. Let us consider a trivial problem with a diagonal matrix (we exploit the sparsity of A) n = 10; a = diag (sparse (1:n)); b = rand (n, 1); [l, u, p, q] = luinc (a, 1.e-3); EXAMPLE 1: Simplest use of `pcg' x = pcg(A,b) EXAMPLE 2: `pcg' with a function which computes `A * X' function y = apply_a (x) y = [1:N]'.*x; endfunction x = pcg ("apply_a", b) EXAMPLE 3: `pcg' with a preconditioner: L * U x = pcg (a, b, 1.e-6, 500, l*u); EXAMPLE 4: `pcg' with a preconditioner: L * U. Faster than EXAMPLE 3 since lower and upper triangular matrices are easier to invert x = pcg (a, b, 1.e-6, 500, l, u); EXAMPLE 5: Preconditioned iteration, with full diagnostics. The preconditioner (quite strange, because even the original matrix A is trivial) is defined as a function function y = apply_m (x) k = floor (length (x) - 2); y = x; y(1:k) = x(1:k)./[1:k]'; endfunction [x, flag, relres, iter, resvec, eigest] = ... pcg (a, b, [], [], "apply_m"); semilogy (1:iter+1, resvec); EXAMPLE 6: Finally, a preconditioner which depends on a parameter K. function y = apply_M (x, varargin) K = varargin{1}; y = x; y(1:K) = x(1:K)./[1:K]'; endfunction [x, flag, relres, iter, resvec, eigest] = ... pcg (A, b, [], [], "apply_m", [], [], 3) REFERENCES [1] C.T.Kelley, 'Iterative methods for linear and nonlinear equations', SIAM, 1995 (the base PCG algorithm) [2] Y.Saad, 'Iterative methods for sparse linear systems', PWS 1996 (condition number estimate from PCG) Revised version of this book is available online at http://www-users.cs.umn.edu/~saad/books.html *See also:* *note sparse: doc-sparse, *note pcr: doc-pcr. -- Function File: X = pcr (A, B, TOL, MAXIT, M, X0, ...) -- Function File: [X, FLAG, RELRES, ITER, RESVEC] = pcr (...) Solves the linear system of equations `A * X = B' by means of the Preconditioned Conjugate Residuals iterative method. The input arguments are * A can be either a square (preferably sparse) matrix or a function handle, inline function or string containing the name of a function which computes `A * X'. In principle A should be symmetric and non-singular; if `pcr' finds A to be numerically singular, you will get a warning message and the FLAG output parameter will be set. * B is the right hand side vector. * TOL is the required relative tolerance for the residual error, `B - A * X'. The iteration stops if `norm (B - A * X) <= TOL * norm (B - A * X0)'. If TOL is empty or is omitted, the function sets `TOL = 1e-6' by default. * MAXIT is the maximum allowable number of iterations; if `[]' is supplied for `maxit', or `pcr' has less arguments, a default value equal to 20 is used. * M is the (left) preconditioning matrix, so that the iteration is (theoretically) equivalent to solving by `pcr' `P * X = M \ B', with `P = M \ A'. Note that a proper choice of the preconditioner may dramatically improve the overall performance of the method. Instead of matrix M, the user may pass a function which returns the results of applying the inverse of M to a vector (usually this is the preferred way of using the preconditioner). If `[]' is supplied for M, or M is omitted, no preconditioning is applied. * X0 is the initial guess. If X0 is empty or omitted, the function sets X0 to a zero vector by default. The arguments which follow X0 are treated as parameters, and passed in a proper way to any of the functions (A or M) which are passed to `pcr'. See the examples below for further details. The output arguments are * X is the computed approximation to the solution of `A * X = B'. * FLAG reports on the convergence. `FLAG = 0' means the solution converged and the tolerance criterion given by TOL is satisfied. `FLAG = 1' means that the MAXIT limit for the iteration count was reached. `FLAG = 3' reports t `pcr' breakdown, see [1] for details. * RELRES is the ratio of the final residual to its initial value, measured in the Euclidean norm. * ITER is the actual number of iterations performed. * RESVEC describes the convergence history of the method, so that `RESVEC (i)' contains the Euclidean norms of the residual after the (I-1)-th iteration, `I = 1,2, ..., ITER+1'. Let us consider a trivial problem with a diagonal matrix (we exploit the sparsity of A) n = 10; a = sparse (diag (1:n)); b = rand (N, 1); EXAMPLE 1: Simplest use of `pcr' x = pcr(A, b) EXAMPLE 2: `pcr' with a function which computes `A * X'. function y = apply_a (x) y = [1:10]'.*x; endfunction x = pcr ("apply_a", b) EXAMPLE 3: Preconditioned iteration, with full diagnostics. The preconditioner (quite strange, because even the original matrix A is trivial) is defined as a function function y = apply_m (x) k = floor (length(x)-2); y = x; y(1:k) = x(1:k)./[1:k]'; endfunction [x, flag, relres, iter, resvec] = ... pcr (a, b, [], [], "apply_m") semilogy([1:iter+1], resvec); EXAMPLE 4: Finally, a preconditioner which depends on a parameter K. function y = apply_m (x, varargin) k = varargin{1}; y = x; y(1:k) = x(1:k)./[1:k]'; endfunction [x, flag, relres, iter, resvec] = ... pcr (a, b, [], [], "apply_m"', [], 3) REFERENCES [1] W. Hackbusch, "Iterative Solution of Large Sparse Systems of Equations", section 9.5.4; Springer, 1994 *See also:* *note sparse: doc-sparse, *note pcg: doc-pcg. The speed with which an iterative solver converges to a solution can be accelerated with the use of a pre-conditioning matrix M. In this case the linear equation `M^-1 * X = M^-1 * A \ B' is solved instead. Typical pre-conditioning matrices are partial factorizations of the original matrix. -- Loadable Function: [L, U, P, Q] = luinc (A, '0') -- Loadable Function: [L, U, P, Q] = luinc (A, DROPTOL) -- Loadable Function: [L, U, P, Q] = luinc (A, OPTS) Produce the incomplete LU factorization of the sparse matrix A. Two types of incomplete factorization are possible, and the type is determined by the second argument to "luinc". Called with a second argument of '0', the zero-level incomplete LU factorization is produced. This creates a factorization of A where the position of the non-zero arguments correspond to the same positions as in the matrix A. Alternatively, the fill-in of the incomplete LU factorization can be controlled through the variable DROPTOL or the structure OPTS. The UMFPACK multifrontal factorization code by Tim A. Davis is used for the incomplete LU factorization, (availability `http://www.cise.ufl.edu/research/sparse/umfpack/') DROPTOL determines the values below which the values in the LU factorization are dropped and replaced by zero. It must be a positive scalar, and any values in the factorization whose absolute value are less than this value are dropped, expect if leaving them increase the sparsity of the matrix. Setting DROPTOL to zero results in a complete LU factorization which is the default. OPTS is a structure containing one or more of the fields `droptol' The drop tolerance as above. If OPTS only contains `droptol' then this is equivalent to using the variable DROPTOL. `milu' A logical variable flagging whether to use the modified incomplete LU factorization. In the case that `milu' is true, the dropped values are subtracted from the diagonal of the matrix U of the factorization. The default is `false'. `udiag' A logical variable that flags whether zero elements on the diagonal of U should be replaced with DROPTOL to attempt to avoid singular factors. The default is `false'. `thresh' Defines the pivot threshold in the interval [0,1]. Values outside that range are ignored. All other fields in OPTS are ignored. The outputs from "luinc" are the same as for "lu". Given the string argument 'vector', "luinc" returns the values of P Q as vector values. *See also:* *note sparse: doc-sparse, *note lu: doc-lu.  File: octave.info, Node: Real Life Example, Prev: Iterative Techniques, Up: Sparse Matrices 21.4 Real Life Example of the use of Sparse Matrices ==================================================== A common application for sparse matrices is in the solution of Finite Element Models. Finite element models allow numerical solution of partial differential equations that do not have closed form solutions, typically because of the complex shape of the domain. In order to motivate this application, we consider the boundary value Laplace equation. This system can model scalar potential fields, such as heat or electrical potential. Given a medium Omega with boundary dOmega . At all points on the dOmega the boundary conditions are known, and we wish to calculate the potential in Omega . Boundary conditions may specify the potential (Dirichlet boundary condition), its normal derivative across the boundary (Neumann boundary condition), or a weighted sum of the potential and its derivative (Cauchy boundary condition). In a thermal model, we want to calculate the temperature in Omega and know the boundary temperature (Dirichlet condition) or heat flux (from which we can calculate the Neumann condition by dividing by the thermal conductivity at the boundary). Similarly, in an electrical model, we want to calculate the voltage in Omega and know the boundary voltage (Dirichlet) or current (Neumann condition after diving by the electrical conductivity). In an electrical model, it is common for much of the boundary to be electrically isolated; this is a Neumann boundary condition with the current equal to zero. The simplest finite element models will divide Omega into simplexes (triangles in 2D, pyramids in 3D). The following example creates a simple rectangular 2D electrically conductive medium with 10 V and 20 V imposed on opposite sides (Dirichlet boundary conditions). All other edges are electrically isolated. node_y= [1;1.2;1.5;1.8;2]*ones(1,11); node_x= ones(5,1)*[1,1.05,1.1,1.2, ... 1.3,1.5,1.7,1.8,1.9,1.95,2]; nodes= [node_x(:), node_y(:)]; [h,w]= size(node_x); elems= []; for idx= 1:w-1 widx= (idx-1)*h; elems= [elems; ... widx+[(1:h-1);(2:h);h+(1:h-1)]'; ... widx+[(2:h);h+(2:h);h+(1:h-1)]' ]; endfor E= size(elems,1); # No. of simplices N= size(nodes,1); # No. of vertices D= size(elems,2); # dimensions+1 This creates a N-by-2 matrix `nodes' and a E-by-3 matrix `elems' with values, which define finite element triangles: nodes(1:7,:)' 1.00 1.00 1.00 1.00 1.00 1.05 1.05 ... 1.00 1.20 1.50 1.80 2.00 1.00 1.20 ... elems(1:7,:)' 1 2 3 4 2 3 4 ... 2 3 4 5 7 8 9 ... 6 7 8 9 6 7 8 ... Using a first order FEM, we approximate the electrical conductivity distribution in Omega as constant on each simplex (represented by the vector `conductivity'). Based on the finite element geometry, we first calculate a system (or stiffness) matrix for each simplex (represented as 3-by-3 elements on the diagonal of the element-wise system matrix `SE'. Based on `SE' and a N-by-DE connectivity matrix `C', representing the connections between simplices and vertices, the global connectivity matrix `S' is calculated. # Element conductivity conductivity= [1*ones(1,16), ... 2*ones(1,48), 1*ones(1,16)]; # Connectivity matrix C = sparse ((1:D*E), reshape (elems', ... D*E, 1), 1, D*E, N); # Calculate system matrix Siidx = floor ([0:D*E-1]'/D) * D * ... ones(1,D) + ones(D*E,1)*(1:D) ; Sjidx = [1:D*E]'*ones(1,D); Sdata = zeros(D*E,D); dfact = factorial(D-1); for j=1:E a = inv([ones(D,1), ... nodes(elems(j,:), :)]); const = conductivity(j) * 2 / ... dfact / abs(det(a)); Sdata(D*(j-1)+(1:D),:) = const * ... a(2:D,:)' * a(2:D,:); endfor # Element-wise system matrix SE= sparse(Siidx,Sjidx,Sdata); # Global system matrix S= C'* SE *C; The system matrix acts like the conductivity `S' in Ohm's law `S * V = I'. Based on the Dirichlet and Neumann boundary conditions, we are able to solve for the voltages at each vertex `V'. # Dirichlet boundary conditions D_nodes=[1:5, 51:55]; D_value=[10*ones(1,5), 20*ones(1,5)]; V= zeros(N,1); V(D_nodes) = D_value; idx = 1:N; # vertices without Dirichlet # boundary condns idx(D_nodes) = []; # Neumann boundary conditions. Note that # N_value must be normalized by the # boundary length and element conductivity N_nodes=[]; N_value=[]; Q = zeros(N,1); Q(N_nodes) = N_value; V(idx) = S(idx,idx) \ ( Q(idx) - ... S(idx,D_nodes) * V(D_nodes)); Finally, in order to display the solution, we show each solved voltage value in the z-axis for each simplex vertex. elemx = elems(:,[1,2,3,1])'; xelems = reshape (nodes(elemx, 1), 4, E); yelems = reshape (nodes(elemx, 2), 4, E); velems = reshape (V(elemx), 4, E); plot3 (xelems,yelems,velems,'k'); print ('grid.eps');  File: octave.info, Node: Numerical Integration, Next: Differential Equations, Prev: Sparse Matrices, Up: Top 22 Numerical Integration ************************ Octave comes with several built-in functions for computing the integral of a function numerically. These functions all solve 1-dimensional integration problems. * Menu: * Functions of One Variable:: * Functions of Multiple Variables:: * Orthogonal Collocation::  File: octave.info, Node: Functions of One Variable, Next: Functions of Multiple Variables, Up: Numerical Integration 22.1 Functions of One Variable ============================== Octave supports three different algorithms for computing the integral of a function f over the interval from a to b. These are `quad' Numerical integration based on Gaussian quadrature. `quadl' Numerical integration using an adaptive Lobatto rule. `quadgk' Numerical integration using an adaptive Gauss-Konrod rule. `quadv' Numerical integration using an adaptive vectorized Simpson's rule. `trapz' Numerical integration using the trapezoidal method. Besides these functions Octave also allows you to perform cumulative numerical integration using the trapezoidal method through the `cumtrapz' function. -- Loadable Function: [V, IER, NFUN, ERR] = quad (F, A, B, TOL, SING) Integrate a nonlinear function of one variable using Quadpack. The first argument is the name of the function, the function handle or the inline function to call to compute the value of the integrand. It must have the form y = f (x) where Y and X are scalars. The second and third arguments are limits of integration. Either or both may be infinite. The optional argument TOL is a vector that specifies the desired accuracy of the result. The first element of the vector is the desired absolute tolerance, and the second element is the desired relative tolerance. To choose a relative test only, set the absolute tolerance to zero. To choose an absolute test only, set the relative tolerance to zero. The optional argument SING is a vector of values at which the integrand is known to be singular. The result of the integration is returned in V and IER contains an integer error code (0 indicates a successful integration). The value of NFUN indicates how many function evaluations were required, and ERR contains an estimate of the error in the solution. You can use the function `quad_options' to set optional parameters for `quad'. It should be noted that since `quad' is written in Fortran it cannot be called recursively. -- Loadable Function: quad_options (OPT, VAL) When called with two arguments, this function allows you set options parameters for the function `quad'. Given one argument, `quad_options' returns the value of the corresponding option. If no arguments are supplied, the names of all the available options and their current values are displayed. Options include `"absolute tolerance"' Absolute tolerance; may be zero for pure relative error test. `"relative tolerance"' Nonnegative relative tolerance. If the absolute tolerance is zero, the relative tolerance must be greater than or equal to `max (50*eps, 0.5e-28)'. `"single precision absolute tolerance"' Absolute tolerance for single precision; may be zero for pure relative error test. `"single precision relative tolerance"' Nonnegative relative tolerance for single precision. If the absolute tolerance is zero, the relative tolerance must be greater than or equal to `max (50*eps, 0.5e-28)'. Here is an example of using `quad' to integrate the function F(X) = X * sin (1/X) * sqrt (abs (1 - X)) from X = 0 to X = 3. This is a fairly difficult integration (plot the function over the range of integration to see why). The first step is to define the function: function y = f (x) y = x .* sin (1 ./ x) .* sqrt (abs (1 - x)); endfunction Note the use of the `dot' forms of the operators. This is not necessary for the call to `quad', but it makes it much easier to generate a set of points for plotting (because it makes it possible to call the function with a vector argument to produce a vector result). Then we simply call quad: [v, ier, nfun, err] = quad ("f", 0, 3) => 1.9819 => 1 => 5061 => 1.1522e-07 Although `quad' returns a nonzero value for IER, the result is reasonably accurate (to see why, examine what happens to the result if you move the lower bound to 0.1, then 0.01, then 0.001, etc.). -- Function File: Q = quadl (F, A, B) -- Function File: Q = quadl (F, A, B, TOL) -- Function File: Q = quadl (F, A, B, TOL, TRACE) -- Function File: Q = quadl (F, A, B, TOL, TRACE, P1, P2, ...) Numerically evaluate integral using adaptive Lobatto rule. `quadl (F, A, B)' approximates the integral of `F(X)' to machine precision. F is either a function handle, inline function or string containing the name of the function to evaluate. The function F must return a vector of output values if given a vector of input values. If defined, TOL defines the relative tolerance to which to which to integrate `F(X)'. While if TRACE is defined, displays the left end point of the current interval, the interval length, and the partial integral. Additional arguments P1, etc., are passed directly to F. To use default values for TOL and TRACE, one may pass empty matrices. Reference: W. Gander and W. Gautschi, 'Adaptive Quadrature - Revisited', BIT Vol. 40, No. 1, March 2000, pp. 84-101. `http://www.inf.ethz.ch/personal/gander/' -- Function File: quadgk (F, A, B, ABSTOL, TRACE) -- Function File: quadgk (F, A, B, PROP, VAL, ...) -- Function File: [Q, ERR] = quadgk (...) Numerically evaluate integral using adaptive Gauss-Konrod quadrature. The formulation is based on a proposal by L.F. Shampine, `"Vectorized adaptive quadrature in MATLAB", Journal of Computational and Applied Mathematics, pp131-140, Vol 211, Issue 2, Feb 2008' where all function evaluations at an iteration are calculated with a single call to F. Therefore the function F must be of the form `F (X)' and accept vector values of X and return a vector of the same length representing the function evaluations at the given values of X. The function F can be defined in terms of a function handle, inline function or string. The bounds of the quadrature `[A, B]' can be finite or infinite and contain weak end singularities. Variable transformation will be used to treat infinite intervals and weaken the singularities. For example quadgk(@(x) 1 ./ (sqrt (x) .* (x + 1)), 0, Inf) Note that the formulation of the integrand uses the element-by-element operator `./' and all user functions to `quadgk' should do the same. The absolute tolerance can be passed as a fourth argument in a manner compatible with `quadv'. Equally the user can request that information on the convergence can be printed is the fifth argument is logically true. Alternatively, certain properties of `quadgk' can be passed as pairs `PROP, VAL'. Valid properties are `AbsTol' Defines the absolute error tolerance for the quadrature. The default absolute tolerance is 1e-10. `RelTol' Defines the relative error tolerance for the quadrature. The default relative tolerance is 1e-5. `MaxIntervalCount' `quadgk' initially subdivides the interval on which to perform the quadrature into 10 intervals. Sub-intervals that have an unacceptable error are sub-divided and re-evaluated. If the number of sub-intervals exceeds at any point 650 sub-intervals then a poor convergence is signaled and the current estimate of the integral is returned. The property 'MaxIntervalCount' can be used to alter the number of sub-intervals that can exist before exiting. `WayPoints' If there exists discontinuities in the first derivative of the function to integrate, then these can be flagged with the `"WayPoints"' property. This forces the ends of a sub-interval to fall on the breakpoints of the function and can result in significantly improved estimated of the error in the integral, faster computation or both. For example, quadgk (@(x) abs (1 - x .^ 2), 0, 2, 'Waypoints', 1) signals the breakpoint in the integrand at `X = 1'. `Trace' If logically true, then `quadgk' prints information on the convergence of the quadrature at each iteration. If any of A, B or WAYPOINTS is complex, then the quadrature is treated as a contour integral along a piecewise continuous path defined by the above. In this case the integral is assumed to have no edge singularities. For example quadgk (@(z) log (z), 1+1i, 1+1i, "WayPoints", [1-1i, -1,-1i, -1+1i]) integrates `log (z)' along the square defined by `[1+1i, 1-1i, -1-1i, -1+1i]' If two output arguments are requested, then ERR returns the approximate bounds on the error in the integral `abs (Q - I)', where I is the exact value of the integral. *See also:* *note triplequad: doc-triplequad, *note dblquad: doc-dblquad, *note quad: doc-quad, *note quadl: doc-quadl, *note quadv: doc-quadv, *note trapz: doc-trapz. -- Function File: Q = quadv (F, A, B) -- Function File: Q = quadl (F, A, B, TOL) -- Function File: Q = quadl (F, A, B, TOL, TRACE) -- Function File: Q = quadl (F, A, B, TOL, TRACE, P1, P2, ...) -- Function File: [Q, FCNT] = quadl (...) Numerically evaluate integral using adaptive Simpson's rule. `quadv (F, A, B)' approximates the integral of `F(X)' to the default absolute tolerance of `1e-6'. F is either a function handle, inline function or string containing the name of the function to evaluate. The function F must accept a string, and can return a vector representing the approximation to N different sub-functions. If defined, TOL defines the absolute tolerance to which to which to integrate each sub-interval of `F(X)'. While if TRACE is defined, displays the left end point of the current interval, the interval length, and the partial integral. Additional arguments P1, etc., are passed directly to F. To use default values for TOL and TRACE, one may pass empty matrices. *See also:* *note triplequad: doc-triplequad, *note dblquad: doc-dblquad, *note quad: doc-quad, *note quadl: doc-quadl, *note quadgk: doc-quadgk, *note trapz: doc-trapz. -- Function File: Z = trapz (Y) -- Function File: Z = trapz (X, Y) -- Function File: Z = trapz (..., DIM) Numerical integration using trapezoidal method. `trapz (Y)' computes the integral of the Y along the first non-singleton dimension. If the argument X is omitted a equally spaced vector is assumed. `trapz (X, Y)' evaluates the integral with respect to X. *See also:* *note cumtrapz: doc-cumtrapz. -- Function File: Z = cumtrapz (Y) -- Function File: Z = cumtrapz (X, Y) -- Function File: Z = cumtrapz (..., DIM) Cumulative numerical integration using trapezoidal method. `cumtrapz (Y)' computes the cumulative integral of the Y along the first non-singleton dimension. If the argument X is omitted a equally spaced vector is assumed. `cumtrapz (X, Y)' evaluates the cumulative integral with respect to X. *See also:* *note trapz: doc-trapz, *note cumsum: doc-cumsum.  File: octave.info, Node: Orthogonal Collocation, Prev: Functions of Multiple Variables, Up: Numerical Integration 22.2 Orthogonal Collocation =========================== -- Loadable Function: [R, AMAT, BMAT, Q] = colloc (N, "left", "right") Compute derivative and integral weight matrices for orthogonal collocation using the subroutines given in J. Villadsen and M. L. Michelsen, `Solution of Differential Equation Models by Polynomial Approximation'. Here is an example of using `colloc' to generate weight matrices for solving the second order differential equation U' - ALPHA * U" = 0 with the boundary conditions U(0) = 0 and U(1) = 1. First, we can generate the weight matrices for N points (including the endpoints of the interval), and incorporate the boundary conditions in the right hand side (for a specific value of ALPHA). n = 7; alpha = 0.1; [r, a, b] = colloc (n-2, "left", "right"); at = a(2:n-1,2:n-1); bt = b(2:n-1,2:n-1); rhs = alpha * b(2:n-1,n) - a(2:n-1,n); Then the solution at the roots R is u = [ 0; (at - alpha * bt) \ rhs; 1] => [ 0.00; 0.004; 0.01 0.00; 0.12; 0.62; 1.00 ]  File: octave.info, Node: Functions of Multiple Variables, Next: Orthogonal Collocation, Prev: Functions of One Variable, Up: Numerical Integration 22.3 Functions of Multiple Variables ==================================== Octave does not have built-in functions for computing the integral of functions of multiple variables directly. It is however possible to compute the integral of a function of multiple variables using the functions for one-dimensional integrals. To illustrate how the integration can be performed, we will integrate the function f(x, y) = sin(pi*x*y)*sqrt(x*y) for x and y between 0 and 1. The first approach creates a function that integrates f with respect to x, and then integrates that function with respect to y. Since `quad' is written in Fortran it cannot be called recursively. This means that `quad' cannot integrate a function that calls `quad', and hence cannot be used to perform the double integration. It is however possible with `quadl', which is what the following code does. function I = g(y) I = ones(1, length(y)); for i = 1:length(y) f = @(x) sin(pi.*x.*y(i)).*sqrt(x.*y(i)); I(i) = quadl(f, 0, 1); endfor endfunction I = quadl("g", 0, 1) => 0.30022 The above process can be simplified with the `dblquad' and `triplequad' functions for integrals over two and three variables. For example I = dblquad (@(x, y) sin(pi.*x.*y).*sqrt(x.*y), 0, 1, 0, 1) => 0.30022 -- Function File: dblquad (F, XA, XB, YA, YB, TOL, QUADF, ...) Numerically evaluate a double integral. The function over with to integrate is defined by `F', and the interval for the integration is defined by `[XA, XB, YA, YB]'. The function F must accept a vector X and a scalar Y, and return a vector of the same length as X. If defined, TOL defines the absolute tolerance to which to which to integrate each sub-integral. Additional arguments, are passed directly to F. To use the default value for TOL one may pass an empty matrix. *See also:* *note triplequad: doc-triplequad, *note quad: doc-quad, *note quadv: doc-quadv, *note quadl: doc-quadl, *note quadgk: doc-quadgk, *note trapz: doc-trapz. -- Function File: triplequad (F, XA, XB, YA, YB, ZA, ZB, TOL, QUADF, ...) Numerically evaluate a triple integral. The function over which to integrate is defined by `F', and the interval for the integration is defined by `[XA, XB, YA, YB, ZA, ZB]'. The function F must accept a vector X and a scalar Y, and return a vector of the same length as X. If defined, TOL defines the absolute tolerance to which to which to integrate each sub-integral. Additional arguments, are passed directly to F. To use the default value for TOL one may pass an empty matrix. *See also:* *note dblquad: doc-dblquad, *note quad: doc-quad, *note quadv: doc-quadv, *note quadl: doc-quadl, *note quadgk: doc-quadgk, *note trapz: doc-trapz. The above mentioned approach works but is fairly slow, and that problem increases exponentially with the dimensionality the problem. Another possible solution is to use Orthogonal Collocation as described in the previous section. The integral of a function f(x,y) for x and y between 0 and 1 can be approximated using n points by the sum over `i=1:n' and `j=1:n' of `q(i)*q(j)*f(r(i),r(j))', where q and r is as returned by `colloc(n)'. The generalization to more than two variables is straight forward. The following code computes the studied integral using n=7 points. f = @(x,y) sin(pi*x*y').*sqrt(x*y'); n = 7; [t, A, B, q] = colloc(n); I = q'*f(t,t)*q; => 0.30022 It should be noted that the number of points determines the quality of the approximation. If the integration needs to be performed between a and b instead of 0 and 1, a change of variables is needed.  File: octave.info, Node: Differential Equations, Next: Optimization, Prev: Numerical Integration, Up: Top 23 Differential Equations ************************* Octave has built-in functions for solving ordinary differential equations, and differential-algebraic equations. All solvers are based on reliable ODE routines written in Fortran. * Menu: * Ordinary Differential Equations:: * Differential-Algebraic Equations::  File: octave.info, Node: Ordinary Differential Equations, Next: Differential-Algebraic Equations, Up: Differential Equations 23.1 Ordinary Differential Equations ==================================== The function `lsode' can be used to solve ODEs of the form dx -- = f (x, t) dt using Hindmarsh's ODE solver LSODE. -- Loadable Function: [X, ISTATE, MSG] = lsode (FCN, X_0, T, T_CRIT) Solve the set of differential equations dx -- = f(x, t) dt with x(t_0) = x_0 The solution is returned in the matrix X, with each row corresponding to an element of the vector T. The first element of T should be t_0 and should correspond to the initial state of the system X_0, so that the first row of the output is X_0. The first argument, FCN, is a string, inline, or function handle that names the function f to call to compute the vector of right hand sides for the set of equations. The function must have the form XDOT = f (X, T) in which XDOT and X are vectors and T is a scalar. If FCN is a two-element string array or a two-element cell array of strings, inline functions, or function handles, the first element names the function f described above, and the second element names a function to compute the Jacobian of f. The Jacobian function must have the form JAC = j (X, T) in which JAC is the matrix of partial derivatives | df_1 df_1 df_1 | | ---- ---- ... ---- | | dx_1 dx_2 dx_N | | | | df_2 df_2 df_2 | | ---- ---- ... ---- | df_i | dx_1 dx_2 dx_N | jac = ---- = | | dx_j | . . . . | | . . . . | | . . . . | | | | df_N df_N df_N | | ---- ---- ... ---- | | dx_1 dx_2 dx_N | The second and third arguments specify the initial state of the system, x_0, and the initial value of the independent variable t_0. The fourth argument is optional, and may be used to specify a set of times that the ODE solver should not integrate past. It is useful for avoiding difficulties with singularities and points where there is a discontinuity in the derivative. After a successful computation, the value of ISTATE will be 2 (consistent with the Fortran version of LSODE). If the computation is not successful, ISTATE will be something other than 2 and MSG will contain additional information. You can use the function `lsode_options' to set optional parameters for `lsode'. *See also:* *note daspk: doc-daspk, *note dassl: doc-dassl, *note dasrt: doc-dasrt. -- Loadable Function: lsode_options (OPT, VAL) When called with two arguments, this function allows you set options parameters for the function `lsode'. Given one argument, `lsode_options' returns the value of the corresponding option. If no arguments are supplied, the names of all the available options and their current values are displayed. Options include `"absolute tolerance"' Absolute tolerance. May be either vector or scalar. If a vector, it must match the dimension of the state vector. `"relative tolerance"' Relative tolerance parameter. Unlike the absolute tolerance, this parameter may only be a scalar. The local error test applied at each integration step is abs (local error in x(i)) <= ... rtol * abs (y(i)) + atol(i) `"integration method"' A string specifying the method of integration to use to solve the ODE system. Valid values are "adams" "non-stiff" No Jacobian used (even if it is available). "bdf" "stiff" Use stiff backward differentiation formula (BDF) method. If a function to compute the Jacobian is not supplied, `lsode' will compute a finite difference approximation of the Jacobian matrix. `"initial step size"' The step size to be attempted on the first step (default is determined automatically). `"maximum order"' Restrict the maximum order of the solution method. If using the Adams method, this option must be between 1 and 12. Otherwise, it must be between 1 and 5, inclusive. `"maximum step size"' Setting the maximum stepsize will avoid passing over very large regions (default is not specified). `"minimum step size"' The minimum absolute step size allowed (default is 0). `"step limit"' Maximum number of steps allowed (default is 100000). Here is an example of solving a set of three differential equations using `lsode'. Given the function function xdot = f (x, t) xdot = zeros (3,1); xdot(1) = 77.27 * (x(2) - x(1)*x(2) + x(1) \ - 8.375e-06*x(1)^2); xdot(2) = (x(3) - x(1)*x(2) - x(2)) / 77.27; xdot(3) = 0.161*(x(1) - x(3)); endfunction and the initial condition `x0 = [ 4; 1.1; 4 ]', the set of equations can be integrated using the command t = linspace (0, 500, 1000); y = lsode ("f", x0, t); If you try this, you will see that the value of the result changes dramatically between T = 0 and 5, and again around T = 305. A more efficient set of output points might be t = [0, logspace (-1, log10(303), 150), \ logspace (log10(304), log10(500), 150)]; See Alan C. Hindmarsh, `ODEPACK, A Systematized Collection of ODE Solvers', in Scientific Computing, R. S. Stepleman, editor, (1983) for more information about the inner workings of `lsode'.  File: octave.info, Node: Differential-Algebraic Equations, Prev: Ordinary Differential Equations, Up: Differential Equations 23.2 Differential-Algebraic Equations ===================================== The function `daspk' can be used to solve DAEs of the form 0 = f (x-dot, x, t), x(t=0) = x_0, x-dot(t=0) = x-dot_0 where x-dot is the derivative of x. The equation is solved using Petzold's DAE solver DASPK. -- Loadable Function: [X, XDOT, ISTATE, MSG] = daspk (FCN, X_0, XDOT_0, T, T_CRIT) Solve the set of differential-algebraic equations 0 = f (x, xdot, t) with x(t_0) = x_0, xdot(t_0) = xdot_0 The solution is returned in the matrices X and XDOT, with each row in the result matrices corresponding to one of the elements in the vector T. The first element of T should be t_0 and correspond to the initial state of the system X_0 and its derivative XDOT_0, so that the first row of the output X is X_0 and the first row of the output XDOT is XDOT_0. The first argument, FCN, is a string, inline, or function handle that names the function f to call to compute the vector of residuals for the set of equations. It must have the form RES = f (X, XDOT, T) in which X, XDOT, and RES are vectors, and T is a scalar. If FCN is a two-element string array or a two-element cell array of strings, inline functions, or function handles, the first element names the function f described above, and the second element names a function to compute the modified Jacobian df df jac = -- + c ------ dx d xdot The modified Jacobian function must have the form JAC = j (X, XDOT, T, C) The second and third arguments to `daspk' specify the initial condition of the states and their derivatives, and the fourth argument specifies a vector of output times at which the solution is desired, including the time corresponding to the initial condition. The set of initial states and derivatives are not strictly required to be consistent. If they are not consistent, you must use the `daspk_options' function to provide additional information so that `daspk' can compute a consistent starting point. The fifth argument is optional, and may be used to specify a set of times that the DAE solver should not integrate past. It is useful for avoiding difficulties with singularities and points where there is a discontinuity in the derivative. After a successful computation, the value of ISTATE will be greater than zero (consistent with the Fortran version of DASPK). If the computation is not successful, the value of ISTATE will be less than zero and MSG will contain additional information. You can use the function `daspk_options' to set optional parameters for `daspk'. *See also:* *note dassl: doc-dassl. -- Loadable Function: daspk_options (OPT, VAL) When called with two arguments, this function allows you set options parameters for the function `daspk'. Given one argument, `daspk_options' returns the value of the corresponding option. If no arguments are supplied, the names of all the available options and their current values are displayed. Options include `"absolute tolerance"' Absolute tolerance. May be either vector or scalar. If a vector, it must match the dimension of the state vector, and the relative tolerance must also be a vector of the same length. `"relative tolerance"' Relative tolerance. May be either vector or scalar. If a vector, it must match the dimension of the state vector, and the absolute tolerance must also be a vector of the same length. The local error test applied at each integration step is abs (local error in x(i)) <= rtol(i) * abs (Y(i)) + atol(i) `"compute consistent initial condition"' Denoting the differential variables in the state vector by `Y_d' and the algebraic variables by `Y_a', `ddaspk' can solve one of two initialization problems: 1. Given Y_d, calculate Y_a and Y'_d 2. Given Y', calculate Y. In either case, initial values for the given components are input, and initial guesses for the unknown components must also be provided as input. Set this option to 1 to solve the first problem, or 2 to solve the second (the default is 0, so you must provide a set of initial conditions that are consistent). If this option is set to a nonzero value, you must also set the `"algebraic variables"' option to declare which variables in the problem are algebraic. `"use initial condition heuristics"' Set to a nonzero value to use the initial condition heuristics options described below. `"initial condition heuristics"' A vector of the following parameters that can be used to control the initial condition calculation. `MXNIT' Maximum number of Newton iterations (default is 5). `MXNJ' Maximum number of Jacobian evaluations (default is 6). `MXNH' Maximum number of values of the artificial stepsize parameter to be tried if the `"compute consistent initial condition"' option has been set to 1 (default is 5). Note that the maximum total number of Newton iterations allowed is `MXNIT*MXNJ*MXNH' if the `"compute consistent initial condition"' option has been set to 1 and `MXNIT*MXNJ' if it is set to 2. `LSOFF' Set to a nonzero value to disable the linesearch algorithm (default is 0). `STPTOL' Minimum scaled step in linesearch algorithm (default is eps^(2/3)). `EPINIT' Swing factor in the Newton iteration convergence test. The test is applied to the residual vector, premultiplied by the approximate Jacobian. For convergence, the weighted RMS norm of this vector (scaled by the error weights) must be less than `EPINIT*EPCON', where `EPCON' = 0.33 is the analogous test constant used in the time steps. The default is `EPINIT' = 0.01. `"print initial condition info"' Set this option to a nonzero value to display detailed information about the initial condition calculation (default is 0). `"exclude algebraic variables from error test"' Set to a nonzero value to exclude algebraic variables from the error test. You must also set the `"algebraic variables"' option to declare which variables in the problem are algebraic (default is 0). `"algebraic variables"' A vector of the same length as the state vector. A nonzero element indicates that the corresponding element of the state vector is an algebraic variable (i.e., its derivative does not appear explicitly in the equation set. This option is required by the `compute consistent initial condition"' and `"exclude algebraic variables from error test"' options. `"enforce inequality constraints"' Set to one of the following values to enforce the inequality constraints specified by the `"inequality constraint types"' option (default is 0). 1. To have constraint checking only in the initial condition calculation. 2. To enforce constraint checking during the integration. 3. To enforce both options 1 and 2. `"inequality constraint types"' A vector of the same length as the state specifying the type of inequality constraint. Each element of the vector corresponds to an element of the state and should be assigned one of the following codes -2 Less than zero. -1 Less than or equal to zero. 0 Not constrained. 1 Greater than or equal to zero. 2 Greater than zero. This option only has an effect if the `"enforce inequality constraints"' option is nonzero. `"initial step size"' Differential-algebraic problems may occasionally suffer from severe scaling difficulties on the first step. If you know a great deal about the scaling of your problem, you can help to alleviate this problem by specifying an initial stepsize (default is computed automatically). `"maximum order"' Restrict the maximum order of the solution method. This option must be between 1 and 5, inclusive (default is 5). `"maximum step size"' Setting the maximum stepsize will avoid passing over very large regions (default is not specified). Octave also includes DASSL, an earlier version of DASPK, and DASRT, which can be used to solve DAEs with constraints (stopping conditions). -- Loadable Function: [X, XDOT, ISTATE, MSG] = dassl (FCN, X_0, XDOT_0, T, T_CRIT) Solve the set of differential-algebraic equations 0 = f (x, xdot, t) with x(t_0) = x_0, xdot(t_0) = xdot_0 The solution is returned in the matrices X and XDOT, with each row in the result matrices corresponding to one of the elements in the vector T. The first element of T should be t_0 and correspond to the initial state of the system X_0 and its derivative XDOT_0, so that the first row of the output X is X_0 and the first row of the output XDOT is XDOT_0. The first argument, FCN, is a string, inline, or function handle that names the function f to call to compute the vector of residuals for the set of equations. It must have the form RES = f (X, XDOT, T) in which X, XDOT, and RES are vectors, and T is a scalar. If FCN is a two-element string array or a two-element cell array of strings, inline functions, or function handles, the first element names the function f described above, and the second element names a function to compute the modified Jacobian df df jac = -- + c ------ dx d xdot The modified Jacobian function must have the form JAC = j (X, XDOT, T, C) The second and third arguments to `dassl' specify the initial condition of the states and their derivatives, and the fourth argument specifies a vector of output times at which the solution is desired, including the time corresponding to the initial condition. The set of initial states and derivatives are not strictly required to be consistent. In practice, however, DASSL is not very good at determining a consistent set for you, so it is best if you ensure that the initial values result in the function evaluating to zero. The fifth argument is optional, and may be used to specify a set of times that the DAE solver should not integrate past. It is useful for avoiding difficulties with singularities and points where there is a discontinuity in the derivative. After a successful computation, the value of ISTATE will be greater than zero (consistent with the Fortran version of DASSL). If the computation is not successful, the value of ISTATE will be less than zero and MSG will contain additional information. You can use the function `dassl_options' to set optional parameters for `dassl'. *See also:* *note daspk: doc-daspk, *note dasrt: doc-dasrt, *note lsode: doc-lsode. -- Loadable Function: dassl_options (OPT, VAL) When called with two arguments, this function allows you set options parameters for the function `dassl'. Given one argument, `dassl_options' returns the value of the corresponding option. If no arguments are supplied, the names of all the available options and their current values are displayed. Options include `"absolute tolerance"' Absolute tolerance. May be either vector or scalar. If a vector, it must match the dimension of the state vector, and the relative tolerance must also be a vector of the same length. `"relative tolerance"' Relative tolerance. May be either vector or scalar. If a vector, it must match the dimension of the state vector, and the absolute tolerance must also be a vector of the same length. The local error test applied at each integration step is abs (local error in x(i)) <= rtol(i) * abs (Y(i)) + atol(i) `"compute consistent initial condition"' If nonzero, `dassl' will attempt to compute a consistent set of initial conditions. This is generally not reliable, so it is best to provide a consistent set and leave this option set to zero. `"enforce nonnegativity constraints"' If you know that the solutions to your equations will always be nonnegative, it may help to set this parameter to a nonzero value. However, it is probably best to try leaving this option set to zero first, and only setting it to a nonzero value if that doesn't work very well. `"initial step size"' Differential-algebraic problems may occasionally suffer from severe scaling difficulties on the first step. If you know a great deal about the scaling of your problem, you can help to alleviate this problem by specifying an initial stepsize. `"maximum order"' Restrict the maximum order of the solution method. This option must be between 1 and 5, inclusive. `"maximum step size"' Setting the maximum stepsize will avoid passing over very large regions (default is not specified). `"step limit"' Maximum number of integration steps to attempt on a single call to the underlying Fortran code. -- Loadable Function: [X, XDOT, T_OUT, ISTAT, MSG] = dasrt (FCN [, G], X_0, XDOT_0, T [, T_CRIT]) Solve the set of differential-algebraic equations 0 = f (x, xdot, t) with x(t_0) = x_0, xdot(t_0) = xdot_0 with functional stopping criteria (root solving). The solution is returned in the matrices X and XDOT, with each row in the result matrices corresponding to one of the elements in the vector T_OUT. The first element of T should be t_0 and correspond to the initial state of the system X_0 and its derivative XDOT_0, so that the first row of the output X is X_0 and the first row of the output XDOT is XDOT_0. The vector T provides an upper limit on the length of the integration. If the stopping condition is met, the vector T_OUT will be shorter than T, and the final element of T_OUT will be the point at which the stopping condition was met, and may not correspond to any element of the vector T. The first argument, FCN, is a string, inline, or function handle that names the function f to call to compute the vector of residuals for the set of equations. It must have the form RES = f (X, XDOT, T) in which X, XDOT, and RES are vectors, and T is a scalar. If FCN is a two-element string array or a two-element cell array of strings, inline functions, or function handles, the first element names the function f described above, and the second element names a function to compute the modified Jacobian df df jac = -- + c ------ dx d xdot The modified Jacobian function must have the form JAC = j (X, XDOT, T, C) The optional second argument names a function that defines the constraint functions whose roots are desired during the integration. This function must have the form G_OUT = g (X, T) and return a vector of the constraint function values. If the value of any of the constraint functions changes sign, DASRT will attempt to stop the integration at the point of the sign change. If the name of the constraint function is omitted, `dasrt' solves the same problem as `daspk' or `dassl'. Note that because of numerical errors in the constraint functions due to roundoff and integration error, DASRT may return false roots, or return the same root at two or more nearly equal values of T. If such false roots are suspected, the user should consider smaller error tolerances or higher precision in the evaluation of the constraint functions. If a root of some constraint function defines the end of the problem, the input to DASRT should nevertheless allow integration to a point slightly past that root, so that DASRT can locate the root by interpolation. The third and fourth arguments to `dasrt' specify the initial condition of the states and their derivatives, and the fourth argument specifies a vector of output times at which the solution is desired, including the time corresponding to the initial condition. The set of initial states and derivatives are not strictly required to be consistent. In practice, however, DASSL is not very good at determining a consistent set for you, so it is best if you ensure that the initial values result in the function evaluating to zero. The sixth argument is optional, and may be used to specify a set of times that the DAE solver should not integrate past. It is useful for avoiding difficulties with singularities and points where there is a discontinuity in the derivative. After a successful computation, the value of ISTATE will be greater than zero (consistent with the Fortran version of DASSL). If the computation is not successful, the value of ISTATE will be less than zero and MSG will contain additional information. You can use the function `dasrt_options' to set optional parameters for `dasrt'. *See also:* *note daspk: doc-daspk, *note dasrt: doc-dasrt, *note lsode: doc-lsode. -- Loadable Function: dasrt_options (OPT, VAL) When called with two arguments, this function allows you set options parameters for the function `dasrt'. Given one argument, `dasrt_options' returns the value of the corresponding option. If no arguments are supplied, the names of all the available options and their current values are displayed. Options include `"absolute tolerance"' Absolute tolerance. May be either vector or scalar. If a vector, it must match the dimension of the state vector, and the relative tolerance must also be a vector of the same length. `"relative tolerance"' Relative tolerance. May be either vector or scalar. If a vector, it must match the dimension of the state vector, and the absolute tolerance must also be a vector of the same length. The local error test applied at each integration step is abs (local error in x(i)) <= ... rtol(i) * abs (Y(i)) + atol(i) `"initial step size"' Differential-algebraic problems may occasionally suffer from severe scaling difficulties on the first step. If you know a great deal about the scaling of your problem, you can help to alleviate this problem by specifying an initial stepsize. `"maximum order"' Restrict the maximum order of the solution method. This option must be between 1 and 5, inclusive. `"maximum step size"' Setting the maximum stepsize will avoid passing over very large regions. `"step limit"' Maximum number of integration steps to attempt on a single call to the underlying Fortran code. See K. E. Brenan, et al., `Numerical Solution of Initial-Value Problems in Differential-Algebraic Equations', North-Holland (1989) for more information about the implementation of DASSL. qtoctave-0.10.1/qtoctave-info-reader/test/texinfo-1.lzma0000644000175000017500000021334211511434230022113 0ustar lucaslucas]* 'd_>s4Frfs cJ{8iE%Q 1#P7uxki+_ Y PW&rKVt'X6 " 52!2{P&TF n(>-F2.+=yѪ-;ݐb% *IݓǕnea- Lya&1L2;۵ -۱@ . vKkgX+0aoW~)K2{v/3d*A1\^P_mz5)M%.C 1r;,֬m$"Ii}F3C:cpd؆";_?چ2aՎ4ṇ!2@|J|& JEy/ vmZgٿ6&}2W$Yyʏw9e}J: 9;\KxE-"1!XwKhqݱԣ#\etK(zҨ^.Kz,u!4;c%W-OU^]bMTm!ŝ|\M'8 Ӓs6@+D8G2ƽG%D64}Cahom|qF;U޶vꑭﻙi ).p(}WEе#T#R0 {HQ HNAZ a,d=KbGL\ H#"l_x@˳1qeݑ}s3H){gjp%޿>=VK3V)1; Յ:ś%N(- c208W,fJ4-p 1e7=~؀>:o)۵3bЬzxI(ja7h:".Y {Kaѿ1#'/ gBypǜz8QtC_顴a)ZΈnޗʳ"Ef6beXtG4 m꒲4֤݊B ""؟Wk궪L87ʩc=sA/QpVCNdw*%0J F*lD yF}eraz_$.icvcE;|18^'̟A%/MPҗN XLO-`D{ vOGk4Z2qAϲ7hfuܑ 7'ͿUq5&׏i_QԂ`˘#amO;نҫ,U'h.<-r1%/-xn>v):Phk%n_*y~C-i (A2EH:$bt_)pW?7Sq4dJ+N*Q:C4*KK~9+FԪry(ҡU^; f (.&cjdw'RN;aDqv\TǢ6 0v?#z' {!T0rt˴<" [Av>@s,4hH+%D4qKDGlz9HgA&7QIE .YTkY,wIp^j,yQ+ce&fQk1W1 h''8HAbV P fdຓjS*);<"?wa*yvVd1 ,+W&ǁ9'F Wr?xv4ChիQ~[^|טlmEɵf'6gnL`e 0H;ϯSŕsVi{3D \D`r&tT ;_p +g(&NݦM/t+rdu XȹI/+yKvϑmM~NT sZC_SEmu;iZ&l >)/J_Hx{Ɛr-xlOc,74vB!cᩰ{a׊E]yxj 't#JUn٣ UqfƲ<_˙lDm + }5d8 ;8 8A(Eڲ}H]Ue;.~}c̚xEA8l]=|-уVR@i5nb R.,~1L⫺9vOWBh$@3K]+NK%pvn(V<Ѝ! = ͈]y~iUaodgAkR6Î EƲH|f46#V\hQ2rBj£w[z.]3IrwkSWh_fdZEy^xk6mh^"l\Zi؞ܬf-񉉫a܌O%_yko7Hϋ≣r{;s)n|fzKb2kC5z᧻(i73> y+"AFh%og6|P -$i*QR)35|E5(arKqH@P[.2wÐ{osŋy㪁:E,eO! $  v9Q[4TX')VԉUaOD/B|@I6_Nみ0}ԯ,)MgzeX$ec oW-R8cg2@k>vƙ +2Wvd7cGH ٙ 9Ho{$!y@X F-inufX-eSӁDLj`&Π.K//8P Jw*s0?B~,Z;T>x8s.gr@" _2 QI9P YrA~@)%ҷ4qYVrKFtVn`wI˥e $s KNIc IQk71@X11D9in+ 3r-?"<F{bhd*/p؇2^`*V,z;CDjmt,Xt|@|ظaDiW-[C_‘"[U_5<^,Es' qx9iz Aݳ3R dߓ=95~FiOW+pRl"m!IZOӱc?0*u^`wg(YU$[=;I?3HAp[Bk'fڢf=; dCEtHTa/vwHwPE"5u2l,qW7IZn4P-@n˴`WmbDbe)F,I2OԴbf^ H۰nYdתK#1ԍkbpfMf>ZYސ $uLJ8̭^=gJƈ7 EKe˶0t`qCs l*MfwS:v)2$ ]YR!aJ;01L/{$ ]eؿ_KJktgkֳm/⩄kcU ,bw/Ľ/Mp,W5DZiF%c{IK"րk _pp"U&?@^BӍ-+VOwSp gX/J)E}dbuz60P"tr0181y<rbw#Lj}FdxaPఓiwһN|϶BTh@x; \9D|Wy ".Qy?Qۛ\7:b`#YҟRܒۢq %c<=pfI*#"; ʹߜCȸ;{HcJZ\W ,e5dfZ.i- < L%l:qSAjG>Jt-D!/[0cZ2" Q+15KZ).{ K;L!twL1@oH !OWU΄0ND4xðo<oq2`zW=jCn *9.:-gς[x̦}dYW'բ,76݌!n+,} ]f[fæ'i⨤<XZfoe9b& &Op iDd$>bͥf"Iɽ/=וO0J.\ o'45L!*<bm1k;4sifBGңQtݯ2f8KƁnMx^kn-z' c7_ PVk?P@XOr6Tb %7ԱM0i,$\`zpJ58 dEsSZdb)6lJif^|,$`c˂r{ .-|9~A|ʑ?i&{~JL!8`aM!r]E,Yc㪩hU9iRR!kj\,~|UMk<+zrKlcINg{qm_(707y,B*X[2]х C6_[ܣpCAW8銝m]`W裭l=KGYC5w698c i-t)rDH&kX_Vm:q#arauɋL-/=Qjsl. nku]`gAbHhfϔ V(Phvi9*^1-?^XՒIMf().@'A>}KP ]_P34$jNhgM+»d"oc/kv[T|v8vη3 .vsc~\[&٨2~̰ظVrgiMy<]pGT+>H!^ϩz&k%@RY3;kϴttD6zϠ64*{kJ|DEr T1*'BADfF7  E٬~=\ 5 qU/KտS#VȈ"߷D퀉[KT[ fRCrZ-e tv=Vf{n F:e~ސL#58L[WkqN0ݚS(a:Fdw穅R,Ll9J2 ȫ@{t=5gQPK4^g!sZ3Pubξ13Pi2i+Nɺ4A֛de@ً?Rx9r{WdQ!(EeK6V$"r3u2XG :_ײ dklxӣkH:Vv2 w i(ևy`kequ@vS ads|We?-W3’&=n?kspdҀ;푽u'O5= ܟgDĪ n]EJᝦy"OZ֦% H41M>+'BG1B@B 4)4d:&5j!b  Y8h㑖)A7EXo?7ޕ6UL}}>1+|暯@NE:&_*:yohވBDgu(µM\hkqL:L~!Wp8ϘnFr|-g' ] k!Eܾ̜%iU<%թo@$LcAl7Gl3l lX6.A5Y> 啻ENQcG GڲnyVKP|S55fw+%TYhCR|L{bБPu-^fp#y9=EDoZQw HbU:7cȆ*e %u`_:Q+rr*o,!,#ϫjՍ XǸ7O;/UNci i$l- eҹ2:+ >EC <Mvt1Hqx>X[CQ1myqN:.fc*~^A>%oȓZeNb@uR-)!6{b_DFxc}CEQ^@|1;Jܧ>`Qw ZVVQϙ ޴qT5(I gBvǙ_bcq~(zV.|'B@;) Zh*(]|!\tNɬ9BH{)R7IU[b_'zxɁl96q[~ipb.+V| c=&on?#F xQZ@Љqu2y/g)PtbjmǧR[!I7ؚZԎQuE݀"ڍcBs̛*~?oCD@3D̑ Jh1:fs 32$Puy;h @IjMZZʄs-z@=Gsz=xKz:ntL03dVn>/8_Dk.3/V`T7={vYp0VjdAlٟȨEuvyB{^ B 6m~T y nfQuBTQ};GG9 TnDx_SSԃPlTxq$=PjNI)=bNGl~Ͱ)E0V,w \ \ Z+,._}?-"U댿:z2:H֝IbKb0uѢisW;mJLiA6x^şºfR"k$)h(X)fmbX/hufӵh^z% OYE\'5n:EɫNyɗ טx4NaTTu@4L1+FS@V?C`'"ux;"qճ5 ?b,gq# 538}tiZp w bIJ`JB(V>U:i-U냹bn LCR熭ݽ 'Y?b=MVov뵊߲6@Ex-:ðq1+#c}'{X#rhkh |.~78Gwݶj(A}5&#bGx{y{pYgp[rLc5@d6I3$A%%1)^rdG 1TF"Lԇc.n@aQne2ܸN4iDC j ȱtҾ.Wd%6z#s=_#msr(4#no̟z&q# 6LC(`r@˘e{$ȹP-{{M!/.,@|)8WlVM tU<0k!%~*.R426`^R%;/;1eWA˗H>ϵ$8oS%p:)%\-#ϙQ?Q"8B'=S]ԈVqOph xB !ZfàDfj)ϡ̋e()F?iWLP,xd\f0Vy@ vB]/#[zmC$!-Ӧa~+M਴$δgz=j:& *oE_r?qrV;\61!]~I*kKߴ6Xb3m6W]Os j#<A\;6%4zuDbh(m-", xlj_:HU9g~ϑ9"K*H]5ɧvײY#,1P~\\\YYEIډ$+rOz+~erhݟact,+ljo^lszz0=%o0b<#8EVmr7Wٻ?ߓH9I OhFt' YO/XRe܁s6Kbubg87ݪTHrsK~CSiXPYa{Z 駧mlTnaQGs" |9 2:I|[M(/@Z:96>ja.EWƠ[S'օԌJ_K"Z%jpӼ<`xr^y-"(M#[ªz- waZp .Wƾ{s>pyV]hZ5勈y1-L1fWY' zvw=A‹e)h-r$ n%KgȷM];,Z_^"!S U~J8ѿhbgPӱ0%3}mX,#U0Gq:3^y#?R; M$vMzb#s;dDQ4T~͛rz (TQģc1*q5Q C8Yo.2 JvsQ*Kɽ:;MZ}lQ麋r9ެW2 ;UEKTPer]2k=ے @uahG+M@يAKE!8WVu5*).nw߂t)G2.ugg֐ hru cbGu97 \@Ko ᪹7 #&W O8Fza=H6=F޺{e Bc|xHN+{MB!VrF. s2zRVt |#wuj S8'X^ c.]!H09 7:aMXHJq5"ҐSj^>123Me#].gAJ1cagЅ=_4eH]N,h^΍q[ˆ/hsX7^*U) rrw6'9 c.iާ kŃ? Մ)<Wo=ǏM"j4j? 5L# L+hZN '{=Wc_^fUSBPg&F"c-)L__Yq{ @#Yڬ :ovx`n #a^UY@h ~^;zaWmy Mۚ#̺@c{:\kT/ء57a 0Z-75ID9\0*$JL*[=vBa8D VILKUu:DS<=/!&YTھT䞿Ut,L%"|VZ ,$UBmTyeX t'}~@ #%b΅M]mSԟ"M[CF¾%V0kM+,QhSG2mŝÖ֘i DoP[6;hfm@4{NP{d!HoL}Mur9B_6)pyKl }~K>@Ȁs~ݒ>-4[59\,OA/_W%s) b+&5&FŨoQV#L8$uR6O hBLuR>7C?4o.ʄFh/pMP#uTVk_k JK;#& =/6sxE:ϙ÷>2Ӧ9Mzyu= _ցxQ`.kbݫN/ĎFto¸h5ή1A A 0&']Xw;v&3-0 %I;,sdN$KzN[Jj? LI&>ؗsRMsBFDidjzCJ`WsqCX&E(9-p'6qn)FY_6Bp?л}^1%#ð²B>9(RdxDz~A8xIuT$mh´,- "Mѩ+Q*1);穱Ȯ9!yo}yx|FPCRѳl[p!Qpy1Ƶ;|wZ=$3&qEYMZ~=C~gu}ә }s阳u òmvUܡ:)K%BIoȳo14c+Wĭg#>zQ+gv-C ;\VY{kiu!C1O7M[DXåNϴ]Hi-JvxD=1v6Zw^H9zޢCvgqv$P)9Z@]yZBKȗ)IvA02^& |r?:zwh ', A+.Ŧ[XLgS+1Y͗u|5Ev!K$q&enm9Zs7h{+DXHHvJ\j?/AfŸ &yc2u~y}B8)"dBwv6U^DF&CF*H")o0k;O0ej`\+pؚt=hcGQ?X2.]'495vp2 çA>l0U⢿'szWT(};C o^ԪZGUGҧ7,ipj& qޑ Jrz`.+d]τDZ7 >r'qj4'>>87RGzVGgb㨶?'SƓvЈ\t@7*u*7Gc,.`Nsx7 iW$;O1'e J\ג;,GrwD,dӚGN噋$éB"8?0DӬYr$m]%wz쾇ީ'Fل*5T8h,r;pS+*J@=3hsgn8bC ꉏp7ZUh^V(Aɸ!VJ?lF~*!]цUA>יyKfuMf68C`.Rn?F=`zmRsԗ\&t9Lr rO2&3_}y= |FE5@TZ3| 3֭Drz^ 9X>9~pb%$;Q7Ru`jPPa}jݯTڞIR7AD\uo$&l6؏P+,medV98hYC>b㽮1*rr+A?~N-rݺ; TGFjJWVDmEr=GR7KwsZZV;,9 CeJi&ZTȽ2ƙ[ɾ-كP9֌A҃mkM }fdPU><]ߛyJj|BX>u̴H\lg9wQ_聶ػ~1L'y](@N,S''PR3@ 苁N pB (Zo)Y)qE| 4,'Rj ڻBIXP.o sm% 6;‘ ?c r`\88K Oshڂ0.TbԡCr(Q\5PbӭI hyᄏstKq3?=Ujz&Y4Hg2scSBju*.ʷěUƃ3X*dyBՇiH!CdDž%!zQ+sbc/brňò3SN}`̬Ȝifs׾xP)WbV~b\6!Ti;9luW7|Q*MB$1 "Ŀ=J稙/AŗL%K-DJe01QzM=׋O2VT 'v& 1uQq5RE"qL2=$j}0lsz&_܈At@ n%T8igh+~UueYB WM2O 3۩ZThxb|vL;ԯ#7.TybzeLFX4Ȓa|" >{^#Sp nLB#3h$>#hgH/e"&ô~K@+&#߮&1XxȣԈhw0J *l^0UK0p1~m>Zʬ"jF"l?} i|cbL!IН;yM?8osn8}&@US7o_ hi''_`=P5H_Zن.jYR݆:zˇcCJ${؟lsX4 XTO$Kdf s_Cn̢+^ě/TX΁R+;gN!Z}(2Jk,n]rEMq~)mB JҢT^p(~J_ Xu*|AR 8C =mٳMyfȺ?mr]y0=}8vl@;jo9$XG9( ۯpГuphu'%-<݁<+;33-dfdhc srܣ@z4w;(^WȅT"y$:U7_KdZ]u/ D!̀:K zD%KuY_19^Oͺܔ'KK=@&Ua:"PהcCۺc⹝Z;Y2CYȀq !;!6X も- 12]ΰ&,V]2 㑂|gC;1Ar|r2.G7ms,$NJ/6 9Rs7k8MN67ބbʀ4729"aTĩ\ sq S(G[뉳!I>*6p>cKC̞Ln`oL'Fšh`'El;s ʊNMLzi/9lY$`l1+SΙߑgDnRM:^ q0t9pwMk';ܸRtIce[ T&{hD"kز."okjvAT{ :woadqQۉۺ+ e˴ǢhYYⒻus^]r-}1=~+C(zY= {NpFu5] :[F S7HhuSxM-! V0^7?ǐ::%y_t~=Gȥĩ'e$j%.YhD#72NW'Ƅ]BEXck65fq1pRa> L]5[@е3/U%4DYpz.:IuAd ɪ $zWlN>+^߇XmBUegC7{Wg8~gh6ȗNcx^x58]j/lu +/1qԦZLW]SoX{E@Sm^U.KiHabO:å샪a*O'[1A"Wqm?_\jN a)rB1/wi--OopbMer GZ8AN61q 󓤧fɈ6DpYT[(ްO9E*hh߹ԓrnTtX/@& xbhHD=O].5$e)Km/|c[6 $hCNm3?yr(ff[o: 2Prlmյ; @U!>u@X0bidz!Šװ=CGͤ &ӓ##kqg橹C@DhԺ,10$W7}H@*M{"~n_3}+LT;E3)$?i .! RbYߒ3h3n5kUY>'ۃiNeozr&~UiwN?\:suX\jqE|ےaHBF1NA gGB(l0PG1(ۨu.B!J.1l 59"DŽwԞѳGpj[CXsG8xm4-Y T 4' @m%ڨ4Yy[Ag}XI+4ACyzuVݔڲ惇:EhIn0st𵐝bO~ٸ5҆`2[i,WSNŴw*e >C ߁j:kjm>,.^O'SZBQITHEE@r Nt? <-Ru3Ib K;79<7[]T\PH7B)zX.đӻdBK-EiQLp.FPxg?&#n~0UWEM ~]1bS}pTȋ,t%or#k̡q*l\Ej`_>ϴ m52Dt>g_dޱ0?nwPTaI>'uҧ!%1(,ɳ۹p=V<'y.,@mw6һ3̑āq!^;ٸ:dˑ;b\; cӗAu%8jg͜qfPf0r $"#ɏGIGsk5CzK擵)~R1 @!B*岄 PC7-D WSZJnW1+ S2~lEv5/ FV;u! emJvJR/#+ʐƊRV_p{1JQ|7aοHDda@NPԢ Z|V?횬Wsr~!I[Ւ?={wa7uvɮR P;YEYO HN 3պTbS|ڮg:]B(yNgV0- S*J4GnO>',;ȾdHalݮ|$J^h0u5WiH֚VY%X0$BGBtfZ6U7'w iIYQ!ʮK{vmVrk 2>]Ƿv_}ջ*v vD =YRР8z-ͦ]ek6T$Y|,fQ Sg54"ѐH,':<IK^I2"2|0ޤ&UqwPU,L;] w5 8]tD =n^97ܚ9RI`|6P)1QAd -h_qF٭^|O[ gEmtA8]b%SJ>޽f5ՎxyVa+58w15D_pIb=+ؐoPt:ւhy\45 AZOʿe8A"S iAъX-3I@ ,2֡OۛL.SB?7N@57XFEkC9@UEr@L v`wl >U%,H{GU\>dFP`[\ $ݵbC7nEUs;db&b GRD!5(C4(oW-<2\ۀ tUxՇp0q !6'bMbV;jO0&a *ڬ8Wyv9[ qW, AG_ռ$i6&[_1:=Ũ&FlU5\~͞}c,j2DM+ (ckzbO}wꄼnE_lSm3â@ɓٜv.k9M\CE3NT Eg.ᐂ@%#wR-<١6 e炟\)|k^4_=/-Demm.EGn0JJj2vTZ!,̻"eih˳J "gq>TA Ã* Ӆf\.WFF-,cbLF&P=GoMq8Ϊx:ٰs_VXBM=9֎!I4€vV6o1sSoy:Zݛ]hkak Z+;Ž7': {fr1ka.#9M6IWE^.k~mgizȊ:lcUD׹tR4N$h~HQfzsjЙ}JK.2>YJQ.U+> O݅U]= T=5|Ɋ_mv+sI15&f]C<}\71 ^81X-zv4/g*r5&,# K ʋ6M[.fMJMrIhK}JAEe&m1z[HMH !*{o4 VUE٨~1 Ff)oS@EQ,9PA(NR7>ea?nLpzNy`z^4=&."SLԙyi`2M?aģGڵ:+aYIpK73llMe7 xPـUeRlȴį=_ gz`HղhnXou&2 $CGU(z ߊ!%Gޅpy nxg:-eʢSqThFUeFR/4)1ВS}MQ}fT?VS=j9g*Kp#L=YvnX$Lr[sO'n}(:yj 1~qPЪ]7 F [8ͤRS$|XBӋvGJL] oV2ŃT NNU׿_6Ze~~{y\N=NOȨcqb-͹M(g>x`;Phq v7Ò ԼG)NbO\dL>e: D+QWQS0?+wˆg2lÉQt:ͯsSan _Oqc4Z4MCm*C5-X(G P㼅R?CtämbOY3 Oa'w>8,b7#4p=d9 Zk3w㫞GK.E9g.lRtʁwxDWF:پB{]{jpʱX~KUהz!vtcCXhs+?Q=@o?XuˮXvCtTةĖڀs7Ӵu%̡QՑsb@''M"k53&J`v] Pg\jͼnEVi3/=&YRTCAAGIxe0|SԤ\Dp;fȸqC=9h!?\k2kwJS511wcMp=2@ ߶%_{nص}VR;x*]zg~[05dD^g{8^~@ƨ+Lp^õQ8y*n$ .3YMCD=YڙۢMS5>q~>{t@'Фm`^/-(5!#f -R_֍}-pHGN3i8m 9; 糶@a>yux5.M؈VãĨ5xd!Q>tW7#Y@(HBG W j.z9F[tОbCN-/*d=0:Z hj[a^?] ]U/cF$j~ ϭq "u)A m+j;#a3DIm4.o_H*_-U]:_[Q׋%nk~]mx xމ1'x0&ڳe3%̞,bWf;̉^-}pLVf$4r~=WқXx\aTWg[PŔzS!J3HГ? ̋t&huqiUoƥ;()Ͼ /kkR{ Rci(s5'd; pEP rft̉PH<{E ץVHef &g; 1D%c8ڢE6V rE"HD%Gӊ4$[W;+C[ĺ|R!;]Grg]iC{#|[j7ðqQjS$L`66EI]|blSXH4$Kmn7=0 ZmvJc<O0&qo"rs:sGTTjh0EPʂ7UI<ʜ?:eǽ0֜3y\P2SY0ϛx/ȏL+;GvN}CM"9oRE4Ț8.GYcSw%= A o ve&f6p-MNPԎL[W%ٔX tfs5&R04)YD ax`ŞCeF-y} BR4-flXE9EԺOg'<'G#<<6޷`XpWv!v¥•eGL`aֆS(NςxbwooY3#0$==iC!T•yʠP|Xކ^w53UBŔ{P%ٙEzZtITZ*v;$_<>nB9J38bꐜ%Up&ɋ]G b𦉨yQB(Z1| uKos/G݆$Y4 crM{(MXRO#aцe%| o\M/ Z4&SbF## I.W"bJ7?ԫ쟜,)%g}!ΐ>}_:iP@GFjsV& ibFtP0ʸ kw貘gZ $ 5NȂd[Gݺ*Կ((YPgjy,A|{w }Z`4:Ae vٺZPBӱ.'ԉ{-ϟ;9y T>!2 ⳁ\f{ l/C*~VKO LU'j F{ZhJΘՈT4,:Rbާvit_px?ż]enAl:orpr"L2F𗠤Mz {./݌yN POlW-u% P3:.vrAF~ %mzR~n YI+?9>#ёq3#5.>5pz jX̯ə^ c&Cͅh hùͻ l{'ŗ%usN;TFd"Y*7E~;-DdKVWkK7`X{ g^M!1\n=o׻q=Ɠ$/ W+HV, CR3OHgzfȄXM_:>onTGg=<;YP9TB }U* P-bGO/71!R<(f6`5{zY4):[~DtEs#`<'; \ϸS59S-P@yS1{I>@~ؼ8j|LZh6e1i4~ǃ{ !(5&#rDI sÂ|nxʥ,~J)CByO xz(zN7]C_'4 y";8-a1 6,ͪJ+^Vp jNB[M E-E'% :7p:q>"-*AJKb0 H<8 =AAESXQ~scӒ@L@o8_nRcEGe~U[RH@>&~eX;D߹a!6rĩt5TD9$lhm(Ui9#$%"1fI|CcZrt ~T% ,JkG^xoƜI Herg AGVDt]!xg4,B~gKX^x,fG$fqխ}: 2#ґ8_8@dW.vHHX8o ~|h{"CHp_(U0`tN |.Rn'm~-JnſbC+BS`bo@-|fj54>)p+|[ ..@Q"~˙wҲȏW}1W7zoXPXV7)[ %DCdo{Cm}~gD+)PM*rDNԎ> cmc4͵ghK)ޙ' jAe(E@o)[`X|O.. A {~\g_.{N': Xjq_#T&<?!T8T c\Cz-Q\Ýߩo@CK!~0BԐhrH WcZ[Wiؒ}hl%V5 рZ nZѦ"ؐu0 A^v %ieRp_Hؘrp7W2awMf`tpmŐ+t$}o|2yHrMg)Muğ}h^K _/}[Xif% M/w2[tShIZ+ Mƭ -7!.P]H✷ ./6ŊqF#8w2KMwKC`]=ǻIƯJQ5޽Kؠl={G_~l̅NNؖzOGf~ۋe-# 5f:v0z; QArUlE+Ow'SvP~)Q&4JZ3w* -nGXxN.PuCmL;wI$6 U1rYo01k>`nXF%s\PĜ; .e * B8cGM"L.a 4 ^b0*88AԪ( i`U`,- T0ZKkL!l'9Kuy,j*/%Ie[{?f>,MՀ6 ՚&ڰ1͋6 Qν^L*=DbF %K!4yu~_4$/uI,FCr56SXxT.LGye ĺ۪/O7%j`Y[#m9ra!1erQPc2q8A! YPA^Zji+6hhq[D.f IPqxE:]ŧQP;' kl3ҎKǶؔ.i$bu|?Q"|*b?U^Ǎ(;p"5m+)G"M&&wd&ם}C&pLjR`t%T!WYݝ䞼L+a{]i<1ZS \gz!#A[J-w#V`Ev3 VcڹEFY/A1d)+,0B>3N8pYrxaLtΓWwvW`%U+p>M(3#A[~Gbmݧr`&mɰ"ϋ]\~yκF67^g8~ /sQpurwjP;">3*?jIAl{:) 3,`ڧ4>h @< $\;i8A@-0ww{я2] ޮ<3fjN|8IcZ@ <`Q? K}ʛ%Rql3bJ{孎 mlKīMfb8 2tA{)_} Wi]& l[0&oVWݣϞbxia|| Đ2$z8hD;π mBH4FlCDH e`_ʋZi7}9\[^U5qLm zX ~񆖅UkFm3m *0_BQqUrQ봹*Q+ΎJA 4|XS%&!//6YNh+v=7md-48Fup깡>,[ZUP|qJ-u<ib^Cc9pOFܙ/MlZXs3{+ХѤxf0R0޿x ~ӏc?1۫ kSe}.ySq@~̭_x%vJL/D7E8Ŕj 6#'ڳKc;{~i/V٪l˓{NG~7$S;SVBR"L6MEnpT%,ZVt$tӳiY_~/ӨCW!O@>H tiwZv,^M+7j;e]ES#ӎ9~m~ħ>u\mt"pvRn/؁|tT=b$5%Q<y&,hT'2m;Znb{呓`2eج}7Chae?[h!LA. 뚽*{R5P-+o =s5n>dJ:cRT# K$\]bywvVz.D~hwx>6p0)hj!e0⠙M6G B=%I q9=O7̷j:WII>{lm@Jn ej #|bV` IXEP-룠yNMh8 %)$u eaip6@C7rՇZGv f=o :,,u/%&e.KEn=Y)5Ps>ڸ:n-˙h/A`]*հ¿G+]cX<¦}K~ȓy Ս Ь?&e+s lf1lύ &EW1Jg?N?xj tJ'?8V(Ɖէ8t?Թ([jD.Co *em_]Ș>g0GR0i\KFդi*4^{ܜQ/nI:F[WnBi4큈rоbb˖AGt&rw,Ӿ!P].e*ų tPQCL'ld2ȑ&AHJ׷COA5Dr57X_q64xI'𯨬l5%Jwc9POX [ (9AI6X?1զzze)ܔ\V?.|󧶊EYTnG4.Z?:VW\  ]'0qOqw0 5'͇tk?:eG^3dlG ^;wSp 9f걀f n'h,(|5=:vHYxrg/wMHDYt'{1Jx5]i ,"anE.$-^Ac8Zv_xr(I[@-9K]"9 D,?C .2_a\U W|fGIp7:B{⸗oJFv|n r|,8GUXzZ`.ScoRG}yj:>f0$QJoJfvƳ8#M͏]Ӛ`Uyo.ReyyArw&F$Z%US PBH4ߦ Nk=07C:98$>tG)Psou ܖ0:PHd$[>t[aB逄&Ʌ|_Ok;*(骔̡Wd7Ce{LtqIZW@l)\4S.&2B_Yñ({p"{;L}M?60|U䤇(ሹ7k1" ʞ̄]9ӎ;,yK4X#+:M/u2?4q35?ۦ[Dδ+q񝽯ߑWw2 mbぁBzRι37!>uW 9lvX? 閭 /g4ޚtwģ'M%Vġ=5r+'tJL]|h~  Oh̐-BDSC#lۘeײv!k/K5O)Rz[-M+X[XQ ؿ]Wu}M[j(/ߠڰH/KeKIddlPC~?8نQhaHr>0y{kboL-X4&'įmVEnsi컂c/ CC^_{/+*:7lD*X]I )m^ YHmX[!FXWА.G-X7 D [g3 l XM=mu=g$Ïڝ{CZB|9Mr>42ϧE>`ߨKb?K8wLMxF7d8ٔ:iOa{=;J^5ڸ1)7x#YVRTUlH1^Sc@[z Q!+yqEt@Mո/L!\wčiV~mkbe>tMxKzF|;HQ [W7Bʜ5Um1|Q6s,|#XLIC9{6>oam.o2McrmYEH5)++qZ۵K&ms emVVۘ\ ja؟N释g_S0*op@3LDYr5Clʆݧ]޽H8uhR)bI$*=ڒ\L8*\~90Nh$,x|=qjs)@azG{J#’CU Nˌ-]=wh@;YpTߧ i3g[# kmZa@%G3tRh!Jc+t7VuM|.cr1Ylugjl2yMRxJW ѭ>|d2ҾhTDߕ))b1EF̞#a"'ung%7 8V⵺#z%9@fo BotEW/Yi$E_H!C#H)/!OX,9FOdEV &44$4'QFluLQ`Ȟ;p}9x]Xuʕ3TM\;C*S+a1SySYU|yuyH+&[2g]Z/?rpˇXP K.=w/5Amͽ,#=d_*O<3_ }6=nP`!nܝbgSU,e;"$91`?rc f&Q4[_L_H0jʁML"oQli G 3~}nGVV"cZ AD1ip!+4jGcXiA#E嶕KA"pj|9HhDC&*{#;P SMLy_X NxL5? _Y0!)O礄+g u"uĢkWs~7%k<4^O[ J!`&|ԇnHJo_ZNMncҭ,2 ׍ZAMng6E]WE#Z/)i!fPA?FrsMB~SS@F=V!' l']5+b'AEf:5ݳho@Dsp{ďHk?il)3nn7Hv_O͛d\,؆T%Է#++`˛xD{pҸZ0s-K@&櫢R|sb3]S68=p.AE>U #&H.?|,KM 'X-S( L;S#hTmB!Ra/(ߥLqoGb3z5O[=p WdXCGrTK9m=Ќ%OAm OMGr[0@K҄ezVZEA(Sk xF4"߯[Oe5 rkO@2$K  ]%(>p34 }N fQTuZ)(PDEٙ?d[ﰣ shqhFb [ņI|">C!ȷ]G{"5@^+v0uǪ`KBy-?2pУ9fP~,S%|`km5U r^cES/C*+d_].{姀!gQ]J;YԦGo[9s?8ݳ781-v<3Af Pev|JtA:ESGU%tn==@I^J %96!ڃ1>:|១z=}k'||E6S1u|'xi<1H}Xp!w -ه{(^BTGrH`*d`_y׷ c{^g 0{isUˉ*y>N9h~#'u(. c#pvNʕ ĻVQdu0ovT~ g3LȔ@YA p%ڷ,7Dݟzi+"eq˃oCGbŬ/镸0vVӢ0c g&nEĘ+9`9&|;Q2*<| 6 ?*`f%"]8Ft}\CsTSKzAxү+B+IJ>xIZNNl 3IYYxEDWgO=5 Id"WMbGY 6e(ƚz~;,eq\Lڮkl2ԅ;b ^0_uVlS 0:(En;KA~ŵX*OfS*SAT%# +Iu2eΩfo;ԨmQ-sTJ@"VU_B# V.P/qd\rC1e9}Vz@q&{\b`0b+4A=_0F]x_xD\t@2K M91v7sN̲6=ӛ_[E' jigI'=$^g"];=]K9==\{ D.:C(I%Whj35Y{3kyցS){SzAuW߅S7K8CҼB *[5nqgK`+!]9PR FH+*ǞǴ*o%h-v:k@g+ F~U;ܠ,cs=a^Y+om1&R!Z[[{%O1uLT ZInݼJ \FPSɧ4qO˩6oSx0clpOgX}݇ėyeb}B{kMS4' f `Ix([#>W[+]1,>P`U\~IجfqSyAE`Zv\՟f `6!>bV*G,N#laWKNňDTGݨ$JEj̍y2ቿ=懕J j 9 7ȗI JMgk0AJ0xG4:(ܝy?=0,Z'2œ.}^ҙhII&i.aӢm9i-/X+rNTVrBUZa3MډɟrGYR\Dª$3pT1t@Ń.m W]G]& g"k,SQrΏMi^rk~0T%!lҳ-YXr̄)C#Yu`܈SMB~VEUy 6-ZhЇ XIOn+@52fBYT/wanm__o=16Y?RFB&\%!BVa&~Ӑ$dsQVIݏJ}qܟ,?7X °Zێ?JoV|&PJلfoYZgߦ$GRk)[%$˄zF).f ͰLtpu.._dj>W= RMԬ%Ta jWdRYgl py-n;;x.[Sƣ&X%W'm4̑Þ$fq;K\83(e*Z'" F/&7X;cTY#.)ol?l#̊w陯MI3"'oSv U:_beK8ޞdmc %Z03WJHW 3G'̈́0rr=$qcфt-%m..wI?M^}!D}krv'6o9nh˦5<,UKl2gGt_Q*?g#7Xw>Ck@~4,oIҧqxYg<>ݗغ(cw+` h᳃8_[2ۭi:R=qRDD O_0(:G@`d|/.͓n-wmqz+I-}>_ܐAOnD{MpfLCfg=O/8\Q8.ەl<^ ?<^;)ZJ48|3iG{jIM6GO& Ao壴+ldlC18ppϐ!@(M Nl^q9Le!!CsweOGH9 va$ aPH+0 ŧ&$2 &)ml8o<{v<(dD\V^cmr34cDŽ߰EӜA~5ѕ oF9( jsbq }k؍Rڱqt?tF]u >0Z ToU,p;*O~mn} ]h!E*$ާ$ '&I Z}Q -Z˯ ĵ,wYf@>@p./@2gڦN˽kUbv΂>)[? r&V35~vAnY('6G^$,!M* Cۻ ܼ ^?, Xr!guWȂ̈́Ӓ8UnJѝʗ BCl}i:Ҵ`SlKR*;pp:Ke'}#ŏ=8=uWv[xEARiE~zX=re:H,V>x6lk fbR -= hsde,=tT^C-_#w 2TGnj!뢝SQYk€_mf9ޑ.o  "iB *JY? >2@31EC3b6\ym0/Kw%t`"e-6 8U eT<tyʒ[|W9Zp ~Zi9IܫjTlrE5pIT` b_H" >oI+6_&7 iJreKw4zR-oy ɤ2"li_;4ꏙӳkV'!I9VW5 Pu'4ѩňQȴeN8@b3IB436[)j7cV̻PM:Ս4(*bNߣMeU)f^=F- EY^1$q0Ж6rNzJTKFr֎vLyMvU`W؁FhE@HSS2t1lh?uN fQ!eviiks0\9,E7vȣHGgϛ>dI.(ɉ' hEp {wMO"^#ms#sS CLsc?3{ch6ocƳ=O=io1P߼SH5Z7BH }+T(.Hgw`դ~3NѿOn4'W@>K+9Q7$ 楿~$gS h}n#"/Աeξ{(V6Bس.! St$UZ4+1?øYlͥzX" 2H9_X50l:w{wڡ8p֓ 硬 vŌ뫌yso3?}p[vߏds $R_./Mkڦ-a<|f^٩7h[GL}a˔ bƾn5BtJ7zMÂ65lyMH\#+ q*P m|QO[^N^Tx"o.?(x~A ݅ ?F|Hk |hK{fU.H7Xb1F+K ז;=O3KxC/Jh%dvkx6[V#m..#ă=U `U}֟W;w s|jShyl/Uwc98)؛ZWhA1R f; 9C7! ܠUrel 9{fAT|ӵ_8O?v'o'Lɗ{YK?6<4?PZ m<*Of QwKX*̳W&c]>\zLC@7Ovr\g*ГE%sB[@˜떻GwXY ) HmT;v0˹ҶNK8@+2ƝQЦ5 \1O9[My΀Ͽ'SCF؍o4J`R3qi17A:&a$fg ];}e(&;f@Q5VD4S=hhΛ1Ro!"vزMr&LTG4hN=!B. .n-u*{Н=Z.L`њ*]'J0,o-*+.m,}~ƨa|}Na$d=PKTi~Q\yj=42މ[M-nS܈!N'N.wBkڤ`o})I ~˵+/g$&@W_ 6؞Y ZkIaYv(^: `*ݺ/a#uT,)Pᇱ9WpaRحFNzl4I0K{fs\ڒ0FTABJ>mSP©Lú/%1?Zh}l«XJaE~iOLd+p4z|=I$M;ij_&$* xrsҌ\ٖsL 6vh(EhQRpO"͐m`}~xĝ/"aBG$f&F̱"?aWD[ɵ{v; ;ژdC| pO$e4QCsb:Y6lIufKYRVzwZ%vcU[5Mɞy]t~] *=i\٫ ْc gfi f߂hojF\^p;iU/lfYUH/Z7M ba)R"c}"}W> ;@2K|Ӆ;puAwQe}8Ymݡc zjnQ72&ف&optu*":ЇOA,8)ǡ>1k2"պhȕ_"T}s7;'JgRkQY i]%FE DZc nu 9;#N>WXj|Z5/2CuŜ2\qE;cƟ4{@k\M?)?2CrsK)O!mXme)* $Q=5ⳚZr ˞[A",im^atVwlI!\Nw36ѧH 7o ت/qt:I4ADO3k#PMjxFgVNjL)+G,eofaY+4q]g^c'kh]|*L+$dJa'ԟ> v sl)*^69O%LBz|r.՗$ŀy~r ׂvDЫd_U%v0L ;Uftm8`]e37ԡ2 *)x̪&sKD#]o% =?i"} :-pgt5NOjg2ur|L wgfٟGj 9g!SH(}8Zӱ{A|+.ʥFW΍D7/Şli2J` NN#Co?g(֛N]1sov8zKB,hu iyԋXذ. |[ ]äa·i28eX-$Kd3TIF1$f4vJ+ueDuFg#[vI s4",H(6h);@e(X̜ƹlvmcDM+1ȺɲaoMcA@b5puKA)sHqQVR6}tEtG9EV*Zzo҈E 04s]+ݩZR1f͓l[ c!&]ShB4":(}ՠ7*1(ixoI>1ѹ[mx N-Q`A;WA[oz{/NL ؿ(뭊au0h z?˱Q! 0`]) ND54=DdYl>娧 @ɴ9n$ HԻl]T'C,e% xQ`;cxjt> yzRbZd݅g 'P~lQB'c?4~S,bȁ*}Q>܂%7T._]%MB(]Vq(!?0@uH oܪw韛@[/nͷ*1i'/mmO=[9.YaUER^~Hɮ(DJRI5w y`hY!g'k<-po>`ʍAaXu.냅J#j7(xe8[FC|e|**33J^4pE@TҋOm%J2[>w3hη=1}}94Y/-~J˦Qe9%|9Sr]ww7x/Q5e;[ eJkh0 ,|!k:P5_#RZIi/2V8 [cS$f)z4^ %j?ݐ_-$>zi9-pRC[Z߽w6[L+IzGYO?f0]d<-|tcf4 Cxs_1zoɟωN nۉ֥{KJ'mE:x6[.wV"RV ĉ/.ҾeON&"0#E I>;WʖZԣ*/upĮkg>HT9KR۝ ԗ Df LEN&;p=̈Pޘ#TYJh]8DDkAKDy=2ό^&iDg_X!6چrLSjxL@t@p-VY'||5aAmZk>ŹsVZ_܄AG"@8MG9#$F|H][ 1;=]d2K,B;Mɾ1u@WxL$qNEDy ON{M/b~."H}8qb‘β5sDݒm~+CvO1 [`Oeah ICL7;u9w&eB̔nN䝽<[W-z& Mv|_ 3# ᷹b.zLyW+>=2}tr텷\0 `O/I=:Af&du0"U&j-hP[Knu",PKFӳE Fv7j=2czToD8E:rUv \]1ɡ%x cg\8f<: `aEqq囱DP%tVCSAa$BPA+68j~x^Չ,Co;rf- nӼ_HɜLxb;X_x|Ⲩe/-$66A!|N>acW%l*Q_ڞUNv50{]\e4!I_n6_3qvpioi_,/քVǬcx6C8W8"JDbBv>XuU BGviښn+jnv}ϲr'W Rw8Un١ q~>fgC֎zQlVLDZ*Ě1/ɳܢ@$I a>~ȵ0qv՚]agA6F.~X?ot,8G1A,cxLtb6F߽pzB 36^ 5B9$Cn qvCEˋm_.3h~W/ZU}%;.W]7Nev{8|h3o<|?0DQuI ^G@|AIBЙgt1צfzmti: $N^}ZHM/m^Q}Myh<_KH&]j$:}y?L.D?6å~{zx/wp/d a|tHu#IoS_>Av3+^5kHMHj-x0VoeTRW5&2iD xaPC{))h5k9t\O,TO*LE$0?6rWU^HO(~Tz% Bpx^\ 23E|ۓ5G"H[(NPDOڨoΰoͿTy1l Ut.0eC#."f$""w?xjѳYP煯NΒ߹* 6 Rr[Xy7}¦F&q5'ceuE/}v[OL]9zjc ]:2vVY(0MAsra fCj"C>?"fQaCX_'A/mH@ H18tD {4F )Tx%`l8t#HrgbwBs~7,M7?Ի~պ'p\+re#BZO@т\a'0&Y ë|_y7E?S{N" L%"g&$"AuT p<&{H[ngbRnTt1JDtf0j9eK&Z=|lc:~"QJMxGDN_b@/)I@P! y A0tϧa ҡJ"Y>Os,puVgױ ã (j9zB0%|5.VpT\/"l/ƳAR[_cG`\v& }=O#+1 !KzSfWYT<-ZPy*6\^ޕ=ӗ/ ZC2^"?Tqb2{9U2=k (\8^RnTw+U]y6fsYLuk@ 36pvɤMQ8jTea͵~C2 xNee8Z}{N`&:Dq۷T*P>Ӝ|lf =#_3rR'n pa);WEj!*|IVhbdaМ7ERsdu& z57Iq:gߐ(L)F7 ń$~𡼠_^SrN 'ASǤNyEG:D0d0u>XBkbS G1Y\]2Ao{PutmG.n6p"l\J G+i޾; 6&e}:^A)q\lt`])X:%;ļ)խϟC) @?bFZ4O\;N}9ϻ /*,bZV%s=3 3o探t/r 4߀zMb_*, ͆aT0L`gk? wH,A|ܕs͕1 +WPڒ:\ rwQЏ_Y;3HؕUk;͎.;E`-]:9:#VMYai1̜$e,Cit'm|H߾j@5[[b*8kϡ_-H,3S$z( }^}U;|$$0`C63{A tTIuFnHBOQ(coznjFx(?v{[ARp>]FuB޼-HnAחЁ~Kc{r2?Jxnpg6x}>B1Ǿ.{Noz跳*'=ݘ8R9 ꧪ?8tWMO6odڮ %45Lpk \PNu/w}y7}#id4qwȂW¯}A\7?uķ7% 頟:q8Mqҗ/] UnH)+kM ^+gkUAI\醤H݂o{pX y"eAZB7.d ͉a ߴ 4>j4Ƒr͏Bǝ=og;VbSN2OaeÕPoh'T'G3q(*8@Fyyx;S ;Ez2 \_ Q J+C D bx>H0 X>E1aNW˻ѕ_%q2 ݠDҨ1rlcO'X4uGr-LNxpϼ/?Y^P+Ԁ/ѹx5(b LL)#Q~/ IBRZcw4%ɫJKBtV^O1MC5tab++;\|8tq(Vskma x< !W4*%7۱t^tߑIq,5.S_&L2l=&ibP#S q6ꔑ$s ۶F1.8Pp=5 't<\ÖX{;8dZ[*!j|~䮊T1eymɤl>J_g. &'1[I:$ː'k*DUlU[Ȟ$}[FB'5{xH(8,Ns}5 ibY-א Ucy |g~VU2CHx1nf/ZEQI:k 1?M4{L p^)ɲ>ӳ* seer 7T3\U+ڲseE"a /^{+hyU22~ېP-lWos 9 ԉٿ uԱNe>_}o1ar 7qyQ:Zfs37[GӰWFX3OTJ%xڑ%+H,EqT.-!r,m,-rUϡ;LF`e‹ZFu9SiUѫ/݉BQIw10iO Boi4M5aZYǸJO<7 ǵ7L= <g܁;ޝ2Y ҳm<"պL'hnYV~`rI~)D`E$|wM9 P/u )m ±m L\ε< }Q:m'yB ZQRL>@6@n-j!nɷOLR :W]|k y`$8D?=X۶`/TNCi;Zp  rNֱaTBh]KV;Cꦽ{/&pR݌QCMVFjyšEzE)[1HB3"~7scÖ73/ MzFNԼNOY-7uCN9BTz/ ѤU'%~9*^O0 _+JXd8L+ lUo/)WBg Ph~c_k4sOj#@;5V_}~Hst_|riJ` <t>--by<R g_X2P5@#˵k`O¡Pw<`nJ{@mg BtAq복'ŢS6T l/=wM\_Ő™?8!_vtSMeb%+C`tӊhsb.J'Y垕^%"f0fܭQL·WhixFp<6i2f:4]d`[IH&y;Plj[s>RΐC"ybaY1P9A8Ypk c4z]'J k)EY.5o8ʒ#g7v^ۻ0,Ѩ˻9._ Z'2+JFt6\?P2C.8}ў*Am>eHE)R{!=އldR N:c59m]G03jOHШCeRniNޒl"Se3ެ>dzcTMb hK ;Xړ(km35Zjo:C}[Gq1~|x+h iٿڗ6T2R M4FCKrw)lW&9x`. K2 U|uIu2ܼ)ƞZz;Go!"<_QM"S@#d|!{b˂11%#3* 7,+ʘFjn3kg4-v0?F |'8zgWGAڨ29i5 ֶ`̡*K{PZÌgKïa*W,&E]:F%+bgV`*C El ebK5lR|$^UbJ因`WdK9zFlCaa~~,^XMsAJ"[Ow5PDeRWg\%D!^=< 1NQIUژ߶Ǵs+zi3ގ2m"D  >+xȄ+Sg N#,Ey^"-NG<ERDsuXkp&bV3YL@D1:hd}ՍOl35 6avabrzu+/i< fH/@cŇ؄`c@,Uw_Y'>${?0J]aP]My{v53VCbO=Ŧ02+o[Z^Ib3+3l4؂k/Z]`m)6wKcuk#" W؞NaGIൢ{nzBW%-u ߝux"n(6kEnpˀ9_ jn31|XcȠ(0E h ] "EՊ<s޽dg&GyS!XuTn3)pX_őhLi_Bx˵ N;[9O֖_@Z4o0_clc+<{yeLvUa4K˧P502GwmmA_f{8$fvPԱSU@,5Q \j^9vAL ssf[~ͩ(2g"o#p!GPncݗ9%gBGAST< :D#H'MXW2 xȘv-C,&L 45[ PKH< qSQ[|,!x0ۮ/HXBqZ'mUm}.lXH_=M3EX2h*6DT}Q_~yIRŠMؤOzIƐKg BW4X-&qd g Z(u1FE! iBJZL{g_cYIe&  "'& P$ ءW_[@)Mev\E4*hw!i%lkW/r55QIsva∅gr,HÅwBw·4~s;?Sozmr}k.%y{Lv2} (5Eż~ Z䤐A-B o(w툧M)71zah hu] rZ QEIn\o]<ҶmYRX'!bá/h.`D0GQKnFf X6`ꡡ!Ѝ_Imuɻ0YuVF'V#V5??&QBeEt1aيsTisXL|5'ZRrP8ʯb b:éz=v7GpbxڊLXإn!<;hRb~E泃5 rā~=C -8Ic1iѳBֹQtg@g٠̠YXJgbMDR3@8kc 4;imACéܚ21Vákn gw{*J21 *b)PjYBIK@ʕ?(*򐖗 \IݺtzT#  3ygW:) {&Z*o4VJPDf &ekotC, zM:Zf?Dv9:c_7X0u/$p [Z ǽ`^;]Ls:Ueq̷O/˲a=c'9np]JPnHk0rmֳ0"ӯN1r2&4x3 ɭ :fRkЁ'قjG 3䡠5XeP-A@eHzTJoH(vtHuⵋ XA)Jٸ}&;J:Q, ^5aVBMU`[RtuQN0^6^y ZEkjGqa U\ V9 [R|׻ufE`ta Uߜ]!J6Mz=/DvaOkxxi^)I+I?@D=P[Z AZ C]w&BJҾAycǖ[k$m^]eFN)OrZS:"i /%l'ӶqNX~3R+)x j*&Zi({^\#.-!ĕԉ=燪Xx X&wyagP./jA\d1$Rpn  }R%LP"BԭW5]e!r Aܒ,OF 9mD«Xq2+j43x"[ kN%D ͗PK8&7סrZS7~'θйaSewȔБ5nb3ߒESփPI8MNwe6!rsm`Y' cئ%\Fy Y=ІRj<vS(N&;j5(>~×{'y'XB]zOxW(+]x%b2&} XT2gWX-_@Ո`TS?(-5 Z \8>~= [eP cy':D28;#`)>@#dVG.5w.&>BA/ ,HXuk_o qL֋0p;M%$ɌH{þpP.=K;'6=H{(XSn -) =dA{x [?q+hys:9 @&@͞aȭ][<{$#us2gGž/$Za2i~8-Kx@rfwt-U*`il+{L,fbG &a&kz_`dH;*֔G!ф46}图AHL9.I)a/+IlBrU_bȍtJQp,6]A:@t:Ҩnݟpӗ֞3JS%r?^z>X6axvoiu#۱n3Dxi)缤+V u@5Ta$ o'֔@D"msRBr<ސ5b)7yyS4iɠ;'\M>Dގ*!Ŕ7۞{s$K_{1䡣T6.lg^kґY=% _E3YU`+t`N ^tW=~gظDGZ ,n$59E!wmfv*P8Ɍ,+1nm+S#9Ts6~`1ZG7>C" ,AwdI)lޓ.(מxίZ`g ?gQD}Yp"\QL=|&z4`)Njjg.q͗,8μ}β W2sT%H>'fx\PاӤ] V^xv44> EJɍ% #f;#Sץ [8I4 2ʐD(3FPtXEO $"jfi{iz9@ (d1@]{)p`kbN \aM5ܐ4R.d[G7J^nD'b>-/- `\64z`"$8;\fN]+e&,?A HYzt_Cذ0 `?Sǻ-o݈-e?V8t\4f N+"YatjSG4.1^oQ$&L"U8ު0v.@d|s0^煲U[ch(q/OH65ɚEJ)CL",SOOӱ$@Դigq%W/Y:E<&ZD"a$JDzMueXԬf3ㅢA[įNЧKL̏2vqb֜gLJ6cMUw`yv]w;_[!Q??~D7G4w$GӜHS@?A6Ct:KZ7_cZ/(y4Ռ,d ;q1 J$LV WiS#ϙɬi9s#](~K {=nm9袦ܬ&7úhQNZV#y\tu_Pƫ~AVQlI[{(aW}# qi?NwD]KUa#So|no<٣X_ yO7vfV^ W U7FIz/KP\~ jyIX:A+e7:-]H|Byb _Mb LhD!-TN0]n6hta2YTokH땹/g[ᴡhW"qG;fNJUzJwQShxkѠD<U O.5Ƴ,dDy. Ds_C4`(=m=L3Y b I Qt+Va^'!gk,5:2'O U6?Dd&͒/+(8}( F+y ZgƏe11gOYztnSʳ*˞/iOiOUێ/:T.u O쒦ڰ)5z{]2X`Zf:~Gq_!3} aY|׳c5:ٌv !"%)kpkXQ<.7S@n{$R [1A,:Zss^@i(=|\z*:x686{8?R4'#jI891}ҿ=Û,DnYxkgdi-oh9.qҥ1yW牳+j&K;.Lĝeqya\'CW&s ]crGmR/B1:|[oTu-^ eZP?&g)>;*mذ1\n87L=ۺqhvչe9r[mEWҘ KPi.!OՅa`Ac15&ʻMN&]aVrfEy>7qrHJx|aä"P ţ7ę@Ysyvv Bazm_>F6ɒ:4vϹZPOCTG+)y!S1JAg)=ߐFvu0*Q$7f\(QNe)O>''qI8)UvAŨ Qȸ2xRи|L̀iY7! !߬$#CCTq7Cv.5,;ª nڒ Ge}n1+p1q\MLZ: F [=8Ni[tTIFm G4fgGDq(25i5ưk|;&n&ª*!g sƓo >cň԰PܘqCLll`X6rRӧtJE"7]k]P$r2':}eVi2X 9!Rn?u]`$Xtw+D~?'?5QvZp U~ҕz /2ȌzKF<QlE/De&MBN[R"Ϸ(5y@;sW9|%Ow}k:L [)woM ߲uAjξRFYB_( Fc{F0z d<}oQHުVAZY+&1=#|j z'\ ~!Fk(&>}0FWb2G4]\LȀG:*gQ]&>%,s>/iuGJghs,P6Ǎy;&灁FqxFܰDN^ރk*&ک1^:[|QAw=ey@9]׀/83MRճ䨣 vY &L _? bNs-= p>Cm $i?F^6'^;₱ D{ye)rF(n߄j|F]]pՄ?K%,9;\TN\՚-Oj 1E=:qG+#=l25b+ƘlGݴ? T&AT'M{.CjKNmך-r+ Tx_sthtEZUgL}^P2o$1c2{~? _l.a+btSʺئ&} Knb5Z'9צ؝__w;Q*,&\ۺ^[71.;a3yq6y*tL>p+0(2=uboi\MÇz2HreI$Jecڀ <*Bϔ jK >9BpW}(LUEqd6"jrӴPPS Ƿm7 C`_&91y8[   (a#|qhkHRaozl˩bCZFDWcm'M0%Q)Gי6drya&{ M`iS+<3!)pY)FS% o@_ţt\1' !0V[b|Z`dOD^zYUtw!7"U@MsS'ܚXSmv#-(igw'gSk7ИHV_ YSIPI^HAx , 8c(e|RLpL:jYM $9n\:"OZ!ت@n4j7Ն1-\^M҄+kVST'_?9K8:7@fy23rm{r`E#K:*l3x!1h%oW1{$yZ@yY]cun@B'{ =>8LhD"4E6zaEx kʨVsSMӞl0QRμ!bb$M5,m $_r| FHd6Wȝ~?MRs Y+#±M aRъo"# }\\?\[@'0oV4 +  ; ȯv)ﭟ>% ӡca /؋o0/$xHHu1T~P憂lUDܾ#Jե0xIuܻ(ƚ=TI62Eo+&ph7?4HC^1IY" ynЂ?5;_=y(>P_ W& hq!k˺.'$7q:z/ߴ- AX棺1sps#͂ϒҀO.?ućx9۵%EM>37VেOO>;LF]4ju]j xd5-z<_ GRLiejj(^Ɖ\hwdbAxԱzҧvg5fWOJ_L+P3&KL(UmB~0#8=/B?Q&L ށOvpŏ N\l !j_9Ė)m8r0zꎷ:Sw7سx&0CrNQҌo!KW~dخ(Ėt䦈BFfOU`؞CQP=m' n19tev/Xr^|dzaQ9k l[,'iڌe)]Acr889?}nW:'mmg*r6Rd2ARy/"/$ RSsį+h8Ygӓ ǚ@6VB'ݶOdN`˚="L(u/1g(K(b` TʃW1wvLhy^%􋫊0BOp (`7͸cg-2VS9'b gjOܱd&I ̐1Ε]rAQ% Ku7a]k]&Cſ~}p-k]r"iXcDKBçXMT.X Տk@pZxh2/sbZ }D cίr5yL#erR%k&r$J>^P-HFYtJψ,݁&*lZ]OB{:B:jy:&,@=niZ{6U- eMS-qtoctave-0.10.1/qtoctave/src/autocomplete.cpp0000644000175000017500000001414111511434230020234 0ustar lucaslucas/* Copyright (C) 2009 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "autocomplete.h" #include #include #include #include #include #include #include #include #include using namespace std; Autocomplete::Autocomplete(QWidget *parent): QLineEdit(parent), search_string(""), tab_flag(false) { current_match = first_match = word_list.end(); actual_command_entered=-1; setCompleter(&completer); completion_model=new QStringListModel(&completer); completer.setModel(completion_model); } void Autocomplete::setProject(QString project) { commands_entered << Projects::listCommandHistory( project ); commands_entered.append(QDateTime::currentDateTime().toString("%% dddd MMMM d yyyy -- hh:mm:ss %%")); actual_command_entered=commands_entered.size()-1; completion_list=commands_entered; completion_list.removeDuplicates(); completion_model->setStringList(completion_list); } void Autocomplete::load_from_file(const char *file) { QFile input(file); if(input.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in_stream(&input); QString word; while(!in_stream.atEnd()) { in_stream >> word; word_list.push_back(word); } word_list.sort(); }else cerr << "No se ha podido cargar " << file << endl; } void Autocomplete::add(QString word) { word_list.push_back(word); } void Autocomplete::remove(QString word) { int i = word_list.indexOf(QRegExp(word, Qt::CaseInsensitive)); word_list.removeAt(i); } void Autocomplete::clear() { word_list.clear(); current_match = first_match = word_list.end(); } QString Autocomplete::search(QString start) { QStringList::iterator i; QString word; search_string = start; for(i = word_list.begin(); i != word_list.end(); i++) { if(i->startsWith(start)) { current_match = first_match = i; return *i; } } current_match = first_match = word_list.end(); return QString(""); } QString Autocomplete::get_next() { if(first_match != word_list.end()) { current_match++; if(!current_match->startsWith(search_string, Qt::CaseInsensitive)) current_match = first_match; return *current_match; }else return QString(""); } static bool is_variable(QChar ch) { if(ch.isLetterOrNumber() || ch=='_' ) return true; return false; } /*Search last word entered*/ static QString last_word(QString _text, int pos=-1) { QString start; int i; if(pos<0) i = _text.size() - 1; else i=pos; //Get the last word being writted for(; i >= 0 && is_variable(_text[i]); i--); if(i == -1) start = _text.left(pos+1); else start = _text.mid(i+1, pos-i); return start; } /* event function reimplemented */ bool Autocomplete::event(QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent *key_event = (QKeyEvent*)event; if(key_event->key() == Qt::Key_Tab) { // Autocomplete if(!tab_flag) { QString start; QString _text = text(); start=last_word(_text, cursorPosition()-1 ); completion_list=commands_entered; completion_list.removeDuplicates(); completion_model->setStringList(completion_list); QString command= "_ide_completion_matches(\""+start+"\");"; octave_connection->command_enter(command,false); } tab_flag = true; // Event accepted key_event->accept(); return TRUE; } else { tab_flag = false; } } return QWidget::event(event); } void Autocomplete::keyPressEvent ( QKeyEvent * event ) { if(!commands_entered.isEmpty() && Qt::Key_Up==event->key()) { if(actual_command_entered>=0 && actual_command_enteredkey()) { actual_command_entered++; if(actual_command_entered>=commands_entered.size()) { actual_command_entered=commands_entered.size()-1; setText(""); } else setText(commands_entered[actual_command_entered]); } else if(Qt::Key_Enter==event->key()||Qt::Key_Return==event->key()) { if( !commands_entered.isEmpty() && (commands_entered.last()==text()) ) QLineEdit::keyPressEvent ( event ); else { commands_entered << text(); while(commands_entered.size()>127) { commands_entered.removeFirst(); } completion_list=commands_entered; completion_list.removeDuplicates(); completion_model->setStringList(completion_list); emit new_command_entered(commands_entered); QLineEdit::keyPressEvent ( event ); } actual_command_entered=commands_entered.size()-1; } else { QLineEdit::keyPressEvent ( event ); } } QStringList Autocomplete::commands() { return commands_entered; } void Autocomplete::set_octave_connection(OctaveConnection *oc) { octave_connection=oc; connect(octave_connection,SIGNAL(line_ready(QString )), this, SLOT(add_completion_match(QString)) ); } void Autocomplete::add_completion_match(QString line) { if(line.startsWith("~~Completion:")) { QString word=line.trimmed(); word=word.mid(13); QString start=last_word(text(), cursorPosition()-1 ); QString _text=text().replace(cursorPosition()-start.length(), start.length(), word ); completion_list.append(_text); completion_list.removeDuplicates(); completion_model->setStringList(completion_list); completer.setCompletionPrefix(text().left(cursorPosition()-1)); completer.complete(); } } qtoctave-0.10.1/qtoctave/src/main.h0000644000175000017500000000576211511434230016135 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __MAIN_H__ #define __MAIN_H__ #include #include #include #include #include #include #include #include #include "mainwindow.h" #include "octave_connection.h" #include "terminal.h" #include "window_list.h" #include "operations.h" #include "basewidget.h" #include "variables_list.h" /**Keeps initial position of QWindows. */ struct InitialPosition { int x, y, width, height; QWidget *widget; bool maximized, minimized; }; /**Controls all modules. Exec application and interconnect modules. */ class Main:public QObject { Q_OBJECT MainWindow *main_window; QMdiArea *work_space; WindowList *window_list; Operations *operations; OctaveConnection *oc; Session session; public: Main(QObject * parent = 0); BaseWidget *active_widget; /**Open new tool of type type.*/ BaseWidget *createTool(WidgetType type, QWidget *parent); /**Opens tools in config.*/ void openTools(QXmlStreamReader &xml, QString config_name=QString() ); void openFilesToEdit(QStringList files); public slots: /**Shows Octave Help.*/ void help_octave(); /**Shows QtOctave Help.*/ void help_qtoctave(); /**Shows QtOctave About.*/ void help_qtoctave_about(); /**Shows Table.*/ void table(QString text=QString()); /**Run an octave script.*/ void run_file(); /**variables list visible*/ void setVisibleVarList(); void setVisibleNavigator(); /**Init new variable list.*/ void variable_list(); /**New dynamic help*/ void dynamic_help(); /**New commands list*/ void commands_list(); /**New editor*/ void editor_callback(); /**Clear terminal*/ void clear_terminal(); /**New SvgCanvas.*/ void svgcanvas_callback(); /**Reads output from Octave to build svg_canvas if it is needed.*/ void line_ready(QString line); /**Callback used for sets active_widget. * @param w widget activated. */ void widget_activated(BaseWidget *w); /**Returns widget of main window*/ QWidget *mainWindowWidget(); /**Sets initial position and size of windows in initialPositionList.*/ void initialPosition_callback(); private: VariableList *variableList; //Timer for starting tools QTimer timer; //List of initial position of Widgets QVector initialPositionList; }; #endif qtoctave-0.10.1/qtoctave/src/session.cpp0000644000175000017500000000350511511434230017220 0ustar lucaslucas#include "session.h" QString widgetName(WidgetType type) { QHash _widgetName; _widgetName[MAIN]="main"; _widgetName[TERMINAL]="terminal"; _widgetName[HELP]="help"; _widgetName[TABLE]="table"; _widgetName[DYNAMIC_HELP]="dynamic_help"; _widgetName[EDITOR]="editor"; _widgetName[NAVIGATOR]="navigator"; _widgetName[VARIABLESLIST]="variables_list"; _widgetName[COMMANDLIST]="command_list"; _widgetName[SVGCANVAS]="svgcanvas"; _widgetName[MAINWINDOW]="main_window"; return _widgetName[type]; } Session::Session(QObject*parent):QObject (parent) { //for(int i=0;i<=NONE;i++) //{ // QVector tool; // tools.append(tool); //} project_name=tr("Empty"); } void Session::setProjectName(QString project_name) { this->project_name=project_name; emit projectChanged(project_name); } void Session::addTool(WidgetType type, QObject *tool) { //if(type>NONE) printf("Type #%d doesn't exits.\n", type); if( !tools.contains(type) ) { QVector tool; tools[type]=tool; } if(!tools[type].contains(tool)) tools[type].append(tool); emit newTool(type,tool); } void Session::removeTool(QObject *tool) { int pos; QList tool_type=tools.keys(); for(int i=0;i Session::getTools(WidgetType type) { return tools[type]; } QVector Session::getTools() { QList > tool_type=tools.values(); QVector all_tools; for(int i=0;i0) { tool=tools[type][0]; } return tool; } qtoctave-0.10.1/qtoctave/src/variables_list.h0000644000175000017500000000435111511434230020205 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __VARIABLES_LIST_H__ #define __VARIABLES_LIST_H__ #include #include #include #include #include #include #include #include #include "octave_connection.h" #include "basewidget.h" /** Shows variables list. It uses whos command. */ class VariableList:public BaseWidget { Q_OBJECT public: VariableList( QWidget * parent = 0 ); void setOctaveConnection(OctaveConnection *octave_connection); virtual QMenu *get_menu(); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); protected: void contextMenuEvent ( QContextMenuEvent * event ); private: OctaveConnection *octave_connection; QPushButton *reload_button; QLineEdit *regexp_lineEdit; QMenu *popup_menu; QAction *popup_edit, *popup_save, *popup_clear; //QTextEdit *text; QTreeWidget *tree; QTreeWidgetItem *last_root_item, *dynamically_item, *local_item/*, *currently_item*/; QMenuBar *menu_bar; public slots: void windowActivated ( QWidget * w ); void windowActivated(); void send_whos_command_to_octave(); /**Opens variable table widget*/ void item_click(QTreeWidgetItem * item, int column); /** Callback to line_ready signal from OctaveConnection. * @param line line from Octave. */ void line_ready(QString line); void popupEvent(QAction*); /**Activate/desactivate menu options. Return true if child item is selected.*/ bool set_menu_options(); signals: void open_table(QString table_name); }; #endif qtoctave-0.10.1/qtoctave/src/window_list.cpp0000644000175000017500000000427511511434230020104 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "window_list.h" #include #include "basewidget.h" #include WindowList::WindowList(QMdiArea *work_space, QWidget * parent ):QComboBox(parent) { connect( this, SIGNAL(activated ( int ) ), this, SLOT(itemClicked_callback ( int ) ) ); connect(work_space,SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(window_activated_callback(QMdiSubWindow *) )); this->work_space=work_space; setIconSize(QSize(32,32)); resize(100,32); } void WindowList::itemClicked_callback ( int item ) { if(QVariant::Invalid==itemData(item)) return; QMdiSubWindow *widget=(QMdiSubWindow *)itemData(item).value(); work_space->setActiveSubWindow(widget); } void WindowList::showPopup() { clear(); QList widget_list=work_space->subWindowList(QMdiArea::StackingOrder); for(int i=0;iwindowIcon(),widget->windowTitle(),qVariantFromValue((void*)widget)); } QComboBox::showPopup(); } void WindowList::window_activated_callback(QMdiSubWindow *widget) { if(widget==NULL) return; clear(); addItem(widget->windowIcon(),widget->windowTitle(),qVariantFromValue((void*)widget)); /* BaseWidget *w=(BaseWidget*)(widget->widget()); w->menuBar()->show(); QList list=work_space->subWindowList(); for(int i=0;iwidget()))->menuBar()->hide(); } }*/ } qtoctave-0.10.1/qtoctave/src/editor.h0000644000175000017500000001446511511434227016505 0ustar lucaslucas/* Copyright (C) 2006, 2007, 2008 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EDITOR_H__ #define __EDITOR_H__ #include #include #include #include #include #include #include #include #include "basewidget.h" #include "syntax.h" #include "octave_connection.h" #include "search_dialog.h" #include "simpleeditor.h" #include "numberedtextview.h" #include "projects/projects.h" class ClipboardListView; /**Syntax highliter editor. Supports several editors and autocompletion code.*/ class Editor: public BaseWidget { Q_OBJECT public: /**New editor.*/ Editor(QWidget *parent); ~Editor(); /**Set conection with Octave.*/ void setOctaveConnection(OctaveConnection *octave_connection); /**Gets active project name.*/ QString getProject(); /**Load a list of files.*/ void loadFiles(const QStringList &files); /**Close one tab. If close_all_tabs== true close all tabs. It's usefull for load projects.*/ void closeTabs(bool close_all_tabs); void setSession(Session *session); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); private: //Project opened in this editor. QString project_name; QTabWidget *tabWidget; QToolBar *toolBar; OctaveConnection *octave_connection; SearchDialog *search_dialog; QDockWidget *list_files_dock, list_clipboard_dock; QListView *list_files; ClipboardListView *list_clipboard; NumberedTextView *currentNtv; // Actions QAction *actionNew, *actionOpen, *actionSave, *actionSaveAs, *actionPrint, *actionClose, *actionClone; QAction *actionUndo, *actionRedo,*actionCut, *actionCopy, *actionPaste; QAction *actionSearch, *actionRun, *actionDebug, *actionStep, *actionSendToOctave; QAction *actionIndent, *actionUnindent, *actionComment, *actionUncomment, *actionSimpleRCS; QAction *actionToggleBreakPoint; QMenu *menuFile, *menuEdit, *menuRun, *menuConfig, *menuDocks, *menuTools; void saveProject(); /**Defines a new label for the page at position index's tab and updates list_files*/ void setTabText(int index, const QString & label); /**Updates list_files*/ void updateFileList(); protected: // void dropEvent ( QDropEvent * event ); // void dragEnterEvent(QDragEnterEvent *event); void closeEvent ( QCloseEvent * event ); public slots: /**Execute actions as copy, paste, save, run, ...*/ void toolbar_action(QAction*); /**Search word inserted in dialog in code.*/ void search(); /**Replace word inserted in dialog in code.*/ void replace(); /**Put/Quit break point to debug Octave code.*/ void toggleBreakpoint(int lineno); /**Another document is selected to edit.*/ void tabChanged(int index); /**Sets actual document modify flag true or false.*/ void textModified(bool ok=true); /**Starts debug of Octave code.*/ void debug(int lineno, int colno); /**Ends of debug of Octave code.*/ void endDebug(); /**File selected in list file*/ void file_selected(const QModelIndex & index); /**Open file.*/ void openFile(QString file=QString()); /**Emits dynamic_help_required*/ void emit_dynamic_help_required(const QString &text); /**Sets active project name.*/ void setProject(QString name); /**Indent text.*/ void indent_callback(); /**Indent text.*/ void unindent_callback(); /**Indent text.*/ void comment_callback(); /**Indent text.*/ void uncomment_callback(); /**Shows simple_rcs tool for actual file*/ void simple_rcs_callback(); /**Sets/unsets breakpoint for debug*/ void toggleBreakPoint_callback(); /**Close window*/ void close_editor(); /**Print file*/ void print_callback(); /**Shows edit menu*/ void show_edit_menu(); /**Clone editor tab. Clone actual editor tab.*/ void clone_callback(); /**Text in clipboard has been selected double clicked, insert in text.*/ void clipboard_double_clicked(const QModelIndex &); private: /**Add new empty tab to editor*/ void newEditorTab(); }; class ListModel: public QAbstractListModel { Q_OBJECT Editor *editor; public: ListModel(QObject *parent = 0, Editor *editor = 0 ); int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; /**Clear data*/ void clear(); void append(QString name, int position); void update(); int position(const QModelIndex &index); QModelIndex position_index(int position); Qt::DropActions supportedDropActions() const; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); Qt::ItemFlags flags(const QModelIndex &index) const; QStringList mimeTypes() const; private: class ListItem { public: QString name; int position; }; QList list; }; class ClipboardListView:public QListView { Q_OBJECT QMenu *popup; QStringListModel *_stringModel; QAction *stopAction; public: ClipboardListView(QWidget *parent = 0); ~ClipboardListView(); QStringListModel *stringModel(); /**Saves state of ClipboardListView in xml. * @param partOk if true, xml is part of other xml file*/ void saveStateXML(QXmlStreamWriter &out, bool partOk = false); void loadStateXML(QXmlStreamReader &in, bool partOk = false); protected: void contextMenuEvent ( QContextMenuEvent * event ); public slots: void edit_callback(); void remove_callback(); void remove_all_callback(); void sort_ascending_callback(); void sort_descending_callback(); void up_callback(); void down_callback(); void top_callback(); void bottom_callback(); /**Text in clipboard has been selected.*/ void clipboard_selected(const QModelIndex &); /**New clipboard data*/ void clipboard_new_data_callback(); }; #endif qtoctave-0.10.1/qtoctave/src/command_list.h0000644000175000017500000000353311511434227017662 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __COMMAND_LIST_H__ #define __COMMAND_LIST_H__ #include #include #include #include #include #include "basewidget.h" #include "config.h" /**Model for non editable QStringListModel*/ class StringListModel: public QStringListModel { public: StringListModel(); Qt::ItemFlags flags(const QModelIndex &index) const; }; /** Builds windows with List of entered commands. * */ class CommandList:public BaseWidget { Q_OBJECT private: QListView *list; StringListModel *model; QLineEdit *lineEdit; QMenu *context_menu; QMenuBar *menu_bar; QStringList project_history; public: CommandList( QWidget * parent = 0 ); ~CommandList(); void setLineEdit(QLineEdit *lineEdit); void setSession(Session *session); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); virtual QMenu *get_menu(); public slots: void set_list(QStringList list); void itemClicked (const QModelIndex & item ); void copy_clipboard_callback(); void contextMenu_cb( const QPoint & /*pos*/); void clean_history_callback(); void setProject(QString project); }; #endif qtoctave-0.10.1/qtoctave/src/generate_menu.h0000644000175000017500000001120511511434227020022 0ustar lucaslucas#ifndef __GENERATE_MENU_H__ #define __GENERATE_MENU_H__ #include "mainwindow.h" #include "octave_connection.h" #include "operations.h" #include #include #include #include #include #define MENU_TRANSLATE(s) QCoreApplication::translate("", s.toLocal8Bit().data()).toLocal8Bit().data() class MenuExtCallBack; /**This class generates new menus from dirs. */ class GenerateMenu:public QObject { Q_OBJECT public: GenerateMenu(MainWindow *mainwindow, Operations *operations); /** Set path to read menus entries. * @param path path to menus. */ void setPath(QString path); /** Load menus. Menus are read from path. */ void load_menu(); private: void load_menu(QString dir_name, QMenu *parent_menu); //Directorio en el que se encuentran los mens QString path; Operations *operations; MainWindow *mainwindow; /**Parse files with .menu extension.*/ bool process_menu_file(QString _file, QStringList & input_labels, QStringList & input_parameters, QStringList & output_labels, QStringList & output_parameters, QString & command, QString & menu_name, QString & help, bool & accept_blank_parameters, bool & auto_exec); MenuExtCallBack *process_menu_file(QString _file); /**Removes path from file_path.*/ QString menu_path(QString file_path); /**Finds icon for given menu.*/ QString find_icon(QString file_path, QString menu); }; /**Simple Callback for menus genetates using GenerateMenu. This callback is used when menu file is executable. When menu item is selected, menu file is executed and result is sent to OctaveConnection.*/ class MenuCallBack:public QObject { Q_OBJECT public: MenuCallBack(QString menu_name, OctaveConnection *oc); private: QProcess process; QString menu_name; QString output; OctaveConnection *octave_connection; public slots: void actions_callback(); void readyReadStandardOutput(); void finished( int exitCode, QProcess::ExitStatus exitStatus ); }; /**Callback for ".menu" files. See QtOctave doc for ".menu" files.*/ class MenuFileCallBack: public QObject { Q_OBJECT public: MenuFileCallBack(QString menu_name, OctaveConnection *oc, Operations *operations, QStringList & input_labels, QStringList & input_parameters, QStringList & output_labels, QStringList & output_parameters, QString & command, QString & help, bool & accept_blank_parameters); private: Operations *operations; QString menu_name; OctaveConnection *oc; QStringList input_parameters, output_parameters, output_labels, input_labels; QString command, help; bool accept_blank_parameters; public slots: void actions_callback(); }; //////////////////////////////////////////////////////////////////////////////////////////// /**Base class for input widgets in menus.*/ class InputWidget:public QWidget { Q_OBJECT public: InputWidget(QWidget *parent=0); virtual QString parameter()=0; }; /**Simple line edit for menus.*/ class LineEdit:public InputWidget { Q_OBJECT public: LineEdit(QString label, QWidget *parent=0); QLabel *label; QLineEdit *lineedit; QString parameter(); void setParameter(QString _parameter); }; /**Simple line edit and select file dialog for menus.*/ class FileEdit:public InputWidget { Q_OBJECT public: FileEdit(QString label, QWidget *parent=0); QLabel *label; QLineEdit *lineedit; QPushButton *file_button; QString parameter(); void setParameter(QString _parameter); public slots: void file_button_callback(); }; /**Simple combobox for menus.*/ class ComboBox:public InputWidget { Q_OBJECT public: ComboBox(QString label, QWidget *parent=0); QLabel *label; QComboBox *combobox; QString parameter(); void setParameter(QString _parameter); }; /**Callback for ".menu" files. See QtOctave doc for ".menu" files.*/ class MenuExtCallBack: public QWidget { Q_OBJECT public: MenuExtCallBack(QWidget *parent=0); void setOctaveConnection(OctaveConnection *oc); void addInput(InputWidget *input); void addOutput(InputWidget *output); void addHelp(QString help); void addCommand(QString command); void setAcceptBlankParameters(bool accept_blank_parameters); void setAutoExec(bool auto_exec_ok); private: OctaveConnection *oc; QList input, output; QString command, help; QGroupBox *input_box, *output_box; QWidget *input_area, *output_area; //QTextBrowser *help_widget; bool accept_blank_parameters; QPushButton *ok_button, *copy_clipboard_button, *help_button, *cancel_button; bool auto_exec_ok; QString generate_command(); public slots: void ok_button_callback(); void copy_clipboard_button_callback(); void cancel_button_callback(); void help_button_callback(); void actions_callback(); }; #endif qtoctave-0.10.1/qtoctave/src/config.cpp0000644000175000017500000000470311511434227017011 0ustar lucaslucas#include "config.h" #include #include #include #include #include #include static QMap config; static QMap load_config(const QString file) { QMap config; FILE *in=fopen(file.toLocal8Bit().data(),"r"); if(in==NULL) {printf ("%s no encontrado\n", file.toLocal8Bit().data() ); return config;} char buf[1024]; char *p, *parameter; char *value; while(!feof(in)) { if( fgets(buf,1024,in)==NULL) break; if(feof(in)) break; if(buf[0]=='#') continue; p=strchr(buf, '='); if( p!=NULL ) { *p='\0'; parameter=buf; value=p+1; QString qparameter(QString(parameter).trimmed()); QString qvalue(QString(value).trimmed()); if(config.value(parameter).isEmpty()) config[qparameter]=qvalue; else config[qparameter]=config[qparameter]+"\n"+qvalue; } } fclose(in); return config; } const QString get_config(QString parameter) { if (config.isEmpty()) { QMap global_config = load_config( QString(CONFIG_PATH) + "/config.rc"); QString home_config=QDir::homePath ()+"/.qtoctave"; if( !(QDir::home().exists(home_config)) ) { printf("Building .qtoctave user config\n"); QDir::home().mkdir(".qtoctave"); } home_config=home_config+"/config.rc"; QMap local_config = load_config(home_config); foreach( QString key, global_config.keys() ) { if( local_config.value(key).isEmpty() ) local_config[key]=global_config[key]; } config=local_config; } return config.value(parameter); } void set_config(QMap configuration) { QMapIterator k(configuration); while (k.hasNext()) { k.next(); if( !k.key().isEmpty() ) config[k.key().trimmed()]=k.value().trimmed(); } QString home_config=QDir::homePath ()+"/.qtoctave/config.rc"; QMap global_config = load_config( QString(CONFIG_PATH) + "/config.rc"); FILE *out=fopen(home_config.toLocal8Bit().data(),"w"); fprintf(out,"#QtOctave local configuration.\n"); QMapIterator i(config); while (i.hasNext()) { i.next(); if ( !i.key().isEmpty() && !i.value().isEmpty() && global_config[i.key()]!=i.value() ) { QStringList values=i.value().split("\n"); QString item; foreach(item, values) { fprintf(out,"%s=%s\n",i.key().toLocal8Bit().data(),item.toLocal8Bit().data()); } } } fclose(out); } qtoctave-0.10.1/qtoctave/src/qtoctave.pro0000644000175000017500000000401411511434227017403 0ustar lucaslucas###################################################################### # IMPORTANT: # ---------- # # This is used for translations # If you want to build the source, please, use CMAKE instead # ###################################################################### TRANSLATIONS = lang/qtoctave_es.ts CODECFORTR = UTF-8 CODECFORSRC = UTF-8 # Input HEADERS += autocomplete.h \ basewidget.h \ codeedit.h \ command_list.h \ config.h \ editor.h \ generate_menu.h \ help.h \ main.h \ mainwindow.h \ navigator.h \ numberedtextview.h \ octave_connection.h \ operations.h \ search_dialog.h \ session.h \ syntax.h \ table.h \ terminal.h \ variables_list.h \ window_list.h \ dynamic_help/dynamic_help.h \ operations/general_menu.h \ operations/table_plot.h \ projects/projects.h \ svgcanvas/svgcanvas.h FORMS += table_ui.ui \ operations/general_menu.ui \ projects/newprojectdialog.ui \ projects/projects.ui \ svgcanvas/export_to_dialog.ui SOURCES += autocomplete.cpp \ basewidget.cpp \ codeedit.cpp \ command_list.cpp \ config.cpp \ editor.cpp \ generate_menu.cpp \ help.cpp \ main.cpp \ mainwindow.cpp \ navigator.cpp \ numberedtextview.cpp \ octave_connection.cpp \ search_dialog.cpp \ session.cpp \ syntax.cpp \ table.cpp \ terminal.cpp \ variables_list.cpp \ window_list.cpp \ dynamic_help/dynamic_help.cpp \ operations/general_menu.cpp \ operations/operations.cpp \ operations/plot.cpp \ operations/table_plot.cpp \ projects/projects.cpp \ svgcanvas/svgcanvas.cpp qtoctave-0.10.1/qtoctave/src/search_dialog.h0000644000175000017500000000336711511434227020002 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __SEARCH_DIALOG_H__ #define __SEARCH_DIALOG_H__ #include #include #include #include #include #include #include #include "config.h" class SearchDialog: public QDialog { Q_OBJECT private: QLineEdit *search, *replace; QCheckBox *searchRegExp, *caseSensitiveCB, *wholeWordsCB, *fromCursorCB; public: // Constructor SearchDialog(QWidget *parent=0); ~SearchDialog(); // Strings inline QString searchString() { return search->text(); } inline QString replaceString() { return replace->text(); } // Options inline bool searchStringIsRegExp() { return searchRegExp->checkState(); } inline bool caseSensitive() { return caseSensitiveCB->checkState(); } inline bool wholeWords() { return wholeWordsCB->checkState(); } inline bool fromCursor() { return fromCursorCB->checkState(); } // Signals signals: void search_signal(); void replace_signal(); }; #endif qtoctave-0.10.1/qtoctave/src/help.cpp0000644000175000017500000001126711511434227016477 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "help.h" #include #include #include #include #include #include #include #include #include "config.h" Help::Help( QWidget * parent):BaseWidget(parent) { widget_type=HELP; setWindowIcon( QIcon( QString( ICON_PATH )+"/help.png" ) ); setWindowTitle(tr("Help")); vlayout=new QVBoxLayout(); vlayout->setSpacing(0); vlayout->setMargin(0); centralWidget()->setLayout(vlayout); create_buttons(); browser=new QTextBrowser(this); vlayout->addWidget(browser); browser->show(); } void Help::setSource(const QString source, QString anchor) { QFileInfo src(source); browser->setSource( QUrl::fromLocalFile( src.canonicalFilePath() ) ); this->source=source; browser->scrollToAnchor(anchor); } void Help::create_buttons() { toolbar = addToolBar(tr("Navigation")); //toolbar->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Minimum); QAction *_back = new QAction( QIcon( QString( ICON_PATH )+"/back.png" ), tr("&Back"), this ); connect( _back, SIGNAL( triggered() ) , this, SLOT( back() ) ); toolbar->addAction(_back); QAction *_forward = new QAction(QPixmap( QString( ICON_PATH )+"/forward.png"),tr("&Forward"),this); connect( _forward, SIGNAL( triggered() ) , this, SLOT( forward() ) ); toolbar->addAction(_forward); QAction *_go_home = new QAction(QPixmap( QString( ICON_PATH )+"/gohome.png"),tr("&Go home"),this); connect( _go_home, SIGNAL( triggered() ) , this, SLOT( go_home() ) ); toolbar->addAction(_go_home); search_button=new QPushButton(QPixmap( QString( ICON_PATH )+"/find.png"), "Search:", this); toolbar->addWidget(search_button); search_button->show(); connect(search_button,SIGNAL(clicked()),this,SLOT(find())); lineedit=new QLineEdit(toolbar); toolbar->addWidget(lineedit); lineedit->show(); connect(lineedit,SIGNAL(returnPressed()),this,SLOT(find())); connect( lineedit, SIGNAL( textChanged ( const QString &) ) , this, SLOT( textChanged ( const QString &) ) ); check_box=new QCheckBox("Search in this page.", toolbar); toolbar->addWidget(check_box); check_box->show(); vlayout->addWidget(toolbar); } void Help::back() { browser->backward(); } void Help::forward() { browser->forward(); } void Help::go_home() { browser->home(); } /**Simula un grep para el directorio dado.*/ static void grep(QString & out, QDir & path, const QString text) { QStringList list=path.entryList(QStringList("*.html")); QByteArray target_word=text.toLocal8Bit(); QString line; for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { QString filename=path.path()+"/"+(*it); QFile in(filename); if(!in.open(QFile::ReadOnly)) continue; int start=-1, end=-1; QRegExp tag_re("<.*>"); while (!in.atEnd()) { line=in.readLine(); line.replace(tag_re, ""); while( (start=line.indexOf('<'))>=0 ) { while( (end=line.indexOf('>'))<0 ) { line+=in.readLine(); } line.replace(tag_re, ""); } if( line.contains(target_word) ) { line.replace(target_word, ""+target_word+""); out+=""+filename+"
\n"; out+=QString(line).trimmed()+QString("

\n"); break; } } in.close(); } } void Help::find() { if(check_box->isChecked()) { bool found = browser->find(lineedit->text()); if(found) { browser->ensureCursorVisible(); } return; } QFileInfo fileinfo(source); QDir path(fileinfo.absoluteDir()); QString out("Results for "+QString(lineedit->text())+"

\n"); grep(out,path,QString(lineedit->text())); out+=""; browser->setHtml(out); } void Help::textChanged ( const QString & text ) { emit dynamic_help_required(text); } Help::~Help ( ) { } BaseWidget *Help::copyBaseWidget(QWidget * parent ) { Help *bw=new Help(parent); bw->setSession(session); bw->setSource(source); bw->browser->setHtml(browser->toHtml()); return bw; } qtoctave-0.10.1/qtoctave/src/mainwindow.cpp0000644000175000017500000006546111511434227017730 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ //#include #include #include #include #include #include #include #include #include #include #include "mainwindow.h" #include "navigator.h" #include "editor.h" #include "terminal.h" #include "config.h" MainWindow::MainWindow(OctaveConnection *oc, Session *session, QWidget *parent):BaseWidget(parent) { widget_type=MAINWINDOW; setSession(session); setWindowIcon(QIcon(QString(ICON_PATH) + "/qtoctave.png")); menuBar()->clear(); setWindowTitle("QtOctave ["+session->getProjectName()+"]"); //resize(QSize(800, 600).expandedTo(minimumSizeHint())); this->octave_connection=oc; setAttribute(Qt::WA_DeleteOnClose); createActions(); closeMessage = new QMessageBox("QtOctave", tr("Your changes will have effect, when QtOctave reboot.\ \n Do you want to do it?"), QMessageBox::Question, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::NoButton , this, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); work_space = new QMdiArea(this); work_space->setHorizontalScrollBarPolicy (Qt::ScrollBarAsNeeded); work_space->setVerticalScrollBarPolicy (Qt::ScrollBarAsNeeded); work_space->show(); setCentralWidget(work_space); createMenus(); createStatusBar(); createToolBars(); } //init the actions void MainWindow::createActions() { actionRunFile = new QAction(this); actionRunFile->setIcon(QIcon(QString( ICON_PATH ) + "/run.png")); actionRunFile->setText(QApplication::tr("Run an Octave Script")); actionOctave_help = new QAction(this); actionOctave_help->setIcon(QIcon(QString( ICON_PATH )+"/help.png")); actionOctave_help->setText(QApplication::tr("Octave Help")); actionOctave_help->setShortcut(QKeySequence::HelpContents); actionTable = new QAction(this); actionTable->setIcon(QIcon(QString( ICON_PATH )+"/table.png")); actionTable->setText(QApplication::tr("Table")); actionEditor = new QAction(this); actionEditor->setIcon(QIcon(QString( ICON_PATH )+"/xedit.png")); actionEditor->setText(QApplication::tr("Editor")); actionProjects = new QAction(this); actionProjects->setIcon(QIcon(QString( ICON_PATH )+"/contents.png")); actionProjects->setText(QApplication::tr("Projects")); actionCompletionMatches= new QAction(this); actionCompletionMatches->setIcon(QIcon(QString( ICON_PATH )+"/search.png")); actionCompletionMatches->setText(QApplication::tr("Completion matches:
Generates possible completions given in comand line.")); actionDynamicHelp= new QAction(this); actionDynamicHelp->setIcon(QIcon(QString( ICON_PATH )+"/help_index.png")); actionDynamicHelp->setText(QApplication::tr("Dynamic Help: Shows help of completions matches.")); actionStopProcess= new QAction(this); actionStopProcess->setIcon(QIcon(QString( ICON_PATH )+"/button_cancel.png")); actionStopProcess->setText(QApplication::tr("Stops process:
Stops uncontroled process, infinite loops,...")); actionClearTerminal= new QAction(this); actionClearTerminal->setIcon(QIcon(QString( ICON_PATH )+ "/eraser.png")); actionClearTerminal->setText(QApplication::tr("Clear terminal")); actionVariableList= new QAction(this); actionVariableList->setIcon(QIcon(QString( ICON_PATH )+ "/taskbar.png")); actionVariableList->setText(QApplication::tr("Variable List")); actionNavigator= new QAction(this); actionNavigator->setIcon(QIcon(QString( ICON_PATH )+ "/new_folder.png")); actionNavigator->setText(QApplication::tr("Navigator")); createAction("actionCommandList", tr("Command List"), (QString( ICON_PATH )+ "/news_section.png")); //Toolbars actions //actionToolBarDocks = new QAction("Docks", this); //actionToolBarDocks->setCheckable(true); //actionToolBarDocks->setChecked(true); //actionToolBarRun = new QAction("Terminal", this); //actionToolBarRun->setCheckable(true); //actionToolBarRun->setChecked(true); //actionToolBarMatrix = new QAction("Matrix", this); //actionToolBarMatrix->setCheckable(true); //actionToolBarMatrix->setChecked(true); //actionToolBarHelp = new QAction("Help", this); //actionToolBarHelp->setCheckable(true); //actionToolBarHelp->setChecked(true); actionSaveWindowsLayout= new QAction(this); actionSaveWindowsLayout->setText(QApplication::tr("Save actual windows layout")); actionDeleteWindowsLayout= new QAction(this); actionDeleteWindowsLayout->setText(QApplication::tr("Delete some windows layout")); //Matrix actions actionInverse = new QAction(this); actionInverse->setText(QApplication::tr("Inverse")); actionDeterminant = new QAction(this); actionDeterminant->setText(QApplication::tr("Determinant")); actionEigenvalues = new QAction(this); actionEigenvalues->setText(QApplication::tr("Eigenvalues and eigenvectors")); actionTranspose = new QAction(this); actionTranspose->setText(QApplication::tr("Transpose")); actionSubmatrix = new QAction(this); actionSubmatrix->setText(QApplication::tr("Submatrix")); actionMean = new QAction(this); actionMean->setText(QApplication::tr("Mean")); actionMedian = new QAction(this); actionMedian->setText(QApplication::tr("Median")); actionStd = new QAction(this); actionStd->setText(QApplication::tr("Standard Deviation")); actionCov = new QAction(this); actionCov->setText(QApplication::tr("Covariance")); actionCorrcoef = new QAction(this); actionCorrcoef->setText(QApplication::tr("Correlation Coefficient")); //Plot actions actionPlot = new QAction(this); actionPlot->setText(QApplication::tr("Plot")); actionPolar = new QAction(this); actionPolar->setText(QApplication::tr("Polar")); actionSemilogy = new QAction(this); actionSemilogy->setText(QApplication::tr("Log scale for the y axis")); actionSemilogx = new QAction(this); actionSemilogx->setText(QApplication::tr("Log scale for the x axis")); actionLogLog = new QAction(this); actionLogLog->setText(QApplication::tr("Log scale for the x and y axis")); actionAxis = new QAction(this); actionAxis->setText(QApplication::tr("Axis scale")); actionTitleLabel = new QAction(this); actionTitleLabel->setText(QApplication::tr("Title and labels")); actionSvgCanvas = new QAction(this); actionSvgCanvas->setText(QApplication::tr("Svg Canvas")); //actionToEPS = new QAction(this); //actionToEPS->setText(QApplication::tr("EPS")); //actionToPDF = new QAction(this); //actionToPDF->setText(QApplication::tr("PDF")); //actionToPNG = new QAction(this); //actionToPNG->setText(QApplication::tr("PNG")); //Config actions actionGeneralConfig = new QAction(this); actionGeneralConfig->setText(QApplication::tr("General configuration")); createAction("qtoctave_pkg", tr("Install Octave packages")); //connect the actions //connect(actionToolBarDocks, SIGNAL(triggered()), this, SLOT(setVisibleToolBarDocks())); //connect(actionToolBarRun, SIGNAL(triggered()), this, SLOT(setVisibleToolBarRun())); //connect(actionToolBarMatrix, SIGNAL(triggered()), this, SLOT(setVisibleToolBarMatrix())); //connect(actionToolBarHelp, SIGNAL(triggered()), this, SLOT(setVisibleToolBarHelp())); //connect(actionModeWorkspace, SIGNAL(triggered()), this, SLOT(setModeWorkSpace())); //connect(actionModeDock, SIGNAL(triggered()), this, SLOT(setModeDock())); //connect(actionModeSDI, SIGNAL(triggered()), this, SLOT(setModeSDI())); } void MainWindow::createMenus() { //menubar = new QMenuBar(this); menubar = menuBar(); menuFile = createMenu(QString("/File"),QApplication::tr("File")); menuHelp = createMenu("/Help", QApplication::tr("Help")); menuData = createMenu("/Data", QApplication::tr("Data")); menuMatrix = createMenu("/Matrix", QApplication::tr("Matrix")); menuTools = createMenu("/Tools", QApplication::tr("Tools")); menuStatistics = createMenu("/Statistics", QApplication::tr("Statistics")); menuPlot = createMenu("/Plot", QApplication::tr("Plot")); //menuExport = createMenu("/Plot/Export to...", QApplication::tr("Export to...")); menu2DPlot = createMenu("/Plot/2D...", QApplication::tr("2D...")); menuConfig = createMenu("/Config", QApplication::tr("Config")); menuView = createMenu("/View",QApplication::tr("View")); menuDocks = createMenu("/Docks", QApplication::tr("Dock Tools")); menuWindowsLayout = createMenu("/View/WindowsLayout",QApplication::tr("Windows Layout")); //Connects menuView with trigger to control menuWindowsLayout connect(menuView, SIGNAL(triggered ( QAction *)), this, SLOT(setWindowsLayout(QAction *))); //menuToolbars = createMenu("/Toolbars",QApplication::tr("Toolbars")); //Shows checks of visible toolbars //connect(menuToolbars, SIGNAL(triggered(QAction * )), this, SLOT(setVisibleToolBars(QAction * ))); //setMenuBar(menubar); //Add actions to menubar menubar->addAction(menuFile->menuAction()); menubar->addAction(menuData->menuAction()); menubar->addAction(menuMatrix->menuAction()); menubar->addAction(menuStatistics->menuAction()); menubar->addAction(menuPlot->menuAction()); menubar->addAction(menuView->menuAction()); menuFile->addAction(actionProjects); menuFile->addAction(actionRunFile); menuFile->addAction(createAction("cd", tr("Change Directory"))); menuFile->addAction(createAction("exit", tr("Quit"), QString( ICON_PATH ) + "/exit.png")); //Builds/Destroys menu View connect(menuView,SIGNAL(aboutToShow ()), this, SLOT(showSetVisibleObjects()) ); connect(menuView,SIGNAL(aboutToHide ()), this, SLOT(hideSetVisibleObjects()) ); menuData->addAction(actionTable); menuMatrix->addAction(createAction("+","A+B")); menuMatrix->addAction(createAction("*","A*B")); menuMatrix->addAction(createAction("**", tr("A**n Exponential"))); menuMatrix->addAction(actionDeterminant); menuMatrix->addAction(actionEigenvalues); menuMatrix->addAction(actionInverse); menuMatrix->addAction(actionTranspose); menuMatrix->addAction(actionSubmatrix); menuStatistics->addAction(actionMean); menuStatistics->addAction(actionMedian); menuStatistics->addAction(actionStd); menuStatistics->addAction(actionCov); menuStatistics->addAction(actionCorrcoef); menuStatistics->addAction(createAction("hist", tr("Histogram"))); //menuPlot->addAction(menuExport->menuAction()); menuPlot->addAction(menu2DPlot->menuAction()); menuPlot->addAction(createMenu("menu3DPlot","3D...")->menuAction()); menu2DPlot->addAction(actionPlot); menu2DPlot->addAction(actionPolar); menu2DPlot->addAction(actionLogLog); menu2DPlot->addAction(actionSemilogy); menu2DPlot->addAction(actionSemilogx); menu2DPlot->addAction(createAction("errorbar", tr("Error Bars"))); menu2DPlot->addAction(createAction("hist", tr("Histogram"))); menu2DPlot->addAction(createAction("bar", tr("Bar graph"))); menus.value("menu3DPlot")->addAction( createAction("mesh", tr("Plot of three-dimensional surface"))); menus.value("menu3DPlot")->addAction( createAction("contour", tr("Contour plot of three-dimensional surface"))); menuPlot->addAction(actionAxis); menuPlot->addAction(actionTitleLabel); menuPlot->addAction(actionSvgCanvas); } void MainWindow::createMenuTools() { BaseWidget *w=(BaseWidget*)session->getFirstTool(COMMANDLIST); if(w!=NULL && w->get_menu()!=NULL) menuTools->addMenu(w->get_menu()); w=(BaseWidget*)session->getFirstTool(VARIABLESLIST); if(w!=NULL && w->get_menu()!=NULL) menuTools->addMenu(w->get_menu()); } void MainWindow::createMenuView() { menuView->clear(); menuView->addAction(actionClearTerminal); menuView->addMenu(menuDocks); menuDocks->clear(); menuDocks->addAction(actionEditor); menuDocks->addAction(actionVariableList); menuDocks->addAction(actionNavigator); menuDocks->addAction(actions["actionCommandList"]); menuView->addMenu(menuWindowsLayout); menuWindowsLayout->clear(); menuWindowsLayout->addAction(actionSaveWindowsLayout); menuWindowsLayout->addAction(actionDeleteWindowsLayout); menuWindowsLayout->addSeparator(); QString home=QDir::home().path()+"/.qtoctave/"; { QFile file(home+"windows_layout.xml"); if( file.open(QIODevice::ReadOnly | QIODevice::Text) ) { QXmlStreamReader xml(&file); while (!xml.atEnd()) { xml.readNext(); if( xml.isStartElement() ) { if(xml.name()=="tools_config") { QXmlStreamAttributes attr=xml.attributes(); QString name=attr.value("name").toString(); if( ! name.isEmpty() ) { QAction *action=createAction("WindowsLayout "+name,name); action->setData(name); menuWindowsLayout->addAction(action); } } } } file.close(); } } //Put checks in View/Mode menus //actionModeWorkspace->setCheckable(true); //actionModeWorkspace->setChecked(true); QMenu *objects=createPopupMenu(); objects->setTitle(tr("Show/Hide Objects")); menuView->addMenu(objects); } void MainWindow::createStatusBar() { statusbar = new QStatusBar(this); //statusbar->setGeometry(QRect(0, 396, 503, 22)); setStatusBar(statusbar); } void MainWindow::createToolBars() { toolBarRun = new QToolBar(tr("Terminal Run"), this) ; //toolBarRun->setOrientation(Qt::Horizontal); addToolBar(static_cast(4), toolBarRun); toolBarRun->setObjectName("ToolBar: Terminal Run"); toolBarMatrix = new QToolBar(tr("Matrix"), this); //toolBarMatrix->setOrientation(Qt::Horizontal); addToolBar(static_cast(4), toolBarMatrix); toolBarMatrix->setObjectName("ToolBar: Matrix"); toolBarHelp = new QToolBar(tr("Help"), this); addToolBar(static_cast(4), toolBarHelp); toolBarHelp->setObjectName("ToolBar: Help"); toolBarDocks = new QToolBar(tr("Docks"),this); toolBarDocks->setOrientation(Qt::Horizontal); addToolBar(static_cast(4), toolBarDocks); toolBarDocks->setObjectName("ToolBar: Docks"); //add to the toolbar docks toolBarDocks->addAction(actionEditor); toolBarDocks->addAction(actionVariableList); toolBarDocks->addAction(actionNavigator); toolBarDocks->addAction(actions["actionCommandList"]); //add to the toolbar Matrix toolBarMatrix->addAction(actionTable); //toolBar->addSeparator(); //add to the toolbar Help toolBarHelp->addAction(actionOctave_help); toolBarHelp->addAction(actionDynamicHelp); toolBarHelp->addAction(actionCompletionMatches); //toolBar->addSeparator(); //add to the toolbar run toolBarRun->addAction(actionRunFile); toolBarRun->addAction(actionStopProcess); toolBarRun->addAction(actionClearTerminal); //toolBar->addSeparator(); } QAction *MainWindow::createAction(QString action_name, QString name, QString icon) { return createAction(action_name, name.toLocal8Bit().data(), icon); } QAction *MainWindow::createAction(QString action_name, const char *name, QString icon) { if( actions.contains(action_name) ) return actions[action_name]; QAction *a = new QAction(this); if( !icon.isEmpty() ) a->setIcon(QIcon(icon)); a->setText(QApplication::tr(name)); actions[action_name]=a; return a; } QMenu *MainWindow::createMenu(QString menu_name, QString name, QString icon) { return createMenu(menu_name, name.toLocal8Bit().data(), icon); } QMenu *MainWindow::createMenu(QString menu_name, const char *name, QString icon) { if( menus.contains(menu_name) ) return menus[menu_name]; QMenu *a = new QMenu(menubar); if(!icon.isEmpty()) a->setIcon(QIcon(icon)); a->setTitle(QApplication::tr(name)); menus[menu_name]=a; return a; } void MainWindow::clear_menu() { menubar->clear(); } void MainWindow::show_config_help_menus() { menubar->addAction(menuConfig->menuAction()); menubar->addAction(menuHelp->menuAction()); menuConfig->addAction(actionGeneralConfig); menuConfig->addAction( createAction("qtoctave_pkg", tr("Install Octave packages")) ); menuHelp->addAction(actionOctave_help); menuHelp->addAction(actionDynamicHelp); menuHelp->addAction(createAction("qtoctave_help", tr("QtOctave Help"))); menuHelp->addAction(createAction("qtoctave_about", tr("About"))); } void MainWindow::createDockWindows() { //Editor dock and Terminal , only if the mode from work area is dock } void MainWindow::setWindowsLayout(QAction *action) { printf("[MainWindow::setWindowsLayout] \n"); if(action==actionSaveWindowsLayout) { printf("[MainWindow::setWindowsLayout] Starting saving\n"); bool ok; QString config_name = QInputDialog::getText(this, tr("Name for layout"), tr("Name:"), QLineEdit::Normal, "", &ok); if (ok && !config_name.isEmpty()) { config_name="/View/WindowsLayout/"+config_name; //Add last_windows_layout.xml to windows_layout.xml QString home=QDir::home().path()+"/.qtoctave/"; { QFile file(home+"last_windows_layout.xml"); file.open(QIODevice::WriteOnly | QIODevice::Text); QXmlStreamWriter xml(&file); xml.setAutoFormatting(true); xmlWindowsPositions("last_windows_layout",xml); file.close(); } QByteArray result; QXmlStreamWriter xml(&result); xml.setAutoFormatting(true); xml.writeStartDocument(); QFile wl_file(home+"windows_layout.xml"); if(wl_file.open(QIODevice::ReadOnly | QIODevice::Text)) { QXmlStreamReader wl_xml(&wl_file); while (!wl_xml.atEnd()) { wl_xml.readNext(); if( wl_xml.isStartElement() ) { if(wl_xml.name()=="tools_config") { QXmlStreamAttributes attr=wl_xml.attributes(); QString name=attr.value("name").toString(); if(name==config_name) { while (!wl_xml.atEnd()) { wl_xml.readNext(); if( wl_xml.isEndElement() ) { if(wl_xml.name()=="tools_config") break; } } } else { xml.writeStartElement(wl_xml.name().toString()); xml.writeAttribute("name", name); } } else if(wl_xml.name()=="state") { xml.writeStartElement(wl_xml.name().toString()); xml.writeCharacters(wl_xml.readElementText()); xml.writeEndElement(); } else { xml.writeStartElement(wl_xml.name().toString()); QXmlStreamAttributes attr=wl_xml.attributes(); xml.writeAttributes(attr); } } else if( wl_xml.isEndElement() ) { if(wl_xml.name()=="windows_layouts") { } else xml.writeEndElement(); } } wl_file.close(); } else xml.writeStartElement("windows_layouts"); QFile last_wl_file(home+"last_windows_layout.xml"); if(!last_wl_file.open(QIODevice::ReadOnly | QIODevice::Text)) { printf("last_windows_layout.xml couldn't be opened\n"); return; } QXmlStreamReader last_wl_xml(&last_wl_file); while (!last_wl_xml.atEnd()) { last_wl_xml.readNext(); if( last_wl_xml.isStartElement() ) { if(last_wl_xml.name()=="tools_config") { xml.writeStartElement(last_wl_xml.name().toString()); xml.writeAttribute("name", config_name); } else if(last_wl_xml.name()=="state") { xml.writeStartElement(last_wl_xml.name().toString()); xml.writeCharacters(last_wl_xml.readElementText()); xml.writeEndElement(); } else { xml.writeStartElement(last_wl_xml.name().toString()); QXmlStreamAttributes attr=last_wl_xml.attributes(); xml.writeAttributes(attr); } } else if( last_wl_xml.isEndElement() ) { xml.writeEndElement(); } } last_wl_file.close(); xml.writeEndElement(); xml.writeEndDocument(); //printf("Layout %s\n", result.data()); QFile file(home+"windows_layout.xml"); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; file.write(result); file.close(); } } else if(action==actionDeleteWindowsLayout) { QDialog delete_wl_dialog(this); delete_wl_dialog.setWindowTitle(tr("Delete windows' layout")); QVBoxLayout *vbox=new QVBoxLayout; delete_wl_dialog.setLayout(vbox); QLabel *label=new QLabel("Select layout to delete:",&delete_wl_dialog); vbox->addWidget(label); label->show(); QListWidget *listWidget = new QListWidget(&delete_wl_dialog); vbox->addWidget(listWidget); listWidget->show(); QHBoxLayout *hbox=new QHBoxLayout; vbox->addLayout(hbox); QPushButton *ok_button=new QPushButton(tr("Delete"), &delete_wl_dialog ); hbox->addWidget(ok_button); ok_button->show(); QPushButton *cancel_button=new QPushButton(tr("Cancel"), &delete_wl_dialog ); hbox->addWidget(cancel_button); cancel_button->show(); cancel_button->setDefault(true); connect(ok_button, SIGNAL(clicked()), &delete_wl_dialog, SLOT(accept()) ); connect(cancel_button, SIGNAL(clicked()), &delete_wl_dialog, SLOT(reject()) ); QString home=QDir::home().path()+"/.qtoctave/"; { //Fills list of windows' layouts QFile wl_file(home+"windows_layout.xml"); if(wl_file.open(QIODevice::ReadOnly | QIODevice::Text)) { QXmlStreamReader wl_xml(&wl_file); while (!wl_xml.atEnd()) { wl_xml.readNext(); if( wl_xml.isStartElement() ) { if(wl_xml.name()=="tools_config") { QXmlStreamAttributes attr=wl_xml.attributes(); QString name=attr.value("name").toString(); new QListWidgetItem(name, listWidget); } } } wl_file.close(); } } int ok=delete_wl_dialog.exec(); if(ok==QDialog::Accepted) { QListWidgetItem *item=listWidget->currentItem(); QString config_name=item->data(Qt::DisplayRole).toString(); QByteArray result; QXmlStreamWriter xml(&result); xml.setAutoFormatting(true); xml.writeStartDocument(); QFile wl_file(home+"windows_layout.xml"); if(wl_file.open(QIODevice::ReadOnly | QIODevice::Text)) { QXmlStreamReader wl_xml(&wl_file); while (!wl_xml.atEnd()) { wl_xml.readNext(); if( wl_xml.isStartElement() ) { if(wl_xml.name()=="tools_config") { QXmlStreamAttributes attr=wl_xml.attributes(); QString name=attr.value("name").toString(); if(name==config_name) { while (!wl_xml.atEnd()) { wl_xml.readNext(); if( wl_xml.isEndElement() ) { if(wl_xml.name()=="tools_config") break; } } } else { xml.writeStartElement(wl_xml.name().toString()); xml.writeAttribute("name", name); } } else if(wl_xml.name()=="state") { xml.writeStartElement(wl_xml.name().toString()); xml.writeCharacters(wl_xml.readElementText()); xml.writeEndElement(); } else { xml.writeStartElement(wl_xml.name().toString()); QXmlStreamAttributes attr=wl_xml.attributes(); xml.writeAttributes(attr); } } else if( wl_xml.isEndElement() ) { xml.writeEndElement(); } } wl_file.close(); } xml.writeEndDocument(); QFile file(home+"windows_layout.xml"); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; file.write(result); file.close(); } } else { QString config_name=action->data().toString(); if(config_name.startsWith("/View/WindowsLayout/")) { QMap windowSettings; windowSettings["mode_work_area"]=config_name; set_config(windowSettings); if(closeMessage->exec() == QMessageBox::Yes) close(); } } } void MainWindow::closeEvent(QCloseEvent *event) { int ok=QMessageBox::question(this, tr("Close"), tr("You are going to close all QtOctave's windows. Are you sure?"), QMessageBox::Yes, QMessageBox::No ); if(ok!=QMessageBox::Yes) { event->ignore (); return; } QString home=QDir::home().path()+"/.qtoctave/"; { QFile file(home+"last_windows_layout.xml"); file.open(QIODevice::WriteOnly | QIODevice::Text); QXmlStreamWriter xml(&file); xml.setAutoFormatting(true); xmlWindowsPositions("last_windows_layout",xml); file.close(); } Terminal *terminal=(Terminal *)session->getFirstTool(TERMINAL); terminal->saveVariables(); ok=QMessageBox::information (this, tr("Close"), tr("Octave is saving data. Press ok at end.") ); foreach (QWidget *widget, QApplication::topLevelWidgets()) { if(widget!=this) widget->close(); } set_config(windowSettings); QApplication::quit(); //exit(0); } void MainWindow::showSetVisibleObjects() { createMenuView(); createMenuTools(); } void MainWindow::hideSetVisibleObjects() { menuView->clear(); menuWindowsLayout->clear(); menuDocks->clear(); } BaseWidget *MainWindow::copyBaseWidget( QWidget * parent ) { return NULL; } static void writeXMLBaseWidget(BaseWidget *bw, QString parent, QXmlStreamWriter &xml) { xml.writeStartElement("tool"); xml.writeAttribute("type", widgetName(bw->widgetType())); if(parent == "workspace") { xml.writeAttribute("xPosition", QString::number(bw->parentWidget()->pos().x()) ); xml.writeAttribute("yPosition", QString::number(bw->parentWidget()->pos().y()) ); xml.writeAttribute("width", QString::number(bw->parentWidget()->rect().width()) ); xml.writeAttribute("height", QString::number(bw->parentWidget()->rect().height()) ); xml.writeAttribute("maximized", (bw->parentWidget()->isMaximized())?QString("true"):QString("false") ); xml.writeAttribute("minimized", (bw->parentWidget()->isMinimized())?QString("true"):QString("false") ); } if( !parent.isEmpty() ) xml.writeAttribute("place", parent); QVector docks=bw->getDocks(); for(int i=0;iwidget(); if(bw!=NULL) writeXMLBaseWidget(_bw, "", xml); } bw->toXML(xml); xml.writeStartElement("state"); QString state_string( bw->saveState().toHex() ); xml.writeCharacters(state_string); xml.writeEndElement(); xml.writeEndElement(); } static QVector parentBaseWidgets(Session *session) { QVector parents; QVector tools=session->getTools(); QVector main_tools=session->getTools(MAIN); for(int i=0;iparent()==NULL) parents << (BaseWidget*)tools[i]; } return parents; } void MainWindow::xmlWindowsPositions(QString config_name, QXmlStreamWriter &xml) { QVector tools; xml.writeStartDocument(); xml.writeStartElement("tools_config"); xml.writeAttribute("name", config_name); QList work_space_tools=work_space->subWindowList(); for(int i=0;iwidget()); if(bw!=NULL) writeXMLBaseWidget(bw, "workspace", xml); } QVector parents=parentBaseWidgets(session); for(int i=0;i #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "octave_connection.h" #include "variables_list.h" #include "navigator.h" /* * Represents and creates main window. This class is only for creates main window interface, * menus and menus actions. Menus callbacks are implemented in Operations class.
* Menus and actions can be added to this class or using createAction and createMenu methods. * @see GenerateMenu for user menus. * @see Operations class for actions callbacks. * @see createAction, createMenu */ class MainWindow:public BaseWidget { Q_OBJECT public: //General actions QAction *actionRunFile; QAction *actionOctave_help; QAction *actionTable; QAction *actionEditor; QAction *actionProjects; QAction *actionOpenMFile; QAction *actionCompletionMatches; QAction *actionDynamicHelp; QAction *actionStopProcess; QAction *actionClearTerminal; QAction *actionVariableList; QAction *actionNavigator; //Matrix actions QAction *actionInverse; QAction *actionDeterminant; QAction *actionEigenvalues; QAction *actionTranspose; QAction *actionSubmatrix; //Statistics actions QAction *actionMean; QAction *actionMedian; QAction *actionStd; QAction *actionCov; QAction *actionCorrcoef; //Plot actions QAction *actionPlot; QAction *actionPolar; QAction *actionSemilogy; QAction *actionSemilogx; QAction *actionLogLog; QAction *actionAxis; QAction *actionTitleLabel; QAction *actionSvgCanvas; QMenu *menu2DPlot; //QMenu *menuExport; //QAction *actionToEPS; //QAction *actionToPDF; //QAction *actionToPNG; //Config actions QAction *actionGeneralConfig; /**Main window work space.*/ QMdiArea *work_space; /**Main window menu bar.*/ QMenuBar *menubar; QMenu *menuFile; //QMenu *menuEdit; QMenu *menuData; QMenu *menuMatrix; QMenu *menuStatistics; QMenu *menuPlot; QMenu *menuConfig; QMenu *menuHelp; QMenu *menuView; QMenu *menuDocks; QMenu *menuWindowsLayout; QMenu *menuTools; //QMenu *menuToolbars; //actions to set view toolbars //QAction *actionToolBarDocks; //QAction *actionToolBarRun; //QAction *actionToolBarMatrix; //QAction *actionToolBarHelp; QAction *actionSaveWindowsLayout; QAction *actionDeleteWindowsLayout; /**tool bars*/ QToolBar *toolBarDocks; QToolBar *toolBarRun; QToolBar *toolBarMatrix; QToolBar *toolBarHelp; /**Main window status bar.*/ QStatusBar *statusbar; //navigator Navigator *nav; //Docks QDockWidget *dockListVar; QDockWidget *dockNavigator; QDockWidget *dockEditor; QDockWidget *dockTerminal; QDockWidget *dockCommandHistory; /**Creates new MainWindow. * @param oc OctaveConnection created in terminal. * @param session Session of this session. * @param parent parent widget. */ MainWindow(OctaveConnection *oc, Session *session, QWidget *parent=0); /**Clears all menus. */ void clear_menu(); /**Show config and help menus*/ void show_config_help_menus(); /**This a QMap of menu actions. You can create menu actions using createAction method. * @see createAction. */ QMap actions; /**Creates new action. Actions are added to actions variable. * @param action_name Name of action. Only for internal use. * @param name Label of action in menues. * @param icon Icon path of action in menues. * @return New action. * @see actions. */ QAction *createAction(QString action_name, const char *name, QString icon=QString()); QAction *createAction(QString action_name, QString name, QString icon=QString()); /**This a QMap of menus. You can create menu using createMenu method. * @see createMenu. */ QMap menus; /**Creates new menu. Menus are added to menus variable. * @param action_name Name of menu. Only for internal use. * @param name Label of menu. * @param icon Icon path of menu. * @return New menu. * @see menus. */ QMenu *createMenu(QString menu_name, const char *name, QString icon=QString()); QMenu *createMenu(QString menu_name, QString name, QString icon=QString()); /** Connection to Octave terminal. Useful for send commands to Octave and see * results in terminal. */ OctaveConnection *octave_connection; //Session *session; BaseWidget *copyBaseWidget( QWidget * parent = 0 ); /**Windows positions of tools and their docks.*/ void xmlWindowsPositions(QString config_name, QXmlStreamWriter &xml); private: QMessageBox *closeMessage; QMap windowSettings; void createActions(); void createMenus(); void createMenuView(); void createMenuTools(); void createStatusBar(); void createToolBars(); void createDockWindows(); protected: void closeEvent(QCloseEvent *event); private slots: //void setVisibleToolBarDocks(); //void setVisibleToolBarRun(); //void setVisibleToolBarMatrix(); //void setVisibleToolBarHelp(); //void setModeWorkSpace(); //void setModeDock(); //void setModeSDI(); void setWindowsLayout(QAction *); void showSetVisibleObjects(); void hideSetVisibleObjects(); }; #endif qtoctave-0.10.1/qtoctave/src/variables_list.cpp0000644000175000017500000002246711511434227020556 0ustar lucaslucas#include "variables_list.h" #include "main.h" #include #include #include #include VariableList::VariableList(QWidget * parent):BaseWidget(parent) { widget_type=VARIABLESLIST; setWindowIcon( QIcon( QString( ICON_PATH )+"/taskbar.png" ) ); setWindowTitle(tr("Variables' List")); QVBoxLayout *vbox=new QVBoxLayout; centralWidget()->setLayout(vbox); QHBoxLayout *hbox=new QHBoxLayout; vbox->addLayout(hbox); menu_bar=menuBar(); regexp_lineEdit=new QLineEdit(this); regexp_lineEdit->show(); connect(regexp_lineEdit,SIGNAL(returnPressed ()), this, SLOT(send_whos_command_to_octave())); regexp_lineEdit->setToolTip(tr("Filter:
Use wildcards to filter variables. Example: a* (all variables that begin with a)")); hbox->addWidget(regexp_lineEdit); reload_button=new QPushButton(this); reload_button->setIcon( QIcon( QString( ICON_PATH )+"/reload.png" ) ); reload_button->setToolTip(tr("Reload variables' list")); hbox->addWidget(reload_button); reload_button->show(); reload_button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); connect(reload_button,SIGNAL(clicked ()), this, SLOT(send_whos_command_to_octave())); tree=new QTreeWidget(this); QStringList labels; labels << tr("Name") << tr("Size") << tr("Bytes") << tr("Class") /*<< "Prot"*/ ; tree->setHeaderLabels(labels); connect(tree,SIGNAL(itemDoubleClicked ( QTreeWidgetItem * , int )), this, SLOT(item_click(QTreeWidgetItem *,int)) ); vbox->addWidget(tree); tree->show(); local_item=new QTreeWidgetItem(tree); local_item->setText(0, tr("Local user variables")); local_item->setToolTip(0, tr("Local user variables")); local_item->setIcon(0,QIcon( QString( ICON_PATH )+"/personal.png" ) ); QFont font(tree->font()); font.setBold(true); local_item->setFont(0,font); //currently_item=new QTreeWidgetItem(tree); //currently_item->setText(0, tr("Functions")); //currently_item->setToolTip(0, tr("Functions")); //currently_item->setIcon(0,QIcon( QString( ICON_PATH )+"/run.png" ) ); //currently_item->setFont(0,font); // Popup Menu popup_menu = new QMenu(tr("Variable list"), this); popup_edit = popup_menu->addAction(tr("Edit")); popup_clear = popup_menu->addAction(tr("Clear")); popup_save = popup_menu->addAction(tr("Save to file")); connect(popup_menu, SIGNAL(triggered(QAction*)), this, SLOT(popupEvent(QAction*))); menu_bar->addMenu(popup_menu); connect(popup_menu,SIGNAL(aboutToShow ()), this, SLOT(set_menu_options()) ); } void VariableList::setOctaveConnection(OctaveConnection *octave_connection) { this->octave_connection=octave_connection; connect(octave_connection,SIGNAL(line_ready(QString)),this,SLOT(line_ready(QString))); connect(octave_connection,SIGNAL(command_finished()),this,SLOT(send_whos_command_to_octave())); } void VariableList::line_ready(QString line) { printf("[VariableList::line_ready] %s\n", line.toLocal8Bit().data() ); if( line.startsWith("~~whos_clean:") ) { for(int i=local_item->childCount()-1; i>=0; i--) { QTreeWidgetItem *item = local_item->child(i); local_item->removeChild(item); delete item; } //for(int i=currently_item->childCount()-1; i>=0; i--) //{ // QTreeWidgetItem *item = currently_item->child(i); // currently_item->removeChild(item); // delete item; //} } else if( line.startsWith("~~whos:") ) { QString s(line); s.remove(0,7); if( s.trimmed().isEmpty() ) return; /*if( s.startsWith("*** dynamically") ) { //text->append(""+s+""); s.remove(0,4); last_root_item=dynamically_item; last_root_item->setText(0,s.trimmed()); last_root_item->setToolTip(0,s.trimmed()); last_root_item->setIcon(0,QIcon( QString( ICON_PATH )+"/connect_established.png" ) ); QFont font(tree->font()); font.setBold(true); last_root_item->setFont(0,font); } else*/ if( s.startsWith("*** local") ) { //text->append(""+s+""); // s.remove(0,4); // last_root_item=local_item; // last_root_item->setText(0,s.trimmed()); // last_root_item->setToolTip(0,s.trimmed()); // last_root_item->setIcon(0,QIcon( QString( ICON_PATH )+"/personal.png" ) ); // QFont font(tree->font()); // font.setBold(true); // last_root_item->setFont(0,font); } else if( s.startsWith("*** currently") ) { //text->append(""+s+""); // s.remove(0,4); // // last_root_item=currently_item; // last_root_item->setText(0,s.trimmed()); // last_root_item->setToolTip(0,s.trimmed()); // last_root_item->setIcon(0,QIcon( QString( ICON_PATH )+"/run.png" ) ); // QFont font(tree->font()); // font.setBold(true); // last_root_item->setFont(0,font); } else { QStringList list = s.trimmed().split(QRegExp("\\s+")); QRegExp name_re; name_re.setPatternSyntax(QRegExp::Wildcard); if(regexp_lineEdit->text().isEmpty()) { name_re.setPattern("*"); } else name_re.setPattern(regexp_lineEdit->text()); if(name_re.exactMatch(list.at(0))) { QTreeWidgetItem *item=new QTreeWidgetItem(last_root_item); int i=0; for(;isetText(i,list.at(i) ); item->setToolTip(i,list.at(i) ); } } //for(i=1;i<4;i++) tree->resizeColumnToContents(i); } /* else { //text->append(s); QTreeWidgetItem *item=new QTreeWidgetItem(last_root_item); item->setText(0,s.trimmed()); item->setToolTip(0,s.trimmed()); } */ }else if (line.startsWith("~~scalar:")) { QStringList sl = line.mid(9).split("="); bool ok; sl.last() = QInputDialog::getText(this, sl.first(), QString(), QLineEdit::Normal, sl.last().trimmed(), &ok); if(ok && !sl.last().isEmpty()) octave_connection->command_enter(sl.first() + " = " + sl.last()); }else if (line.startsWith("~~string:")) { QString s = line.mid(9); QString var = s.section("=", 0, 0); s = s.section("=", 1); QString value = s.left(s.length() - 1); bool ok; value = QInputDialog::getText(this, var, QString(), QLineEdit::Normal, value, &ok); if(ok) octave_connection->command_enter(var + " = \"" + value + "\""); } } void VariableList::windowActivated ( QWidget * /*w*/ ) { //send_whos_command_to_octave(); } void VariableList::windowActivated() { //send_whos_command_to_octave(); } void VariableList::send_whos_command_to_octave() { //tree->clear(); /* for(int i=local_item->childCount()-1; i>=0; i--) { QTreeWidgetItem *item = local_item->child(i); local_item->removeChild(item); delete item; } for(int i=currently_item->childCount()-1; i>=0; i--) { QTreeWidgetItem *item = currently_item->child(i); currently_item->removeChild(item); delete item; } */ //local_item=new QTreeWidgetItem(tree); //dynamically_item=new QTreeWidgetItem(tree); //currently_item=new QTreeWidgetItem(tree); octave_connection->reset_instrutions_left(); QString command; command="_ide_reload_variables_list( whos() );"; octave_connection->command_enter(command,false); } void VariableList::item_click(QTreeWidgetItem * item, int /*column*/) { QString name=item->text(0); QString clas=item->text(3); QString cmd; if (clas=="double" || clas=="matrix") { emit open_table(name); }else if (clas == "scalar") { cmd = "fprintf(stderr, \"~~scalar:" + name + "=%g\\n\", " + name + ");"; octave_connection->command_enter(cmd, false); }else if (clas == "string") { cmd = "fprintf(stderr, \"~~string:" + name + "=%s\\n\", " + name + ");"; octave_connection->command_enter(cmd, false); } } void VariableList::contextMenuEvent(QContextMenuEvent * event) { if(set_menu_options()) { QPoint p(event->globalX(),event->globalY()); popup_menu->popup(p); } } bool VariableList::set_menu_options() { QTreeWidgetItem *item = tree->currentItem(); if(item==NULL) { popup_edit->setEnabled(false); popup_save->setEnabled(false); popup_clear->setEnabled(false); return true; } QString clas = item->text(3); if(item->childCount() == 0) // Hoja { if(clas != "double" && clas != "matrix") { popup_edit->setEnabled(false); popup_save->setEnabled(false); }else{ popup_edit->setEnabled(true); popup_save->setEnabled(true); } popup_clear->setEnabled(true); return true; } return false; } void VariableList::popupEvent(QAction *action) { if(action == popup_clear) { octave_connection->command_enter(QString("clear " + tree->currentItem()->text(0) + ";")); send_whos_command_to_octave(); }else if(action == popup_edit) { item_click(tree->currentItem(), 0); }else if(action == popup_save) { QFileDialog *dialog = new QFileDialog(this, Qt::Dialog); dialog->setAcceptMode(QFileDialog::AcceptSave); dialog->setConfirmOverwrite(true); if(dialog->exec() == QDialog::Accepted) { QString fname = dialog->selectedFiles()[0]; octave_connection->command_enter(QString("save(\"") + fname + "\", \"" + tree->currentItem()->text(0) + "\");"); } delete dialog; } } QMenu *VariableList::get_menu() { if(popup_menu!=NULL && set_menu_options()) return popup_menu; else return NULL; } BaseWidget *VariableList::copyBaseWidget(QWidget * parent ) { VariableList *vl=new VariableList(parent); vl->setOctaveConnection(octave_connection); vl->setSession(session); vl->send_whos_command_to_octave(); Main *main=(Main*)session->getFirstTool(MAIN); connect(vl, SIGNAL(open_table(QString)), main, SLOT(table(QString)) ); return vl; } qtoctave-0.10.1/qtoctave/src/editor.cpp0000644000175000017500000011105511511434227017031 0ustar lucaslucas/* Copyright (C) 2006, 2007, 2008 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include "editor.h" #include "config.h" #include "search_dialog.h" #include "numberedtextview.h" #include "navigator.h" // Constructor Editor::Editor(QWidget *parent): BaseWidget(parent) { widget_type=EDITOR; currentNtv=NULL; search_dialog=NULL; // Title setWindowTitle(tr("Editor")); setWindowIcon(QIcon(QString(ICON_PATH) +QDir::separator()+ "xedit.png")); // Layout QVBoxLayout *vLayout = new QVBoxLayout; centralWidget()->setLayout(vLayout); vLayout->setSpacing (0); resize(540, 400); // Toolbar toolBar = addToolBar(tr("Options")); toolBar->setObjectName(tr("Editor Options")); //toolBar->setOrientation(Qt::Horizontal); //toolBar->setMinimumHeight(40); //toolBar->setMaximumHeight(40); connect(toolBar, SIGNAL(actionTriggered(QAction*)), this, SLOT(toolbar_action(QAction*))); //vLayout->addWidget(toolBar); //toolBar->show(); // Toolbar buttons actionNew = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "filenew.png"), tr("New")); actionNew->setShortcut(tr("Ctrl+N")); actionNew->setShortcutContext(Qt::WindowShortcut); actionOpen = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "fileopen"), tr("Open")); actionOpen->setShortcut(tr("Ctrl+O")); actionOpen->setShortcutContext(Qt::WindowShortcut); actionSave = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "filesave"), tr("Save")); actionSave->setShortcut(tr("Ctrl+S")); actionSave->setShortcutContext(Qt::WindowShortcut); actionSaveAs = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "filesaveas.png"), tr("Save as")); actionClose = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "fileclose.png"), tr("Close tab")); toolBar->addSeparator(); actionRun = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "run.png"), tr("Run")); actionRun->setShortcut(tr("F5")); actionRun->setShortcutContext(Qt::WindowShortcut); actionDebug = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "find.png"), tr("Debug")); actionDebug->setToolTip( "" "Debug:" "

Octave includes a built-in debugger to aid in the development of scripts. This can be used to interrupt the execution of an Octave script at a certain point.

" "

Click over this button to start debugging or continue to next breakpoint.

" "" ); actionDebug->setShortcut(tr("F6")); actionStep = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "step.png"), tr("Detailed debugging")); actionStep->setShortcut(tr("Shift+F6")); actionStep->setEnabled(false); actionSendToOctave=toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "konsole.png"), tr("Send to Octave") ); actionSendToOctave->setShortcut(tr("F9")); actionSendToOctave->setShortcutContext(Qt::WindowShortcut); actionSendToOctave->setToolTip( "" "Send to Octave:" "

Sends selected text to Octave. If there is not selected text, the full text will be sent.

" "" ); toolBar->addSeparator(); actionUndo = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "undo.png"), tr("Undo")); //actionUndo->setShortcut(tr("Ctrl+Z")); //actionUndo->setShortcutContext(Qt::WindowShortcut); actionRedo = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "redo.png"), tr("Redo")); //actionRedo->setShortcut(tr("Ctrl+Shift+Z")); //actionRedo->setShortcutContext(Qt::WindowShortcut); actionCut = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "editcut"), tr("Cut")); //actionCut->setShortcut(tr("Ctrl+X")); //actionCut->setShortcutContext(Qt::WindowShortcut); actionCopy = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "editcopy"), tr("Copy")); //actionCopy->setShortcut(tr("Ctrl+C")); //actionCopy->setShortcutContext(Qt::WindowShortcut); actionPaste = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "editpaste"), tr("Paste")); //actionPaste->setShortcut(tr("Ctrl+V")); //actionPaste->setShortcutContext(Qt::WindowShortcut); toolBar->addSeparator(); actionSearch = toolBar->addAction(QIcon(QString(ICON_PATH) +QDir::separator()+ "search.png"), tr("Search and replace")); actionSearch->setShortcut(tr("Ctrl+F")); actionSearch->setShortcutContext(Qt::WindowShortcut); //Create menus menuFile=menuBar()->addMenu(tr("File")); menuFile->addAction(actionNew); menuFile->addAction(actionOpen); menuFile->addAction(actionSave); menuFile->addAction(actionSaveAs); actionClone=menuFile->addAction(tr("Clone View")); connect(actionClone, SIGNAL(triggered()),this, SLOT(clone_callback())); menuFile->addSeparator(); actionPrint=menuFile->addAction(tr("Print")); connect(actionPrint, SIGNAL(triggered()),this, SLOT(print_callback())); menuFile->addSeparator(); menuFile->addAction(actionClose); menuFile->addSeparator(); QAction *actionCloseAll=menuFile->addAction(tr("Close")); connect(actionCloseAll, SIGNAL(triggered()),this, SLOT(close_editor())); //connect(menuFile, SIGNAL(triggered(QAction*)),this, SLOT(toolbar_action(QAction*))); menuEdit=menuBar()->addMenu(tr("Edit")); /* menuEdit->addAction(actionUndo); menuEdit->addAction(actionRedo); menuEdit->addAction(actionCut); menuEdit->addAction(actionCopy); menuEdit->addAction(actionPaste); menuEdit->addAction(actionSearch); */ connect(menuEdit, SIGNAL(aboutToShow()), this, SLOT(show_edit_menu())); //connect(menuEdit, SIGNAL(triggered(QAction*)),this, SLOT(toolbar_action(QAction*))); menuRun=menuBar()->addMenu(tr("Run")); menuRun->addAction(actionRun); menuRun->addAction(actionSendToOctave); menuRun->addAction(actionDebug); menuRun->addAction(actionStep); //connect(menuRun, SIGNAL(triggered(QAction*)),this, SLOT(toolbar_action(QAction*))); menuRun->addSeparator(); actionToggleBreakPoint=menuRun->addAction(tr("Toggle breakpoint")); actionToggleBreakPoint->setShortcut(tr("F7")); connect(actionToggleBreakPoint, SIGNAL(triggered()),this, SLOT(toggleBreakPoint_callback())); menuTools=menuBar()->addMenu(tr("Tools")); actionIndent=menuTools->addAction(tr("Indent")); connect(actionIndent, SIGNAL(triggered()),this, SLOT(indent_callback())); actionUnindent=menuTools->addAction(tr("Unindent")); connect(actionUnindent, SIGNAL(triggered()),this, SLOT(unindent_callback())); menuTools->addSeparator(); actionComment=menuTools->addAction(tr("Comment")); connect(actionComment, SIGNAL(triggered()),this, SLOT(comment_callback())); actionUncomment=menuTools->addAction(tr("Uncomment")); connect(actionUncomment, SIGNAL(triggered()),this, SLOT(uncomment_callback())); if(get_config("simple_rcs")=="true") { menuTools->addSeparator(); actionSimpleRCS=menuTools->addAction("Revision control system (SimpleRCS)"); connect(actionSimpleRCS, SIGNAL(triggered()),this, SLOT(simple_rcs_callback())); } menuConfig=menuBar()->addMenu(tr("Config")); // TabWidget tabWidget = new QTabWidget(this); tabWidget->show(); connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); vLayout->addWidget(tabWidget); //List of files QDockWidget *list_files_dock=new QDockWidget(tr("File list"), this); list_files_dock->setObjectName(list_files_dock->windowTitle()); addDockWidget(Qt::LeftDockWidgetArea, list_files_dock); //list_files_dock->show(); list_files=new QListView(list_files_dock); list_files_dock->setWidget(list_files); list_files_dock->show(); list_files->setAcceptDrops(true); list_files->setDropIndicatorShown(true); list_files->setDragEnabled(true); list_files->viewport()->setAcceptDrops(true); list_files->setModel(new ListModel(0, this)); connect(list_files,SIGNAL(clicked (const QModelIndex &)), this, SLOT(file_selected(const QModelIndex &)) ); //Clipboard list QDockWidget *list_clipboard_dock=new QDockWidget(tr("Small Clipboard"), this); list_clipboard_dock->setObjectName(list_clipboard_dock->windowTitle()); addDockWidget(Qt::LeftDockWidgetArea, list_clipboard_dock); list_clipboard=new ClipboardListView(list_clipboard_dock); list_clipboard_dock->setWidget(list_clipboard); list_clipboard_dock->show(); connect(list_clipboard,SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(clipboard_double_clicked(const QModelIndex &)) ); //This menu is builded here because it show objects if they hav been created menuDocks=createPopupMenu(); menuDocks->setTitle(tr("Show/Hide Objects")); menuConfig->addMenu(menuDocks); //setAcceptDrops(true); project_name=tr("Empty"); toolbar_action(actionNew); } Editor::~Editor() { saveProject(); if(search_dialog!=NULL) delete search_dialog; } void Editor::show_edit_menu() { menuEdit->clear(); if(currentNtv!=NULL) menuEdit->addMenu(currentNtv->textEdit()->createStandardContextMenu()); menuEdit->addAction(actionSearch); } void Editor::saveProject() { QStringList files; for(int i=0;icount();i++) { QString path=((NumberedTextView*)tabWidget->widget(i) )->path(); if(!path.isEmpty()) files.append( path ); } files.removeDuplicates(); if(project_name.isEmpty()) Projects::saveListFiles(tr("Empty"), files); else Projects::saveListFiles(project_name, files); } // void Editor::dragEnterEvent(QDragEnterEvent *event) // { // if (event->mimeData()->hasFormat("text/plain")) // event->acceptProposedAction(); // } // // // void Editor::dropEvent ( QDropEvent * event ) // { // QString path=event->mimeData()->text(); // // openFile(path); // // event->acceptProposedAction(); // } void Editor::setOctaveConnection(OctaveConnection *oc) { octave_connection = oc; } void Editor::toolbar_action(QAction *action) { QStringList filters; filters << "Octave (*.m; *.M)" << "Plain text (*.txt)" << "All files (*)"; if(action == actionNew){ /** New **/ SimpleEditor *codeEdit = new SimpleEditor(NULL); connect(codeEdit, SIGNAL(dynamic_help_required(const QString &)), this, SLOT(emit_dynamic_help_required(const QString &))); NumberedTextView *ntv = new NumberedTextView(NULL, codeEdit); connect(ntv->textEdit(), SIGNAL(toggleBreakpoint(int)), this, SLOT(toggleBreakpoint(int))); //connect(ntv, SIGNAL(textModified()), this, SLOT(textModified())); connect(codeEdit->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); currentNtv = ntv; tabWidget->setCurrentIndex( tabWidget->addTab(ntv, tr("New")) ); }else if(action == actionOpen){ /** Open **/ openFile(); }else if(action == actionSave && !currentNtv->path().isEmpty()){ /* Save */ if( currentNtv->save() ) setTabText(tabWidget->currentIndex(), currentNtv->path().split("/").last()); else QMessageBox::critical(NULL, tr("Error"), tr("Can not be saved")); }else if(action == actionSaveAs || (action == actionSave && currentNtv->path().isEmpty())){ /** Save as **/ QString path; QFileDialog saveDialog(this, Qt::Dialog); saveDialog.setAcceptMode(QFileDialog::AcceptSave); saveDialog.setDefaultSuffix("m"); saveDialog.setFilters(filters); //Use Navigator path if current path is empty if(currentNtv->path().isEmpty()) { QObject *obj= session->getFirstTool(NAVIGATOR); if(obj!=NULL) { Navigator *nav=(Navigator*)obj; saveDialog.setDirectory(nav->getNavigatorCurrentPath()); } } else { QFileInfo current_file(currentNtv->path()); saveDialog.setDirectory(current_file.absolutePath()); saveDialog.selectFile(current_file.baseName()); } if(saveDialog.exec() == QDialog::Accepted) { path = saveDialog.selectedFiles().first(); if(currentNtv->save(path)) { setTabText(tabWidget->currentIndex(), currentNtv->path().split("/").last()); } else { QMessageBox::critical(NULL, tr("Error"), path + tr("can not be saved")); } } }else if(action == actionRun){ //if(currentNtv->path().isEmpty()) //{ // QMessageBox::critical(NULL, tr("Error"), tr("You must save the file first")); // return; //} if( currentNtv->modified() ) toolbar_action(actionSave); QFileInfo finfo(currentNtv->path()); octave_connection->command_enter(QString("cd '") + finfo.path() + "'"); octave_connection->command_enter(QString("source (\"") + finfo.fileName() + "\")"); }else if(action == actionDebug){ /** Run */ if(currentNtv->path().isEmpty()) { QMessageBox::critical(NULL, tr("Error"), tr("You must save the file first")); return; } // Debug? if(actionStep->isEnabled()) octave_connection->command_enter(QString("dbcont")); else { QFileInfo finfo(currentNtv->path()); QList *breakpoints = currentNtv->getBreakpoints(); if(breakpoints!=NULL) { // Source //octave_connection->command_enter(QString("source('") + finfo.absoluteFilePath() + "')"); // Clear breakpoints //octave_connection->command_enter(QString("dbclear('") + finfo.baseName() + "',dbstatus('"+finfo.baseName()+"') )"); //Change to dir octave_connection->command_enter(QString("cd '") + finfo.path() + "'"); octave_connection->command_enter(QString( "while ( length (dbstatus('" + finfo.baseName() + "')) >0 )" "dbclear('" + finfo.baseName() + "', dbstatus('" + finfo.baseName() + "')(1).line);" "endwhile" ) ); // Insert breakpoints for(QList::const_iterator i = breakpoints->constBegin(); i != breakpoints->constEnd(); i++) { octave_connection->command_enter(QString("dbstop('") + finfo.baseName() + "','" + QString::number(*i) + "')"); } // Connect debug connect(octave_connection, SIGNAL(debug(int, int)), this, SLOT(debug(int, int))); connect(octave_connection, SIGNAL(endDebug()), this, SLOT(endDebug())); // Run octave_connection->command_enter(finfo.baseName()); } } // End debug? }else if(action == actionUndo){ // Undo ((SimpleEditor*)currentNtv->textEdit())->undo(); }else if(action == actionRedo){ // Undo currentNtv->textEdit()->document()->redo(); }else if(action == actionCut){ // Cut currentNtv->textEdit()->cut(); }else if(action == actionCopy){ // Copy currentNtv->textEdit()->copy(); }else if(action == actionPaste){ // Paste currentNtv->textEdit()->paste(); }else if(action == actionSearch){ if(search_dialog==NULL) { search_dialog=new SearchDialog(this); connect(search_dialog, SIGNAL(search_signal()), this, SLOT(search())); connect(search_dialog, SIGNAL(replace_signal()), this, SLOT(replace())); } search_dialog->show(); }else if(action == actionSendToOctave){ QTextCursor cursor=currentNtv->textEdit()->textCursor(); if(cursor.hasSelection()) octave_connection->command_enter(cursor.selectedText().replace(QChar(0x2029), "\n")); else octave_connection->command_enter( currentNtv->textEdit()->document()->toPlainText() ); }else if(action == actionStep){ octave_connection->command_enter( "dbstep" ); }else if(action == actionClose){ closeTabs(false); } else{ printf("Unhandled action\n"); } } void Editor::openFile(QString file) { /** Open **/ QString path; if(file.isEmpty()) { QFileDialog openDialog(this, tr("Open") /*Qt::Dialog*/); QStringList filters; filters << "Octave (*.m; *.M)" << "Plain text (*.txt)" << "All files (*)"; openDialog.setAcceptMode(QFileDialog::AcceptOpen); openDialog.setDefaultSuffix("m"); openDialog.setFilters(filters); //openDialog.setViewMode(QFileDialog::Detail); QFileInfo current_file(currentNtv->path()); openDialog.setDirectory(current_file.absolutePath()); openDialog.selectFile(current_file.baseName()); if(openDialog.exec() == QDialog::Accepted) path = openDialog.selectedFiles().first(); else return; } else path=file; loadFiles(QStringList() << path); } void Editor::setProject(QString name) { project_name=name; closeTabs(true); QStringList files=Projects::listFiles(project_name); loadFiles(files); } QString Editor::getProject() { return project_name; } void Editor::setSession(Session *session) { BaseWidget::setSession(session); setProject(session->getProjectName()); connect(session, SIGNAL(projectChanged(QString)), this, SLOT(setProject(QString)) ); } void Editor::search() { QString search, replace; QTextCursor cursor; QPlainTextEdit *textEdit = currentNtv->textEdit(); // Strings search = search_dialog->searchString(); replace = search_dialog->replaceString(); // Flags QTextDocument::FindFlags flags; if(search_dialog->caseSensitive()) flags |= QTextDocument::FindCaseSensitively; if(search_dialog->wholeWords()) flags |= QTextDocument::FindWholeWords; // Search cursor = textEdit->textCursor(); if(search_dialog->searchStringIsRegExp()) { // Search string is a regular expression QRegExp searchReg(search); cursor = textEdit->document()->find(searchReg, cursor, flags); //cursor = textEdit->document()->find(search, cursor, flags); }else{ // Search string is not a regular expression cursor = textEdit->document()->find(search, cursor, flags); } textEdit->setTextCursor(cursor); } void Editor::replace() { QTextCursor cursor = currentNtv->textEdit()->textCursor(); if(!cursor.selectedText().isEmpty()) { int pos=cursor.position(); cursor.insertText(search_dialog->replaceString()); cursor.setPosition(pos); currentNtv->textEdit()->setTextCursor(cursor); } //Next line is comented because editor loose cursor //search(); } void Editor::toggleBreakpoint(int lineno) { currentNtv->toggleBreakpoint(lineno); } void Editor::debug(int lineno, int /*colno*/) { currentNtv->setCurrentLine(lineno); actionStep->setEnabled(true); } void Editor::endDebug() { currentNtv->setCurrentLine(-1); actionStep->setEnabled(false); //Clean break points QFileInfo finfo(currentNtv->path()); octave_connection->command_enter(QString( "while ( length (dbstatus('" + finfo.baseName() + "')) >0 )" "dbclear('" + finfo.baseName() + "', dbstatus('" + finfo.baseName() + "')(1).line);" "endwhile" ) ); } void Editor::tabChanged(int index) { //printf("Activado %d\n", index); //if(currentNtv!=NULL) // disconnect(currentNtv->textEdit(), SIGNAL(toggleBreakpoint(int)), this, SLOT(toggleBreakpoint(int))); currentNtv = (NumberedTextView*)tabWidget->widget(index); //setWindowTitle(tabWidget->tabText(index)); //connect(currentNtv->textEdit(), SIGNAL(toggleBreakpoint(int)), this, SLOT(toggleBreakpoint(int))); ListModel *list=(ListModel*)list_files->model(); list_files->setCurrentIndex(list->position_index(index)); } void Editor::textModified(bool ok) { for(int i=0;icount(); i++) { NumberedTextView *ntv=(NumberedTextView *)tabWidget->widget(i); if( ntv==NULL ) continue; QPlainTextEdit *text=ntv->textEdit(); if(ntv->path().isEmpty()) { if(!text->document()->isModified()) setTabText(i, tr("New")); else setTabText(i, tr("New")+"*"); } else { if(!text->document()->isModified()) setTabText(i, ntv->path().split("/").last()); else setTabText(i, ntv->path().split("/").last()+"*"); } } } ///////////////////////////////////////////////////////////// void Editor::closeEvent ( QCloseEvent * event ) { bool modified=false; for(int i=0;icount();i++) { modified|=( (NumberedTextView*)tabWidget->widget(i) )->modified(); } int ok; if(modified) ok=QMessageBox::warning (this,tr("Close this window?"), tr("You are going to close Editor. Are you sure?"), QMessageBox::Ok, QMessageBox::Cancel); else ok=QMessageBox::Ok; if (ok==QMessageBox::Ok) { event->accept(); } else { event->ignore(); } } ///////////////////////////////////////////////////////////// void Editor::closeTabs(bool close_all_tabs) { while(tabWidget->count()>0) { if(currentNtv==NULL) { printf("[Editor::closeTabs] currentNtv==NULL\n"); break; } if( ( currentNtv->modified() && !currentNtv->textEdit()->toPlainText().isEmpty() && currentNtv->path().isEmpty() ) || ( currentNtv->modified() && !currentNtv->path().isEmpty() ) ) { QMessageBox msg(tr("Close"), tr("The file has been modified. Save changes?"), QMessageBox::Question, QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Default, this); switch(msg.exec()) { case QMessageBox::Yes: toolbar_action(actionSave); break; case QMessageBox::No: // No hacer nada break; default: return; } } // Borrar //tabWidget->removeTab(tabWidget->currentIndex()); disconnect(currentNtv->textEdit()->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); NumberedTextView *ntv=currentNtv; currentNtv=NULL; //TODO: Check if another view (clone view) is using the same document object printf("Padre %d ; textEdit %d\n", ntv->textEdit()->document()->parent(), ntv->textEdit() ); //if(ntv->textEdit()->document()->parent()==ntv->textEdit()) /* { for(int i=0;icount();i++) { NumberedTextView *w=(NumberedTextView *)tabWidget->widget(i); if( w!=ntv && ntv->textEdit()->document()==w->textEdit()->document() ) { printf("Padre %d ; textEdit %d\n", w->textEdit()->document()->parent(), w->textEdit() ); ntv->textEdit()->document()->setParent(w->textEdit()); w->textEdit()->setDocument(ntv->textEdit()->document()); break; } } } */ delete ntv; if(!close_all_tabs) break; } // Crear uno si no queda ninguno if(tabWidget->count() == 0) { SimpleEditor *codeEdit = new SimpleEditor(NULL); connect(codeEdit, SIGNAL(dynamic_help_required(const QString &)), this, SLOT(emit_dynamic_help_required(const QString &))); NumberedTextView *ntv = new NumberedTextView(NULL, codeEdit); connect(ntv->textEdit(), SIGNAL(toggleBreakpoint(int)), this, SLOT(toggleBreakpoint(int))); connect(codeEdit->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); //connect(ntv->textEdit()->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); tabWidget->addTab(ntv, tr("New")); currentNtv = ntv; } else { tabChanged(tabWidget->currentIndex()); } updateFileList(); } ///////////////////////////////////////////////////////////// void Editor::newEditorTab() { SimpleEditor *codeEdit = new SimpleEditor(NULL); connect(codeEdit, SIGNAL(dynamic_help_required(const QString &)), this, SLOT(emit_dynamic_help_required(const QString &))); NumberedTextView *ntv = new NumberedTextView(NULL, codeEdit); connect(ntv->textEdit(), SIGNAL(toggleBreakpoint(int)), this, SLOT(toggleBreakpoint(int))); connect(codeEdit->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); tabWidget->setCurrentIndex(tabWidget->addTab(ntv, tr("New"))); currentNtv=ntv; updateFileList(); } ///////////////////////////////////////////////////////////// void Editor::loadFiles(const QStringList &files) { QString path; foreach(path, files) { if( path.isEmpty() ) continue; try { // Si la pestaña activa no contiene ningún texto ni es un archivo, // abrir en ella if(!currentNtv->path().isEmpty() || !currentNtv->textEdit()->document()->isEmpty()) { newEditorTab(); } SimpleEditor *codeEdit=(SimpleEditor*)(currentNtv->textEdit()); disconnect(codeEdit->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); //disconnect(currentNtv->textEdit()->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); currentNtv->open(path); //connect(currentNtv->textEdit()->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); connect(codeEdit->document(), SIGNAL(modificationChanged (bool)), this, SLOT(textModified(bool))); setTabText(tabWidget->currentIndex(), path.split("/").last()); } catch(...) { QMessageBox::critical(NULL, tr("Error"), path + " can not be opened"); } } } ///////////////////////////////////////////////////////////// void Editor::close_editor() { if(parent()!=NULL) ((QWidget*)parent())->close(); else close(); } void Editor::emit_dynamic_help_required(const QString &text) { //printf("%s\n", text.toLocal8Bit().data()); emit dynamic_help_required(text); } BaseWidget *Editor::copyBaseWidget(QWidget * parent ) { saveProject(); Editor *bw=new Editor(parent); bw->setSession(session); bw->octave_connection=octave_connection; for(int i=bw->tabWidget->count();i>0;i--) { bw->toolbar_action(bw->actionClose); } for(int i=0;icount();i++) { NumberedTextView *code=((NumberedTextView*)tabWidget->widget(i) ); if(i!=0) bw->toolbar_action(bw->actionNew); bw->currentNtv->textEdit()->setPlainText(code->textEdit()->toPlainText()); bw->currentNtv->setPath(code->path()); bw->currentNtv->setModified(code->modified()); code->setModified(false); if(!code->path().isEmpty()) { bw->setTabText(bw->tabWidget->currentIndex(), code->path().split("/").last()); } } return bw; } void Editor::setTabText(int index, const QString & label) { tabWidget->setTabText(index, label); updateFileList(); } void Editor::updateFileList() { ListModel *model=(ListModel *)list_files->model(); model->clear(); for(int i=0;icount();i++) { model->append(tabWidget->tabText(i), i); } model->update(); } void Editor::file_selected(const QModelIndex & index) { ListModel *model=(ListModel *)list_files->model(); tabWidget->setCurrentIndex(model->position(index)); } void Editor::indent_callback() { currentNtv->indent(); } void Editor::unindent_callback() { currentNtv->unindent(); } void Editor::comment_callback() { currentNtv->comment(); } void Editor::uncomment_callback() { currentNtv->uncomment(); } void Editor::simple_rcs_callback() { QString path=currentNtv->path(); QString repository=path+"~~"; QString command("simplercs \""+repository+"\" "); QProcess::startDetached(command); //QProcess::execute(command); printf("[NumberedTextView::save] Comando: %s\n", command.toLocal8Bit().data() ); } void Editor::print_callback() { QPrinter printer; QPrintDialog *dialog = new QPrintDialog(&printer, this); dialog->setWindowTitle(tr("Print Document")); if (currentNtv->textEdit()->textCursor().hasSelection()) dialog->addEnabledOption(QAbstractPrintDialog::PrintSelection); if (dialog->exec() == QDialog::Accepted) { currentNtv->textEdit()->print(&printer); } } void Editor::clone_callback() { QTextDocument *document=currentNtv->textEdit()->document(); QString path=currentNtv->path(); newEditorTab(); currentNtv->textEdit()->setDocument(document); if(!path.isEmpty()) { setTabText(tabWidget->currentIndex(), path.split("/").last()); currentNtv->setPath(path); } } void Editor::toggleBreakPoint_callback() { int lineno=currentNtv->textEdit()->textCursor().blockNumber()+1; currentNtv->toggleBreakpoint(lineno); } //////////////////////////////////////////////////////////////// void Editor::clipboard_double_clicked(const QModelIndex &index) { QString text=index.data().toString(); currentNtv->textEdit()->textCursor().insertText(text); } //////////////////////////////////////////////////////////////// ListModel::ListModel(QObject *parent, Editor *editor):QAbstractListModel(parent) { this->editor=editor; } int ListModel::rowCount(const QModelIndex &parent) const { return list.size(); } QVariant ListModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= list.size()) return QVariant(); if (role == Qt::DisplayRole) return list.at(index.row()).name; else return QVariant(); } void ListModel::clear() { list.clear(); } void ListModel::append(QString name, int position) { ListItem item; item.name=name; item.position=position; list.append(item); } int ListModel::position(const QModelIndex &index) { return list.at(index.row()).position; } void ListModel::update() { //printf("[ListModel::update] %d Inicio\n",list.size()); QModelIndex index0=index(0); beginInsertRows(index0, 0, list.size()-1); //printf("[ListModel::update] %d Proceso\n",list.size()); endInsertRows(); //printf("[ListModel::update] %d Fin\n",list.size()); } QModelIndex ListModel::position_index(int position) { for(int i=0;ihasFormat("text/plain")) { QString path=data->text(); editor->openFile(path); return true; } return false; } Qt::ItemFlags ListModel::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); return Qt::ItemIsDropEnabled | defaultFlags; } QStringList ListModel::mimeTypes() const { QStringList types; types << "text/plain"; return types; } //////////////////////////////////////////////////////////////////// ClipboardListView::ClipboardListView(QWidget *parent):QListView(parent) { _stringModel = new QStringListModel(); setModel(_stringModel); popup = new QMenu(); QAction *edit=popup->addAction(tr("Edit")); popup->addSeparator(); QAction *remove=popup->addAction(tr("Delete entry")); QAction *remove_all=popup->addAction(tr("Delete all")); popup->addSeparator(); QAction *sort_ascending=popup->addAction(tr("Sort ascending")); QAction *sort_descending=popup->addAction(tr("Sort descending")); popup->addSeparator(); QAction *up=popup->addAction(tr("Up")); QAction *down=popup->addAction(tr("Down")); QAction *top=popup->addAction(tr("Top")); QAction *bottom=popup->addAction(tr("Bottom")); popup->addSeparator(); stopAction=popup->addAction(tr("Stop append")); stopAction->setCheckable(true); stopAction->setChecked(false); stopAction->setToolTip(tr("Stops append text from clipboard")); connect(edit, SIGNAL(triggered()),this, SLOT(edit_callback())); connect(remove, SIGNAL(triggered()),this, SLOT(remove_callback())); connect(remove_all, SIGNAL(triggered()),this, SLOT(remove_all_callback())); connect(sort_ascending, SIGNAL(triggered()),this, SLOT(sort_ascending_callback())); connect(sort_descending, SIGNAL(triggered()),this, SLOT(sort_descending_callback())); connect(up, SIGNAL(triggered()),this, SLOT(up_callback())); connect(down, SIGNAL(triggered()),this, SLOT(down_callback())); connect(top, SIGNAL(triggered()),this, SLOT(top_callback())); connect(bottom, SIGNAL(triggered()),this, SLOT(bottom_callback())); connect(this, SIGNAL(clicked (const QModelIndex &)), this, SLOT(clipboard_selected(const QModelIndex &)) ); connect(QApplication::clipboard(),SIGNAL(dataChanged()), this, SLOT(clipboard_new_data_callback()) ); //Load last state SmallClipboard QString home=QDir::home().path()+"/.qtoctave/SmallClipboard.xml"; QFile inFile(home); if( inFile.exists() ) { inFile.open(QIODevice::ReadOnly); QXmlStreamReader in(&inFile); loadStateXML(in); inFile.close(); } setToolTip( "Small Clipboard:" "

Small Clipboard is a list of clipboard texts. When you copy some text using ctrl+C, this text is copied to system clipboard. If text is small, it will be listed in Small Clipboard. Whichever the text selected from Small Clipboard list, you can paste it pressing ctrl+V. You can paste text with double click, also.

" "Use right click to see popup menu." ); } ClipboardListView::~ClipboardListView() { QString home=QDir::home().path()+"/.qtoctave/SmallClipboard.xml"; QFile outFile(home); outFile.open(QIODevice::WriteOnly); QXmlStreamWriter out(&outFile); saveStateXML(out); outFile.close(); } void ClipboardListView::contextMenuEvent ( QContextMenuEvent * event ) { popup->popup(event->globalPos()); } QStringListModel *ClipboardListView::stringModel() { return _stringModel; } void ClipboardListView::edit_callback() { QModelIndexList indexes=selectedIndexes(); for(int i=0; istringList(); for(int i=0; isetStringList(list); } void ClipboardListView::remove_all_callback() { QStringList list; _stringModel->setStringList(list); } void ClipboardListView::sort_ascending_callback() { QStringList list=_stringModel->stringList(); list.sort(); _stringModel->setStringList(list); } void ClipboardListView::sort_descending_callback() { QStringList list=_stringModel->stringList(); list.sort(); for(int i=0; isetStringList(list); } void ClipboardListView::up_callback() { QModelIndexList indexes=selectedIndexes(); QStringList list=_stringModel->stringList(); for(int i=0; i0) list.swap(k, k-1); } _stringModel->setStringList(list); } void ClipboardListView::down_callback() { QModelIndexList indexes=selectedIndexes(); QStringList list=_stringModel->stringList(); for(int i=0; isetStringList(list); } void ClipboardListView::top_callback() { QModelIndexList indexes=selectedIndexes(); QStringList list=_stringModel->stringList(); for(int i=0; isetStringList(list); } void ClipboardListView::bottom_callback() { QModelIndexList indexes=selectedIndexes(); QStringList list=_stringModel->stringList(); for(int i=0; isetStringList(list); } void ClipboardListView::clipboard_new_data_callback() { if( stopAction->isChecked() ) return; QClipboard *clipboard = QApplication::clipboard(); const QMimeData *mimedata = clipboard->mimeData(); if(mimedata->hasText()) { QStringList list=_stringModel->stringList(); while(list.size()>100) { list.removeFirst(); } QString text=clipboard->text(); if( text.indexOf('\n')<0 && text.size()<256 && !list.contains(text) ) { list << text; _stringModel->setStringList(list); } } } void ClipboardListView::clipboard_selected(const QModelIndex &index) { QString text=index.data().toString(); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(text); } void ClipboardListView::saveStateXML(QXmlStreamWriter &out, bool partOk) { if(!partOk) out.writeStartDocument(); out.writeStartElement("ClipboardListView"); out.writeStartElement("stopAction"); if( stopAction->isChecked() ) out.writeAttribute("value", "true"); else out.writeAttribute("value", "false"); out.writeEndElement(); QStringList list=_stringModel->stringList(); for(int i=0;isetChecked(true); else stopAction->setChecked(false); } else if(name=="ClipboardListView") insideOk=true; } else if( in.isEndElement() ) { QStringRef name=in.qualifiedName(); if( name=="ClipboardListView" && insideOk ) break; } } _stringModel->setStringList(list); } qtoctave-0.10.1/qtoctave/src/main.cpp0000644000175000017500000004670611511434227016501 0ustar lucaslucas/* Copyright (C) 2006,2007,2008 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "main.h" #include "window_list.h" #include "help.h" #include "table.h" #include #include #include #include #include #include #include #include #include #include "generate_menu.h" #include "mainwindow.h" #include "editor.h" #include "svgcanvas/svgcanvas.h" Main::Main(QObject * parent ):QObject (parent) { //Build Octave commands list { QString oc; if( get_config("octave_path").isEmpty() ) oc="octave"; else oc=get_config("octave_path"); QString home=QDir::home().path()+QDir::separator()+".qtoctave"+QDir::separator()+"commands.txt"; QString command= "l=completion_matches('');" "[nrows,ncols]=size(l);" "out=fopen('"+home+"','w');" "for k=1:nrows;" "fprintf(out,'%s\\n',l(k,:));" "endfor;" "fclose(out);" ; printf("[Main::Main] Building commands list.\n"); system(QString(oc+" --no-history -q --eval \""+command+"\"").toLocal8Bit().data()); printf("[Main::Main] Commands list builded.\n"); } oc = new OctaveConnection(); QString session_name=get_config("session_name"); if( !session_name.isEmpty() && session_name!="Empty") session.setProjectName(session_name); session.addTool(MAIN, this); main_window = new MainWindow(oc, &session); work_space=main_window->work_space; window_list=NULL; if( get_config("octave_path").isEmpty() ) oc->setOctavePath("octave"); else oc->setOctavePath(get_config("octave_path")); Terminal *terminal = (Terminal*)createTool(TERMINAL, work_space); terminal->work_space=work_space; terminal->setOctaveConnection(oc); oc->startOctave(); terminal->setProject(); //Show list of windows in workspace window_list = new WindowList(work_space,main_window->toolBarDocks); main_window->toolBarDocks->addWidget(window_list); window_list->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred)); window_list->show(); main_window->showMaximized(); {//Open tools from config QString home=QDir::home().path()+QDir::separator()+".qtoctave"+QDir::separator(); QString modeWorkArea=get_config("mode_work_area"); QFile file(home+"last_windows_layout.xml"); QFile wl_file(home+"windows_layout.xml"); QXmlStreamReader xml; if(modeWorkArea=="last" && file.exists()) { file.open(QIODevice::ReadOnly | QIODevice::Text); xml.setDevice(&file); modeWorkArea.clear(); } else if( !modeWorkArea.isEmpty() && wl_file.exists() ) { wl_file.open(QIODevice::ReadOnly | QIODevice::Text); xml.setDevice(&wl_file); } else { QString xmlConfig= "" "" "" //"" // "" //"" "" "" "" "" "" "" //"" //"" "" "" ; xml.addData(xmlConfig); modeWorkArea.clear(); } openTools(xml, modeWorkArea); file.close(); wl_file.close(); QMap windowSettings; windowSettings["mode_work_area"]="last"; set_config(windowSettings); } connect(oc, SIGNAL(clearScreen()), this, SLOT(clear_terminal())); connect(main_window->actionCompletionMatches, SIGNAL(triggered()), terminal, SLOT(completion_matches_callback())); connect(main_window->actionDynamicHelp, SIGNAL(triggered()), this, SLOT(dynamic_help())); connect(main_window->actionStopProcess, SIGNAL(triggered()), terminal, SLOT(stop_process_callback())); connect(main_window->actionClearTerminal, SIGNAL(triggered()), terminal, SLOT(clear_callback())); operations=new Operations(this,&active_widget,main_window); operations->setOctaveConnection(oc); operations->setSession(&session); //Build menus from files GenerateMenu generate_menu(main_window, operations); generate_menu.setPath( QString(CONFIG_PATH) +QDir::separator()+ "menus"); generate_menu.load_menu(); QString home=QDir::home().path()+QString(QDir::separator())+QString(".qtoctave")+QString(QDir::separator()); generate_menu.setPath( QString(home+"menus") ); generate_menu.load_menu(); //generate_menu.setPath("./menus"); //generate_menu.load_menu(); main_window->show_config_help_menus(); connect(main_window->actionOctave_help, SIGNAL(triggered()), this, SLOT(help_octave())); connect(main_window->actions.value("qtoctave_help"), SIGNAL(triggered()), this, SLOT(help_qtoctave())); connect(main_window->actions.value("qtoctave_about"), SIGNAL(triggered()), this, SLOT(help_qtoctave_about())); connect(main_window->actionTable, SIGNAL(triggered()), this, SLOT(table())); connect(main_window->actionVariableList, SIGNAL(triggered()), this, SLOT(variable_list())); //connect the Navigator connect(main_window->actionNavigator, SIGNAL(triggered()), this, SLOT(setVisibleNavigator())); connect(main_window->actionRunFile, SIGNAL(triggered()), this, SLOT(run_file())); connect(main_window->actionEditor, SIGNAL(triggered()), this, SLOT(editor_callback())); connect(main_window->actions["actionCommandList"], SIGNAL(triggered()), this, SLOT(commands_list())); connect(main_window->actionSvgCanvas, SIGNAL(triggered()), this, SLOT(svgcanvas_callback())); if(oc!=NULL) { connect(oc, SIGNAL(line_ready(QString)), this, SLOT(line_ready(QString))); } //main_window->showMaximized(); } void Main::widget_activated(BaseWidget *w) { active_widget=w; } void Main::line_ready(QString line) { //Builds SvgCanvas if it's needed. QRegExp re("~~svgcanvas: *(\\d+) +(.+)\n"); if( re.exactMatch(line) ) { int number=re.cap(1).toInt(); QVector tools=session.getTools(SVGCANVAS); int num; for(int i=0;igetCanvasNumber(); if(num==number) return; } //SvgCanvas needed SvgCanvas *svgcanvas=(SvgCanvas*)createTool(SVGCANVAS, work_space); svgcanvas->show(); svgcanvas->setCanvasNumber(number); svgcanvas->line_ready(line); } } void Main::help_octave() { if(get_config("qtinfo_ok").isEmpty() || get_config("qtinfo_ok")=="false" ) { oc->command_enter("qtinfo"); } else { Help *help=(Help*)createTool(HELP,work_space); if(get_config("help_path").isEmpty()) help->setSource( HELP_PATH ); else help->setSource(get_config("help_path")); //printf("[Main::help_octave] %s\n", HELP_PATH); help->show(); } } void Main::help_qtoctave() { Help *help=(Help*)createTool(HELP,work_space); if(get_config("qtoctave_help_path").isEmpty()) help->setSource( QTOCTAVE_HELP_PATH ); else help->setSource(get_config("qtoctave_help_path")); help->setWindowTitle("QtOctave Help"); help->show(); } void Main::help_qtoctave_about() { Help *help=(Help*)createTool(HELP,work_space); QFileInfo path(QTOCTAVE_HELP_PATH); if(get_config("qtoctave_help_path").isEmpty()) help->setSource( path.absoluteDir().path()+QDir::separator()+"about.html"); else help->setSource(get_config("qtoctave_help_path"),"about"); help->setWindowTitle("QtOctave About"); help->show(); } void Main::table(QString text) { bool ok=true; if(text.isEmpty()) { text = QInputDialog::getText(main_window, tr("Select table"), tr("Matrix name:"), QLineEdit::Normal, "", &ok); } if (ok && !text.isEmpty()) { Table *table=(Table*)createTool(TABLE, work_space); table->setMatrix(text); table->show(); table->windowActivated(); } } void Main::run_file() { QFileDialog openDialog(NULL, tr("Open"), "."); QStringList filters; filters << "Octave (*.m; *.M)"; openDialog.setFilters(filters); openDialog.setAcceptMode(QFileDialog::AcceptOpen); openDialog.setDefaultSuffix("m"); if(openDialog.exec() == QDialog::Accepted) { QFileInfo fileInfo(openDialog.selectedFiles().first()); QString cmd; //OctaveConnection *oc = terminal->getOctaveConnection(); // Change dir cmd = QString("cd \"") + fileInfo.dir().absolutePath() + QString("\""); oc->command_enter(cmd); // Execute file cmd = fileInfo.baseName(); oc->command_enter(cmd); } } void Main::variable_list() { VariableList *variableList=(VariableList*)createTool(VARIABLESLIST, work_space); variableList->show(); } void Main::dynamic_help() { Dynamic_help *dynamic_help=(Dynamic_help *)createTool(DYNAMIC_HELP, work_space); dynamic_help->show(); } void Main::commands_list() { CommandList *command_list=(CommandList*)createTool(COMMANDLIST, work_space); command_list->show(); } void Main::editor_callback() { if( get_config("external_editor") != "true") { Editor *editor=(Editor*)createTool(EDITOR, work_space); editor->show(); } else { const QString editor=get_config("editor"); if(editor.isEmpty()) return; QString ed(editor); QProcess::startDetached (ed); } } void Main::svgcanvas_callback() { SvgCanvas *svgcanvas=(SvgCanvas*)createTool(SVGCANVAS, work_space); svgcanvas->show(); } /** set visible or not the dock of var list*/ void Main::setVisibleVarList() { main_window->dockListVar-> setVisible(!main_window->dockListVar->isVisible()); } /**this function show or not the Navigator dock*/ void Main::setVisibleNavigator() { Navigator *nav=(Navigator *)createTool(NAVIGATOR, work_space); nav->show(); } QWidget *Main::mainWindowWidget() { return main_window; } void Main::clear_terminal() { Terminal *terminal = (Terminal*)(session.getFirstTool(TERMINAL)); terminal->clear_callback(); } BaseWidget *Main::createTool(WidgetType type, QWidget *parent) { BaseWidget *w; switch(type) { case TERMINAL: { Terminal *terminal=new Terminal(parent); terminal->setSession(&session); w=terminal; } break; case HELP: { Help *help=new Help(parent); help->setSession(&session); w=help; break; } case TABLE: { Table *table=new Table(parent); table->setOctaveConnection(oc); table->setSession(&session); w=table; break; } case VARIABLESLIST: { VariableList *variableList=new VariableList(parent); variableList->setOctaveConnection(oc); connect(variableList, SIGNAL(open_table(QString)), this, SLOT(table(QString)) ); variableList->setSession(&session); variableList->send_whos_command_to_octave(); w=variableList; break; } case DYNAMIC_HELP: { Dynamic_help *dynamic_help=new Dynamic_help(oc->getOctavePath(), parent); dynamic_help->setSession(&session); w=dynamic_help; break; } case EDITOR: { //if( get_config("external_editor") != "true") //{ Editor *editor = new Editor(parent); editor->setSession(&session); editor->setOctaveConnection(oc); w=editor; //} break; } case NAVIGATOR: { Navigator *nav=new Navigator(parent); nav->setOctaveConnection(oc); nav->setSession(&session); w=nav; break; } case COMMANDLIST: { CommandList *command_list=new CommandList(parent); Autocomplete *line=((Terminal*)session.getFirstTool(TERMINAL))->getAutocomplete(); connect(line, SIGNAL(new_command_entered(QStringList)), command_list, SLOT(set_list(QStringList)) ); command_list->setSession(&session); command_list->setLineEdit(line); command_list->set_list(line->commands()); w=command_list; break; } case SVGCANVAS: { SvgCanvas *svgcanvas = new SvgCanvas(parent); svgcanvas->setOctaveConnection(oc); svgcanvas->setSession(&session); QVector tools=session.getTools(SVGCANVAS); int min=1, num; for(int i=0;igetCanvasNumber(); if(num==min) min++; } } svgcanvas->setCanvasNumber(min); w=svgcanvas; break; } default: return NULL; } if(parent==work_space) {//Add window in workspace QMdiSubWindow *mdi=work_space->addSubWindow(w); mdi->setAttribute(Qt::WA_DeleteOnClose); mdi->setWindowIcon(w->windowIcon()); } return w; } void Main::openTools(QXmlStreamReader &xml, QString config_name) { QList tools; QHash tools_type; QWidget *parent; BaseWidget *bw; tools_type["terminal"]=TERMINAL; tools_type["help"]=HELP; tools_type["table"]=TABLE; tools_type["dynamic_help"]=DYNAMIC_HELP; tools_type["editor"]=EDITOR; tools_type["navigator"]=NAVIGATOR; tools_type["variables_list"]=VARIABLESLIST; tools_type["command_list"]=COMMANDLIST; tools_type["main_window"]=MAINWINDOW; tools_type["svgcanvas"]=SVGCANVAS; while (!xml.atEnd()) { xml.readNext(); if( xml.isStartElement() ) { if(xml.name()=="tool") { QXmlStreamAttributes attr=xml.attributes(); QString type=attr.value("type").toString(); if(!tools_type.contains(type)) { printf("Type %s isn't in database\n", type.toLocal8Bit().data()); return; } QString place=attr.value("place").toString(); if(place=="window") parent=NULL; else parent=work_space; // place=="workspace" if(type=="terminal") { bw=(BaseWidget*)session.getFirstTool(TERMINAL); } else if(type=="main_window") { bw=(BaseWidget*)session.getFirstTool(MAINWINDOW); } else if(tools.isEmpty()) { bw=createTool(tools_type[type], parent); } else { bw=createTool(tools_type[type], tools.last()); } QString title=attr.value("title").toString(); if( !title.isEmpty() ) bw->setWindowTitle(title); if(place!="window") //place=="workspace" { int x=0; if( attr.hasAttribute("xPosition") ) x=attr.value("xPosition").toString().toInt(); int y=0; if( attr.hasAttribute("yPosition") ) y=attr.value("yPosition").toString().toInt(); int width=300; if( attr.hasAttribute("width") ) width=attr.value("width").toString().toInt(); int height=300; if( attr.hasAttribute("height") ) height=attr.value("height").toString().toInt(); bool maximized=false; if( attr.hasAttribute("maximized") ) maximized=(attr.value("maximized").toString()=="true"); bool minimized=false; if( attr.hasAttribute("minimized") ) minimized=(attr.value("minimized").toString()=="true"); if(bw!=NULL) { InitialPosition initPos; initPos.x=x; initPos.y=y; if(width<=0) width=100; if(height<=0) height=100; initPos.width=width; initPos.height=height; initPos.maximized=maximized; initPos.minimized=minimized; initPos.widget=bw->parentWidget(); if(initPos.widget!=NULL) initialPositionList.append(initPos); //bw->show(); //bw->move(x,y); //bw->resize(width, height); } } tools.append(bw); switch( bw->widgetType() ) { case HELP: { { Help *help=(Help*)bw; if(get_config("help_path").isEmpty()) help->setSource( HELP_PATH ); else help->setSource(get_config("help_path")); } break; } default: ; } } else if(!tools.isEmpty()) { QXmlStreamAttributes attr=xml.attributes(); switch( tools.last()->widgetType() ) { case TABLE: { Table* table=(Table*)tools.last(); if(xml.name()=="matrix") { QString value=attr.value("value").toString(); table->setMatrix(value); table->windowActivated(); } break; } default: ; } if(xml.name()=="state") { QString state=xml.readElementText(); tools.last()->restoreState( QByteArray::fromHex(state.toAscii()) ); } } else if(xml.name()=="tools_config" && !config_name.isEmpty() ) { QXmlStreamAttributes attr=xml.attributes(); QString name=attr.value("name").toString(); if(name!=config_name) { while (!xml.atEnd()) { xml.readNext(); if( xml.isStartElement() ) { if(xml.name()=="tools_config") { QXmlStreamAttributes attr=xml.attributes(); QString name=attr.value("name").toString(); if(name==config_name) break; } } } } } } else if( xml.isEndElement() ) { if( xml.name()=="tool" /*&& !tools.isEmpty()*/ ) { BaseWidget *bw=tools.last(); tools.removeLast(); if(!tools.isEmpty() && bw->widgetType()!=TERMINAL && bw->widgetType()!=MAINWINDOW) tools.last()->addDock(bw); bw->show(); } } } connect(&timer, SIGNAL(timeout()), this, SLOT(initialPosition_callback())); timer.setSingleShot(true); timer.start(5000); } void Main::initialPosition_callback() { foreach(InitialPosition i, initialPositionList) { i.widget->move(i.x,i.y); i.widget->resize(i.width, i.height); if(i.maximized) i.widget->showMaximized(); if(i.minimized) i.widget->showMinimized(); } } void Main::openFilesToEdit(QStringList files) { if(files.isEmpty()) return; BaseWidget *bw=(BaseWidget*)session.getFirstTool(EDITOR); if(bw==NULL) bw=createTool(EDITOR, NULL); Editor *editor=(Editor*)bw; editor->loadFiles(files); editor->show(); } #include #include /** Process comand line looking for files to open. */ static QStringList command_line_find_files(int argn, char *argv[]) { QStringList files; for(int i=1;ishowMessage ("Starting QtOctave",Qt::AlignBottom|Qt::AlignLeft); splash->show(); // Translations QString transFile; QTranslator qtTranslator, qtoctaveTranslator; QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Qt translations QString locales=QLocale::system().name(); //if(locales.length()>2) //{ // locales.resize(2); //} if(qtTranslator.load("qt_" + QLocale::system().name(), //"/usr/share/qt4/translations" QLibraryInfo::location(QLibraryInfo::TranslationsPath) ) ) { a.installTranslator(&qtTranslator); printf("[main()] Loaded QT Translation file for locale '%s'.\n", QLocale::system().name().toLocal8Bit().data()); } else { printf("[main()] Error loading the QT Translation file for locale '%s'.\n", QLocale::system().name().toLocal8Bit().data()); } // QtOctave translations if(qtoctaveTranslator.load("qtoctave_" + locales, LANG_PATH)) { a.installTranslator(&qtoctaveTranslator); printf("[main()] Loaded translation file for locale '%s'.\n", QLocale::system().name().toLocal8Bit().data()); } else { printf("[main()] Error loading the translation file for locale '%s'. Not found in %s \n", locales.toLocal8Bit().data(), LANG_PATH); } // Load a.processEvents(); Main m; //Open command line files m.openFilesToEdit(command_line_find_files(argn,argv)); //Destroy splash screnn splash->finish(m.mainWindowWidget()); delete splash; return a.exec(); } qtoctave-0.10.1/qtoctave/src/octave_pos.js0000644000175000017500000000036511511434227017540 0ustar lucaslucasvar WshShell = WScript.CreateObject("WScript.Shell") var bKey = WshShell.RegRead("HKEY_LOCAL_MACHINE\\SOFTWARE\\Cygnus Solutions\\Cygwin\\mounts v2\\/usr/bin\\native") //WScript.Echo("\""+bKey+"/sh\" octave.sh") WScript.Echo("\""+bKey+"/sh\" ") qtoctave-0.10.1/qtoctave/src/session.h0000644000175000017500000000217011511434227016670 0ustar lucaslucas#ifndef __SESSION_H__ #define __SESSION_H__ #include #include #include /**Types of widgets.*/ enum WidgetType { MAIN,MAINWINDOW,TERMINAL,TABLE,HELP,DYNAMIC_HELP, EDITOR,NAVIGATOR,VARIABLESLIST,COMMANDLIST,SVGCANVAS, NONE }; QString widgetName(WidgetType type); /**Generic config of session.*/ class Session:public QObject { Q_OBJECT QString project_name; QHash < WidgetType, QVector > tools; public: Session(QObject * parent = 0); /**Actual project name.*/ inline QString getProjectName() {return project_name;}; /**Sets actual project name.*/ void setProjectName(QString project_name); /**Add new tool to session.*/ void addTool(WidgetType type, QObject *tool); /**Get tools of type.*/ QVector getTools(WidgetType type); /**Get all tools.*/ QVector getTools(); /**Get 1st tool of this type.*/ QObject *getFirstTool(WidgetType type); /**Remove tool.*/ void removeTool(QObject *tool); signals: /**New tool added.*/ void newTool(WidgetType type, QObject *tool); /**Project changed.*/ void projectChanged(QString project_name); }; #endif qtoctave-0.10.1/qtoctave/src/table.h0000644000175000017500000001160411511434227016276 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __TABLE_H__ #define __TABLE_H__ #include #include #include #include #include "octave_connection.h" #include "ui_table_ui.h" #include "basewidget.h" #include "operations/table_plot.h" using namespace Ui; class ComplexNumberTableModel; /** Shows QTable with spreadsheet. Spreadsheet's data are from given matrix. When spreadsheet is modificated, matrix is modificated. */ class Table:public BaseWidget { Q_OBJECT public: Table( QWidget * parent = 0 ); void setOctaveConnection(OctaveConnection *octave_connection); void setMatrix(QString matrix); QString getMatrix(); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); void toXML(QXmlStreamWriter &xml); private: TableForm *table_form; OctaveConnection *octave_connection; QString matrix; QStringList dimensions; QList spinbox_dimensions; void change_rows(); void change_cols(); void build_menu(); QMenu *menu; ComplexNumberTableModel *model; void reloadCell(int row, int col); /**Returns matrix name and change : by row and col. Per example, if we are editing matrix a(1,2,:,2,:), matrix_row_col("2","2")==a(1,2,2,2,2). If ranges==true, then show 1:size(a)(#dimension) in other dimensions. For example, matrix_row_col("2","2", true)==a(1:size(a)(1),1:size(a)(2),2,1:size(a)(4),2). % is changed for column number. */ QString matrix_row_col(QString row, QString col, bool ranges=false); /**Returns Octave command to resize matrix. If add==true, then rows or cols are added to dimensions. Negative rows or cols between brackets.*/ QString resize_matrix(QString rows, QString cols, bool add=false); /**Regular expresions:*/ QRegExp mre; //Used in line_ready /**Init most used regular expresions*/ void init_regular_expresions(); protected: void contextMenuEvent ( QContextMenuEvent * event ); public slots: void windowActivated ( QWidget * w ); void windowActivated(); //Plot callbacks void plot(TablePlot::Type); void plotPlot(); void plotPolar(); void plotLogXandY(); void plotLogY(); void plotLogX(); void plotBar(); /** Callback to line_ready signal from OctaveConnection. * @param line line from Octave. */ void line_ready(QString line); void cellChanged ( int row, int col, QString value ); void rows_changed(); void cols_changed(); void order_changed(); void copy_cb(); void copy_matrix_cb(); void paste_cb(); void delete_rows_cb(); void delete_columns_cb(); void insert_column_right_cb(); void insert_column_left_cb(); void insert_row_down_cb(); void insert_row_up_cb(); }; class ComplexNumberTableModel: public QAbstractTableModel { Q_OBJECT private: double **real, **imag; int rows, cols; public: ComplexNumberTableModel(QObject *parent=0); ~ComplexNumberTableModel(); inline void setRawData(int row, int col, double real) { this->real[row][col]=real; this->imag[row][col]=0; } inline void setRawData(int row, int col, double real, double imag) { this->real[row][col]=real; this->imag[row][col]=imag; } int rowCount ( const QModelIndex & parent = QModelIndex() ) const; int columnCount ( const QModelIndex & parent = QModelIndex() ) const; QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const; bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); Qt::ItemFlags flags ( const QModelIndex & index ) const; QString data(int row, int col) const; void resize( int _rows, int _columns); void update(); void update(int row, int col) ; signals: void cellChanged( int, int, QString); }; class LineEditDelegate : public QItemDelegate { Q_OBJECT public: LineEditDelegate(QObject *parent = 0); void setEditorData(QWidget *editor, const QModelIndex &index) const; #ifdef __DELEGATE_WIDGET__ QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; protected: bool eventFilter ( QObject * object, QEvent * event ); #endif }; #endif qtoctave-0.10.1/qtoctave/src/Doxyfile0000644000175000017500000014515311511434227016553 0ustar lucaslucas# Doxyfile 1.4.7 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = QtOctave # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.3 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ./doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = YES # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO qtoctave-0.10.1/qtoctave/src/pkg_bind.h0000644000175000017500000000300211511434227016755 0ustar lucaslucas/* Copyright (C) 2008 Alejandro Álvarez * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef PKG_BIND_H #define PKG_BIND_H #include #include class PkgBind: private QObject { Q_OBJECT private: QString invokeCmd; QSet commands; static PkgBind *instance; /* Constructor * Singleton */ PkgBind(); public: /* Get the unique instance * or create it if there isn't any */ static PkgBind *getInstance(); /* Load the command list from a file */ void loadCommandList(); /* Check if a symbol is defined * as a funciont included in some package */ bool checkSymbol(const QString &s); /* Invoke the package manager * for install the package with the command * "cmd" */ void invokePackageManager(const QString &s); public slots: void invokeResponse(int result); }; #endif qtoctave-0.10.1/qtoctave/src/basewidget.cpp0000644000175000017500000001400511511434227017656 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "basewidget.h" #include #include #include "mainwindow.h" BaseWidget::BaseWidget(QWidget *parent):QMainWindow(parent) { setAttribute(Qt::WA_DeleteOnClose); //setFocusPolicy(Qt::StrongFocus); session=NULL; QWidget *central=new QWidget(this); setCentralWidget(central); QMenu *windows_menu=menuBar()->addMenu(tr("View")); QAction *outAction= windows_menu->addAction(tr("Show outside of main window")); connect(outAction, SIGNAL(triggered ()), this, SLOT(show_out_main_window_callback())); QAction *inAction= windows_menu->addAction(tr("Show inside of main window")); connect(inAction, SIGNAL(triggered ()), this, SLOT(show_in_main_window_callback())); dockMenu=windows_menu->addMenu(tr("Add to...")); connect(windows_menu, SIGNAL(aboutToShow ()), this, SLOT(showDockableObjects()) ); connect(windows_menu,SIGNAL(aboutToHide ()), this, SLOT(hideDockableObjects()) ); connect(dockMenu,SIGNAL( triggered(QAction*) ), this, SLOT( dockObject(QAction*) ) ); } BaseWidget::~BaseWidget() { if(session!=NULL) { session->removeTool(this); } } WidgetType BaseWidget::widgetType() { return widget_type; } // void BaseWidget::focusInEvent(QFocusEvent * event) // { // //emit widget_activated(this); // //menuBar()->show(); // //layout()->update(); // //update(); // //printf("Foco ganado\n"); // QWidget::focusInEvent(event); // } // // void BaseWidget::focusOutEvent(QFocusEvent * event) // { // //menuBar()->hide(); // //layout()->update(); // //update(); // //printf("Foco perdido\n"); // QWidget::focusOutEvent(event); // } void BaseWidget::setSession(Session *session) { this->session=session; session->addTool(widget_type, this); } Session *BaseWidget::getSession() { return session; } QMenu *BaseWidget::get_menu() { return NULL; } void BaseWidget::show_out_main_window_callback() { BaseWidget *w=copyBaseWidget(); addAllDocksTo(w); w->show(); QWidget *padre=(QWidget *)parent(); QWidget *main_window=(QWidget *)(session->getFirstTool(MAINWINDOW)); if(main_window!=padre && padre!=NULL && padre!=0) { padre->setAttribute(Qt::WA_DeleteOnClose); padre->close(); } } void BaseWidget::show_in_main_window_callback() { MainWindow *main_window=(MainWindow *)session->getFirstTool(MAINWINDOW); QList list=main_window->work_space->subWindowList(); for(int i=0;iwidget()==this) { return; } } BaseWidget *w=copyBaseWidget(main_window->work_space); addAllDocksTo(w); main_window->work_space->addSubWindow(w); w->show(); if((QObject*)main_window!=parent()) { if( parent()!=NULL && parent()!=0) { QWidget *w=(QWidget*)parent(); w->setAttribute(Qt::WA_DeleteOnClose); w->close(); return; } else close(); } } void BaseWidget::showDockableObjects() { dockMenu->clear(); if(session==NULL) return; QVector tools=session->getTools(); QVector main_tools=session->getTools(MAIN); BaseWidget *w, *w1=NULL; for(int i=0;icontainsBaseWidget(this) ) continue; for(int j=0;jcontainsBaseWidget(w) && w1->containsBaseWidget(this) ) break; w1=NULL; } if(w1!=NULL) continue; QAction *_action=dockMenu->addAction(w->windowIcon(), w->windowTitle()); _action->setData(QVariant::fromValue((QWidget*)w)); } } void BaseWidget::hideDockableObjects() { //dockMenu->clear(); } void BaseWidget::dockObject(QAction *_action) { BaseWidget *w=(BaseWidget *)(_action->data().value()); BaseWidget *child=copyBaseWidget(w); addAllDocksTo(child); w->addDock(child); QObject *main_window=(session->getFirstTool(MAINWINDOW)); if(main_window!=parent()) { if( parent()!=NULL && parent()!=0) { QWidget *w=(QWidget*)parent(); w->setAttribute(Qt::WA_DeleteOnClose); w->close(); return; } else close(); } //close(); } void BaseWidget::addDock(QWidget *w) { QDockWidget *dock = new QDockWidget(w->windowTitle(),this); dock->setObjectName(w->windowTitle()); addDockWidget(Qt::LeftDockWidgetArea, dock); dock->setWidget(w); dock->setAttribute(Qt::WA_DeleteOnClose); dock->show(); docks.append(dock); connect(dock, SIGNAL(destroyed(QObject*)), this, SLOT(dock_destroyed_cb(QObject *))); } QVector BaseWidget::getDocks() { return docks; } void BaseWidget::dock_destroyed_cb (QObject *obj) { int i=docks.indexOf(obj); if(i<0) return; docks.remove(i); } void BaseWidget::addAllDocksTo(BaseWidget *w) { for(int i=0;iwidget()); BaseWidget *child=bw->copyBaseWidget(w); bw->addAllDocksTo(child); w->addDock(child); } QByteArray state=saveState(); w->restoreState( state ); w->update(); } bool BaseWidget::containsBaseWidget(BaseWidget *w) { if(w==this) return true; for(int i=0;iwidget()); if(bw->containsBaseWidget(w)) return true; } return false; } void BaseWidget::toXML(QXmlStreamWriter &xml) { } qtoctave-0.10.1/qtoctave/src/syntax.cpp0000644000175000017500000003242511511434227017074 0ustar lucaslucas/* Copyright (C) 2010 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "syntax.h" #include #include #include #include Syntax::Syntax(QObject * parent):QSyntaxHighlighter(parent) { } bool Syntax::load(QString file) { if(xmlSyntaxFileName==file) return true; else xmlSyntaxFileName=file; printf("[Syntax::load] Loading syntax\n"); QXmlStreamReader xml; QStack stack; QFile fileDevice(file); if (!fileDevice.open(QFile::ReadOnly | QFile::Text)) { printf("Error al abrir el archivo\n"); return false; } highlightingRules.clear(); highlightingBlockRules.clear(); highlightingBracketsRules.clear(); xml.setDevice(&fileDevice); QMap values; QVector xmlMainItems; xmlMainItems << "item" << "block" << "bracket"; int ruleOrder=0; while (!xml.atEnd()) { QXmlStreamReader::TokenType tokenType=xml.readNext(); switch(tokenType) { case QXmlStreamReader::StartElement: if(xml.name()!="syntax") { if( xmlMainItems.contains(xml.name().toString()) ) stack.push(xml.name().toString()); else values[xml.name().toString()]=xml.readElementText().trimmed(); } break; case QXmlStreamReader::EndElement: if(stack.isEmpty()) break; QString name=stack.top(); if(name==xml.name()) stack.pop(); if(stack.isEmpty()) { QTextCharFormat format; if(values.contains("bold") && values["bold"]=="true") format.setFontWeight(QFont::Bold); if(values.contains("underline") && values["underline"]=="true") format.setFontUnderline(true); if(values.contains("italic") && values["italic"]=="true") format.setFontItalic(true); if(values.contains("foreground")) format.setForeground(QBrush(QColor(values["foreground"]))); if(values.contains("background")) format.setBackground(QBrush(QColor(values["background"]))); if(name=="item") { HighlightingRule rule; rule.format=format; rule.pattern=QRegExp(values["pattern"]); rule.ruleOrder=ruleOrder++; highlightingRules.append(rule); values.clear(); } else if(name=="block" || name=="bracket") { HighlightingBlockRule rule; rule.format=format; rule.startPattern=QRegExp(values["startPattern"]); rule.endPattern=QRegExp(values["endPattern"]); rule.ruleOrder=ruleOrder++; if(name=="block") highlightingBlockRules.append(rule); else highlightingBracketsRules.append(rule); //Bracket rule values.clear(); } } break; } } if (xml.hasError()) { // do error handling printf("Error %s: %ld:%ld %s\n", file.toLocal8Bit().data(), xml.lineNumber(), xml.columnNumber(), xml.errorString().toLocal8Bit().data() ); return false; } return true; } Syntax::Rule1st Syntax::highlight1stRule(const QString & text, int startIndex) { Rule1st rule1st; rule1st.startIndex=text.length(); rule1st.rule=-1; for(int i=0; ipattern); int index = rule->lastFound; //printf("[Syntax::highlight1stRule] i=%d pos=%d startIndex=%d\n", i, index, startIndex); if(index>-1 && indexlastFound = index = expression->indexIn(text, startIndex); } if ( index>-1 && indexmatchedLength(); rule1st.rule=i; rule1st.ruleOrder=rule->ruleOrder; } if(index==startIndex) break; } if(rule1st.rule==-1) rule1st.startIndex=-1; return rule1st; } Syntax::Rule1st Syntax::highlight1stBlockRule(const QString & text, int startIndex) { Rule1st rule1st; rule1st.startIndex=text.length(); rule1st.rule=-1; for(int i=0; i-1 && indexbrackets */ static void insertInOrder(BlockData *blockData, BlockData::Bracket &bracket) { if(blockData->brackets.isEmpty()) blockData->brackets.append(bracket); else { int j=0; for(;jbrackets.size();j++) { if(blockData->brackets[j].pos>bracket.pos) { blockData->brackets.insert(j,bracket); break; } } if(j>=blockData->brackets.size()) { blockData->brackets.append(bracket); } } } void Syntax::findBrackets(const QString & text, int start, int end, BlockData *blockData) { //blockData->brackets.clear(); if( end<0 || end>text.length() ) end=text.length(); if(start>end) return; for(int i=0; i-1 && index-1 && index= 0) { Rule1st rule1st; rule1st.rule=previousBlockState(); rule1st.startIndex=0; startIndex=blockRuleSetFormat(text,rule1st); //TODO: Posible fallo al establecer el estado del bloque if(startIndex==text.length()) return; } //Gets BlockData BlockData *blockData=new BlockData(); //Finds first rule to apply. Rule1st rule1st, blockRule1st; //Find initial matches for(int i=0; ipattern); int index = expression->indexIn(text, startIndex); rule->lastFound = index; //printf("[Syntax::highlightBlock] index=%d pos=%d \n", index, expression->pos(0)); } //printf("[Syntax::highlightBlock] Find initial matches \n"); rule1st=highlight1stRule( text, startIndex); blockRule1st=highlight1stBlockRule( text, startIndex); //if(rule1st.rule<0 && blockRule1st.rule<0) //{ // findBrackets(text, startIndex, -1, blockData); //} //else while(rule1st.rule>=0 || blockRule1st.rule>=0) { if(rule1st.rule>=0 && blockRule1st.rule>=0) { if ( rule1st.startIndex=0) { findBrackets(text, startIndex, rule1st.startIndex, blockData); startIndex=ruleSetFormat(rule1st); rule1st=highlight1stRule( text, startIndex); } else { findBrackets(text, startIndex, blockRule1st.startIndex, blockData); startIndex=blockRuleSetFormat(text,blockRule1st); blockRule1st=highlight1stBlockRule( text, startIndex); } //Finds next 1st rule //rule1st=highlight1stRule( text, startIndex); //blockRule1st=highlight1stBlockRule( text, startIndex); } findBrackets(text,startIndex, -1, blockData); setCurrentBlockUserData(blockData); } /**Search brackets in one QTextBlock.*/ static BlockData::Bracket *searchBracket(int i, int increment, int &bracketsCount, BlockData *blockData, BlockData::Bracket *bracket1) { if(blockData==NULL) return NULL; if(i==-1) i=blockData->brackets.size()-1; for(; i>=0 && ibrackets.size(); i+=increment) { BlockData::Bracket *bracket=&(blockData->brackets[i]); if(bracket->type==bracket1->type) { if(bracket->startBracketOk!=bracket1->startBracketOk) bracketsCount--; else bracketsCount++; if(bracketsCount==0) return bracket; } } //printf("[searchBracket] bracketsCount=%d\n", bracketsCount); return NULL; } void Syntax::setFormatPairBrackets(QPlainTextEdit *textEdit) { QList selections; textEdit->setExtraSelections(selections); QTextCursor cursor=textEdit->textCursor(); QTextBlock block=cursor.block(); BlockData *blockData=(BlockData *)block.userData(); if(blockData==NULL) return; int pos=cursor.position()-block.position(); BlockData::Bracket *bracket1; QTextBlock block_bracket1=block; int i=blockData->brackets.size()-1; /* printf("[Syntax::setFormatPairBrackets] brackets.size=%d\n", i+1); for(int x=0;xbrackets.size();x++) { BlockData::Bracket *bracket=&(blockData->brackets[x]); printf("[Syntax::setFormatPairBrackets] bracket.pos=%d bracket.type=%d bracket.len=%d bracket.start=%d\n", bracket->pos, bracket->type, bracket->length, (bracket->startBracketOk) ); } */ for(; i>=0; i--) { BlockData::Bracket *bracket=&(blockData->brackets[i]); if(bracket->pos==pos) { bracket1=bracket; break; } } if(i<0) return; int increment=(bracket1->startBracketOk) ? +1:-1; int bracketsCount=0; //i+=increment; //Looks in this block the other bracket BlockData::Bracket *bracket2=NULL; QTextBlock block_bracket2=block; bracket2=searchBracket( i, increment, bracketsCount, blockData, bracket1); { //Search brackets in other blocks while( bracket2==NULL ) { if(increment>0) { block_bracket2=block_bracket2.next(); i=0; } else { block_bracket2=block_bracket2.previous(); i=-1; } if(!block_bracket2.isValid()) break; blockData=(BlockData *)block_bracket2.userData(); /* printf("[Syntax::setFormatPairBrackets] Interno brackets.size=%d\n", blockData->brackets.size()); for(int x=0;xbrackets.size();x++) { BlockData::Bracket *bracket=&(blockData->brackets[x]); printf("[Syntax::setFormatPairBrackets] bracket.pos=%d bracket.type=%d bracket.len=%d bracket.start=%d\n", bracket->pos, bracket->type, bracket->length, (bracket->startBracketOk) ); } */ bracket2=searchBracket( i, increment, bracketsCount, blockData, bracket1); } if(bracket2==NULL) return; } pos=cursor.position(); QTextEdit::ExtraSelection selection1; cursor.setPosition(pos+bracket1->length, QTextCursor::KeepAnchor); selection1.cursor=cursor; selection1.format=highlightingBracketsRules[bracket1->type].format; pos=bracket2->pos+block_bracket2.position(); QTextEdit::ExtraSelection selection2; cursor.setPosition(pos); cursor.setPosition(pos+bracket2->length, QTextCursor::KeepAnchor); selection2.cursor=cursor; selection2.format=highlightingBracketsRules[bracket2->type].format; selections.append(selection1); selections.append(selection2); textEdit->setExtraSelections(selections); } BlockData::BlockData():QTextBlockUserData() { } qtoctave-0.10.1/qtoctave/src/navigator.cpp0000644000175000017500000005671011511434227017543 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PQListView ARTICULAR 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. */ //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "navigator.h" #include "config.h" Navigator::Navigator(QWidget *parent) : BaseWidget(parent) { widget_type=NAVIGATOR; octave_connection=NULL; copy_ok=false; cut_ok=false; setWindowTitle(tr("Navigator")); setWindowIcon( QIcon(QString( ICON_PATH )+"/new_folder.png")); createActions(); //createMenuBar(); createToolBar(); createLayout(); createConnections(); createContextMenu(); centralWidget()->setLayout(layout); //show(); } void Navigator::createActions() { newFolder = new QAction(QIcon(QString(ICON_PATH) + "/new_folder"), tr("&New folder"), this); exit = new QAction(QIcon(QString(ICON_PATH) + "/exit.png"), tr("Exit"), this); cut = new QAction(QIcon(QString(ICON_PATH) + "/editcut"), tr("Cu&t"), this); copy = new QAction(QIcon(QString(ICON_PATH) + "/editcopy"), tr("&Copy"), this); paste = new QAction(QIcon(QString(ICON_PATH) + "/editpaste"), tr("&Paste"), this); back = new QAction(QIcon(QString(ICON_PATH) + "/back.png"), tr("&Back"), this); forward = new QAction(QIcon(QString(ICON_PATH) + "/forward.png"), tr("&Forward"), this); up = new QAction(QIcon(QString(ICON_PATH) + "/up.png"), tr("Up"), this); remove=new QAction(QIcon(QString(ICON_PATH) + "/button_cancel.png"), tr("Delete file"), this); rename=new QAction(tr("Rename"), this); /* */ } /*void Navigator::createMenuBar() { menubar = new QMenuBar(this); QMenu *menu = menubar->addMenu("&File"); menu->addAction(newFolder); menu->addAction(exit); menu = menubar->addMenu("&Edit"); menu->addAction(cut); menu->addAction(copy); menu->addAction(paste); menu = menubar->addMenu("&Navigator"); menu->addAction(back); menu->addAction(forward); menu->addAction(up); }*/ void Navigator::setSession(Session *session) { //Sets octave_connection to NULL to not change dir at creation //Uses last pwd in Octave. OctaveConnection *oc=octave_connection; octave_connection=NULL; BaseWidget::setSession(session); setProject(session->getProjectName()); connect(session, SIGNAL(projectChanged(QString)), this, SLOT(setProject(QString)) ); //Restore octave_connection octave_connection=oc; } void Navigator::createToolBar() { toolbar = addToolBar(tr("Navigation tools")); toolbar->setObjectName("Navigation tools"); //toolbar->setMinimumHeight(40); //toolbar->setMaximumHeight(40); toolbar->addAction(back); toolbar->addAction(forward); toolbar->addAction(up); toolbar->addSeparator(); toolbar->addAction(cut); toolbar->addAction(copy); toolbar->addAction(paste); toolbar->addSeparator(); toolbar->addAction(newFolder); } void Navigator::createLayout() { layout = new QVBoxLayout(centralWidget()); layout->setSpacing(0); layout->setMargin(0); //layout->setMenuBar(menubar); //layout->setStretchFactor(toolbar, 0); //layout->addWidget(toolbar); listmodel = new QFileSystemNewModel(); listmodel->setResolveSymlinks(true); listmodel->setFilter(QDir::AllDirs|QDir::AllEntries|QDir::NoDotAndDotDot); listmodel->setNameFilters(QStringList() << "*.m"); listmodel->sort(QFileSystemModel::FileNameRole); url = new QComboBox(this); url->setEditable(true); url->setDuplicatesEnabled(false); url->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); QCompleter *completer = new QCompleter(this); completer->setModel(new QDirModel(completer)); url->setCompleter(completer); go = new QPushButton(tr("Go"), this); go->setFixedSize(url->height(), url->height()); QHBoxLayout *urlBox = new QHBoxLayout(); urlBox->addWidget(url); urlBox->addSpacing(10); urlBox->addWidget(go); urlBox->addSpacing(10); layout->addLayout(urlBox); filter_comboBox=new QComboBox(this); filter_comboBox->setEditable(true); filter_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLengthWithIcon); filter_comboBox->addItem("*.m"); filter_comboBox->addItem("*"); filter_comboBox->addItem("*.txt"); filter_comboBox->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding); QHBoxLayout *filterBox = new QHBoxLayout(); QLabel *filters_label=new QLabel(tr("Filters: ")); filterBox->addWidget(filters_label); filterBox->addWidget(filter_comboBox); layout->addLayout(filterBox); QString paths=get_config("navigator_start_path"), path = QDir::currentPath(); if(!paths.isEmpty()) { QStringList values=paths.split("\n"); url->addItems(values); } QModelIndex root = listmodel->index(path); if(!root.isValid()) { path = QDir::currentPath(); root = listmodel->index(path); } listmodel->setRootPath(QDir::rootPath()); printf("[Navigator::createLayout] Building listview\n"); listview = new DragDropQTreeView(this); listview->setSelectionMode(QAbstractItemView::ExtendedSelection); listview->setContextMenuPolicy(Qt::CustomContextMenu); listview->setMouseTracking(true); listview->setSortingEnabled(true); listview->setItemsExpandable(false); listview->setRootIsDecorated(false); listview->setModel(listmodel); listview->setRootIndex(root); //listview->setCursor(Qt::OpenHandCursor); //printf("[Navigator::createLayout] Listview builded\n"); url->lineEdit()->setText(path); back->setEnabled(false); forward->setEnabled(false); if (!(listmodel->parent(root)).isValid()) up->setEnabled(false); layout->addWidget(listview,1); } QString Navigator::getNavigatorCurrentPath() { QModelIndex root = listview->rootIndex(); QString rootPath = listmodel->filePath(root); return rootPath; } Navigator::~Navigator() { QMap configuration; QString values=getNavigatorCurrentPath(); QStringList repetidos; repetidos << values; for(int i=0;icount() && i<10;i++) { QDir dir(url->itemText(i)); if(!repetidos.contains(url->itemText(i)) && dir.exists()) { values+="\n"+url->itemText(i); repetidos << url->itemText(i); } } configuration["navigator_start_path"]=values; set_config(configuration); if(project_name.isEmpty()) Projects::saveNavigatorPath("Empty", getNavigatorCurrentPath()); else Projects::saveNavigatorPath(project_name, getNavigatorCurrentPath()); } void Navigator::setProject(QString name) { project_name=name; setNavigatorCurrentPath(Projects::navigatorPath(name)); } void Navigator::createConnections() { connect(listview, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(expanded(const QModelIndex &))); connect(listview, SIGNAL(entered(const QModelIndex &)), this, SLOT(change_cursor_cb(const QModelIndex &))); connect(back, SIGNAL(triggered(bool)), this, SLOT(goBack(bool))); connect(forward, SIGNAL(triggered(bool)), this, SLOT(goForward(bool))); connect(up, SIGNAL(triggered(bool)), this, SLOT(goUp(bool))); //connect(url->lineEdit(), SIGNAL(returnPressed()), this, SLOT(urlButtonPressed())); connect(url, SIGNAL(activated(const QString & )), this, SLOT(urlButtonPressed(const QString &))); connect(go, SIGNAL(clicked(bool)), this, SLOT(urlButtonPressed(bool))); connect(filter_comboBox, SIGNAL(activated(const QString & )), this, SLOT(filter_cb(const QString &))); connect(newFolder, SIGNAL( triggered() ), this, SLOT( mkdir() ) ); connect(listview, SIGNAL( customContextMenuRequested ( const QPoint & ) ), this, SLOT( contextMenu_cb( const QPoint & ) ) ); connect(copy, SIGNAL( triggered() ), this, SLOT( copy_cb() ) ); connect(cut, SIGNAL( triggered() ), this, SLOT( cut_cb() ) ); connect(remove, SIGNAL( triggered() ), this, SLOT( remove_cb() ) ); connect(paste, SIGNAL( triggered() ), this, SLOT( paste_cb() ) ); connect(rename, SIGNAL( triggered() ), this, SLOT( rename_cb() ) ); } void Navigator::setOctaveConnection(OctaveConnection *oc) { octave_connection=oc; } void Navigator::setUrl(const QModelIndex &index) { QString path = listmodel->filePath(index); url->lineEdit()->setText(path); } void Navigator::setUpActionState(const QModelIndex &index) { // Disables up Action if index has no parent. If has Enables it if (!(listmodel->parent(index)).isValid()) up->setEnabled(false); else up->setEnabled(true); } void Navigator::expanded(const QModelIndex &index) { setUpActionState(index); if (listmodel->isDir(index)) { QModelIndex root = listview->rootIndex(); QString rootPath = listmodel->filePath(root); // Add current dir to back Action record backHistory.append(rootPath); // Enables back Action back->setEnabled(true); // Clean forward Action record int size = forwardHistory.size(); if ( size > 0) { forwardHistory.remove(0, size); } // Disables forward Action forward->setEnabled(false); // Change current URL to index`s URL setUrl(index); // Change listview current dir listview->setRootIndex(index); //listmodel->refresh(index); if(octave_connection!=NULL) { QFileInfo dirinfo = listmodel->fileInfo(index); octave_connection->command_enter("cd \""+dirinfo.absoluteFilePath()+"\"", true); } } else { //It´s a file... Do something!! //drag_start(index); } } /* void Navigator::drag_start( const QModelIndex & index ) { QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(listmodel->filePath(index)); //printf("%s\n",listmodel->filePath(index).toLocal8Bit().data()); drag->setMimeData(mimeData); drag->setPixmap( (QString(ICON_PATH) + "/filenew.png") ); //drag->setDragCursor(QCursor(Qt::ClosedHandCursor).pixmap(), Qt::CopyAction); //Qt::DropAction dropAction = drag->start(); } */ void Navigator::goBack(bool /*checked*/) { int size = backHistory.size(); if (size > 0) { QString lastPath = backHistory.last(); QModelIndex last = listmodel->index(lastPath); QModelIndex root = listview->rootIndex(); QString rootPath = listmodel->filePath(root); // Disables back Action if there is no more dirs saved if (--size == 0) back->setEnabled(false); // Add current dir to forward Action record forwardHistory.append(rootPath); // Enables forward Action forward->setEnabled(true); // Change current URL to last`s URL setUrl(last); // Change listview current dir listview->setRootIndex(last); //listmodel->refresh(last); listview->scrollTo(listmodel->index(rootPath)); setUpActionState(last); // Remove last dir from back Action record backHistory.remove(size); } } void Navigator::goForward(bool /*checked*/) { int size = forwardHistory.size(); if (size > 0) { QString lastPath = forwardHistory.last(); QModelIndex last = listmodel->index(lastPath); QModelIndex root = listview->rootIndex(); QString rootPath = listmodel->filePath(root); // Disables forward Action if there is no more dirs saved if (--size == 0) forward->setEnabled(false); // Add current dir to back Action record backHistory.append(rootPath); // Enables back Action back->setEnabled(true); // Change current URL to last`s URL setUrl(last); // Change listview current dir listview->setRootIndex(last); //listmodel->refresh(last); setUpActionState(last); // Remove last dir from forward Action record forwardHistory.remove(size); } } void Navigator::goUp(bool /*checked*/) { QModelIndex root = listview->rootIndex(); QModelIndex parent = listmodel->parent(root); emit expanded(parent); } void Navigator::urlButtonPressed(const QString & ) { go->click(); } void Navigator::urlButtonPressed(bool /*checked*/) { setNavigatorCurrentPath( url->lineEdit()->text() ); } void Navigator::setNavigatorCurrentPath(QString path) { if( path.isEmpty() ) return; QModelIndex next = listmodel->index(path); if (next.isValid()) { emit expanded(next); } } #include void Navigator::mkdir() { QString dir_name=QInputDialog::getText(this, tr("New Folder"), tr("Name:") ); if( !dir_name.isEmpty() ) { QModelIndex index = listview->rootIndex(); QDir dir(listmodel->filePath(index)); //printf("%s/%s\n",listmodel->filePath(index).toLocal8Bit().data(), dir_name.toLocal8Bit().data() ); //listmodel->mkdir(index, dir_name); dir.mkdir(dir_name); //listmodel->refresh(index); } } void Navigator::contextMenu_cb( const QPoint & /*pos*/) { context_menu->popup(QCursor::pos () ); } void Navigator::createContextMenu() { context_menu=new QMenu(this); QList actions; actions.append(newFolder); actions.append(copy); actions.append(cut); actions.append(paste); actions.append(remove); actions.append(rename); context_menu->addActions(actions); } /**Returns selected files. */ static QList selected_files(QTreeView *listview, QFileSystemNewModel *listmodel) { QList list; QModelIndexList indexes=listview->selectionModel()->selectedRows(); for(int i=0; ifileInfo(index)); } return list; } void Navigator::copy_cb() { file_list=selected_files(listview, listmodel); file_list_parent_path=listmodel->fileInfo(listview->rootIndex()); copy_ok=true; cut_ok=false; } void Navigator::cut_cb() { file_list=selected_files(listview, listmodel); file_list_parent_path=listmodel->fileInfo(listview->rootIndex()); copy_ok=false; cut_ok=true; } void Navigator::paste_cb() { if(file_list.isEmpty()) return; FileActions *f=new FileActions(this); connect(f, SIGNAL(process_end(QThread*)), this, SLOT(process_end(QThread*)) ); if(copy_ok) { QModelIndex index = listview->rootIndex(); f->copy(file_list_parent_path, file_list, listmodel->filePath(index)); //copy_ok=false; //file_list.clear(); } else if(cut_ok) { QModelIndex index = listview->rootIndex(); f->cut(file_list_parent_path, file_list, listmodel->filePath(index)); cut_ok=false; file_list.clear(); } } void Navigator::remove_cb() { int ok=QMessageBox::question(NULL, tr("Remove file"), tr("Remove selected files?"), QMessageBox::Yes, QMessageBox::No); if(ok!=QMessageBox::Yes) return; file_list=selected_files(listview, listmodel); copy_ok=false; cut_ok=false; if(file_list.isEmpty()) return; FileActions *f=new FileActions(this); connect(f, SIGNAL(process_end(QThread*)), this, SLOT(process_end(QThread*)) ); f->remove(file_list); file_list.clear(); } void Navigator::rename_cb() { QList file_list=selected_files(listview, listmodel); if( file_list.isEmpty() ) return; QString name=QInputDialog::getText(this, tr("Rename"), tr("Name:") ); if( !name.isEmpty() ) { QFileInfo fileinfo=file_list.at(0); QFile::rename(fileinfo.absoluteFilePath(), fileinfo.absolutePath()+"/"+name); //listmodel->refresh(); } } void Navigator::process_end(QThread *object) { object->wait(); //listmodel->refresh(); delete object; } void Navigator::filter_cb(const QString &s) { listmodel->setNameFilters(QStringList() << s); } void Navigator::change_cursor_cb(const QModelIndex &index) { if(listmodel->isDir(index)) listview->setCursor(Qt::ArrowCursor); else listview->setCursor(Qt::OpenHandCursor); } FileActions::FileActions(QObject *parent):QThread(parent) { window=new QWidget; window->setWindowTitle(tr("Processing files...")); QVBoxLayout *layout=new QVBoxLayout; progressBar=new QProgressBar(window); layout->addWidget(progressBar); progressBar->setMinimum(0); progressBar->setMaximum(100); progressBar->setValue(0); progressBar->show(); textEdit=new QTextEdit(window); layout->addWidget(textEdit); textEdit->setReadOnly(true); textEdit->show(); QHBoxLayout *button_layout=new QHBoxLayout; layout->addLayout(button_layout); ok_button=new QPushButton(window); ok_button->setText(tr("Ok")); button_layout->addWidget(ok_button); ok_button->show(); cancel_button=new QPushButton(window); cancel_button->setText(tr("Cancel")); button_layout->addWidget(cancel_button); cancel_button->show(); window->setLayout(layout); connect(cancel_button, SIGNAL(clicked()), this, SLOT(stop()) ); connect(ok_button, SIGNAL(clicked()), this, SLOT(ok_button_callback()) ); connect(this, SIGNAL(process_value(int)), progressBar, SLOT(setValue(int)) ); copy_ok=move_ok=remove_ok=stop_ok=false; window->show(); } FileActions::~FileActions() { delete window; } void FileActions::stop() { if(!isRunning()) emit process_end(this); stop_ok=true; } void FileActions::ok_button_callback() { start(); } void FileActions::copy(QFileInfo parent, QList list, QString path) { this->list=list; this->path=path; this->parent=parent; copy_ok=true; window->show(); set_label_text("

"+tr("These files will be copyed:")+"

"); } void FileActions::cut(QFileInfo parent, QList list, QString path) { this->list=list; this->path=path; this->parent=parent; move_ok=true; window->show(); set_label_text("

"+tr("These files will be cut:")+"

"); } void FileActions::remove(QList list) { this->list=list; remove_ok=true; window->show(); set_label_text("

"+tr("These files will be removed:")+"

"); } QList FileActions::find(QList files) { QList list_files; for(int i=0;i FileActions::find(QFileInfo file) { QList list_files; if(file.isDir()) { QDir dir(file.absoluteFilePath()); list_files=dir.entryInfoList(QDir::NoDotAndDotDot|QDir::Dirs|QDir::Files); for(int i=0;i"; } textEdit->setHtml(text+""); } static QString destinationPathToCopy(QFileInfo parent, QFileInfo file, QString path) { QDir parent_dir(parent.absoluteFilePath()); return path+QDir::separator()+parent_dir.relativeFilePath(file.absoluteFilePath()); } void FileActions::copy(QFileInfo file, QString path) { QString file_path=file.absoluteFilePath(); QString destination_path=destinationPathToCopy(parent, file, path); printf("[FileActions::copy] Destination %s\n", destination_path.toLocal8Bit().data()); QFileInfo destination_info(destination_path); if(destination_info.exists()) return; if(file.isDir()) { QDir pathDir(path); pathDir.mkpath(destination_path); } else { if(! QFileInfo(destination_info.dir().absolutePath()).exists() ) { QDir pathDir(path); pathDir.mkpath(destination_info.dir().absolutePath()); } QFile::copy(file_path, destination_path); } /* #if defined Q_OS_WIN32 system(("copy \""+file_path+"\" \""+path+"\"").toLocal8Bit().data() ); #else system(("cp -fp \""+file_path+"\" \""+path+"\"").toLocal8Bit().data() ); #endif */ } void FileActions::cut(QFileInfo file, QString path) { copy(file, path); remove(file); /* #if defined Q_OS_WIN32 copy(file, path); remove(file); #else QString file_path=file.absoluteFilePath(); QString destination_path=destinationPathToCopy(parent, file, path); printf("[FileActions::cut] Destination %s\n", destination_path.toLocal8Bit().data()); QFileInfo destination_info(destination_path); if( destination_info.exists() || !file.exists() ) return; if(file.isDir()) { QDir pathDir(path); pathDir.mkpath(destination_path); } else { if(! QFileInfo(destination_info.dir().absolutePath()).exists() ) { QDir pathDir(path); pathDir.mkpath(destination_info.dir().absolutePath()); } QFile::rename(file_path, destination_path); } #endif */ } void FileActions::remove(QFileInfo file) { QString file_path=file.absoluteFilePath(); QDir pathDir=file.dir(); if(file.isDir()) { pathDir.rmpath(file_path); } else { pathDir.remove(file_path); } /* #if defined Q_OS_WIN32 system(("del \""+file_path+"\"").toLocal8Bit().data() ); #else system(("rm -f \""+file_path+"\"").toLocal8Bit().data() ); #endif */ } DragDropQTreeView::DragDropQTreeView(QWidget *parent):QTreeView(parent) { } /* void DragDropQTreeView::mousePressEvent(QMouseEvent *event) { QModelIndex index=indexAt( event->pos() ); if (event->button() == Qt::LeftButton && index.isValid() ) { QFileSystemNewModel *listmodel=(QFileSystemNewModel *)model(); //if( index.column()==-1 ) //{ // selectionModel()->select(index, QItemSelectionModel::Toggle); // return; //} if( listmodel->isDir(index) ) { QTreeView::mousePressEvent(event); return; } QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(listmodel->filePath(index)); //printf("%s\n",listmodel->filePath(index).toLocal8Bit().data()); drag->setMimeData(mimeData); drag->setPixmap( (QString(ICON_PATH) + "/filenew.png") ); //drag->setDragCursor(QCursor(Qt::ClosedHandCursor).pixmap(), Qt::CopyAction); drag->start(); } } */ void DragDropQTreeView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { dragStartPosition = event->pos(); //printf("[DragDropQTreeView::mousePressEvent]\n"); } QTreeView::mousePressEvent(event); } void DragDropQTreeView::mouseMoveEvent(QMouseEvent *event) { QModelIndex index=indexAt( event->pos() ); if ( (event->buttons() & Qt::LeftButton) && index.isValid() ) { //if ((event->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance()) // return; QFileSystemNewModel *listmodel=(QFileSystemNewModel *)model(); //if( index.column()==-1 ) //{ // selectionModel()->select(index, QItemSelectionModel::Toggle); // return; //} //printf("[DragDropQTreeView::mouseMoveEvent]\n"); if( listmodel->isDir(index) ) { //QTreeView::mousePressEvent(event); return; } QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(listmodel->filePath(index)); //printf("%s\n",listmodel->filePath(index).toLocal8Bit().data()); drag->setMimeData(mimeData); drag->setPixmap( (QString(ICON_PATH) + "/filenew.png") ); //drag->setDragCursor(QCursor(Qt::ClosedHandCursor).pixmap(), Qt::CopyAction); drag->start(); } QTreeView::mouseMoveEvent(event); } BaseWidget *Navigator::copyBaseWidget(QWidget * parent ) { Navigator *bw=new Navigator(parent); bw->setSession(session); bw->setOctaveConnection(octave_connection); return bw; } qtoctave-0.10.1/qtoctave/src/simpleeditor.h0000644000175000017500000000564111511434227017713 0ustar lucaslucas#ifndef __SIMPLEEDITOR_H__ /* Copyright (C) 2010 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #define __SIMPLEEDITOR_H__ #include #include #include #include "syntax.h" class SimpleEditor:public QPlainTextEdit { Q_OBJECT QString fileName; QTextCharFormat charFormat; QCompleter *completer; QStringListModel *completerModel; Syntax *syntax; QStringList comands_completion_list; bool auto_indent, automatic_indention_statement_ok; //QTextDocument which contains document //It's defined to control when QTextDocument is deleted in views cloned //QTextDocument *_document; public: bool firtsTimeUsedOk; SimpleEditor(QWidget * parent = 0); ~SimpleEditor(); /**Makes document the new document of the text editor. The parent QObject of the provided document remains the owner of the object. If the current document is a child of the text editor, then it is deleted.The document must have a document layout that inherits QPlainTextDocumentLayout (see QTextDocument::setDocumentLayout()). See also document().
* It's reimplemented to control _document deleted. */ void setDocument ( QTextDocument * document ); /**Load a file. * @param file file name to load */ bool load(QString file); bool save(); QString getFileName(); void setFile(QString file); /**Loads XML file with syntax description. */ void loadSyntaxXMLDescription(); void setCharFormat(QTextCharFormat charFormat); /**List of y top left positions of bounding rects of each visible block of text. * @param list List of top left positions. * @param first_line First visible block in TextEdit. */ void publicBlockBoundingRectList(QVector &list, int &first_line); public slots: void activated( const QString & text ); void cursorPositionChangedCallBack(); void autoComplete(int size=3); void autoComplete(int position, int charsRemoved, int charsAdded); protected: virtual void keyPressEvent(QKeyEvent * e); //virtual void focusInEvent(QFocusEvent * event); signals: /**Dinamic help required.*/ void dynamic_help_required(const QString &text); ///**Text modified.*/ //void text_modified(bool ok); //void toggleBreakpoint(int lineno); //void focusChanged(QWidget *); } ; #endif qtoctave-0.10.1/qtoctave/src/CMakeLists.txt0000644000175000017500000000452611511434227017603 0ustar lucaslucasFIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") SET(QT_USE_QTXML 1) include(UseQt4) include_directories(${QT_INCLUDE_DIR}) include_directories(${QT_QT_INCLUDE_DIR}) include_directories(${QT_QTCORE_INCLUDE_DIR}) include_directories(${QT_QTGUI_INCLUDE_DIR}) include_directories(${QT_QTXML_INCLUDE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${QT_QTSVG_INCLUDE_DIR}) FILE(GLOB_RECURSE qtoctave_moc_headers *.h ) FILE(GLOB_RECURSE qtoctave_sources *.cpp ) FILE(GLOB_RECURSE qtoctave_ui *.ui ) configure_file( configure.h.in ${CMAKE_CURRENT_BINARY_DIR}/configure.h ) # run uic on .ui files: QT4_WRAP_UI( qtoctave_ui_headers ${qtoctave_ui} ) # run moc on these files: QT4_WRAP_CPP( qtoctave_moc_sources ${qtoctave_moc_headers} ) # Generate qm files if needed file(GLOB lang_files "lang/*.ts" GLOB "lang/*.qph") foreach(lang_file ${lang_files}) get_filename_component(this_qm ${lang_file} NAME_WE) set(this_qm "${this_qm}.qm") add_custom_command(OUTPUT ${this_qm} COMMAND "lrelease" ARGS ${lang_file} -qm "${this_qm}" DEPENDS ${lang_file} ) set(qm "${qm};${this_qm}") set(qm_build "${qm_build};${CMAKE_CURRENT_BINARY_DIR}/${this_qm}") endforeach() add_executable(qtoctave ${qtoctave_sources} ${qtoctave_moc_sources} ${qtoctave_ui_headers} ${qtoctave_moc_headers} ${qm} ) SET_TARGET_PROPERTIES(qtoctave PROPERTIES INSTALL_RPATH ":usr/lib" BUILD_WITH_INSTALL_RPATH true INSTALL_RPATH_USE_LINK_PATH true ) TARGET_LINK_LIBRARIES(qtoctave ${Qt4_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTSVG_LIBRARY}) install ( DIRECTORY images menus scripts scripts_octave syntax_files DESTINATION share/qtoctave PATTERN ".svn" EXCLUDE ) install( FILES ${qm_build} DESTINATION share/qtoctave/lang ) install ( DIRECTORY octave_doc DESTINATION share/doc/octave-html PATTERN ".svn" EXCLUDE ) install ( DIRECTORY qtoctave_doc DESTINATION share/doc/qtoctave PATTERN ".svn" EXCLUDE ) install ( TARGETS qtoctave RUNTIME DESTINATION bin ) install ( FILES config_files/config.rc DESTINATION share/qtoctave ) install ( FILES config_files/qtoctave.desktop DESTINATION share/applications ) install ( FILES config_files/qtoctave.png DESTINATION share/icons/hicolor/64x64/apps/ ) qtoctave-0.10.1/qtoctave/src/octave_connection.cpp0000644000175000017500000002546111511434227021250 0ustar lucaslucas/* Copyright (C) 2006, 2007, 2008 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "octave_connection.h" #include "config.h" #include #include #include #include #include void Sleep::micro_sleep(unsigned long u_seconds) { usleep(u_seconds); } OctaveConnection::OctaveConnection(QObject * parent ):QProcess(parent) { octave_path=""; init_regular_expresions(); //text=NULL; error_buffer.open(QBuffer::ReadOnly); QObject::connect(this, SIGNAL(readyReadStandardError()), this, SLOT(octaveErrorOutputSlot())); QObject::connect(this, SIGNAL(readyReadStandardOutput()), this, SLOT(octaveOutputSlot())); QObject::connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(octaveFinished(int, QProcess::ExitStatus)) ); } void OctaveConnection::init_regular_expresions() { //Used in octaveOutputSlot regexp_octave_prompt.setPattern("octave:[0-9]+>"); regexp_octave_prompt2.setPattern("octave:[0-9]+\\+>"); regexp_actual_debug_line_column.setPattern("^([a-zA-Z_]\\w*:)+ line ([0-9]+), column ([0-9]+)$"); } void OctaveConnection::setOctavePath(const QString path) { octave_path=path; } QString OctaveConnection::getOctavePath() { return octave_path; } void OctaveConnection::startOctave(bool quiet) { QString extra_args = get_config("octave_arguments"); instructions_left_no=0; debugging = false; bool ok=false; QString version="Not found"; { QProcess in(this); printf("[OctaveConnection::startOctave] Octave path: %s\n", octave_path.toLocal8Bit().data() ); in.start("\""+octave_path+"\" --version", QIODevice::ReadOnly); if( in.waitForStarted() && in.waitForFinished() ) { QByteArray buf=in.readAll(); QRegExp rx("GNU Octave, version ([0-9]*)\\.([0-9]*)\\.([0-9]*)"); int pos = rx.indexIn(buf); if(pos>=0) { version=rx.cap(1)+"."+rx.cap(2)+"."+rx.cap(3); int ver0,ver1,ver2; ver0=rx.cap(1).toInt(); ver1=rx.cap(2).toInt(); ver2=rx.cap(3).toInt(); printf("[OctaveConnection::startOctave] Octave version: %s (%d.%d.%d)\n", version.toLocal8Bit().data(), ver0, ver1, ver2 ); if( (ver0==3 && ver1>=2) || (ver0>3) ) ok=true; } in.close(); } } if(!ok) { printf("Exit code %d\n",ok); QMessageBox::critical (NULL, tr("Warning"), tr("QtOctave requires Octave version 3.2.0 or better.\n" "You can select your Octave executable in\n" "Config/General Configuration/Octave/Octave Path\n" "Your version is:\n")+version ); return; } if(quiet) { start("\""+octave_path+"\" --eval \"PS1(\'\');PS2(\'\');\" --persist --no-history -q -i "+extra_args); } else { QString command("\""+octave_path+"\" --eval \"PS1(\'octave:\\#>\');PS2(\'octave:\\#+>\');addpath('"+QDir(QString(CONFIG_PATH)).absolutePath()+QDir::separator()+"scripts_octave"+QDir::separator()+"')\" --persist --no-history -i "+extra_args); printf("[OctaveConnection::startOctave] Starting octave: %s\n",command.toLocal8Bit().data() ); start(command); } //printf("Waiting octave\n"); if(!waitForStarted()) { QMessageBox::critical (NULL, tr("Warning"), tr("QtOctave in:\n")+octave_path+tr("\nCouldn't be opened.")); } printf("[OctaveConnection::startOctave] Octave running\n"); if( get_config("easy_plot_active")=="true" ) { QString path=get_config("easy_plot_path"); if( path.isEmpty() ) command_enter("gnuplot_binary(\"easy_plot\")"); else command_enter("gnuplot_binary(\""+path+"\")"); } //Load scripts loadScripts(); } void OctaveConnection::loadScripts() { QDir dir(QString(CONFIG_PATH) + "/scripts/"); QStringList filters; filters << "*.m"; QFileInfoList list = dir.entryInfoList(filters); QString _command; _command+="__qtoctave_ps2=PS2();PS2('');__qtoctave_ps1=PS1();PS1('');\n"; for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QFile file(fileInfo.absoluteFilePath()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) continue; while (!file.atEnd()) { QByteArray line = file.readLine(); _command+=line; } } _command+="PS2(__qtoctave_ps2); clear __qtoctave_ps2;PS1(__qtoctave_ps1); clear __qtoctave_ps1;\n"; write( _command.toLocal8Bit() ); } void OctaveConnection::command_enter (const QString &command, bool show) { QString _command(command+"\n"); if(show) { //Count number of instructions if(!debugging) { if(instructions_left_no<0) instructions_left_no=_command.count('\n'); else instructions_left_no+=_command.count('\n'); } //printf("instructions_left_no=%d añadida\n",instructions_left_no); emit command_ready(" "+_command); } else emit ide_command_ready(" "+_command); write(_command.toLocal8Bit() ); } void OctaveConnection::octaveOutputSlot() { QString buffer=QString::fromLocal8Bit( readAllStandardOutput().data() ); //QRegExp regexp_octave_prompt("octave:[0-9]+>"); //QRegExp regexp_octave_prompt2("octave:[0-9]+\\+>"); //QRegExp regexp_actual_debug_line_column("^([a-zA-Z_]\\w*:)+ line ([0-9]+), column ([0-9]+)$"); Sleep::micro_sleep(200); emit output_ready(buffer); // Partir en líneas QStringList lines = buffer.split("\n", QString::SkipEmptyParts); if(lines.empty()) lines.push_back(""); // Al primer elemento se le debe concatenar el buffer de línea lines.first() = line_buffer + lines.first(); line_buffer.clear(); // En caso de que line_buffer sea debug> u octave:X>, no guardarlo if(line_buffer == "debug> ") lines.push_back(line_buffer); // Procesar las líneas for(QStringList::iterator i = lines.begin(); i != lines.end(); i++) { // Debug if(i->startsWith("debug> ")) { i->remove(0, 7); debugging = true; emit debug(lineno, colno); } //printf("line >%s<\n", i->toLocal8Bit().data()); // PS1 = octave:X> if(regexp_octave_prompt.indexIn(*i) > -1) { instructions_left_no-=i->count(regexp_octave_prompt); //i->remove(0, regexp_octave_prompt.matchedLength()); i->remove(regexp_octave_prompt); //printf("instructions_left_no=%d eliminada\n",instructions_left_no); //printf("line eliminada >%s<\n", i->toLocal8Bit().data()); if(debugging) { debugging = false; emit endDebug(); } else if(instructions_left_no==0) { //printf("Comando terminado\n"); instructions_left_no=0; emit command_finished(); } } // PS2 = octave:X+> if(regexp_octave_prompt2.indexIn(*i) > -1) { instructions_left_no-=i->count(regexp_octave_prompt2); //i->remove(0, regexp_octave_prompt.matchedLength()); i->remove(regexp_octave_prompt2); //printf("instructions_left_no=%d eliminada PS2\n",instructions_left_no); //printf("line eliminada PS2 >%s<\n", i->toLocal8Bit().data()); } // Línea y columna cuando va a parar if(regexp_actual_debug_line_column.exactMatch(*i)) { int start; //QStringList list = regexp_actual_debug_line_column.capturedTexts(); //foreach(QString item, list) //{ // printf("Captura %s %d\n", item.toLocal8Bit().data(), regexp_actual_debug_line_column.numCaptures()-2 ); //} // Extraer la línea start=regexp_actual_debug_line_column.numCaptures()-1; if(!regexp_actual_debug_line_column.cap(start).isEmpty()) lineno=regexp_actual_debug_line_column.cap(start).toInt(); // Extraer la columna start=regexp_actual_debug_line_column.numCaptures(); if(!regexp_actual_debug_line_column.cap(start).isEmpty()) colno=regexp_actual_debug_line_column.cap(start).toInt(); } // Code of clc (clean screen) if(*i == QString("\033[H\033[2J")) { emit clearScreen(); } } // Meter en el buffer de línea el último elemento si la cadena // no terminaba en \n if(!buffer.endsWith("\n")) line_buffer = lines.last(); } void OctaveConnection::octaveErrorOutputSlot() { QString buffer=error_buffer.data(); error_buffer.close(); error_buffer.setData( buffer.toUtf8()+readAllStandardError()); error_buffer.open(QBuffer::ReadOnly); Sleep::micro_sleep(200); QString line, error(""); do { line=error_buffer.readLine(); if(line.endsWith("\n") ) { if(line.startsWith("~~")) { // Code of clc (clean screen) if(line=="~~ClearScreen\n") emit clearScreen(); else emit line_ready(line); } else error+=line; if( regexp_actual_debug_line_column.exactMatch(line.trimmed()) ) { int start; //printf("[OctaveConnection::octaveErrorOutputSlot]\n"); //QStringList list = regexp_actual_debug_line_column.capturedTexts(); //foreach(QString item, list) //{ // printf("Captura %s %d\n", item.toLocal8Bit().data(), regexp_actual_debug_line_column.numCaptures()-2 ); //} // Extraer la línea start=regexp_actual_debug_line_column.numCaptures()-1; if(!regexp_actual_debug_line_column.cap(start).isEmpty()) lineno=regexp_actual_debug_line_column.cap(start).toInt(); // Extraer la columna start=regexp_actual_debug_line_column.numCaptures(); if(!regexp_actual_debug_line_column.cap(start).isEmpty()) colno=regexp_actual_debug_line_column.cap(start).toInt(); emit debug(lineno, colno); } continue; } else { line=line+error_buffer.readAll(); error_buffer.close(); error_buffer.setData(line.toUtf8()); error_buffer.open(QBuffer::ReadOnly); break; } emit line_ready(line); } while(error_buffer.bytesAvailable()); emit error_ready(error); if(!error_buffer.bytesAvailable()) { error_buffer.close(); error_buffer.setData(QString("").toUtf8()); error_buffer.open(QBuffer::ReadOnly); } //Se procesa el buffer para buscar las líneas diponibles //QStringList lines=buffer.split("\n"); //QStringList::const_iterator i; //for (i = lines.constBegin(); i != lines.constEnd();) //{ // QString line=*i; // ++i; // if(i==lines.constEnd() && !buffer.endsWith("\n")) // emit error_ready(line); // else // emit error_ready(line+"\n"); // emit line_ready(line); //} } void OctaveConnection::octaveFinished(int /*exitCode*/, QProcess::ExitStatus exitStatus) { if(exitStatus == QProcess::CrashExit) { QMessageBox::critical(NULL,tr("Octave crashed"), tr("Octave has crashed. Restarting...")); } else { QMessageBox::critical(NULL,tr("Octave finished"), tr("Octave has finished. Restarting...")); } //Relanzar startOctave(); } qtoctave-0.10.1/qtoctave/src/generate_menu.cpp0000644000175000017500000005441411511434227020366 0ustar lucaslucas#include "generate_menu.h" #include #include #include #include #include #include #include GenerateMenu::GenerateMenu(MainWindow *mainwindow, Operations *operations):QObject(mainwindow) { this->mainwindow=mainwindow; this->operations=operations; } void GenerateMenu::setPath(QString path) { this->path=path; } QString GenerateMenu::menu_path(QString file_path) { if(file_path.startsWith(path)) { QString r(file_path); r.remove(0,path.size()); return r; } return file_path; } QString GenerateMenu::find_icon(QString file_path, QString menu) { QDir dir(file_path); if(!dir.exists()) { printf("[GenerateMenu::find_icon] Error: %s not found\n", path.toLocal8Bit().data() ); return QString(); } QFileInfoList list=dir.entryInfoList( QDir::NoFilter, QDir::Name ); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QString file_name=fileInfo.fileName(); if(!fileInfo.isDir() && !file_name.startsWith(".") && file_name.endsWith(".png")) { if( (menu+QString(".png")) == file_name ) return fileInfo.filePath(); } } return QString(); } void GenerateMenu::load_menu() { load_menu(path,NULL); } void GenerateMenu::load_menu(QString dir_name, QMenu *parent_menu) { QDir dir(dir_name); QTranslator *qTranslator; // For all translation files founded if(!dir.exists()) { printf("[GenerateMenu::load_menu] Error: %s not found\n", path.toLocal8Bit().data()); return; } // Find translations QStringList loadedTranslations; QStringList filter; filter << "*.qm"; QFileInfoList list = dir.entryInfoList(filter, QDir::Files | QDir::Readable); for(int i = 0; i < list.size(); ++i) { QFileInfo fileInfo; QString tName; fileInfo = list.at(i); tName = fileInfo.fileName().split("_").first(); if(loadedTranslations.indexOf(tName) == -1) { qTranslator = new QTranslator(this); loadedTranslations.append(tName); if(!qTranslator->load(tName + "_" + QLocale::system().name(), fileInfo.absolutePath())) { delete qTranslator; printf("[GenerateMenu::load_menu] Unknow error loading translation file '%s'\n", tName.toLocal8Bit().data()); }else { QCoreApplication::instance()->installTranslator(qTranslator); printf("[GenerateMenu::load_menu] Translation file founded: '%s'\n", tName.toLocal8Bit().data()); } } } // Process list = dir.entryInfoList( QDir::NoFilter, QDir::Name ); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QString menu_name=fileInfo.fileName(); //printf("Procesando: %s\n",menu_name.toLocal8Bit().data()); if(fileInfo.isDir() && !menu_name.startsWith(".")) { //printf("Icono encontrado %s\n",find_icon(dir_name,menu_name).toLocal8Bit().data()); //printf("Menu path %s\n",menu_path(dir_name+"/"+menu_name).toLocal8Bit().data()); QMenu *menu=mainwindow->createMenu(menu_path(dir_name+"/"+menu_name), MENU_TRANSLATE(menu_name), find_icon(dir_name,menu_name)); if(parent_menu==NULL) mainwindow->menubar->addAction(menu->menuAction()); else parent_menu->addAction(menu->menuAction()); load_menu(dir_name+"/"+menu_name,menu); } else if(fileInfo.isExecutable() && !menu_name.startsWith(".")) { QAction *action = mainwindow->createAction(menu_path(dir_name+"/"+menu_name), MENU_TRANSLATE(menu_name), find_icon(dir_name,menu_name)); mainwindow->menus[menu_path(dir_name)]->addAction(action); MenuCallBack *callback=new MenuCallBack(dir_name+"/"+menu_name, mainwindow->octave_connection); connect(action, SIGNAL(triggered()), callback, SLOT(actions_callback())); } else if(!fileInfo.isExecutable() && !menu_name.startsWith(".") && menu_name.endsWith(".menu")) { MenuExtCallBack *wizard=process_menu_file(fileInfo.filePath()); if( wizard==NULL ) return; QString _menu_name=wizard-> windowTitle(); QAction *action = mainwindow->createAction( menu_path(dir_name+"/"+_menu_name), MENU_TRANSLATE(_menu_name), find_icon(dir_name, menu_name) ); printf("%s / %s\n", _menu_name.toLocal8Bit().data(), QCoreApplication::translate("", "Load matrix from file").toLocal8Bit().data()); mainwindow->menus[menu_path(dir_name)]->addAction(action); connect(action, SIGNAL(triggered()), wizard, SLOT(actions_callback())); wizard->setWindowIcon( QIcon(find_icon(dir_name,menu_name)) ); wizard->setOctaveConnection(mainwindow->octave_connection); wizard->resize(600,600); } } } enum ParseState {PARAMETER,BLOCK}; bool GenerateMenu::process_menu_file(QString _file, QStringList & input_labels, QStringList & input_parameters, QStringList & output_labels, QStringList & output_parameters, QString & command, QString & menu_name, QString & help, bool & accept_blank_parameters, bool & auto_exec) { QFile file(_file); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return false; accept_blank_parameters=false; auto_exec=false; ParseState state=PARAMETER; QString block_label; //Regular expession for parameters QRegExp rp("([A-Za-z_]+)[ \\t]*=(.*)\\n"); //Regular expession for comments QRegExp rc("[ \\t]*#.*\\n"); //Regular expession for blocks -> start QRegExp rbb("begin\\{([A-Za-z_]+)\\}\\n"); //Regular expession for blocks -> end QRegExp rbe("end\\{([A-Za-z_]+)\\}\\n"); while (!file.atEnd()) { QString line(file.readLine()); //printf("Estado %d Linea: %s", state, line.toLocal8Bit().data()); switch(state) { case PARAMETER: if(!rp.exactMatch(line) && !rc.exactMatch(line) && !rbb.exactMatch(line) && !rbe.exactMatch(line)) continue; /* { int pos; pos=rp.indexIn(line); QStringList list = rp.capturedTexts(); for(int i=0;i start QRegExp rbb("begin\\{([A-Za-z_]+)\\}\\n"); //Regular expession for blocks -> end QRegExp rbe("end\\{([A-Za-z_]+)\\}\\n"); while (!file.atEnd()) { QString line(file.readLine()); //printf("Estado %d Linea: %s", state, line.toLocal8Bit().data()); switch(state) { case PARAMETER: if(!rp.exactMatch(line) && !rc.exactMatch(line) && !rbb.exactMatch(line) && !rbe.exactMatch(line)) continue; //Matchs parameter if(rp.exactMatch(line)) { QString type = rp.cap(1); if(type=="input") { LineEdit *lineedit=new LineEdit(label); lineedit->setParameter(rp.cap(2).trimmed()); wizard->addInput(lineedit); } else if(type=="input_file") { FileEdit *fileedit=new FileEdit(label); fileedit->setParameter(rp.cap(2).trimmed()); wizard->addInput(fileedit); } else if(type=="input_label") { label = rp.cap(2).trimmed(); } else if(type=="output") { LineEdit *lineedit=new LineEdit(label); lineedit->setParameter(rp.cap(2).trimmed()); wizard->addOutput(lineedit); } else if(type=="output_file") { FileEdit *fileedit=new FileEdit(label); fileedit->setParameter(rp.cap(2).trimmed()); wizard->addOutput(fileedit); } else if(type=="output_label") { label = rp.cap(2).trimmed(); } else if(type=="menu_name") { QString menu_name = rp.cap(2).trimmed(); wizard->setWindowTitle(menu_name); } else if(type=="accept_blank_parameters") { if (rp.cap(2).trimmed()=="true") accept_blank_parameters=true; } else if(type=="auto_exec") { QString ok = rp.cap(2).trimmed(); auto_exec = (ok=="true"); } } else if(rbb.exactMatch(line)) {block_label=rbb.cap(1); block_text=""; state=BLOCK;} else if(rbe.exactMatch(line)) state=PARAMETER; //Comments are ignored. break; case BLOCK: if(rbe.exactMatch(line) && block_label==rbe.cap(1)) { state=PARAMETER; if(block_label=="help") wizard->addHelp(block_text); else if(block_label=="command") wizard->addCommand(block_text); else if(block_label=="input_list") { ComboBox *combo=new ComboBox(label); combo->setParameter(block_text.trimmed()); wizard->addInput(combo); } else if(block_label=="output_list") { ComboBox *combo=new ComboBox(label); combo->setParameter(block_text.trimmed()); wizard->addOutput(combo); } } else //if(block_label=="help" || block_label=="command") block_text+=line; break; } } file.close(); wizard->setAcceptBlankParameters(accept_blank_parameters); wizard->setAutoExec(auto_exec); return wizard; } //////////////////////////////////////////////////////////////////////////////////////////// MenuFileCallBack::MenuFileCallBack(QString menu_name, OctaveConnection *oc, Operations *operations, QStringList & input_labels, QStringList & input_parameters, QStringList & output_labels, QStringList & output_parameters, QString & command, QString & help, bool & accept_blank_parameters) { this->menu_name=menu_name; this->oc=oc; this->input_labels=input_labels; this->input_parameters=input_parameters; this->output_labels=output_labels; this->output_parameters=output_parameters; this->command=command; this->menu_name=menu_name; this->help=help; this->accept_blank_parameters=accept_blank_parameters; this->operations=operations; } void MenuFileCallBack::actions_callback() { Operations::MenuResult r=operations->menu_window(menu_name, input_labels, input_parameters, output_labels, output_parameters, help, accept_blank_parameters); QString _command(command); if (r!=Operations::CANCEL) { if(output_labels.size()>0) { for (int i = 0; i < output_labels.size();i++) { _command.replace("%o"+QString().setNum(i+1)+"%",output_parameters.at(i)); } } if(input_labels.size()>0) { for (int i = 0; i < input_labels.size();i++) { _command.replace("%i"+QString().setNum(i+1)+"%",input_parameters.at(i)); } } } else return; if(r==Operations::COPY_CLIPBOARD) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(_command); } //r==ACCEPTED else { oc->command_enter(_command); } } MenuCallBack::MenuCallBack(QString menu_name, OctaveConnection *oc) { this->menu_name=menu_name; this->octave_connection=oc; connect(&process, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput())); connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus))); } void MenuCallBack::readyReadStandardOutput() { output+=process.readAllStandardOutput(); } void MenuCallBack::finished( int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/ ) { output+=process.readAllStandardOutput(); octave_connection->command_enter(output.trimmed()); } void MenuCallBack::actions_callback() { output=""; process.start("\""+menu_name+"\""); } //////////////////////////////////////////////////////////////////////////////////////////// InputWidget::InputWidget(QWidget *parent):QWidget(parent) { } //////////////////////////////////////////////////////////////////////////////////////////// LineEdit::LineEdit(QString label, QWidget *parent):InputWidget(parent) { this->label=new QLabel(label, this); lineedit=new QLineEdit(this); QHBoxLayout *hbox=new QHBoxLayout; hbox->addWidget(this->label); hbox->addWidget(lineedit); this->label->show(); lineedit->show(); setLayout(hbox); } //////////////////////////////////////////////////////////////////////////////////////////// QString LineEdit::parameter() { return lineedit->text(); } //////////////////////////////////////////////////////////////////////////////////////////// void LineEdit::setParameter(QString _parameter) { lineedit->setText(_parameter); } //////////////////////////////////////////////////////////////////////////////////////////// FileEdit::FileEdit(QString label, QWidget *parent):InputWidget(parent) { this->label=new QLabel(label, this); lineedit=new QLineEdit(this); file_button=new QPushButton(tr("File..."),this); QHBoxLayout *hbox=new QHBoxLayout; hbox->addWidget(this->label); hbox->addWidget(lineedit); hbox->addWidget(file_button); this->label->show(); lineedit->show(); file_button->show(); setLayout(hbox); connect(file_button, SIGNAL( clicked() ), this, SLOT(file_button_callback()) ); } //////////////////////////////////////////////////////////////////////////////////////////// QString FileEdit::parameter() { return lineedit->text(); } //////////////////////////////////////////////////////////////////////////////////////////// void FileEdit::setParameter(QString _parameter) { lineedit->setText(_parameter); } //////////////////////////////////////////////////////////////////////////////////////////// void FileEdit::file_button_callback() { QString s ; QFileDialog dialog(this); dialog.setFileMode(QFileDialog::AnyFile); dialog.selectFile(lineedit->text()); dialog.setWindowTitle(tr("Choose a file")); if (dialog.exec()) { QStringList list = dialog.selectedFiles(); if(!list.isEmpty()) s=list.at(0); //for(int i=1;isetText(s); } //////////////////////////////////////////////////////////////////////////////////////////// ComboBox::ComboBox(QString label, QWidget *parent):InputWidget(parent) { this->label=new QLabel(label, this); combobox=new QComboBox(this); QHBoxLayout *hbox=new QHBoxLayout; hbox->addWidget(this->label); hbox->addWidget(combobox); combobox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); this->label->show(); combobox->show(); setLayout(hbox); } //////////////////////////////////////////////////////////////////////////////////////////// QString ComboBox::parameter() { return combobox->currentText(); } //////////////////////////////////////////////////////////////////////////////////////////// void ComboBox::setParameter(QString _parameter) { QStringList list=_parameter.split("\n"); combobox->insertItems(0,list); } //////////////////////////////////////////////////////////////////////////////////////////// MenuExtCallBack::MenuExtCallBack(QWidget *parent):QWidget(parent) { auto_exec_ok=false; QVBoxLayout *vbox=new QVBoxLayout; input_box=new QGroupBox (tr("Input Parameters"), this); output_box=new QGroupBox (tr("Output Parameters"), this); //help_widget=new QTextBrowser(this); ok_button=new QPushButton(tr("Ok"),this); copy_clipboard_button=new QPushButton(tr("Copy to clipboard"),this); cancel_button=new QPushButton(tr("Cancel"),this); help_button=new QPushButton(tr("Help"),this); vbox->addWidget(input_box); vbox->addWidget(output_box); //vbox->addWidget(help_widget); QHBoxLayout *hbox=new QHBoxLayout; vbox->addLayout(hbox); hbox->addWidget(ok_button); hbox->addWidget(copy_clipboard_button); hbox->addWidget(help_button); hbox->addWidget(cancel_button); setLayout(vbox); input_box->show(); output_box->show(); //help_widget->show(); ok_button->show(); copy_clipboard_button->show(); cancel_button->show(); input_box->setLayout(new QVBoxLayout); output_box->setLayout(new QVBoxLayout); QScrollArea *scroll=new QScrollArea(input_box); scroll->setWidgetResizable(true); input_box->layout()->addWidget(scroll); scroll->setWidget( input_area = new QWidget(scroll) ); scroll->show(); input_area->show(); input_area->setLayout(new QVBoxLayout); scroll=new QScrollArea(output_box); scroll->setWidgetResizable(true); output_box->layout()->addWidget(scroll); scroll->setWidget( output_area = new QWidget(scroll) ); scroll->show(); output_area->show(); output_area->setLayout(new QVBoxLayout); connect(ok_button, SIGNAL( clicked () ) , this, SLOT( ok_button_callback() ) ); connect(copy_clipboard_button, SIGNAL( clicked () ) , this, SLOT( copy_clipboard_button_callback() ) ); connect(cancel_button, SIGNAL( clicked () ) , this, SLOT( cancel_button_callback() ) ); connect(help_button, SIGNAL( clicked () ) , this, SLOT( help_button_callback() ) ); hide(); } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::ok_button_callback() { QString _command=generate_command(); oc->command_enter( _command.trimmed() ); hide(); } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::copy_clipboard_button_callback() { QString _command=generate_command(); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(_command); hide(); } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::cancel_button_callback() { hide(); } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::help_button_callback() { QWidget *help=new QWidget; help->setAttribute(Qt::WA_DeleteOnClose); QHBoxLayout *hbox=new QHBoxLayout; QTextBrowser *help_widget=new QTextBrowser(this); help_widget->show(); hbox->addWidget(help_widget); help->setLayout(hbox); help_widget->setHtml(this->help); help->resize(500,500); help->show(); } //////////////////////////////////////////////////////////////////////////////////////////// #include void MenuExtCallBack::actions_callback() { if(auto_exec_ok) { QString _command=generate_command(); oc->command_enter( _command.trimmed() ); return; } QDesktopWidget *desktop = QApplication::desktop(); int width = desktop->width(); int height = desktop->height(); move((width-600)/2, (height-600)/2); if( input.isEmpty() ) { input_box->hide(); } if( output.isEmpty() ) { output_box->hide(); } show(); } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::setOctaveConnection(OctaveConnection *oc) { this->oc=oc; } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::addInput(InputWidget *input) { input_area->layout()->addWidget(input); input->show(); this->input.append(input); } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::addOutput(InputWidget *input) { output_area->layout()->addWidget(input); input->show(); this->output.append(input); } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::addHelp(QString help) { //help_widget->setHtml(help); this->help=help; } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::addCommand(QString command) { this->command=command; } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::setAcceptBlankParameters(bool accept_blank_parameters) { this->accept_blank_parameters=accept_blank_parameters; } //////////////////////////////////////////////////////////////////////////////////////////// void MenuExtCallBack::setAutoExec(bool auto_exec_ok) { this->auto_exec_ok=auto_exec_ok; } //////////////////////////////////////////////////////////////////////////////////////////// QString MenuExtCallBack::generate_command() { QString _command(command), parameter; if(output.size()>0) { for (int i = 0; i < output.size();i++) { parameter=output.at(i)->parameter(); if( !accept_blank_parameters && parameter.isEmpty() ) { QMessageBox::warning (this, tr("Blank parameter"), tr("There are blank parameters. Please fill all fields."), tr("Ok") ); } _command.replace("%o"+QString().setNum(i+1)+"%",parameter ); } } if(input.size()>0) { for (int i = 0; i < input.size();i++) { parameter=input.at(i)->parameter(); if( !accept_blank_parameters && parameter.isEmpty() ) { QMessageBox::warning (this, tr("Blank parameter"), tr("There are blank parameters. Please fill all fields."), tr("Ok") ); } _command.replace("%i"+QString().setNum(i+1)+"%",parameter ); } } return _command; } qtoctave-0.10.1/qtoctave/src/syntax.h0000644000175000017500000000474611511434227016546 0ustar lucaslucas/* Copyright (C) 2010 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __SYNTAX_H__ #define __SYNTAX_H__ #include #include #include #include class BlockData:public QTextBlockUserData { public: BlockData(); struct Bracket { int type; //Type of bracket int pos; //Position of bracket int length; //Number of chars of bracket bool startBracketOk; //Is it a start or end bracket? }; QVector brackets; }; class Syntax:public QSyntaxHighlighter { Q_OBJECT QString xmlSyntaxFileName; struct HighlightingRule { QRegExp pattern; QTextCharFormat format; int ruleOrder; int lastFound; }; QVector highlightingRules; struct HighlightingBlockRule { QRegExp startPattern, endPattern; QTextCharFormat format; int ruleOrder; }; QVector highlightingBlockRules; QVector highlightingBracketsRules; struct Rule1st { int rule; int startIndex; int length; int ruleOrder; }; /**1st rule to apply from startIndex. */ Rule1st highlight1stRule(const QString & text, int startIndex); /**1st block rule to apply from startIndex. */ Rule1st highlight1stBlockRule(const QString & text, int startIndex); /** Set format using rule. */ int ruleSetFormat(Rule1st rule); /** Set format using block rule. */ int blockRuleSetFormat(const QString & text, Rule1st rule1st); /** Finds brackets and put them in BlockData. */ void findBrackets(const QString & text, int start, int end, BlockData *blockData); public: Syntax(QObject * parent = 0); bool load(QString file); /**Formats pair of brackets */ void setFormatPairBrackets(QPlainTextEdit *textEdit); protected: void highlightBlock ( const QString & text ); }; #endif qtoctave-0.10.1/qtoctave/src/search_dialog.cpp0000644000175000017500000000606611511434227020334 0ustar lucaslucas#include "search_dialog.h" #include SearchDialog::SearchDialog(QWidget *parent): QDialog(parent) { // Title setWindowTitle(tr("Search and replace")); setWindowIcon(QIcon(QString(ICON_PATH) + "/search.png")); // Layout QVBoxLayout *vlayout = new QVBoxLayout(); setLayout(vlayout); // Search QGroupBox *searchGroup = new QGroupBox(this); searchGroup->setTitle(tr("Search")); vlayout->addWidget(searchGroup); QVBoxLayout *searchLayout = new QVBoxLayout(); searchGroup->setLayout(searchLayout); QLabel *searchLabel = new QLabel(searchGroup); searchLabel->setText(tr("Search")); searchLayout->addWidget(searchLabel); search = new QLineEdit(searchGroup); searchLayout->addWidget(search); searchRegExp = new QCheckBox(searchGroup); searchRegExp->setText(tr("Regular expression")); searchLayout->addWidget(searchRegExp); //searchRegExp->hide(); // Replace QGroupBox *replaceGroup = new QGroupBox(this); replaceGroup->setTitle(tr("Replace")); vlayout->addWidget(replaceGroup); QVBoxLayout *replaceLayout = new QVBoxLayout(); replaceGroup->setLayout(replaceLayout); QLabel *replaceLabel = new QLabel(replaceGroup); replaceLabel->setText(tr("Replace")); replaceLayout->addWidget(replaceLabel); replace = new QLineEdit(replaceGroup); replaceLayout->addWidget(replace); // Options QGroupBox *optionsGroup = new QGroupBox(this); optionsGroup->setTitle(tr("Options")); vlayout->addWidget(optionsGroup); QHBoxLayout *optionsLayout = new QHBoxLayout(); optionsGroup->setLayout(optionsLayout); QVBoxLayout *optionsV1Layout = new QVBoxLayout(); optionsLayout->addLayout(optionsV1Layout); QVBoxLayout *optionsV2Layout = new QVBoxLayout(); optionsLayout->addLayout(optionsV2Layout); caseSensitiveCB = new QCheckBox(optionsGroup); caseSensitiveCB->setText(tr("Case sensitive")); optionsV1Layout->addWidget(caseSensitiveCB); wholeWordsCB = new QCheckBox(optionsGroup); wholeWordsCB->setText(tr("Only full words")); optionsV1Layout->addWidget(wholeWordsCB); fromCursorCB = new QCheckBox(optionsGroup); fromCursorCB->setText(tr("From cursor")); optionsV2Layout->addWidget(fromCursorCB); // Buttons QHBoxLayout *buttonsLayout = new QHBoxLayout(); vlayout->addLayout(buttonsLayout); QPushButton *acceptButton = new QPushButton(this); acceptButton->setText(tr("Search")); buttonsLayout->addWidget(acceptButton); connect(acceptButton, SIGNAL(clicked()), this, SIGNAL(search_signal())); QPushButton *replaceButton = new QPushButton(this); replaceButton->setText(tr("Replace")); buttonsLayout->addWidget(replaceButton); connect(replaceButton, SIGNAL(clicked()), this, SIGNAL(replace_signal())); QPushButton *cancelButton = new QPushButton(this); cancelButton->setText(tr("Cancel")); buttonsLayout->addWidget(cancelButton); connect(cancelButton, SIGNAL(clicked()), this, SLOT(accept())); } SearchDialog::~SearchDialog() { printf("SearchDialog eliminado\n"); } qtoctave-0.10.1/qtoctave/src/simpleeditor.cpp0000644000175000017500000002534011511434227020244 0ustar lucaslucas/* Copyright (C) 2010 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include "simpleeditor.h" #include #include #include #include #include SimpleEditor::SimpleEditor(QWidget *parent):QPlainTextEdit(parent) { syntax=NULL; firtsTimeUsedOk=true; { QTextDocument *_document=new QTextDocument(); _document->setProperty("DocumentReferences", QVariant(0)); QPlainTextDocumentLayout *layout=new QPlainTextDocumentLayout(_document); _document->setDocumentLayout(layout); setDocument(_document); } completerModel=new QStringListModel (); completer= new QCompleter(completerModel, this); completer->setCompletionMode(QCompleter::PopupCompletion); completer->setWidget(this); connect(completer, SIGNAL(activated ( const QString &)), this, SLOT(activated ( const QString &))); if(get_config("bracketsMatch")!="false") connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChangedCallBack())); if((get_config("autoCompletion")!="false")) connect(document(), SIGNAL(contentsChange(int, int, int)), this, SLOT(autoComplete(int, int, int))); auto_indent=("false"!=get_config("autoindent")); automatic_indention_statement_ok = (get_config("autoindent_statements")=="true"); //Set editor's font QFont text_edit_font; QString font_name=get_config("textEditFont"); QString font_size=get_config("textEditFontSize"); if(font_name.isEmpty()) { font_name=text_edit_font.family(); } if(font_size.isEmpty()) { font_size=QString::number(text_edit_font.pointSize()); } text_edit_font.setFamily(font_name); text_edit_font.setPointSize(font_size.toInt()); setFont(text_edit_font); } void SimpleEditor::loadSyntaxXMLDescription() { printf("[SimpleEditor::loadSyntaxXMLDescription] Loading syntax\n"); QString installPath= QString(CONFIG_PATH) +QDir::separator()+"syntax_files"+QDir::separator(); QFileInfo file(fileName); QString suffix=file.suffix(); if(comands_completion_list.isEmpty()) { QString home=QDir::home().path()+QDir::separator()+".qtoctave"+QDir::separator()+"commands.txt"; QFile file(home); if (file.open(QFile::ReadOnly)) { char buf[1024]; while(file.readLine(buf, sizeof(buf))>=0) { comands_completion_list.append(QString(buf).trimmed()); } file.close(); } } if(get_config("syntaxHighlighting")!="true") return; QFileInfo xml(installPath+suffix+".xml"); if(xml.exists()) { printf("[SimpleEditor::loadSyntaxXMLDescription] Loading syntax\n"); if(syntax==NULL) { syntax=new Syntax( document() ); syntax->load(xml.absoluteFilePath()); syntax->setDocument(document()); } else syntax->load(xml.absoluteFilePath()); } } bool SimpleEditor::load(QString file) { if(file.isEmpty()) { setPlainText(""); fileName=file; return true; } FILE *input=fopen(file.toLocal8Bit().data(),"r"); if(input==NULL) return false; fclose(input); QFile in(file); if (!in.open(QIODevice::ReadOnly | QIODevice::Text)) return false; QByteArray data=in.readAll(); setPlainText( QString::fromLocal8Bit(data) ); fileName=file; firtsTimeUsedOk=false; loadSyntaxXMLDescription(); return true; } bool SimpleEditor::save() { QFile::remove(fileName+"~"); QFile::copy(fileName, fileName+"~"); FILE *out=fopen(fileName.toLocal8Bit().data(),"w"); if(out==NULL) return false; fprintf( out, "%s", toPlainText().toLocal8Bit().data() ); fclose(out); document()->setModified(false); return true; } void SimpleEditor::keyPressEvent(QKeyEvent * e) { //printf("%d %s\n",e->key(), e->text().toLocal8Bit().data()); //In all cases completer popup must been hided. if(e->key()!=Qt::Key_Return && e->key()!=Qt::Key_Enter ) { QAbstractItemView *view=completer->popup(); if(view->isVisible()) view->hide(); //completer->setWidget(NULL); } if(e->key()==Qt::Key_Return || e->key()==Qt::Key_Enter ) { QAbstractItemView *view=completer->popup(); if(view->isVisible()) { QString word=view->currentIndex().data().toString(); if( word.isEmpty() ) word=completer->currentCompletion(); activated( word ); return; } else if(auto_indent) { QTextCursor cursor=textCursor(); QString line=cursor.block().text(); QString line2=line; for(int i=0;ikey()==(Qt::Key_B) && Qt::ControlModifier==e->modifiers() ) //{ // autoComplete(); // return; //} else if(e->key()==Qt::Key_Tab) { QTextCursor cursor=textCursor(); int start=cursor.selectionStart(); int end=cursor.selectionEnd(); if(start==end) { QPlainTextEdit::keyPressEvent(e); return; } cursor.beginEditBlock(); cursor.setPosition(end); end=cursor.blockNumber(); cursor.setPosition(start); cursor.movePosition(QTextCursor::StartOfBlock); while(true) { cursor.insertText("\t"); if(cursor.blockNumber()>=end) break; cursor.movePosition(QTextCursor::NextBlock); } cursor.endEditBlock(); } else if(e->key()==Qt::Key_Backtab ) { QTextCursor cursor=textCursor(); int start=cursor.selectionStart(); int end=cursor.selectionEnd(); if(start==end) { QPlainTextEdit::keyPressEvent(e); return; } cursor.beginEditBlock(); cursor.setPosition(end); end=cursor.blockNumber(); cursor.setPosition(start); cursor.movePosition(QTextCursor::StartOfBlock); while( true ) { QString line=cursor.block().text(); if(line.length()>0 && (line[0]==' ' || line[0] =='\t') ) { cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); cursor.removeSelectedText(); } if(cursor.blockNumber()>=end) break; cursor.movePosition(QTextCursor::NextBlock); cursor.movePosition(QTextCursor::StartOfBlock); } cursor.endEditBlock(); } else { if( e->key()==(Qt::Key_B) && Qt::ControlModifier==e->modifiers() ) { autoComplete(0); return; } QPlainTextEdit::keyPressEvent(e); } } void SimpleEditor::setCharFormat(QTextCharFormat charFormat) { this->charFormat=charFormat; QTextCursor cursor=textCursor(); cursor.movePosition(QTextCursor::Start); cursor.setCharFormat(charFormat); cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); setFont(charFormat.font()); QFontMetrics fm(charFormat.font()); int textWidthInPixels = fm.width(" "); setTabStopWidth(textWidthInPixels); } void SimpleEditor::activated( const QString & text ) { QAbstractItemView *view=completer->popup(); QTextCursor cursor=textCursor(); cursor.movePosition( QTextCursor::PreviousWord, QTextCursor::KeepAnchor); cursor.insertText(text); view->hide(); } void SimpleEditor::autoComplete(int position, int charsRemoved, int charsAdded) { //printf("[SimpleEditor::autoComplete] charsAdded=%d\n", charsAdded); if(charsAdded==1) autoComplete(); } void SimpleEditor::autoComplete(int size) { QTextCursor cursor=textCursor(); cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor); //printf("[SimpleEditor::autoComplete] >%s<\n", cursor.selectedText().toLocal8Bit().data()); if( cursor.selectedText().endsWith(" ") || cursor.selectedText().trimmed().length()setStringList( list ); completer->setCompletionPrefix(cursor.selectedText()); //printf("[SimpleEditor::autoComplete] >%d<\n", completer->completionCount()); if (completer->completionCount()>0 ) { //completer->setWidget(this); QRect r=cursorRect(cursor); r.setWidth(200); completer->complete(r); } } QString SimpleEditor::getFileName() { return fileName; } void SimpleEditor::setFile(QString file) { fileName=file; loadSyntaxXMLDescription(); } void SimpleEditor::cursorPositionChangedCallBack() { //Hightlight brackets if(syntax!=NULL) syntax->setFormatPairBrackets(this); } void SimpleEditor::publicBlockBoundingRectList(QVector &list, int &first_line) { qreal pageBottom = /*viewport()->*/height(); QPointF offset=contentOffset(); QTextBlock block=firstVisibleBlock(); first_line=block.blockNumber()+1; qreal first_position=blockBoundingGeometry(block).topLeft().y(); for ( ; block.isValid(); block = block.next() ) { QRectF position=blockBoundingGeometry(block); qreal y=position.topLeft().y()+offset.y()-first_position; if(y>pageBottom) break; list.append(y); } } /**Checks if document has references. If not document is deleted. */ static void unreferenceDocument(QTextDocument * document) { printf("[SimpleEditor::unreferenceDocument] Entered\n"); QVariant n_refs = document->property("DocumentReferences"); if(n_refs.isValid()) { int n=n_refs.toInt()-1; printf("[unreferenceDocument] References: %d\n", n); if(n<=0) delete document; else document->setProperty("DocumentReferences", QVariant(n)); } } void SimpleEditor::setDocument ( QTextDocument * document ) { printf("[SimpleEditor::setDocument] Entered\n"); if(document!=NULL) { QVariant n_refs = document->property("DocumentReferences"); if(n_refs.isValid()) { document->setProperty("DocumentReferences", QVariant(n_refs.toInt()+1)); int n=n_refs.toInt()+1; printf("[SimpleEditor::setDocument] References: %d\n", n); } } QTextDocument * oldDocument=this->document(); QVariant n_refs = oldDocument->property("DocumentReferences"); //if(document!=NULL) QPlainTextEdit::setDocument(document); if(n_refs.isValid()) unreferenceDocument(oldDocument); } SimpleEditor::~SimpleEditor() { printf("[SimpleEditor::~SimpleEditor] Entered\n"); QTextDocument * oldDocument=this->document(); unreferenceDocument(oldDocument); } qtoctave-0.10.1/qtoctave/src/table.cpp0000644000175000017500000007352111511434227016637 0ustar lucaslucas/* Copyright (C) 2006, 2007, 2008 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "table.h" #include #include #include #include #include #include #include Table::Table(QWidget * parent):BaseWidget(parent) { widget_type=TABLE; init_regular_expresions(); table_form=new TableForm(); table_form->setupUi(centralWidget()); setWindowIcon( QIcon( QString( ICON_PATH )+"/table.png" ) ); table_form->reloadButton->setIcon( QIcon( QString( ICON_PATH )+"/reload.png" ) ); table_form->reloadButton->setToolTip(tr("Reload matrix.
Some operations change matrix, use reload to view changes.")); table_form->spinbox_widget->setLayout(new QHBoxLayout); table_form->spinbox_widget->layout()->addWidget(new QLabel("Indexes showed:")); table_form->spinbox_widget->layout()->setContentsMargins(0,0,0,0); model=new ComplexNumberTableModel; table_form->table_widget->setModel(model); table_form->table_widget->setItemDelegate( new LineEditDelegate(this) ); connect(model,SIGNAL(cellChanged( int, int, QString)),this,SLOT(cellChanged( int, int, QString))); connect(table_form->rows_spinbox,SIGNAL( editingFinished() ),this,SLOT(rows_changed())); connect(table_form->cols_spinbox,SIGNAL( editingFinished ()),this,SLOT(cols_changed())); connect(table_form->changeOrderButton,SIGNAL( clicked() ),this,SLOT( rows_changed() )); connect(table_form->changeOrderButton,SIGNAL( clicked() ),this,SLOT( cols_changed() )); connect(table_form->changeOrderButton,SIGNAL( clicked() ),this,SLOT( windowActivated() )); connect(table_form->reloadButton,SIGNAL( clicked() ),this,SLOT( windowActivated() )); build_menu(); setContextMenuPolicy ( Qt::DefaultContextMenu ); menuBar()->addMenu(menu); } void Table::init_regular_expresions() { mre.setPattern("~~matrix:([A-Za-z0-9_]+) \"([^\"]+)\" ([\\d ]+)"); //Used in line_ready } void Table::setOctaveConnection(OctaveConnection *octave_connection) { this->octave_connection=octave_connection; connect(octave_connection,SIGNAL(line_ready(QString)),this,SLOT(line_ready(QString))); } void Table::setMatrix(QString matrix) { QRegExp re("([A-Za-z0-9_]+)\\(((:|\\d+),)+(:|\\d+)\\)"); matrix.remove(" "); matrix.remove("\t"); matrix.remove("\n"); setWindowTitle("Table: "+matrix); if(re.exactMatch(matrix)) { this->matrix=re.cap(1); matrix.remove(this->matrix); QStringList dims; QRegExp re_dim("(:|\\d+)"); int pos=0; while ((pos = re_dim.indexIn(matrix, pos)) != -1) { dims << re_dim.cap(0); pos += re_dim.matchedLength(); } dimensions=dims; int count_doubledot=0; for(int i=0;imatrix=matrix; dimensions.clear(); } } void Table::windowActivated() { windowActivated(this); } void Table::windowActivated(QWidget *w) { if(w!=this) return; QString command; command+=matrix+"("; for(int i=0;ivalue(); if( value==0 ) command+=":"; else command+=QString::number(value); if(i<(spinbox_dimensions.size()-1)) { command+=","; } } command+=")"; if(spinbox_dimensions.size()>0) setMatrix(command); command=""; //Next line: If matrix doesn't exit, it will build it command+="eval(\""+matrix+";\",\""+matrix+"=[0]\");"; command+="_ide_reload_matrix("+matrix+","+QString::number((long)this)+","; if(dimensions.size()==0) { command+="resize("+matrix+"(:,:),size("+matrix+")(1),size("+matrix+")(2) ) "; } else { int x[2]; x[0]=x[1]=-1; QString sub_matrix=matrix+"("; for(int i=0;icommand_enter(command,false); } void Table::reloadCell(int row, int col) { QString command; command+="fprintf(stderr,\"~~matrixCell:"+matrix+" %d %d "+QString::number((long)this)+" %g %g\\n\", " +QString::number(row+1)+", "+QString::number(col+1)+", "; if(dimensions.size()==0) { command+= "real("+matrix+"("+QString::number(row+1)+","+QString::number(col+1)+")), " "imag("+matrix+"("+QString::number(row+1)+","+QString::number(col+1)+")));"; } else { QString aux=matrix_row_col(QString::number(row+1), QString::number(col+1)); command+= "real("+aux+"), imag("+aux+"));"; } octave_connection->command_enter(command,false); } #include void Table::line_ready(QString line) { if(line.startsWith("~~matrixCell:"+matrix)) { line=line.right(line.length() - (13+matrix.length()) ).trimmed(); //printf("line:>%s<\n",line.toLocal8Bit().data()); double real, imag; int row, col; long pointer; sscanf(line.toLocal8Bit().data(), "%d %d %ld %lf %lf",&row, &col, &pointer, &real, &imag); if(((long)this)!=pointer) return; model->setRawData(row-1,col-1, real, imag); //model->update(); model->update(row-1,col-1); return; } else if( ! line.startsWith("~~matrix:"+matrix) ) return; //Read line-event data: //~~matrix:matrix-name "file_name" rows columns QTime time; time.start(); line=line.trimmed(); int _rows=-1, _columns=-1; QString file_name; QList sizes; //QRegExp mre("~~matrix:([A-Za-z0-9_]+) \"([^\"]+)\" ([\\d ]+)"); mre.indexIn ( line ) ; { QStringList list = mre.capturedTexts(); //for(int i=0;iresize(_rows,_columns); table_form->rows_spinbox->setValue(_rows); table_form->cols_spinbox->setValue(_columns); //printf("Table: %s %d %d\n", file_name.toLocal8Bit().data(), _rows, _columns); } { QFile file(file_name); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; //disconnect(model,SIGNAL(cellChanged( int, int)),this,SLOT(cellChanged( int, int, QString))); int col=0, row=0; char ch; QString number, real, imag; number.reserve(64); real.reserve(32); imag.reserve(32); bool data_available_ok=false; while (!file.atEnd()) { if(!file.getChar(&ch)) break; switch(ch) { case ' ': if( !number.isEmpty() ) { real=number; data_available_ok=true; } number.clear(); break; case ',': real=number; number.clear(); break; case ')': imag=number; number.clear(); data_available_ok=true; break; case '(': real.clear(); imag.clear(); number.clear(); break; case '\n': if( !number.isEmpty() ) { real=number; data_available_ok=true; } else {row++;col=0;} //real.clear(); //imag.clear(); number.clear(); break; case '#': if(!file.getChar(&ch)) break; while(ch!='\n') if(!file.getChar(&ch)) break; continue; break; default: number.append(ch); }; if( data_available_ok ) { //printf("(%s,%s)\n", real.toLocal8Bit().data(), imag.toLocal8Bit().data()); if( colcolumnCount() && rowrowCount() ) { if( imag.isEmpty() ) model->setRawData(row,col, real.toDouble() ); else model->setRawData(row,col, real.toDouble(), imag.toDouble() ); } col++; if(ch=='\n') {row++;col=0;} data_available_ok=false; real.clear(); imag.clear(); } } file.close(); file.remove(); //connect(model,SIGNAL(cellChanged( int, int, QString)),this,SLOT(cellChanged( int, int, QString))); printf("[Table::line_ready] Data loaded in %dms\n", time.elapsed() ); fflush(stdout); model->update(); } //Builds SpinBoxes to show { while(sizes.size() < spinbox_dimensions.size()) { spinbox_dimensions.last()->close(); spinbox_dimensions.removeLast(); } while(sizes.size() > spinbox_dimensions.size()) { QSpinBox *spinbox=new QSpinBox(table_form->spinbox_widget); spinbox->setAttribute(Qt::WA_DeleteOnClose); spinbox->setMinimum(0); spinbox->setSpecialValueText(":"); spinbox_dimensions.append(spinbox); table_form->spinbox_widget->layout()->addWidget(spinbox); } for(int i=0;isetMaximum(sizes.at(i)); if( (dimensions.size()==0 && i<2) || (dimensions.size()>i && dimensions.at(i)==":") ) spinbox->setValue(0); else if(dimensions.size()>i) spinbox->setValue(dimensions.at(i).toInt()); else spinbox->setValue(1); } } } void Table::cellChanged ( int row, int col, QString value ) { QString command(matrix_row_col(QString::number(row+1),QString::number(col+1))); command+="="+value+";"; octave_connection->command_enter(command); reloadCell(row, col); } void Table::change_rows() { int rows=table_form->rows_spinbox->value(); int old_rows=model->rowCount(); int old_cols=model->columnCount(); if(rowscommand_enter(command); return; } else if(rows>old_rows) { QString command; command+=matrix_row_col(QString::number(rows),QString::number(old_cols))+"=0;"; octave_connection->command_enter(command); } } void Table::rows_changed() { change_rows(); windowActivated(this); } void Table::cols_changed() { change_cols(); windowActivated(this); } void Table::change_cols() { int cols=table_form->cols_spinbox->value(); int old_rows=model->rowCount(); int old_cols=model->columnCount(); if(colscommand_enter(command); return; } else if(cols>old_cols) { QString command; command+=matrix_row_col(QString::number(old_rows),QString::number(cols))+"=0;"; octave_connection->command_enter(command); } } void Table::order_changed() { change_rows(); change_cols(); windowActivated(this); } QString Table::getMatrix() { return matrix; } void Table::build_menu() { menu=new QMenu(tr("Table"), this); QAction *copyAction=new QAction(tr("Copy"), menu); menu->addAction(copyAction); connect(copyAction, SIGNAL(triggered()), this, SLOT(copy_cb()) ); QAction *copyMatrixAction=new QAction(tr("Copy as Octave matrix"), menu); menu->addAction(copyMatrixAction); connect(copyMatrixAction, SIGNAL(triggered()), this, SLOT(copy_matrix_cb()) ); QAction *pasteAction=new QAction(tr("Paste"), menu); menu->addAction(pasteAction); connect(pasteAction, SIGNAL(triggered()), this, SLOT(paste_cb()) ); QAction *deleteRowsAction=new QAction(tr("Delete rows"), menu); menu->addAction(deleteRowsAction); connect(deleteRowsAction, SIGNAL(triggered()), this, SLOT(delete_rows_cb()) ); QAction *deleteColumnsAction=new QAction(tr("Delete columns"), menu); menu->addAction(deleteColumnsAction); connect(deleteColumnsAction, SIGNAL(triggered()), this, SLOT(delete_columns_cb()) ); QAction *insertColumnRightAction=new QAction("Insert column (right)", menu); menu->addAction(insertColumnRightAction); connect(insertColumnRightAction, SIGNAL(triggered()), this, SLOT(insert_column_right_cb()) ); QAction *insertColumnLeftAction=new QAction("Insert column (left)", menu); menu->addAction(insertColumnLeftAction); connect(insertColumnLeftAction, SIGNAL(triggered()), this, SLOT(insert_column_left_cb()) ); QAction *insertRowUpAction=new QAction("Insert row (up)", menu); menu->addAction(insertRowUpAction); connect(insertRowUpAction, SIGNAL(triggered()), this, SLOT(insert_row_up_cb()) ); QAction *insertRowDownAction=new QAction("Insert row (down)", menu); menu->addAction(insertRowDownAction); connect(insertRowDownAction, SIGNAL(triggered()), this, SLOT(insert_row_down_cb()) ); /* Gráficas */ menu->addSeparator(); QMenu *plotMenu = new QMenu(tr("Plot"), menu); menu->addMenu(plotMenu); QMenu *plot2dMenu = new QMenu(tr("2D"), plotMenu); plotMenu->addMenu(plot2dMenu); QAction *plotAction = new QAction(tr("Plot"), plot2dMenu); plot2dMenu->addAction(plotAction); connect(plotAction, SIGNAL(triggered()), this, SLOT(plotPlot())); QAction *polarAction = new QAction(tr("Polar"), plot2dMenu); plot2dMenu->addAction(polarAction); connect(polarAction, SIGNAL(triggered()), this, SLOT(plotPolar())); QAction *logxyAction = new QAction(tr("Log scale for the x and y axis"), plot2dMenu); plot2dMenu->addAction(logxyAction); connect(logxyAction, SIGNAL(triggered()), this, SLOT(plotLogXandY())); QAction *logyAction = new QAction(tr("Log scale for the y axis"), plot2dMenu); plot2dMenu->addAction(logyAction); connect(logyAction, SIGNAL(triggered()), this, SLOT(plotLogY())); QAction *logxAction = new QAction(tr("Log scale for the x axis"), plot2dMenu); plot2dMenu->addAction(logxAction); connect(logxAction, SIGNAL(triggered()), this, SLOT(plotLogX())); QAction *barAction = new QAction(tr("Bar graph"), plot2dMenu); plot2dMenu->addAction(barAction); connect(barAction, SIGNAL(triggered()), this, SLOT(plotBar())); } void Table::insert_row_up_cb() { QString command; int row=table_form->table_widget->currentIndex().row()+1; command=matrix+"="+resize_matrix("1","0", true)+";\n"; command+=matrix_row_col(QString::number(row+1)+":size("+matrix+")(%)","1:size("+matrix+")(%)",true) +"="+matrix_row_col(QString::number(row)+":(size("+matrix+")(%)-1)","1:size("+matrix+")(%)",true)+"\n"; command+=matrix_row_col(QString::number(row),"1:size("+matrix+")(%)",true) +"=0\n"; octave_connection->command_enter(command); windowActivated(); } void Table::insert_row_down_cb() { QString command; int row=table_form->table_widget->currentIndex().row()+1; command=matrix+"="+resize_matrix("1","0", true)+";\n"; command+=matrix_row_col(QString::number(row+2)+":size("+matrix+")(%)","1:size("+matrix+")(%)",true) +"="+matrix_row_col(QString::number(row+1)+":(size("+matrix+")(%)-1)","1:size("+matrix+")(%)",true)+"\n"; command+=matrix_row_col(QString::number(row+1),"1:size("+matrix+")(%)",true) +"=0\n"; octave_connection->command_enter(command); windowActivated(); } void Table::insert_column_left_cb() { QString command; int col=table_form->table_widget->currentIndex().column()+1; command=matrix+"="+resize_matrix("0","1", true)+";\n"; command+=matrix_row_col("1:size("+matrix+")(%)",QString::number(col+1)+":size("+matrix+")(%)",true) +"="+matrix_row_col("1:size("+matrix+")(%)",QString::number(col)+":(size("+matrix+")(%)-1)",true)+"\n"; command+=matrix_row_col("1:size("+matrix+")(%)",QString::number(col),true) +"=0\n"; octave_connection->command_enter(command); windowActivated(); } void Table::insert_column_right_cb() { QString command; int col=table_form->table_widget->currentIndex().column()+1; command=matrix+"="+resize_matrix("0","1", true)+";\n"; command+=matrix_row_col("1:size("+matrix+")(%)",QString::number(col+2)+":size("+matrix+")(%)",true) +"="+matrix_row_col("1:size("+matrix+")(%)",QString::number(col+1)+":(size("+matrix+")(%)-1)",true)+"\n"; command+=matrix_row_col("1:size("+matrix+")(%)",QString::number(col+1),true) +"=0\n"; octave_connection->command_enter(command); windowActivated(); } void Table::delete_columns_cb() { int result=QMessageBox::question (this, tr("Warning"), tr("Comlumns will be deleted. Continue?"), QMessageBox::Ok, QMessageBox::Cancel); if(result!=QMessageBox::Ok) return; int col=table_form->table_widget->currentIndex().column()+1; QString command; command+=matrix_row_col("1:size("+matrix+")(%)",QString::number(col)+":(size("+matrix+")(%)-1)",true) +"="+matrix_row_col("1:size("+matrix+")(%)",QString::number(col+1)+":(size("+matrix+")(%))",true)+";\n"; command+=matrix+"="+resize_matrix("0","(-1)", true)+";\n"; octave_connection->command_enter(command); windowActivated(); } void Table::delete_rows_cb() { int result=QMessageBox::question (this, tr("Warning"), tr("Rows will be deleted. Continue?"), QMessageBox::Ok, QMessageBox::Cancel); if(result!=QMessageBox::Ok) return; int row=table_form->table_widget->currentIndex().row()+1; QString command; command+=matrix_row_col(QString::number(row)+":size("+matrix+")(%)-1","1:size("+matrix+")(%)",true) +"="+matrix_row_col(QString::number(row+1)+":(size("+matrix+")(%))","1:size("+matrix+")(%)",true)+";\n"; command+=matrix+"="+resize_matrix("(-1)","0", true)+";\n"; octave_connection->command_enter(command); windowActivated(); } void Table::paste_cb() { QClipboard *clipboard = QApplication::clipboard(); QString text=clipboard->text(); QString _command; QTextStream command(&_command); int row=table_form->table_widget->currentIndex().row()+1, col=table_form->table_widget->currentIndex().column()+1; QRegExp rx("([0-9ieEj\\.\\-\\+]+|\\n)"); QString value; int pos = 0; while ((pos = rx.indexIn(text, pos)) != -1) { value=rx.cap(0); pos += rx.matchedLength(); if(value=="\n") {row++;col=table_form->table_widget->currentIndex().column()+1;} else { command << matrix_row_col(QString::number(row),QString::number(col)) << "=" << value << ";\n"; col++; } } octave_connection->command_enter(_command); windowActivated(); } void Table::copy_matrix_cb() { QString str("["); QModelIndexList ranges=table_form->table_widget->selectionModel ()->selectedIndexes (); QMap > values; for(int i=0;idata(ranges.at(i)).toString(); } QList rows=values.keys(); for(int i=0;i cols=values[rows.at(i)].keys(); str+=values[rows.at(i)][cols.at(0)]; for(int j=1;jsetText(str); } void Table::copy_cb() { QString str; QModelIndexList ranges=table_form->table_widget->selectionModel ()->selectedIndexes (); QMap > values; for(int i=0;idata(ranges.at(i)).toString(); } QList rows=values.keys(); for(int i=0;i cols=values[rows.at(i)].keys(); str+=values[rows.at(i)][cols.at(0)]; for(int j=1;jsetText(str); } void Table::contextMenuEvent ( QContextMenuEvent * event ) { QPoint p(event->globalX(),event->globalY()); menu->popup(p); } void Table::plot(TablePlot::Type type) { TablePlot *dialog = new TablePlot(this, table_form->table_widget, model, type); if(dialog->exec() == QDialog::Accepted) { try { this->octave_connection->command_enter(dialog->command()); }catch(const char *str) { //QMessageBox errorMsg(QMessageBox::Warning, "Error", str, QMessageBox::Ok, this); //errorMsg.exec(); QMessageBox::warning (NULL, tr("Error"), str); } } delete dialog; } void Table::plotPlot() { plot(TablePlot::PLOT); } void Table::plotPolar() { plot(TablePlot::POLAR); } void Table::plotLogXandY() { plot(TablePlot::LOGLOG); } void Table::plotLogY() { plot(TablePlot::SEMILOGY); } void Table::plotLogX() { plot(TablePlot::SEMILOGX); } void Table::plotBar() { plot(TablePlot::BAR); } BaseWidget *Table::copyBaseWidget(QWidget * parent ) { Table *bw=new Table(parent); bw->setSession(session); bw->setOctaveConnection(octave_connection); bw->setMatrix( matrix_row_col(":",":") ); return bw; } void Table::toXML(QXmlStreamWriter &xml) { xml.writeStartElement("matrix"); xml.writeAttribute("value", matrix_row_col(":",":") ); xml.writeEndElement(); } QString Table::matrix_row_col(QString row, QString col, bool ranges) { bool row_ok=true; QString command(matrix+"("); if(dimensions.size()==0) { row.replace("%", QString::number(1)); col.replace("%", QString::number(2)); command+=row+","+col+")"; return command; } for(int i=0;i rows || index.column() > cols) return QVariant(); if (role == Qt::DisplayRole) { int row=index.row(), col=index.column(); return data(row,col); } else return QVariant(); } //////////////////////////////////////////////////////////////////////////////// QString ComplexNumberTableModel::data(int row, int col) const { QString value = QString::number(real[row][col]); if(imag[row][col]!=0) { if(imag[row][col]>0) value+="+"+QString::number(imag[row][col])+"i"; else value+=QString::number(imag[row][col])+"i"; } return value; } //////////////////////////////////////////////////////////////////////////////// void ComplexNumberTableModel::resize( int _rows, int _columns) { if(_rows==rows && _columns==cols) { update(); return; } if(real!=NULL) { for(int i=0;i0) { beginRemoveRows(QModelIndex(), 0, rows-1); endRemoveRows(); } if(cols>0) { beginRemoveColumns(QModelIndex(), 0, cols-1); endRemoveColumns(); } rows=_rows; cols=_columns; real=new double*[rows]; imag=new double*[rows]; for(int i=0;i0) { beginInsertRows(QModelIndex(), 0, rows-1); endInsertRows(); } if(cols>0) { beginInsertColumns(QModelIndex(), 0, cols-1); endInsertColumns(); } } //////////////////////////////////////////////////////////////////////////////// ComplexNumberTableModel::~ComplexNumberTableModel() { if(real!=NULL) { for(int i=0;idata(index, Qt::DisplayRole).toString(); QLineEdit *lineedit = static_cast(editor); lineedit->setText(value); } #ifdef __DELEGATE_WIDGET__ //////////////////////////////////////////////////////////////////////////////// QWidget *LineEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex & index) const { QLineEdit *editor = new QLineEdit(parent); editor->installEventFilter(const_cast(this)); return editor; } //////////////////////////////////////////////////////////////////////////////// void LineEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QLineEdit *lineedit = static_cast(editor); QString value = lineedit->text(); model->setData(index, value); } //////////////////////////////////////////////////////////////////////////////// void LineEditDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { editor->setGeometry(option.rect); } //////////////////////////////////////////////////////////////////////////////// bool LineEditDelegate::eventFilter( QObject * object, QEvent * event ) { if(event->type()==QEvent::KeyPress) { QKeyEvent *ekey=(QKeyEvent*)event; QWidget *editor=static_cast(object); switch(ekey->key()) { case Qt::Key_Return: case Qt::Key_Enter: emit commitData(editor); case Qt::Key_Escape: emit closeEditor(editor,NoHint); event->setAccepted(true); return true; break; } } return false; } #endif qtoctave-0.10.1/qtoctave/src/pkg_bind.cpp0000644000175000017500000000340011511434227017312 0ustar lucaslucas#include #include #include "pkg_bind.h" #include "config.h" PkgBind *PkgBind::instance = NULL; /* Constructor */ PkgBind::PkgBind() { loadCommandList(); }; /* Get the unique instance * or create it if there isn't any */ PkgBind *PkgBind::getInstance() { if(instance==NULL) instance = new PkgBind(); return instance; } /* Load the command list from a file */ void PkgBind::loadCommandList() { QString path = PKG_CMD_PATH; QFile file(path); if(file.open(QIODevice::ReadOnly)) { char buffer[1024]; int len; while((len = file.readLine(buffer, sizeof(buffer))) > -1) { if(buffer[len - 1] == '\n') buffer[len - 1] = '\0'; commands << QString(buffer); } printf("[PkgBind::loadCommandList] '%s' loaded\n", path.toLocal8Bit().constData()); }else{ printf("[PkgBind::loadCommandList] '%s' can not be loaded\n", path.toLocal8Bit().constData()); } } /* Check if a symbol is defined * as a funciont included in some package */ bool PkgBind::checkSymbol(const QString &s) { return commands.contains(s); } /* Invoke the package manager * for install the package with the command * "cmd" */ void PkgBind::invokePackageManager(const QString &s) { QMessageBox *msgBox = new QMessageBox(QMessageBox::Question, "Package Manager", "There is a package that provides the command '" + s + "'\n" "Do you want to try to install it now?", QMessageBox::Yes | QMessageBox::No); invokeCmd = QString("qtoctave_pkg -s ") + s + "&"; connect(msgBox, SIGNAL(finished(int)), this, SLOT(invokeResponse(int))); msgBox->show(); } /* The dialog response */ void PkgBind::invokeResponse(int result) { if(result == QMessageBox::Yes) system(invokeCmd.toLocal8Bit().constData()); } qtoctave-0.10.1/qtoctave/src/config.h0000644000175000017500000000526511511434227016462 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ /*! \mainpage QtOctave Index Page * * \section intro_sec Introduction * * QtOctave is a simple front-end for Octave. Octave is a Matlab like calculus application.
* QtOctave main page: qtoctave.wordpress.com * * \section modules_sec QtOctave modules. * QtOctave uses this module structure:
* Main module point of view
* Visual tools point of view view
* * Main module controls all modules and interconnect them.
* BaseWidget module is a base class for windows shown in QtOctave. * * \subsection operations_sec Operations module. * * Operations module connects menus signals with callbacks. Contains some classes as Plot class and General_Menu class. */ /** @file config.h * This file contains application's config parameters. Configuration is automaticly load and save from CONFIG_PATH/config.rc and from user home/.qtoctave.rc */ #ifdef USER_CONFIG #include "configure.h" #endif #ifndef HELP_PATH #define HELP_PATH "./octave_doc/index.html" #endif #ifndef ICON_PATH #define ICON_PATH "./images" #endif #ifndef QTOCTAVE_HELP_PATH #define QTOCTAVE_HELP_PATH "./qtoctave_doc/index.html" #endif #ifndef CONFIG_PATH #define CONFIG_PATH "./" #endif #ifndef LANG_PATH #define LANG_PATH "./lang" #endif #ifndef PKG_CMD_PATH #define PKG_CMD_PATH "./config_files/pkg-commands.list" #endif #define PKG_ENABLED #ifndef CONFIG_H #define CONFIG_H //#undef QT_NO_DEBUG #include #include #include "session.h" #include /**Gets config of parameter. * @param parameter Parameter name. * @return A QString with parameter value. */ const QString get_config(QString parameter); /**Sets config of parameter. * @param configuration Add a parameter with value. QMap key is parameter name. QMap value is parameter value. */ void set_config(QMap configuration); #endif qtoctave-0.10.1/qtoctave/src/table_ui.ui0000644000175000017500000000647311511434227017171 0ustar lucaslucas TableForm 0 0 495 297 Table images/table.png 0 0 0 0 0 6 0 0 0 0 images/reload.png 22 22 Cols 0 0 1 1000000 Rows 0 0 1 1000000 Change Order qtoctave-0.10.1/qtoctave/src/terminal.cpp0000644000175000017500000004127711511434227017366 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "terminal.h" #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "projects/projects.h" #include "pkg_bind.h" Terminal::Terminal(QWidget * parent):BaseWidget(parent) { widget_type=TERMINAL; octave_connection=NULL; diary_ok=false; init_regular_expresions(); menuBar()->hide(); //Se crea la ventana del terminal setWindowTitle(tr("Octave Terminal")); setWindowIcon( QIcon(QString( ICON_PATH )+"/konsole.png")); if(get_config("lines_in_terminal").isEmpty()) { QMap c; c["lines_in_terminal"]="1000"; set_config(c); } if(get_config("cols_in_terminal").isEmpty()) { QMap c; c["cols_in_terminal"]="80"; set_config(c); } lines_in_terminal=get_config("lines_in_terminal").toInt(); cols_in_terminal=get_config("cols_in_terminal").toInt(); text=new QTextEdit(this); text->setLineWrapMode (QTextEdit::NoWrap); //text->setLineWrapColumnOrWidth ( cols_in_terminal ); text->setReadOnly (true); if(get_config("show_ide_commands").isEmpty()) { show_ide_commands_ok=false; QMap c; c["show_ide_commands"]="false"; set_config(c); } else if(get_config("show_ide_commands")=="true") show_ide_commands_ok=true; else show_ide_commands_ok=false; if(get_config("terminal_font").isEmpty()) { QMap c; c["terminal_font"]="Liberation Mono"; set_config(c); } //{ // QFont font; // font.fromString(get_config("terminal_font")); // text->setFont( font ); //} if(get_config("terminal_foreground_color").isEmpty()) { QMap c; c["terminal_foreground_color"]="Black"; set_config(c); } if(get_config("terminal_background_color").isEmpty()) { QMap c; c["terminal_background_color"]="White"; set_config(c); } if(get_config("terminal_error_color").isEmpty()) { QMap c; c["terminal_error_color"]="Red"; set_config(c); } if(get_config("ide_command_color").isEmpty()) { QMap c; c["ide_command_color"]="lightGray"; set_config(c); } //text->setTextColor(get_config("terminal_foreground_color")); { QPalette p=text->viewport ()->palette(); p.setColor(QPalette::Base, QColor(get_config("terminal_background_color")) ); text->viewport()->setPalette(p); } QFont font; font.fromString(get_config("terminal_font")); normal_format.setFont(font); normal_format.setFontWeight(QFont::Normal); ide_command_format=normal_format; ide_command_format.setForeground(QColor(get_config("ide_command_color")) ); ide_command_format.setFontPointSize(font.pointSize()-3); normal_format.setForeground(QColor(get_config("terminal_foreground_color")) ); command_format=normal_format; command_format.setFontWeight(QFont::Bold); error_format=normal_format; error_format.setForeground(QColor(get_config("terminal_error_color")) ); text->setHtml("Starting Octave...
"); text->show(); combo_box=new Autocomplete(this); combo_box->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); combo_box->show(); //combo_box->setFocus(); //Se captura el "intro" para pasar comandos al octave QLineEdit *line_edit=combo_box/*->lineEdit()*/; connect(line_edit, SIGNAL(returnPressed()), this, SLOT(return_pressed())); connect( line_edit, SIGNAL( textChanged ( const QString &) ) , this, SLOT( textChanged ( const QString &) ) ); line_edit->setText(tr("Insert your commands here...")); line_edit->selectAll(); line_edit->setToolTip(tr("Insert your commands here. Use arrows and tab key to commands navigation.")); connect(combo_box, SIGNAL(selectionChanged ()), this, SLOT(clear_command_line_first_time())); QVBoxLayout *layout = new QVBoxLayout; QHBoxLayout *line_layout = new QHBoxLayout; layout->addWidget(text); layout->addLayout(line_layout); line_layout->addWidget(new QLabel("Command line>>",this)); line_layout->addWidget(combo_box); centralWidget()->setLayout(layout); setAcceptDrops(true); } void Terminal::init_regular_expresions() { //Used in remove_lines regexp_octave_prompt.setPattern("(((octave:[0-9]+>)|(octave:[0-9]+\\+>))|>>>)+"); //PS1 or PS2 //Used in line_ready re.setPattern("~~Diary: (.*) '(.*)'\n"); } void Terminal::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("text/plain")) event->acceptProposedAction(); } void Terminal::dropEvent ( QDropEvent * event ) { QString path=event->mimeData()->text(); QFileInfo fileInfo(path); QString cmd; // Change dir cmd = QString("cd \"") + fileInfo.dir().absolutePath() +"\""; octave_connection->command_enter(cmd); // Execute file cmd = fileInfo.baseName(); octave_connection->command_enter(cmd); event->acceptProposedAction(); } void Terminal::return_pressed() { QLineEdit *line_edit=combo_box/*->lineEdit()*/; QString command(line_edit->text()); command_enter(command); } QTextEdit *Terminal::getTextEdit() { return text; } Autocomplete *Terminal::getAutocomplete() { return combo_box; } void Terminal::setOctaveConnection(OctaveConnection *octave_connection) { this->octave_connection=octave_connection; connect(octave_connection, SIGNAL(error_ready(QString)), this, SLOT(write_error(QString))); connect(octave_connection, SIGNAL(output_ready(QString)), this, SLOT(write_output(QString))); connect(octave_connection, SIGNAL(command_ready(QString)), this, SLOT(write_command(QString))); connect(octave_connection, SIGNAL(ide_command_ready(QString)), this, SLOT(write_ide_command(QString))); connect(octave_connection, SIGNAL(line_ready(QString)), this, SLOT(line_ready(QString))); combo_box->set_octave_connection(octave_connection); //setProject(); //This line loads variables } OctaveConnection *Terminal::getOctaveConnection() { return octave_connection; } void Terminal::command_enter (const QString &command) { octave_connection->command_enter(command); combo_box->setText(""); } #include void Terminal::remove_lines(QTextCursor &cursor) { //Se cortan las líneas que sean demasiado largas cursor.movePosition(QTextCursor::Start); int lines=0; while(true) { QTextBlock block=cursor.block(); if(block.length()>cols_in_terminal) { cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::Right,QTextCursor::MoveAnchor,cols_in_terminal-1); cursor.insertText("\n"); } else { cursor.movePosition(QTextCursor::EndOfBlock); cursor.movePosition(QTextCursor::Right); } cursor.movePosition(QTextCursor::EndOfBlock); lines++; if(cursor.atEnd()) { QTextBlock block=cursor.block(); if(block.length()toPlainText().count('\n'); while(lines>lines_in_terminal) { cursor.movePosition(QTextCursor::Start); cursor.movePosition(QTextCursor::EndOfBlock,QTextCursor::KeepAnchor); //printf("line %d: %s\n",lines, cursor.selectedText().toLocal8Bit().data()); if(cursor.hasSelection()) cursor.removeSelectedText(); else cursor.deleteChar(); cursor.deleteChar(); lines--; } //printf("lines=%d %d\n",lines,lines_in_terminal); //Merge all octave:X> in only one //QRegExp regexp_octave_prompt("((octave:[0-9]+>)|(octave:[0-9]+\\+>))"); //PS1 or PS2 cursor.movePosition(QTextCursor::Start); if( !text->isVisible() ) return; cursor = text->document()->find(regexp_octave_prompt,cursor); while( cursor.position()>=0 ) { QTextCharFormat format=cursor.charFormat(); if(format.fontWeight()!=QFont::Bold) { format.setFontWeight(QFont::Bold); //cursor.setCharFormat(format); cursor.insertText(">>>", format); } cursor = text->document()->find(regexp_octave_prompt,cursor); } cursor=text->textCursor(); return; /* //cursor.movePosition(QTextCursor::Start); //while(!cursor.atEnd()) //{ // int prompt_no=0; // // cursor.movePosition(QTextCursor::Right); // cursor.movePosition(QTextCursor::StartOfBlock); // cursor.movePosition( QTextCursor::EndOfBlock,QTextCursor::KeepAnchor); // // QString line=cursor.selectedText(); // QString last_prompt; // int pos = 0; // while ((pos = regexp_octave_prompt.indexIn(line, pos)) != -1) // { // last_prompt=regexp_octave_prompt.cap(1); // pos += regexp_octave_prompt.matchedLength(); // prompt_no++; // } // if(prompt_no>=1) // { // line.remove(regexp_octave_prompt); // QTextCharFormat format=text->currentCharFormat(); // format.setFontWeight(QFont::Bold); // cursor.insertText(last_prompt,format); // format.setFontWeight(QFont::Normal); // cursor.insertText(line,format); // } // cursor.movePosition(QTextCursor::EndOfBlock); //} */ } void Terminal::write_output(QString output) { QTextCursor cursor=text->textCursor(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::End); //QTextCharFormat format=cursor.charFormat(); //format.setFontWeight(QFont::Normal); //format.setForeground(QColor(get_config("terminal_foreground_color")) ); //cursor.setCharFormat(format); cursor.insertText(output, normal_format); //text->setTextCursor( cursor ); //text->setTextColor( get_config("terminal_foreground_color") ); //text->setFontWeight ( QFont::Normal ); //text->insertPlainText(output); remove_lines(cursor); cursor.movePosition(QTextCursor::End); cursor.endEditBlock(); text->setTextCursor( cursor ); if(diary_ok) { diary_file.write(output.toLocal8Bit()); } } void Terminal::write_error(QString error) { QTextCursor cursor=text->textCursor(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::End); //QTextCharFormat format=cursor.charFormat(); //format.setFontWeight(QFont::Normal); //format.setForeground(QColor(get_config("terminal_error_color")) ); //cursor.setCharFormat(format); cursor.insertText(error, error_format); //text->setTextCursor( cursor ); //text->setTextColor( get_config("terminal_error_color") ); //text->setFontWeight ( QFont::Normal ); //text->insertPlainText(error); remove_lines(cursor); cursor.movePosition(QTextCursor::End); cursor.endEditBlock(); text->setTextCursor( cursor ); #ifdef PKG_ENABLED // Symbol not defined. ¿Quizá en un paquete? QRegExp undefinedSymbol("error: `(\\w+)' undefined near line \\d+ column \\d+"); if(undefinedSymbol.indexIn(error) > -1) { QString symbol(undefinedSymbol.capturedTexts()[1]); if(PkgBind::getInstance()->checkSymbol(symbol)) PkgBind::getInstance()->invokePackageManager(symbol); } #endif } void Terminal::write_command(QString command) { QTextCursor cursor=text->textCursor(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::End); //QTextCharFormat format=cursor.charFormat(); //format.setFontWeight(QFont::Bold); //format.setForeground(QColor(get_config("terminal_foreground_color")) ); //cursor.setCharFormat(format); cursor.insertText(command, command_format); //text->setTextCursor( cursor ); //text->setTextColor( get_config("terminal_foreground_color") ); //text->setFontWeight ( QFont::Bold ); //text->insertPlainText(command); //text->setFontWeight ( QFont::Normal ); remove_lines(cursor); cursor.movePosition(QTextCursor::End); cursor.endEditBlock(); text->setTextCursor( cursor ); if(diary_ok) { diary_file.write(command.toLocal8Bit()); } } void Terminal::write_ide_command(QString command) { if(!show_ide_commands_ok) return; QTextCursor cursor=text->textCursor(); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::End); //QTextCharFormat format=cursor.charFormat(); //format.setFontWeight(QFont::Bold); //format.setForeground(Qt::lightGray); //cursor.setCharFormat(format); cursor.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor); cursor.setCharFormat(ide_command_format); cursor.movePosition(QTextCursor::End); cursor.insertText(command, ide_command_format); //text->setTextCursor( cursor ); //text->setTextColor( get_config("terminal_foreground_color") ); //text->setFontWeight ( QFont::Bold ); //text->insertPlainText(command); //text->setFontWeight ( QFont::Normal ); remove_lines(cursor); cursor.movePosition(QTextCursor::End); cursor.endEditBlock(); text->setTextCursor( cursor ); } void Terminal::closeEvent(QCloseEvent *event) { if(session->getTools(TERMINAL).size()<2) { //Ignorar este evento event->ignore(); } } void Terminal::completion_matches_callback() { QString command; QTextStream(&command) << "completion_matches(\"" << combo_box/*->lineEdit()*/->text() << "\")"; octave_connection->command_enter(command,false); } #include #include void Terminal::stop_process_callback() { #if defined Q_OS_WIN32 //system(QString("sh kill -s SIGINT "+QString("%d").arg(octave_connection->pid()) ).toLocal8Bit().data() ); octave_connection->terminate(); #else kill(octave_connection->pid(),SIGINT); #endif } void Terminal::clear_callback() { text->clear(); octave_connection->command_enter("",false); } void Terminal::clear_command_line_first_time() { combo_box->setText(""); disconnect(combo_box, SIGNAL(selectionChanged ()), this, SLOT(clear_command_line_first_time())); } CommandList * Terminal::show_commands_callback() { CommandList *command_list=new CommandList(work_space); connect(combo_box, SIGNAL(new_command_entered(QStringList)), command_list, SLOT(set_list(QStringList)) ); command_list->setSession(session); command_list->setLineEdit(combo_box); command_list->set_list(combo_box->commands()); if(work_space!=NULL) work_space->addSubWindow(command_list); command_list->show(); return command_list; } void Terminal::textChanged( const QString & text) { emit dynamic_help_required(text); } void Terminal::setSession(Session *session) { BaseWidget::setSession(session); connect(session, SIGNAL(projectChanged(QString)), this, SLOT(setProject(QString))); } void Terminal::setProject(QString /*project*/) { if(octave_connection!=NULL) { //Load variables QString file_name=Projects::variablesListPath(session->getProjectName()); if(file_name.isEmpty()) return; QString command("load(\"-text\",\""+file_name+"\"); cd(qtoctave_pwd); clear qtoctave_pwd;"); octave_connection->command_enter(command, false); combo_box->setProject(session->getProjectName()); } } Terminal::~Terminal() { //saveVariables(); } void Terminal::saveVariables() { if(octave_connection!=NULL) { //Save variables QDateTime date=QDateTime::currentDateTime(); QString file_name=QString::number( date.toTime_t() ); QString home=QDir::home().path()+"/.qtoctave/"; file_name=home+file_name+".variables"; QString command("qtoctave_pwd=pwd; save(\"-text\",\""+file_name+"\");"); octave_connection->command_enter(command); octave_connection->command_enter("disp(\"\\n\\nAll data has been saved.\");",false); //Octave has 1 seconds to save data Sleep::micro_sleep(1000000); Projects::saveVariablesListPath(session->getProjectName(), file_name); } } BaseWidget *Terminal::copyBaseWidget(QWidget * parent ) { Terminal *bw=new Terminal(parent); bw->setSession(session); bw->setProject(); bw->setOctaveConnection(octave_connection); bw->text->setHtml(text->toHtml()); QTextCursor cursor=bw->text->textCursor(); cursor.movePosition(QTextCursor::End); bw->text->setTextCursor( cursor ); return bw; } void Terminal::line_ready(QString line) { //QRegExp re("~~Diary: (.*) '(.*)'\n"); if( re.exactMatch(line) ) { QString command=re.cap(1); QString file_name=re.cap(2); if( command=="change" ) diary_ok=!diary_ok; else if( command=="on" ) diary_ok=true; else if( command=="off" ) diary_ok=false; else if( command=="file" ) { diary_ok=true; if(diary_file.isOpen()) diary_file.close(); diary_file.setFileName(file_name); if (!diary_file.open(QIODevice::Append | QIODevice::Text)) return; } if(diary_ok) { if(!diary_file.isOpen()) { if(diary_file.fileName().isEmpty()) diary_file.setFileName(file_name+"/diary"); diary_file.open(QIODevice::Append | QIODevice::Text); } } else diary_file.close(); } } qtoctave-0.10.1/qtoctave/src/navigator.h0000644000175000017500000001137111511434227017202 0ustar lucaslucas/* Copyright (C) 2006, 2007, 2008 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef NAVIGATOR_H #define NAVIGATOR_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "octave_connection.h" #include "basewidget.h" #include "projects/projects.h" #define QFileSystemNewModel QFileSystemModel class QToolBar; //class QMenuBar; class QAction; class QVBoxLayout; class QLineEdit; //class QTreeView; class QDirModel; class QListView; class QPushButton; //class QStatusBar; class Navigator : public BaseWidget { Q_OBJECT private: //Project opened in this editor. QString project_name; QVBoxLayout *layout; QToolBar *toolbar; //QMenuBar *menubar; //QStatusBar *statusbar; QMenu *context_menu; QPushButton *go; QComboBox *url, *filter_comboBox; //QDirModel *treemodel; QFileSystemNewModel *listmodel; //QTreeView *treeview; QTreeView *listview; QVector backHistory; QVector forwardHistory; OctaveConnection *octave_connection; //List of files to copy QList file_list; QFileInfo file_list_parent_path; bool copy_ok, cut_ok; // Actions QAction *cut; QAction *copy; QAction *paste; QAction *newFolder; QAction *exit; QAction *back; QAction *forward; QAction *up; QAction *remove; QAction *rename; // Private Methods void createActions(); //void createMenuBar(); void createToolBar(); void createLayout(); void createContextMenu(); void createConnections(); void setUrl(const QModelIndex &index); void setUpActionState(const QModelIndex &index); public: // Public Constructor Navigator(QWidget *parent = 0); ~Navigator(); void setSession(Session *session); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); // Public Methods void setOctaveConnection(OctaveConnection *oc); QString getNavigatorCurrentPath(); void setNavigatorCurrentPath(QString path); public slots: void expanded(const QModelIndex &index); void goBack(bool checked); void goForward(bool checked); void goUp(bool checked); void urlButtonPressed(const QString &s=QString()); void urlButtonPressed(bool checked); void mkdir(); void contextMenu_cb( const QPoint & pos); void copy_cb(); void cut_cb(); void paste_cb(); void remove_cb(); void rename_cb(); void process_end(QThread *object); void filter_cb(const QString &s); void change_cursor_cb(const QModelIndex &index); /**Sets active project name.*/ void setProject(QString name); }; /**ListView for Drag & Drop */ class DragDropQTreeView:public QTreeView { Q_OBJECT public: DragDropQTreeView(QWidget *parent=0); protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); QPoint dragStartPosition; }; /**Shows window with information about copy/move/remove process. */ class FileActions:public QThread { Q_OBJECT //Flags. bool copy_ok, move_ok, remove_ok, stop_ok; //Window widgets QWidget *window; QPushButton *cancel_button, *ok_button; QTextEdit *textEdit; QProgressBar *progressBar; //File list QList list; QString path; QFileInfo parent; //Copy file void copy(QFileInfo file, QString path); void cut(QFileInfo file, QString path); void remove(QFileInfo file); /** Find all files in file. * If file is not a directory, it will return file. */ QList find(QFileInfo file); QList find(QList files); public: FileActions(QObject *parent); ~FileActions(); /**Copy files.*/ void copy(QFileInfo parent, QList list, QString path); void cut(QFileInfo parent, QList list, QString path); void remove(QList list); void run(); public slots: void set_label_text(QString text); void stop(); void ok_button_callback(); signals: void process_value(int value); void process_end(QThread *object); }; #endif // NAVIGATOR_H qtoctave-0.10.1/qtoctave/src/autocomplete.h0000644000175000017500000000524511511434226017713 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __AUTOCOMPLETE_H__ #define __AUTOCOMPLETE_H__ #include #include #include #include #include #include #include #include "octave_connection.h" #include "projects/projects.h" /**This class is used to autocomplete strings. */ class Autocomplete:public QLineEdit { Q_OBJECT private: QStringList word_list; QStringList::const_iterator first_match, current_match; QString search_string; bool tab_flag; QStringList commands_entered; int actual_command_entered; QStringList completion_list; QCompleter completer; QStringListModel *completion_model; OctaveConnection *octave_connection; protected: bool event(QEvent *event); /**Searches for the first match and returns it. * @param start The search pattern. * @return The first match, or start if there's no matches. */ QString search(QString start); /**Get the next match. After the last match comes the first one. * @return The next match or the search pattern if there's no matches. */ QString get_next(); void keyPressEvent ( QKeyEvent * event ); public: Autocomplete(QWidget *parent); /**Load from a text file the word list. It does'nt clear the previous loaded list. * @param file A plain text file that contains the word list. */ void load_from_file(const char *file); /**Add a word to the list. * @param word The word that is going to be added. */ void add(QString word); /**Remove a word from the list. * @param word The word that is going to be removed. */ void remove(QString word); /**Clears the list */ void clear(); /**List of commands. */ QStringList commands(); void set_octave_connection(OctaveConnection *oc); void setProject(QString project); public slots: void add_completion_match(QString line); signals: void new_command_entered(QStringList list); }; #endif qtoctave-0.10.1/qtoctave/src/numberedtextview.cpp0000644000175000017500000003633411511434226021151 0ustar lucaslucas/* This file is part of the KDE libraries Copyright (C) 2005, 2006 KJSEmbed Authors See included AUTHORS file. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "numberedtextview.h" #include "config.h" NumberBar::NumberBar( QWidget *parent ) : QWidget( parent ), edit(0), currentLine(-1), bugLine(-1) { // Make room for 4 digits and the breakpoint icon setFixedWidth( fontMetrics().width( QString("0000") + 10 + 32 ) ); stopMarker = QPixmap( QString(ICON_PATH) + "/stop.png" ); currentMarker = QPixmap( QString(ICON_PATH) + "/bookmark.png" ); bugMarker = QPixmap( QString(ICON_PATH) + "/bug.png" ); } NumberBar::~NumberBar() { } void NumberBar::setCurrentLine( int lineno ) { currentLine = lineno; update(); } void NumberBar::setBugLine( int lineno ) { bugLine = lineno; } void NumberBar::toggleBreakpoint( int lineno ) { if(lineno > 0) { int i = breakpoints.indexOf(lineno); if(i > -1) breakpoints.removeAt(i); else breakpoints.push_back(lineno); } update(); } void NumberBar::setTextEdit( SimpleEditor *edit ) { this->edit = edit; setFixedWidth( edit->fontMetrics().width( QString("0000") + 10 + 32 ) ); connect( edit->document()->documentLayout(), SIGNAL( update(const QRectF &) ), this, SLOT( update() ) ); connect( edit->verticalScrollBar(), SIGNAL(valueChanged(int) ), this, SLOT( update() ) ); } void NumberBar::paintEvent( QPaintEvent * ) { QVector lines_list; int first_line_no; edit->publicBlockBoundingRectList(lines_list, first_line_no); const QFontMetrics fm = edit->fontMetrics(); const int ascent = fontMetrics().ascent() + 1; // height = ascent + descent + 1 QPainter p(this); p.setPen(palette().windowText().color()); bugRect = QRect(); stopRect = QRect(); currentRect = QRect(); int position_y; int lineCount; const int lines_list_size=lines_list.size(); for(int i=0;iverticalScrollBar()->value(); qreal pageBottom = contentsY + edit->viewport()->height(); const QFontMetrics fm = fontMetrics(); const int ascent = fontMetrics().ascent() + 1; // height = ascent + descent + 1 int lineCount = 1; QPainter p(this); p.setPen(palette().windowText().color()); bugRect = QRect(); stopRect = QRect(); currentRect = QRect(); for ( QTextBlock block = edit->document()->begin(); block.isValid(); block = block.next(), ++lineCount ) { const QRectF boundingRect = edit->publicBlockBoundingRect( block ); QPointF position = boundingRect.topLeft(); if ( position.y() + boundingRect.height() < contentsY ) continue; if ( position.y() > pageBottom ) break; const QString txt = QString::number( lineCount ); p.drawText( width() - fm.width(txt), qRound( position.y() ) - contentsY + ascent, txt ); // Bug marker if ( bugLine == lineCount ) { p.drawPixmap( 1, qRound( position.y() ) - contentsY, bugMarker ); bugRect = QRect( 1, qRound( position.y() ) - contentsY, bugMarker.width(), bugMarker.height() ); } // Stop marker if ( breakpoints.contains(lineCount) ) { p.drawPixmap( 19, qRound( position.y() ) - contentsY, stopMarker ); stopRect = QRect( 19, qRound( position.y() ) - contentsY, stopMarker.width(), stopMarker.height() ); } // Current line marker if ( currentLine == lineCount ) { p.drawPixmap( 19, qRound( position.y() ) - contentsY, currentMarker ); currentRect = QRect( 19, qRound( position.y() ) - contentsY, currentMarker.width(), currentMarker.height() ); } } */ } bool NumberBar::event( QEvent *event ) { if ( event->type() == QEvent::ToolTip ) { QHelpEvent *helpEvent = static_cast(event); if ( stopRect.contains( helpEvent->pos() ) ) { QToolTip::showText( helpEvent->globalPos(), tr("Stop Here")); } else if ( currentRect.contains( helpEvent->pos() ) ) { QToolTip::showText( helpEvent->globalPos(), tr("Current Line")); } else if ( bugRect.contains( helpEvent->pos() ) ) { QToolTip::showText( helpEvent->globalPos(), tr("Error Line" )); } } return QWidget::event(event); } QList *NumberBar::getBreakpoints() { return &breakpoints; } NumberedTextView::NumberedTextView( QWidget *parent, SimpleEditor *textEdit ) : QFrame( parent ) { setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); setLineWidth( 2 ); view=textEdit; view->installEventFilter( this ); connect( view->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(textChanged(int,int,int)) ); connect( view, SIGNAL(cursorPositionChanged()), this, SLOT(cursor_moved_cb()) ); // Setup the line number pane numbers = new NumberBar( this ); numbers->setTextEdit( view ); //numbers=NULL; vbox = new QVBoxLayout(this); vbox->setSpacing( 0 ); vbox->setMargin( 0 ); hbox = new QHBoxLayout; vbox->addLayout(hbox); hbox->setSpacing( 0 ); hbox->setMargin( 0 ); hbox->addWidget( numbers ); hbox->addWidget( view ); textModifiedOk=false; QHBoxLayout *messages_layout= new QHBoxLayout; vbox->addLayout(messages_layout); messages_layout->setSpacing( 0 ); messages_layout->setMargin( 0 ); line_column_label=new QLabel("Line: 1 Col: 1", this); messages_layout->addWidget(line_column_label); line_column_label->show(); } NumberedTextView::~NumberedTextView() { hide(); //printf("Borrado ntv\n"); SimpleEditor *_textEdit=textEdit(); _textEdit->setDocument(NULL); } void NumberedTextView::setCurrentLine( int lineno ) { currentLine = lineno; if(numbers!=NULL) numbers->setCurrentLine( lineno ); //Move cursor to lineno if(lineno>-1) { QTextCursor cursor=textEdit()->textCursor(); cursor.movePosition(QTextCursor::Start); for(int i=1;isetTextCursor(cursor); } textChanged( 0, 0, 1 ); } void NumberedTextView::toggleBreakpoint( int lineno ) { if(numbers!=NULL) numbers->toggleBreakpoint( lineno ); } void NumberedTextView::setBugLine( int lineno ) { if(numbers!=NULL) numbers->setBugLine( lineno ); } void NumberedTextView::textChanged( int /*pos*/, int removed, int added ) { //Q_UNUSED( pos ); if ( removed == 0 && added == 0 ) return; //QTextBlock block = highlight.block(); //QTextBlock block = view->document()->begin(); //QTextBlockFormat fmt = block.blockFormat(); //QColor bg = view->palette().base().color(); //fmt.setBackground( bg ); //highlight.setBlockFormat( fmt ); /* QTextBlockFormat fmt; int lineCount = 1; for ( QTextBlock block = view->document()->begin(); block.isValid() && block!=view->document()->end(); block = block.next(), ++lineCount ) { if ( lineCount == currentLine ) { fmt = block.blockFormat(); QColor bg = view->palette().highlight().color(); fmt.setBackground( bg ); highlight = QTextCursor( block ); highlight.movePosition( QTextCursor::EndOfBlock, QTextCursor::KeepAnchor ); highlight.setBlockFormat( fmt ); break; } } */ if( !textModifiedOk && view->document()->isModified() ) { textModifiedOk=true; emit textModified(); } } bool NumberedTextView::eventFilter( QObject *obj, QEvent *event ) { if ( obj != view ) return QFrame::eventFilter(obj, event); if ( event->type() == QEvent::ToolTip ) { QHelpEvent *helpEvent = static_cast(event); QTextCursor cursor = view->cursorForPosition( helpEvent->pos() ); cursor.movePosition( QTextCursor::StartOfWord, QTextCursor::MoveAnchor ); cursor.movePosition( QTextCursor::EndOfWord, QTextCursor::KeepAnchor ); QString word = cursor.selectedText(); emit mouseHover( word ); emit mouseHover( helpEvent->pos(), word ); // QToolTip::showText( helpEvent->globalPos(), word ); // For testing } return false; } QList *NumberedTextView::getBreakpoints() { QList *br=NULL; if(numbers!=NULL) br=numbers->getBreakpoints(); return br; } void NumberedTextView::open(QString path) { FILE *fl; fl = fopen(path.toLocal8Bit().constData(), "rt"); if(fl) { fclose(fl); filePath = path; textEdit()->load(path); textModifiedOk=false; textEdit()->document()->setModified(false); }else{ throw path; } } bool NumberedTextView::save(QString path) { FILE *fl; if(path.isEmpty()) path = filePath; QRegExp re("[A-Za-z_][A-Za-z0-9_]*\\.m"); if( ! re.exactMatch( QFileInfo(path).fileName() ) ) { QMessageBox msgBox; msgBox.setText( tr("This file name is not valid.") ); msgBox.setInformativeText(tr("Octave doesn't understand this file name:\n")+path+tr("\nPlease, change it.\n Do you want to save your changes?")); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Save); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Save: // Save was clicked break; case QMessageBox::Cancel: // Cancel was clicked return false; break; default: // should never be reached break; } } fl = fopen(path.toLocal8Bit().constData(), "wt"); if(fl) { filePath = path; QTextStream *stream = new QTextStream(fl); (*stream) << textEdit()->document()->toPlainText(); delete stream; fclose(fl); textModifiedOk=false; view->document()->setModified(false); }else{ return false; } if(get_config("simple_rcs")=="true") { QString repository=path+"~~"; QString command("simplercs \""+repository+"\" \""+path+"\""); QProcess::startDetached(command); //QProcess::execute(command); printf("[NumberedTextView::save] Comando: %s\n", command.toLocal8Bit().data() ); } else { //printf("[NumberedTextView::save] No rcs\n"); } //Set syntax textEdit()->setFile(filePath); return true; } QString NumberedTextView::path() { return filePath; } void NumberedTextView::setPath(QString path) { filePath=path; textEdit()->setFile(path); } void NumberedTextView::setModified(bool modify) { textModifiedOk=modify; } bool NumberedTextView::modified() { return textModifiedOk; } void NumberedTextView::cursor_moved_cb() { QTextCursor cursor=view->textCursor(); QTextBlock actual_block=cursor.block(); int lineCount=1; QTextBlock block = view->document()->begin(); for ( ;block.isValid() && actual_block!=block; block = block.next()) lineCount++ ; int col= cursor.position() - block.position() + 1; line_column_label->setText("Line: "+QString::number(lineCount)+" Col: "+QString::number(col) ); } static QString startLineInsertText(QString str, QString textToInsert) { str.replace(QChar(0x2029), "\n"); //printf("str=%s\n", str.toLocal8Bit().data() ); QStringList list = str.split("\n"); for(int i=0;idocument(); QTextCursor cursor(textEdit()->textCursor()); if( !cursor.hasSelection() ) return; QString str=cursor.selectedText(); str=startLineInsertText(str, "\t"); cursor.insertText(str); cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); textEdit()->setTextCursor(cursor); } void NumberedTextView::unindent() { //QTextDocument *doc=textEdit()->document(); QTextCursor cursor(textEdit()->textCursor()); if( !cursor.hasSelection() ) return; QString str=cursor.selectedText(); QStringList textToRemove; textToRemove << "\t" << " "; str=startLineRemoveText(str, textToRemove); cursor.insertText(str); cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); textEdit()->setTextCursor(cursor); } void NumberedTextView::comment() { //QTextDocument *doc=textEdit()->document(); QTextCursor cursor(textEdit()->textCursor()); if( !cursor.hasSelection() ) return; QString str=cursor.selectedText(); str=startLineInsertText(str, "%"); cursor.insertText(str); cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); textEdit()->setTextCursor(cursor); } void NumberedTextView::uncomment() { //QTextDocument *doc=textEdit()->document(); QTextCursor cursor(textEdit()->textCursor()); if( !cursor.hasSelection() ) return; QString str=cursor.selectedText(); QStringList textToRemove; textToRemove << "%" << "#"; str=startLineRemoveText(str, textToRemove); cursor.insertText(str); cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); textEdit()->setTextCursor(cursor); } qtoctave-0.10.1/qtoctave/src/operations.h0000644000175000017500000001411411511434226017370 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __OPERATIONS_H__ #define __OPERATIONS_H__ #include "mainwindow.h" #include "octave_connection.h" #include "basewidget.h" #include "table.h" #include #include #include #include #include /**This class is used to show plots menus. */ class Plot:public QDialog { Q_OBJECT public: /**Menu type.*/ enum Type {PLOT,SEMILOGY, SEMILOGX, LOGLOG, POLAR}; Plot(QWidget *parent=0, Plot::Type type=PLOT); /**Command to send to Octave. * @return QString representing command. This command is used by Octave to plot. */ QString command(); private: QLineEdit *x_lineedit, *y_lineedit, *error_x_lineedit, *error_y_lineedit, *title_lineedit; QVBoxLayout *vlayout; QComboBox *style_combo, *color_combo, *pointStyle_combo; QTreeWidget *plots_tree; QCheckBox *no_title; Plot::Type type; public slots: void add_callback(); void remove_callback(); void copy_clipboard_callback(); }; /**Connects menu signals with callbacks. */ class Operations:public QObject { Q_OBJECT public: Operations( QObject * parent = 0, BaseWidget **active_widget=0, MainWindow *main_window=0 ); void setOctaveConnection(OctaveConnection *octave_connection); void setMatrix(QString matrix); /**Sets session.*/ inline void setSession(Session *session) {this->session=session;} enum MenuResult {ACCEPTED, COPY_CLIPBOARD, CANCEL}; //Se usa para saber el tipo de salida de un men /**Shows simple dialog with one label and line edit. * @param title Dialog title. * @param label Dialog label. * @param input Value of line edit * @return true if user press ok button. */ bool input_dialog(QString title, QString label, QString &input); /**Shows simple dialog with one label and line edit, and executes _command with line edit value. * @param title Dialog title. * @param label Dialog label. * @param _command Command to execute. * @return true if user press ok button. */ void simple_comand(QString title, QString label, QString _command); /**Shows dialog with labels and line edits. * @param title Dialog title. * @param parameters_labels Dialog labels for input parameters. * @param parameters Value of line edits for input parameters. * @param output_labels Dialog labels for output parameters. * @param output Value of line edits for output parameters. * @param help Html text with help. * @param accept_blank_parameters If user lefts parameters in blank, this option lets them. Otherwise function returns CANCEL. * @return Result of dialog. */ MenuResult menu_window(QString title, QStringList parameters_labels, QStringList ¶meters, QStringList output_labels, QStringList &output, QString help=QString(), bool accept_blank_parameters=false); /**Shows dialog with labels and line edits, and executes _command with line edit value.. * @param title Dialog title. * @param _command Command to execute. * @param parameters_labels Dialog labels for input parameters. * @param parameters Value of line edits for input parameters. * @param output_labels Dialog labels for output parameters. * @param output Value of line edits for output parameters. * @param help Html text with help. * @param is_table If focused window is a table window, asigs value to table. * @param accept_blank_parameters If user lefts parameters in blank, this option lets them. Otherwise function returns. */ void compex_comand(QString title, QString _command, QStringList parameters_labels, QStringList ¶meters, QStringList output_labels, QStringList &output, QString help=QString(), bool is_table=false, bool accept_blank_parameters=false); public slots: /**Makes copy_clipboard_ok true. This callback function deals with menu_window and input_dialog methods. * @see copy_clipboard_ok, menu_window, input_dialog. */ void copy_clipboard_callback(); //File operations void exit_callback(); void cd_callback(); //Operaciones con matrices void inverse_callback(); void determinant_callback(); void eigenvalues_callback(); void transpose_callback(); void submatrix_callback(); //Operaciones estad�ticas void mean_callback(); void median_callback(); void std_callback(); void cov_callback(); void corrcoef_callback(); //Plot menu void plot_callback(); void axis_callback(); void title_label_callback(); //void to_eps_callback(); //void to_pdf_callback(); //void to_png_callback(); void semilogy_callback(); void semilogx_callback(); void log_log_callback(); void polar_callback(); void error_bars_callback(); /**Callback for histogram menu. Shows dialog for histogram.*/ void hist_callback(); /**Callback for bar graph menu. Shows dialog for bar graph.*/ void bar_callback(); /**Callback for contour menu. Shows dialog for contour plot of three-dimensional surface.*/ void contour_callback(); /**Callback for mesh menu. Shows dialog for plot of three-dimensional surface.*/ void mesh_callback(); /**Callback for A+B menu.*/ void suma_callback(); /**Callback for A*B menu.*/ void producto_callback(); /**Callback for A**B menu.*/ void exponente_callback(); //General actions void show_projects_dialog(); //Config actions void general_config_callback(); //Run qtoctave_pkg void qtoctave_pkg_callback(); private: OctaveConnection *octave_connection; QString matrix; BaseWidget **active_widget; MainWindow *main_window; Session *session; bool copy_clipboard_ok; }; #endif qtoctave-0.10.1/qtoctave/src/configure.h0000644000175000017500000000070411511434226017166 0ustar lucaslucas #ifndef __CONFIGURE_H__ #define __CONFIGURE_H__ #define CONFIG_PATH "/opt/qtoctave/share/qtoctave" #define HELP_PATH "/opt/qtoctave/share/doc/octave-html/octave_doc/index.html" #define ICON_PATH "/opt/qtoctave/share/qtoctave/images" #define LANG_PATH "/opt/qtoctave/share/qtoctave/lang" #define QTOCTAVE_HELP_PATH "/opt/qtoctave/share/doc/qtoctave/qtoctave_doc/index.html" #define PKG_CMD_PATH "/opt/qtoctave/share/qtoctave/pkg-commands.list" #endif qtoctave-0.10.1/qtoctave/src/configure.h.in0000644000175000017500000000100011511434226017561 0ustar lucaslucas #ifndef __CONFIGURE_H__ #define __CONFIGURE_H__ #define CONFIG_PATH "${CMAKE_INSTALL_PREFIX}/share/qtoctave" #define HELP_PATH "${CMAKE_INSTALL_PREFIX}/share/doc/octave-html/octave_doc/index.html" #define ICON_PATH "${CMAKE_INSTALL_PREFIX}/share/qtoctave/images" #define LANG_PATH "${CMAKE_INSTALL_PREFIX}/share/qtoctave/lang" #define QTOCTAVE_HELP_PATH "${CMAKE_INSTALL_PREFIX}/share/doc/qtoctave/qtoctave_doc/index.html" #define PKG_CMD_PATH "${CMAKE_INSTALL_PREFIX}/share/qtoctave/pkg-commands.list" #endif qtoctave-0.10.1/qtoctave/src/auto_rc.sh0000755000175000017500000000071211511434226017026 0ustar lucaslucasecho "" > images.qrc echo "" >> images.qrc for a in `ls images`; do echo "images/$a" >> images.qrc; done echo "" >> images.qrc #echo "" > octave_doc.qrc # echo "" >> octave_doc.qrc # # for a in `ls octave_doc`; do # echo "octave_doc/$a" >> octave_doc.qrc; # done # # echo "" >> octave_doc.qrcqtoctave-0.10.1/qtoctave/src/window_list.h0000644000175000017500000000231711511434226017551 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __WINDOW_LIST_H__ #define __WINDOW_LIST_H__ #include #include /** Shows window list asociated to QMdiArea. When some item is selected, asociated window is maximized. */ class WindowList:public QComboBox { Q_OBJECT QMdiArea *work_space; public: WindowList( QMdiArea *work_space, QWidget * parent =0); void showPopup (); public slots: void itemClicked_callback(int item); void window_activated_callback(QMdiSubWindow *); }; #endif qtoctave-0.10.1/qtoctave/src/numberedtextview.h0000644000175000017500000001024411511434226020606 0ustar lucaslucas/* This file is part of the KDE libraries Copyright (C) 2005, 2006 KJSEmbed Authors See included AUTHORS file. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ // -*- c++ -*- #ifndef NUMBERED_TEXT_VIEW_H #define NUMBERED_TEXT_VIEW_H #include #include #include #include #include #include #include "simpleeditor.h" class CodeEdit; class QHBoxLayout; /** * @internal Used to display the numbers. */ class NumberBar : public QWidget { Q_OBJECT public: NumberBar( QWidget *parent ); ~NumberBar(); void setCurrentLine( int lineno ); void setBugLine( int lineno ); void toggleBreakpoint( int lineno ); QList *getBreakpoints(); void setTextEdit( SimpleEditor *edit ); void paintEvent( QPaintEvent *ev ); protected: bool event( QEvent *ev ); private: SimpleEditor *edit; QPixmap stopMarker; QPixmap currentMarker; QPixmap bugMarker; QList breakpoints; int currentLine; int bugLine; QRect stopRect; QRect currentRect; QRect bugRect; }; /** * Displays a CodeEdit with line numbers. */ class NumberedTextView : public QFrame { Q_OBJECT public: NumberedTextView( QWidget *parent = 0 , SimpleEditor *textEdit=new SimpleEditor() ); ~NumberedTextView(); QList *getBreakpoints(); void open(QString path); /**Saves file to path. @return true if all is OK.*/ bool save(QString path = QString()); QString path(); void setPath(QString path); bool modified(); void setModified(bool modify); /** Returns the CodeEdit of the main view. */ SimpleEditor *textEdit() const { return view; } /** * Sets the line that should have the current line indicator. * A value of -1 indicates no line should show the indicator. */ void setCurrentLine( int lineno ); /** * Toggle breakpoint */ void toggleBreakpoint( int lineno ); /** * Sets the line that should have the bug line indicator. * A value of -1 indicates no line should show the indicator. */ void setBugLine( int lineno ); /** @internal Used to get tooltip events from the view for the hover signal. */ bool eventFilter( QObject *obj, QEvent *event ); /**Indent selected text.*/ void indent(); /**UnIndent selected text.*/ void unindent(); /**Comment selected text.*/ void comment(); /**UnComment selected text.*/ void uncomment(); signals: /** * Emitted when the mouse is hovered over the text edit component. * @param word The word under the mouse pointer */ void mouseHover( const QString &word ); /** * Emitted when the mouse is hovered over the text edit component. * @param pos The position of the mouse pointer. * @param word The word under the mouse pointer */ void mouseHover( const QPoint &pos, const QString &word ); /** * Emitted when file is changed. */ void textModified(); protected slots: /** @internal Used to update the highlight on the current line. */ void textChanged( int pos, int added, int removed ); public slots: void cursor_moved_cb(); private: QString filePath; QLabel *line_column_label; SimpleEditor *view; NumberBar *numbers; QHBoxLayout *hbox; QVBoxLayout *vbox; int currentLine; QTextCursor highlight; bool textModifiedOk; }; #endif // NUMBERED_TEXT_VIEW_H qtoctave-0.10.1/qtoctave/src/command_list.cpp0000644000175000017500000001171511511434226020215 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "command_list.h" #include "projects/projects.h" #include #include #include #include #include "terminal.h" CommandList::CommandList( QWidget * parent ):BaseWidget(parent) { widget_type=COMMANDLIST; setWindowTitle(tr("Commands' List")); setWindowIcon(QIcon(QString(ICON_PATH)+"/news_section.png")); QVBoxLayout *layout=new QVBoxLayout; layout->setSpacing(0); layout->setContentsMargins(0,0,0,0); menu_bar=menuBar(); list=new QListView(this); model=new StringListModel(); list->setModel(model); list->setSelectionMode(QAbstractItemView::ExtendedSelection); list->show(); list->setToolTip(tr("Right click to see menu")); QObject::connect(list, SIGNAL(activated(const QModelIndex & )), this, SLOT(itemClicked (const QModelIndex & )) ); layout->addWidget(list); centralWidget()->setLayout(layout); list->setContextMenuPolicy(Qt::CustomContextMenu); //Builds context menu context_menu=new QMenu(tr("Command List"), this); QAction *copy_clipboard=new QAction(tr("Copy"), this); connect(copy_clipboard, SIGNAL(triggered()), this, SLOT(copy_clipboard_callback()) ); context_menu->addAction(copy_clipboard); QAction *clean_history=new QAction(tr("Clean history"), this); clean_history->setIcon(QIcon(QString( ICON_PATH )+ "/eraser.png")); connect(clean_history, SIGNAL(triggered()), this, SLOT(clean_history_callback()) ); context_menu->addAction(clean_history); connect(list, SIGNAL( customContextMenuRequested ( const QPoint & ) ), this, SLOT( contextMenu_cb( const QPoint & ) ) ); menu_bar->addMenu(context_menu); } CommandList::~CommandList() { QStringList history=model->stringList(); Projects::saveListCommandHistory(session->getProjectName(), history); } void CommandList::setLineEdit(QLineEdit *lineEdit) { this->lineEdit=lineEdit; } void CommandList::set_list(QStringList list) { //printf("[CommandList::set_list] Setting list.\n"); QStringList history; // history << project_history << list; project_history=list; history << list; int history_size=127; if(!get_config("lines_in_history").isEmpty()) { history_size=get_config("lines_in_history").toInt(); } while(history.size()>history_size) { history.removeFirst(); //project_history.removeFirst(); } model->setStringList(history); QModelIndex item=model->index(history.size()-1); this->list->scrollTo(item); } void CommandList::itemClicked (const QModelIndex & item ) { lineEdit->setText(item.data().toString()); } void CommandList::setSession(Session *session) { BaseWidget::setSession(session); setProject(session->getProjectName()); connect(session, SIGNAL(projectChanged(QString)), this, SLOT(setProject(QString))); } void CommandList::setProject(QString project) { QStringList history=Projects::listCommandHistory( project ); project_history.clear(); history.append(QDateTime::currentDateTime().toString("%% dddd MMMM d yyyy -- hh:mm:ss %%")); project_history << history; model->setStringList(history); } void CommandList::copy_clipboard_callback() { QClipboard *clipboard=QApplication::clipboard(); QString history; for(int i=0;irowCount();i++) { QModelIndex item=model->index(i); if( list->selectionModel()->isSelected(item) ) history += item.data().toString()+"\n"; } clipboard->setText(history); } void CommandList::contextMenu_cb( const QPoint & /*pos*/) { context_menu->popup(QCursor::pos () ); } void CommandList::clean_history_callback() { QStringList list; //model->setStringList(list); project_history.clear(); set_list(list); } QMenu *CommandList::get_menu() { return context_menu; } BaseWidget *CommandList::copyBaseWidget(QWidget * parent ) { CommandList *bw=new CommandList(parent); Terminal *terminal=(Terminal*)session->getFirstTool(TERMINAL); connect(terminal->getAutocomplete(), SIGNAL(new_command_entered(QStringList)), bw, SLOT(set_list(QStringList)) ); bw->setSession(session); bw->setLineEdit(terminal->getAutocomplete()); bw->set_list(terminal->getAutocomplete()->commands()); return bw; } StringListModel::StringListModel():QStringListModel() { } Qt::ItemFlags StringListModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::ItemIsEnabled; return QAbstractItemModel::flags(index); } qtoctave-0.10.1/qtoctave/src/terminal.h0000644000175000017500000000566411511434226017032 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __TERMINAL_H__ #define __TERMINAL_H__ #include #include #include #include #include #include "basewidget.h" #include "octave_connection.h" #include "dynamic_help/dynamic_help.h" #include "autocomplete.h" #include "command_list.h" /** Builds windows with QtextEdit and QLineEdit. QTextEdit shows OctaveConnection output. * QLineEdit is used to write commands. * */ class Terminal:public BaseWidget { Q_OBJECT public: Terminal( QWidget * parent = 0 ); ~Terminal(); QTextEdit *getTextEdit(); void setOctaveConnection(OctaveConnection *octave_connection); OctaveConnection *getOctaveConnection(); void command_enter(const QString &text); void setSession(Session *session); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); /**Use 'save' octave commend to save variables.*/ void saveVariables(); Autocomplete *getAutocomplete(); QMdiArea *work_space; //Session *session; private: QTextEdit *text; Autocomplete *combo_box; QPushButton *show_commands_button; OctaveConnection *octave_connection; //Formats of entries QTextCharFormat normal_format, error_format, command_format, ide_command_format; bool diary_ok; //Controls diary output QFile diary_file; //File to save diary bool show_ide_commands_ok; int lines_in_terminal; int cols_in_terminal; void remove_lines(QTextCursor &cursor); void closeEvent(QCloseEvent*); /**Regular expresions:*/ QRegExp regexp_octave_prompt; //Used in remove_lines QRegExp re; //Used in line_ready /**Init most used regular expresions*/ void init_regular_expresions(); protected: //Drag and drop void dragEnterEvent(QDragEnterEvent *event); void dropEvent ( QDropEvent * event ); public slots: void return_pressed(); void write_output(QString output); void write_error(QString error); void write_command(QString command); void write_ide_command(QString command); void completion_matches_callback(); void stop_process_callback(); void clear_callback(); void clear_command_line_first_time(); CommandList *show_commands_callback(); void textChanged(const QString &text); void setProject(QString project=QString()); void line_ready(QString line); }; #endif qtoctave-0.10.1/qtoctave/src/help.h0000644000175000017500000000302211511434226016131 0ustar lucaslucas/* Copyright (C) 2006,2007,2008 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __HELP_H__ #define __HELP_H__ #include "basewidget.h" #include #include #include #include #include #include /**Shows help in simple html. Users can do searches. */ class Help:public BaseWidget { Q_OBJECT public: Help(QWidget * parent = 0); void setSource(const QString source, QString anchor=""); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); ~Help(); private: QVBoxLayout *vlayout; QToolBar *toolbar; QTextBrowser *browser; QLineEdit *lineedit; QCheckBox *check_box; QPushButton *search_button; QString source; void create_buttons(); public slots: void back(); void forward(); void find(); void go_home(); void textChanged ( const QString & text ); }; #endif qtoctave-0.10.1/qtoctave/src/basewidget.h0000644000175000017500000000441011511434226017321 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __BASEWIDGET_H__ #define __BASEWIDGET_H__ #include #include #include #include #include #include "session.h" /** This class is base class for windows of QtOctave. */ class BaseWidget:public QMainWindow { Q_OBJECT private: QMenu *dockMenu; QVector docks; void addAllDocksTo(BaseWidget *w); public: BaseWidget(QWidget *parent=0); ~BaseWidget(); /**WidgetType of base widget. * @return Type of widget. */ WidgetType widgetType(); /**Sets session.*/ void setSession(Session *session); /**Gets session.*/ Session *getSession(); /**Gets menu of this BaseWidget.*/ virtual QMenu *get_menu(); /**Gets a copy of this BaseWidget.*/ virtual BaseWidget *copyBaseWidget( QWidget * parent = 0 )=0; /**Tool properties in xml.*/ virtual void toXML(QXmlStreamWriter &xml); void addDock(QWidget *w); QVector getDocks(); bool containsBaseWidget(BaseWidget *w); protected: WidgetType widget_type; Session *session; //void focusInEvent(QFocusEvent * event); //void focusOutEvent ( QFocusEvent * event ); public slots: void show_out_main_window_callback(); void show_in_main_window_callback(); void showDockableObjects(); void hideDockableObjects(); void dockObject(QAction *action); void dock_destroyed_cb (QObject *obj); signals: /** This signal is emited when widget is activated.*/ void widget_activated(BaseWidget *w); /**Dinamic help required.*/ void dynamic_help_required(const QString &text); }; #endif qtoctave-0.10.1/qtoctave/src/octave_connection.h0000644000175000017500000000544611511434226020715 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __OCTAVE_CONNECTION_H__ #define __OCTAVE_CONNECTION_H__ #include #include #include #include #include "config.h" /** This class build QProcess and exec Octave. Octave input and output are controlled by this class. */ class OctaveConnection : public QProcess { Q_OBJECT public: OctaveConnection(QObject * parent = 0); /** Sets octave path. * @param path path to Octave. */ void setOctavePath(const QString path); QString getOctavePath(); void startOctave(bool quiet=false); //void setTextEdit(QTextEdit *text); /** Sends command to Octave. * @param text Command to send. * @param show Shows command in Terminal or not. */ void command_enter(const QString &text, bool show=true); /**Reset number of instrucions left to send signal command_finished. */ void reset_instrutions_left() {instructions_left_no=0;}; private: int lineno, colno; /**Number of instructions left to end actual octave command.*/ int instructions_left_no; bool debugging; QString octave_path; QString line_buffer; QBuffer error_buffer; /**Load scripts from qtoctave/scripts.*/ void loadScripts(); /**Regular expresions:*/ QRegExp regexp_octave_prompt; //Used in octaveOutputSlot QRegExp regexp_octave_prompt2; //Used in octaveOutputSlot QRegExp regexp_actual_debug_line_column; //Used in octaveOutputSlot /**Init most used regular expresions*/ void init_regular_expresions(); public slots: void octaveOutputSlot(); void octaveErrorOutputSlot(); void octaveFinished(int, QProcess::ExitStatus); signals: /**Emits this signal when line is available from stderr of Octave.*/ void line_ready(QString line); void output_ready(QString output); void error_ready(QString error); void command_ready(QString command); void ide_command_ready(QString command); void debug(int lineno, int colno); void endDebug(); void clearScreen(); void command_finished(); }; /**This class is for usleep doesn't depend on OS*/ class Sleep:QThread { Q_OBJECT public: static void micro_sleep(unsigned long u_seconds); }; #endif qtoctave-0.10.1/qtoctave/cmake-modules/UseRPMTools.cmake0000644000175000017500000001344311511434226022135 0ustar lucaslucas# # - Find tools needed for building RPM Packages # on Linux systems and defines macro that helps to # build source or binary RPM, the MACRO assumes # CMake 2.4.x which includes CPack support. # CPack is used to build tar.gz source tarball # which may be used by a custom user-made spec file. # # - Define RPMTools_ADD_RPM_TARGETS which defines # two (top-level) CUSTOM targets for building # source and binary RPMs # # Those CMake macros are provided by the TSP Developer Team # https://savannah.nongnu.org/projects/tsp # IF (WIN32) MESSAGE(STATUS "RPM tools not available on Win32 systems") ENDIF(WIN32) IF (UNIX) # Look for RPM builder executable FIND_PROGRAM(RPMTools_RPMBUILD_EXECUTABLE NAMES rpmbuild PATHS "/usr/bin;/usr/lib/rpm" PATH_SUFFIXES bin DOC "The RPM builder tool") IF (RPMTools_RPMBUILD_EXECUTABLE) MESSAGE(STATUS "Looking for RPMTools... - found rpmuild is ${RPMTools_RPMBUILD_EXECUTABLE}") SET(RPMTools_RPMBUILD_FOUND "YES") GET_FILENAME_COMPONENT(RPMTools_BINARY_DIRS ${RPMTools_RPMBUILD_EXECUTABLE} PATH) ELSE (RPMTools_RPMBUILD_EXECUTABLE) SET(RPMTools_RPMBUILD_FOUND "NO") MESSAGE(STATUS "Looking for RPMTools... - rpmbuild NOT FOUND") ENDIF (RPMTools_RPMBUILD_EXECUTABLE) # Detect if CPack was included or not IF (NOT DEFINED "CPACK_PACKAGE_NAME") MESSAGE(FATAL_ERROR "CPack was not included, you should include CPack before Using RPMTools") ENDIF (NOT DEFINED "CPACK_PACKAGE_NAME") IF (RPMTools_RPMBUILD_FOUND) SET(RPMTools_FOUND TRUE) # # - first arg (ARGV0) is RPM name # - second arg (ARGV1) is the RPM spec file path [optional] # - third arg (ARGV2) is the RPM ROOT DIRECTORY used to build RPMs [optional] # MACRO(RPMTools_ADD_RPM_TARGETS RPMNAME) # # If no spec file is provided create a minimal one # IF ("${ARGV1}" STREQUAL "") SET(SPECFILE_PATH "${CMAKE_BINARY_DIR}/${RPMNAME}.spec") ELSE ("${ARGV1}" STREQUAL "") SET(SPECFILE_PATH "${ARGV1}") ENDIF("${ARGV1}" STREQUAL "") # Verify whether if RPM_ROOTDIR was provided or not IF("${ARGV2}" STREQUAL "") SET(RPM_ROOTDIR ${CMAKE_BINARY_DIR}/RPM) ELSE ("${ARGV2}" STREQUAL "") SET(RPM_ROOTDIR "${ARGV2}") ENDIF("${ARGV2}" STREQUAL "") MESSAGE(STATUS "RPMTools:: Using RPM_ROOTDIR=${RPM_ROOTDIR}") # Prepare RPM build tree FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}) FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/tmp) FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/BUILD) FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/RPMS) FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/SOURCES) FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/SPECS) FILE(MAKE_DIRECTORY ${RPM_ROOTDIR}/SRPMS) # # We check whether if the provided spec file is # to be configure or not. # IF ("${ARGV1}" STREQUAL "") SET(SPECFILE_PATH "${RPM_ROOTDIR}/SPECS/${RPMNAME}.spec") SET(SPECFILE_NAME "${RPMNAME}.spec") MESSAGE(STATUS "No Spec file given generate a minimal one --> ${RPM_ROOTDIR}/SPECS/${RPMNAME}.spec") FILE(WRITE ${RPM_ROOTDIR}/SPECS/${RPMNAME}.spec "# -*- rpm-spec -*- Summary: ${RPMNAME} Name: ${RPMNAME} Version: ${PACKAGE_VERSION} Release: 1 License: Unknown Group: Unknown Source: ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRequires: cmake %define prefix /opt/${RPMNAME}-%{version} %define rpmprefix $RPM_BUILD_ROOT%{prefix} %define srcdirname %{name}-%{version}-Source %description ${RPMNAME} : No description for now %prep %setup -q -n %{srcdirname} %build cd .. rm -rf build_tree mkdir build_tree cd build_tree cmake -DCMAKE_INSTALL_PREFIX=%{rpmprefix} ../%{srcdirname} make %install cd ../build_tree make install %clean rm -rf %{srcdirname} rm -rf build_tree %files %defattr(-,root,root,-) %dir %{prefix} %{prefix}/* %changelog * Wed Feb 28 2007 Erk Generated by CMake UseRPMTools macros" ) ELSE ("${ARGV1}" STREQUAL "") SET(SPECFILE_PATH "${ARGV1}") GET_FILENAME_COMPONENT(SPECFILE_EXT ${SPECFILE_PATH} EXT) IF ("${SPECFILE_EXT}" STREQUAL ".spec") # This is a 'ready-to-use' spec file which does not need to be CONFIGURED GET_FILENAME_COMPONENT(SPECFILE_NAME ${SPECFILE_PATH} NAME) MESSAGE(STATUS "Simple copy spec file <${SPECFILE_PATH}> --> <${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME}>") CONFIGURE_FILE( ${SPECFILE_PATH} ${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME} COPYONLY) ELSE ("${SPECFILE_EXT}" STREQUAL ".spec") # This is a to-be-configured spec file GET_FILENAME_COMPONENT(SPECFILE_NAME ${SPECFILE_PATH} NAME_WE) SET(SPECFILE_NAME "${SPECFILE_NAME}.spec") MESSAGE(STATUS "Configuring spec file <${SPECFILE_PATH}> --> <${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME}>") CONFIGURE_FILE( ${SPECFILE_PATH} ${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME} @ONLY) ENDIF ("${SPECFILE_EXT}" STREQUAL ".spec") ENDIF("${ARGV1}" STREQUAL "") ADD_CUSTOM_TARGET(${RPMNAME}_srpm COMMAND cpack -G TGZ --config CPackSourceConfig.cmake COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz ${RPM_ROOTDIR}/SOURCES COMMAND ${RPMTools_RPMBUILD_EXECUTABLE} -bs --define=\"_topdir ${RPM_ROOTDIR}\" --buildroot=${RPM_ROOTDIR}/tmp ${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME} ) ADD_CUSTOM_TARGET(${RPMNAME}_rpm COMMAND cpack -G TGZ --config CPackSourceConfig.cmake COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz ${RPM_ROOTDIR}/SOURCES COMMAND ${RPMTools_RPMBUILD_EXECUTABLE} -bb --define=\"_topdir ${RPM_ROOTDIR}\" --buildroot=${RPM_ROOTDIR}/tmp ${RPM_ROOTDIR}/SPECS/${SPECFILE_NAME} ) ENDMACRO(RPMTools_ADD_RPM_TARGETS) ELSE (RPMTools_RPMBUILD_FOUND) SET(RPMTools FALSE) ENDIF (RPMTools_RPMBUILD_FOUND) ENDIF (UNIX) qtoctave-0.10.1/easy_plot/src/input.h0000755000175000017500000000132411511434226016517 0ustar lucaslucas#ifndef __INPUT_H__ #define __INPUT_H__ #include #include #include "gnuplot_connection.h" /**Thread to read data from input.*/ class InputThread:public QThread { Q_OBJECT enum State {NONE, SET, PLOT} state; void parse_plot(QByteArray line); void parse_set(QByteArray line); void parse_input(QByteArray line); QRegExp re_number, re_plot_set_output, re_plot_set_term, re_plot_set_X11, re_plot_set_X11_title; GnuplotConnection *gnuplot; void write_to_gnuplot(QByteArray command); public: InputThread(); void run(); void setGnuplotConnection(GnuplotConnection *gnuplot); signals: void x11WindowTitle(QString title); void write_to_gnuplot_signal(QByteArray command); }; #endif qtoctave-0.10.1/easy_plot/src/input.cpp0000755000175000017500000000557411511434226017065 0ustar lucaslucas#include "input.h" #include InputThread::InputThread():QThread() { state=NONE; re_number.setPattern("((([+-])?(((\\d)+(\\.(\\d)+)?)|\\.(\\d)+)([Ee]([+-])?(\\d)+)?)[ \\t]*)+"); re_plot_set_X11.setPattern("set term[inal]* [xX][1]*.*"); re_plot_set_X11_title.setPattern("title \"(.*)\""); re_plot_set_term.setPattern("set term[inal]*.*"); re_plot_set_output.setPattern("set output"); } void InputThread::setGnuplotConnection(GnuplotConnection *gnuplot) { this->gnuplot=gnuplot; connect(this, SIGNAL(write_to_gnuplot_signal(QByteArray)), gnuplot, SLOT(write_command(QByteArray)) ); } void InputThread::run() { FILE *in=stdin; char ch='\0'; QByteArray line; do { line.clear(); while(!feof(in) && (ch=fgetc(in))!='\n' ) { line.append(ch); } //line=line.trimmed(); while ( line.endsWith("\\") ) { line.append('\n'); while(!feof(in) && (ch=fgetc(in))!='\n' ) { line.append(ch); } } //fprintf(stderr,">%s<\n", line.data()); parse_input(line); } while (!feof(in)); } void InputThread::parse_input(QByteArray line) { switch(state) { case NONE: if(line.startsWith("pl") || line.startsWith("spl") || line.startsWith("repl") ) parse_plot(line); else if(line.startsWith("set")) parse_set(line); else write_to_gnuplot(line+"\n"); break; case PLOT: if( re_number.exactMatch(line) || line.isEmpty() || line=="e" ) { gnuplot->add_data(line); write_to_gnuplot(line+"\n"); //fprintf(stderr,"Dato aceptado\n"); } else { state=NONE; //write_to_gnuplot("set output\n"); //fprintf(stderr,"Se envía el set output\n"); parse_input(line); //fprintf(stderr, "No reconocido %s\n", line.toLocal8Bit().data() ); } break; case SET: if(line.startsWith("set")) parse_set(line); default: write_to_gnuplot(line+"\n"); } } void InputThread::parse_plot(QByteArray line) { state=PLOT; QByteArray command; command+="set output\n"+gnuplot->svgTerminal()+"\n"+line+";set output\n"; //gnuplot->data.clear(); gnuplot->data_clear(); write_to_gnuplot(command); //fprintf(stderr,"dibujo: %s\n", command.data()); } void InputThread::parse_set(QByteArray line) { QByteArray command; if( re_plot_set_X11.exactMatch(line) ) { state=NONE; command+=gnuplot->svgTerminal()+"\n"; //printf("Salida svg\n"); int pos=re_plot_set_X11_title.indexIn(line); if (pos > -1) { QString title = re_plot_set_X11_title.cap(1); emit x11WindowTitle(title); } //else //{ //fprintf(stderr,"Título no encontrado\n"); //} } else if( re_plot_set_output.exactMatch(line) ) { state=NONE; command+=line; } else if( re_plot_set_term.exactMatch(line) ) { state=SET; command=line+"\n"; } else { command=line+"\n"; } write_to_gnuplot(command); //printf("Comando ejecutado\n"); } void InputThread::write_to_gnuplot(QByteArray command) { emit write_to_gnuplot_signal(command); } qtoctave-0.10.1/easy_plot/src/main.cpp0000755000175000017500000000174111511434226016642 0ustar lucaslucas#include #include "gnuplot_connection.h" #include "main_window.h" #include "input.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setQuitOnLastWindowClosed(false); GnuplotConnection gnuplot; { QStringList arguments; for(int i=1;i #include #include #include "ui_design_main_window.h" #include "gnuplot_connection.h" #include "ui_view_angle.h" using namespace Ui; class MainWindow: public QMainWindow { Q_OBJECT QSvgWidget svg; Ui_DesignMainWindow ui; QWidget *view_angle; Ui_ViewAngle *view_angle_ui; void make_connections(); public: MainWindow( QWidget * parent = 0, Qt::WindowFlags flags = 0); GnuplotConnection *gnuplot; public slots: void plot(QByteArray svg_contents); void title_font_cb(); void labels_font_cb(); void tics_font_cb(); void legend_font_cb(); void actionExport_to_callback(); void x11WindowTitle(QString title); void set_title_cb(); void set_x_label_cb(); void set_y_label_cb(); void set_z_label_cb(); void set_x_grid_cb(bool ok); void set_y_grid_cb(bool ok); void set_z_grid_cb(bool ok); void set_x2_grid_cb(bool ok); void set_y2_grid_cb(bool ok); void set_view_angle_cb(); void set_x_angle_cb(int angle); void set_z_angle_cb(int angle); void print_cb(); }; #endif qtoctave-0.10.1/easy_plot/src/view_angle.ui0000755000175000017500000000446411511434226017676 0ustar lucaslucas ViewAngle 0 0 400 144 View Angle 180 60 false Qt::Horizontal 360 30 false Qt::Horizontal 60 30 Qt::Horizontal 40 20 Ok Qt::Vertical 20 40 qtoctave-0.10.1/easy_plot/src/easy_plot.pro0000755000175000017500000000077511511434226017741 0ustar lucaslucas###################################################################### # Automatically generated by qmake (2.01a) sb ene 19 01:05:46 2008 ###################################################################### TEMPLATE = app TARGET = easy_plot DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += gnuplot_connection.h input.h main_window.h FORMS += design_main_window.ui export_to_dialog.ui view_angle.ui SOURCES += gnuplot_connection.cpp input.cpp main.cpp main_window.cpp CONFIG += qt thread QT += svg xml qtoctave-0.10.1/easy_plot/src/main_window.cpp0000755000175000017500000002351611511434226020235 0ustar lucaslucas#include "main_window.h" #include #include #include MainWindow::MainWindow( QWidget * parent, Qt::WindowFlags flags):QMainWindow(parent,flags) { ui.setupUi(this); setCentralWidget(&svg); svg.show(); view_angle=NULL; view_angle_ui=NULL; make_connections(); } void MainWindow::make_connections() { connect(ui.actionTitle, SIGNAL( triggered()), this, SLOT( title_font_cb()) ); connect(ui.actionLabels, SIGNAL( triggered()), this, SLOT( labels_font_cb()) ); connect(ui.actionTics, SIGNAL( triggered()), this, SLOT( tics_font_cb()) ); connect(ui.actionLegend, SIGNAL( triggered()), this, SLOT( legend_font_cb()) ); connect(ui.actionExport_to, SIGNAL( triggered()), this, SLOT( actionExport_to_callback()) ); connect(ui.actionSet_title, SIGNAL( triggered()), this, SLOT( set_title_cb()) ); connect(ui.actionX_label, SIGNAL( triggered()), this, SLOT( set_x_label_cb()) ); connect(ui.actionY_label, SIGNAL( triggered()), this, SLOT( set_y_label_cb()) ); connect(ui.actionZ_label, SIGNAL( triggered()), this, SLOT( set_z_label_cb()) ); connect(ui.actionX_grid, SIGNAL( triggered(bool)), this, SLOT( set_x_grid_cb(bool)) ); connect(ui.actionY_grid, SIGNAL( triggered(bool)), this, SLOT( set_y_grid_cb(bool)) ); connect(ui.actionZ_grid, SIGNAL( triggered(bool)), this, SLOT( set_z_grid_cb(bool)) ); connect(ui.actionX2_grid, SIGNAL( triggered(bool)), this, SLOT( set_x2_grid_cb(bool)) ); connect(ui.actionY2_grid, SIGNAL( triggered(bool)), this, SLOT( set_y2_grid_cb(bool)) ); connect(ui.actionView_Angle, SIGNAL( triggered()), this, SLOT( set_view_angle_cb()) ); connect(ui.actionPrint, SIGNAL( triggered()), this, SLOT( print_cb()) ); } void MainWindow::plot(QByteArray svg_contents) { svg.load(svg_contents); show() ; } void MainWindow::legend_font_cb() { bool ok; QFont font = QFontDialog::getFont(&ok, QFont("Helvetica [Cronyx]", 10), this); if (ok) { gnuplot->setFont(font.family(), font.pointSize()); gnuplot->write((gnuplot->svgTerminal()+"\n")); gnuplot->replot(); } } void MainWindow::tics_font_cb() { bool ok; QFont font = QFontDialog::getFont(&ok, QFont("Helvetica [Cronyx]", 10), this); if (ok) { QByteArray command="set xtics font \""+font.family().toLocal8Bit()+","+QByteArray::number(font.pointSize())+"\"\n"; command+="set ytics font \""+font.family().toLocal8Bit()+","+QByteArray::number(font.pointSize())+"\"\n"; command+="set ztics font \""+font.family().toLocal8Bit()+","+QByteArray::number(font.pointSize())+"\"\n"; gnuplot->write(command); gnuplot->replot(); } } void MainWindow::labels_font_cb() { bool ok; QFont font = QFontDialog::getFont(&ok, QFont("Helvetica [Cronyx]", 10), this); if (ok) { QByteArray command="set xlabel font \""+font.family().toLocal8Bit()+","+QByteArray::number(font.pointSize())+"\"\n"; command+="set ylabel font \""+font.family().toLocal8Bit()+","+QByteArray::number(font.pointSize())+"\"\n"; command+="set zlabel font \""+font.family().toLocal8Bit()+","+QByteArray::number(font.pointSize())+"\"\n"; gnuplot->write(command); gnuplot->replot(); } } void MainWindow::title_font_cb() { bool ok; QFont font = QFontDialog::getFont(&ok, QFont("Helvetica [Cronyx]", 10), this); if (ok) { QByteArray command="set title font \""+font.family().toLocal8Bit()+","+QByteArray::number(font.pointSize())+"\"\n"; //printf("%s\n", command.toLocal8Bit().data()); gnuplot->write(command); gnuplot->replot(); } } void MainWindow::x11WindowTitle(QString title) { setWindowTitle(title); } void MainWindow::set_title_cb() { bool ok; QString text = QInputDialog::getText(this, tr("Set title"), tr("Title:"), QLineEdit::Normal, QString(), &ok); if (ok) { QByteArray command="set title \""+text.toLocal8Bit()+"\"\n"; gnuplot->write(command); gnuplot->replot(); } } void MainWindow::set_x_label_cb() { bool ok; QString text = QInputDialog::getText(this, tr("Set x label"), tr("x label:"), QLineEdit::Normal, QString(), &ok); if (ok) { QByteArray command="set xlabel \""+text.toLocal8Bit()+"\"\n"; gnuplot->write(command); gnuplot->replot(); } } void MainWindow::set_y_label_cb() { bool ok; QString text = QInputDialog::getText(this, tr("Set y label"), tr("y label:"), QLineEdit::Normal, QString(), &ok); if (ok) { QByteArray command="set ylabel \""+text.toLocal8Bit()+"\"\n"; gnuplot->write(command); gnuplot->replot(); } } void MainWindow::set_z_label_cb() { bool ok; QString text = QInputDialog::getText(this, tr("Set z label"), tr("z label:"), QLineEdit::Normal, QString(), &ok); if (ok) { QByteArray command="set zlabel \""+text.toLocal8Bit()+"\"\n"; gnuplot->write(command); gnuplot->replot(); } } void MainWindow::set_x_grid_cb(bool ok) { QByteArray command; if(ok) command="set grid xtics\n"; else command="set grid noxtics\n"; gnuplot->write(command); gnuplot->replot(); } void MainWindow::set_y_grid_cb(bool ok) { QByteArray command; if(ok) command="set grid ytics\n"; else command="set grid noytics\n"; gnuplot->write(command); gnuplot->replot(); } void MainWindow::set_z_grid_cb(bool ok) { QByteArray command; if(ok) command="set grid ztics\n"; else command="set grid noztics\n"; gnuplot->write(command); gnuplot->replot(); } void MainWindow::set_x2_grid_cb(bool ok) { QByteArray command; if(ok) command="set grid x2tics\n"; else command="set grid nox2tics\n"; gnuplot->write(command); gnuplot->replot(); } void MainWindow::set_y2_grid_cb(bool ok) { QByteArray command; if(ok) command="set grid y2tics\n"; else command="set grid noy2tics\n"; gnuplot->write(command); gnuplot->replot(); } void MainWindow::set_view_angle_cb() { if(view_angle==NULL) { view_angle_ui=new Ui_ViewAngle(); view_angle=new QWidget(); view_angle_ui->setupUi(view_angle); connect(view_angle_ui->ok_pushButton, SIGNAL(clicked()), view_angle, SLOT(close()) ); connect(view_angle_ui->x_angle_horizontalSlider, SIGNAL(valueChanged ( int )), this, SLOT(set_x_angle_cb(int))); connect(view_angle_ui->z_angle_horizontalSlider, SIGNAL(valueChanged ( int )), this, SLOT(set_z_angle_cb(int))); } view_angle->show(); } void MainWindow::set_x_angle_cb(int angle) { view_angle_ui->x_angle_label->setText(QString::number(angle)); QByteArray command= "set view " +QByteArray::number(view_angle_ui->x_angle_horizontalSlider->value())+ ", " +QByteArray::number(view_angle_ui->z_angle_horizontalSlider->value())+ "\n"; gnuplot->write(command); gnuplot->replot(); } void MainWindow::set_z_angle_cb(int angle) { view_angle_ui->z_angle_label->setText(QString::number(angle)); QByteArray command= "set view " +QByteArray::number(view_angle_ui->x_angle_horizontalSlider->value())+ ", " +QByteArray::number(view_angle_ui->z_angle_horizontalSlider->value())+ "\n"; gnuplot->write(command); gnuplot->replot(); } #include "ui_export_to_dialog.h" enum ExportFormat {PIXMAP, PICTURE, PRINTER, PDF, SVG}; void MainWindow::actionExport_to_callback() { QDialog dialog; ExportToDialog export_to_dialog; export_to_dialog.setupUi(&dialog); QListWidget *list = export_to_dialog.formats_listWidget; QListWidgetItem *item; //Pixmaps formats QList formats=QImageWriter::supportedImageFormats(); for(int i=0;isetData(1,QVariant(PIXMAP)); } //Vector formats formats= QPicture::outputFormats(); for(int i=0;isetData(1,QVariant(PICTURE)); } item=new QListWidgetItem("ps",list); item->setData(1,QVariant(PRINTER)); item=new QListWidgetItem("pdf",list); item->setData(1,QVariant(PDF)); item=new QListWidgetItem("svg",list); item->setData(1,QVariant(SVG)); int ok=dialog.exec(); if(ok==QDialog::Rejected) return; item =list->currentItem(); int format=item->data(1).toInt(); QPainter plot; switch(format) { case PIXMAP: { bool ok; int h, w = QInputDialog::getInteger(this, tr("Width"), tr("Width:"), 300, 0, 2147483647, 1, &ok); if(!ok) return; h=QInputDialog::getInteger(this, tr("Height"), tr("Height:"), 200, 0, 2147483647, 1, &ok); if(!ok) return; QString s = QFileDialog::getSaveFileName(this, "Choose a filename to save"); if(s.isEmpty()) return; QImage image(w,h,QImage::Format_RGB32); plot.begin(&image); svg. renderer()->render(&plot); plot.end(); image.save(s,item->data(0).toString().toLocal8Bit().data()); } break; case PICTURE: { bool ok; int h, w = QInputDialog::getInteger(this, tr("Width"), tr("Width:"), 300, 0, 2147483647, 1, &ok); if(!ok) return; h=QInputDialog::getInteger(this, tr("Height"), tr("Height:"), 200, 0, 2147483647, 1, &ok); if(!ok) return; QString s = QFileDialog::getSaveFileName(this, "Choose a filename to save"); if(s.isEmpty()) return; QPicture image; const QRect r(0,0,w,h); image.setBoundingRect(r); plot.begin(&image); svg. renderer()->render(&plot); plot.end(); image.save(s,item->data(0).toString().toLocal8Bit().data()); } break; case PRINTER: { QPrinter p; QPrintDialog printDialog(&p, this); if (printDialog.exec() != QDialog::Accepted) return; plot.begin(&p); svg. renderer()->render(&plot); plot.end(); } break; case PDF: { QPrinter p; QPrintDialog printDialog(&p, this); p.setOutputFormat(QPrinter::PdfFormat); if (printDialog.exec() != QDialog::Accepted) return; plot.begin(&p); svg. renderer()->render(&plot); plot.end(); } break; case SVG: { QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("*.svg")); QSvgGenerator p; p.setFileName(fileName); plot.begin(&p); svg. renderer()->render(&plot); plot.end(); } } } void MainWindow::print_cb() { QPainter plot; QPrinter p; QPrintDialog printDialog(&p, this); if (printDialog.exec() != QDialog::Accepted) return; plot.begin(&p); svg. renderer()->render(&plot); plot.end(); } qtoctave-0.10.1/easy_plot/src/clean.sh0000755000175000017500000000015611511434226016627 0ustar lucaslucasrm -Rf CMakeFiles/ rm -f CMakeCache.txt rm -f cmake_install.cmake install_manifest.txt rm -f Makefile rm -f *~qtoctave-0.10.1/easy_plot/src/CMakeLists.txt0000755000175000017500000000315311511434226017751 0ustar lucaslucasFIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") SET(QT_USE_QTSVG 1) SET(QT_USE_QTXML 1) include(UseQt4) include_directories(${QT_INCLUDE_DIR}) include_directories(${QT_QT_INCLUDE_DIR}) include_directories(${QT_QTCORE_INCLUDE_DIR}) include_directories(${QT_QTGUI_INCLUDE_DIR}) include_directories(${QT_QTXML_INCLUDE_DIR}) include_directories(${QT_QTSVG_INCLUDE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) QT4_WRAP_UI(ui_design_main_window.h design_main_window.ui) QT4_WRAP_UI(ui_export_to_dialog.h export_to_dialog.ui) QT4_WRAP_UI(ui_view_angle.h view_angle.ui) #QT4_GENERATE_MOC(gnuplot_connection.h gnuplot_connection.moc) #QT4_GENERATE_MOC(input.h input.moc) #QT4_GENERATE_MOC(main_window.h main_window.moc) QT4_WRAP_CPP(moc_gnuplot_connection gnuplot_connection.h) QT4_WRAP_CPP(moc_input input.h) QT4_WRAP_CPP(moc_main_window main_window.h) #QT4_AUTOMOC(gnuplot_connection.cpp gnuplot_connection.h input.cpp input.h main.cpp main_window.cpp main_window.h) #ADD_DEFINITIONS(-D_REENTRANT) add_executable(easy_plot gnuplot_connection.cpp gnuplot_connection.h input.cpp input.h main.cpp main_window.cpp main_window.h ui_view_angle.h ui_export_to_dialog.h ui_design_main_window.h moc_gnuplot_connection.cxx moc_input.cxx moc_main_window.cxx ) TARGET_LINK_LIBRARIES(easy_plot ${Qt4_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTSQL_LIBRARY} ${QT_QTSVG_LIBRARY}) SET_TARGET_PROPERTIES(easy_plot PROPERTIES INSTALL_RPATH ":usr/lib" BUILD_WITH_INSTALL_RPATH true INSTALL_RPATH_USE_LINK_PATH true ) install ( TARGETS easy_plot RUNTIME DESTINATION bin ) qtoctave-0.10.1/easy_plot/src/gnuplot_connection.h0000755000175000017500000000140411511434226021266 0ustar lucaslucas#ifndef __GNUPLOT_CONNECTION__ #define __GNUPLOT_CONNECTION__ #include #include /** Connection with Gnuplot. */ class GnuplotConnection:public QProcess { Q_OBJECT QString svg_contents; enum State {NONE, SVG} parse_state; QByteArray svg_terminal; public: GnuplotConnection(QObject *parent=0); //void write( QByteArray text); void replot(); void setFont(QString name, int size); QByteArray data; QMutex data_mutex; inline QByteArray svgTerminal() {return svg_terminal;} public slots: void standardOutputReady(); void gnuplotFinished(int exitCode, QProcess::ExitStatus exitStatus ); void write_command(QByteArray command); void data_clear(); void add_data(QByteArray line); signals: void plot(QByteArray svg_contents); }; #endif qtoctave-0.10.1/easy_plot/src/gnuplot_connection.cpp0000755000175000017500000001127211511434226021625 0ustar lucaslucas#include "gnuplot_connection.h" #include #include #include #include GnuplotConnection::GnuplotConnection(QObject *parent):QProcess(parent) { parse_state=NONE; svg_terminal="set term svg dynamic"; connect(this, SIGNAL(readyReadStandardOutput()), this, SLOT(standardOutputReady()) ); connect(this, SIGNAL(finished(int, QProcess::ExitStatus )), this, SLOT(gnuplotFinished(int, QProcess::ExitStatus )) ); } struct References { QHash attrs; QString name; }; QHash attributes2Hash(QXmlStreamAttributes attrs) { QHash at; foreach(QXmlStreamAttribute attr, attrs) { at[attr.qualifiedName().toString()]=attr.value().toString(); } return at; } static QString xml_replace_links(const QString &xml_input) { QXmlStreamReader xml(xml_input); QString out; QXmlStreamWriter xml_out(&out); xml_out.setAutoFormatting(true); QHash refs; while (!xml.atEnd()) { xml.readNext(); if(xml.isStartDocument()) { xml_out.writeStartDocument(); xml_out.writeComment("DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20001102//EN\" \"svg-20001102.dtd\""); } else if( xml.isStartElement() ) { if( xml.name()=="text" ) { QString text=xml.readElementText(); xml_out.writeTextElement(xml.name().toString(),text); } else if( xml.name()!="use" ) { xml_out.writeStartElement(xml.name().toString()); QXmlStreamAttributes attrs=xml.attributes(); xml_out.writeAttributes(attrs); if(!attrs.value("id").isEmpty()) { References ref; ref.attrs=attributes2Hash(attrs); ref.name=xml.name().toString(); refs["#"+attrs.value("id").toString()]=ref; } } else { QXmlStreamAttributes attrs=xml.attributes(); QHash ref_attrs=refs[attrs.value("xlink:href").toString()].attrs; QXmlStreamAttributes attrs2; //printf("Encontrado %s\n", attrs.value("xlink:href").toString().toLocal8Bit().data()); foreach(QXmlStreamAttribute attr, attrs) { QString name=attr.qualifiedName().toString(); if(name=="id") ref_attrs[name]=attr.value().toString(); else if( name!="xlink:href" && name!="id") { ref_attrs[name]+=" "+attr.value().toString(); } } foreach(QString key, ref_attrs.keys()) { attrs2.append(key, ref_attrs[key]); } xml_out.writeStartElement(refs[attrs.value("xlink:href").toString()].name); xml_out.writeAttributes(attrs2); if(!attrs.value("id").isEmpty()) { References ref; ref.attrs=attributes2Hash(attrs2); ref.name=refs[attrs.value("xlink:href").toString()].name; refs["#"+attrs.value("id").toString()]=ref; } } } else if(xml.isEndElement()) { //printf("Texto >%s<\n", text.toLocal8Bit().data()); //if(!text.isEmpty()) xml_out.writeCharacters(text); xml_out.writeEndElement(); } else if(xml.isEndDocument()) { xml_out.writeEndDocument(); } } return out; } void GnuplotConnection::standardOutputReady() { QString buffer( readAllStandardOutput() ); QStringList lines=buffer.split("\n"); buffer.clear(); foreach(QString line, lines) { line=line.trimmed(); //fprintf(stderr, "%s\n", line.toLocal8Bit().data()); if(parse_state==NONE && line.startsWith("> easy_plot.pro echo "QT += svg xml" >> easy_plot.pro qmake #make qtoctave-0.10.1/easy_plot/src/design_main_window.ui0000755000175000017500000001044311511434226021414 0ustar lucaslucas DesignMainWindow 0 0 518 421 EasyPlot 0 0 518 29 File Fonts Labels Grid 3D Export to... Title Labels Tics Legend Set title x label y label z label true x grid true y grid true z grid true y2 grid true x2 grid View Angle Print qtoctave-0.10.1/easy_plot/src/export_to_dialog.ui0000755000175000017500000000457711511434226021125 0ustar lucaslucas ExportToDialog 0 0 289 300 Export to... 9 6 Select format: 0 6 Qt::Horizontal 131 31 OK Cancel okButton clicked() ExportToDialog accept() 278 253 96 254 cancelButton clicked() ExportToDialog reject() 369 253 179 282 qtoctave-0.10.1/simple_rcs/src/rcsinterfacetardiff.h0000644000175000017500000000115611511434226021531 0ustar lucaslucas#ifndef __RCSINTERFACETARDIFF_H__ #define __RCSINTERFACETARDIFF_H__ #include "rcsinterface.h" class RcsInterfaceTarDiff:public RcsInterface { public: bool add(QString file); bool extract(QString file, QString version); QString properties(QString version); QString diff(QString version1, QString version2); QStringList versions(); bool setComment(QString version, QString comment); QHash getComment(); private: QHash readCommentsFromPropertiesFile(QString file); void writeCommentsToPropertiesFile(QString file, QHash list); }; #endif qtoctave-0.10.1/simple_rcs/src/main.h0000644000175000017500000000255511511434226016451 0ustar lucaslucas#ifndef __MAIN_H__ #define __MAIN_H__ #include #include #include "ui_main_window.h" #include "rcsinterface.h" #include "rcsinterfacetardiff.h" #include using namespace Ui; class ListModel; class Main:public QMainWindow { Q_OBJECT MainWindow ui; //QStringListModel *versions_list_model; ListModel *versions_list_model; QString version1, version2; RcsInterface *rcsinterface; QString repository; QString file; public: Main(QWidget *parent = 0); void setRepository(QString repository); void setFile(QString file); void loadVersions(); public slots: void activated_version1 ( const QModelIndex & index ); void activated_version2 ( const QModelIndex & index ); void extract_callback(); void help_callback(); void add_comment_callback(); }; class ListModel : public QAbstractListModel { Q_OBJECT public: ListModel(QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; int columnCount ( const QModelIndex & parent = QModelIndex() ) const; void setVersions(QStringList versions); void setComments(QHash comments); private: QStringList versions; QHash comments; }; #endif qtoctave-0.10.1/simple_rcs/src/rcsinterface.h0000644000175000017500000000161011511434226020164 0ustar lucaslucas#ifndef __RCSINTERFACE_H__ #define __RCSINTERFACE_H__ #include #include class RcsInterface { protected: QString repository; public: /**Add new version of file to repository. */ virtual bool add(QString file)=0; /**Extract file from repository. */ virtual bool extract(QString file, QString version)=0; /**Properties of version. */ virtual QString properties(QString version)=0; /**Diferences between versions. */ virtual QString diff(QString version1, QString version2)=0; /**List of versions in repository. */ virtual QStringList versions()=0; /**Set comment of version. * @return true if action could be possible. */ virtual bool setComment(QString version, QString comment)=0; /**Get comment of version. */ virtual QHash getComment()=0; inline void setRepository(QString repo) {repository=repo;}; }; #endif qtoctave-0.10.1/simple_rcs/src/extract_dialog.ui0000644000175000017500000000373011511434226020700 0ustar lucaslucas UiExtractDialog 0 0 400 300 Extract Version Path: Select... Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() UiExtractDialog accept() 248 254 157 274 buttonBox rejected() UiExtractDialog reject() 316 260 286 274 qtoctave-0.10.1/simple_rcs/src/add_comment_dialog.cpp0000644000175000017500000000111011511434226021633 0ustar lucaslucas#include "add_comment_dialog.h" #include #include AddCommentDialog::AddCommentDialog(QWidget *parent):QDialog(parent) { ui.setupUi(this); ui.list->header()->setResizeMode(QHeaderView::ResizeToContents); connect(ui.list, SIGNAL(clicked( const QModelIndex & )), this, SLOT(activated_version( const QModelIndex &) ) ); } void AddCommentDialog::setModel(QAbstractListModel *model) { ui.list->setModel(model); } void AddCommentDialog::activated_version( const QModelIndex & index ) { version=index.model()->index(index.row(),0).data().toString(); } qtoctave-0.10.1/simple_rcs/src/extract_dialog.cpp0000644000175000017500000000153111511434226021042 0ustar lucaslucas#include "extract_dialog.h" #include #include ExtractDialog::ExtractDialog(QWidget *parent):QDialog(parent) { ui.setupUi(this); ui.list->header()->setResizeMode(QHeaderView::ResizeToContents); connect(ui.select_pushButton, SIGNAL(clicked()), this, SLOT(select_callback()) ); connect(ui.list, SIGNAL(clicked( const QModelIndex & )), this, SLOT(activated_version( const QModelIndex &) ) ); } void ExtractDialog::select_callback() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),ui.lineEdit->text()); if(fileName.isEmpty()) return; ui.lineEdit->setText(fileName); } void ExtractDialog::setModel(QAbstractListModel *model) { ui.list->setModel(model); } void ExtractDialog::activated_version( const QModelIndex & index ) { version=index.model()->index(index.row(),0).data().toString(); } qtoctave-0.10.1/simple_rcs/src/main_window.ui0000644000175000017500000000570711511434226020230 0ustar lucaslucas MainWindow 0 0 505 534 SimpleRcs 0 27 505 487 Select versions: Qt::Vertical Qt::Horizontal 0 0 Close 0 0 505 27 File Help 0 514 505 20 Extract Exit Help Add coment qtoctave-0.10.1/simple_rcs/src/add_comment_dialog.h0000644000175000017500000000100011511434226021276 0ustar lucaslucas#ifndef __ADDCOMMENTDIALOG_H__ #define __ADDCOMMENTDIALOG_H__ #include #include "ui_add_comment.h" using namespace Ui; class AddCommentDialog:public QDialog { Q_OBJECT UiAddCommentDialog ui; QString version; public: AddCommentDialog(QWidget *parent = 0); void setModel(QAbstractListModel *model); public slots: void activated_version( const QModelIndex & index ); inline QString getVersion() {return version;} inline QString getComment() {return ui.lineEdit->text();} }; #endif qtoctave-0.10.1/simple_rcs/src/main.cpp0000644000175000017500000001144711511434226017004 0ustar lucaslucas#include "main.h" #include #include "extract_dialog.h" #include "ui_help_dialog.h" #include "add_comment_dialog.h" #include Main::Main(QWidget *parent): QMainWindow(parent) { ui.setupUi(this); versions_list_model = new ListModel(); ui.versions1->setModel(versions_list_model); ui.versions2->setModel(versions_list_model); ui.versions1->header()->setResizeMode(QHeaderView::ResizeToContents); ui.versions2->header()->setResizeMode(QHeaderView::ResizeToContents); connect(ui.versions1 , SIGNAL(clicked( const QModelIndex & )), this, SLOT(activated_version1 ( const QModelIndex &) ) ); connect(ui.versions2, SIGNAL(clicked( const QModelIndex & )), this, SLOT(activated_version2 ( const QModelIndex &) ) ); connect(ui.actionExtract, SIGNAL(triggered ()), this, SLOT(extract_callback()) ); connect(ui.actionHelp, SIGNAL(triggered ()), this, SLOT(help_callback()) ); connect(ui.actionExit, SIGNAL(triggered ()), this, SLOT(close()) ); connect(ui.actionAdd_coment, SIGNAL(triggered ()), this, SLOT(add_comment_callback()) ); connect(ui.close_pushButton, SIGNAL(clicked()), this, SLOT(close())); ui.close_pushButton->setFocus(Qt::ActiveWindowFocusReason); rcsinterface=new RcsInterfaceTarDiff; } void Main::setRepository(QString repository) { this->repository=repository; rcsinterface->setRepository(repository); QFileInfo repository_file(repository); setWindowTitle("SimpleRcs ["+repository_file.fileName()+"]"); } void Main::setFile(QString file) { if(!file.isEmpty()) { this->file=file; rcsinterface->add(file); } } void Main::loadVersions() { QStringList list=rcsinterface->versions(); for(int i=0;i<(list.size()/2);i++) { QString aux=list[i]; list[i]=list[list.size()-i-1]; list[list.size()-i-1]=aux; } QHash comments=rcsinterface->getComment(); versions_list_model->setVersions(list); versions_list_model->setComments(comments); int i=0; if(idiff(version1, version2); ui.textBrowser->setHtml(result); } } } void Main::activated_version1 ( const QModelIndex & index ) { printf("Activado\n"); version1=index.model()->index(index.row(),0).data().toString(); if(version2.isEmpty()) return; QString result=rcsinterface->diff(version1, version2); ui.textBrowser->setHtml(result); } void Main::activated_version2 ( const QModelIndex & index ) { version2=index.model()->index(index.row(),0).data().toString(); if(version1.isEmpty()) return; QString result=rcsinterface->diff(version1, version2); ui.textBrowser->setHtml(result); } void Main::extract_callback() { ExtractDialog dialog(this); dialog.setModel(versions_list_model); if(QDialog::Accepted!=dialog.exec()) return; QString version=dialog.getVersion(); QString path=dialog.getPath(); if( version.isEmpty() || path.isEmpty() ) return; rcsinterface->extract(path, version); } void Main::help_callback() { QDialog dialog(this); HelpDialog ui; ui.setupUi(&dialog); dialog.exec(); } void Main::add_comment_callback() { AddCommentDialog dialog(this); dialog.setModel(versions_list_model); if(QDialog::Accepted!=dialog.exec()) return; QString version=dialog.getVersion(); QString comment=dialog.getComment(); if( version.isEmpty() ) return; rcsinterface->setComment(version, comment); loadVersions(); } ListModel::ListModel(QObject *parent):QAbstractListModel(parent) { } int ListModel::rowCount(const QModelIndex &/*parent*/) const { return versions.count(); } QVariant ListModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (index.row() >= versions.size()) return QVariant(); if (role == Qt::DisplayRole) { if(index.column()==0) return versions.at(index.row()); else return comments[versions.at(index.row())]; } else return QVariant(); } QVariant ListModel::headerData(int section, Qt::Orientation orientation, int role ) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { if(section==0) return QString("Version"); else return QString("Comment"); } return QString("%1").arg(section); } int ListModel::columnCount ( const QModelIndex & /*parent*/ ) const { return 2; } void ListModel::setVersions(QStringList versions) { this->versions=versions; } void ListModel::setComments(QHash comments) { this->comments=comments; } int main(int argn, char* argv[]) { QString repository; QString file; if(argn>1) repository=argv[1]; if(argn>2) file=argv[2]; QApplication application(argn, argv); Main app; app.setRepository(repository); app.setFile(file); if(file.isEmpty()) { app.loadVersions(); app.show(); return application.exec(); } return 0; } qtoctave-0.10.1/simple_rcs/src/help_dialog.ui0000644000175000017500000001774211511434226020166 0ustar lucaslucas HelpDialog 0 0 527 300 Help <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">SimpleRcs.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool is a simple Revision Control System.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SimpleRcs is a version control system, which allows you to keep old versions of files (usually source code), keep a log of when, and why changes occurred, etc., like Subversion, CVS, RCS or SCCS. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SimpleRcs keeps a copy of the master source. This copy is called the source ‘‘repository''; it contains all the information to permit extracting previous versions of these file at any time.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SimpleRcs lets you:</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Saves different versions of your files.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Compare them.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Extract some version.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Add comments to your versions.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Command line.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To add file to repository:</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier';">simplercs repository_name file</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It will add your file to repository and it will open this application.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you don't write file:</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier';">simplercs repository_name</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It will open main window.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">About.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier';">Copyright (C) 2008 P.L. Lucas<br /><br />This program is free software; you can redistribute it and/or modify<br />it under the terms of the GNU General Public License as published by<br />the Free Software Foundation; either version 2 of the License, or<br />(at your option) any later version.<br /><br />This program is distributed in the hope that it will be useful,<br />but WITHOUT ANY WARRANTY; without even the implied warranty of<br />MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br />GNU General Public License for more details.<br /><br />You should have received a copy of the GNU General Public License<br />along with this program; if not, write to the Free Software<br />Foundation, Inc., 59 Temple Place, Suite 330, <br />Boston, MA 02111-1307, USA. <br /></span></p></body></html> Qt::Horizontal QDialogButtonBox::Ok buttonBox accepted() HelpDialog accept() 248 254 157 274 buttonBox rejected() HelpDialog reject() 316 260 286 274 qtoctave-0.10.1/simple_rcs/src/CMakeLists.txt0000755000175000017500000000205711511434226020114 0ustar lucaslucasFIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") SET(QT_USE_QTXML 1) include(UseQt4) include_directories(${QT_INCLUDE_DIR}) include_directories(${QT_QT_INCLUDE_DIR}) include_directories(${QT_QTCORE_INCLUDE_DIR}) include_directories(${QT_QTGUI_INCLUDE_DIR}) #include_directories(${QT_QTXML_INCLUDE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) #include_directories(${QT_QTSVG_INCLUDE_DIR}) FILE(GLOB_RECURSE src_moc_headers *.h ) FILE(GLOB_RECURSE src_sources *.cpp ) FILE(GLOB_RECURSE src_ui *.ui ) # run uic on .ui files: QT4_WRAP_UI( src_ui_headers ${src_ui} ) # run moc on these files: QT4_WRAP_CPP( src_moc_sources ${src_moc_headers} ) add_executable(simplercs ${src_sources} ${src_moc_sources} ${src_ui_headers} ${src_moc_headers} ) SET_TARGET_PROPERTIES(simplercs PROPERTIES INSTALL_RPATH ":usr/lib" BUILD_WITH_INSTALL_RPATH true INSTALL_RPATH_USE_LINK_PATH true ) TARGET_LINK_LIBRARIES(simplercs ${Qt4_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ) install ( TARGETS simplercs RUNTIME DESTINATION bin ) qtoctave-0.10.1/simple_rcs/src/rcsinterfacetardiff.cpp0000644000175000017500000002221711511434226022065 0ustar lucaslucas#include "rcsinterfacetardiff.h" #include #include #include #include #include #include #include #include static int _system_(const QString &command, const QString &dir) { //printf("Comando: %s %s\n", dir.toLocal8Bit().data(), command.toLocal8Bit().data()); QProcess p; p.setWorkingDirectory(dir); p.start(command); if(p.waitForFinished()) { //printf("Comando finalizado\n"); } //printf("Estado de salida %d\n", p.exitStatus()); char buf[1024]; qint64 lineLength; while( (lineLength = p.readLine(buf, sizeof(buf))) > -1) { //printf("Salida: %s\n", buf); } p.close(); return p.exitCode(); } static QStringList system_string(const QString &command) { QStringList result; FILE *in=popen(command.toLocal8Bit().data() ,"r"); if(in!=NULL) { char buf[1024]; while(!feof(in)) { if(fgets(buf, 1024, in)!=NULL) { result << QString::fromLocal8Bit(buf).replace("\n", ""); //puts(buf); } } pclose(in); } return result; } static QStringList read_file(const QString &file) { QStringList result; FILE *in=fopen(file.toLocal8Bit().data() ,"r"); if(in!=NULL) { char buf[1024]; while(!feof(in)) { if(fgets(buf, 1024, in)!=NULL) { result << QString::fromLocal8Bit(buf); } } fclose(in); } return result; } static QString temp_file() { QString name; QTemporaryFile file; //file.setAutoRemove(false); if (file.open()) { name=file.fileName(); } return name; } static QString make_temp_dir() { QString dir=temp_file(); dir=QFileInfo(dir).fileName(); QDir temp=QDir::temp(); //printf("Temp dir %s\n", temp.path().toLocal8Bit().data() ); if(!temp.mkdir(dir)) { printf("[%s:make_temp_dir] Error: Dir %s can not be make.\n", __FILE__, dir.toLocal8Bit().data() ); exit(0); } temp.cd(dir); return temp.path(); } static void remove_temp_dir(QString temporal) { QString dir=QFileInfo(temporal).fileName(); QDir d(temporal); QStringList list=d.entryList(); for(int i=0;i '"+file+"'"; int ok=system(command.toLocal8Bit().data()); return ok!=0; } QString RcsInterfaceTarDiff::properties(QString version) { QString command="tar -tzvf '"+repository+"' '"+version+"'"; QStringList result=system_string(command); return result.join("\n"); } QString RcsInterfaceTarDiff::diff(QString version1, QString version2) { QString file1=temp_file(); QString file2=temp_file(); extract(file1, version1); extract(file2, version2); QStringList s1=read_file(file1); QStringList s2=read_file(file1); int len1=0, len2=0, len; for(int i=0;i" "" "SimpleRcs" "" ""; html+="Showing differences between:
"; html+="" "" "" "" "" "" "" "\n"; int size=result.size(); int line1_num=0; int line2_num=0; for(int i=0;i", ">"); line1=line1.replace(" ", " "); line1=line1.replace("\t", "    "); line2=line2.replace("&", "&"); line2=line2.replace("<", "<"); line2=line2.replace(">", ">"); line2=line2.replace(" ", " "); line2=line2.replace("\t", "    "); line=""; if( ch=="|" ) { color="#23ff23"; line1_num++; line2_num++; } else if(ch=="(" || ch==")" || ch=="/") { color="#ff0000"; line1_num++; line2_num++; } else if( ch=="<" ) { color="#ff0000"; line1_num++; ch="<"; } else if( ch==">" ) { color="#ffa000"; line2_num++; ch=">"; } else { color="#ffffff"; line1_num++; line2_num++; } line="" "" "" "" "" "" ""; html+=line+"\n"; } html+="
"+version1+""+version2+"
"+QString::number(line1_num)+""+line1+""+ch+""+QString::number(line2_num)+""+line2+"
"; //printf("%s", html.toLocal8Bit().data()); return html; } QStringList RcsInterfaceTarDiff::versions() { QString command="tar -tzf '"+repository+"'"; QStringList list; list=system_string(command); for(int i=0; i RcsInterfaceTarDiff::readCommentsFromPropertiesFile(QString file) { QHash list; QFile in(file); if(!in.open(QIODevice::ReadOnly)) return list; while (!in.atEnd()) { QByteArray line = in.readLine(); int i=line.indexOf("->"); if(i>-1) { QByteArray version=line.left(i).trimmed(); QByteArray comment=line.right(line.size()-i-2).trimmed(); list[version]=QString::fromLocal8Bit(comment.data()); } } in.close(); return list; } void RcsInterfaceTarDiff::writeCommentsToPropertiesFile(QString file, QHash list) { QFile out(file); if(!out.open(QIODevice::WriteOnly)) return; QList versions=list.keys(); for(int i=0;i "+list[versions[i]]+"\n"; out.write(line.toLocal8Bit()); } out.close(); } bool RcsInterfaceTarDiff::setComment(QString version, QString comment) { QString temp=make_temp_dir(); QString command, gzip, properties_file; int ok; if(QFile::exists(repository)) { QFile::copy(repository, temp+"/repo.tar.gz"); gzip="gzip -d repo.tar.gz"; ok=_system_(gzip, temp); command="tar -xf repo.tar "; ok=_system_(command, temp); } properties_file=temp+"/Properties.txt"; QHash list=readCommentsFromPropertiesFile(properties_file); list[version]=comment; writeCommentsToPropertiesFile(properties_file, list); QFile::remove(temp+"/repo.tar"); //system(QString("ls -l '"+temp+"' ").toLocal8Bit().data()); QDir d(temp); QStringList files=d.entryList(); for(int i=0;i RcsInterfaceTarDiff::getComment() { QString file=temp_file(); extract(file, "Properties.txt"); QHash list=readCommentsFromPropertiesFile(file); QFile::remove(file); return list; } qtoctave-0.10.1/simple_rcs/src/add_comment.ui0000644000175000017500000000370611511434226020164 0ustar lucaslucas UiAddCommentDialog 0 0 400 300 Dialog Coment: Select Version: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() UiAddCommentDialog accept() 248 254 157 274 buttonBox rejected() UiAddCommentDialog reject() 316 260 286 274 qtoctave-0.10.1/simple_rcs/src/extract_dialog.h0000644000175000017500000000101511511434226020504 0ustar lucaslucas#ifndef __EXTRACTDIALOG_H__ #define __EXTRACTDIALOG_H__ #include #include "ui_extract_dialog.h" using namespace Ui; class ExtractDialog:public QDialog { Q_OBJECT UiExtractDialog ui; QString version; public: ExtractDialog(QWidget *parent = 0); void setModel(QAbstractListModel *model); public slots: void select_callback(); void activated_version( const QModelIndex & index ); inline QString getVersion() {return version;} inline QString getPath() {return ui.lineEdit->text();} }; #endif qtoctave-0.10.1/simple_rcs/design/esquema_ventana.png0000644000175000017500000025215611511434226021724 0ustar lucaslucasPNG  IHDRf8e pHYs B(xT IDATx ŹϹ]@nEEFDQ1>53>yGxkDѨO0* (ȵ. =g_fz{؝ٝٞ~Cuuuu_Uua1vaB&t`B&t`B&t`B&t`B&t`B&t`B&tȬ=Ec;5U5% =czQU~EQ@OᎴdY:5;nr9R=C+N2N2 4!P9C[7zҋ;兿9LCI5DdVxGш1~N=tuwPx^_%N~8:bԸ+NK+ۺ/=1Z׏?gk@Sk?ۯmE>!D ]4Y^RdzĒYJyA4 cK@ <_RZ Y[YH ?7@Eqe5%Y9X3XSYUҪ5蚦[;}̬ ][p,q(SCYdT8^}Hp5 pFT,VWW_=Wʬ˪3ڳct])BA$BW,ʠ2JƮ$9.]t$?E iOeHE <$)N& a!Bo;آya%f@=zq\+`»X#v}$Mf;`eV2ylڿ>rG}w>yNJc5K>s &n|]w}|A@3̬C,oۆ /^`_|sѢEǏ!,ˡP&θMhYGOϛ7 q88EG:3QUUѺub#N1~zMF+%m 4df 빧 ={>(zIt6JD< @n@2m>W=zΝ;!r˖-&Mv=rHz^gئͦ[!ΕApI(5I%L8FЛ8I̾%>` '[! /mgөw`0piMHRz:X͛7ϝ;W_idiiiwww @ޮ4q5]TEQ%8~u\~XY,v(P^B/HY,QGG\KC[c(pzR=<ڼ<>l̙3믿=+-*)M@"-^2M7 )K/瞳XEKk֬kz/6A qD^ܜ]ѦFX_-wEQ:x @T&9%c=֚i R-tWGu3c N%I9{[(r{_ vӧG%i3%IwΜ9s/_ׯ_?f̘#Ftuus1%%%+ViiIRMyN'yb ئ8Y9ԁ1,< q@D bJH$A4L0^`/i:-//ap4y%'N_4hN>!TK _ꪫ{޶6`0 ϟ2eI'titM<@B?R*zy*Hi)m'IqSdB{졛浀Wb&lPi:\XlST&/8jԨ]vYcL/e˖-~8$'O;v7|sw~(ݝmp>?4ߊUUS?_ ; 8pfqHpnr(ԈN]Pp9,ؼ4HQn] 8xؽC\F$Yeҗ4,Q6=pTY1 `7}3zQ'BV M2R^ nUT>EDw%C_m$~:dD05a*RLB)\8sx҃1h[aR ‘ޟfAvrLjj"Yd g M?L5Ȑa?I!o>zf *qQw6r:]^ܹeR'|>925 t9O )IdV]?GɬЕPV|62+Ҋ柣dxB` qz,12+tMFp`(d)I__ @\'ßMId\'B4[P0,IvN =׿ kڟ2&\u>VwI{G5x>rГK_+N*1帕w7ݵt*ξ! !]y/: T9EU ѩ!QD³4MV$ٻMۣY )WY?p"^C 1jYF@ߦ{֑(v*kZ%:.VMvAUwHB3#>!T@ wg0Y&~\PPo<4$?ΏN;kuB&z ^YZrGOi˞~:$pQc3ab ݱ}G$%re Pվyw:k .`d^iV3 `0@n@tp *xf]Y ]8-d\ hks ;T}}Q$Y׋ X6x¼a/ !G裏ҍ̈́00NyVW_ /=c: ![|i{ǿ}MSNIW"MMq&9駟\{<Ȝ9sƎ 6leee`mgϞzzz\o>?YkΝ$#e'17ѣi )tz5*^\F60tD] 4qwkĀm/`kL փw="Y7{>zcGfsME-YY/Oy ÓH֦g77Ammmj$Ķl2a`ċ7S<˦Ǧ|'YWzǚ+k`Ϟ= t8wf/#*4VF$QW4슪ăx3F.. 78tI_y4p ^ښ`dv̳Ӽ MQ }w n{SS?TÛ_~wN?txĩ9`ӓt%izy$N;C==uu𹯾jD H555P;z($(cGYE) x]XlWoLA!@&dHdn xqj3 ;*\[c2ƴL9

E:jp2q!(`zmx}2e02bxlhMϒ%dC}2-YeVp8C-h j#-y[PnݺteuL̞q47q\tb*訽CI v#cM{i*B7/ɌشiSNUjC:~"Kdotk9ci/aMSiuBd̗P>*hlF@k'KTR& B9ڝz5Ν;7-˴ /DK2m;:̊PA%M$!$ډcw+V\|iɊ =YriB!g'ҕP9)g+dv6}…iɊizTU++&"]1'Ŧ_#mf.;7Znz0]YeV^ fcnL6nL6nL6nL6nL6nL6nL6 >?10(3 茂): `(3 茂): `(3 茂): `(3 VšanOpmn6}٥'PnA^PFr 5ˁ[hwjύA a{!Khd $^?7 "wh^μEq6rRH\UxH;%\ |C# lCHI>)iùEx(ΧRѓUpu PuPÿnE+ 3Oо5_㽮k)C}Ӎ d8:<Eh3\с* :Tw0Ё$T/T>ۇR%$RGh4)R BۺHHD@68QHGi?Z"4 "Kط訅,}̕7!7J4" %%ST3f_.Ű6S0=ojjN<{;4MKBRiіǕuަ?vz<%^py̓9W<8iʑNb=c6l i4sy.*NA9A 'YZ#epF~zCu9DaB Kujyp3ByQPEx x\r,HZ XQ K$~_WAR{*->jm"Ir@2F7jrro7@ Ɗ/PhӶ@R5= -&㥊4ruxrt1y!]kY +\5}8C[ 4|U ,v^t=\VP0pb 1Ȋ%IP4  N9 #| *|B0`A"%t''Jtx y^SC1?jCx + 3#,C e8qȃC9ek@1LqHpEAɎׄj2},$1Nt1xM)tǞymǧT! "VR;{u.pd"Y? NS Rޓ կ@Hp:d۠k{ q(3^h=! ƒ#ѣ)tX :=2TΊCxxp~aㅠj)YO\lxPKg _ ?ʕ+<̔JirX;F.#޷?[Kdw _ڵkm*HBrX˫+tAAȺj~&P5{(_ݏ館\#+)ٻ~D5̣=BxQ~Cv~w{ܰSU&.8GUBzm $n].}!+Y,;Bg=V.ACVGGi'LKV-%u[Zf8PHfcDAqu샲vuVqz^ŃwwwF%MCZY_Pu1sIVjkb=! Ma扂+h9 6?._Z8䰢W՘/ynJ00Eoޏ7֥tTOxbn2= Z'l?!ږ0w!`KY1?/aV]]}ԯ< 6lڴiɰ}1cXo۶mܸqSi~N_=]+]fwqoI&H+h9(/ ~]w566>CE۷?аxbx],[l---a0kjDtlٲeرQaE-L'͔qw G7;0#Ai["" D ?-KHm8]`Qr9p8h!u'; f/CxPHq8`'(!l54P#8l]]]ss3aӳxovCUEB!ziCiG}^)_up~^y啟'QaEo;R|#.uH L{n8.nz<`& Pr`5z>\1~?o^ZZOPE [@iQĴdBrXуD@5~ ޽{=w݈oя~dKʽ Oc6l޼~?3%*gk3JRmʡ:ND8r2=]`6"D!TK$6Tӛ~z'jXn3G2NKYmmmnO *Y 07#&Jwak (r b(g7XzGzR7 QkX:Y$+VX`A]V?Q~a5$0jkpѽպW^/T#ɦMvm-\?! 7AM ˖-C~ӟyK,ਲ਼:S/(hEE j w-?o~Z8p}5״,]n mJFd|tp!G7}Xf͚կ&>lӤ_;;;ilo\zmh$h) dѢE8Ac=]|,h.x8}Tѭ|fx}E)1 At[`#ׄ[bMCW_m& /L<|x QZv]0Ty\HУJhQ>-(b(7HIhT4[g *:R>q }hl|E?~_owhӦMf q֞:EϘ.--M!(It".*q߈iL-b}DnƘmwx}HKW^yO<,*>wW_}nnܸ4WtrLfsoyy5k 0rHPbpZ~=u򔨨D=<TQR폎[#Ϟ; Aw}='g5rԩS!0cƌO?4bv1{՘Y7c_a^z%8o[ LA[r'"U'6 t"U%=X}|뗎Wj\ߘM9Mʭf>$ >_~G?Zd-T!Ϩw =z޼yaCC|Vt燫/2RU}t:A DEft>:2S!7ȊϞDPe5u tvQ<ѽ(A5Aܹl }PZQ%]'0 )4l5f?>2 % uS~Zc^="BD3pۑ%>41|k<́I>xӴv!Pq(i}(aEO"ERQ1~OITK( 0%iذaO2嫯zϟooii9톘 >47N%|嗰ӛ@+:egLsIEBV{>d24f>~,`Q-LM Z/H۷?pĉlق3P[[~Sͣ? <wS5 ?>1uxRA6\!r3uq 2ZErӞ}2 V@'2 C_V)[ku(2ɖ}7=M*N` npsC=Tc[V^m[wі͙3gTnSO-GQWrX˪jQrZK_Ӵ7 C2جX\U Q䆙il&ηSTIPGrg'0=9U=$%9הg;ƛyoW[]$gQ _s5v9=# gFl3 LxFWZVj=\֘z3xiEQR2K,D+zYE5UkU7^ͪy}%#=V 489:ZڼJ<P80x ӕ[~u%jQ6ÊZ[;6Rѐ$cDҒ{>_E+qxlZ6MݖS7P+K췪&J,CIkCye~&db<N\(^=:)1`3sx^,$+#t5Ij6lߔHf!&PK]ύCFJ2Rrʨ)l'؃~%K*+$tVtB34|}uUciʭ@E$􋞞OEr]kCI+zWGky݅`|[oR"@WYnaE/*)棧[`;/#|w.E/rXGxЙ.E/rXݞb6mݥ&|KJ2!;] F֮]{g]^䰢wuUVvqSsSS#m.B49B?~N䰢V*v7-v;v6thaEjs8R Aرsw íD䰢7^?fyA4EMUu]I%^ȴu Y/Ҁ.D.V$=8>^sq/'2O  `$s\T(Hz>i 4xH9^ HnTZCrH+Bš7lzĴv]{M+' )4M;|Z 4'w\uS0Ё$To|8~?i +w XNBh[7BXfŋЦvrqIȃ=i&R4b #WG"u(ljѤp DT6QtHȉG? ĵ)LZHa24 &&R*4H$z!REU,7jÉ{oG"IƧ\J+amqwߐ}E[3sСJs3 &t8y3YrX5TzS\~vzXuyӁa5M-yډG:;}w,%B, O`W.^MUQ\;<4_O<.v\|)]+>O1~ ,"tEslTl,Sȉβ%n_'L 6+"mߚ9flEyż 3XۆVwI>zD}[󞐮*5cރBKn5snik/{тCz/0hw_AI/08鹿t!@bd< 8VQ]kpUW׼M=X&䰢GscBUMzreI +yN%]UUuh<~ B0'v3]W5AGUbwކM]{+ U׏h-_(ry՛lbûڝN,ˆf躶N޹#Mjkn?x)uOJqZ]z%--2? >-4 zekAS? Ww8O9~K@w;$RÊb"?A`㺏6O}nE8a'I+KY lBT6A<$28<§_5)y-]m|,I啵+?z娉پ (JfXsEvtx; Y\ZHݷMT^r=[*x )qkuz~GG!GtD%+:]?z,Mbf3F*A'Fco$;0Be\Vt4EX|ӧL;1tC/w=H"r;D-ï蜦p@kPtQTU7[#S9CE ,TiόA2C၄({Dp1uNzmu9NE YB搐8%k!\:~4.k@ +CE^)9p~5KI YVQL@z+B <Bɇ_P!UARb%ɂg$!m6D6 iqS] ډ-|/ /H8 C ECN < jxk=tvwà58*"i)ʼnq:]uHBHCHPM'o&x#uE5 >Żi`%$Z; (Ҩ2 NJEyl# ~kV!=ZOPŮ:}k L Ua+(#ՠk*1c46u`yuƚ-E<#`kOT,) 7GT-5 A FQH.6:FR!u p\n2cQ0(d)CaE'"Ky׮]F n'N!\TLlk2#* 5T޲ť79)Ӣ1 9MXO$`j]x~D}䰢dnSA?N.%K.5C_ɁsXѭ9_;]F6'=N W1[K>!p }a% E&WBІ~ā"mEʪ]k }.hJٔd 2tT;NR|^A =`0@ n/nw![:߮U8p@$ YErUU^Tҍd% 6PL36|C_F3UAۊ^]]H$3'@gaUt#R%"P,r)Ke6DE1)>,Hf\!4vرv/Aѽ3GEE!n>/=7?L!s]p]6RC>(:/L6@+~o(͢E,YuԀL`,OO7nٲ%tLx;AAA˧NJƧFcƍuNo߾[N0_CWStP-.ݴ~2(//okk3wB>쳉C=!g8sx dv8x^E|$`0H QeJ$zᧂC]Gk:"<0g,g;IqFo d s'Z~7?:$&HRZ'I4ir&=Qo"UBCS孭5k /;d.%<):r2GnwD#Wm5j_ o*z8u!9nĈ\paդ/E|].xf+|8nvW_ -[~ϱ-'Ͷ#Pt @ h2˺;׿~^ܞ1Ik0/ v|ꩧb-[l`!OW<;wx*8$YEWbg( #"Ռo+7UԻ%0~?~3pqZN UHoYJƀ *`KP,W\qm݆,=dY~G=صkB'? 8ZTAS7cykvsA1I+:XqƙjM?|޵krm~@KH2n?e#65;PtM{1{LC咊;n 1TIɅ K/D|=j:o޼gy6׬Yc.UG1EOr{Oy---w'|B'OTD>q`#<ٴiၹKDuLѣIG;-XmbN7d n7y <|I{+`mc}ˇC Ɗc SUU' }0 ǒM=El*DPRںx≷@e/^LMe۶mƍ[n]uu55&Rutp].+a|>`H-w0A ~i94_:cTœ. tDZ_Os$d6w\4[ȍ[ͨg,Ci$ڍOjNf3gZH[0'@ĸW1Rutp]+:7p"NjqNH*ڦN5 ,<Mqn2 Ý_x*ldiid+:A{sЀUwQ1i P xh$]Lc6iGє:ЛA9ۋ,MūvX#57\XmìO-o3fP䰢ǥ$%pM˯uOLh&xj\dz2䛢ga"ge-L;7~CX;z={R~rY VTm-RS]R~Og0W7Ef>&ɇT%I3YD9fnF8/xra=*ݝ!rY-U@Z#&.ZkNw60Q&QHӸ#]L!#䰢*(zֽc)&&ag0(N?a~3JtviMrX,\[S;Ùf'9bYH+ ўbvt8+%}1erX%YVƥ'Ε%CFÊnDu @ArK9iZIF芢JR_oΐɍ"}\$^W?!RӧK:d yK5&Ӌ$ 18=y> I!BxvFBA38ҋ,8Y\H>0ᒇ CEF%Q8J “X8\lOa$9`0P7NJ% 7NH@+K!H茂): `(3 茂): `(3 茂): `(3 茂): `(3 茂): `(3 茂): `(3 茂): `(3 茂):  #Kd0 FJ0υ`0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O`[w>iZ)>5/2 uURGG?D`4]^/2djOѰ"7w7e36~cN8n i9P`(m^Ra3^{nw /xZfPϞQy36t袚}Ƶ<we5ʁm$ p;柽}˟ƟWt9OVϵ[9;—g_G<%H UE! ֻ+kr9g! `:q^0pޒZ=|RgϿdʕUe%aB!r !^M_|WW]rH  9P0 )Ҿ3_<9$1q=?|ûyp#huNi=z#:3o}ٗtN`7☆#&/};&Ik.{6`3鈑&p?LGTjsު>]]]%%]xu]40FN3Qؤ p Mkn B6rS?zw;;N9W9T;}QϞ|KpLU ?\US?˾'P.:d9<9m/_EN}nٽ3~y3钡$sk7n#RCȲ!+sUcwΔrʿ}`o?9?ysfk:%q5gux ){co 5᝔`A쩁ou|.H3rػ~)GZ3G4N$l+4]Cd$0:>4cGH}ϷxJ+kEDmri@> H qXHKUy~ǝyK._wQ;qGv7  O&{RvSSB*KADh@U#MfW4 (=!uqk}^sw6]JPk:Q?zj8bS'zw0m[\dE>R/Jɓ].ה)S[߿|0mW ?#KBaH'wYÖF2٤alUj.zxānPezsqC,%\N-z~zÛ \{v5EG3h@.ɛbAd(#a ei[L^) McP,QD;cےIY0nA)!d^j`T}M]]݈#^{N\{筿r-sϋ/Z!- u\"'_˲;cϞ=I]޸PΒ1l']}x8+/@F6ݧNU\#*N1%duS8z GD,&JߚL? œDOb@qUMe0Ȅǒ@@okkDy36¬yޑB#( :t\u 3k^Qvn0`Ʉ*ţa9cx)̓_ e zGǎ9?t]## Kn<$ѲB*aovͶ ̠ۀ?beYJLUQ5C>'ȋ h|Ca5q)z>bjztq]f!3H)yq#f 붘 ̠ۀ顃ud2bQUx.`l6lxA$m `$Gz<F6|ϼc 괗#`:gq}>< \$CP`oyI'g\Ʌϟ&FJB*7o9sfz20nNWnC9~WA熦u7Á@`̘1;W50Rv[u%º-&36F2 z20n`MK`DSS3Sǎ<% 36:HD[AY?SO=СCYSSk͜9۷oذas̍7xWR+ 7l0iҤ˗|0cƌV8 b}Q?cs9 /W_',++kll 9s;DYWt0 :fm70؜9xt*MF`0ΙAŒ4i9i V3Xs/(͊ sǜu:pi 6,ԇA˥ks6C܇Ӵ̠:|zPPYiﶘ̗vAˢEVK.<zh1n50p8:s .KUUIo*P-4BAY0t:/"B><=sBet/BJ@e;𬹊 6wttLyڵ[luC ?r) ,xWN?˗93fz꩗^zikkW_M?uw}Ԡwyo$03$驧SN]fM2 |^0sGge+XOv`̟,%VMu:/G-|M&O!cZd 7 lBƙ>b|ŋa?{g Eq>كcFDN% Ix(Qc11"&MM""FD0A[^vw>fj{gf{}XǞo~*3p= nkO4b%'_YY ަMؚ+W &s0:uɓ{=䓪3fΜ9{۷C`_Ayz >(nf^cǎ}/ h> DB(O@+m芊*̕q 4wSWcOIg&~MNl)AAwt[<(ٗ ݹO>-?≀i{'ք?PНp7bhC=s=ܶmۘ3f̪Uʧ~zٲeCvk.첚>P%8 Ba޾ǍԤiLp 'Ƃ(..~h4*8w|gGjÆ jtiii0Hjg̘ڧEEEwy'[СCvo Oz"n{4Ԇ>$ SimL{LqX2K$a$I>RYYGi@۷`:KڀLB![nL{̺E]o_s5|ɓ|AF+~xyH8XWv4PsP(qC*ף(` |j,b` 1 YOf9 _K¾P0v0:HgBG Et]g%,X˙yÉm{wtn܈#&Mtuwȑ#%%%||=zG]h Kwƒ>x3fd>,o۷z~k)e\8& tСѽ`aΝ0a™gyM7`y C?otz*MN? [^t40>G}A衇 t+6lkڷoi]vepOiJ9Y{nݠUQYY)@`(%zH5O> rQPo/H_z0AA? .Ѵ .D~Ɩ)S, S$G_J˝:ui۷@< }q~-[~[wyK,\n8^/>sLUU:tAppp!0{9XNy tRFfkePһ#D0Fa}ѹSg-I]]?|{3 }@ʈQZC$~3o0 zqq1N#Xxꩧҕ>}u]t{e^Ϛ5+]pI;ڇky~p8D*ʼir.<u3#*2+IRz0O61frPɊ]سwϫ6|nȷ.`u[4I%O t1IGj^Z:Wa_-ש1Ȼ(UUSZZi:a) h-Qu Ww24D 8P]$nڝ:Dx z܍M+F=rm>D\ :9B_˿dc$4cA:sFi6Ƒ̅]Fx]έSX$ΕZ?'ГNtIG7馛,Xpg̙3gʔ)ӧO;v? &fzz衉'Kw}~;/\sX_ꪫ0?w'aHsٳ>F,R5{vm-qYYy/^_~̓gsXIw]b 7ܰnݺGmۖo5 Aŋ(zi?`]tNСo=|p"uٱ=PhLnW8`Vr։$E<ʾ *Qث_Lzg~iȁ @̔{ygn>S#dR eR;.[wtY ^>_?^)}qPjbyH s)7FiEHAw9*iu[F Y|ڰ†?4JL+k:uw e+uΘ1G?`ExWx ٝ',^|+(xd;wL9g)# Ac tR[]8ޒ%K 5[{t[/_ޥKhe@KJJ2?PF@_ 9p\ܥչ-zT$7{wj'r'RRwJN<~AHa<JWgkb_/rl==2) uҚ͛7r)lM'O;@$$I)}x!C )SnׯSsuE-**z.csR#/ !Vptp5$^`/VH!n"n%'gߝL4Q.|nnݛcsB^\Ilʭ"?͛wÚjܹ={vjM|wΘ1㷿-_&a]j >+#ٳ/Bj1c:eVUU_|ʼn'8p,#F,]GesRE VXq嗳>>|v6m(.3ܬsس{` ~2b/ ;т5 Kf i204-_kyr[v BS%e X4mnwRs4h֜޽{Q<LD0`E +A l2!15V` tx><>JL۳gwmni{%w@n(zޔƑ)Ki@7R`u؏V'MI*6s8^06%IQdM ˠbB~*Ś8)o q0:-< A|\+E%)x:i-9R4'^`\4ݬgh!:ifMAגdV ڇ4?6$IMkc夾Ǟҥ 뉶븘%nƍ#F`aXv-ؿR[o՞gG>}ȑ#_~iN%V~/Z()iP]wڭDLJn護?{Zx=r k0yz*w!ebՆ ^n"?3RbC<4u(.нora>y.I ֯N<ې$'ht_bT0Ǐoݚf*sbHw^o;dJ:٭]Izv=nHҗeRn2wd{3I鎞3L.̱PguS ZRT6,Z9̱+|O>בb'eb{|} NeOl?4u(.@\Ld\U{$>e@u aj B's ZIR~[@\.̟65lu`(XUU%P'tp,h ¾|ÑG%\Y= sJu(f_(;>֎lGk75 IR& ]Ӆ[9y_𠠻@QI=Vs =if4eLE:c Ol09cNus~w\teT!v,YP}≩B9YtcuIJ+ZB|yV2rQ2LÞ:z.I4%_Vu Ǭk74LLfno>,skRZ}33!M줹pCL*|G1Ě@[Y5h$W0. (.f,ڽgw^Df]U% %7 tthus#C8AOywɜ :?]6A6<tՒz{zNHx D#aR(;W ]+ž,'^Y'%r}J{nn֯I]˲^!)[`n{پ֯@˙3!HtwDjeSGQ)ieG1LU!lSК'R;fϪ( &2I\?L|dD,MIVT$)++stz-6a vQ - iY_Å$3K.\ C+[M!9T)]L8+`?HHңG @Awq V=a&Ib܇]l5LNS>OVdց)7}yR搎ek3 iuۢP]oe~v:S.rBtRL.DcSAR#AAwP]EȎ.]DНP" H+ or.T\|JԄLPНϼ x}myGqH^M帠 蕕Q|`]P`0P`k<Iu+Eº) |~7Et`><)#ax૪zш%%D&! t68犅W|HnI dsn6|o[i sRDE'(D<^<^/iA8:y3dC6(9NWiV a"+ܟ|~K46EAw D)fyX'E:3AZ0+w}F*Yi޽{H@(Xzc ,f>tia$9϶a,@?t'@8$3)?}r4$a:t=y-:Z݌E:(N@Aw$;m (.&+`4:ѭ!\UMtRbJSK1eT=ߊ Ttsh;>?km Msh><`oC ޭ[.LkK|^p6+r€/Ep" H+ (.E@V,r Ģl :q{]V x-0q-:<^t@AGlA?t'. H****.B+AQCG,AAw DBG,A?t'inAZGqtA֏:ۢP]ŁEIdx(N@AwCG (. xr"II%iz HۢP] "*?f}};] '(JnA-[y=@ (.~Qw-+RYY#Gڷŧ (.L{.  tꊕ6h=jQȢ((8UYP8a4M˃ â>O>]~D"ko8(.??v)@PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)4. BG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)P]ٙ/քBA-5M?n^OEvo\x kolXQˊ"XPMLP $eAQcɎOK^Q_O|B=jњ"~ E`T_DݾF7U!ICR~5ÊP7n?t ֕s?X a$F+A~lJ놷-%9,aS_#5=oСBX$aL}4]R-./$* {vv2ß!T5,*t B4Ea0B+Uakp/0Ԇaa0W2)LBtх}acDfK'"Tq?Q/mk 2֕n:[ z C]uSCg“ 4pX FsaaH{vm5 t۴.Xi֕uu1ӟ~'0 iH4Gڵmnsm0"Pq 2ALYPdt_M _ࠠi )h˖8#h# #];e9]ٳI2ٺm;=N:9}=|>;aAR"t3i~|w\SR*qq EjL!MLiIiL )x}~H P\b7po>].1BCJ#յ, P#~]vƭ{H>3y7(rzE@`11X (. )A qm|/L79wSooqM:䞞"e<fIEn8 1](+*!E!{'zck?.iǫoYfE$ׅ")y}EPmi^'he #@k}Z֭5 .^hoWcxծ=OvAy$"CXVv~ӡf}EG((_zcvCFggmwzsR)DzpDoQS (7#ܸ~wixW!fnOM7:m;M#;]5-w0[tZ t01Ia_7sIEve[Rزe:1`:tm[,I|DB~j.^WW`/1@cuEUkkk3Gm=n Y3F6:{+ xh$  Jhڎ+JƝ|jS1i;WzJm<\;#Pvi3_w[ӻ_纯Wt>r2_;0 I2)'uK/f2}QDs/6Ww(]j~rC;|ȗV OIw\$fm1M(Bs%M9Kqi>&.X&W 5lBt70LĕMy0)-+4H~v**{eF$EY@5@VTYeE!;*J0Xm8:l vHϤ< h%mq6) 8uI2tmH.m@=ch[lK~#?|N{pyRU]uGK^_I)) E6KhUw\xȟjsw*^ge=mUV &]1XvV}ѵt):3IL*)QSCrݎ7Muò|7npc۾ycx3t 1tP#_&Tv%/g" s,iotY&vxX 1@LY%h׃@EHA@jӵsA0ǎ : ;:Z&C{dzHefS_]+}.ض};C/md`_*/ _KeHXCa_yItG> M+.WԏSzfH2f8Lq56:hT6?+*G#Ic5GTlW[w}۾G_l ?ܹۚ|њYR:wdI "IP.\"~OQ)3Yfzi?|T\&2O(n@]( f:OVj>C&;%H/֮ILީG^/Hv,Q1^-Cn@vWd0U%MoDe|PV֡XmyeWQQK U0c}(t(u9锯w-+)5y*>_;BEc;t:U/\N=Ú3HCt@]DW@}TUv=9iD1d__]7qʎ]8(~.'+, kc{<%ӌ=*)kQӫRM؈FcX*Jr#thOd-|/+fiKUh Q$AkjJ3M'wH} )nFw$,NSɈ(Wv蹫:TpHCrh Ԧ;׋ ztG)]۴[KSD(0٢GNYFy}Ծ1= ^xѣD*4i_SYM(. }LmV\G}!`&'34*[ާ n]iW((FCL0eY&(ا 61s[V}𐁌*:$6dG+" ֡!)ReD]%/*Iϫ.QI:u*dj)DrP^$ %&  O<)3<@`C A'0mgֳ̡ %4Q[K1ҡ t=Hd(P@2͘d 'R7;M2\F ;p6H`+m25Mh^$9lM.CJ DdSaƨC|Sz= נ].p`YoM±#?1r ]0cNpAŒbv!^L}(C o5djt}4a.EJ:7hL&r] "YnԌeR$JX>14A{"FC I< #+P,A`C9O N-P j( ׉q AKLOeNT'qY@iahz҅c$UnBj$BNX&^%]_eH*zt{ *T$c253rRƠ.-:4oٚ KQRp9qJ &E8R(eS7706@2wYH$HxAY`\)֟%CfWgyp$["$4if5P4vtҹ:E!Y.%g?9ӐDI^Y"XTiY2i8*.Cjkkw$= |ؿei>c/(ظv+24#12>tu ][- yשS'(-(AA#JKKWUswL# =S^OkrA!((5-s=lys3+ tA)tA#u=] +Q0j1 ,IGF̯cN`uH+ǔ,8P[w~c` tW wX- J3#TXCLM7PM*Ç(AAw]*.,D= 3Z"QIXdƼjhoP@ X؜Abh(@ <O2ɴi%8 | W!SXV+ AvAאD TN, F<p$ #0|af(LIfZLL`=2'%jEa&t C$0[, -F yH$JEx$E"a=(z`WB jjj)5x2@ t7;:Vv7i'&t"& D펄A I&I|Io$&وDIb:4H,1 `:{C5GU! <(:7e@ u {X-aզMjmMfxALf8*J  5(H768.H y#BC-@ ŸyUz@] k@[:d蜾"7w!ٳBGB?`zRf?t=t|#H f|)t=DFQ5R )AAGp rs4 c}#-ه޾7 >L2nt y)$9Ki|ϷU^O#qr!(I~oSݮ۵c5f(ajPwrz9|DУALv򯮮.//g͟?.z5Mݻw0\~}۶myy>+2̞= /h7@\p+.lw9cƌ0>ch@>|xĉӦMsxR(5mClkej(իΝeIp^oJK}W۷vھ}iӦvaɼ^ѣG}ѣGϛ7o֬Y/b~tY14iTNN A:4;wd_Ot]0`@Ew߅Oik l^-[Ɠp( x/K ;v̜޽{;u#8?/tW@EGB{:ALݻg߾J5i6`n_ve|$֭[ YرcذavMxw : N 47mԧOvګp;ׯg :x ,l޼O@+N:)sV5 ^xᅮ];)* : yMKCWUu͚5Eرc뤉f͚5tjX>|nX3&)g5\tR@o 6gU̠#״d

TP%.`oܸ>/J_^^^WWw7/YaQY4")J OZ;$%eyӦM`Mݻךʚn [¯~tYBq~j tWqa`nCUcE砠#Hj&([W`gt@kD5@~sP]PtS0E2Itj-FHiuy弹J,;IqX$@AG# G%x%n5QPgWȕaiI !H+0Y l+[麁z _|_#H~ 6{m uɫNEM^/5< aHHV:=9P440%Y!1OH◡Nk?x7/6"? 駟׏9믟8q"E{-k𯫮jܹ={v .ꫯ***fΜy܆f͚{n„ NNA n)NW MAh Őm2_I㡝6 `_ӕaHJ!ph4!A®7D=?9L{T,^_s'xy'u^ݻwgw})l _>}:}RV_~5\s!XСCǎ|($FAGwiFȺ@3{H~ vՆ`tl ^jkbܷ'ya},xlI.d>iZ$'n%Њ tFrX;vH!/Xl=r)l_Pav}A>-W_ V9,ٞ# + A4 rޗM(8ɀ;F0`Yh8WMQ%Ǣ<1>zyz_\GgkÆ ܾ{oԨQk],W_}uM6;d[׭[B<`ѳ@N9? *V+'U.LR$ Y_aSQdkR\{7_ax>~aM]tсRnN. :viE0,w+tiPsau Hi88ޝuGRc>i-df>IsIi*WA7gÜ؎_P+Co]4K˳>ࠚ Ҍsr_vۢE8f͚{Gâ$Ik׮O>$[w?s|+?яngy#ˤ9q:Н n8|pqq1,l%iӦw}wBN3f5&Mbk~iH_QtSG1g]ob=Q=#7HA vN,"(Ɂ/XdСoZ7/`0!nv"6Z,f(hTU=b'kULˢIe%BCwN .z͚5wuרQoJǍW^^^WW'dc$:tU[TH EpDQ a=Aat!2# ,.]Iih9χfEr]t2+5Q$z)M %{*Yd/W4UU2O4]TUa1cZ +8r,\CRnu9&L8p~ͫ_Iwx?$ +N 3Hلb_74 6 TH)"h4=4ڢ :Dz&`2- l͜W$cJ&n&^]Ϸ Eg_ΤInիW?SN'tҟ6m\_,,T,4/4fΦH0Ft 鐡IW7@"%EUM*9|Lr+k7h5j?/xc>=//@)SO9/X(^/hb,1aB;Y x/';FBeM%jQMl"yCD 5@YXtš9휉ɒH&|H gA_O)gW( I nfˠIST%Y[.Jɚ0:}]"lRq=sgKn}h#sH9AZ:c ߟ4- ^"'{imKM(;Yr)4mы-ڵ̙3/J'ԵMP$%S2Ve8Co*WU5 |>6;-[vi! j8嬯x;Xǎc]I)m͗_~n0`ʕ+ VXq2eʦM[ΖGy3 $;(}lR_O!W]uܹs{@ѳC AbfW~5Yb<3#"޽AW;ᾇ:x ,l޼؇LnƤį*o`׳>ݹsg!1!XAy뮻{Ȑ!>ŵCa"vY{wuu#)JW` K+sQ 6lXKs|oҔUUUM2te`z Pܹ[nN oǎ/ A覛nZl5-?[B_ #v%zꩧnFˢte yZ|%os׮]wފ+zz:گO>`oܸwN3g[3v\h… ]vO?믿9s x{=zxa}{pu.{ HK|oTvDC!Fxb_lͰaæN b  ֜y|GM*uիѣG5(3xɞ I:,(P]]O/[~W۷O7ڵk훴=[o \bر#@}EwΜ]/Z PXo@ራW;w-[Xm\9z[bHC{rl]CL!I!FF4|i;m4f|&Pf5 IDz'Sx}_R !.fpM-(HBtSQX$W_H>}"Ae]lGIqIeʵ6(*'(D xNH>$)Ĉ Z90InXi,02'caxH ~X7决ZPXОBQyr&N뮻hʹ:tPs\w;(j-IEs6>sb$I^y7xz~ Eyt&sK̙z)%۷oߎ;:,h=~m۶́_-vi,X)C5 3-. ;rڳ1RC{{ؾ׿5}qRtƍwt$|IXq(vڵ!C~3_|糯p-H|xuiWJKJ=vAVC֛=|=Ĉ>j5eҎIkز} _N|aO}ɠiw=l۶ h>}ϟuE0:uɓ{RƷO~XGɬ$f(;ZC^z)* tC'}p ł%A C-?_'5xH{VuΪb$*M5 A⹰0+ݤM!ĬifrX1ؔx_)ָ+:`["V\-Hu]kk(0 3ߘB lD3 BI9!(H#9zta9h)r.(0 F2nܸ۷嗹*:=us k&)I_㑀ܹ^xy%l `ڝ޽{wΝaNy"댂>췍Fuuu@{ViuuhL~@. xkZmHy2K$A{}^]#COa=8V8z6C~w*ɄQ(;t6XOmN sܨb H4U )z}].M*_V-kr2aH-Zt K2B<_|1tP{ڷoT[/_gϞڒK.˗/4mڴZꞽ{v1eIP4LQG@ 5lZy  _P[d;[&z1e $c8P "%YnGX?TUjH$ !5M1[kKjiZ2~茤x$&MOZ^^7߼dkb{;L]}oְaaH2oe 2駟|V5k@ oFu.\سgOxHA/^ܫW/ha$僂9, fL2dDW`WLH (pJnZk*xnI+[$i:mY3 &˜X`DaZߴy dѽhfңH`i9,ߔHn喔Cpjk[lM [W\5}=/o ~aDAwB:/xF"1k}5CXÞ7X=GFf.˰{_ً,V+癷@ef^bw؉Ŵ] pesZ\ӧ;u N:yVZկ_Hl]wu&L8p@Gy Fǎ_zbxOᮻBAwp(Ô-bo `}ʱoʊJz8f94IZ2Zhœd:d4ϛCYkl<&J"qBIw\6)jՅ1 =-cC, )yY BMK+ ր@Jf*B2+DŽD-FBtA欆`F=HdȦcOMB^,{T/gu!t"%1 I@{lP"4a"?bʙ:϶YU) y ޚ.@T t:˦O!ATAWHvd&$ ldPXZΏQ=GvS̰i.cA~2?E3ՆC]xFd%A+ ሽd0t7CV7ߠ[h0niV,T%ǼHA#߸P]P:8Hd"/{KB: b͇^ uq7@_^ p% k3h࠺ںR*b͇^ քt: 1"sb 'hyXNN{WCE 䛴S9Iz<$9?v~o, Fġ٬7Iw8]w@;Xzff|?u H'h|Ur9)FgDRYoRf"udI*pEw6kgūߞ2=jnLV!YmԼȜ{t#.)ẾUTp0pK@q:ެ~Y^o ,UC/kޫm)H&\x4ö-]7 N&Wu\)e&DPX?EyʷN)=%[>е8aD{q 7s-Ӥx.HMӊd@K̛OMTΪ2nT̄raߏcRimEFU%;P1S éT " 2 *"*|^$rm)Wu3b :C/^I;zLo_?=(@K*jKKG @p>E hPpLCECBC/-,sK)%o$cee^l\!o$7 y;XkVp1%ǒ]OT\K"PFʮ);3a\ PK]"bq誢jhZBSLFMe(~YC/8 gZ.S>@C /8t@C/:(nz C/8t@CCġ: `D : `>C/:(9Q8p^(p@ hPpq:)Z p@4pKN : и.zz : pi4MHCrkjj Pȏ\؎yrMS'֏t8C/!ØcD ctۑP}g6Fe8ä$6wm7wbÏ3FݫsQK!n{w2FeL;>L:R1s9ش1^0g=_C/W{6P@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&h@ t:@@ @@ t:@@ @@ t:@@ @@ t:@@ @@ t:@@ @@ t:@@ @@ t:@@ @@ t:T^rqNm{-X\dWreI*ˮ㺒ШEȮ2%]kGIťT5:uT3O$ƌ4ՊX--{aqJTI%ۑeRdlhiI&Y*rkdu$EIobIS YfMJZRߞّdg~cXfnmg,ƈsm o1II!#ȹ #2ɧH`L~Ե1tNqݔtMq;ڏՕUŵjٲNQdgvK&eٖiJO2BQ*̴eMMo$Ya##9=O9cf@!۴W?S{.uf;a3]׆bgcQJPEW7ָ(,ՏFV[SCK2eض;R%TS7Zy5PBxHj_wʴ6,%BxkipE!cښh2&R& GSC{;nᯮ, )3JUUU>{"peŕXlɯ_Ɏm>KZ[[kkkGO6#:`Pv$(!~qi֥luY?,+.8u6̢8$)l޲aFs18bJ@ykqUU5"#=Uk_F.i'mnݴ|-vte5bXDV\55 5Xg{~_mL-hըtȸFKK˕Mmӆ0iWcsK>]5z~lܳo.{g-Rc~L~YSlw_:r!FbĆnhni·Lmn;L+/Џ;fjC^$?\b붭G))[fWC4~LзؽbFDZ rqG>wM|Ñ/.bD)uuuUYd@U]tEw>sSA>}2MqPko}O^pO>0Ib5O~Mchƪ-Ǐ-u5HM{OI S4v.'㱭Xn>\7`ޜcWHh_r,rTl kkln=4|dnDM՗~ݷƽ5HhGMnݰuՓ4uG7zڴ)yUhkO64l6>i!S' BbZUS;y)F 6S;gۚbVUkڝ!?qjo5jƝ7w䟞Zb Q@uQE5I62RdM@/ݏVFU~ܱC?u^y >p!Kݘ8~đuQ=ֲiӶ0;/L 1M>[}qMkŗ\'Ɛ!CݹO6)>^{erv%M9h~ 7ˉڲ7/|Ɔ= 9K3Nߊ, 2?鰳/|?5׭UU?U CdWz}Œ5]4h86 #LVBx4iL3mڝ B) ܿMMc,퓞`?}׮[7psf}ܣwvOɞYv浯RbP1iIS;m5'?^D#589q-V4׷Thn]|Q?}܉?&Ҹ_p YoîǍ߸QuW\p<9mfӧ>xavQS2nPc_swUj"pݘ/;ȗ߸a[znDkd;L~js܈o<CPq$uT92f̘>mPbggՖI_{zUգHvީ6y#5j4z=uG1剕h8<{ampٶV.} 򬙓?VS[;h1W5Z>yk?5afڸ_>"Ք ~Ϋ[Gԉz[P޵WZCgLqrEHH{9]oN|ұSoyOx }lt#w=SCwb:72BqIA4ќyXXML9zivudےHy{Mg%.ARN, Y, $j.`wnLtHL9Xl;UtS$C5۶IadlQ R-~ 2ɤ)JNo8tOrEaN:Uy;MJ8_A&׵yOҗ_[Ҳ{okrRQ-9 {c-'N|BTh[-uEl%unLl4į۟6#fۆ]\%%-@[L;bjfژ S]AzCP J%;v=MK?2ksÑa=۱;fTզZ=~sӢ{7tN?}7ivkh,}KZ#,"+$ }^,h(]Rziպd1gej]PLžع BQo{b*=^-ٲv5b3H*Z[vqb6[?!kwǣ!wؚ#%[UG t o,\rfd:ң`/lȞM-oXvwcӔ#ιzC!HY~1߰{OK"mFgcv54oݺ}um sԘhU{vz{>_G32z-lID&C*1]]IRމS8W}"5FꤡT;B"1bi_:^'=z8؃f0]IB!De{oq>~56_Ztn+'wVExC&%*sYuTh>qD"}K^lNpSUY<@h"F>d"Tܷ1dvA.[䊽13\پqձe~9Mٓ}hUObrTS4׸۷7>zmffpYf=k;6N&RJoڦ}{U#~u#\'dUͻ[Zc vr5frZVl;c[&{Ī\ӫꆄ"ES?_n;47ɡNۖ Ru#zBRG8Їw?^{Դۿ'b{\L}ߣ/ vȉ5_gGZ8gD*-Dnݳ>bWHڿj2mٸe]ʹCԢպNJpgGk4Z|ׇn[ܴ%!Us:V߿ͭ*ЎtCY9Q8M}[,&IGL8%ijS&w,5wޯW;^<ؚa~\ 2onduԄF|{fėf"n:3%"/)u"=3_V+ z)]c3s̄8iLQl286شvB(f Q#\+Y0meqJv.Y'hI\0L͸b..r!=ix]6mʬ>$Ne !GY ;N[Ƨe6!2rFAPVgC`IXt!1 Q>E"z:0SyN$*<ʯ]lJE&M'ӂ SZڨ!NM.+I/85 d92+ :UHUZŦeږ ~2dfcX !yWv]bYH(8NDt&=>e?Chn"CQ2(r zS.k<MtSdS̼|Z : QI&%2ntGA:&Mc,D, DRNGtPtŴX"N%˲܈%M?L g4%s!]f=[": ㏏ Gӝ]U]1\JLlGŠ pC-.X}.lh)-QArS@^=$:kwXj~ct 6aHS~QS(ZjZoLS~ t*ՏQJ2ԡefǛQ3E8d zYN6+?]i=!g*PdÕT:Y.Gj egIJAB Uw3p:teZ暡B"S>e7/KUi%,.;9a97K@)ޝc)13NtK'Niƺ=<1lxkqty(e1v:!VɚmȲ%tPT AE [14W}6ڂn)HDTa>KoRH\eV?wl7*3"ΆtFN:@ыy"!o*{XHqd<؆qwieQ Ŗ^$ XENG8ɌU)տ{3HIuB8b~UeێxV]q OWP]q*$e㨊9aF/PeMr uʮOݩI|N&R9w5i{֏~EM ]6.{ (+J?ΐcIV*B0m,Գd__}am$1gͩdhLψD-("`JbΉ'pE?IJR(O`iTf*0>sd1ٴp0{BŽۿcR$dH).e@0Ӡq"۞4:F2 7+B!?(EG))R~m b&3F("kFaA"_碍9o6ˈ,+{f@33͕UWt)ʼ=͚dLU,s#NؔI"JF)S Xy+[av!Mv8e dヮ,JS/̝+xTc~MRg$]I?z~Km1T/;[aC|PX Tfo>gx?Y]\7x!&*/S3xtz;jv,k^޻i7 P3YN:6{Gb$GdURjkeUc>vիλ0/= cK~1Jmy_#)ǛH7&ۏ!+#آ]tUgn~8ygD͏oG) 8kLlΎmYV<5+b*>`?3dHz&֏ߵkW*4y޲tې'6?l\/$#+s(߃4yV >-:8̠A2[u*E"0&Mԃ :\YKWޟ4:FBN;n8/E ɵ*U5/xq͛ o-˺ ƎtiS=ڪGuO.J9191,u*ֵ)6Q$iOdL<} 'xԩSņ_wq7fӾr-MMM#30:J:蠈@@nD~dgFsN3vN;_zRK `!1,CHL&Q2gEAQ#d#qa@WR:!2=. ʡkƲx"!`)MMM "`+fzEND" & <Ӱ4VJ bYfO9Lr%HFXr7 9C*Xض,۱CLX˩T6!}O^un0O\eRfqA=|s1*qX5m.~Jt3P!♀ؼTY]|V&LxZ&WH t8dhP5+UR]Ρ-rX%ʡQ6*!S2]i {z:"jA隺uZ%,T :4͐Rvg7B7fWjhh[[ [z^ŠMGڑt"]MFmťF)$^IŒX%Js(dK2-om1u{@HLٻ$Mj!ȪDˣ{"ْ0hiYGlǓ:oPNUQDɒ" ElF0uэ*L,[ql&xU{#T Ǣh@"*XR믿0y3fΝ/R,_O~Cy/MOtRVLr?u35jԚ5k^}Uv\s8I'o?Ookk{/2&t, ,9r$\SSzj** -YdƌUUO<ą^in„ dwO SE;IBtC@|Jb4+}֬Ywu+{on;xcǎݷoG}?sY{ꪫ~=×\r?>R a\@__λIR{$I@{v )@{v'/[,-)~ AEt QSL㏏>s9GrF?yDE:WRd?=b˕RxJߟ~ɓ#57b1+UU .׿^SS(ʱ;gΜsz'pB#=H AEb^ D)QvK1"1@ уw}=tM'Ow/We]vooذaԯ~_} .7]{_{9H jΝʤIf͚E_ɹkD$[ 6}6%_3'G?~g=z۶m/R*o~sW3^z-oۼyW{swyaN? &444rSO͘1 /${ꩧ677 Yx+Qt~.]nݺE-[O8UU#Fx頪Ν[__o&%KiE~tPXYj'"%P+v+%_90S`s.0˗wN'Q!sB*ЪG9])"0T ( Gbz|)AQ;m(;"=;(%].Lս JtPD@E`)4 g3$U݊*P6T/ 0=|3'Q477s17n<|>7* |(*m[m;+%(ʝT}YDBc  Qp@50?\qկ>6: QU t#O$,뺑s80[O$kF޲xmN鲬xeUM#ogr0+*^T*E{2h3⣰4 ,%bwxJMѱP,7\\J4M33`WјjUi*  8Eg@}JnsITQJI1{J:t-Wk% ՃBRITL*ikC,l2,R^KDa=ɍbPH$::,x,znBL=ofi:o6,)UuPD@jNI'o?Ookk{s?!]NgqƨQ֬Yꫯu2k}Q:k#G_H:4٥6P:ƅ+QD*i#Iݒ&qI+)z} 9 gA >6SiǦ $y5y NW$ 3^1h_5?OoB'sfo/ӧrwD ZpV Hy}eeꪫ~=YG۷o'z}<=j$I{@駟~xo}[^E]D< Ufw͛5k]w%Sɽ{VWW{exs4j-Pn"y]wݞ={x:hjznZ__W@=4]C pR_9 Iv4Pb.|aHN,H(;8~@! Mt3y )~&1$e N%+tDJLQ>&͌Տp2͡ kX$C+i֏?؟.NBɓ# 믿~ƍX9m#F=邡[n?~vs9{p¯555tQis̙;wz '4Gx%+; t25K_zcǎ8AKVKxk)W![oyٳ+W.Zn7oģSHsgmoF1sڙ"ࣲJmS~A_H"~_} .K|]vewqnF ֯_O{+r/PGO~}+8l>xv+L4i֬YH5\H$z-t瞛nɟVXET @̀?S3f̸ Iz/BV$;ovO0_޷o}cVC 9oc9755Q~v7~/wޙ?%Kjjjf͚ӟAAp_Ġ"~SY^_%xcǎw}yQ{-ZtiO~_M>}޼ybu袋:GQ;5ydgڴi zoꪫmgx≍ƍ7 *0lÆ z!>YFؐ>*!;KT`(" 8.iD" )хfu%_<2i$zhsf! KJV6JQʁ:]nCZ3 _W!9KBz<2QPbV:X:xSS iegy*rzchmBVW{L!Sӂj8s \^r#}3m ZMJD5e Qi]I! u_@O9fĈ^𒞆.?s{$?)I/ҷn:v؜{/ .`8(gy?c=6mڴ3g.Zhƌ"q޽w߽@L* %B9SnW(95kK|8d3$CI>)247*Qb2m%¯YBVn1, vKnWl'|wڗķI2X:n"w4q]5=c%k)*9o>ٳ1 DP%G@ tN |#?9s搛{/+V_f}}ܹsׯ_?NJN4O>Yr=suםwyճgv?0am+"UHx㍴Fzwqb11lCҥKo7|!y䑔>bA ,D4 K$[t7fQčIB1:f"8%g;]d. Ol%$XI^lrH4u>%P"oQX*R0^b(? g1x`@EgiLcl#L)hdx%DoB ^"aFr9+ǜc=dz{:t>֖r?]q>򆇸0AY,Ϲ-iGjg4wڼ^^{mWp3 ѿvEQ?o}Kl~Yg-X`ȑvZMMի_}P(dɒ3flذaҤIht׮]UUU^!c?uԬ{W^y%3g3f˖-]g)… gϞM>/( /P43a„d2;|C !k 9s<_ոq_O>>̟?`֬Y?OO9&֚."[/^LҥKCO?neD㩭=cY5)Gy2XR8:wl}@ Ac1gX;"ĥ[z>~‘2_O=o|G}t1b)QmƎ}OjR^FҬbf&N^ve^\wuOS~bG3PM[]gIy< rYۻwouu-/[Z ]a_S 5ꪫ Hz$OI?35kL6mРA$ֽA:x+Wf-I:b _{/^oQ\%w_=˗/'9N$.?sR=ܷ~2[EZ)/djfwBX&&A+dr:@WH{"$+裏r-B"7ߜ>}zʼKEcSS8yH$rw^7nb^N/@G~OOV&5⏏?8 ⊳>[HA: r?Hk?sN}X ůrE!̙3w\jp J.Æ OGt)ď?o?CWi| e6Cϧv{/ ⤘I 9R$_NN{4۶x OrHIX4x⦛nZxqfwBXA n  Q -AdTN)IG!)qM|qǝ|*4o>s$/_6kGTW]uɧ'~;ߩ~ꩧ(yРA.䒫[j/~ j]zڵGXٳ#hѢnm޼y׿u]HĠ}{~oJ,2=s>(+{bŊ-[̟?̙۶mT7ߜsHzsϲ\5HUfwBt(t7bF, W޴!K.ʯڻ)|I'O.N,X qjWz(Is璲ZpBHOP!>lww]عs+2iҤYfQ⑜k&HD"[n%xGJx{<I9j$(,D{7Gգ.Wrr9DQe|!5a#A"% QQ" 03f6EfztwU] Ý/?ƍ,X ;wq֭pE裏^|t"t1Ǽ;t|s:SVf^T D{,~ Zg4M9c&s>lʾ3gΤ4ٿ755 ^{ۿ/~ WzΞ=C9)p]>,Nȑ#ǎ{+؀e]Fe(N2x 'xb2 : U K,L6)իWQm@R􆆆ŋѿӫ7n_/WEy)v>}믿N}"'N|Lw&(99OCh8Nۑc_jw0A@KϦ(v)N;m =W9J! 2m4Mӎ;c%):{;y_u҅WPQ .]b+`|_z" ;wJ^x!=, LӤy{D"tBG0[l׾=7M:ZjՍ7H1o߾t1e^jw i_0f3zUBORI0Jr4XVF4]DD2x`vKcۧS%h%y:묡CYu +g /!X.:5$9hz*T'$'O8Nwmс|vMN顦y%UUpDNOьɄ8GrjK-_TGT25ݦl!kl|]xtw._h* 9jSOVRћ@dBP:QA$b"7x[,cJT2mwƳtjt]#z&OD"0x 9-I1kDr.ϲk%RUKAg ǟ@{ qЋB^Hc=;|1'MJg}{o>II5SK^`4urNл,/;O/ 9[C{IaT3ϥۖkՎ?T*{c.5W2C6fomv5k׼g[NjkܹJ ÛGz^[Y>@+ .3͌s"=i;_u:mw~bt2=[>ti*=AtɈ.:-_EJJa{~[8¾ -~ Z4/ < #}enʞ׵y(o"?:M>d<y)>&=3)'`9%T,i&ιY2eh͝ܗr 诼ʽ޻v;v;8lذSp |Of͚E^zΝcƌ'^.]JkS7Yf]uUsٍ+W={FuWE]Z?N}]o}k= Ѹdɒ_~'t7o۹fHwG\r%Ρ%/KFހ]9`Ft!_Ɍ{(w'Rvw]o~sӦM[N馛ze=1/Sa.?OWaÆ{2[o~}p"5sR1cF_ K~ 'pgB?xY8NS]bśoS~ӟ?LuOUMS_5riӦ%1ywnٲ}:yYZ7XNqV:PhiisTz+SN9e2VZELtp=§z*mAі7Bbrr「?~<co;8p Ul-[m۶O?guwwIņ yf~q̞= /8gѣs'Pgt4F]Ӫ[[[mS8҃{8[˸EV\P'ҭ;R)%fy}':6 %ȹ(P9s/7x#{^4LYR1PpŚyI}kV{o8f ϧ윑ޞD"!~g|]㍥KO?):[)*c… ;vPptGA]w%ɦMuu宋?JG?rWT*ýc̪i:wO-Z4zhyr-Sroe͛7+zVOt8.wMwss*|I'QDJ֭{wӓI;K=#^G]]]M裏Wjnn.O>_FU˄g͚|ȝr%)_zgy&wף1::FE@')S@}-(P"}uM В\@4DD")o|}䜒V'+"/ ]_|))wq(bʒ(Ioذʌ1k\9J4˱Nٗn8 ڶm-[{b>ΫoܸK+Fm(YeDᵭmXԓO>q]gqJׯ? y'8ފFGQ/9s]\_~'R;MMMr:wǡsɒ%|GrJx׮]ӧOk&{^zF5y7x2?n8 O<â\+}ꩧ({[z5- 2ޠ~:OLAC~СCi-r%̘1W^JI^cg}#O]S@I)S{׿@-:lݺAƏ$Nn\v)<_*vWˉo~]{>^xҥKzKsit8Ac:ƺ曝sTO ]^/N0N'ߡ4]۾}{)PI!O04ŋwy.U) 621+=H]vΝ;kjj(Rz2ȑ#O 27裏CAsZ._UnF: hnn۷رc}Y 26luuםs9uuu4w޹yzilڴ)@Ѿ+GӧUK/K+F(PΤZfΜ9o޼I&ݻ_tu4WD#F\~zԩSЛ|ݻwâ0:gϦ㕳>>(nݺu/}]sK~РAtwm}ߧ$۶m;3͍@Gu 8y>,c-:#騀K:&0:8[l>gΜnzI4+wE6,@-h {_D(C_)dOQV.VkpN.CS.siD"Y2HHi-jڷR"AohhhllL̿ qm7'tw Ћ\ dO(N --#H42Z,g>M$RSSSMuMmmm<߱c|u^&O9t@ C(Xmw봶ҿrz^ʝ80peY{ve>c7fed؆E@P0"Q%( Ty@TL(FM^|ȑ#ٳuÇJ]c< F$$Eq èqwwqA@;w37z)t]4=tAK=֋A(RU HTZޚܲ?UMz?ustzA|7n\jU,[z5hOϜ90 *@9HYׯߛod9ǍkQS-dܹr:߿{q+2r)޴iՐfYhs׮XbT36˖-۶m駟WwmXBnUܵX׿WNZڇit'N-i SrL_n],\xrx]YW,\1U2ݬ L&0|y흭 ݡtW35mS3BIn D99sP+ʈ1 .ͻk.g;K[[ۺux ݜf̘AsC q֏+wŋ]CrC3fw-vj^z~Æ K9_ve??~2 w]G)U!$..6xT8"i bfC;RfF|+ ۜi gqN+ʄ2[T*E w>z…_G}Z;bŊN;Q&L0yI&;bQ$+:UG}n);tG<3dPԼfrk1sڥ۰ :D4V}B[ZZb];N{%kǮZk}{8=R#ijmL>兯  gqʦׯW7yݻoذaʕϟ6m"\wu9,k'vJ4mkk[`AO>dv.[ Cl6!AYMi4pocg}V<{ltϙ쳿-\׮Љ@x`ʕ֭8rȱc޽{ɒ%'O6l6nܸz꺺:*oɿΜ9I/{p#F\~zԩSs˗SĉK4 EA]s5v}m۶38}vmXB)߱#VGrKwSO#2XTQ&k|bd? %"O5,xH]]bVjgEn{39<^}@˓8u_0 \t]Қ4h)j zb˨}h~hN oTCrrgIef(9f4?Q.=eos\)d(|SOuv-c\~}t>4geMD(|?]vg^[)݆U!$dl[S&QXQ%7-Sg$0G|.+u~pL؊c'-Wr. Ec9)Ec@TYsA 2+Nrz..Bho5C~N.Y,z3]H8~!-M4kLL/@q,8&jo#JP"?rݯ@t.. !C(PPrvK0.nW;K*՚X`S4 S,UCf^rU3gg\nt]hNhv^s@_g:᧸ KhȈ.aqWٺ<@֖x[V{Aw̳O-#úyUU)6\xm5:6ɃCEh|q=_]Iqt* RD{ӯ-%0DaG gTѾjGsM/jr?ug~s!퐯XjkjzɮA9_s8)NQ^-=cx lFwwI'Q=:B!mw/\ w/JteD4#Hf#a t=JG$ʔ29zʸƤ?[,Q$h[F(󵔝쑈rW  TەNŌ.͎ ~^0*+*Rʸ9Xn޳T wS_W_}u򫏂!ɎخT8Do=IT=58u&2J$C.ǽ5cY+!U8Eq)U_y啑HSNJytGq&Yf9 :n9묳RMMMky޼y~m6jԨ.U+Vvi&L0yI&;6geqEdkt Щ΀^xyv!C(-JܵXmXUmmmE~>OJZ%.. s,X=דO>?=AZScc#ދ.hΜ9>dȑ~{7lذrO6MT(sf7 lV7j:c+Q,Ū߯/ݾBŗ*wUz79BYenKW+T~-tM[nݲe R=ٝ^xK.}衇.hK>s_2}KGuԘ1cssϛ7/;Ϛ5{|/aӶV={:牖LSr~V]B\.\8bĈ/[o:uwܹ|ݻwÉ'vjiƍ[zAr֬YS> 8E䦦^xaɒ%'O6lX*ڸq#: ٳ,Z#ӧ2>[l?9sm3O.\=t#>N#KIF ikk vaQ4;qR8{Z0kZr^KK yCڽk޽ }=P 9( hoD_?_OUR2x-/c977R(P%B2:+g|( /)S3E]z #v!76\mXyʈU y<\BE휠iW`-9#J[!}]8phgg$=D?rmuTW4e:+/$·Ȱج81qusAD` `H$Rf}n{א1v>g.J;ɧRqP$TR;n MHQh* ',(X!ͳsNxۑW;(Tђ-q. _UH8/X`[߲ݼ~Lu tZZviټax\jD555\svsln+fWU䡅P-i`SİCR`΅-m=ZHuu5W^;ތqak)E v4q#Ocu^23 ;Suvr #kϷ%y.S츣@SzxS8?k2|8 +MOJSIJn)9QN-3flg ZGW:"-{(e+VM19s1휦ps6:ÕFn\TȵprS"zгKtV&3גC/;ped7 Eɪ:pnvxE4Ymͥ_TvJ.vtʗ IrɜYQr? @!_!c"шZ82"Sh${]#frP#C;/R`QfqFÜ&s&]tF.ڿ=Ν; /Y櫶s=*0Wx8ΗkJ tsծyX,GI9yKGJ:[7䔃&sЂC@PHnhw8ٸG?T W8?gG/4C%A :BAu KS㠇GӁ^kr~? @@!C(tvJcV__o+w]{ޛڡ;:5=2/#xtt a(rWҿrע[~ꈉyrt}6P0"%Ke]xb}]r*:aD%Lj+ƾçrt :BLStMt\)wm*1c[Kk!C :B!J_>:@~etrעb8}z @y !4z =a'_|EУSYWޚ@@@P0"%YJT.UU[Z_+P< !HTIEڵ{W"@> @y !T5cf2&O/w^7( (8훑4i0H$yeoa%(9mhh(Z T!kSu{EYzF tieYɤ݋ Ty2_!>% [/ v|We!$tL錖J_rTھMDu\zա CUnD %GGL2: p= d,4^(g2c&9>MLM+S^]]]@?3Hl d#r d 4z 444tE  Q;z6u#@UB$]VDт>B@P0=^8I|`D t:B?@qJ%]LW!C(qu7(%t:B*jKZ/QڒJ[ʢ9KO%xʾS{Cޒ0Tr K(}B@!C(dR %2;fΒT`P ι%y,W;.O9N% :eFU1#EZ]S3rvӆkd *k.":oIŵ%i mg慓:$t:N)V6%3 soKAsVx$ C@P0ʹsKw tފj]hh@@!C(Y?j{T bmEm_s ! =(-n/Ԃh@G̏7TέBJ#tGJ|%?"Z t=P <::B-P"|(􆆆r*R nD]L8I|`@ !Z 2VU$AO$ T t3.w2q˲4.P!!tUăQ@߳gOB4т%b'tt:B:qj/#tAD>@@P@(y(Z/ 8IJ |麢'A-oMb C(zJJ#tGJAG@!@(FUJe'tt:Pxtt:ZD$Q Tt}4p(BAQB@!@(JP"r*:F@d2d"N'Nuu OD/ *wrDbHJWX.t3aJ|`т%>B@PH:/ R:Fq C(dLU o߾rW*:(Tp":GtG TGH- qSj߿߶nEJ]뫽51#jhaTUUܹse@7߷>ӧOB@!C(׏zM,rIGn:O+kwx0`/\ztaMMM'pBB@!C(F'5M1/+]}*[uu#] V[[[*@@@P@t(Mjk6m @rW*WWWwԷ] f:]*@XV[k[[<>c WO2ܕJF@_YEbuXۿ^JA@@P0M\|ctFI3ͭ_Dc6m15`LX+J{6oSO*wB C(ioTM5Tkl)ǿWx]5t݈(Jܵއo[[2yҸ?__.)k|۝+UU4{8>> η?tkomr͢$A(>iHt֏WG ON0kӉkO)-O] C(ĪjZٳ7LiF:tT4bhD@@Pqt]uWa)dLӲ2ݪe[:hbY:]= *ʄ2ݫ9*S2JT4Jv]j#Zmm}o#o!f_qi :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@BEIENDB`qtoctave-0.10.1/simple_rcs/design/esquema_ventana.odg0000644000175000017500000011356511511434226021711 0ustar lucaslucasPKd8.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKd8Configurations2/statusbar/PKd8'Configurations2/accelerator/current.xmlPKPKd8Configurations2/floater/PKd8Configurations2/popupmenu/PKd8Configurations2/progressbar/PKd8Configurations2/menubar/PKd8Configurations2/toolbar/PKd8Configurations2/images/Bitmaps/PKd8vh[[-Pictures/1000000000000202000001CA5D7C7085.pngPNG  IHDRt[IDATx$G}i^N{A:N (!~6KF 1Lg$ IA.tiwBޞNvgwfըݿ_~]޻8/xN:m]9OشwڼK.{G??yIcro>~{N8emv 3.wuc0oR¯|Cn^. foR?s{{~vu_ҧ{•+>]TS7)'>o?k9(/ <ݻ=Ji-'s>o_|8?e/{d{s毰l7HqTױ=aFEtT2V(Ze=>N<-yO?<~֬=j510(2U%ha;KB =́yy:|ᣏm~D0=(9k9*dYdljNf @Ugu}ua=RuZP;gnT0X,߱FMW'c1eUm&3 fZR_{N nݾMa~.W ?wl](:3Jͪ˟[ j|ڵ]R[mPL]{L1ǝ|xV,v ]?wAO]HH)g\6 6梆i*˪/R4RџڵހtEĿ}y|uGK2:Db^X<1OP)W4MGW9q(|1_n`Ge驡>'"x_wuE1Edh|Yq])w(; W}k?zW~+ߟ~ܗ>~׷<M1}kOgڴ5@*H΋_J-')QUv ̔珮|qZ 5R_/=n5; }|r6k5u qn5g^{~M1bn(S^x;?Hahw}>7_c }Lߌ-|Ǟ{p~=O\EKWjjJ]+Q.ip.~#,^֍O9xY]'CUmCjO+^p7%X')TnXXro`ѱg߼]NBeBT\IJgNAqWJ.g"?}n 4#]J,G4[ONQ8ynx{cL0w:7vrr&wSR<~K|ǃ~m gs*/}ǟx*mx['{+p?x.xّ[kTs߫ oW玜pl#6"Ȯgs/<|yU /^uώy͊b)5>P;ݵY𸕵Coݼu 'پH!_(;˜gcS%ŝvV7$gW>'Yg]~7=bwK|ߒ%TSN?zc뗭9%h^zq`G R?6suW^"OYAx$7W%r[ڀ3y~p~&j qo`1=i; L&56z5+W>q;dK_%SO)7}Wǚ{޾} RΙÇϟO>3K.MWm˱mBP(仮,td^nǎU+ュ3>ة¡ѝO84^3Z_἗<ի{Uo~^OܿSپr;}v+%5}Ok-tO)>gM/ͫO;V.Q֕KFlo?񆗬: N,{lf #GK^}[y|fwz,i]Ƃ '4Oxg9`ҽZ=\sOtm~1ɥk#k^ ޜT#j4][ۮ'lTD>Apⱨ`l/o2f?m~\7u^\}71EՐӽpH=/iُI62BNLCfmdk~"wJO{/;iΥ3[< _.]4bBE m/)m쮹˖ϙkfγ|` ȱ'lNlY} G{NtĺW9Gn;dȳr×_=#ƅß倩漥ru{]t^0#T^7]Uޝb='z겗۴3Wև=c,8,`GH 4Igx"Ejk$7r2RQE{=k:g{AZYiuyMgV`i5PpG޷St勾LuhVUV>MsKoV Waʶ+7~d5*{^SN^? CC . ~<1_,MT2HL .~=|ct )G%π |4R;- SbU+&RZ#*\מUf/Qs R__ҳ7vӡS~}MVų r4 eqt?J%H?y͋uK`Oc?/rJ$_ ZĜDze'Xl]O(7-z+' =~l+]=r1/ZJG5_,Zm]-F73_ޚ|TeY*(J!9QUƿW#EE2GǎW8xYG6w[6r2ϔ;Y?(e`#0+W([̶,/{ՉoR|x4zܻ=?yi3?%v׆ïyË햢-{E=m_IZc,;ſOҒuO^S{~v)EZ`e_AV^o\/DNR kj,[4][_t՟zİ_92do+g?hj}?XP|y/[oUɟX'79 ?{L}^;bAŕ:Zݱg|dՊ0O^{}!Z`eٍNb)~)k_XԘU- J9~k >=>rz,T<`Gf[~к^׿LHkp/9_ ?_2$d7̼#Q[_Յr3łFJͽ0~uׇ}JI:wLXq\ɋ_+!v. l.B?Y>_T\Jmg|gʑ'|[WQ.5D*XO޼cϸ>X7m;6o}a73'>;+,?W;s];̗~~lDx!qLiaJ #&o[-%x >||p͍_&.3H|T?әؾ&꾞B:T<0\)7Ŗ_sx/2h\Im`}숹\pEvgJjwY%RţuLϙzdNUj 7($Jwaid"FJ̥ ݶ\SUb/+-.^Q /NiX⥣E:/Σh324oM:;EK;4ʱ:O}DFi"S f0,xU0o-,!{~hzRnyO;]>n2jHoš7+l8ʉ[9IFcPPLM mh`us$y{ 0$ t0TU۹z/mT/~E 1ѩq\Ǖ#b9,,׼*-oMuR:h F6@\P~^w6HU&?nfUc9UZ={?Brt)[t{9ZDy.%Ww|%̂RAR>)RٚKKL({m.9z5jΒIX*ˏ=A54D!Mv"Q-N NVL,ǩk׏eis"Yăm<t;]7C6eu]4Q!/:h<2K.$ؑoW$t_B SRNIW5χ8Rʝ:ʵVSįZ-Rgb(E>w-TM#Hb?A;ȓ^4j[Po6Qs}`NUj3I석j]xƯ&+lIi WJ&$@KcM]!K GdQ('' GN-? hc SyIGOt:v{YJ<J(I!g؝t|y"͋xe&"3_e5˶C7PqҲ G 1ܨ W]wyljf. g='F\-lNˢ-;q# #S<-P.V *ln0<ͬ+MUp~A"m[O|uj5ռS(;uIZ'BI)Sv!Uڤ(~ȡ)W4굑s^s̍DUcժ}JxN۹':# >U;u#m@&oF|17Ƽxz eȩjMJabuDz CO!F?*N|8M /ǭ(ϡުk nhq_ yje%~|Pԕ>D\6]g|/ -dUrVsq$JN;F*vqԶJETc!蔬>ZUa2tRp,m)cQi%,uxVN\OCmA}2H H_Z=o`6}1tK.8_:n95O4tSǕ[M֚DqbE׎eS0qy-XPV=汼Ke#U3IY b؎㹾dIa)Uh5*_iȐKKxt?|&VIuxhn2{9MvqxAz4tE a?j3I m bx+>eM]b'EjuaHvYV.BCRzR=l0:!a*_m?yru݊e-dŋ-ܝ, $1WR- Ia;V•U* I6OET΋x{Gbr k9BmObEjS/xN/.NG2ࡡ5OݣzH`4jb 9h[9|k*FЍZz xO$CJ(J@V}YL 5N6wQ|sBam4H7!5j1h\uCyON">:v}oxcX}9b+@ }-BZ>s\K7@;s9?_>N. ZP"7f32& ]ǥoC].ry(W.KŒ•oYRij1#ض؁9"qlI]Lӌ$=<(T*x+2ضEUbS:i+HJXgFqW8M!Dm}}SUc'c SR'30]Bf&)Ds"oZ:"fV:)DJVRR'nM2l9N>_~8ZX,Qʹ| e"c£:9iM!J2ݹl߱]Vׂ҂HfkUE tsAEMi!].0VE> ݠs˩&5G=9 \Tg+lDGr_8u3 d|ettte{`tF4*Er|疫M"IV3Mؾz]S!'H*vY+rVBFC6 XbM!%E lٲ^PӳDU,+(V 2=_9<DѵUE0BAs;!52,|?=KʷX, &j_Ok)<,zI`“n}{[L^N0J)|29=[UU&'W* _ଡ5tݠzB^V">.G燷|\I 5/g෽:䊧5E܏BxnԖn聺'LìjJt\8GXV&< zbZҒJq&19|D^tMSzYZ>|}MxbSL!<+Xm,a-Wݎ@!R|᯦ JZLtЅ`(_|2iRI4-$ Ph9 YWbP(NOWJ-$f RWuOBrw|\ O4:bSx3~-ƴ9/|u0)$Wu\l`;2)TO@L"V L )([19p.fۖ XhW+fF  R\H^))oe {\S0ChWypH!j)ӱ7p=:4oGN\1&{qS*"`/&q _tE2RHڀ}{y$bl4/n 8ēfB.` m[7RJ;H!iLFb ]SgbYf@ڀW3"Uw`1 _sm]{mH07"`AF 5XS #B8`A 57"`AF)C "p 0H!j)oD PH!x0EӿSu=ϛi)@_i=/"c60̙mg,}3- tpGfB0E А3 LBHw"R6ryT*QpeM\۶]ץJM P՞)"R6ujjf`ʞ юBR'BVQ4%uU \2nrGufۖ8'(UvR̞OTT?}ju,kzHRVhI!s+$eQ"WgT4sj]tPNkƔ"`x 4cftk>gL%MJyϤUB)gX*jj2n0UQP( ~MJeOdfHݫ*q_Tב&0B,$u,R_t.KF?ʒ@>=P;uI_<{dH_˟k.gBBJFZ)bR4=0BYVw IEt]iE=)nKUgE,VoکG˄P"DRd* ЇLӭ\M;cu RlW|>g`T,s]k{r e0!sBj8ٰP:6r"RHOrb؝.2ךזL\жP P(OshI}$m{B4r ȲJ<7̔IF~2藪eM~wry˪ !y ӊ̜m&(ÎIVjj 3j.\w\OT*_ÕI۞E3xƯ0kH!f(>gzT$  C_D LBf<7H_D AUUDZ5mEp]G>] "RSDX A= }t})Hw\˶=}1R2M_i0U'2V*eC();}7NZ%#/&lvAUu_iBGI:Bjufd "m,r]kF"<_dt_۶8 be}liEH (1:K4ӲVF)C "p GYo,ȇz"GCIrbğS*)@* #B8`A 5Oq]?_\60ڃĶ-4ɔH!aiZX=n{b)oB/ @Q)W CʰBQMHbڶ'Jb5kzLjHU⑯m֜V$-m{hA SۥRi%S!6t T{BCM IafiGk@[bB l dyqϴ i<'d@P]6J{iAh9Lf=  i) ģUv-Y:bP[0#ȧ)iA@_@6w"R$zxfj4LKf? ?E  L1{M"z`U~v)'>%9ZJ``Ї6`RBK:sd?:E鰨*+3(>"1>6>rla_8EL-A.`o6 ,X<}t%/|gJ@OR m۪:0L+7E djuiZJBz!V<'WRYlHPY ┇bٖc;2Ju3gJM~U>ErTTj|31Xr*(NeMӤ (Cb _>O,Fz/ؽs =i: Kzn9IwyM~)(%D$OP-.r%If*~h\[7Iۋ)H,>SeJ[ZAEpw>hd>AJt@_o=nfҼK0m6)Rh>Ƚ.|ڕ~=t7kFe %MxCCR; 3@O:vj iI铟!ZRO"pɑ"4o@i4E ހRq+34y~o74.D^B"j}O )O 2PAHD*&rz^CM!Ld%"(Exȷ ~= D &`DX 3 MC r| ز,9""Gr##CE@JcPt\mV4<՚ePBU6$R[=r3 [@ *Ycoը5D#SN>7"lC2zrDi/@SP (gLJe7g( ZR.W+հ.V͊C)O0|8 *H!9 !B$aQI$t#(?%H!:򫔇( |ʙYÂO|3}Gz O+g/> }W N|kInLxSɀNK~5mHifLK>fgN70 1`x@P)bH0Sa?0 R4znF 00i*@H0Sd}?z4~ù?70 xn}(x3')0E )+Sy x, 0eȑ%my9RR$de+w:͟䧈ժ}l|t)T)W֍v" :q-ˉo]os8#lD-;Ҫ"5E! !QN  BjnbX*HW&^xPHe\m!EFyHmʅMP79/#Oق IO׳xYڦ)> 32Cvq!vDPxA,trT'ϕ) Ler_T$pƋg4EZ=;*ަ:e=Bm-Mr |n%?\4Qz0VO|2 % _tyF2,pdvT@S<+&ROVmI_PGRi&$-&;2 @OL'k(KHŗ-<iP6Y?U(}%4;/9Ejun_|%)1-?@jɖ@Ň͆|-]b=iyj#E0,SS6ȓ8yYF,hÏn/j,J븎Kz9[7F ߍt+lm?l9@JcDA|itWy<::p}e75V<)9$2Hp~%vt[:Q5Ֆ%H!l;b$uH*}p8]ȝ`65lQA pLD,N;mthG t!jZSL!+m;aM3~3ƒBm&p=لw_0s@OI=q鎱J- +rI$ޮ~Zԭ3eN#=֌rrU*%LW%r[+impxx8lt-kȐ+f}ao x1`Ph70 1`6o`*)bH^?0 RT)bH^)b@)b 6lU5_M+Vϓa7ho)Vɒw.;6 #BreY*MNOe,5 2L=Z)Rh)g 0}m$*YHM**/?t@iqR'OsЉ) lF oAyM{RI|7KoJ0 ]7"Lh[\.O'3"Z?0PxgY5\4tceMd"?i yQUqd3-T3|@WM _ U05Ru]rr,CV)Q<8l Er\,Sq2x_˫ո fٶ8|pCuG>kf::E>TAAj/i?0Ǹ U :f~<)Nxt<$]R7L#<8v.˨+bR*T*K4i% ,`cRPbC &WQ2ɑB͗s 45ԭs;d#V+"M(5|BSIfR_7!}XA5q]Re*k{4P4y'\u3ԱtjX]_WĘx=Nr "|Rǎ8GRi|\Dd/WZ*0"Bc*ZPFMS)LTU>  SKs k6zE}LRKZCФTY mj &}) *"w:J%M$Ld8 y|v}ӊA\N*iPe62 83oLK59QJ!'$t`ä>L#8I(O'0zHi.4H|hѝ1e|I[3'|"7~ztKuݞ>x)SfX _;:u!r8%)j,ASГ;69.sK-sHP23-`ZuPzzYs t,0R6d<XG?͑B{.bFB'O} Po5 ѼV 0H!j)oD P)+WO;u鸊Wm%#Ryۤj?βX'7lc6X2 !ڄ_V咚"={{iy3 !HG[fvASѵm?u}~u C5hhtV飐fg ܻSe1]crF"Tϛ+Q!ѴFU 0=H dMBK~V92K24Ttj"=C ^Ő]#f n$)?DD۴|7l{oip0DVhSVa# 'l]f-1ȝJ/BZL6)][eMrwl#}s)Rh1kߒ]lyM! > 0)oH!x0aB0 R #B8`A 57"`AF)C "p 0H!j)oD PH!x0 RD aB0 R #B8`A 57"`AF)C "p 0H!FD\$i) PH!j!eE? # ,~upnx0tq] +^x0\~ك:T pѣGiN jFsFF07Ci ~gyj4^o|a x0,[.:xp=yAM77ÂiBa9+- mn7 x0 7CDx0 ;OH74YO`^p7~`"b07CD;6@7D l`aRlc S2cODS?2E)Lvl@dn@%;>_}̙?KydBߞ`>S|MUuOT2֍j2ryπ11- ^ACL~iO|s?.&N4<[֓&ygQ\OIENDB`PKd8 content.xmlY]n6~) @o'gآOY @Z4IR@D{7I:$%c[)kAlk 9PoJTLT3? cߣU{ )xYҪ RS:󗲚 Vj੨iyM]Ԍe-z7t u=_4>DPgR]\ u(X/k԰Ql8>E(Z: ,.2}K rSQ&Q-iƧnHղS9Ԡ֒*t0ukU Vת8B3^ 9Xg/ JF\5#DѼ}zJC=diZ/Cf7q<쵃^%kt$#{EiK"@t%Du!lsVh?z| ZR v̨YѢ :9nOx T2M 9LR&ӁuvV+%l6{[#̻g8f>5؂V۠F㮅C%*H1=^`,de8+L+#}Jw»ްB n/KVi] 1,'qoʹec.zKob\z-$V@f cY,B@"'i2kšul^ǒ =47i4oZBuX@kF #d{[  g % Eo70_e6ⷈ ճ[\`L=>A>.Hj"QbBdc6&VA{A>er[͗Ƴ%շ)O3~cٟJ:A2r.xRQ*u-m9|ecwm:qwm,$Ig@ou 6$s♟ Isf)y_o?ƓqXWߺ6ZoiYY&kS }|K9% Aר"ƥn5N<5y]3=+ta69l;yiFə='I0i+]z+wG;qgC{}P}͉P%,j <4l$S;"sԠے$(&Fe(Şu_]]nd|s'@Ξ^6s;z/`j~;E}BQn֒dE|MGjN8c@dqQ&X y3hBVd/2JIP\ȡ`a{1 N|QHd6@ #)Ţ %X,(:BDS\beI 8a2hP> JD2Q(a鏿*$ԣ1(@sC9xB+%_$jx% T ,g~}hŅleM}-džtPЮI{_Ⱦl6(,M JY1Q*q҆JJ>-ܴud+V56{az!@EՆUQW8 KX}زAӚRdJʑPme׆z gF7rC`BȳIFq(dOreH4+Pj6 {S.6 n]WRNjjBEF)-pYfn?V[}-~huJlrNCX0C:w&,\ %HlS2S !o8J&gD*9B*z6WχsulMNOψui=D7V6y75E: Xym@}Tȇsw98ݦVې6 WV;jLHwʩ rS8˖+;uG~Ҋ?nsD> 3%>ɣhw ЁАjIL/cB-J.Ō--!J[-**/pN=ƉcJpGi3Ś(mdk n^3л9)Ylχl&ɞgK™׎'/B<#rӒz5vZ ɭwWy`-==vn,ExDN- },뎓d`CZҀHx||=={1oo-B=։ u]drRW*C" A&]N$xF=>ӽ%֔YY&ѭD }:}58ұk`R}}}|=s3=s3_IϬwmr_4K]c3>+yk#hNFmpgIv `CB]B6#FjRNޟ~T]Tee_DA5sgG `f.K Gݖe|rCu Ĭ/ntkWoU @8~1lH}7 0H`+"li_"bK2X}P y.V.P*TBn/CLrHTl.:b[ڮCrFh\NơAɃS^PP%iŮJ\bzQWPKm=ζEPKd8Ykkmeta.xml OpenOffice.org/2.4$Linux OpenOffice.org_project/680m12$Build-92862008-07-10T14:28:212008-07-10T14:32:371PT4M19SPKd8Thumbnails/thumbnail.pngygXSݳwW"RC "U"EzHAx BH &.JP}{O{Y77k- ؅kh@3+3v჻²7r8Rͳ򜗓/]6jqa^c_|? J*e8d-$v<eb0'&<.#Rw98jSfC%W Oauekujӈ  p,/'#DgsL[t@^fYM~'Zjp}ʣ!2h`F}jps~ke`~w+C>A!T ᗌYj7JnylS#prs# Z*H׾rL*VAf%x^~xKz0"n9E:zxĝD}ڱC/^<Y(ey7(Y *qRpe_#о"_YAa!0\4DŴi `D9}Z \*SC,=׍4kES'>S8it|;~c B$ z@M pϹW:"R>!?1o8Q$i36CGQxO_FfR)QGOۘΐlJDR蔓5u JKw=agڏLJ ˁA;XP*"EdQW>T8A>8{;72ee zoL@e lZ dKڧ32y`}>.s|6lFH0$x sy Զ5hbCC\ 4T-LXSP8o_ O W)pȉ?WIoV;}t-$AC5餚 %}|؍|/^u q!fuXD9tF=im ^Gv??'D_kI nDѬE+w [2/I*T{" y9S^eX 𽪫}f_x^npkük2ҹM bQgF$|&LE%Y+IzpkMrXmR/ |y>2]Cn *Jo>381w86q&yw~e7U~׋wt];3g,φV$22Í$}"HJ՞uiRd53zdKYVz28CR[gQeRH}80jI0[Ԏ*'D7c~?p:I!;/ً৭P]^pդ?>6rNC D bI2YVfx,-DY-KEG3FtxX#ؿ ;{TgL {H@ڇ=^x'լ-wcKH×}$5NdN0(/H|E]󣆦epbǝ nr8 "OڇPNP/gDPv'{m桖 =cЮD} ]s}[UJ'mLaz$PyG͢}>솹krM_VѰ?wkQ:9YutV ,,뱪NtR~ϼ1R UkI,+0-uv6?߿r p~u֦|@]п&yc'%6&5s=Pb-B6bdFd&NBq56pFz?ӿM@`dj!.;FygȡwG`%ݺ{NU_n:u+L|߬)5h j&Oè/󛚴m+2d&74.Lh1t!+_GsB=3=b [HGi7('X.o6;4 x_--[$l'֯ya%6oT-m+toWp2H.Yb̾dq9z5̵/v ^R^.6E7uYtcs S8/b<%VE8-ɜWM>jOoC Hڤ$#Cʑl2mQzZc82gWNwBT}dRp6MoO wg7'>I"dxNCڥ𩴠14-طX:_[}pr[e?o)5O6s<[Z^up=y]66_vd:5hh#tr!םqp>X;'hװjE? @j ]5.s YDI 8՗m z&k52Ο\)[hR:2ja/sMio=wRTUf9O6s[|vyG_dV( D0 @}7% %\ zYpvn<YBȕ03Y*ޗ .}muKlO~"p't.| &ϽEt?k'C Mz16JF:z~!&3r̎U0h[;}>J[@_v5T:j#sa]on6 Mdm̲qreF 5ڿ`t" ֵ RlJ&Y6YiU+22~U^yR8?Z|_˅+,C5v *L\çA:@rW!h2a1z w2h&Xh( ѭlġ{KŦo(0줕^]J}}KiZoY#O zsxYq-#/ uWXFÂ8b;\Ntr8ߚk䂨/Zx%.C1W,k\1Ja{'*m n" bF39VLv)8--y0N,iKr]ki]@|CGddE(ϣeZO-`esubw[auN:;wgOU9. }$n`L! iQ$f[tQGMy*m$xr)Kv6i}xF˰3Y ec4 `c܈lk(xt}c]^:luq}/FODݽQv,O!F;#-{#^rhpX Lj8?1Y^dY<Cz\(/jhn| >^05\=( YS"Z%qF6'Ū HMӼ isؑ#n%d쐱.Dsu-KU˦׋F_Pf7\[[Q[COtAt"ׂdC;ö{{{oտa>84nڒ3dh'amF[İ-is͗^&r/R1 _&iɱVʐ[ ]PIיNWluZ+=XwRz5Nm-ex8T 4UY)r,z]e վ5fN7[r1<3]'UtR̂/?3MR!tfVnXυ~͕.isRc|%> e`ceoEhCPP0;Ԩ' n}2D5C(:/}=v~]礳f9:gmoq[s(ή=Ju!PBema7IՠP2"'?ѷN+PKK[CsM_=zuTwW*Bw)a'֧2Kw@BՂaIHo*wl薽E*WQxC "%sZR^Tַ !!YH|T獡9vHO5b,v9חÛ? !c_dޞP OGVǙYٙZ(:'G 5y7F(41Zyߝb6مMyŊ.elk94A<)po1VcCln:r(Xzv87{ &t^CdqS^6,gI |jyɄ4@р0.ayI~ŵ(0h`86:.ܮ쉭.09>1eC7­ .ygؚoXa$ oO|{Fw\cuNC{NHPblieƨm~nrѦG#+BU\Y3O_ZLFUyOVH(P|ܢ%s3.4jܓ(ڡ=HG~8swٓFW8oK٩6aR@˒Œ Ng;I+E2wJd`GEgLҎn_wH @f$IyqCiio=̈́ۅL 'hMI/Kuho1L6L:݅ ޢ.oRizwLq'ʬYo. rlog|6 X}6|W弍)jc/.4*\Y!MkDhMD0ǿ5ѵg0T.?f m|{VPk|LYц@ ԆyUk9i>Z앣vK{]eEcHCgVhF`4b=M_n\O>RY |G50ӯs~PK )1PKd8 settings.xmlZ[s6~x> a;@B,!4mo>5J¤,؉#NyŖs#W_"r \`F[^YiJ؇f$*+TKđNEs%6X4)@4d1Ͷ![?y!>qZ].cjjnB\p{6EQ֫3^֊OjjaRK,3Y!0zo7ݘ}*Q"mkyJ3'xY~ LۼXTziqU2qQEiqq^p~8-_P\4v`m,G_`GL!nwq Dz;3 (!bBQ X'R]4!}6#&L|\<,,-GqGb酺B1J_^*\ rԥu9lsDd!5Pfjl+ǷAonSOk~LQiFQ f<;N' 3U'QFbjWx| V~%QTEٱ2#UJTUݭ5HXXs0G v"yC jg~"=+O4IJ:A ^ZWBnY#e9 XYxhwHja,l>N/WM@L'n]?P9u&Q͘Ӡ|(Opkp2I7}jmsb'u8e(x0Jv!$toQ?%g\eX!GbDj<,wp̩?V9qVS7BDY2V/ R dR}#{#Lp 7[yK8PIeh QLUkXMYj?ɴPKfIf#PKd8META-INF/manifest.xmlQo +-jb4l.{ރJBp?jvY֥H<*kJ6,#^d۷тWOFURqdq۰d TX$ */Z)+a'sv^L8G/k/AIdwB9Aq{ S6TN9;!2xfdrWA HwAHv =5 QI=kޞ<\v2w~LWB53>yGxkDѨO0* (ȵ. =g_fz{؝ٝٞ~Cuuuu_Uua1vaB&t`B&t`B&t`B&t`B&t`B&t`B&tȬ=Ec;5U5% =czQU~EQ@OᎴdY:5;nr9R=C+N2N2 4!P9C[7zҋ;兿9LCI5DdVxGш1~N=tuwPx^_%N~8:bԸ+NK+ۺ/=1Z׏?gk@Sk?ۯmE>!D ]4Y^RdzĒYJyA4 cK@ <_RZ Y[YH ?7@Eqe5%Y9X3XSYUҪ5蚦[;}̬ ][p,q(SCYdT8^}Hp5 pFT,VWW_=Wʬ˪3ڳct])BA$BW,ʠ2JƮ$9.]t$?E iOeHE <$)N& a!Bo;آya%f@=zq\+`»X#v}$Mf;`eV2ylڿ>rG}w>yNJc5K>s &n|]w}|A@3̬C,oۆ /^`_|sѢEǏ!,ˡP&θMhYGOϛ7 q88EG:3QUUѺub#N1~zMF+%m 4df 빧 ={>(zIt6JD< @n@2m>W=zΝ;!r˖-&Mv=rHz^gئͦ[!ΕApI(5I%L8FЛ8I̾%>` '[! /mgөw`0piMHRz:X͛7ϝ;W_idiiiwww @ޮ4q5]TEQ%8~u\~XY,v(P^B/HY,QGG\KC[c(pzR=<ڼ<>l̙3믿=+-*)M@"-^2M7 )K/瞳XEKk֬kz/6A qD^ܜ]ѦFX_-wEQ:x @T&9%c=֚i R-tWGu3c N%I9{[(r{_ vӧG%i3%IwΜ9s/_ׯ_?f̘#Ftuus1%%%+ViiIRMyN'yb ئ8Y9ԁ1,< q@D bJH$A4L0^`/i:-//ap4y%'N_4hN>!TK _ꪫ{޶6`0 ϟ2eI'titM<@B?R*zy*Hi)m'IqSdB{졛浀Wb&lPi:\XlST&/8jԨ]vYcL/e˖-~8$'O;v7|sw~(ݝmp>?4ߊUUS?_ ; 8pfqHpnr(ԈN]Pp9,ؼ4HQn] 8xؽC\F$Yeҗ4,Q6=pTY1 `7}3zQ'BV M2R^ nUT>EDw%C_m$~:dD05a*RLB)\8sx҃1h[aR ‘ޟfAvrLjj"Yd g M?L5Ȑa?I!o>zf *qQw6r:]^ܹeR'|>925 t9O )IdV]?GɬЕPV|62+Ҋ柣dxB` qz,12+tMFp`(d)I__ @\'ßMId\'B4[P0,IvN =׿ kڟ2&\u>VwI{G5x>rГK_+N*1帕w7ݵt*ξ! !]y/: T9EU ѩ!QD³4MV$ٻMۣY )WY?p"^C 1jYF@ߦ{֑(v*kZ%:.VMvAUwHB3#>!T@ wg0Y&~\PPo<4$?ΏN;kuB&z ^YZrGOi˞~:$pQc3ab ݱ}G$%re Pվyw:k .`d^iV3 `0@n@tp *xf]Y ]8-d\ hks ;T}}Q$Y׋ X6x¼a/ !G裏ҍ̈́00NyVW_ /=c: ![|i{ǿ}MSNIW"MMq&9駟\{<Ȝ9sƎ 6leee`mgϞzzz\o>?YkΝ$#e'17ѣi )tz5*^\F60tD] 4qwkĀm/`kL փw="Y7{>zcGfsME-YY/Oy ÓH֦g77Ammmj$Ķl2a`ċ7S<˦Ǧ|'YWzǚ+k`Ϟ= t8wf/#*4VF$QW4슪ăx3F.. 78tI_y4p ^ښ`dv̳Ӽ MQ }w n{SS?TÛ_~wN?txĩ9`ӓt%izy$N;C==uu𹯾jD H555P;z($(cGYE) x]XlWoLA!@&dHdn xqj3 ;*\[c2ƴL9

E:jp2q!(`zmx}2e02bxlhMϒ%dC}2-YeVp8C-h j#-y[PnݺteuL̞q47q\tb*訽CI v#cM{i*B7/ɌشiSNUjC:~"Kdotk9ci/aMSiuBd̗P>*hlF@k'KTR& B9ڝz5Ν;7-˴ /DK2m;:̊PA%M$!$ډcw+V\|iɊ =YriB!g'ҕP9)g+dv6}…iɊizTU++&"]1'Ŧ_#mf.;7Znz0]YeV^ fcnL6nL6nL6nL6nL6nL6nL6 >?10(3 茂): `(3 茂): `(3 茂): `(3 VšanOpmn6}٥'PnA^PFr 5ˁ[hwjύA a{!Khd $^?7 "wh^μEq6rRH\UxH;%\ |C# lCHI>)iùEx(ΧRѓUpu PuPÿnE+ 3Oо5_㽮k)C}Ӎ d8:<Eh3\с* :Tw0Ё$T/T>ۇR%$RGh4)R BۺHHD@68QHGi?Z"4 "Kط訅,}̕7!7J4" %%ST3f_.Ű6S0=ojjN<{;4MKBRiіǕuަ?vz<%^py̓9W<8iʑNb=c6l i4sy.*NA9A 'YZ#epF~zCu9DaB Kujyp3ByQPEx x\r,HZ XQ K$~_WAR{*->jm"Ir@2F7jrro7@ Ɗ/PhӶ@R5= -&㥊4ruxrt1y!]kY +\5}8C[ 4|U ,v^t=\VP0pb 1Ȋ%IP4  N9 #| *|B0`A"%t''Jtx y^SC1?jCx + 3#,C e8qȃC9ek@1LqHpEAɎׄj2},$1Nt1xM)tǞymǧT! "VR;{u.pd"Y? NS Rޓ կ@Hp:d۠k{ q(3^h=! ƒ#ѣ)tX :=2TΊCxxp~aㅠj)YO\lxPKg _ ?ʕ+<̔JirX;F.#޷?[Kdw _ڵkm*HBrX˫+tAAȺj~&P5{(_ݏ館\#+)ٻ~D5̣=BxQ~Cv~w{ܰSU&.8GUBzm $n].}!+Y,;Bg=V.ACVGGi'LKV-%u[Zf8PHfcDAqu샲vuVqz^ŃwwwF%MCZY_Pu1sIVjkb=! Ma扂+h9 6?._Z8䰢W՘/ynJ00Eoޏ7֥tTOxbn2= Z'l?!ږ0w!`KY1?/aV]]}ԯ< 6lڴiɰ}1cXo۶mܸqSi~N_=]+]fwqoI&H+h9(/ ~]w566>CE۷?аxbx],[l---a0kjDtlٲeرQaE-L'͔qw G7;0#Ai["" D ?-KHm8]`Qr9p8h!u'; f/CxPHq8`'(!l54P#8l]]]ss3aӳxovCUEB!ziCiG}^)_up~^y啟'QaEo;R|#.uH L{n8.nz<`& Pr`5z>\1~?o^ZZOPE [@iQĴdBrXуD@5~ ޽{=w݈oя~dKʽ Oc6l޼~?3%*gk3JRmʡ:ND8r2=]`6"D!TK$6Tӛ~z'jXn3G2NKYmmmnO *Y 07#&Jwak (r b(g7XzGzR7 QkX:Y$+VX`A]V?Q~a5$0jkpѽպW^/T#ɦMvm-\?! 7AM ˖-C~ӟyK,ਲ਼:S/(hEE j w-?o~Z8p}5״,]n mJFd|tp!G7}Xf͚կ&>lӤ_;;;ilo\zmh$h) dѢE8Ac=]|,h.x8}Tѭ|fx}E)1 At[`#ׄ[bMCW_m& /L<|x QZv]0Ty\HУJhQ>-(b(7HIhT4[g *:R>q }hl|E?~_owhӦMf q֞:EϘ.--M!(It".*q߈iL-b}DnƘmwx}HKW^yO<,*>wW_}nnܸ4WtrLfsoyy5k 0rHPbpZ~=u򔨨D=<TQR폎[#Ϟ; Aw}='g5rԩS!0cƌO?4bv1{՘Y7c_a^z%8o[ LA[r'"U'6 t"U%=X}|뗎Wj\ߘM9Mʭf>$ >_~G?Zd-T!Ϩw =z޼yaCC|Vt燫/2RU}t:A DEft>:2S!7ȊϞDPe5u tvQ<ѽ(A5Aܹl }PZQ%]'0 )4l5f?>2 % uS~Zc^="BD3pۑ%>41|k<́I>xӴv!Pq(i}(aEO"ERQ1~OITK( 0%iذaO2嫯zϟooii9톘 >47N%|嗰ӛ@+:egLsIEBV{>d24f>~,`Q-LM Z/H۷?pĉlق3P[[~Sͣ? <wS5 ?>1uxRA6\!r3uq 2ZErӞ}2 V@'2 C_V)[ku(2ɖ}7=M*N` npsC=Tc[V^m[wі͙3gTnSO-GQWrX˪jQrZK_Ӵ7 C2جX\U Q䆙il&ηSTIPGrg'0=9U=$%9הg;ƛyoW[]$gQ _s5v9=# gFl3 LxFWZVj=\֘z3xiEQR2K,D+zYE5UkU7^ͪy}%#=V 489:ZڼJ<P80x ӕ[~u%jQ6ÊZ[;6Rѐ$cDҒ{>_E+qxlZ6MݖS7P+K췪&J,CIkCye~&db<N\(^=:)1`3sx^,$+#t5Ij6lߔHf!&PK]ύCFJ2Rrʨ)l'؃~%K*+$tVtB34|}uUciʭ@E$􋞞OEr]kCI+zWGky݅`|[oR"@WYnaE/*)棧[`;/#|w.E/rXGxЙ.E/rXݞb6mݥ&|KJ2!;] F֮]{g]^䰢wuUVvqSsSS#m.B49B?~N䰢V*v7-v;v6thaEjs8R Aرsw íD䰢7^?fyA4EMUu]I%^ȴu Y/Ҁ.D.V$=8>^sq/'2O  `$s\T(Hz>i 4xH9^ HnTZCrH+Bš7lzĴv]{M+' )4M;|Z 4'w\uS0Ё$To|8~?i +w XNBh[7BXfŋЦvrqIȃ=i&R4b #WG"u(ljѤp DT6QtHȉG? ĵ)LZHa24 &&R*4H$z!REU,7jÉ{oG"IƧ\J+amqwߐ}E[3sСJs3 &t8y3YrX5TzS\~vzXuyӁa5M-yډG:;}w,%B, O`W.^MUQ\;<4_O<.v\|)]+>O1~ ,"tEslTl,Sȉβ%n_'L 6+"mߚ9flEyż 3XۆVwI>zD}[󞐮*5cރBKn5snik/{тCz/0hw_AI/08鹿t!@bd< 8VQ]kpUW׼M=X&䰢GscBUMzreI +yN%]UUuh<~ B0'v3]W5AGUbwކM]{+ U׏h-_(ry՛lbûڝN,ˆf躶N޹#Mjkn?x)uOJqZ]z%--2? >-4 zekAS? Ww8O9~K@w;$RÊb"?A`㺏6O}nE8a'I+KY lBT6A<$28<§_5)y-]m|,I啵+?z娉پ (JfXsEvtx; Y\ZHݷMT^r=[*x )qkuz~GG!GtD%+:]?z,Mbf3F*A'Fco$;0Be\Vt4EX|ӧL;1tC/w=H"r;D-ï蜦p@kPtQTU7[#S9CE ,TiόA2C၄({Dp1uNzmu9NE YB搐8%k!\:~4.k@ +CE^)9p~5KI YVQL@z+B <Bɇ_P!UARb%ɂg$!m6D6 iqS] ډ-|/ /H8 C ECN < jxk=tvwà58*"i)ʼnq:]uHBHCHPM'o&x#uE5 >Żi`%$Z; (Ҩ2 NJEyl# ~kV!=ZOPŮ:}k L Ua+(#ՠk*1c46u`yuƚ-E<#`kOT,) 7GT-5 A FQH.6:FR!u p\n2cQ0(d)CaE'"Ky׮]F n'N!\TLlk2#* 5T޲ť79)Ӣ1 9MXO$`j]x~D}䰢dnSA?N.%K.5C_ɁsXѭ9_;]F6'=N W1[K>!p }a% E&WBІ~ā"mEʪ]k }.hJٔd 2tT;NR|^A =`0@ n/nw![:߮U8p@$ YErUU^Tҍd% 6PL36|C_F3UAۊ^]]H$3'@gaUt#R%"P,r)Ke6DE1)>,Hf\!4vرv/Aѽ3GEE!n>/=7?L!s]p]6RC>(:/L6@+~o(͢E,YuԀL`,OO7nٲ%tLx;AAA˧NJƧFcƍuNo߾[N0_CWStP-.ݴ~2(//okk3wB>쳉C=!g8sx dv8x^E|$`0H QeJ$zᧂC]Gk:"<0g,g;IqFo d s'Z~7?:$&HRZ'I4ir&=Qo"UBCS孭5k /;d.%<):r2GnwD#Wm5j_ o*z8u!9nĈ\paդ/E|].xf+|8nvW_ -[~ϱ-'Ͷ#Pt @ h2˺;׿~^ܞ1Ik0/ v|ꩧb-[l`!OW<;wx*8$YEWbg( #"Ռo+7UԻ%0~?~3pqZN UHoYJƀ *`KP,W\qm݆,=dY~G=صkB'? 8ZTAS7cykvsA1I+:XqƙjM?|޵krm~@KH2n?e#65;PtM{1{LC咊;n 1TIɅ K/D|=j:o޼gy6׬Yc.UG1EOr{Oy---w'|B'OTD>q`#<ٴiၹKDuLѣIG;-XmbN7d n7y <|I{+`mc}ˇC Ɗc SUU' }0 ǒM=El*DPRںx≷@e/^LMe۶mƍ[n]uu55&Rutp].+a|>`H-w0A ~i94_:cTœ. tDZ_Os$d6w\4[ȍ[ͨg,Ci$ڍOjNf3gZH[0'@ĸW1Rutp]+:7p"NjqNH*ڦN5 ,<Mqn2 Ý_x*ldiid+:A{sЀUwQ1i P xh$]Lc6iGє:ЛA9ۋ,MūvX#57\XmìO-o3fP䰢ǥ$%pM˯uOLh&xj\dz2䛢ga"ge-L;7~CX;z={R~rY VTm-RS]R~Og0W7Ef>&ɇT%I3YD9fnF8/xra=*ݝ!rY-U@Z#&.ZkNw60Q&QHӸ#]L!#䰢*(zֽc)&&ag0(N?a~3JtviMrX,\[S;Ùf'9bYH+ ўbvt8+%}1erX%YVƥ'Ε%CFÊnDu @ArK9iZIF芢JR_oΐɍ"}\$^W?!RӧK:d yK5&Ӌ$ 18=y> I!BxvFBA38ҋ,8Y\H>0ᒇ CEF%Q8J “X8\lOa$9`0P7NJ% 7NH@+K!H茂): `(3 茂): `(3 茂): `(3 茂): `(3 茂): `(3 茂): `(3 茂): `(3 茂):  #Kd0 FJ0υ`0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O``0f #O`[w>iZ)>5/2 uURGG?D`4]^/2djOѰ"7w7e36~cN8n i9P`(m^Ra3^{nw /xZfPϞQy36t袚}Ƶ<we5ʁm$ p;柽}˟ƟWt9OVϵ[9;—g_G<%H UE! ֻ+kr9g! `:q^0pޒZ=|RgϿdʕUe%aB!r !^M_|WW]rH  9P0 )Ҿ3_<9$1q=?|ûyp#huNi=z#:3o}ٗtN`7☆#&/};&Ik.{6`3鈑&p?LGTjsު>]]]%%]xu]40FN3Qؤ p Mkn B6rS?zw;;N9W9T;}QϞ|KpLU ?\US?˾'P.:d9<9m/_EN}nٽ3~y3钡$sk7n#RCȲ!+sUcwΔrʿ}`o?9?ysfk:%q5gux ){co 5᝔`A쩁ou|.H3rػ~)GZ3G4N$l+4]Cd$0:>4cGH}ϷxJ+kEDmri@> H qXHKUy~ǝyK._wQ;qGv7  O&{RvSSB*KADh@U#MfW4 (=!uqk}^sw6]JPk:Q?zj8bS'zw0m[\dE>R/Jɓ].ה)S[߿|0mW ?#KBaH'wYÖF2٤alUj.zxānPezsqC,%\N-z~zÛ \{v5EG3h@.ɛbAd(#a ei[L^) McP,QD;cےIY0nA)!d^j`T}M]]݈#^{N\{筿r-sϋ/Z!- u\"'_˲;cϞ=I]޸PΒ1l']}x8+/@F6ݧNU\#*N1%duS8z GD,&JߚL? œDOb@qUMe0Ȅǒ@@okkDy36¬yޑB#( :t\u 3k^Qvn0`Ʉ*ţa9cx)̓_ e zGǎ9?t]## Kn<$ѲB*aovͶ ̠ۀ?beYJLUQ5C>'ȋ h|Ca5q)z>bjztq]f!3H)yq#f 붘 ̠ۀ顃ud2bQUx.`l6lxA$m `$Gz<F6|ϼc 괗#`:gq}>< \$CP`oyI'g\Ʌϟ&FJB*7o9sfz20nNWnC9~WA熦u7Á@`̘1;W50Rv[u%º-&36F2 z20n`MK`DSS3Sǎ<% 36:HD[AY?SO=СCYSSk͜9۷oذas̍7xWR+ 7l0iҤ˗|0cƌV8 b}Q?cs9 /W_',++kll 9s;DYWt0 :fm70؜9xt*MF`0ΙAŒ4i9i V3Xs/(͊ sǜu:pi 6,ԇA˥ks6C܇Ӵ̠:|zPPYiﶘ̗vAˢEVK.<zh1n50p8:s .KUUIo*P-4BAY0t:/"B><=sBet/BJ@e;𬹊 6wttLyڵ[luC ?r) ,xWN?˗93fz꩗^zikkW_M?uw}Ԡwyo$03$驧SN]fM2 |^0sGge+XOv`̟,%VMu:/G-|M&O!cZd 7 lBƙ>b|ŋa?{g Eq>كcFDN% Ix(Qc11"&MM""FD0A[^vw>fj{gf{}XǞo~*3p= nkO4b%'_YY ަMؚ+W &s0:uɓ{=䓪3fΜ9{۷C`_Ayz >(nf^cǎ}/ h> DB(O@+m芊*̕q 4wSWcOIg&~MNl)AAwt[<(ٗ ݹO>-?≀i{'ք?PНp7bhC=s=ܶmۘ3f̪Uʧ~zٲeCvk.첚>P%8 Ba޾ǍԤiLp 'Ƃ(..~h4*8w|gGjÆ jtiii0Hjg̘ڧEEEwy'[СCvo Oz"n{4Ԇ>$ SimL{LqX2K$a$I>RYYGi@۷`:KڀLB![nL{̺E]o_s5|ɓ|AF+~xyH8XWv4PsP(qC*ף(` |j,b` 1 YOf9 _K¾P0v0:HgBG Et]g%,X˙yÉm{wtn܈#&Mtuwȑ#%%%||=zG]h Kwƒ>x3fd>,o۷z~k)e\8& tСѽ`aΝ0a™gyM7`y C?otz*MN? [^t40>G}A衇 t+6lkڷoi]vepOiJ9Y{nݠUQYY)@`(%zH5O> rQPo/H_z0AA? .Ѵ .D~Ɩ)S, S$G_J˝:ui۷@< }q~-[~[wyK,\n8^/>sLUU:tAppp!0{9XNy tRFfkePһ#D0Fa}ѹSg-I]]?|{3 }@ʈQZC$~3o0 zqq1N#Xxꩧҕ>}u]t{e^Ϛ5+]pI;ڇky~p8D*ʼir.<u3#*2+IRz0O61frPɊ]سwϫ6|nȷ.`u[4I%O t1IGj^Z:Wa_-ש1Ȼ(UUSZZi:a) h-Qu Ww24D 8P]$nڝ:Dx z܍M+F=rm>D\ :9B_˿dc$4cA:sFi6Ƒ̅]Fx]έSX$ΕZ?'ГNtIG7馛,Xpg̙3gʔ)ӧO;v? &fzz衉'Kw}~;/\sX_ꪫ0?w'aHsٳ>F,R5{vm-qYYy/^_~̓gsXIw]b 7ܰnݺGmۖo5 Aŋ(zi?`]tNСo=|p"uٱ=PhLnW8`Vr։$E<ʾ *Qث_Lzg~iȁ @̔{ygn>S#dR eR;.[wtY ^>_?^)}qPjbyH s)7FiEHAw9*iu[F Y|ڰ†?4JL+k:uw e+uΘ1G?`ExWx ٝ',^|+(xd;wL9g)# Ac tR[]8ޒ%K 5[{t[/_ޥKhe@KJJ2?PF@_ 9p\ܥչ-zT$7{wj'r'RRwJN<~AHa<JWgkb_/rl==2) uҚ͛7r)lM'O;@$$I)}x!C )SnׯSsuE-**z.csR#/ !Vptp5$^`/VH!n"n%'gߝL4Q.|nnݛcsB^\Ilʭ"?͛wÚjܹ={vjM|wΘ1㷿-_&a]j >+#ٳ/Bj1c:eVUU_|ʼn'8p,#F,]GesRE VXq嗳>>|v6m(.3ܬsس{` ~2b/ ;т5 Kf i204-_kyr[v BS%e X4mnwRs4h֜޽{Q<LD0`E +A l2!15V` tx><>JL۳gwmni{%w@n(zޔƑ)Ki@7R`u؏V'MI*6s8^06%IQdM ˠbB~*Ś8)o q0:-< A|\+E%)x:i-9R4'^`\4ݬgh!:ifMAגdV ڇ4?6$IMkc夾Ǟҥ 뉶븘%nƍ#F`aXv-ؿR[o՞gG>}ȑ#_~iN%V~/Z()iP]wڭDLJn護?{Zx=r k0yz*w!ebՆ ^n"?3RbC<4u(.нora>y.I ֯N<ې$'ht_bT0Ǐoݚf*sbHw^o;dJ:٭]Izv=nHҗeRn2wd{3I鎞3L.̱PguS ZRT6,Z9̱+|O>בb'eb{|} NeOl?4u(.@\Ld\U{$>e@u aj B's ZIR~[@\.̟65lu`(XUU%P'tp,h ¾|ÑG%\Y= sJu(f_(;>֎lGk75 IR& ]Ӆ[9y_𠠻@QI=Vs =if4eLE:c Ol09cNus~w\teT!v,YP}≩B9YtcuIJ+ZB|yV2rQ2LÞ:z.I4%_Vu Ǭk74LLfno>,skRZ}33!M줹pCL*|G1Ě@[Y5h$W0. (.f,ڽgw^Df]U% %7 tthus#C8AOywɜ :?]6A6<tՒz{zNHx D#aR(;W ]+ž,'^Y'%r}J{nn֯I]˲^!)[`n{پ֯@˙3!HtwDjeSGQ)ieG1LU!lSК'R;fϪ( &2I\?L|dD,MIVT$)++stz-6a vQ - iY_Å$3K.\ C+[M!9T)]L8+`?HHңG @Awq V=a&Ib܇]l5LNS>OVdց)7}yR搎ek3 iuۢP]oe~v:S.rBtRL.DcSAR#AAwP]EȎ.]DНP" H+ or.T\|JԄLPНϼ x}myGqH^M帠 蕕Q|`]P`0P`k<Iu+Eº) |~7Et`><)#ax૪zш%%D&! t68犅W|HnI dsn6|o[i sRDE'(D<^<^/iA8:y3dC6(9NWiV a"+ܟ|~K46EAw D)fyX'E:3AZ0+w}F*Yi޽{H@(Xzc ,f>tia$9϶a,@?t'@8$3)?}r4$a:t=y-:Z݌E:(N@Aw$;m (.&+`4:ѭ!\UMtRbJSK1eT=ߊ Ttsh;>?km Msh><`oC ޭ[.LkK|^p6+r€/Ep" H+ (.E@V,r Ģl :q{]V x-0q-:<^t@AGlA?t'. H****.B+AQCG,AAw DBG,A?t'inAZGqtA֏:ۢP]ŁEIdx(N@AwCG (. xr"II%iz HۢP] "*?f}};] '(JnA-[y=@ (.~Qw-+RYY#Gڷŧ (.L{.  tꊕ6h=jQȢ((8UYP8a4M˃ â>O>]~D"ko8(.??v)@PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)4. BG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)PA tAA@@AG)P]ٙ/քBA-5M?n^OEvo\x kolXQˊ"XPMLP $eAQcɎOK^Q_O|B=jњ"~ E`T_DݾF7U!ICR~5ÊP7n?t ֕s?X a$F+A~lJ놷-%9,aS_#5=oСBX$aL}4]R-./$* {vv2ß!T5,*t B4Ea0B+Uakp/0Ԇaa0W2)LBtх}acDfK'"Tq?Q/mk 2֕n:[ z C]uSCg“ 4pX FsaaH{vm5 t۴.Xi֕uu1ӟ~'0 iH4Gڵmnsm0"Pq 2ALYPdt_M _ࠠi )h˖8#h# #];e9]ٳI2ٺm;=N:9}=|>;aAR"t3i~|w\SR*qq EjL!MLiIiL )x}~H P\b7po>].1BCJ#յ, P#~]vƭ{H>3y7(rzE@`11X (. )A qm|/L79wSooqM:䞞"e<fIEn8 1](+*!E!{'zck?.iǫoYfE$ׅ")y}EPmi^'he #@k}Z֭5 .^hoWcxծ=OvAy$"CXVv~ӡf}EG((_zcvCFggmwzsR)DzpDoQS (7#ܸ~wixW!fnOM7:m;M#;]5-w0[tZ t01Ia_7sIEve[Rزe:1`:tm[,I|DB~j.^WW`/1@cuEUkkk3Gm=n Y3F6:{+ xh$  Jhڎ+JƝ|jS1i;WzJm<\;#Pvi3_w[ӻ_纯Wt>r2_;0 I2)'uK/f2}QDs/6Ww(]j~rC;|ȗV OIw\$fm1M(Bs%M9Kqi>&.X&W 5lBt70LĕMy0)-+4H~v**{eF$EY@5@VTYeE!;*J0Xm8:l vHϤ< h%mq6) 8uI2tmH.m@=ch[lK~#?|N{pyRU]uGK^_I)) E6KhUw\xȟjsw*^ge=mUV &]1XvV}ѵt):3IL*)QSCrݎ7Muò|7npc۾ycx3t 1tP#_&Tv%/g" s,iotY&vxX 1@LY%h׃@EHA@jӵsA0ǎ : ;:Z&C{dzHefS_]+}.ض};C/md`_*/ _KeHXCa_yItG> M+.WԏSzfH2f8Lq56:hT6?+*G#Ic5GTlW[w}۾G_l ?ܹۚ|њYR:wdI "IP.\"~OQ)3Yfzi?|T\&2O(n@]( f:OVj>C&;%H/֮ILީG^/Hv,Q1^-Cn@vWd0U%MoDe|PV֡XmyeWQQK U0c}(t(u9锯w-+)5y*>_;BEc;t:U/\N=Ú3HCt@]DW@}TUv=9iD1d__]7qʎ]8(~.'+, kc{<%ӌ=*)kQӫRM؈FcX*Jr#thOd-|/+fiKUh Q$AkjJ3M'wH} )nFw$,NSɈ(Wv蹫:TpHCrh Ԧ;׋ ztG)]۴[KSD(0٢GNYFy}Ծ1= ^xѣD*4i_SYM(. }LmV\G}!`&'34*[ާ n]iW((FCL0eY&(ا 61s[V}𐁌*:$6dG+" ֡!)ReD]%/*Iϫ.QI:u*dj)DrP^$ %&  O<)3<@`C A'0mgֳ̡ %4Q[K1ҡ t=Hd(P@2͘d 'R7;M2\F ;p6H`+m25Mh^$9lM.CJ DdSaƨC|Sz= נ].p`YoM±#?1r ]0cNpAŒbv!^L}(C o5djt}4a.EJ:7hL&r] "YnԌeR$JX>14A{"FC I< #+P,A`C9O N-P j( ׉q AKLOeNT'qY@iahz҅c$UnBj$BNX&^%]_eH*zt{ *T$c253rRƠ.-:4oٚ KQRp9qJ &E8R(eS7706@2wYH$HxAY`\)֟%CfWgyp$["$4if5P4vtҹ:E!Y.%g?9ӐDI^Y"XTiY2i8*.Cjkkw$= |ؿei>c/(ظv+24#12>tu ][- yשS'(-(AA#JKKWUswL# =S^OkrA!((5-s=lys3+ tA)tA#u=] +Q0j1 ,IGF̯cN`uH+ǔ,8P[w~c` tW wX- J3#TXCLM7PM*Ç(AAw]*.,D= 3Z"QIXdƼjhoP@ X؜Abh(@ <O2ɴi%8 | W!SXV+ AvAאD TN, F<p$ #0|af(LIfZLL`=2'%jEa&t C$0[, -F yH$JEx$E"a=(z`WB jjj)5x2@ t7;:Vv7i'&t"& D펄A I&I|Io$&وDIb:4H,1 `:{C5GU! <(:7e@ u {X-aզMjmMfxALf8*J  5(H768.H y#BC-@ ŸyUz@] k@[:d蜾"7w!ٳBGB?`zRf?t=t|#H f|)t=DFQ5R )AAGp rs4 c}#-ه޾7 >L2nt y)$9Ki|ϷU^O#qr!(I~oSݮ۵c5f(ajPwrz9|DУALv򯮮.//g͟?.z5Mݻw0\~}۶myy>+2̞= /h7@\p+.lw9cƌ0>ch@>|xĉӦMsxR(5mClkej(իΝeIp^oJK}W۷vھ}iӦvaɼ^ѣG}ѣGϛ7o֬Y/b~tY14iTNN A:4;wd_Ot]0`@Ew߅Oik l^-[Ɠp( x/K ;v̜޽{;u#8?/tW@EGB{:ALݻg߾J5i6`n_ve|$֭[ YرcذavMxw : N 47mԧOvګp;ׯg :x ,l޼O@+N:)sV5 ^xᅮ];)* : yMKCWUu͚5Eرc뤉f͚5tjX>|nX3&)g5\tR@o 6gU̠#״d

TP%.`oܸ>/J_^^^WWw7/YaQY4")J OZ;$%eyӦM`Mݻךʚn [¯~tYBq~j tWqa`nCUcE砠#Hj&([W`gt@kD5@~sP]PtS0E2Itj-FHiuy弹J,;IqX$@AG# G%x%n5QPgWȕaiI !H+0Y l+[麁z _|_#H~ 6{m uɫNEM^/5< aHHV:=9P440%Y!1OH◡Nk?x7/6"? 駟׏9믟8q"E{-k𯫮jܹ={v .ꫯ***fΜy܆f͚{n„ NNA n)NW MAh Őm2_I㡝6 `_ӕaHJ!ph4!A®7D=?9L{T,^_s'xy'u^ݻwgw})l _>}:}RV_~5\s!XСCǎ|($FAGwiFȺ@3{H~ vՆ`tl ^jkbܷ'ya},xlI.d>iZ$'n%Њ tFrX;vH!/Xl=r)l_Pav}A>-W_ V9,ٞ# + A4 rޗM(8ɀ;F0`Yh8WMQ%Ǣ<1>zyz_\GgkÆ ܾ{oԨQk],W_}uM6;d[׭[B<`ѳ@N9? *V+'U.LR$ Y_aSQdkR\{7_ax>~aM]tсRnN. :viE0,w+tiPsau Hi88ޝuGRc>i-df>IsIi*WA7gÜ؎_P+Co]4K˳>ࠚ Ҍsr_vۢE8f͚{Gâ$Ik׮O>$[w?s|+?яngy#ˤ9q:Н n8|pqq1,l%iӦw}wBN3f5&Mbk~iH_QtSG1g]ob=Q=#7HA vN,"(Ɂ/XdСoZ7/`0!nv"6Z,f(hTU=b'kULˢIe%BCwN .z͚5wuרQoJǍW^^^WW'dc$:tU[TH EpDQ a=Aat!2# ,.]Iih9χfEr]t2+5Q$z)M %{*Yd/W4UU2O4]TUa1cZ +8r,\CRnu9&L8p~ͫ_Iwx?$ +N 3Hلb_74 6 TH)"h4=4ڢ :Dz&`2- l͜W$cJ&n&^]Ϸ Eg_ΤInիW?SN'tҟ6m\_,,T,4/4fΦH0Ft 鐡IW7@"%EUM*9|Lr+k7h5j?/xc>=//@)SO9/X(^/hb,1aB;Y x/';FBeM%jQMl"yCD 5@YXtš9휉ɒH&|H gA_O)gW( I nfˠIST%Y[.Jɚ0:}]"lRq=sgKn}h#sH9AZ:c ߟ4- ^"'{imKM(;Yr)4mы-ڵ̙3/J'ԵMP$%S2Ve8Co*WU5 |>6;-[vi! j8嬯x;Xǎc]I)m͗_~n0`ʕ+ VXq2eʦM[ΖGy3 $;(}lR_O!W]uܹs{@ѳC AbfW~5Yb<3#"޽AW;ᾇ:x ,l޼؇LnƤį*o`׳>ݹsg!1!XAy뮻{Ȑ!>ŵCa"vY{wuu#)JW` K+sQ 6lXKs|oҔUUUM2te`z Pܹ[nN oǎ/ A覛nZl5-?[B_ #v%zꩧnFˢte yZ|%os׮]wފ+zz:گO>`oܸwN3g[3v\h… ]vO?믿9s x{=zxa}{pu.{ HK|oTvDC!Fxb_lͰaæN b  ֜y|GM*uիѣG5(3xɞ I:,(P]]O/[~W۷O7ڵk훴=[o \bر#@}EwΜ]/Z PXo@ራW;w-[Xm\9z[bHC{rl]CL!I!FF4|i;m4f|&Pf5 IDz'Sx}_R !.fpM-(HBtSQX$W_H>}"Ae]lGIqIeʵ6(*'(D xNH>$)Ĉ Z90InXi,02'caxH ~X7决ZPXОBQyr&N뮻hʹ:tPs\w;(j-IEs6>sb$I^y7xz~ Eyt&sK̙z)%۷oߎ;:,h=~m۶́_-vi,X)C5 3-. ;rڳ1RC{{ؾ׿5}qRtƍwt$|IXq(vڵ!C~3_|糯p-H|xuiWJKJ=vAVC֛=|=Ĉ>j5eҎIkز} _N|aO}ɠiw=l۶ h>}ϟuE0:uɓ{RƷO~XGɬ$f(;ZC^z)* tC'}p ł%A C-?_'5xH{VuΪb$*M5 A⹰0+ݤM!ĬifrX1ؔx_)ָ+:`["V\-Hu]kk(0 3ߘB lD3 BI9!(H#9zta9h)r.(0 F2nܸ۷嗹*:=us k&)I_㑀ܹ^xy%l `ڝ޽{wΝaNy"댂>췍Fuuu@{ViuuhL~@. xkZmHy2K$A{}^]#COa=8V8z6C~w*ɄQ(;t6XOmN sܨb H4U )z}].M*_V-kr2aH-Zt K2B<_|1tP{ڷoT[/_gϞڒK.˗/4mڴZꞽ{v1eIP4LQG@ 5lZy  _P[d;[&z1e $c8P "%YnGX?TUjH$ !5M1[kKjiZ2~茤x$&MOZ^^7߼dkb{;L]}oְaaH2oe 2駟|V5k@ oFu.\سgOxHA/^ܫW/ha$僂9, fL2dDW`WLH (pJnZk*xnI+[$i:mY3 &˜X`DaZߴy dѽhfңH`i9,ߔHn喔Cpjk[lM [W\5}=/o ~aDAwB:/xF"1k}5CXÞ7X=GFf.˰{_ً,V+癷@ef^bw؉Ŵ] pesZ\ӧ;u N:yVZկ_Hl]wu&L8p@Gy Fǎ_zbxOᮻBAwp(Ô-bo `}ʱoʊJz8f94IZ2Zhœd:d4ϛCYkl<&J"qBIw\6)jՅ1 =-cC, )yY BMK+ ր@Jf*B2+DŽD-FBtA欆`F=HdȦcOMB^,{T/gu!t"%1 I@{lP"4a"?bʙ:϶YU) y ޚ.@T t:˦O!ATAWHvd&$ ldPXZΏQ=GvS̰i.cA~2?E3ՆC]xFd%A+ ሽd0t7CV7ߠ[h0niV,T%ǼHA#߸P]P:8Hd"/{KB: b͇^ uq7@_^ p% k3h࠺ںR*b͇^ քt: 1"sb 'hyXNN{WCE 䛴S9Iz<$9?v~o, Fġ٬7Iw8]w@;Xzff|?u H'h|Ur9)FgDRYoRf"udI*pEw6kgūߞ2=jnLV!YmԼȜ{t#.)ẾUTp0pK@q:ެ~Y^o ,UC/kޫm)H&\x4ö-]7 N&Wu\)e&DPX?EyʷN)=%[>е8aD{q 7s-Ӥx.HMӊd@K̛OMTΪ2nT̄raߏcRimEFU%;P1S éT " 2 *"*|^$rm)Wu3b :C/^I;zLo_?=(@K*jKKG @p>E hPpLCECBC/-,sK)%o$cee^l\!o$7 y;XkVp1%ǒ]OT\K"PFʮ);3a\ PK]"bq誢jhZBSLFMe(~YC/8 gZ.S>@C /8t@C/:(nz C/8t@CCġ: `D : `>C/:(9Q8p^(p@ hPpq:)Z p@4pKN : и.zz : pi4MHCrkjj Pȏ\؎yrMS'֏t8C/!ØcD ctۑP}g6Fe8ä$6wm7wbÏ3FݫsQK!n{w2FeL;>L:R1s9ش1^0g=_C/W{6P@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&@e: pP&h@ t:@@ @@ t:@@ @@ t:@@ @@ t:@@ @@ t:@@ @@ t:@@ @@ t:@@ @@ t:T^rqNm{-X\dWreI*ˮ㺒ШEȮ2%]kGIťT5:uT3O$ƌ4ՊX--{aqJTI%ۑeRdlhiI&Y*rkdu$EIobIS YfMJZRߞّdg~cXfnmg,ƈsm o1II!#ȹ #2ɧH`L~Ե1tNqݔtMq;ڏՕUŵjٲNQdgvK&eٖiJO2BQ*̴eMMo$Ya##9=O9cf@!۴W?S{.uf;a3]׆bgcQJPEW7ָ(,ՏFV[SCK2eض;R%TS7Zy5PBxHj_wʴ6,%BxkipE!cښh2&R& GSC{;nᯮ, )3JUUU>{"peŕXlɯ_Ɏm>KZ[[kkkGO6#:`Pv$(!~qi֥luY?,+.8u6̢8$)l޲aFs18bJ@ykqUU5"#=Uk_F.i'mnݴ|-vte5bXDV\55 5Xg{~_mL-hըtȸFKK˕Mmӆ0iWcsK>]5z~lܳo.{g-Rc~L~YSlw_:r!FbĆnhni·Lmn;L+/Џ;fjC^$?\b붭G))[fWC4~LзؽbFDZ rqG>wM|Ñ/.bD)uuuUYd@U]tEw>sSA>}2MqPko}O^pO>0Ib5O~Mchƪ-Ǐ-u5HM{OI S4v.'㱭Xn>\7`ޜcWHh_r,rTl kkln=4|dnDM՗~ݷƽ5HhGMnݰuՓ4uG7zڴ)yUhkO64l6>i!S' BbZUS;y)F 6S;gۚbVUkڝ!?qjo5jƝ7w䟞Zb Q@uQE5I62RdM@/ݏVFU~ܱC?u^y >p!Kݘ8~đuQ=ֲiӶ0;/L 1M>[}qMkŗ\'Ɛ!CݹO6)>^{erv%M9h~ 7ˉڲ7/|Ɔ= 9K3Nߊ, 2?鰳/|?5׭UU?U CdWz}Œ5]4h86 #LVBx4iL3mڝ B) ܿMMc,퓞`?}׮[7psf}ܣwvOɞYv浯RbP1iIS;m5'?^D#589q-V4׷Thn]|Q?}܉?&Ҹ_p YoîǍ߸QuW\p<9mfӧ>xavQS2nPc_swUj"pݘ/;ȗ߸a[znDkd;L~js܈o<CPq$uT92f̘>mPbggՖI_{zUգHvީ6y#5j4z=uG1剕h8<{ampٶV.} 򬙓?VS[;h1W5Z>yk?5afڸ_>"Ք ~Ϋ[Gԉz[P޵WZCgLqrEHH{9]oN|ұSoyOx }lt#w=SCwb:72BqIA4ќyXXML9zivudےHy{Mg%.ARN, Y, $j.`wnLtHL9Xl;UtS$C5۶IadlQ R-~ 2ɤ)JNo8tOrEaN:Uy;MJ8_A&׵yOҗ_[Ҳ{okrRQ-9 {c-'N|BTh[-uEl%unLl4į۟6#fۆ]\%%-@[L;bjfژ S]AzCP J%;v=MK?2ksÑa=۱;fTզZ=~sӢ{7tN?}7ivkh,}KZ#,"+$ }^,h(]Rziպd1gej]PLžع BQo{b*=^-ٲv5b3H*Z[vqb6[?!kwǣ!wؚ#%[UG t o,\rfd:ң`/lȞM-oXvwcӔ#ιzC!HY~1߰{OK"mFgcv54oݺ}um sԘhU{vz{>_G32z-lID&C*1]]IRމS8W}"5FꤡT;B"1bi_:^'=z8؃f0]IB!De{oq>~56_Ztn+'wVExC&%*sYuTh>qD"}K^lNpSUY<@h"F>d"Tܷ1dvA.[䊽13\پqձe~9Mٓ}hUObrTS4׸۷7>zmffpYf=k;6N&RJoڦ}{U#~u#\'dUͻ[Zc vr5frZVl;c[&{Ī\ӫꆄ"ES?_n;47ɡNۖ Ru#zBRG8Їw?^{Դۿ'b{\L}ߣ/ vȉ5_gGZ8gD*-Dnݳ>bWHڿj2mٸe]ʹCԢպNJpgGk4Z|ׇn[ܴ%!Us:V߿ͭ*ЎtCY9Q8M}[,&IGL8%ijS&w,5wޯW;^<ؚa~\ 2onduԄF|{fėf"n:3%"/)u"=3_V+ z)]c3s̄8iLQl286شvB(f Q#\+Y0meqJv.Y'hI\0L͸b..r!=ix]6mʬ>$Ne !GY ;N[Ƨe6!2rFAPVgC`IXt!1 Q>E"z:0SyN$*<ʯ]lJE&M'ӂ SZڨ!NM.+I/85 d92+ :UHUZŦeږ ~2dfcX !yWv]bYH(8NDt&=>e?Chn"CQ2(r zS.k<MtSdS̼|Z : QI&%2ntGA:&Mc,D, DRNGtPtŴX"N%˲܈%M?L g4%s!]f=[": ㏏ Gӝ]U]1\JLlGŠ pC-.X}.lh)-QArS@^=$:kwXj~ct 6aHS~QS(ZjZoLS~ t*ՏQJ2ԡefǛQ3E8d zYN6+?]i=!g*PdÕT:Y.Gj egIJAB Uw3p:teZ暡B"S>e7/KUi%,.;9a97K@)ޝc)13NtK'Niƺ=<1lxkqty(e1v:!VɚmȲ%tPT AE [14W}6ڂn)HDTa>KoRH\eV?wl7*3"ΆtFN:@ыy"!o*{XHqd<؆qwieQ Ŗ^$ XENG8ɌU)տ{3HIuB8b~UeێxV]q OWP]q*$e㨊9aF/PeMr uʮOݩI|N&R9w5i{֏~EM ]6.{ (+J?ΐcIV*B0m,Գd__}am$1gͩdhLψD-("`JbΉ'pE?IJR(O`iTf*0>sd1ٴp0{BŽۿcR$dH).e@0Ӡq"۞4:F2 7+B!?(EG))R~m b&3F("kFaA"_碍9o6ˈ,+{f@33͕UWt)ʼ=͚dLU,s#NؔI"JF)S Xy+[av!Mv8e dヮ,JS/̝+xTc~MRg$]I?z~Km1T/;[aC|PX Tfo>gx?Y]\7x!&*/S3xtz;jv,k^޻i7 P3YN:6{Gb$GdURjkeUc>vիλ0/= cK~1Jmy_#)ǛH7&ۏ!+#آ]tUgn~8ygD͏oG) 8kLlΎmYV<5+b*>`?3dHz&֏ߵkW*4y޲tې'6?l\/$#+s(߃4yV >-:8̠A2[u*E"0&Mԃ :\YKWޟ4:FBN;n8/E ɵ*U5/xq͛ o-˺ ƎtiS=ڪGuO.J9191,u*ֵ)6Q$iOdL<} 'xԩSņ_wq7fӾr-MMM#30:J:蠈@@nD~dgFsN3vN;_zRK `!1,CHL&Q2gEAQ#d#qa@WR:!2=. ʡkƲx"!`)MMM "`+fzEND" & <Ӱ4VJ bYfO9Lr%HFXr7 9C*Xض,۱CLX˩T6!}O^un0O\eRfqA=|s1*qX5m.~Jt3P!♀ؼTY]|V&LxZ&WH t8dhP5+UR]Ρ-rX%ʡQ6*!S2]i {z:"jA隺uZ%,T :4͐Rvg7B7fWjhh[[ [z^ŠMGڑt"]MFmťF)$^IŒX%Js(dK2-om1u{@HLٻ$Mj!ȪDˣ{"ْ0hiYGlǓ:oPNUQDɒ" ElF0uэ*L,[ql&xU{#T Ǣh@"*XR믿0y3fΝ/R,_O~Cy/MOtRVLr?u35jԚ5k^}Uv\s8I'o?Ookk{/2&t, ,9r$\SSzj** -YdƌUUO<ą^in„ dwO SE;IBtC@|Jb4+}֬Ywu+{on;xcǎݷoG}?sY{ꪫ~=×\r?>R a\@__λIR{$I@{v )@{v'/[,-)~ AEt QSL㏏>s9GrF?yDE:WRd?=b˕RxJߟ~ɓ#57b1+UU .׿^SS(ʱ;gΜsz'pB#=H AEb^ D)QvK1"1@ уw}=tM'Ow/We]vooذaԯ~_} .7]{_{9H jΝʤIf͚E_ɹkD$[ 6}6%_3'G?~g=z۶m/R*o~sW3^z-oۼyW{swyaN? &444rSO͘1 /${ꩧ677 Yx+Qt~.]nݺE-[O8UU#Fx頪Ν[__o&%KiE~tPXYj'"%P+v+%_90S`s.0˗wN'Q!sB*ЪG9])"0T ( Gbz|)AQ;m(;"=;(%].Lս JtPD@E`)4 g3$U݊*P6T/ 0=|3'Q477s17n<|>7* |(*m[m;+%(ʝT}YDBc  Qp@50?\qկ>6: QU t#O$,뺑s80[O$kF޲xmN鲬xeUM#ogr0+*^T*E{2h3⣰4 ,%bwxJMѱP,7\\J4M33`WјjUi*  8Eg@}JnsITQJI1{J:t-Wk% ՃBRITL*ikC,l2,R^KDa=ɍbPH$::,x,znBL=ofi:o6,)UuPD@jNI'o?Ookk{s?!]NgqƨQ֬Yꫯu2k}Q:k#G_H:4٥6P:ƅ+QD*i#Iݒ&qI+)z} 9 gA >6SiǦ $y5y NW$ 3^1h_5?OoB'sfo/ӧrwD ZpV Hy}eeꪫ~=YG۷o'z}<=j$I{@駟~xo}[^E]D< Ufw͛5k]w%Sɽ{VWW{exs4j-Pn"y]wݞ={x:hjznZ__W@=4]C pR_9 Iv4Pb.|aHN,H(;8~@! Mt3y )~&1$e N%+tDJLQ>&͌Տp2͡ kX$C+i֏?؟.NBɓ# 믿~ƍX9m#F=邡[n?~vs9{p¯555tQis̙;wz '4Gx%+; t25K_zcǎ8AKVKxk)W![oyٳ+W.Zn7oģSHsgmoF1sڙ"ࣲJmS~A_H"~_} .K|]vewqnF ֯_O{+r/PGO~}+8l>xv+L4i֬YH5\H$z-t瞛nɟVXET @̀?S3f̸ Iz/BV$;ovO0_޷o}cVC 9oc9755Q~v7~/wޙ?%Kjjjf͚ӟAAp_Ġ"~SY^_%xcǎw}yQ{-ZtiO~_M>}޼ybu袋:GQ;5ydgڴi zoꪫmgx≍ƍ7 *0lÆ z!>YFؐ>*!;KT`(" 8.iD" )хfu%_<2i$zhsf! KJV6JQʁ:]nCZ3 _W!9KBz<2QPbV:X:xSS iegy*rzchmBVW{L!Sӂj8s \^r#}3m ZMJD5e Qi]I! u_@O9fĈ^𒞆.?s{$?)I/ҷn:v؜{/ .`8(gy?c=6mڴ3g.Zhƌ"q޽w߽@L* %B9SnW(95kK|8d3$CI>)247*Qb2m%¯YBVn1, vKnWl'|wڗķI2X:n"w4q]5=c%k)*9o>ٳ1 DP%G@ tN |#?9s搛{/+V_f}}ܹsׯ_?NJN4O>Yr=suםwyճgv?0am+"UHx㍴Fzwqb11lCҥKo7|!y䑔>bA ,D4 K$[t7fQčIB1:f"8%g;]d. Ol%$XI^lrH4u>%P"oQX*R0^b(? g1x`@EgiLcl#L)hdx%DoB ^"aFr9+ǜc=dz{:t>֖r?]q>򆇸0AY,Ϲ-iGjg4wڼ^^{mWp3 ѿvEQ?o}Kl~Yg-X`ȑvZMMի_}P(dɒ3flذaҤIht׮]UUU^!c?uԬ{W^y%3g3f˖-]g)… gϞM>/( /P43a„d2;|C !k 9s<_ոq_O>>̟?`֬Y?OO9&֚."[/^LҥKCO?neD㩭=cY5)Gy2XR8:wl}@ Ac1gX;"ĥ[z>~‘2_O=o|G}t1b)QmƎ}OjR^FҬbf&N^ve^\wuOS~bG3PM[]gIy< rYۻwouu-/[Z ]a_S 5ꪫ Hz$OI?35kL6mРA$ֽA:x+Wf-I:b _{/^oQ\%w_=˗/'9N$.?sR=ܷ~2[EZ)/djfwBX&&A+dr:@WH{"$+裏r-B"7ߜ>}zʼKEcSS8yH$rw^7nb^N/@G~OOV&5⏏?8 ⊳>[HA: r?Hk?sN}X ůrE!̙3w\jp J.Æ OGt)ď?o?CWi| e6Cϧv{/ ⤘I 9R$_NN{4۶x OrHIX4x⦛nZxqfwBXA n  Q -AdTN)IG!)qM|qǝ|*4o>s$/_6kGTW]uɧ'~;ߩ~ꩧ(yРA.䒫[j/~ j]zڵGXٳ#hѢnm޼y׿u]HĠ}{~oJ,2=s>(+{bŊ-[̟?̙۶mT7ߜsHzsϲ\5HUfwBt(t7bF, W޴!K.ʯڻ)|I'O.N,X qjWz(Is璲ZpBHOP!>lww]عs+2iҤYfQ⑜k&HD"[n%xGJx{<I9j$(,D{7Gգ.Wrr9DQe|!5a#A"% QQ" 03f6EfztwU] Ý/?ƍ,X ;wq֭pE裏^|t"t1Ǽ;t|s:SVf^T D{,~ Zg4M9c&s>lʾ3gΤ4ٿ755 ^{ۿ/~ WzΞ=C9)p]>,Nȑ#ǎ{+؀e]Fe(N2x 'xb2 : U K,L6)իWQm@R􆆆ŋѿӫ7n_/WEy)v>}믿N}"'N|Lw&(99OCh8Nۑc_jw0A@KϦ(v)N;m =W9J! 2m4Mӎ;c%):{;y_u҅WPQ .]b+`|_z" ;wJ^x!=, LӤy{D"tBG0[l׾=7M:ZjՍ7H1o߾t1e^jw i_0f3zUBORI0Jr4XVF4]DD2x`vKcۧS%h%y:묡CYu +g /!X.:5$9hz*T'$'O8Nwmс|vMN顦y%UUpDNOьɄ8GrjK-_TGT25ݦl!kl|]xtw._h* 9jSOVRћ@dBP:QA$b"7x[,cJT2mwƳtjt]#z&OD"0x 9-I1kDr.ϲk%RUKAg ǟ@{ qЋB^Hc=;|1'MJg}{o>II5SK^`4urNл,/;O/ 9[C{IaT3ϥۖkՎ?T*{c.5W2C6fomv5k׼g[NjkܹJ ÛGz^[Y>@+ .3͌s"=i;_u:mw~bt2=[>ti*=AtɈ.:-_EJJa{~[8¾ -~ Z4/ < #}enʞ׵y(o"?:M>d<y)>&=3)'`9%T,i&ιY2eh͝ܗr 诼ʽ޻v;v;8lذSp |Of͚E^zΝcƌ'^.]JkS7Yf]uUsٍ+W={FuWE]Z?N}]o}k= Ѹdɒ_~'t7o۹fHwG\r%Ρ%/KFހ]9`Ft!_Ɍ{(w'Rvw]o~sӦM[N馛ze=1/Sa.?OWaÆ{2[o~}p"5sR1cF_ K~ 'pgB?xY8NS]bśoS~ӟ?LuOUMS_5riӦ%1ywnٲ}:yYZ7XNqV:PhiisTz+SN9e2VZELtp=§z*mAі7Bbrr「?~<co;8p Ul-[m۶O?guwwIņ yf~q̞= /8gѣs'Pgt4F]Ӫ[[[mS8҃{8[˸EV\P'ҭ;R)%fy}':6 %ȹ(P9s/7x#{^4LYR1PpŚyI}kV{o8f ϧ윑ޞD"!~g|]㍥KO?):[)*c… ;vPptGA]w%ɦMuu宋?JG?rWT*ýc̪i:wO-Z4zhyr-Sroe͛7+zVOt8.wMwss*|I'QDJ֭{wӓI;K=#^G]]]M裏Wjnn.O>_FU˄g͚|ȝr%)_zgy&wף1::FE@')S@}-(P"}uM В\@4DD")o|}䜒V'+"/ ]_|))wq(bʒ(Ioذʌ1k\9J4˱Nٗn8 ڶm-[{b>ΫoܸK+Fm(YeDᵭmXԓO>q]gqJׯ? y'8ފFGQ/9s]\_~'R;MMMr:wǡsɒ%|GrJx׮]ӧOk&{^zF5y7x2?n8 O<â\+}ꩧ({[z5- 2ޠ~:OLAC~СCi-r%̘1W^JI^cg}#O]S@I)S{׿@-:lݺAƏ$Nn\v)<_*vWˉo~]{>^xҥKzKsit8Ac:ƺ曝sTO ]^/N0N'ߡ4]۾}{)PI!O04ŋwy.U) 621+=H]vΝ;kjj(Rz2ȑ#O 27裏CAsZ._UnF: hnn۷رc}Y 26luuםs9uuu4w޹yzilڴ)@Ѿ+GӧUK/K+F(PΤZfΜ9o޼I&ݻ_tu4WD#F\~zԩSЛ|ݻwâ0:gϦ㕳>>(nݺu/}]sK~РAtwm}ߧ$۶m;3͍@Gu 8y>,c-:#騀K:&0:8[l>gΜnzI4+wE6,@-h {_D(C_)dOQV.VkpN.CS.siD"Y2HHi-jڷR"AohhhllL̿ qm7'tw Ћ\ dO(N --#H42Z,g>M$RSSSMuMmmm<߱c|u^&O9t@ C(Xmw봶ҿrz^ʝ80peY{ve>c7fed؆E@P0"Q%( Ty@TL(FM^|ȑ#ٳuÇJ]c< F$$Eq èqwwqA@;w37z)t]4=tAK=֋A(RU HTZޚܲ?UMz?ustzA|7n\jU,[z5hOϜ90 *@9HYׯߛod9ǍkQS-dܹr:߿{q+2r)޴iՐfYhs׮XbT36˖-۶m駟WwmXBnUܵX׿WNZڇit'N-i SrL_n],\xrx]YW,\1U2ݬ L&0|y흭 ݡtW35mS3BIn D99sP+ʈ1 .ͻk.g;K[[ۺux ݜf̘AsC q֏+wŋ]CrC3fw-vj^z~Æ K9_ve??~2 w]G)U!$..6xT8"i bfC;RfF|+ ۜi gqN+ʄ2[T*E w>z…_G}Z;bŊN;Q&L0yI&;bQ$+:UG}n);tG<3dPԼfrk1sڥ۰ :D4V}B[ZZb];N{%kǮZk}{8=R#ijmL>兯  gqʦׯW7yݻoذaʕϟ6m"\wu9,k'vJ4mkk[`AO>dv.[ Cl6!AYMi4pocg}V<{ltϙ쳿-\׮Љ@x`ʕ֭8rȱc޽{ɒ%'O6l6nܸz꺺:*oɿΜ9I/{p#F\~zԩSs˗SĉK4 EA]s5v}m۶38}vmXB)߱#VGrKwSO#2XTQ&k|bd? %"O5,xH]]bVjgEn{39<^}@˓8u_0 \t]Қ4h)j zb˨}h~hN oTCrrgIef(9f4?Q.=eos\)d(|SOuv-c\~}t>4geMD(|?]vg^[)݆U!$dl[S&QXQ%7-Sg$0G|.+u~pL؊c'-Wr. Ec9)Ec@TYsA 2+Nrz..Bho5C~N.Y,z3]H8~!-M4kLL/@q,8&jo#JP"?rݯ@t.. !C(PPrvK0.nW;K*՚X`S4 S,UCf^rU3gg\nt]hNhv^s@_g:᧸ KhȈ.aqWٺ<@֖x[V{Aw̳O-#úyUU)6\xm5:6ɃCEh|q=_]Iqt* RD{ӯ-%0DaG gTѾjGsM/jr?ug~s!퐯XjkjzɮA9_s8)NQ^-=cx lFwwI'Q=:B!mw/\ w/JteD4#Hf#a t=JG$ʔ29zʸƤ?[,Q$h[F(󵔝쑈rW  TەNŌ.͎ ~^0*+*Rʸ9Xn޳T wS_W_}u򫏂!ɎخT8Do=IT=58u&2J$C.ǽ5cY+!U8Eq)U_y啑HSNJytGq&Yf9 :n9묳RMMMky޼y~m6jԨ.U+Vvi&L0yI&;6geqEdkt Щ΀^xyv!C(-JܵXmXUmmmE~>OJZ%.. s,X=דO>?=AZScc#ދ.hΜ9>dȑ~{7lذrO6MT(sf7 lV7j:c+Q,Ū߯/ݾBŗ*wUz79BYenKW+T~-tM[nݲe R=ٝ^xK.}衇.hK>s_2}KGuԘ1cssϛ7/;Ϛ5{|/aӶV={:牖LSr~V]B\.\8bĈ/[o:uwܹ|ݻwÉ'vjiƍ[zAr֬YS> 8E䦦^xaɒ%'O6lX*ڸq#: ٳ,Z#ӧ2>[l?9sm3O.\=t#>N#KIF ikk vaQ4;qR8{Z0kZr^KK yCڽk޽ }=P 9( hoD_?_OUR2x-/c977R(P%B2:+g|( /)S3E]z #v!76\mXyʈU y<\BE휠iW`-9#J[!}]8phgg$=D?rmuTW4e:+/$·Ȱج81qusAD` `H$Rf}n{א1v>g.J;ɧRqP$TR;n MHQh* ',(X!ͳsNxۑW;(Tђ-q. _UH8/X`[߲ݼ~Lu tZZviټax\jD555\svsln+fWU䡅P-i`SİCR`΅-m=ZHuu5W^;ތqak)E v4q#Ocu^23 ;Suvr #kϷ%y.S츣@SzxS8?k2|8 +MOJSIJn)9QN-3flg ZGW:"-{(e+VM19s1휦ps6:ÕFn\TȵprS"zгKtV&3גC/;ped7 Eɪ:pnvxE4Ymͥ_TvJ.vtʗ IrɜYQr? @!_!c"шZ82"Sh${]#frP#C;/R`QfqFÜ&s&]tF.ڿ=Ν; /Y櫶s=*0Wx8ΗkJ tsծyX,GI9yKGJ:[7䔃&sЂC@PHnhw8ٸG?T W8?gG/4C%A :BAu KS㠇GӁ^kr~? @@!C(tvJcV__o+w]{ޛڡ;:5=2/#xtt a(rWҿrע[~ꈉyrt}6P0"%Ke]xb}]r*:aD%Lj+ƾçrt :BLStMt\)wm*1c[Kk!C :B!J_>:@~etrעb8}z @y !4z =a'_|EУSYWޚ@@@P0"%YJT.UU[Z_+P< !HTIEڵ{W"@> @y !T5cf2&O/w^7( (8훑4i0H$yeoa%(9mhh(Z T!kSu{EYzF tieYɤ݋ Ty2_!>% [/ v|We!$tL錖J_rTھMDu\zա CUnD %GGL2: p= d,4^(g2c&9>MLM+S^]]]@?3Hl d#r d 4z 444tE  Q;z6u#@UB$]VDт>B@P0=^8I|`D t:B?@qJ%]LW!C(qu7(%t:B*jKZ/QڒJ[ʢ9KO%xʾS{Cޒ0Tr K(}B@!C(dR %2;fΒT`P ι%y,W;.O9N% :eFU1#EZ]S3rvӆkd *k.":oIŵ%i mg慓:$t:N)V6%3 soKAsVx$ C@P0ʹsKw tފj]hh@@!C(Y?j{T bmEm_s ! =(-n/Ԃh@G̏7TέBJ#tGJ|%?"Z t=P <::B-P"|(􆆆r*R nD]L8I|`@ !Z 2VU$AO$ T t3.w2q˲4.P!!tUăQ@߳gOB4т%b'tt:B:qj/#tAD>@@P@(y(Z/ 8IJ |麢'A-oMb C(zJJ#tGJAG@!@(FUJe'tt:Pxtt:ZD$Q Tt}4p(BAQB@!@(JP"r*:F@d2d"N'Nuu OD/ *wrDbHJWX.t3aJ|`т%>B@PH:/ R:Fq C(dLU o߾rW*:(Tp":GtG TGH- qSj߿߶nEJ]뫽51#jhaTUUܹse@7߷>ӧOB@!C(׏zM,rIGn:O+kwx0`/\ztaMMM'pBB@!C(F'5M1/+]}*[uu#] V[[[*@@@P@t(Mjk6m @rW*WWWwԷ] f:]*@XV[k[[<>c WO2ܕJF@_YEbuXۿ^JA@@P0M\|ctFI3ͭ_Dc6m15`LX+J{6oSO*wB C(ioTM5Tkl)ǿWx]5t݈(Jܵއo[[2yҸ?__.)k|۝+UU4{8>> η?tkomr͢$A(>iHt֏WG ON0kӉkO)-O] C(ĪjZٳ7LiF:tT4bhD@@Pqt]uWa)dLӲ2ݪe[:hbY:]= *ʄ2ݫ9*S2JT4Jv]j#Zmm}o#o!f_qi :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@BEIENDB`PKd8 content.xmlZr4)<lIn2;0(h%#Iwp }#vɺ4CڝnstdO]g̛g~|p,ʧgW'NERLFeFx` @=KG)FeD <9E\GKY܀]\]5%&g6`W:hUXcTW<] Rg9*-+?GQX, r02d0'SQQHڧI&Dvhͫj>j αam$lD/az9^ł̺Υ-yeZ+/hL6A^ m _HZV8F 7.G\iA93P W̤:`V 9T1D/F$)D>rXTNe [H)$HfԦSٶ6̿,\f|RFe-[v5c ))'w KKPʅ6^KE "#IuqNijAzi/],Ť*H.MR  "󻵂Wq3Weu$J I aTxEWkܯt#!,(Q^*BNgP!Cv ra0r]4}M嚵EfM,;0- r$dTJ2P!.>s~{2beF.rg~O$N$ӚJBӞҕ,Es42!6.ELjfhJ#LbH@kI̷vUu`)1RxvPԾm^^{mljUBnA􄕠ƙϯ?7vfwm'uNfhpJ&`hR G=m 'v6.TLt얨_~/D {O |u' <?QϽ 0<~Ͻ8~!}GOpu6YHMCW|+cIiP3 DY0IP]WzRvUE߉}^yNfA%AUDpݺJJҗttĜ3bzKC^B<#7sA [6pG~-R!y!nT©D &x"X+>PɵIH$%7E yc4 &~veyS,ZE=13Vx"=xoT2e}ݧf#MHRwA+QH1KVB_ dwI5f2q\\:m'-JPJ`Pp9l%:5LF](?c+jˢ _PK'{  PKd8 styles.xmlZI6W*ڛl3^ 9Mk@KD"_HQdɣYR8 [!&;*.`By,Ʒw?ow߽ *qSCUjewA)JԊW |ʮec /AFޖ,Y0҉$ 67bAeF Y!c]j]f~?_M΢r93p\ WhFq35Tׇ|MhMNv&Nޫd{_6':_7 {!oTdcZn_^QCEb>,^2MeIyр/GHw*!^ي{W6ӆ4Lh66 4|-`qr[y5;ğ*٦Gُ.] &-(n)9-kG$ÒpQ؀o4gJo3<44jݶ7=RfUs+[IŁ~`AҿR)I>p̧W1!;DBB*H M$Ld_:ɐuq{y0SV c̒9Lm)/ "oKBZ,²HXKJ) .׎u"Lz 0m<- q2 fG')3p<e t#,"žhQh-2 (?ǧkJn[)QgM`YOo>N~=Q=Jfw5(nʫ1V!8P`Xbf$If b>ȸ+J*|x` qhinlRyn=}=]( 7Sqlg~`cJ @Isx SQL1we"{Y QB(#~ơI/[S+` >a=$}Q A65u/J/B} pL\#,|Z?ErXMˉ&+^/LmBk#Gdll17d{rTaS8y^*xj&t >7@e.2r5/ g{wG=4LfrDx~%+PJkh({}03[=̇n5rf5ohLRQ{'^+7هW3z\*[uLT9F4'7j: v'L0SMìE GVʑe h'Rf0ʢetxq/vSm>z7lxms jSOqb!&  vuzm{Wr M5RiMZ:!kQʺ:X{ Y"8JƐyB툟Xژebߚjͥkc dalՕh9ë(ͽt>bhBq]_( Bqtn/BqEXBSköeu! a5mxTd%&ƴf^!}hx)O~N=ZAзo?7岙&S)iэh|'ǚ}C2ښOG:aq7omRE=-:kt6 Nn'G=&DhߠPKL)R[$PKd8yr`!!meta.xml OpenOffice.org/2.4$Linux OpenOffice.org_project/680m12$Build-92862008-07-10T14:09:112008-07-10T14:37:594PT28M54SPKd8Thumbnails/thumbnail.pngyePQ% !$@ @p n!3HptpHB6@ ڪjtw}{P&ECC#Py:ס=AB] ^v(dg>K!_Kl#ȼ?yEC1GMCǢ';!MBZT0ÎXQQZ)7k<|@DRVbecE^cd^QQQв'Q)SCQTU{)mp(η9cb[t9.{lŁ'<wII?!‹F.߀vKeaU0$VB*b ~qXe*S!"RBf;_Ъ/6,BZX5% ,U7?{ 1|QQ:<6ZKEӥ6yB.K /nVؙ~%E{؎46͇RB^)Mxdz[ )!I;r!pp0.D"`X&auظZB2EnF~ OrŬUo/=w?6NP\OEPܔ\o{,'jzA+ ljm\N&9޽ ̍e:RN6+Q᪭6vՕ @btGPR'뀍{v'7A;w[Ż:G84+PJ9x&AAYp6lBy3wg!x|eٛ^Ե&5紮dri"ʺi'%m["Ft4)ac[QhG'27\C]I@?$F#ibn6ۻZe]Q-W?̷DRݭK1}-b$y&Y@ylNȸ%q@sRw!Iڤ˳1Ss ډ|TC#4]rʞb5g}Y+Zruc*["? ڗ.*RDp)ܯlS=tv]t}mطM.^mu_&/xLON;h>S!xI޻ k_'` 1k |Bc,Ug a<\2+ЯLE*ʍ@ҍ@RS-SR]9ȠktHݔ.-+)b/l,K/(|?T@(oaS(;Oj.yя}l`i#mLU]=n0Y !!ͰsԚx. 6;'>wHÎ%xsTAtS Pl"YaNܵ a01lqN,A\@j= xBmݯjT/Ni`KR‰ERcK_T6nҜq>e۞OKL$|Z/;JWvZ>HF9˂ֽ1-v.nhpQei /Ty׸%q!ᙸ]qmdsV ݫN.t[._Y{fiqXE2ts>:zrg59<)5;[4i=#ɪLՖ7.sۨCew©k!mX`>A5-頞۾yy ?/,HND'؟بE#1nsq4\%)tB"x'҉!ycMyv̞,@KD[mTd~F!h?' $Uq 7?y򗞼q8䙜O?;os[W&mRA0i%(7佨#pZonҟ:p/qpf04!A(p:ޝv[@@Drts'vǣvkɽD$ŷSÅv6<3}[m-ccm^N¼Lm!No=mo2N2X' 6f1n9T'm[5=1is>qUmVNqeFYd@7/m @8yRHԲn<%}<-_+Կ}*.KJK}%^ 1@l(:Q| ff()SdyV(њyAn/ƽ ߒҟ7]__G||gg(<ۚl h? Op&'i]"~A׈.DstkۛX1lQ SZNn- v~E4O+vJ8ăjqd &lqv PT9<:D?$Su!favkz@,Vf#ӀJ,G1 K]LhǨ\x4| g1w9#<+ aT2aE}G1Xn0&kV2ѵ0/~IH|DKG~!?r &dO]z)3zz0䎎5{p-9ZJΨ䥉F̾j;k`Y5tS31! dS/c]g9 `ߧO;2M*qիv|k}LQ^-cէYXuAfqЅb)\@$R`AWtеZ }\I5qCPʷ1M['}jOɉńoޅBONi*"Z./h L#\|N@~p }imSR#hbh($ψ$Ӑt7.U{Op|L VeW"Uq}l@lsnX6NR:´=f٬G߉z%{zNAK+z[O&rz{tzS|d^WQ@VΛ4sK#J%ne蠒`Y-1n3S#A;Ji<)%q;E5h{| :hoҢ'џ:Ԫ,9u ˜yb2L™N*jgy@ڪ ?tgucik z%GM&ߍَn"$xV_jo iOp۽8+4jsWx=@?x(f/0 c_LUHOç2(<9"|fENTo+ K8 8 ҠT8iWߣ[nTқ;Ue ;G ~hЫa%9ywxSU[O8c_;)9ڼ/֌I7̟m.Rc;=? hWg=1iȡ=hq<l~oI6>oֲ?-DX42;LD:_ǕE^voJ! C H*דlY; .)wܯr@][C': NZa$Bz6.žSZk|ڑq2otxmτ_z')C }!)'uLўo/&$z m#|Y_qO"P⽤P̍_QBA^=44:2Š .~W5>{ČƄT$~ Ɖ䍎Lᎈ-Buvi.)rF5y6osZ1^):^,WVZ {\&dN"T҆߄ fu՞>7Ոюodݿt}aI[#sl` f4)YU -1ӷԲν>(džKEc'"jrԧnTpn,E'oDRh =#W<.kJͨ([Atk&4s`Cx;{/=qXz1@9O!wIgVH?Z%Lvc h1cǻť™JJMDzy=4 |m"&;4i.#Sj4m{)xS(sT-4ʬ32TC"_uL-Q058݄XJd%}9 .|`r2 q 9Me`!;k1Ef~56q7Do:җت|+}"dsסn9w&磑Na){a^w![˚x>|GJ}m{>i,SY|]~^yZufnǏ>?F늠Im{c;\Mյ;Xh4G !XvmS{Aӫ?EȣE*c(*Dݠ@ DEImC5{J}!oկ{]3I-^5+af{G+I0On5Æ'd\q32YP#Bc}숃|l`ś/C"=,^EG `̚vCv #w;4c沧qAnгEn0@;Jrķ= זD y @(.\$y#=f9vxZ8XE_Y&ޛbNS+T t118M̠׳1ˡfFiRmmW&iȈY\y gۊCr|:kŊj^6&/ "o[`RTR楑 iҐ grTv@g^g9G?G68͌W8~ oȘ=?:ntAL&mx|`x7hXqwwW[`GleR 6[Kfk%t0T,I:h~̓B`NϏ:v="ϗer?#^}dsVߦ3*S8Z eFQԉ@Ə_6+!!nnB5i,K&#!hݝm98ɡ,Ͽ&R -HEwʜc9 [ŢԑK- oܓy,"x󪭷wFi-2=jSՔ uv8lD" qq>% A0O2}gSslq.C_+R 9- PIG=չ_6A(o"+ P!)-Z p%ƹ=4)|+ >_mo{Iw39dEj_U+oXM $%l,X'{.3^a5youq~$L~A@G'!Z\idRʫx eF(C"a5o([m4U@yg=o+N,˗/ymWkx StTY_Tv:&ubޑ``EZmdh0 &%1Gph3{!ݥLݢ'jlj:Ly3kySҋ ~zotV򊊊gGDe!!Owgi(M~x,*,,,@CSTnȪ_@eF! ;$9̨NFQl[;M-OĠ,ndJC"nԱ"לz3cQ½v҄a-g%ku\nu9NVo0;8JbU_oL`Ƀ*AFsnُTN]Q9e"F_ fx*=۟ԳݒգAl+}HZ0]EɰHg ng4~go,=8@**QǡT[ >mQTa8>h d Bqf6;/W(/Ixxѥò33??l:2,H%4_TLĂ.YRnIU.TNDXT1J3/>dx-نPuJ^k?x ,Y'

ʭ25m5X j{e(8˼x|il U:lc\6k-xV94\FdLEȆbsU*WѤwC,ˬ倓Ռ;*GyFF]W ؐQWNС+/zL?cW(:^gн_|]1K2QO1 D\Iqc>K|ݷyl1mJQFVGt3{e~gֆJX&w1 \z/.ũ4 ^(7(i߻'jCaq6{" \^~ ]p$pk9hڋ%(׾}V\Jce ‚g56֫iL-yt ofV ,q%q$ x*R!7@|'0`.焀\ɳC:5랁%t"gFa{EЅPȷSw ̕^de쿚O{*F/f:v|ÂgBKEm:Z>Ƌs-k ) ovWGXe w0b>}XSd InڒzFoė&%+ c*%~ܣyXl&y&׈r?צT}3g! Lg{A4\f8Qc@F|+ˇ<Ǫdp0r0X\ZjPڗ>UÀ:ʵhCEQCBSPKEm?[^$%PKd8 settings.xmlY[SJ~?;rpBumHd:53ۓK0Oh2ӷe$N^@iګּ\ήqNk׾/|ƗY19.RAg &Q q+ 1}ҧLW"W a vv'XJCma6k\.l+w_bTepFk>VRǮTp_]4Rh Fʯٿ1I̵9ⱰB,0v #y^@r8e g(Sl(F1 ,)1fvaA{X$zԸ9:[_,g&nEbm* .ouYy_7WV}%nPKmogPKd8META-INF/manifest.xmlKn @=&UJ8Q?$ (}q$nUue$xo<\Z:UAل$j yMd[LN)w[kksm@U_iu\\eP @A1Rp!NWUvre}Ep@r]]{)SpWJ mʳVh=f!C3ABjKŐ(Zj n& ouc.hpZF51^8ۓyo1 BF5o'N'6/?rx(K!8֕TԐH_U(mhtV1!swM, %>PKO>kPKd8^2 ''mimetypePKd8MConfigurations2/statusbar/PKd8'Configurations2/accelerator/current.xmlPKd8Configurations2/floater/PKd8Configurations2/popupmenu/PKd8JConfigurations2/progressbar/PKd8Configurations2/menubar/PKd8Configurations2/toolbar/PKd8Configurations2/images/Bitmaps/PKd8ꙏnTnT--Pictures/10000000000003E0000002E889E3A5ED.pngPKd8'{  Vcontent.xmlPKd8L)R[$ ]styles.xmlPKd8yr`!!xemeta.xmlPKd8Em?[^$%iThumbnails/thumbnail.pngPKd8mog csettings.xmlPKd8O>k~META-INF/manifest.xmlPKI,qtoctave-0.10.1/xmlwidget/qt4/clean.sh0000755000175000017500000000054311511434226016555 0ustar lucaslucasrm *~ make clean rm -Rf CMakeFiles/ rm -f CMakeCache.txt rm -f cmake_install.cmake install_manifest.txt for a in `find . -regex '.*~'`; do echo $a rm -f $a done cd src #make clean rm -Rf CMakeFiles/ rm -f CMakeCache.txt rm -f cmake_install.cmake install_manifest.txt rm -f *~ rm -f qtoctave configure.h rm -f Makefile clean cd .. rm -f Makefile clean qtoctave-0.10.1/xmlwidget/qt4/CMakeLists.txt0000755000175000017500000000071511511434226017700 0ustar lucaslucasCMAKE_MINIMUM_REQUIRED(VERSION 2.4) # The name of our project is "XMLWIDGET". CMakeLists files in this project can # refer to the root source directory of the project as ${XMLWIDGET_SOURCE_DIR} and # to the root binary directory of the project as ${XMLWIDGET_BINARY_DIR}. project (xmlwidget) #include ("options.txt") set(CMAKE_VERBOSE_MAKEFILE TRUE) #configure_file ( configure.h src/configure.h ) #ADD_DEFINITIONS(-DUSER_CONFIG) add_subdirectory (src) qtoctave-0.10.1/xmlwidget/qt4/build.sh0000755000175000017500000000032511511434226016570 0ustar lucaslucas #cmake "-DCMAKE_INSTALL_PREFIX:PATH=/home/usr/local" . cmake "-DCMAKE_CXX_FLAGS_RELEASE:STRING=-O2 -s -march=pentium4 -mtune=pentium4 -Wall -pipe" "-DCMAKE_INSTALL_PREFIX:PATH=/home/lucas/usr" . #make install qtoctave-0.10.1/xmlwidget/qt4/readme.txt0000755000175000017500000000053411511434226017135 0ustar lucaslucasXmlWidget can create windows using XML languaje. XML window description is sended to XmlWidget using standard input. Events are returned using standard output. INSTALL XmlWidget requires: - Qt4 and Qt4-dev packages. - CMake 2.4 or better. Open a new session of terminal and change to xmlwidget directory. Then write: cmake . make make install qtoctave-0.10.1/xmlwidget/doc/ej.txt0000755000175000017500000000417711511434226016342 0ustar lucaslucas Hello world Hello world Hello world

* Todos * Todos2 . qtoctave-0.10.1/xmlwidget/doc/tutorial.txt0000755000175000017500000003453211511434226017605 0ustar lucaslucas XML Widgets Server tutorial (xmlwidget). ------------------------------------------------------------------------------------ 1. Introduction XML Widgets Server (xmlwidget) is a simple way of build windows. You must describe your window using a simple xml format. Your xml must been sent to xmlwidget through standard output. Events are read using standard input. Almost programing languages can read and write from standard input and standard output. xmlwidget can be used from almost programing languages. If you use GTK, you can use GTK version of xmlwidget. If you use Qt4, you can use Qt4 version of xmlwidget. ------------------------------------------------------------------------------------ 1.1 Simple example. Execute xmlwidget and write this: This will build a window named "Hello" with button inside. Button text will be "Hello world". You can stop xmlwidget writing: ------------------------------------------------------------------------------------ 1.2 Simple example. Events. Execute xmlwidget and write this: This will build a window named "Hello" with button inside. Button text will be "Hello world". If you make click over button, event is written in standard output: There is an special tag, words between simbols '<' and '/>' this tag is open & close itself: ------------------------------------------------------------------------------------ 2 Widgets. Widgets are objects that can be shown in windows. All widgets can change thier font properties using font(=Helvetica, Times, Courier,...), bold(=true, false), italic(=true, false) and size(=1,2,3,...). Per. example: In the next widgets syntax [...] represents optative; [...]* represents optative and one or more elements. Those are xmlwidget widgets: ------------------------------------------------------------------------------------ 2.1 Window. Show windows. Syntax: .......... Attributes: * title: Window's title. * maximize: Maximize window if true value is given. * minimize: Minimize window if true value is given. Window can contains other widgets. Example: ------------------------------------------------------------------------------------ 2.2 Label. The Label widget provides a text display. Syntax: Properties: * text: Sets text. Example: ------------------------------------------------------------------------------------ 2.2 Button. The PushButton widget provides a command button. Syntax: Properties: * text: Sets text. * icon: Sets icon. * signal: Attributes: name: clicked: Writes to output clicked events. Output text: This text will be write instead XML output. Example: ------------------------------------------------------------------------------------ 2.3 HBox. The HBox widget lines up widgets horizontally. Syntax: ... Setting expand attribute on widgets contained to "true", widgets try to use all free space. Example: Button1 has expand="true" and if you change window size, it try to use free space. ------------------------------------------------------------------------------------ 2.4 VBox. The VBox widget lines up widgets vertically. Is similar to HBox widget. ------------------------------------------------------------------------------------ 2.5 Line edit. The LineEdit widget is a one-line text editor. Syntax: [...] [] [ ] Properties: * text: Sets text. * get_text: Writes text in lineedit to output. writes text in XML format. ... writes text to output starting text with , ending text with and each line of text starts with password attribute in lineedit tag display asterisks instead of the characters actually entered. Example: Hello world ------------------------------------------------------------------------------------ 2.6 VSeparator. The VSeparator widget lines up widgets vertically and lets the user control the size of child widgets by dragging the boundary between the children. Syntax: ... ... Example: ------------------------------------------------------------------------------------ 2.7 HSeparator. The HSeparator widget lines up widgets vertically and lets the user control the size of child widgets by dragging the boundary between the children. Is similar to VSeparator widget. ------------------------------------------------------------------------------------ 2.8 Text edit. The TextEdit widget is a text editor. Syntax: [...] [] [ ] Properties: * text: Sets text. * get_text: Writes text in textedit to output. writes text in XML format. ... writes text to output starting text with , ending text with and each line of text starts with Example: Hello world ------------------------------------------------------------------------------------ 2.9 Select File. The SelectFile widget provides a dialog that allow users to select file. Syntax: [...] [ ] Properties: * file: Selects file. * signal: Writes text in selected item to output when signal activated ocurred. writes text in XML format. ... writes text to output starting text with , ending text with and each line of text starts with Example: . ------------------------------------------------------------------------------------ 2.10 Tree. Shows a trees or list of items. Syntax: [
]* [ []* ]* [] [ ] [] [ ] [] Properties: * header: New column. Attributes: name: Sets text of header. * item: Attributes: id: Name of item. Only named items can make events. Properties: col: Attributes: value: Value of item column. * get_item: Attributes id: Writes text in item id to output. writes item text in XML format. ... writes text to output starting text with , ending text with and each line of text starts with * signal: Attributes: name: rowclicked: Writes to output double clicked events. writes item text in XML format. ... writes text to output starting text with , ending text with and each line of text starts with * clear: Clears the tree by removing all of its items. Example:
------------------------------------------------------------------------------------ 2.11 Menu. Shows a menu bar. Event is sent when item is clicked. Syntax: [ [ Output text ]* [ ]* ]* Properties: * item: Insert new menu element. Attributes: id: Name of item. All items need name. name: Name of menu. Output text: If it's exists, it will write on events. If not, XML output will be used. * menuitem: Insert new submenu. Attributes: id: Name of menuitem. name: Text shown for menuitem. Example: * Todos * Todos2 qtoctave-0.10.1/xmlwidget/doc/xml_widget_in octave.txt0000755000175000017500000000667011511434226022037 0ustar lucaslucas xmlwidget in Octave. ------------------------------------------------------------------------------------ You can write windows for Octave using xmlwiget. Please read xmlwidget's tutorial before this one. ------------------------------------------------------------------------------------ 1.1 Conecting xmlwidget and Octave: popen2 To connect xmlwidget you are going to use popen2 function. If you write help for popen2: -- Built-in Function: [IN, OUT, PID] = popen2 (COMMAND, ARGS) Start a subprocess with two-way communication. The name of the process is given by COMMAND, and ARGS is an array of strings containing options for the command. The file identifiers for the input and output streams of the subprocess are returned in IN and OUT. If execution of the command is successful, PID contains the process ID of the subprocess. Otherwise, PID is -1. For example, [in, out, pid] = popen2 ("sort", "-r"); fputs (in, "these\nare\nsome\nstrings\n"); fclose (in); EAGAIN = errno ("EAGAIN"); done = false; do s = fgets (out); if (ischar (s)) fputs (stdout, s); elseif (errno () == EAGAIN) sleep (0.1); fclear (out); else done = true; endif until (done) fclose (out); -| are -| some -| strings -| these popen2 is a built-in function We are going to open sessions with xmlwidget and we will read and write standar input and output. We will use strcmp function to compare lines read from xmlwidget: -- Built-in Function: strcmp (S1, S2) Return 1 if the character strings S1 and S2 are the same, and 0 otherwise. If either S1 or S2 is a cell array of strings, then an array of the same size is returned, containing the values described above for every member of the cell array. The other argument may also be a cell array of strings (of the same size or with only one element), char matrix or character string. *Caution:* For compatibility with MATLAB, Octave's strcmp function returns 1 if the character strings are equal, and 0 otherwise. This is just the opposite of the corresponding C library function. See also: strcmpi, strncmp, strncmpi. strcmp is a built-in function ------------------------------------------------------------------------------------ 1.2 Simple example: Window with button. Look this example: % Connects with xmlwidget [in, out, pid] = popen2 ("xmlwidget", "rw"); % Sends window to xmlwidget fputs (in, ""); fputs(in, ""); fputs(in, ""); fputs(in, ""); fputs(in, ""); fputs(in, ""); fputs(in, "\n"); % Don't close with , we will send more data to xmlwidget % NOTE: flush data or window doesn't been shown fflush(in); % Is more easy to save xml window description in a file and load from it. % Check all is ok EAGAIN = errno ("EAGAIN"); done = false; % Read events from window do s = fgets (out); if (ischar (s)) fputs (stdout, s); % Button event if ( strcmp(s,"* Exit\n") ) % Close xmlwidget fputs(in,"\n"); fflush(in); endif elseif (errno () == EAGAIN) sleep (0.1); fclear (out); else done = true; endif until (done) % Close streams with xmlwidget fclose (out); fclose (in); qtoctave-0.10.1/xmlwidget/gtk2/xmlwidget.py0000755000175000017500000006412411511434226017661 0ustar lucaslucas#!/usr/bin/python #/* Copyright (C) 2007 P.L. Lucas #* #* This program is free software; you can redistribute it and/or modify #* it under the terms of the GNU General Public License as published by #* the Free Software Foundation; either version 2 of the License, or #* (at your option) any later version. #* #* This program is distributed in the hope that it will be useful, #* but WITHOUT ANY WARRANTY; without even the implied warranty of #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #* GNU General Public License for more details. #* #* You should have received a copy of the GNU General Public License #* along with this program; if not, write to the Free Software #* Foundation, Inc., 59 Temple Place, Suite 330, #* Boston, MA 02111-1307, USA. #*/ import sys import xml.sax import xml.sax.handler import xml.sax.xmlreader import gtk import pango import threading import gobject import select import time import os import string import fcntl #################################################################### # Translates <, > and & to < ,> and & def toXML(texto): t=texto #t=acentos2html(t) t=string.replace(t,'<','<') t=string.replace(t,'>','>') t=string.replace(t,'&','&') return t windows_opened=0 def window_destroy(windows_opened=windows_opened): windows_opened=windows_opened-1 def destroy(window,*data): window.hide() window_destroy() if windows_opened==0: print "No quedan ventanas" sys.stdout.flush() sys.stdout.close() sys.stdin.close() sys.stderr.close() gtk.main_quit() os._exit(0) def window_create(windows_opened=windows_opened): windows_opened=windows_opened+1 #################################################################### class Widget: def __init__(self): self.container=False self.widget="" self.name="" self.output=None self.expand=False def startElement(self, name, attrs): """Process xmlHandler. return True si se consume el token """ def endElement(self, name, text): """Process xmlHandler return True si es el fin del objeto """ def add_widget(self, widget): """Add widget.""" def checkId(self, attrs): _id=attrs.getValue("id") if self.name == _id: return True else: return False def properties(self, attrs): if attrs.has_key("expand"): value=attrs.getValue("expand") if value=="true": self.expand=True else: self.expand=False if attrs.has_key("bold"): value=attrs.getValue("bold") style=self.widget.rc_get_style() font=style.font_desc if value=="true": font.set_weight(pango.WEIGHT_BOLD) #font.set_size(32) else: font.set_weight(pango.WEIGHT_NORMAL) self.widget.modify_font(font) if attrs.has_key("italic"): value=attrs.getValue("italic") style=self.widget.rc_get_style() font=style.font_desc if value=="true": font.set_style(pango.STYLE_ITALIC) else: font.set_style(pango.STYLE_NORMAL) self.widget.modify_font(font) if attrs.has_key("font"): value=attrs.getValue("font") style=self.widget.rc_get_style() font=style.font_desc font.set_family(value) self.widget.modify_font(font) if attrs.has_key("size"): value=attrs.getValue("size") style=self.widget.rc_get_style() font=style.font_desc font.set_size(int(value)*1024) self.widget.modify_font(font) #################################################################### class Window(Widget): def __init__(self): self.container=True self.expand=False self.widget=gtk.Window(gtk.WINDOW_TOPLEVEL) self.vbox=gtk.VBox(False) self.widget.add(self.vbox) self.window_maximized=False self.name="" self.widget.connect("destroy", destroy) window_create() def startElement(self,name, attrs): if name=="window": if self.checkId(attrs): self.properties(attrs) if attrs.has_key("title"): title=attrs.getValue("title") self.widget.set_title(title) if attrs.has_key("maximize"): value=attrs.getValue("maximize") if value=="true": self.window_maximized=True else: self.window_maximized=False if attrs.has_key("minimize"): value=attrs.getValue("minimize") if value=="true": self.widget.iconify() else: self.widget.deiconify() return True return False def endElement(self, name, text): if name=="window": if self.window_maximized==True: self.widget.maximize() else: self.widget.unmaximize() self.widget.show_all() return True def add_widget(self, widget): self.vbox.pack_start(widget.widget,widget.expand,widget.expand,2) #################################################################### class Button(Widget): def __init__(self): self.container=False self.widget=gtk.Button() self.name="" self.expand=False #self.label=None self.label=gtk.Label() self.hbox=gtk.HBox(False, 0) self.hbox.show() self.icon=gtk.Image() self.hbox.pack_start(gtk.Label(),True) self.hbox.pack_start(self.icon,False) self.hbox.pack_start(self.label,False) self.hbox.pack_start(gtk.Label(),True) self.icon.hide() self.label.hide() self.widget.add(self.hbox) self.output_format=None def startElement(self,name, attrs): if name=="button": if self.checkId(attrs): self.properties(attrs) if self.label!=None: style=self.widget.rc_get_style() font=style.font_desc self.label.modify_font(font) if name=="signal": if attrs.has_key("name"): value=attrs.getValue("name") if value=="clicked": self.widget.connect("clicked", self.clicked_callback) return True return False def endElement(self, name, text): if name=="button": self.widget.show_all() return True elif name=="text": if self.label==None: self.label=gtk.Label() self.hbox.pack_start(self.label,True) self.label.show() style=self.widget.rc_get_style() font=style.font_desc self.label.modify_font(font) self.label.set_text(text) self.label.show() return False elif name=="icon": self.icon.set_from_file(text) self.icon.show() elif name=="signal": if text: self.output_format=text+"\n" return False def clicked_callback(self,data): if self.output_format==None: self.output.write(" Adios mundo.

l1 b3. b4. l2 Esto es un ejemplo en varias lneas l3 usadon html
b5. b6
Hola mundo.

Hola mundo
Esto es un ejemplo. Columna 1 Columna 2 Columna 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Este es un ejemplo tabulado qtoctave-0.10.1/widgetserver/widgetserver/menubar.h0000755000175000017500000000053511511434230021445 0ustar lucaslucas#ifndef __MENUBAR_H__ #define __MENUBAR_H__ #include "process.h" #include #include class MenuBar:public Widget { Q_OBJECT public: QList menu; }; class ActionEvent: public QObject { Q_OBJECT public: QString name; public slots: void triggered(); signals: void triggered_event(QString e); }; #endif qtoctave-0.10.1/widgetserver/widgetserver/input.cpp0000755000175000017500000000110711511434230021502 0ustar lucaslucas#include "input.h" Input::Input(FILE *in, FILE *out, Process *process, QObject * parent):QThread(parent) { this->process=process; this->in=in; this->out=out; connect(this, SIGNAL(readyRead(QString)), process, SLOT(process(QString)) ); connect(process, SIGNAL(write_to_output(QString)), this, SLOT(write_to_output(QString))); } void Input::write_to_output(QString e) { fprintf(out,"%s", e.toLocal8Bit().data() ); fflush(out); } void Input::run() { char line[1024]; while(!feof(in)) { if( fgets(line,1024,in)!=NULL ) { emit readyRead( QString(line) ); } } } qtoctave-0.10.1/widgetserver/widgetserver/main.cpp0000755000175000017500000000323111511434230021267 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "process.h" #include "input.h" #include int main(int argn, char *argv[]) { QApplication a(argn,argv); Process process; { int i=1; bool std_in_out_ok=true; while(istart(); } } return a.exec(); } qtoctave-0.10.1/widgetserver/widgetserver/menubar.cpp0000755000175000017500000000015011511434230021771 0ustar lucaslucas#include "menubar.h" void ActionEvent::triggered() { emit triggered_event("*triggered:"+name+"\n"); } qtoctave-0.10.1/widgetserver/widgetserver/window.h0000755000175000017500000000070711511434230021324 0ustar lucaslucas#ifndef __WINDOW_H__ #define __WINDOW_H__ #include "process.h" #include class Window:public Widget { Q_OBJECT public: QWidget *scroll; public slots: void close_signal_callback(); }; class WsWindow:public QWidget { Q_OBJECT private: Window *w; public: WsWindow(Window *w, QWidget *parent=0); protected: void closeEvent ( QCloseEvent * event ); void hideEvent ( QHideEvent * event ); signals: void close_signal(); }; #endif qtoctave-0.10.1/widgetserver/widgetserver/buffer.h0000755000175000017500000000047211511434230021265 0ustar lucaslucas#ifndef __BUFFER_H_ #define __BUFFER_H_ #include #include #include class Buffer:public QObject { Q_OBJECT private: QString buffer; QMutex mutex; public: Buffer(QObject *parent=0); bool canReadLine(); QString readLine(); void write(const QByteArray & data); }; #endif qtoctave-0.10.1/widgetserver/widgetserver/buffer.cpp0000755000175000017500000000071511511434230021620 0ustar lucaslucas#include "buffer.h" Buffer::Buffer(QObject *parent) :QObject(parent) { } bool Buffer::canReadLine() { mutex.lock(); bool ok=buffer.contains("\n"); mutex.unlock(); return ok; } QString Buffer::readLine() { mutex.lock(); int pos=buffer.indexOf("\n"); QString line(buffer.left(pos+1)); buffer.remove(0,pos+1); mutex.unlock(); return line; } void Buffer::write(const QByteArray & data) { mutex.lock(); buffer+=QString(data); mutex.unlock(); } qtoctave-0.10.1/widgetserver/widgetserver/ej_ws.ws0000755000175000017500000000034411511434230021323 0ustar lucaslucas Hola mundo qtoctave-0.10.1/widgetserver/widgetserver/process.cpp0000755000175000017500000006375411511434230022041 0ustar lucaslucas#include "process.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "list.h" #include "menubar.h" #include "window.h" ExternProcess::ExternProcess(QString command, Process *process):QProcess(0) { QObject::connect(this, SIGNAL(readyReadStandardOutput()), this, SLOT(read_stdout())); this->process=process; QObject::connect(process, SIGNAL(write_to_output(QString)), this, SLOT(write_to_process(QString))); start(command); //printf("Waiting command...\n"); if (!waitForStarted()) { printf("Error: %s\n",command.toLocal8Bit().data()); exit(0); } //printf("Command started\n"); } void ExternProcess::write_to_process(QString e) { write(e.toLocal8Bit()); } void ExternProcess::read_stdout() { while( canReadLine() ) { QString line(readLine()); process->process(line); } } Process::Process():QObject(0) { n_line=0; debug_ok=false; } Process::~Process() { } void Process::setDebug(bool debug_ok) { this->debug_ok=debug_ok; } void Process::write_to_process(QString e) { emit write_to_output(e); } void Process::add_widget(Widget *parent, Widget *child) { switch (parent->type) { case Widget::WORKSPACE: { QWorkspace *workspace=(QWorkspace *)(parent->widget); workspace->addWindow(child->widget); break; } case Widget::WINDOW: { QLayout *layout= ((QScrollArea*)(parent->widget))->widget()->layout(); layout->addWidget(child->widget); break; } default: QLayout *layout= parent->widget->layout(); layout->addWidget(child->widget); }; } void Process::process(QString line) { n_line++; if(debug_ok) { if(state.empty()) fprintf( stderr, "Line %d state -1: %s\n",n_line, line.toLocal8Bit().data() ); else fprintf( stderr, "Line %d state %d: %s\n",n_line, state.last()->type, line.toLocal8Bit().data()); } Widget::Type s; if( state.empty() ) { s=Widget::NOWIDGET; } else { s=state.last()->type; } if( s==Widget::BUTTON && button_process(line) ) ; else if( s==Widget::LABEL && label_process(line) ) ; else if( s==Widget::LINEEDIT && lineedit_process(line) ) ; else if( s==Widget::TEXTEDIT && textedit_process(line) ) ; else if( s==Widget::HTML && html_process(line) ) ; else if( s==Widget::LIST && list_process(line) ) ; else if( s==Widget::MENUBAR && menubar_process(line) ) ; else if( button_process(line) ) ; else if( window_process(line) ) ; else if( html_process(line) ) ; else if( label_process(line) ) ; else if( p_process(line) ) ; else if( vbox_process(line) ) ; else if( lineedit_process(line) ) ; else if( textedit_process(line) ) ; else if( list_process(line) ) ; else if( menubar_process(line) ) ; else if( workspace_process(line) ) ; else if( quit_process(line) ) ; else { QRegExp re_line_blank("[ \\t\\n]*"); if( !re_line_blank.exactMatch (line) ) { fprintf( stderr, "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); } } } bool Process::menubar_process(QString line) { QRegExp re_menubar_start("[ \\t]*[ \\t\\n]*"); QRegExp re_menubar_end("[ \\t]*[ \\t\\n]*"); QRegExp re_menubar_item_start( "[ \\t]*[ \\t\\n]*" ); QRegExp re_menubar_item_end("[ \\t]*[ \\t\\n]*"); QRegExp re_menubar_item( "[ \\t]*[ \\t\\n]*" ); if( re_menubar_start.exactMatch (line) ) { MenuBar *w=NULL; QString name=re_menubar_start.cap(1); if( widgets.contains(name) ) { w=(MenuBar *)widgets.value(name); } else { w=new MenuBar; Widget *parent_widget=state.last(); w->name=re_menubar_start.cap(1); w->widget=new QMenuBar(); w->type=Widget::MENUBAR; widgets.insert(w->name,w); add_widget(parent_widget,w); } state.append(w); return true; } if(!state.empty()) { if( state.last()->type==Widget::MENUBAR ) { MenuBar *w=(MenuBar*)state.last(); QMenuBar *menubar=(QMenuBar *)(w->widget); if(w->state.empty()) { if( re_menubar_end.exactMatch (line) ) { state.removeLast(); w->widget->show(); return true; } else if( re_menubar_item_start.exactMatch (line) ) { QMenu *menu=new QMenu(w->widget); QString item_name=re_menubar_item_start.cap(2); QString item_text=re_menubar_item_start.cap(4); QString item_icon=re_menubar_item_start.cap(8); if(!item_name.isEmpty()) { ActionEvent *e=new ActionEvent; e->name=item_name; connect(menu->menuAction(),SIGNAL(triggered ()),e,SLOT(triggered())); connect(e,SIGNAL(triggered_event(QString)),this, SLOT(write_to_process(QString))); } menu->setTitle(item_text); if(!item_icon.isEmpty()) { menu->setIcon(QIcon(item_icon)); //menu->menuAction()->setIconText(item_text); } menubar->addMenu(menu); w->state.append(Widget::ITEM); w->menu.append(menu); return true; } else if( re_menubar_item.exactMatch (line) ) { QMenu *menu=new QMenu(w->widget); QString item_name=re_menubar_item.cap(2); QString item_text=re_menubar_item.cap(4); QString item_icon=re_menubar_item.cap(8); if(!item_name.isEmpty()) { ActionEvent *e=new ActionEvent; e->name=item_name; connect(menu->menuAction(),SIGNAL(triggered ()),e,SLOT(triggered())); connect(e,SIGNAL(triggered_event(QString)),this, SLOT(write_to_process(QString))); } menu->setTitle(item_text); if(!item_icon.isEmpty()) menu->menuAction()->setIcon(QIcon(item_icon)); menubar->addMenu(menu); return true; } } else { if( re_menubar_item_end.exactMatch (line) ) { w->state.removeLast(); w->menu.removeLast(); return true; } else if( re_menubar_item_start.exactMatch (line) ) { QMenu *menu=new QMenu(w->widget); QString item_name=re_menubar_item_start.cap(2); QString item_text=re_menubar_item_start.cap(4); QString item_icon=re_menubar_item_start.cap(8); if(!item_name.isEmpty()) { ActionEvent *e=new ActionEvent; e->name=item_name; connect(menu->menuAction(),SIGNAL(triggered ()),e,SLOT(triggered())); connect(e,SIGNAL(triggered_event(QString)),this, SLOT(write_to_process(QString))); } menu->setTitle(item_text); if(!item_icon.isEmpty()) menu->menuAction()->setIcon(QIcon(item_icon)); w->menu.last()->addMenu(menu); w->state.append(Widget::ITEM); w->menu.append(menu); return true; } else if( re_menubar_item.exactMatch (line) ) { QString item_name=re_menubar_item.cap(2); QString item_text=re_menubar_item.cap(4); QString item_icon=re_menubar_item.cap(8); QAction *menu; if(!item_icon.isEmpty()) menu=new QAction(QIcon(item_icon),item_text,w->menu.last()); else menu=new QAction(item_text,w->menu.last()); if(!item_name.isEmpty()) { ActionEvent *e=new ActionEvent; e->name=item_name; connect(menu,SIGNAL(triggered()),e,SLOT(triggered())); connect(e,SIGNAL(triggered_event(QString)),this, SLOT(write_to_process(QString))); } w->menu.last()->addAction(menu); return true; } } } } return false; } bool Process::list_process(QString line) { QRegExp re_list_start("[ \\t]*[ \\t\\n]*"); QRegExp re_list_end("[ \\t]*[ \\t\\n]*"); QRegExp re_list_headers_start("[ \\t]*[ \\t\\n]*"); QRegExp re_list_headers_end("[ \\t]*[ \\t\\n]*"); QRegExp re_list_item_start("[ \\t]*[ \\t\\n]*"); QRegExp re_list_item_end("[ \\t]*[ \\t\\n]*"); QRegExp re_list_listen("[ \\t]*[ \\t\\n]*"); QRegExp re_list_selection_mode("[ \\t]*[ \\t\\n]*"); if( re_list_start.exactMatch (line) ) { List *w=NULL; QString name=re_list_start.cap(1); if( widgets.contains(name) ) { w=(List *)widgets.value(name); } else { w=new List; Widget *parent_widget=state.last(); w->name=re_list_start.cap(1); w->widget=new QTreeWidget; w->type=Widget::LIST; widgets.insert(w->name,w); add_widget(parent_widget,w); } state.append(w); return true; } if(!state.empty()) { if( state.last()->type==Widget::LIST ) { List *w=(List *)state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } QTreeWidget *tree=(QTreeWidget*)w->widget; if(w->state.empty()) { if( re_list_end.exactMatch (line) ) { state.removeLast(); w->widget->show(); return true; } else if( re_list_headers_start.exactMatch (line) ) { w->state.append(Widget::HEADERS); return true; } else if( re_list_item_start.exactMatch (line) ) { w->state.append(Widget::ITEM); QTreeWidgetItem *item=new QTreeWidgetItem(); QString item_name=re_list_item_start.cap(2); item->setData(0,1,QVariant(item_name)); w->item.append(item); w->items_list.append(w->items); return true; } else if( re_list_listen.exactMatch (line) ) { connect(tree,SIGNAL(itemSelectionChanged ()), w, SLOT(selection_changed())); connect(w,SIGNAL(selection_changed_event(QString )), this, SLOT(write_to_process(QString))); return true; } else if( re_list_selection_mode.exactMatch (line) ) { QString mode=re_list_selection_mode.cap(1); if(mode=="single") tree->setSelectionMode(QAbstractItemView::SingleSelection); else tree->setSelectionMode(QAbstractItemView::ExtendedSelection); return true; } } else { if(w->state.last()==Widget::HEADERS) { if( re_list_headers_end.exactMatch (line) ) { w->state.removeLast(); tree->setHeaderLabels(w->headers); } else { w->headers << line.trimmed(); } return true; } else if(w->state.last()==Widget::ITEM) { if( re_list_item_end.exactMatch (line) ) { w->state.removeLast(); QTreeWidgetItem *item=w->item.last(); w->item.removeLast(); for(int i=0;iitems.size();i++) item->setText(i,QString(w->items.at(i))); if(w->item.empty()) tree->addTopLevelItem (item); else { //w->item.last()->addChild(item); } w->items.clear(); w->items=w->items_list.last(); w->items_list.removeLast(); } else if( re_list_item_start.exactMatch (line) ) { w->state.append(Widget::ITEM); QTreeWidgetItem *item=NULL; if(w->item.empty()) w->item.append(item=new QTreeWidgetItem()); else w->item.append(new QTreeWidgetItem(item=w->item.last())); QString item_name=re_list_item_start.cap(2); item->setData(0,1,QVariant(item_name)); w->items_list.append(w->items); w->items.clear(); return true; } else { w->items << line.trimmed(); } return true; } } } } return false; } bool Process::lineedit_process(QString line) { QRegExp re_lineedit_start("[ \\t]*[ \\t\\n]*"); QRegExp re_lineedit_end("[ \\t]*[ \\t\\n]*"); QRegExp re_lineedit_text("[ \\t]*[ \\t\\n]*"); QRegExp re_lineedit_getText("[ \\t]*[ \\t\\n]*"); if( re_lineedit_start.exactMatch (line) ) { Widget *w=NULL; QString name=re_lineedit_start.cap(1); if( widgets.contains(name) ) { w=widgets.value(name); } else { w=new Widget; Widget *parent_widget=state.last(); w->name=re_lineedit_start.cap(1); w->widget=new QLineEdit(parent_widget->widget); w->type=Widget::LINEEDIT; widgets.insert(w->name,w); add_widget(parent_widget,w); } state.append(w); return true; } if(!state.empty()) { if( state.last()->type==Widget::LINEEDIT ) { Widget *w=state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } QLineEdit *line_edit=(QLineEdit*)w->widget; if( re_lineedit_end.exactMatch (line) ) { state.removeLast(); w->widget->show(); return true; } else if( re_lineedit_text.exactMatch (line) ) { QString text( re_lineedit_text.cap(1) ); line_edit->setText(text); return true; } else if( re_lineedit_getText.exactMatch (line) ) { QString text(line_edit->text()); write_to_process(QString().setNum(text.size())+"\n"+text+"\n"); return true; } } } return false; } bool Process::texttag_process(QString tagname, QString & end, QList & state, QString line, QString & text) { QRegExp re_text_start("[ \\t]*<"+tagname+"([ \\t]+end=\"(.*)\")?[ \\t]*>[ \\t\\n]*"); QRegExp re_text_end ("[ \\t]*[ \\t\\n]*"); if(state.empty() || state.last()!=Widget::TEXT) { if( re_text_start.exactMatch (line) ) { end=re_text_start.cap(2); state.append(Widget::TEXT); return true; } } else if(state.last()==Widget::TEXT) { if( re_text_end.exactMatch (line) ) { if(end==re_text_end.cap(2)) { state.removeLast(); return true; } } if(end.isEmpty()) text+=line.trimmed()+"\n"; else text+=line; return true; } return false; } bool Process::textedit_process(QString line) { QRegExp re_textedit_start("[ \\t]*[ \\t\\n]*"); QRegExp re_textedit_end("[ \\t]*[ \\t\\n]*"); //QRegExp re_textedit_text_start("[ \\t]*[ \\t\\n]*"); //QRegExp re_textedit_text_end("[ \\t]*[ \\t\\n]*"); QRegExp re_textedit_getText("[ \\t]*[ \\t\\n]*"); if( state.last()->type!=Widget::TEXTEDIT && re_textedit_start.exactMatch (line) ) { Widget *w=NULL; QString name=re_textedit_start.cap(1); if( widgets.contains(name) ) { w=widgets.value(name); } else { w=new Widget; Widget *parent_widget=state.last(); w->name=re_textedit_start.cap(1); w->widget=new QTextEdit; w->type=Widget::TEXTEDIT; widgets.insert(w->name,w); add_widget(parent_widget,w); } state.append(w); return true; } if(!state.empty()) { if( state.last()->type==Widget::TEXTEDIT ) { Widget *w=state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } QTextEdit *text_edit=(QTextEdit*)w->widget; if(w->state.empty()) { if( re_textedit_end.exactMatch (line) ) { state.removeLast(); w->widget->show(); return true; } /* else if( re_textedit_text_start.exactMatch (line) ) { w->state.append(Widget::TEXT); text_edit->setPlainText(""); return true; } */ else if( re_textedit_getText.exactMatch (line) ) { QString text(text_edit->toPlainText()); write_to_process(QString().setNum(text.size())+"\n"+text+"\n"); return true; } else { QString itext; end=""; bool ok=texttag_process("text", end, w->state, line, itext ); if( ok ) { text_edit->setPlainText(""); } return ok; } } else { /* if( re_textedit_text_end.exactMatch (line) ) { w->state.removeLast(); return true; } else if(w->state.last()==Widget::TEXT) { QString text(text_edit->toPlainText()); text_edit->setPlainText(text+line.trimmed()+"\n"); return true; }*/ QString itext; bool ok=texttag_process("text", end, w->state, line, itext ); if( ok ) { QString text(text_edit->toPlainText()); text_edit->setPlainText(text+itext); } return ok; } } } return false; } bool Process::button_process(QString line) { QRegExp re_button_start("[ \\t]*[ \\t\\n]*"); QRegExp re_button_end("[ \\t]*[ \\t\\n]*"); //QRegExp re_button_text_start("[ \\t]*[ \\t\\n]*"); //QRegExp re_button_text_end("[ \\t]*[ \\t\\n]*"); QRegExp re_button_icon("[ \\t]*[ \\t\\n]*"); QRegExp re_button_listen("[ \\t]*[ \\t\\n]*"); if( re_button_start.exactMatch (line) ) { Widget *w=new Widget; Widget *parent_widget=state.last(); w->name=re_button_start.cap(1); w->widget=new QPushButton; w->type=Widget::BUTTON; widgets.insert(w->name,w); add_widget(parent_widget,w); state.append(w); QObject::connect(w,SIGNAL(event(QString)), this, SLOT(write_to_process(QString))); return true; } if( !state.empty() && state.last()->type==Widget::BUTTON ) { Widget *w=state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } QPushButton *button=(QPushButton *) w->widget; if( w->state.empty() ) { if(re_button_end.exactMatch (line) ) { state.removeLast(); w->widget->show(); return true; } /* else if( re_button_text_start.exactMatch (line) ) { w->state.append(Widget::TEXT); return true; } */ else if( re_button_icon.exactMatch (line) ) { QString icon( re_button_icon.cap(1) ); button->setIcon( QIcon(icon) ); return true; } else if( re_button_listen.exactMatch (line) ) { QString event( re_button_listen.cap(1) ); if(event.trimmed()=="clicked") { QObject::connect(button, SIGNAL(released()), w, SLOT(clicked())); } return true; } else { QString itext; end=""; bool ok=texttag_process("text", end, w->state, line, itext ); if( ok ) { button->setText(""); } return ok; } } else { /* if( w->state.last()==Widget::TEXT) { if( re_button_text_end.exactMatch (line) ) { w->state.removeLast(); } else { QString text(button->text()); if(text.isEmpty()) button->setText(line.trimmed()); else button->setText(text+"\n"+line.trimmed()); } return true; } */ QString itext; bool ok=texttag_process("text", end, w->state, line, itext ); if( ok ) { QString text(button->text()); button->setText(text+itext); } return ok; } } return false; } bool Process::label_process(QString line) { QRegExp re_label_start("[ \\t]*[ \\t\\n]*"); QRegExp re_label_end("[ \\t]*[ \\t\\n]*"); if( re_label_start.exactMatch (line) ) { Widget *w=new Widget; Widget *parent_widget=state.last(); w->name=re_label_start.cap(1); w->widget=new QLabel; w->type=Widget::LABEL; widgets.insert(w->name,w); add_widget(parent_widget,w); state.append(w); return true; } else if( re_label_end.exactMatch (line) ) { Widget *w=state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } if(w->type!=Widget::LABEL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); printf( "Should be: %s object\n", w->name.toLocal8Bit().data() ); return true; } state.removeLast(); w->widget->show(); return true; } else if(state.last()->type==Widget::LABEL) { Widget *w=state.last(); QLabel *b=(QLabel *) w->widget; QString text(b->text()); if(text.isEmpty()) b->setText(line.trimmed()); else b->setText(text+"\n"+line.trimmed()); return true; } return false; } bool Process::html_process(QString line) { QRegExp re_html_start("[ \\t]*[ \\t\\n]*"); QRegExp re_html_end("[ \\t]*[ \\t\\n]*"); if( re_html_start.exactMatch (line) ) { QString name=re_html_start.cap(1); Widget *w=NULL; if(widgets.contains(name)) { w=widgets.value(name); ((QTextBrowser*)(w->widget))->setHtml(""); } else { w=new Widget; Widget *parent_widget=state.last(); w->name=name; w->widget=new QTextBrowser; w->type=Widget::HTML; widgets.insert(w->name,w); add_widget(parent_widget,w); } QString src(re_html_start.cap(3)); if(!src.isEmpty()) ((QTextBrowser*)(w->widget))->setSource(QUrl (src) ); else state.append(w); return true; } else if( re_html_end.exactMatch (line) ) { Widget *w=state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } if(w->type!=Widget::HTML) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); printf( "Should be: %s object\n", w->name.toLocal8Bit().data() ); return true; } state.removeLast(); w->widget->show(); return true; } else if(state.last()->type==Widget::HTML) { Widget *w=state.last(); QTextBrowser *b=(QTextBrowser *) w->widget; QString text(b->toHtml()); if(text.isEmpty()) b->setHtml(line.trimmed()); else b->setHtml(text+"\n"+line.trimmed()); return true; } return false; } bool Process::workspace_process(QString line) { QRegExp re_workspace_start("[ \\t]*[ \\t\\n]*"); QRegExp re_workspace_end("[ \\t]*[ \\t\\n]*"); if( re_workspace_start.exactMatch (line) ) { QString name=re_workspace_start.cap(1); Widget *w=NULL; if(widgets.contains(name)) { w=widgets.value(name); } else { w=new Widget; Widget *parent_widget=state.last(); w->name=name; w->widget=new QWorkspace; w->type=Widget::WORKSPACE; widgets.insert(w->name,w); ((QWorkspace*)(w->widget))->setScrollBarsEnabled(true); add_widget(parent_widget,w); } state.append(w); return true; } else if( !state.empty() && state.last()->type==Widget::WORKSPACE && re_workspace_end.exactMatch (line) ) { Widget *w=state.last(); state.removeLast(); w->widget->show(); return true; } return false; } bool Process::p_process(QString line) { QRegExp re_p_start("[ \\t]*

[ \\t\\n]*"); QRegExp re_p_end("[ \\t]*

[ \\t\\n]*"); if( re_p_start.exactMatch (line) ) { Widget *w=new Widget; Widget *parent_widget=state.last(); w->name=QString( "p"+QString().setNum(n_line) ); w->widget=new QWidget; w->type=Widget::P; widgets.insert(w->name,w); state.append(w); QHBoxLayout *hbox=new QHBoxLayout; w->widget->setLayout(hbox); add_widget(parent_widget,w); return true; } else if( re_p_end.exactMatch (line) ) { Widget *w=state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } if(w->type!=Widget::P) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); printf( "Should be: %s object\n", w->name.toLocal8Bit().data() ); return true; } state.removeLast(); w->widget->show(); return true; } return false; } bool Process::vbox_process(QString line) { QRegExp re_vbox_start("[ \\t]*[ \\t\\n]*"); QRegExp re_vbox_end("[ \\t]*[ \\t\\n]*"); if( re_vbox_start.exactMatch (line) ) { Widget *w=new Widget; Widget *parent_widget=state.last(); w->name=QString( "v"+QString().setNum(n_line) ); w->widget=new QWidget; w->type=Widget::VBOX; widgets.insert(w->name,w); state.append(w); QVBoxLayout *vbox=new QVBoxLayout; w->widget->setLayout(vbox); add_widget(parent_widget,w); return true; } else if( re_vbox_end.exactMatch (line) ) { Widget *w=state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } if(w->type!=Widget::VBOX) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); printf( "Should be: %s object\n", w->name.toLocal8Bit().data() ); return true; } state.removeLast(); w->widget->show(); return true; } return false; } bool Process::quit_process(QString line) { QRegExp re_quit_start("[ \\t]*[ \\t\\n]*"); if( state.empty() && re_quit_start.exactMatch (line) ) { QApplication::quit(); return true; } return false; } bool Process::window_process(QString line) { QRegExp re_window_start("[ \\t]*[ \\t\\n]*"); QRegExp re_window_end("[ \\t]*[ \\t\\n]*"); QRegExp re_window_title("[ \\t]*[ \\t\\n]*"); QRegExp re_window_icon("[ \\t]*[ \\t\\n]*"); QRegExp re_window_fullscreen("[ \\t]*[ \\t\\n]*"); //Starts window tag if( re_window_start.exactMatch (line) ) { Window *w; QString name=re_window_start.cap(1); if(widgets.contains(name)) { w=(Window*)widgets.value(name); } else { w=new Window; w->name=name; QScrollArea *scroll=new QScrollArea(); WsWindow *widget=new WsWindow(w, scroll); widget->show(); w->widget=scroll; w->type=Widget::WINDOW; widgets.insert(w->name,w); scroll->setWidget(widget); scroll->setWidgetResizable (true); w->scroll=widget; QObject::connect(w,SIGNAL(event(QString)), this, SLOT(write_to_process(QString))); QVBoxLayout *layout=new QVBoxLayout; layout->setMargin(0); layout->setSpacing(0); widget->setLayout(layout); if(!state.empty()) { Widget *parent_widget=state.last(); add_widget(parent_widget,w); } } state.append(w); return true; } else if(state.last()->type==Widget::WINDOW) { Widget *w=state.last(); if(w==NULL) { printf( "Error in line %d: %s\n",n_line, line.toLocal8Bit().data() ); return true; } if( re_window_end.exactMatch (line) ) { state.removeLast(); w->widget->show(); return true; } else if( re_window_title.exactMatch (line) ) { QString title( re_window_title.cap(1) ); w->widget->setWindowTitle( title.trimmed() ); return true; } else if( re_window_icon.exactMatch (line) ) { QString title( re_window_icon.cap(1) ); //printf("title %s\n",title.toLocal8Bit().data()); w->widget->setWindowIcon( QIcon( title.trimmed() ) ); return true; } else if( re_window_fullscreen.exactMatch (line) ) { QString full_screen( re_window_fullscreen.cap(1) ); printf("full screen %s\n",full_screen.toLocal8Bit().data()); if(full_screen.trimmed()=="true") { w->widget->setWindowState(Qt::WindowFullScreen); } else { w->widget->setWindowState(Qt::WindowNoState); } return true; } } return false; } void Widget::clicked() { QString e("*clicked: "); e+=name+"\n"; emit event(e); } qtoctave-0.10.1/widgetserver/widgetserver/process.h0000755000175000017500000000331311511434230021467 0ustar lucaslucas#ifndef __PROCESS_H__ #define __PROCESS_H__ #include #include #include #include class Widget: public QObject { Q_OBJECT public: QString name; QWidget *widget; enum Type {NOWIDGET,WINDOW,P,BUTTON,LABEL,VBOX,LINEEDIT,TEXTEDIT,HTML,LIST,MENUBAR,WORKSPACE}; Type type; enum State {NORMAL,TEXT,HEADERS,ITEM}; QList state; public slots: void clicked(); signals: void event(QString e); }; class Process: public QObject { Q_OBJECT private: bool debug_ok; //Reading state QList state; //Add widget to parent widget void add_widget(Widget *parent, Widget *child); //Process widget bool window_process(QString line); bool p_process(QString line); bool button_process(QString line); bool label_process(QString line); bool vbox_process(QString line); bool lineedit_process(QString line); bool textedit_process(QString line); bool html_process(QString line); bool list_process(QString line); bool menubar_process(QString line); bool workspace_process(QString line); bool quit_process(QString line); QString end; //String used for archived text tag end bool texttag_process(QString tagname, QString & end, QList & state, QString line, QString & text); protected: int n_line; public: Process(); ~Process(); QMap widgets; void setDebug(bool debug_ok); public slots: void write_to_process(QString e); void process(QString line); signals: void write_to_output(QString e); }; class ExternProcess:public QProcess { Q_OBJECT Process *process; public: ExternProcess(QString command, Process *process); public slots: void read_stdout(); void write_to_process(QString e); }; #endif qtoctave-0.10.1/widgetserver/widgetserver/window.cpp0000755000175000017500000000062411511434230021655 0ustar lucaslucas#include "window.h" WsWindow::WsWindow(Window *w, QWidget *parent):QWidget(parent) { this->w=w; connect(this, SIGNAL(close_signal()), w, SLOT(close_signal_callback()) ); } void WsWindow::closeEvent ( QCloseEvent * event ) { emit close_signal(); } void WsWindow::hideEvent ( QHideEvent * event ) { emit close_signal(); } void Window::close_signal_callback() { emit event("*close: "+name+"\n"); } qtoctave-0.10.1/widgetserver/widgetserver/widgetserver.pro0000755000175000017500000000077111511434230023101 0ustar lucaslucas###################################################################### # Automatically generated by qmake (2.01a) lun oct 15 10:01:14 2007 ###################################################################### TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += buffer.h input.h list.h menubar.h process.h window.h SOURCES += buffer.cpp \ input.cpp \ list.cpp \ main.cpp \ menubar.cpp \ process.cpp \ window.cpp qtoctave-0.10.1/qtoctave_pkg/src/images/cancel.png0000644000175000017500000000157211511434231021075 0ustar lucaslucasPNG  IHDRabKGD pHYs  @AtIME ",ᢂIDATxm[hufg/&K.hR)mjԂ-TA` VWT)*QV+} ڠ^&-6YldRsٰl6dgƇhM?9ps>6sy[q>\\q]pv+Vn!y\RƝ4|,%)ׄJ}AD|sv u8Ͽ`>;Ux̩M%rwfу6(~v/NCNhm;L>+ǩ0qx G}><ݷZEFтAT k5_Yoڄ .B3e&ߦ}a&B y#t_~?~ɧWp2;+՝:Х"iG&cx;1&X:O]Z, -7b 07ov G/7W#\weSY"W|i@(dCuH^UtmleA4{}g |xu~l,_4 gk5Ȭ*8>utS8TڞAfя0?-;vt-ѵs E2R)X8w.S[Ӊzݙp:}ݍdׅ$dL&S [SqW65P/~-;NĮd2ʆo6:+՝.GDEs `1X_&јIENDB`qtoctave-0.10.1/qtoctave_pkg/src/images/help.png0000644000175000017500000000306311511434231020575 0ustar lucaslucasPNG  IHDR szzbKGD pHYs  #utIME 0u?IDATxŗMl\~sr*R&FTi iQ$"@Y{($ҫ{񢗢HQuZh+;b&vR5-ڪAR!%XÒ)&K0ٙy/rhil5 LJƜ KlA,#oܙ ,`":yVBH,)|2m@` DÉGDA(]2r80ui:c.|.k[,qMX{J|Je h |&x.F 2]4Ft?=چM4}RgQ7J| Ú=3} a|O|*Ǝ֎3zyyi/?ͥmt,^mDssA 8UHe+PlgΡgƨWn"0jv מwT d/A"7pk g;q!wZJ]Pxn丆S w;7pmY뫐/W}4~Ʌwu恳q('4MnsNn&aYP,Mpʕ=h<fM"C0S)i nBmIs|X%V] 7,5 $+Rzn : IMFy6|hl;4 %%(|kzTZG%W@C?)AxKZkQ1"5e1PǏ_=WXڄ(^ zuB .K)~Fwm[ʩG@x\AqޓJOJoۃaI|U(g~&"mk|L K{PyD4ug$ki e6LDlI!I٠*hC;(.Utʹd[5,%#ֿS16P,y5!0@suqfu+Ǘ823FOHd 2Wj'fNH.+*='~^yU #Cm2yĥʹ\~@&>zT.G29FO_ِǬ2L&C‘0Nkx rA3;fNHf$w#dRwU{iPr;ݾɛ#M@]񩜙>dM +cm|XSgφ~oӒɤ珆HDCu]ZH#~s#bL26$ yqP,qL 6伀;.&B\g̺][z^N[ K dw..z f\\ {St5s;Ft(_myCIENDB`qtoctave-0.10.1/qtoctave_pkg/src/images/package16.png0000644000175000017500000000200511511434231021402 0ustar lucaslucasPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb*_~+bV4nF幆"W 00|y )T-]7nW_a @,.1&%[RQiF9n>. -#?n?}նk9X~#|`f#'L؀l~3|? |,3(wCyeC+q3tïۏ~=+ç+/Xx^~wџb8A   :- *ڶMdn89YXdظ20rp2}.Vai_3|tAX8㫿.5E#@Hp3 ( s30db!_XDQy# 'ƿЄ@,~F>eXaЀ@g }L@(XJ_2 S<[7IM@0=Ty, yW"T.Ǹ 悩 HAcC f35OTȁ@̍ p"!f9Y q0k UcYpWj-=jzՄp H wz*{6 H&T%s%)ƄJ()x -!:Ӑ  Dd?d٩1/SPB$zli|;cs߮o0gZ3Z* Ց>me/8ɢK $'@qvQ P@^s-D7YP8` X/ Wyf޻~]U7iYdLhe*L3YQ裐 hI Ց():74Gǵi NKzb?5D>nyᛚ"ۦyTWlX9 ^II_Mȗ[}`э#]ݦs3v UqB :֨nICO6㾳I0"}qqMj*/챬S@`QWmԨt"sAAp|Q0|Jʕ2g$KёlEc){x?x s4_UӐEH{~jrK4FKZR%{c_m{1JvdIz2v}?O%uW )+k1˚`p }}t+(8ް+[ Lg=bzvL 1@+kF.u10ϕWeWjAH;8CK ۶\)A0dqIJ e"* avW:J"3]A0!3W0<S6.*#Y  A/"[/'0$M  YHC/Y~Uaga'.S&W3x ;?>93\˯\1 %0bb> GW1~Y y' @jF(ef`bdCmyLo, #Hiv0P!3#IENDB`qtoctave-0.10.1/qtoctave_pkg/src/images/reload.png0000644000175000017500000000071711511434231021116 0ustar lucaslucasPNG  IHDR&N:sBIT|dtEXtSoftwarewww.inkscape.org<aIDAT(mϋQ6%!)cG1KX(,d%XNl(;+KV6lc1=ssVqd'i7)\SvbxZU`ulk=jp3hXUE\!ɾ$J2T]/Ml"vij.apgڝ ީwURU} >pG6Q;ػz Ȁ/l$ZGJ9>kI槈UKxi,4= I<`ÿ~adQ 7WW[E`xAggLuu50{υ̻_Z͛XYky{j~NKEE@bfx=×o=93}gx |54DD}``exÇ/ w$O1r 1& A((9: I 14˗/@ ?999yy4~BHL0AD$D}dexm_L/@ʲ[?}ؿ/ܦQ _ L?Xra@1kk[ǿ^`GC_>*gkƗ€g`diʑ3 l322  ¿ r7NQL[}0G_f`} ȸ ^`6i9[03gx#KDpzZh-N{/ 0{~ax`a&IENDB`qtoctave-0.10.1/qtoctave_pkg/src/images/connect_established.png0000644000175000017500000000440411511434231023645 0ustar lucaslucasPNG  IHDR szzbKGD pHYs  ~tIME "$D.IDATxڭWkl=sq6B"B`@ԖVňGJVPUB !VjVRӪ*JQ*Q Iԉq:^׻ٙ~!t53#}߽C,~g9p,c|Ol9~8|C6*eS#mZ# 'ͅɈX>s22?: g~N XU͹pnI)/{.djU"|G@Z\M>'vsOȒw%l6?*Z:$ $&Z}xc"Yr.;^~òϽpr櫰=Yy$oѶ,C04z =0 Y[eIxH\ J6],ׯ>09^L k( % 7ω0?=~cY]ƄJTnKi0e""m{1b{=~ b|wr0eQkX&K]sBj#'؎ֲo8?ۻ'ćRëU:SW#mq6Vtg55GRլGGr۫U,=ܚ^v1 AXBkK6y uQ8ID\⇇f>O>~"Z W5 78 o> +A$'P%!G}r~h?^sXVtv͆n*l(%KXNg5aV,PcD`kqք{ ;ojv47Z :(}pOT\ӊֶ$>xx}lzBs5D,2c=]aȎ`$T9N MQtmĺ6ԯѻ\GyTL (2^̞/>G!ch0ІK;53A l^pHJd-9ݳl[s6}} q13Mct@*ː.}'aUml^VH4<Xw;UnYR-tt&ƣ(E_hbdʂs:\ґA4BbPH"E,@"44;khR^رӋiF\[e9!QR2=81-ch ёl޲:4i!!X٨YqcTY+ i:: x#;8;3,L""d qeOW~躇W6zDcB>=/UH$SRƆ DIFS[-m !`li*._ 1Ȋ-"PsH+p>vGwG9wdhz4-9  &&&ptZCZeO@)YYuai|3~B'=|hB|gZ gF 0 ]Wb]Dc*_tud9()|AX}x٭>?oM/} A<+),g(#eRqN?۶7@XB|iGy;;9N&FZñB e|~Ds8tFl >&Ƌ'-ץEC;^_oYאy[Z[8T$@kWI,cc+)\/yEx~bg8R8,i,~4ml؀kC:͜V_OSΧ`{c?eCÃYkLaZൽB@@vK + LkG^ykcX>^Ȳnx 8nU"A TMprAҍz9.l MZ;EzSt<PdbHSɐV"!FBՀ``{cʩS_UU9=ð0-a``Łw4!f3PILbjX3|sXfG{GGIpvxi-(LL̲ÇX|0Zr@ӫ~o/SWV:Uè"P;T $T2sIٶ[1 !xI~׵8!ӨB՜p~*~IENDB`qtoctave-0.10.1/qtoctave_pkg/src/images/package32.png0000644000175000017500000000451311511434231021406 0ustar lucaslucasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb` _ @Y {C% Ě @Xi!maÕs- Ę @Z|!eYoY P  MS@1H3;000H_ {W08%F!Q΀"(?0~Îbp`8bb% g~b_ +@"j9ay&Ç='޿0 zVpHA(C{}👅/U0 +g/^n>~Vt;A @Sܿ@ ߀; 8͝Xgi7Q0~/$t$9[.3,Gw@!;`?1 ^}se$",.iR/-?XlY#0ȦwcÃ??>Nb>w!0$88!1 l  wfv# abà`+ -;J {Z\ @<&y'>o/jQn9 ,g:СL ,\< Bv: o_gv 0F`/W ǁv]b: _p*b`h1Ї\!$13gx +7+)߿1|ޏ 'oLΰh ~ @LO|a 8ݷ008M` | 5 (Nha&>^H{ w7c VAV<^P`[9 \e`g`G5'Y`F3 <ola |`p_ R=͐##9T0{ : LBX:~ L,fat1ó'X8DD7ß>> @%~?i F L n]cq$91%VveQ{r9`|ctdF dxvӟ" o>ֺ 1b`f8M8t[@|o jj lf ϖc >0t2<黿`35@au,Y( $;w0p0?,00 hg e ́k n1DMp @@Xc9viQO3|_&p,b?=?0&I ?0[0[30saw _gxod.`(yR"@`s?P! >}g;nX\-8GO+;1xAʈA^T} .̐ 6N6`:H(/`&`vJ~+8:y]E6(@P\ p8XE-e`D1cae`A?1@X;Hɬᡀp %:?&@auϷ/|8z@@B1c`!(5_t``aGjCA\(Ak`Y{ Fg1 #). : xlpkqj1JYO#]n  XX9x}q+YW34N~b@*$ML`Ǡļ@ Pv `w1IENDB`qtoctave-0.10.1/qtoctave_pkg/src/images/exit.png0000644000175000017500000000357311511434231020624 0ustar lucaslucasPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org< IDATXŗIlenq11m K4DfĢDB9p R a D+Bd2ec&[J<΂Yv]ݵ̡[sJ_-_u9(Ɓ0wT)`랐ޮXzCCDt-7orzfaӁnƍ\g>jYk,"h"(C)&+PM+E"ѡ!\'t`||p4aRJDP=%Ϥ*3g2>8/@8i3Rnp"M(@²mL)VVpVVu?˗Yuu6mcZ##$wBVǸX$  f\ `5<]3/ZG$29IRupqP.' @|x 5űm37ݹ9"CCt=07=͛WW*qPJ#J=_~ק)b}-DL`N]*ѿo_^5Mǜ;r?@{;kkD,d\KG"`sϑf4DDL\~cdu۷_~O^c==,5M"Dq sϑI|ڳtw7dH(Ze+7O`$K% }Na.\4T:sLї_@ꪖ֑JN&;ؗJΝMO>;wTH?ǵmb]]daLYu۶^Bxfh 84Tp,FPiiSM Tivc jyW]C5ZZ䭁4ׅJe\if,k j!P^Xw {y=bmJR*A>b]iV2*J t۶єBjU"B\׃LĶlR.#Qߐ!+-C?7@S cz:8>NAu(P5fe0J)@6 hW)AOYVv0T oUFڡL@k/ou*٬Px);X#Fw.]"i!PfQ4R eu" ލo_J}ƭ?v&޽たs1{ʉ`!k Z_'BiObO8y2 a"CZeO(D[4y|o)=XooЦ Akdbx]‡SY)Qtk^6l&*Gdo!B br}=z&&hn;)^FU"6:JmQl4Cm AS4 /D䭷|O2]#w1y(:oJV{̞=%f9w&5ܷk&8zהBD8sۋ%66F֭W2Tfg.,01mP*eIsMZҵ)ŃO?~qY Mcs8d^Z*:0uPx\넓(Eֹ&Yms"u*E_Ŀ'[lf~q .t`f>ʶ͂_װ]R?y =kIENDB`qtoctave-0.10.1/qtoctave/src/scripts_octave/maxima.m0000644000175000017500000000037111511434230021511 0ustar lucaslucas function result=maxima(command) in=""; in=sprintf("echo \"string(%s);\"|maxima --very-quiet", command); [status,result]=system(in); %if(status!=0) result=""; endif; result = deblank ( strjust ( strrep (result, "%", "") ,"left") ); endfunction qtoctave-0.10.1/qtoctave/src/scripts_octave/_ide_completion_matches.m0000644000175000017500000000026311511434230025072 0ustar lucaslucasfunction _ide_completion_matches(command) l=completion_matches(command); [nrows,ncols]=size(l); for k=1:nrows fprintf(stderr,"~~Completion:%s\n",l(k,:)); endfor endfunction qtoctave-0.10.1/qtoctave/src/scripts_octave/_ide_reload_matrix.m0000644000175000017500000000243011511434230024045 0ustar lucaslucasfunction _ide_reload_matrix(a, reference, qtoctave__aux1, matrix_name) # Call this function as: # eval("matrix;","matrix=[0]"); _ide_reload_matrix(matrix, ptr, resize(a(:,:),size(a)(1),size(a)(2) ), "matrix") qtoctave__file_name=tmpnam(); %save("-text", qtoctave__file_name, "qtoctave__aux1"); save_matrix2(qtoctave__file_name, qtoctave__aux1); fprintf(stderr,"~~matrix:%s \"%s\" %d ", matrix_name, qtoctave__file_name, reference); fprintf(stderr, "%d ", size(a)); fprintf(stderr, "\n"); endfunction function save_matrix(qtoctave__file_name, a) rows=size(a)(1); cols=size(a)(2); fout=fopen(qtoctave__file_name, "w"); row=0; while(row=1) % UNIX % fprintf( stderr, "~~svgcanvassave: %d %dx%d %s\n", n, width, height, file); %elseif (length( regexp(file, "^.:.*") )>=1) % Windows % fprintf( stderr, "~~svgcanvassave: %d %dx%d %s\n", n, width, height, file ); %else % Local file % fprintf( stderr, "~~svgcanvassave: %d %dx%d %s/%s\n", n, width, height, pwd, file ); %endif endfunction qtoctave-0.10.1/qtoctave/src/scripts_octave/qtinfo.m0000644000175000017500000000025111511434230021532 0ustar lucaslucasfunction qtinfo() command=sprintf("qtoctave-info-reader %s > /dev/null", info_file); printf("Starting info: %s\n", command); system(command, 1, "async"); endfunction qtoctave-0.10.1/qtoctave/src/scripts_octave/_ide_reload_variables_list.m0000644000175000017500000000105111511434230025542 0ustar lucaslucasfunction _ide_reload_variables_list( _variables ) fprintf(stderr, "~~whos_clean:\n"); fprintf(stderr, "~~whos:*** local user variables:\n"); for qtoctave_aux2=1:length(_variables); fprintf(stderr, "~~whos:%s\t%s\t%d\t%s\n", _variables(qtoctave_aux2).name ,join("x", _variables(qtoctave_aux2).size), _variables(qtoctave_aux2).bytes, _variables(qtoctave_aux2).class); endfor; endfunction function str = join(d, arr); if (length(arr) > 1) str = strcat(int2str(arr(1)), d, join(d, arr(2:end))); else str = int2str(arr(1));endif; end;qtoctave-0.10.1/qtoctave/src/scripts_octave/svgcanvas_delete_on_load.m0000644000175000017500000000167411511434230025254 0ustar lucaslucas## -*- texinfo -*- ## @deftypefn {Function File} {} svgcanvas_delete_on_load (@var{n}, @var{file}) ## Load @var{file} in canvas number @var{n}. @var{file} must be in SVG file format. You can find more help about SVG file format in http://www.w3.org/TR/SVGMobile12/ ## @var{file} is deleted. This command is very useful for animations. ## Suggestion: Use SvgPlot package for plotting. ## @seealso{svgcanvasload, svgcanvassave, svgcanvas_delete_on_load} ## @end deftypefn function svgcanvas_delete_on_load(n, file) fprintf( stderr, "~~svgcanvasdeleteonload: %d %s\n", n, make_absolute_filename(file) ); %if(length( regexp(file, "^/.*") )>=1) % UNIX % fprintf( stderr, "~~svgcanvasdeleteonload: %d %s\n", n, file); %elseif (length( regexp(file, "^.:.*") )>=1) % Windows % fprintf( stderr, "~~svgcanvasdeleteonload: %d %s\n", n, file ); %else % Local file % fprintf( stderr, "~~svgcanvasdeleteonload: %d %s/%s\n", n, pwd, file ); %endif endfunction qtoctave-0.10.1/qtoctave/src/scripts_octave/svgcanvasload.m0000644000175000017500000000145711511434230023076 0ustar lucaslucas## -*- texinfo -*- ## @deftypefn {Function File} {} svgcanvasload (@var{n}, @var{file}) ## Load @var{file} in canvas number @var{n}. @var{file} must be in SVG file format. You can find more help about SVG file format in http://www.w3.org/TR/SVGMobile12/ ## Suggestion: Use SvgPlot package for plotting. ## @seealso{svgcanvasload, svgcanvassave, svgcanvas_delete_on_load} ## @end deftypefn function svgcanvasload(n, file) fprintf( stderr, "~~svgcanvas: %d %s\n", n, make_absolute_filename(file) ); %if(length( regexp(file, "^/.*") )>=1) % UNIX % fprintf( stderr, "~~svgcanvas: %d %s\n", n, file); %elseif (length( regexp(file, "^.:.*") )>=1) % Windows % fprintf( stderr, "~~svgcanvas: %d %s\n", n, file ); %else % Local file % fprintf( stderr, "~~svgcanvas: %d %s/%s\n", n, pwd, file ); %endif endfunction qtoctave-0.10.1/qtoctave/src/svgcanvas/svgcanvas.cpp0000644000175000017500000002015511511434230021523 0ustar lucaslucas#include "svgcanvas.h" #include #include void SvgCanvas::setCanvasNumber(int n) { canvas_number=n; setWindowTitle("SvgCanvas "+QString::number(n)); } int SvgCanvas::getCanvasNumber() { return canvas_number; } void SvgCanvas::setOctaveConnection(OctaveConnection *oc) { if(oc!=NULL) { this->oc=oc; connect(oc, SIGNAL(line_ready(QString)), this, SLOT(line_ready(QString))); } } SvgCanvas::SvgCanvas(QWidget *parent):BaseWidget(parent) { widget_type=SVGCANVAS; setWindowTitle("SvgCanvas"); setWindowIcon( QIcon( QString( ICON_PATH )+"/graphs_section.png") ); resize(300,300); QVBoxLayout *layout = new QVBoxLayout; centralWidget()->setLayout(layout); layout->setContentsMargins(0,0,0,0); svg_plot=new QSvgWidget(this); svg_plot->setAutoFillBackground(true); svg_plot->setBackgroundRole(QPalette::HighlightedText); svg_plot->show(); layout->addWidget(svg_plot); re.setPattern("~~svgcanvas: *(\\d+) +(.+)\n"); re_delete_on_load.setPattern("~~svgcanvasdeleteonload: *(\\d+) +(.+)\n"); re_save.setPattern("~~svgcanvassave: *(\\d+) +(\\d+)x(\\d+) +(.+)\n"); oc=NULL; setCanvasNumber(0); menuFile=menuBar()->addMenu("File"); actionExportTo = new QAction(this); actionExportTo->setText(QApplication::tr("Export to...")); menuFile->addAction(actionExportTo); connect(actionExportTo, SIGNAL(triggered()), this, SLOT(actionExport_to_callback())); } /*** Xml Handler ***/ class XmlCheckHandler:public QXmlDefaultHandler { QStatusBar *statusBar; QString svg_file_name; public: // Constructor XmlCheckHandler(QStatusBar *statusBar, QString svg_file_name): QXmlDefaultHandler() { this->statusBar=statusBar; this->svg_file_name=svg_file_name; } bool startElement(const QString &/*namespaceURI*/, const QString &/*localName*/, const QString &/*qname*/, const QXmlAttributes &/*atts*/) { return true; } bool characters(const QString &ch) { return true; } bool endElement( const QString & /*namespaceURI*/, const QString & /*localName*/, const QString & /*qname*/ ) { return true; } bool error ( const QXmlParseException & exception ) { int line, col; line=exception.lineNumber(); col=exception.columnNumber(); QString _error="Line "+QString::number(line)+" Col "+QString::number(col)+": "+exception.message()+" "+svg_file_name; statusBar->showMessage(_error); return false; } bool fatalError ( const QXmlParseException & exception ) { return error(exception); } bool warning ( const QXmlParseException & exception ) { return error(exception); } }; void SvgCanvas::load_file(QString svg_file_name) { statusBar()->clearMessage(); svg_plot->load(svg_file_name); QSvgRenderer *renderer=svg_plot->renderer(); if(! renderer->isValid () ) { QFile file(svg_file_name); QXmlSimpleReader parser; QXmlInputSource source(&file); XmlCheckHandler handler(statusBar(), svg_file_name); file.open(QIODevice::ReadOnly); parser.setContentHandler(&handler); parser.setErrorHandler(&handler); parser.parse(&source); file.close(); } } void SvgCanvas::line_ready(QString line) { if( re.exactMatch(line) ) { int number=re.cap(1).toInt(); if(number==canvas_number) { svg_file_name=re.cap(2); //svg_plot->load(svg_file_name); load_file(svg_file_name); } } else if( re_delete_on_load.exactMatch(line) ) { int number=re_delete_on_load.cap(1).toInt(); if(number==canvas_number) { svg_file_name=re_delete_on_load.cap(2); //svg_plot->load(svg_file_name); load_file(svg_file_name); QFile file(svg_file_name); // if(file.open(QIODevice::ReadOnly | QIODevice::Text)) // { // QByteArray in=file.readAll(); // // svg_plot->load(in); // } file.remove(); } } else if( re_save.exactMatch(line) ) { int number=re_save.cap(1).toInt(); if(number==canvas_number) { int width=re_save.cap(2).toInt(); int height=re_save.cap(3).toInt(); QString file_name=re_save.cap(4); if( file_name.endsWith(".jpg") || file_name.endsWith(".png") ) { export_to_png_jpg(width, height, file_name); } else if( file_name.endsWith(".pdf") || file_name.endsWith(".eps") ||file_name.endsWith(".ps") ) export_to_pdf_ps(width, height, file_name); } } } BaseWidget *SvgCanvas::copyBaseWidget( QWidget * parent ) { SvgCanvas *bw = new SvgCanvas(parent); if(oc!=NULL) bw->setOctaveConnection(oc); bw->setCanvasNumber(canvas_number); if(!svg_file_name.isEmpty()) bw->svg_plot->load(svg_file_name); bw->svg_file_name=svg_file_name; bw->setSession(session); return bw; } void SvgCanvas::export_to_png_jpg(int width, int height, QString filename) { QPainter plot; QImage image(width,height,QImage::Format_RGB32); plot.begin(&image); svg_plot->renderer()->render(&plot); plot.end(); image.save(filename); } void SvgCanvas::export_to_pdf_ps(int width, int height, QString filename) { QPainter plot; QPrinter p; p.setFullPage(true); p.setPageSize(QPrinter::Custom); if( filename.endsWith(".pdf") ) p.setOutputFormat(QPrinter::PdfFormat); else p.setOutputFormat(QPrinter::PostScriptFormat); p.setOutputFileName(filename); plot.begin(&p); svg_plot->renderer()->render(&plot); plot.end(); } #include "ui_export_to_dialog.h" enum ExportFormat {PIXMAP, PICTURE, PRINTER, PDF, SVG}; using namespace Ui; void SvgCanvas::actionExport_to_callback() { QDialog dialog; ExportToDialog export_to_dialog; export_to_dialog.setupUi(&dialog); QListWidget *list = export_to_dialog.formats_listWidget; QListWidgetItem *item; //Pixmaps formats QList formats=QImageWriter::supportedImageFormats(); for(int i=0;isetData(1,QVariant(PIXMAP)); } //Vector formats formats= QPicture::outputFormats(); for(int i=0;isetData(1,QVariant(PICTURE)); } item=new QListWidgetItem("ps",list); item->setData(1,QVariant(PRINTER)); item=new QListWidgetItem("pdf",list); item->setData(1,QVariant(PDF)); item=new QListWidgetItem("svg",list); item->setData(1,QVariant(SVG)); int ok=dialog.exec(); if(ok==QDialog::Rejected) return; item =list->currentItem(); int format=item->data(1).toInt(); QPainter plot; switch(format) { case PIXMAP: { bool ok; int h, w = QInputDialog::getInteger(this, tr("Width"), tr("Width:"), 300, 0, 2147483647, 1, &ok); if(!ok) return; h=QInputDialog::getInteger(this, tr("Height"), tr("Height:"), 200, 0, 2147483647, 1, &ok); if(!ok) return; QString s = QFileDialog::getSaveFileName(this, "Choose a filename to save"); if(s.isEmpty()) return; QImage image(w,h,QImage::Format_RGB32); plot.begin(&image); svg_plot->renderer()->render(&plot); plot.end(); image.save(s,item->data(0).toString().toLocal8Bit().data()); } break; case PICTURE: { bool ok; int h, w = QInputDialog::getInteger(this, tr("Width"), tr("Width:"), 300, 0, 2147483647, 1, &ok); if(!ok) return; h=QInputDialog::getInteger(this, tr("Height"), tr("Height:"), 200, 0, 2147483647, 1, &ok); if(!ok) return; QString s = QFileDialog::getSaveFileName(this, "Choose a filename to save"); if(s.isEmpty()) return; QPicture image; const QRect r(0,0,w,h); image.setBoundingRect(r); plot.begin(&image); svg_plot->renderer()->render(&plot); plot.end(); image.save(s,item->data(0).toString().toLocal8Bit().data()); } break; case PRINTER: { QPrinter p; QPrintDialog printDialog(&p, this); if (printDialog.exec() != QDialog::Accepted) return; plot.begin(&p); svg_plot->renderer()->render(&plot); plot.end(); } break; case PDF: { QPrinter p; QPrintDialog printDialog(&p, this); p.setOutputFormat(QPrinter::PdfFormat); if (printDialog.exec() != QDialog::Accepted) return; plot.begin(&p); svg_plot->renderer()->render(&plot); plot.end(); } break; case SVG: { QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("*.svg")); QSvgGenerator p; p.setFileName(fileName); plot.begin(&p); svg_plot->renderer()->render(&plot); plot.end(); } } } qtoctave-0.10.1/qtoctave/src/svgcanvas/svgcanvas.h0000644000175000017500000000162311511434230021167 0ustar lucaslucas#ifndef __SVGCANVAS_H__ #define __SVGCANVAS_H__ #include "../octave_connection.h" #include "../basewidget.h" #include #include #include /**Creates a simple canvas to plot svg files. */ class SvgCanvas: public BaseWidget { Q_OBJECT private: QSvgWidget *svg_plot; int canvas_number; QRegExp re, re_save, re_delete_on_load; OctaveConnection *oc; QString svg_file_name; QMenu *menuFile; QAction *actionExportTo; void export_to_png_jpg(int width, int height, QString filename); void export_to_pdf_ps(int width, int height, QString filename); public: SvgCanvas(QWidget *parent=0); void setOctaveConnection(OctaveConnection *oc); void setCanvasNumber(int n); int getCanvasNumber(); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); public slots: void line_ready(QString line); void actionExport_to_callback(); void load_file(QString file); }; #endif qtoctave-0.10.1/qtoctave/src/svgcanvas/export_to_dialog.ui0000644000175000017500000000457711511434230022737 0ustar lucaslucas ExportToDialog 0 0 289 300 Export to... 9 6 Select format: 0 6 Qt::Horizontal 131 31 OK Cancel okButton clicked() ExportToDialog accept() 278 253 96 254 cancelButton clicked() ExportToDialog reject() 369 253 179 282 qtoctave-0.10.1/qtoctave/src/images/filesave0000644000175000017500000000250411511434230020015 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?@bb`@bAX߿0ϟ@ FШ?`5U #w.Ɉn@8`m1AFB,~M2$r ~fpr.oo#7o?E8ԿARTFp+280HJ|5`pZn.v#yA>.~.Լ_~1&;bAW90 )& ry'Z=8$Ju7觏tj@!(P ͘A_S<$;o2&D 0!rX@]Yyܯ^}` @G@8*^4' > _&?r \A;Q !ѠtW_" 0Pri 0.9_|c$3ߘ!@Q(/0 n1@w@gXDXӿVFVvfF.Vf%" PK' Kf9( \r o"cHQq_$=C [^0 BXkJP(@a?H R F`D {@5~ǐ/ ¼@ox `9w`EjAG98,vF"*(@e,֬p%JHP, T2?xars!?PAB'@PaT@oC* >FNp(#CȆ"!i l0#3A}c``c?C2`QBq}+pb{Fky^??ڦ F 10Hp7@ |]7PJ s @7w@p RIENDB`qtoctave-0.10.1/qtoctave/src/images/new_folder.png0000644000175000017500000000332411511434230021127 0ustar lucaslucasPNG  IHDR szzbKGD pHYs  ~tIME(aIDATx{\U?{fgߵm>hE"%jybAMըDE % *^J iwJEvnyܹޝqۀտ."|)?jYP$ 6lp30 8Rt\qڞ d2E{{g܏r~B˯oOش'Gq$]]mxxg7=R|(^|ugHkwm؋!Tu\EőZ'?\` Y4FiI+IFfg^ֳ.03 ZAۯ9yz_۳@еPݺ5̈́Rԋ&<;yP躞&)2(|˛HDCHeP5ضJ2~?Z80Ȁ1,=713l#l K}y;Ow2**P1HP`6©ֱi--l/) %ЃEAi]kۗL֔]({ U{=J5joB 2ɦ(hiS $2' BH06 ߤ_+ C@ E<֘ru=ʀ( gl2QDfpj,WjxnJ93_\ B8NBvDss sBY33'kX)œ: ": lNcYR d"ޑf|teX֔ʚbIQ(+ E $]iށ)n>S{PTb}J;+6e;KE@*-ephA+[#zV7]-/R( ˒[¿7] yC&U0_( R˪3?z`2nsך$[b 0PQCEA) >{*iVc۰eqt% qNk; ww=3g\ {& ֠- 3sF#]k3nbJY` !` PY60z,?RR6R T=wџ1P1̠pr@CVմ,mU_dzҴ<#R77:wmJJ:{yӍ9`XmہS߱1  wH+輥cIc/Ls_P ܿD- %cD,jLA,aA<ݰ[4 Y^'r,!a2   ~ZaBp]HX )8;됞a=ګmZP< cZ*h1JF %$20%a3ChFsIy{xBkNw8:X# ״5Tv;Sh rXJ@[Z""(Ejӟ ĥ;ʾvPa,@,?(ԌR@R#z$P6F=S\\ @|J&J|>c-TYC2f r'?Uyťxy9^ZZ@śf Ll;=?ٍ?EEt|c`ebd畔>kf@gIv, , r߿?v V Wbۛ3 ,o R* ?aegt(]R 0aPf7?,? /cp4f`jÖHmyK!;QY6&aQ1Lǯ^} J l#|q0\؋7!H " {'`$Op_'"(A\>`sq2?\_QW}${ c)`e* NEߏ/#08G h0<{#AW "\g˃H XIs^ pb \G/>/LgI#?gbbdtTQ" %/ @8ۄVDZO~3  '? O^|B zg3鉣,d^ 7RcAɀ׈ϩp3P#S9v?- ̒ ^ @DE66S2 7` 7XYt5$Y-򗯿}`bggf8u==Ǐ'{^n]&4ft>_poY_AG Hióp[6ɘ)Nb W 1x̰s=3_/09喫$U ,Ծ!;J)S.6&pۧ Ͽcؾ.o^hG V3| ɷ |-c" \\g j[Ġߝ[} mAn@;%J^ bXmh~Z ޱAMUx_,`IENDB`qtoctave-0.10.1/qtoctave/src/images/bookmark.png0000644000175000017500000000126211511434227020615 0ustar lucaslucasPNG  IHDRsO/gAMA7tEXtSoftwareAdobe ImageReadyqe<DIDATxb`>U1_0b%A T:be lzZ0R@8 ``cgscrRfK@a5mC#cF  OD- u1A/Я9q3 "/cx>߿ _|d`` @= ƿ '0;Y%A}"@{N2~}Fo#P3Õi>[ha@}C|n+>L?ڼçmw2, J:x?Y"X Çw0l  JJ ~}'DR<?@(zȞ 1#ïMP f0=bO_93 oB :L @5pO4\`hՋv_  x NdP>05 :+Pρ'^&!A; \Cw~ wp98RW&rW2; L_۾_K\KxJh72IK>tx>yFoĬm+a(E ^ %\Ѐ( 0 g|@ādY ԁF ΃Q4x ; A"CtHR!]bA63CP q ( AeP5T5C@ hzMBsGI05`ÞpSl8W ) ߂Ga>^DBD2G Cb)D* A{G>0(:J BQlT*j;U:D&Q /h2ZDCб,t݄@_E0 1ǸaB1 L10s 3,bXi.냍Ħc US؋4=S\pa8..WkFp3e8^os[%F|~L4 քBaFJ !*D 1XIr3 )]L_]#CFSlDOQS6R);yqxvsT:ՈCMS[74,MLihWhStJwipg$0?3 4  -5$Ltg&1Kgc̏ђ{%$G$d줢 ڥF>J+I;K'J~"ёɒ9"sUf^!k%˖-=#Hӑˑ;&7(( *"_%E~^`PЫ0HWQW,WBIB^)IR_iAYNM9C^yHyYES%P%O]*AZڧ歖֪HRS?>GKcVSJ]3[UsBeՠu_N>}W1Չөѹ ^^eaոI^/SUoR寧ߥ@ `CS$FF4#<u5WWޱ{k]h#&Lަ{LL?#kY /um`K3t3YY%ZXͮ\q͔uu5F& V6ҶǮn^>+CCÒ6KNSӐ39йKK˂k%7~qwyw{6~O:jg^:^<oZܵ]>_MT0~~5~smZײ]C@I@ JPxPsRSpY0? d[ȭP0lXPXSzOmܰeÍ26^Dl:"8%SOdCb{Tmۑ}c)E[GEXǔZwPx"q%)8=|K&r7+l޲y8E7 jz0ukJ6u3 2&3m2k2geB2Ugޭ3.sP9윾\]oGmۡ#Nם'wv%gWvw|S?Z V+cGԏ?]jBN"âO?Tʾ}C%f%GJ1ұOQ˲˦x,W*/,{p&u2+*ԪJ>UU8Դ]:9  Ά űaċb+Pmj1$KD I"g_zzU3oZ=XM^_{v!/Z^~/ixL? J_%ʿZk NP>B-N-?^s=ku?GB .qϺZ<]p;&յy*~=7?0 qj*{ʏP~|HxN8hprC I> Q"exDwxD L:? >Ǻ #qO/uݵqP(9۾qg+8' |$" T܆EQLk#q4C.C|xk|q*J 9u3c_~|@Λ8=kxT6Y$#/~T]5N}o'bOq@ wO %b**(ֈIDq8wG;܇OrM Dy>A%Xqǻx>NX.Ŵ*NᮑS#QbL}#K8܍rE["G\|x/gU~ 2|D?ʣCzKdJs#cqhB>f>CVfpp,ʂ>!E7S /%$P`FM8ǠB9K1Mn:@>}fO[KD?2(VV"Ql` =:N@y*qzPbN(kO"Ȃ@p7G`p|'EI%/QX>Ok.TLi6 5Fjptħ\^ X X-2*iS6j5 ]6n# 8,›bCrP"ER%%8͕DNgP>~DX "xVnQQ@ pߨ!ZkDȧ+x< :J iyE@; ¯A^N[~/R eNbGcC^Cdž"1-bՂ#$B62W"=+h Dˈ@D?u u'N<+Rc(K,wqo;K,y uxKaU$vwKh.BqY+Cft5SKZI^hI9I+=t4םcS|.GqV'1$j( rG Qe bc,~i,Djk* A7mFxcU^[d->n9\ Ka&|u^o:eoʹnSxYYL)u_x~_tEkk}{<)OcG?_9٧D:i{=?L܏}D~&]TZ`;)he+m5LU ?[kUz@}VJT/ik\f2o 'D*L Sx@}wU[kUPx5CӚ.[2Y ϒLOM^vKZ/&(ĤCо.}%9*zQKL{jbG+>k$+QZQܚCMmi&"Vz\!vc*PP1Ɏ*A 9͡v3e^oΡqc$wH|av" c4iYXUeku%U]nwC}3av#6Hz uG(ۆUͧWFG+G\ R-:S$7;B+'W+TX -K(pv0}tmD*zE`TMR\ZbEOR:3Ә;5Ɣ8u-? EٶLj%!!)d3ˢgd7Xs/vV0@_`fae]Bl(FBSo2 dID{ V^kQ HH14Xܓ)%!@T% ^C@{؇Gǐ@PTVC[<.[1֑"#pVKb˚·v}]xgS/aĊUyiDD2*n#V?JȤwR[\@Nޭ{QwA$"ElI' Td|TVUMEY^z ,V5 @@aQjNȧ9m\c1РZ !Jǡ[䶐l+\br4rc2t'QV-*[׶:% @s)-*+M{k 3hx5H5*I`dҪK2_Wi6R>6x/o(oϔ/r^o -]wkȗ-(a-r,]vomN&k}VSyr~sh&Qx]] w'Pꥆ-Q~P#Lg'W|rB4!M Ȭom@D20Q:;$a00-{~ <{U_1liPv ;"gF;_s(~ȹ./В}IaVHWZW){Jayg'֑@| ֿkiLX8GHw#FZ[W[Jٓ,6xx-pGg0ݿ'G؜Խ$qnnQ]< @+3țH~ٌ뱼zE">}T8slڽۋ2Pw9^\" dW=T^ l+;m6MLˇAvn^k 8xYͽs!] Ƒe &x॥-<߸A[ o|p֣'s>&ruRSEz6[ v%@%&J^SMÍ*žh b_ȪG!ePzVcIr#d֗=`@q{eXwo2ZN< ӣ"E.{B7'y +G=ɞ棷X=YX 3?X\f MhIF7fjIM0,#&/&'7t<3cgwWBWr3ZCF~TnO~ؿ#F|r~_f[JiR< ++ 4vz'F4K_WvmpM4C۵z/δma~$IENDB`qtoctave-0.10.1/qtoctave/src/images/run.png0000644000175000017500000000445511511434227017623 0ustar lucaslucasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxbdbw| a 3lx@&@L|aaYk?6Ζ1= င=?  -+eqVl 9do/}hy#^~;\"Ăfyۿ=w_π?;5)6^9c _2H?c Z oIq@1"'#Rl 3)q0f(cO/q03cgb"/ <>]g`b:߿ʤ bA Yށ,◲P _1~ p ?F LL l l\ 0i$Q1^>Ӭ>R,,l8Av#N ,1L`d``ga"pI̿1h}KB CnKBdÀp'޷g8~ex}iI) ~M'@s0.d`eB(𛁁o?xeXb/gh&?o |c}?#vf.9 ipE@1Fmt|hapF\3{}k~A ̲>YRyRȆr01b8 x9Ï-߀- 1rs`#^Or+,`3ٞi p Bw?2dIj  &`~7x#03 rusַWYx?â*0a}eg#pC 8Ej͑5U^bc/$&i-G@9|߯ll , ?جLL 8]S3@1o  NA!O;-ef@ ,%Az ̱38D`z3Yߠ CK!Fq=D휜5L ,#ABGWϟSJ0v O5I`bbGcb.*iq1VH2>'4$|`O x@Lxv/f?`*%_5 0Nv|p x  ~ bW ~f)z~l +YAA"bܜ[:>7z ,32^*w6Sa#~"Y? O_<} V̌܈0p3(h>f׏,Y.2020313:<{Šp9sr0e`{IemBi8N~a/$~2<_0C0}w4 P |zx  & X*"^hD R_~02<'=C u~g`~Ϡy P,@,S@, |P  X+8/-w<;ʄ[z Pp/B, _Y䵏 > nh}L0pl{𗕉_nfCpF¬z_nw$/}d`}??uxl#U2w4!4:}-2 VY^=U>֕Yүv"Svg"!c-aX銅7ߟ_@+4F+@1 = gQ>u7?& " P2cl2rP  ~2?۳אkUP ȥgR,_-ar!Uw v/Kg|3۾d RX9/g ^_p,Q6!{vqv>n}V-ly Iqb `0zၗlK`-&AnʊoG6C]XGoI.!uFvAɏ'Zzy1Z_)@8h1*^P48 A@rQлVIENDB`qtoctave-0.10.1/qtoctave/src/images/fileclose.png0000644000175000017500000000231711511434227020757 0ustar lucaslucasPNG  IHDR szzsRGBbKGD pHYs  bIDATX͖klUζZ(UĮ$A GRD( &"?OԤQL`!D)!(F,>CKŢ"%v?E)x{FH#'+YF_W.\ȉگ7jUN{v]}6ws9|Qq9 Zp]]"ZnDle'lPgGyt#z &ryg)% *mwF9vR+9>ߔgT9l ܶ8C0Ets81Ѧ-Tϼ߿uϏ qU>Ab.&8\l(xh>]ݸQ2w D(Y"Lw ˋM6 Ai?n;squC/s9VU7R^!V`vauC @G>tQ1ݷq5d|0 tqS $lJ3E:mw͢!BsxN&Nap|CH4M` G)(p1S<';ԴMopGCwQE,a;O\O/'o4:5-gNÕ\ p ŠLͬ~ 6^Fap6Frq3P vdo"kYU&~|r<%et(F^!BG\ ;Gdzݡ_!/yu.ZFY8Ta3/p^/3 K膮O'@o-~S\VZ_I~|!?GZz%ZêkB8cQF&qin8 ΧbUEQDJqZ}X͇=ޛƼNm|2VUyຊb155pln:(q+?kAD0*8k-8XWP #&?ƃ "x"1&77劤7orpDIJ\TU:E5&x z 20 ^?H޳; +ДXk٩ɮ DH";W4{"TkZ-dأY*iI ~fT^{n@ha{{lk3h-;-" IENDB`qtoctave-0.10.1/qtoctave/src/images/help.png0000644000175000017500000000306311511434227017741 0ustar lucaslucasPNG  IHDR szzbKGD pHYs  #utIME 0u?IDATxŗMl\~sr*R&FTi iQ$"@Y{($ҫ{񢗢HQuZh+;b&vR5-ڪAR!%XÒ)&K0ٙy/rhil5 LJƜ KlA,#oܙ ,`":yVBH,)|2m@` DÉGDA(]2r80ui:c.|.k[,qMX{J|Je h |&x.F 2]4Ft?=چM4}RgQ7J| Ú=3} a|O|*Ǝ֎3zyyi/?ͥmt,^mDssA 8UHe+PlgΡgƨWn"0jv מwT d/A"7pk g;q!wZJ]Pxn丆S w;7pmY뫐/W}4~Ʌwu恳q('4MnsNn&aYP,Mpʕ=h<fM"C0S)i nBmIs|X%V] 7,5 $+Rzn : IMFy6|hl;4 %%(|kzTZG%W@C?)AxKZkQ1"5e1PǏ_=WXڄ(^ zuB .K)~Fwm[ʩG@x\AqޓJOJoۃaI|U(g~&"mk|L K{PyD4ug$ki e6LDlI!I٠*hC;(.Utʹd[5,%#ֿS16P,y5!0@suqfu+Ǘ823FOHd 2Wj'fNH.+*='~^yU #Cm2yĥʹ\~@&>zT.G29FO_ِǬ2L&C‘0Nkx rA3;fNHf$w#dRwU{iPr;ݾɛ#M@]񩜙>dM +cm|XSgφ~oӒɤ珆HDCu]ZH#~s#bL26$ yqP,qL 6伀;.&B\g̺][z^N[ K dw..z f\\ {St5s;Ft(_myCIENDB`qtoctave-0.10.1/qtoctave/src/images/forward.png0000644000175000017500000000315711511434227020461 0ustar lucaslucasPNG  IHDR szzbKGD pHYs ,tIME 3rIDATxŗ]lWckfi;V! T""J}iX`ɭPU$ @H< JWN BC !%J)Im)_κ;;3nkĕZ͞sϹg9K8ã;@1 !E;RL!'3H|8F@ ۸f_n+":^LdM?*پ)U8\$<:^sjttMavkK+ ֬^═=ȧ! pw+%ǒ˛ǒyCqnNԔ#=ǁ7E`x~1{o_[S&|ӯҕ\-Y3߫L],)M.;)bMZcIR?i(hP |i`?r%Xzc-g^m-|-# mhrd'Wj$_*Ͼ<=Zx藋-ޢ3}+ˆ, uCXmYT `b$*ޏ|YcI0L-i*/X4t编q8n5lѕ ^͚΢iP]@U\gu_.9Wg8smk?H+59e 8x  /d_g[1[ʿ%{33ŗ(`6Gj}ůqz̀wZ <|[}"^R^ρ|2gžO`hI~UE!syf$Jr~ڶ-Zz6+? z|@oah*{]wٖ:TA5e t:h,˒LNfB5P_ҟR0蚲 /8Rk S̅%'4=<0 U۶gB۶,+v3.PٶQUtuHyIDATxbd&O^-Ĝ22 ,, ߿bff }|0P@ ɉ pqq103abg_o~sBww : Pں`_Of2j*e%r0bf``eb`,_߿edce- w@]JJ >}a3`?'Tc`ō{l|,>|_G77: @ ^c`q%o ?Hefǫ"" uJP ggge'_Jϯ_@_Z7/X/)_}/))"P? O{ -BG"9#aΓ$@`P/`N/÷ _/C @5_~rrO~bׯ?N) ~~`\21~qOW]MMY4D-,@|T,pq0h?>8 X@ofΓw}{WLM^Y~"ZA\Y hI X>A??/~&!~f^&/>g:@Z%32||3312, 8 ~֠H h)3L bB R , rK@ąj߻>2H`Hj7/A/\yb`22000psafPɞ_lDLL L R$}cH* 䀅>}Ka~^[0]2(| <@Z~Z!?Q떱/;˗o$&bZ?FK^l@ 1@ B 2`|&ڻw@eDRKBbV CK|9X؀.'"T n.VpVdVcV`eee: X¯_ Q]*|X @ɉ u`efL?³goBiU;EEf_*?s[D;7^Kp$ 6`͜aǎc 쟯oΰA>e" 0ZD5@˙@,`0pss-cc,VV[ kyû#@ F\11 @00iPՕ ˌL.~%*ؗQwu@-09DAND-ok_~>8~ǧyՊA-GL #WhL_u4!r@1o}h()WY ,-8UW rY?[ Z!d}Npd8.MA$37|9  Xh(7g0Y1|` Z #~Uހ]9bd:6KFuPݱT!@1,+  2QjWIENDB`qtoctave-0.10.1/qtoctave/src/images/up.png0000644000175000017500000000307311511434227017436 0ustar lucaslucasPNG  IHDR szzbKGD pHYs ,tIME  7?SIDATxŗ[l33$q G@q<"EVJ/q[ U jxD(j#"@6bjA8ėݵwwfwfagoH̹}|O\t;8y#} FQhCN!=ar$˲B`^5R !_ wLq,K\;Qא^T ~00QŖsklvPg HoN;" :57p."2fvĿyrFJ_ɛO˖eykka£;w:%WMu\'t.́Nr|JGP۶n$qo{ۂ=X?wCKҊGK|6U&o?$fv2e6^x@)?~&n}:f~NYr O۲,ڑo Q,[ 9~&WH8/JGe ',!ەa\_jH/uqinL9-vdi H8hled{7GؙJ9ohC@?c}y#^Xlz&x#bmlMDPdi RW*`0Ln>/d Hб43 n76sV]0 O i^7hpRQ Z'EGmd ^-| ͮT@ՇH=pBIԬcz}S/6 R* H`Ŧf@.ܶ{^Y@j]ᐱ#5[=T@., \u$ߊ(b.sOƓ gZ!@HקD(8P4 :d;Qu))Bí ETvEk^2h93A'`r$/֕ABZ2&`<=;gF?U{ |Kw#ki)|UbB^c4 5eD$so --u_YTY@w=8=>B|pCIA,ܚ'&&oP:-oBB𐁡kb'gګS8=Pμf>@ֲ,LNB+Ed襧}LZ=n|+72QiCLN9Wh_upʶ *zH%)#uMgq=TDBÿE *o!@ּ}ei)%o犔\;~ ?JD'OEBFQ*\y؍'sxh ->n?Yڿo71)58~)E932`ezH4HOf`8%hvIENDB`qtoctave-0.10.1/qtoctave/src/images/bug.png0000644000175000017500000000107311511434227017565 0ustar lucaslucasPNG  IHDRa pHYs  ~gAMA|Q cHRMz%u0`:o_FIDATxb?% qI fRP .@ÕOAbCk'00 j1l  \b .g`APA$ 4+|Vpq6'03"j!2 BR  5 9TqЂ?c?cw0/9@ =ุep30 (@1! U>0p  r8=A@N/ 7=v!B \j8 @.- Ý@| ~π"' PpȀM?H hǷY%]}D.3&(?@ QOffl FJ3@SͶAuIENDB`qtoctave-0.10.1/qtoctave/src/images/button_cancel.png0000644000175000017500000000267411511434227021640 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<NIDATxb?@b O>erـ\O3g8_! eb&dybf9Pp<+YJ PX4k?=̕ 9@a.d{%@?5guJǷeçir @iRRG E e@i# i 0U0:0"`OlH|.&/o*#CBn,XH."!E fN@GL"l3 q4*C.#i ?uxVO|h11>!NEFZ;7/|~r_?AP׉au#o;3y묟  /3!Ñ3,mŰL g4Pu`X+p)?{댟 eK0@\ À@q vd!'2p $vb? g=7s4)0R;(薃@xZW|j/&G@ w((An9_8 Jd-ȲvPŹG8o-Y@w(s -#@am^Y{ZpG2۳3Ք啳v @LjkFPV2 _[\@ K8¿}óW߾a/И@Lj,gAUBAǕaY  m9OAMA׆au#3 (\a9A?~3q3H2HX@ NJȖ 1<Chȉ P@NJ , @q vt33MFp~|? GX篫X@ `Gn2@p@pJ\˟B9(hF#쀳y<-@Ab`U;{_w@G00h8|P7[K n(^ >')~;5;J-rv#1/(ob6-ҍ@7uL@u1e_[p3|`7́X H{>]gW > 1Š  {F`G; ex_$r8r9;i(;9! ˱:r  l!$?R 8T 8!D)0'EmNIENDB`qtoctave-0.10.1/qtoctave/src/images/filenew.png0000644000175000017500000000223111511434227020436 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<+IDATxb?  !ܼu~RR ,4t|?~3| O~k@ EDh_ A_ .NzFfbfaFVf3+PBrѺ#5 s,@,fr9xؙ,dn8, h/CIK, , VVfK7%Dnq 0~LL~ʠ+3͡ \`D8~a` <}p=ìob!7@12BhPJ 3H 0|ջ _Ys~gvP-1гg u0B%123  MlL ~d;; w@Qfhb//~ XH?9@`a,Aן@L FpMD@Q'0erX<4SD~Z/0X.L@# Rwp\B/0 $0 , &p?~ )4d8-䘿 rhKZpF7JhLR,( rPC(| %T#  *#hu.za rp"`H DL3@-@ } ΂j":F4!!!\D@LD>Fh{ayP. &B|(!C ?"EKP_#;π@LJ>>Fv O hQ@x?v0b *L8 nR ~(0c]@(rh6eZz;b{0?IENDB`qtoctave-0.10.1/qtoctave/src/images/filesaveas.png0000644000175000017500000000402511511434227021132 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?5)ՙ~}x3e7~^?wgOH/@Q2@vCO/@Ba#_FF?1AՀhY x𥜁V?O{ΧA@_> cK\E VOdP2p%0~+ #.o~O?0od``e`ge8C_fe``:rn>0ܔgpa j PZn.v#yA>.~.ySho@5L nc+&Q@,Z @6 0H 0>00lc`dd`xL _f ԇJHB Q~ @^fx ho?]8j3k1?/``VZh9ec`&LO݋>W~3+Aâpjs@P'P`xx ×}k@f:_p"T?PAA<Ǡ|"0 v 1%Û}~.7~b=8*;Q F+Ơo Lt@YvfvPrx@AB ,BPII|߄d 7$ @1|L= 2 ˿Cх+ 9>[ o`T;ѐv @,a /`I/?X &@` XN=bg`Y Wh 1!)A k-KA߀Eϟ}C 4?/+dy%f<3k=Pt1aNb 7`!1p=bl,~}}z@C3lƏ??H Rp9}@)? ~F0 r_~@a >" }ǐNrPe`,r|:XF +ý.J2|q`22tڮbՂ ?~f&ʿ( 00F]pZx:s%.[فY(8 ( @7x$(03]6 0:ñ^d3R l_p=, 8Pp} Xu0QJc'RT,_Yhod8̟JŠ2\V&@.}2(2ppY/Y Ь )x  :8[< 2~660\l?h-ήK17?_C *:(q'Bb׿> @XZ% _R UD!Jο(YX,02 ×  @0dO#$ ,~h3 eOp,%A W&` ~H !3N/`{O#(1޽{)|D~$Ty__We\8@10Hp7=x0lt/@Ճ::p ZSr@11 0w@{()IENDB`qtoctave-0.10.1/qtoctave/src/images/stop.png0000644000175000017500000000054611511434227020001 0ustar lucaslucasPNG  IHDRabKGD pHYs  d_tIME *)0IDAT8œ1n0EQhbO 4t(A.@4KbF/Y{}'cXyG1Ǒw޽L&p1<<۷o!"")my.9m8=yfggtC?7oV xUHIt^2Qp]? Μ9!X,6,]H9AKQ4MÍ7P033!< Műh3OM42_~˽4EرcކeYD"95'Çī=..`4)%8* ak"8r,B0cYFDŋ}`Z¶mx9_T*˷ƛ~)JV_zaooՆ)?פulll<3|۲D/53 IoDL& h`kR@z]0C`Y8<:a n!yA4H)!cNxp8h,_iĒs?p$D@m(0MkߍuCPsTUxu%W4XVq_!ECpCuh9l˂cqWsDԔ RJ!`F]ۆ807B@up  :BsM| Jvu]1֤"v u]G(B8 (@PԮ0缉0c iKp*(q'P(D@͵%a BpAmw m08b;B6*RJpsɷ"pŁr5[^8߷memJ%$vBԯ8w\o2%S@iLs&677&O2⢜14^T0 eowww/--mOOO144ă.x΂; $hKh4H$%9:733V<d!ٶ]RN{Q:[nepGցSSSVl]]]T*~(D%y, DH$l6o%vO9끁[ԫc4aM7uAQiBuTUogl'x1NdDOOSW`+֒+++rJ˿sO~|gO8Ǐ}݈FK²,J%b}}JVX[[#$r68 OuC-p]WYgϞ=-˫so-q&DZHIENDB`qtoctave-0.10.1/qtoctave/src/images/news_section.png0000644000175000017500000000516611511434227021517 0ustar lucaslucasPNG  IHDR$$ pHYs  gAMA|Q cHRMz%u0`:o_F IDATxb?`HKýV8gȤ(ǧ]˒'?t=BE 5`db`gafPdPUdx++G7 rW2EFFCۂeĄyD9XYXX4']BJ^xADAaY~e?P321100 3sC@TA\l)rVfP$@DKK2(t h' l@a8}Qo&}_cggcbe( !&0>7PqU`ݺ)mdr1+A6AAN Ӏde'P A$8P[aq1K ٠A^>+Ġ%7%i!N.C89Xu)h`zAA3A kAs: &tMyǿ,)>£/ ? 3# Jܤ)`a"` 1!fQaNc`5ӗ`5rjB–}v?~38HWwh~ 8HAA!Ǐga3Ã|```vSRH ?~] Y`V&iI^_~ ~˖- ?dey&r`ƆAVVB&z r+$0ʣ0A|d`'۷`{nݺvÛ7oDDD򖖖 `hDC`Apa Zo8Y$R뗏 ;XXX!** l+++Rà Xウ_]E\€ý$CBGG (9] He)XCY3 1432P`t G={`y___p6ַ o(ZpKgkUV1\~,gbb ..`y+pBƗnG>3z[{C?b޵m#-OMq1-Qa.~ǰim/ `a`ll E 63338Q;vʕ+ 7n/~~~AAAOkw޽aJP @D En.op: d1( A ([0pCH 6fXƎ>UMەTM54'?_p(((!$ #0tKptß?eӧOe}?׋gZ `Пi=\\"%5@Xl x1ûw! J_ WH⃢Aj "rٓk6IO5 ( 0=EG &hSWWA 5 >S ȏA+:&,fKIz v\>|v$DQQhFc@X_C%z]Ž CDyA3ĉ999kkkx[!B ^9 +w|UѰ}篢(Lo ZAp8@a9 c@ ~awebR?jMIwWeEiPyg{ Ep-qa^nCg?yvy=@1hT=H00k>cpi ( J3ܽ{\Pd': p.q[eMW^!0yZ Eof#Ó'Oe =EP&Z!~'nП[ 131J]yٿ29s0Pmonn6LTT3a9`[H uӧ`^` e+'Ͽ2~o O^|cx;@ӷN]IO[Ƶ8ňh;w`q#9\}{w?w˷7o^L~ϕܼr r(/~.޿&rvh"A}~y;Ypܝˑp潏@G>=ӻn>Ж!ߠ_Оo"v8;q3Y9)^O?1\!@~pǗ߿uխeY8P ({oY\ w׮^عg>Ew4Y@D|4d.۷`궭@)а[䠇:/D|P|7Hx| PBIENDB`qtoctave-0.10.1/qtoctave/src/images/xedit.png0000644000175000017500000000360611511434227020131 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?@baewxX8?(+~ @Ts_P#o}{ >.O&V\WlؾjeAf|iCC%IAaѿT~V#^K/@Q쀯=[rק O3 7Q`Gd9FF9l"Y;U55na`<~+x8ċ8ܱ@9eL>F 3rOa`ՌKO ?U@d;Kzkb`z߉S c'# xL~ds̟@d9盷|ggb{,+W,k x U..>𯿬l@$;_ך簲2z ߾Z? 1  Ϗfӊ_c3 H*^?`t"6 ?2 r]=~\V,fdDݿ? < lL ϙ1|{ `|}[Ŋ}X؈>~7߿2s1aG>8 ?Ys krII1y=?=#o~^G| X~ب !h|M`w۷@K\C׏ l ߙ/ J>x fێ9g}`Q {XA- & o׏Y+>.!@8mA܂< \gwZ¢ː_1 ~k' Scy )C-ç߿ rꀷ'N0~n ڿ@3<|7\7߁D~_9*@auع8Y!0A|Cfן}\V|Lp+?w6`YL ?e ~>k?v12*H8Cd.( s/r8}TƿG C} ߠj ~G-u3{[e$ a)R`e@r 0` 0 ȸ~L5'.v'@ PArDvkHIYcP; ^Ԓ/P?A?1 :ـ/!Ys+HI8s{ ;3IENDB`qtoctave-0.10.1/qtoctave/src/images/eraser.png0000644000175000017500000000377711511434227020306 0ustar lucaslucasPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXmTs;3,"ւP!ň֍h M_bФ66RCӄAik4%M%B+jBevA̾6ٝ{{awqtK⇞|vð= ϣ05#~9 &~fV͍/m aj.xm,.*a*cۯ;rs]jŵiW/6dRj%\(S`-JH||ͬ[sՔ呿 !nZnZ­w_^c'm!78\pHxv8tHGh33'k1Gю'뻿1wmkVo/  Y1L!9$r197ٞk3D{U[l~+VĞmJ&N{STyMg) m{閖nYiӥ:!˭|aU_KVO_2=.L%/ -NΌu#0$RM Eh6 0^Ry}K/D5_]sL- GyOZ@J)M<BbIә3gӕ z RʼJ{uȥL'[sR"!%aiSqWT)E0Li-eY MӐRY_Űzd[^jqח!aG  8cYV,{UfYPHOYVĶmMJJJdV(pߵ|ٶJ/d2a3M(eKnYVBhfBqPiIn}eXYWr=q'N8nvuYYٴX,f躎bߒcPb{Pc.7}[}@R*cM@Çljjj Kx8B)%ARd2z:7I置; "uxҥ̙3'))iR\\앖mc;{:x`Ν;3<<|Ir=)@y"un={ܺH$Ѩ>00o޽'82UY/3ؕ^zŋjժL&۷mJR]@?SO`0/nذׁr@~I i)aKa#;i)IENDB`qtoctave-0.10.1/qtoctave/src/images/help_index.png0000644000175000017500000000412211511434227021125 0ustar lucaslucasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?@b'yA輀 @H3 @|(7у9 8 ',bN fg{"oYč~$: 0pS E#"||mmP:ҥ V`x#/@@bD<h|6 [ܜAIV,I??20J5,  ,|| ;̤I o!J#Ax{3p75ſݾ'^WWv<``:W0 JJvD$ F8\@Ņ ,e##^xR ; {^C0@ &( Jp2rr o߂OTˁ>c; ~!%$Q$(` 4/0: @1CPg`\ H"Ll Sih00f`t UF@7$330 0f'88ط3<+0~p)2rϝcgc(- bUT @($}1 c`!ϒ1Z0 &LPJ=`bfNNFccg?FXtЯpQ\9W. wQ< p # pO j`o0|L g$^eشA`Bϟ$0 l Ykk&&y<|Ͱ ;>^&VFH%`p7KA-A<[ ;bK ʺz nbAL6_1pq02p2f7!ғ/8 p(* @wg8l03 l.fw1J(Ȑ;>ô P6*H h$*0;qq2}. $0cgd:( ,5k= xƠ 1Csc1Û @KY(. Rd|\ @5\@5B. ASFvv0|Lpx??3\= @Gp1A,F~t@xf  Z} ~-'#30x/πZPKY9 i8@s 0^U0X3`Q9u2 L@˿}r?2a`:ւzy xy`q P0*77'00?3(@.(}98@!ؔN>ypA)1Qap ط\xwGf|e @a p`= -%2B ;0r `P1 &nfHsB}~E{N1pp`ggUcoUPκUF,ZVV: lp5{0(9Z01p%д0y˛Ņ * ;S`-Q*J3 p M4ZP ovN^iY^@|XrnX \_UW2|hRq b$:X-5ZP@ åx+y|߾2|ɭ{ r&C@D9VӀ[QD_Yp=79ۮ/ ;6i:c8$n\W"@1ˏy+r L|J L>@tq>悍O(3<| @12LHe˅o Z7_IENDB`qtoctave-0.10.1/qtoctave/src/images/reload.png0000644000175000017500000000476711511434227020273 0ustar lucaslucasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_F mIDATxb?@b$Q=;?4;??>~E gj>b @ETyPa~e6q&a 'W^pGg&`"iMNUU;OGS#1g0< >cxۇ\aa`5åWm L781 &Fz34Gf0pgW?^g.ýo|{p` >^ ?f bs[-.0\d*Ýw|}_0|f_ ?9~3>J20lޗd 76bN faPd-a-k`rb80ù}pM;_o3d}+/vy~2$i_n'as@1ڈ\h0@ p;0^yG`yzXd`0f(?Ȱ-w [j cmyOM^w0<ׇ  -0|Xp[[v1|uAːAIʞ'C @9g]k2a 9m[G30d >Od`/_ 4 _ w|2f[pM6CWt{@yw@ lN?53 |d*?-{}@3~"u O?dx%f𐅇G(sכx_IN_f _3|e/_ y2#r3P ![?2|w#eb ns1s7p|`k=Rbbxo'Ë\y+?~Bpb LL2xʑs _:2z`AE\#b:wF X{W?WQ% 72^`tC3(,)Z3Jf?ngpx,lq bOj|Wl}u3 t{d@Z|$Y3HgP8 Tn / 8?ge%%0@!#] |K6 Ln1p2 adg0a;!WpK9{@?0d~ :gVbA22ǯ04S,Бeߗ^ 128J/ iJ;Á>f_> ,2|A@'8˟{n~? XP {πV={pe!w8[F|wH ÁO{q7`{W?t3tPiBs[J } I O?1<g:gecưz_>od7/6`[X[rf ,  `Ô']!B?Y 3U+-_G9rg}#$it@7bF1û~ E30X?OG` YF`KWo 16`X8;pJČQ-W觕)7 0p1D0/ a`xs02qy0I3ge`?f‗@gci@aˏ >g,WK'3?0qH0Ȳ1Xf001@_*Gp X{$cb+5Jd뜿 Hz }Oa`L`v30&ˑ{71012^`ؚ @ҷ jBׅ o8^}=Ϲ9~m4Y@'t`lǁwVqp;T$C`u\cXY9^һ>]1~{@:hmAru&Bgc cce&>±q\%ۮ@ۮfe  -7^̎)"Z  !T|xg,ϼ>{ ‘cP(|я'ж 4ӵ[yN.;/A&d<!^`L%ђ#qfKȾ{Ndϐ}v}H-ܹRفkxDVD R1L)/ok? ;sfZ< K;! C_V,Q2pʾe- K۟#Z@r@/pmW/91Ua!ΩamC]LqNC3doB`9J%[ ضwl ګ $aﷻ02%r~c)&ZeI+mq:m$?KG@<FK̖ E\r|]r֎츺Z+\"rKΫD͝F*vΩiR ,2Q805i̓PRe}N3+ τ.xwFhn}7us$obIX[FMR*$bq'+|pc3SŀB@bSŀ-!GP2|" Rj,b5bÙ29א_%Ko.!VfB<Ԫ]KPkB =Qp*WBOO)JT+݆0[,RJ֞VZ Kk6N}& 2$>,?\ՙ\X odug)fNI"Ra8YHD$Z Lj s$O :x>~BrWւcRjuTJA:C+A8zZ LTɄ!{z;vr罏 cΒ}];HR H~-3 1e<W*ijogS2 x,XD>O5+ZiYͧe67.-3ΟɵG~/y}' HD&#*KfI'|'&HD$^>G ~|cοD?oyD-Hūy z..WHJINMꢊH(ntR=VƧ&]~15Eh-$RT'`xo5合VQ߆Zx]'7Sί0jC3I0χftDkam1JcQZ#Ɔ()88\bmT08Z9@6$X>L)4FJ/eMijFsͤҜt!^FCkR~@5&jA&3=pjBmGږ_nP?'I55D9k(HM*QE,"K:13sNu fgf_V4M S/DC, sRPcf(lW0d7>PuL&&Z|g<=w>QJ U%K**b !Tc104 sL S+2B H2&F؆X)T̪P6(EQ < ;^ Ry%q' NnrRVBܥ[vP&ڃ;p]> Ax'2eSO&m qAlM*-qg9֍*f^{(3f}؂[^E})fV?;W&e9 %"Çfz#ܫ07BXJUD.*Y,662vʓu':=}ϟP 5c^s.,Gܤ-X6sg:EYL>ۙvԅ]f͙&gخ}XUVtIbwalۍl [('N/S=X1ƋIENDB`qtoctave-0.10.1/qtoctave/src/images/print0000644000175000017500000000246311511434227017365 0ustar lucaslucasPNG  IHDR szzgAMA7IDATxW_hSWsOM֤tm&Bu@g "P <7ߤ>C'{CXNGNcv$Mr졽wimR|{=~9߿CP.:u+!RB)&''g/]t[gݻ߿:sݎL&cd-JKX,s.j« ZF%shVMl(R9tKPɚskV^`%(7#B75&Kw=G^DWWWR M@)5뻶WWWgǏ/[ܧޡ;ׯ_wvvB! 6J077h4l%=Gp/:dx<(hKt Nό[3H$=1( f3t9?2>>r9I֓#O!Tn ɥw]133ݻ<|wS}7nܘ{J.)JQ&Rf:Yum;B7@4?~$91x&+g=z ; ݾ}N0,J`C)l6ܺu+wnMMMuՠQ yRBamBkkk1ff<#KJkFT cvaopBiרV<Auuu@yAYZ –_M)J)Ƕjz-$@&{4MfH$f٬2NիfY-ߙ!ZZZp1ϖJX<xr݄\reB6x/nX%Uxb@;+ʋy2137&~b 7h3o> @BB A?|߿Lg(:(盶{|޷?| 5 y_m_?1@kC<4Pw Q`#dV/ vPΓz\⹤IXTP7IANǏ ?.&& o<FFT $>'߀A?C=>(Eow[[+0ؘ+;޿pc#Wna}(9$\g'A\ ?͛ 1F 7ᅨGQ5@Ϡ@ @!>=%K#yCM_$x>~x4 4-@,D?sxyH˭W~ar ǧ l, ~KxZno_ H@~}ȐoM<r@CAEN~gзaP P6{ OL e o0I1dEj3| I /Nj2|q p6cNtBʇD0 eG/1k2dGk3=+lp,Xz& ܿv hx2,-ga=AA(˂gdge`x ,uu!c71`(CW >f |bbecOX^|_@>C=oO3\=r+/^2dr((GJ쵻14F)1Ug| fP%_@f2|\O_gx? ?eÏo~WwO1{_30ga`$x@D Bh~o >B "P B w>|¿`   /0H~AJ@vn?0;B@O|E ȹ'{`pH(:0?+`!? `/|ңw ^-XJ@ 7$1_O?1| /# Ç@%Ba0Ó/ ` SS023 ?`_C踗20rr10:?7zu +O | 19@_ #$ 030~3<}򙁓 )2P (/!O ,#C' u_4?8a0ky1 ?@dBA * yyC2x(@pϩODÈ F`T1[;L@&&`EQ@*ξÏ@׽Y @Ag3$a/!l!n#,e!?|cq V!]gE3p!)Sgf8x @ν r R;L"D '0?~1|HT5}c`vШ/b{`!\~Z72C Zf/0c`7$A\C񿟯o~)@BJxmQʦ6I|]ۻ33sNvCHR#}3].;!<3{i8JPr_p8d:V&>< < Lv@zz[>@o8w?N˻`x %LًiEYཅ^*ୂz/8{I6Z :ٵ=ı]oHNKɆ .aLrY4Ȼ6Q <#fUyT|s|thRb"N*M6s5ށɩ߶_Msb'}DRK2RBsh:%7#ޮh8WJvҿ@u!D4qo&& z 2҃;f lch> y'EݲDo zaԛLoivgJ6A NZ>tאOª67v@+Mª~ |ⵚתOE]\zI7|^}o|<_m +Mڏ{Ph2z҉rkPW  '40t4[s){>T/9_r@!N;p8 {v\<~2];g\1'08N8lN-R%_ w "-40}̥O lenV״cY>55%tG0/铖!7蠤7~a賶Vk/d0{ٱޚk~(lLB@jZ=<>5/Qbd0ON JїfSSSZ=āt1 yaz:񳄕,|dJVկԜ֭a-îωF0ݮ9/B6z:IENDB`qtoctave-0.10.1/qtoctave/src/images/undo.png0000644000175000017500000000221011511434227017747 0ustar lucaslucasPNG  IHDR szzbKGD pHYs  ~tIME 6*-WIDATx]h[e|Idj?E:*lex^l ^BA& pXv14(b/ʘ= \t5gҖ$K:^t3m]>>}`r< Ȳk{W '߯F D˛?_׳hpNRXO~ p≛l}Pޑq]q]X7EJ~0A߽(bsόhkWQ.1@{MM;YdM[y)CH>o.׏@`_CM$2,ilwOp#\3(=ç^oRGUVyt*wu2}rZ[TTx}x)Csk8Y2m+,+m7H'ҡxs 밐O>),&gCW(,t*XO ![V@X @}G;-~G$H8Lǹ # BZ/ O@&3qEvtd̀9 bp1S-f@2ȡ ^7merڰa)=4㓮Kv"k Jm}`fG;Esf:޷l#taPBx  GP=xz]vr}JcC=F"6 > 7mAJH–eJ#3qGճ`)wKB4ilA݂i IvC, ?0< )Ob\){Rt"]L6,z@/ t5̴T2QW8BAQTB<SgeۙI lDd]9ވ, 2wrºfҠB6)K$=!GԼZ` k+_RzRDZ3H}+{{8pHZz&\X@ 2a'`_jΎ2F[,k[yXƼC u"gꊾdj7 Ή26IENDB`qtoctave-0.10.1/qtoctave/src/images/find.png0000644000175000017500000000407411511434227017734 0ustar lucaslucasPNG  IHDR szzbKGD pHYs  tIME>IDATxڥ{lǿ3;{?#DqE䠈H|U ibdG DHH TP<"9&JI)Gh(U]G䀠GM@LZ`g>cvfw87LF;;|~6jkRG̐2 JJVK>7HJU[7<j|6RX_Bea沠PĨ9QkڙGlz≚-N~҉ޞ틒 --ǶxT<& :(AJ)% EvBfR+W.I~JX?oݶ%K8̛(: ]i  T5 r9XT2jղvh9ad~zh%f2y|&C +c(/AT; f|+k_?t" !\Q8}pGbwrFpDC0G0GY0v, h)%Z9n$0 Gz9 靆!TT͞0vf~Dd 8eLfG)5wϔdsn$1L!Pe#J(N,G@4z~0]u1̀xiRԩy[C0R,#s`gy3A)FV|MӊVJ)a f 0]i04 !Mz OF}7 .lF&"@M5Q4Mw]#PJAz.G$1FIXBbp*ʊ Ə%r 堏F )%{9+uq?Y5XV t=N)t]ǟRpҗ;?/  3YRW #?˒G|sC@{J+1(M-6G_;Y҄Iu L~hK\)\))w=rTWW5@K#144 ˇBIUX*p#[ض[Cĩ*U#rv<>qx7ID,!c3\/k~n׵>cT8Ƣmy~2-Ր!VּpZ"}Љsp}`OJiȨX%Ė@فFj,e8O[Io%|?'EDۚR}[L'5鴿ur= yx`MFh;<[gLn.,_XWH]ɍ;vle}nvl}QZ0rh>5P!gYdT3o0ϜTU̕9u$;\Z>5s$ >v]sCӗ ~u$?]oMr(C,)<}4 ل6sZƵNG{/P(`gJfҶ[f,rP 4-^8TX:GK6a{ˀm}]abe?Z lٕWWJ咋BfF'k'Z  2H*Yb{Ӎ?/u%^XqpEjn1bfA`jM(>VOrkWWs#-h@D=@ܥ|O=ݢ<^&] "؍$ȧ"F2Ru܍9Q=FsJxnk( v CzJCz18kQuz.ς@yY@aAө>ޚCg]7hM/]ˢw%em8^.]t a 7yčv|'={-X<AVOH_(pOG_9T_(mlRT[d2f_+oO $Čvq׬D旦ow_]o\{S&Pl>] @v>G荺mF]bGv>W7t/z ɨϫ Ǘ5vE:Ϳ9*5>)Pu>>.Ĥ#DϢcQSɭ IueMx Uj_Cw 6]PD T>{M]G WK>۴X-߇m (tښk{1""{I /KP2a wjV9 az2`p6jN JWIENDB`qtoctave-0.10.1/qtoctave/src/images/connect_established.png0000644000175000017500000000440411511434227023011 0ustar lucaslucasPNG  IHDR szzbKGD pHYs  ~tIME "$D.IDATxڭWkl=sq6B"B`@ԖVňGJVPUB !VjVRӪ*JQ*Q Iԉq:^׻ٙ~!t53#}߽C,~g9p,c|Ol9~8|C6*eS#mZ# 'ͅɈX>s22?: g~N XU͹pnI)/{.djU"|G@Z\M>'vsOȒw%l6?*Z:$ $&Z}xc"Yr.;^~òϽpr櫰=Yy$oѶ,C04z =0 Y[eIxH\ J6],ׯ>09^L k( % 7ω0?=~cY]ƄJTnKi0e""m{1b{=~ b|wr0eQkX&K]sBj#'؎ֲo8?ۻ'ćRëU:SW#mq6Vtg55GRլGGr۫U,=ܚ^v1 AXBkK6y uQ8ID\⇇f>O>~"Z W5 78 o> +A$'P%!G}r~h?^sXVtv͆n*l(%KXNg5aV,PcD`kqք{ ;ojv47Z :(}pOT\ӊֶ$>xx}lzBs5D,2c=]aȎ`$T9N MQtmĺ6ԯѻ\GyTL (2^̞/>G!ch0ІK;53A l^pHJd-9ݳl[s6}} q13Mct@*ː.}'aUml^VH4<Xw;UnYR-tt&ƣ(E_hbdʂs:\ґA4BbPH"E,@"44;khR^رӋiF\[e9!QR2=81-ch ёl޲:4i!!X٨YqcTY+ i:: x#;8;3,L""d qeOW~躇W6zDcB>=/UH$SRƆ DIFS[-m !`li*._ 1Ȋ-"PsH+p>vGwG9wdhz4-9  &&&ptZCZeO@)YYuai|3~B'=|hB|gZ gF 0 ]Wb]Dc*_tud9()|AX}x٭>?oM/} A<+),g(#eRqN?۶7@XB|iGy;;9N&FZñB e|~Ds8tFl >&Ƌ'-ץEC;^_oYאy[Z[8T$@kWI,cc+)\/yEx~bg8R8,i,~4ml؀kC:͜V_OSΧ`{c?eCÃYkLaZൽB@@vK + LkG^ykcX>^Ȳnx 8nU"A TMprAҍz9.l MZ;EzSt<PdbHSɐV"!FBՀ``{cʩS_UU9=ð0-a``Łw4!f3PILbjX3|sXfG{GGIpvxi-(LL̲ÇX|0Zr@ӫ~o/SWV:Uè"P;T $T2sIٶ[1 !xI~׵8!ӨB՜p~*~IENDB`qtoctave-0.10.1/qtoctave/src/images/table.png0000644000175000017500000000404711511434227020103 0ustar lucaslucasPNG  IHDR szzsBIT|d pHYs  ~tEXtCreation Time10/31/02eg tEXtSoftwareMacromedia Fireworks MX*${IDATxŗ]]Uk}ιa3LLg5 hR1QT HP$QH'y1 _&j)rv9瞽ܹ3cx@C^_kmQUD,`xoZ<,7p9;'F3*QaUGs. Wy'>uwvw @ТG;㠠 jq-U5ڙŸVPM}/ؿ)`Vxpo_I5L;âx>>j(?63{W^e3Y JhW  ?קџd0r <w;? `9PY`v>89B F)ƶ[c8ފFi5X[Hߚy!,ФF}iAl4vZv x^^P w^.|nsB; !=KF/bMUBUI0ѧ vb`)M9y4@V  ͖bEP:5xUk<4@"`s08^ n#bXdvv-[T9z6ʱ'- AD>6m""Dk '8x>my&x6O#ܸ04c (]γ{w3d'"Mf>ET*EvcħyNjA Ms%hQ )m(q˵o1ГGQI,Ysn9~ȡep1ƔJ`,gRolR9| A&R><37Wˇ8VqsEz6jJT*˔miοE2~Y%IoBF %c]; 5tm߁:`+#Uש^Fkd 8aM6Z}e@ 8N Ey[<tSPhhґ)K+Kq똶2ޛ(ȗziW7*Z;IENDB`qtoctave-0.10.1/qtoctave/src/images/taskbar.png0000644000175000017500000000321111511434227020433 0ustar lucaslucasPNG  IHDR szzsBIT|dtEXtTitleMade with Sodipodi/'tEXtAuthorUnknown! zTXtDescriptionxKT(L.)-J_~ ,IDATx]hE;uͽ7MĤbm R?"Z~> ~SP|Z-(bELDMƴ6i&wwLJwāÞ?3g`Z&",n9=)^ڔw-`1Tgk#8Ϸs I >fXc0k>VϭX;xbCϯj,P !@ݯX78Y wMPnVA) o}QSabbFD0Jac,e\2eOQў}*5yLWkUP*^,xpzk6T! DIcc|6Ԇg*s%upkٔ_t׃V1бق TG$RzRZr:dd֥{Pj*)u0\ю{VM{)-n m2_*ua>q{*|ڍuPgƥm 8 L:- `(_Bc6uct =V`6zqRa/Z mp%8Z u_űqP;4[ˊP b#Q1R02gu+\-jml ʹuм\"4ȜOڛ)nR{WrAk:XOrY9spRT^Lvd$3Q҇) IIXI\QP{i^ǪL?k&DH['ai@.usZ쁏&|jlΞ6r|ՎzHTDi[Ii_շߐ}]F./6c bg`:YM` lqޣt~GsFRY"  2f=3ީ^jα|Syk\/خzn\m22uiI<' ZFt-ı&$ƒRZ/7 | V.  3&0)PDT0 ۱`aB[}A&>[ۋ^W$x^-ϮU> l}vZ`OF;߇uu9ƿFevb20ҿIENDB`qtoctave-0.10.1/qtoctave/src/images/graphs_section.png0000644000175000017500000000451011511434227022017 0ustar lucaslucasPNG  IHDR$$ pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb? *+g``b&:R9)Ajvq{3 (Bq CE/l WY ˆK;s nZ  šNMdKa򰇦'E@au?/@V~m%@8s&20W:›A!#x60𩷲k &|Կ2m9<& 9_@$ٞANVƖS!"(KR ǀؼ CXxXԔ:^JE|!R@a1P8CQ=7/"TE~sB"by4UHWڑGX@s/ ` 8muE.bP'u5_&f0[96r2y)>:\vA=h#UU.'^; )tjTf:{ة2z!?F]M0\WC >V ?j) BBJ]Q!7ƖMf W&I+4ՖaՖ 1{AE/?/2[7 1 Yn nz 2* ~ 2Ý~dY@xC ~z{ҿߟz+wD24{ݗ?#l}j3pS ܼ|~h{  B5!#_oN~ީˎ8XSASϟ? %Jd70'ޝ^0_0,X{W&~ @v, !5`כW|c+Ov.gȎbR:`?f`G]ǿ1\2|~}ߏWׁ>t@L!4_?ea 7f( vwQ2|?~epa _ӭвB`4eO?_lCM)~0201`Gǀgܼs'@v 4\B?=Seߩg" ‚ YV _`Q?~Bs/|h_lZ{g.h(ɉe{i"E?.\@,j{Ɵq9-rb)P##~1 @.הXwc>|pMcuLEFFX3338{e z inE@ālqXȝaK"'}D8᳗ ̿&3[]oBB_gqV`( [H4;/2xi <^pm%^h3N6VHOGfVAן~of?@aMC,ms72013˕pǼ~,o?b CY!2P-vvv0&,@aICP Go2hB' >bRd֓uUUTo}21_s ,TT@1,w >@\X0/$W?3wP"z/( _ݸq9hiB !`cLH)B;]~, 7Aˆ+l`9ŋOQ0 jvFր>e,,,l[r @=~hIENDB`qtoctave-0.10.1/qtoctave/src/images/editpaste0000644000175000017500000000266211511434227020214 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<DIDATxb?0222011CxZOu@@1D4PS3}k?6~:j?@1"7?ӟWʈKJediڵN|SJ}_X͸oUu>8 + uk2cfSdxa# 6>YbЏc ~}|ko幷ܞ  B& ^@o_72ab7\ < ~F`m>)]ԝ~` ;/y{Bן? ߾2|􍨸G`ÃB <tܛPp@&? 阝/Ý;O@9gݸh_0``(@ [4߁  汓_c1RB D$6G`?PDv+8) `64MeqE@L ^  r1E?} L,Z5.79P ĄId97r30i me'> fFv@C zzJ@G̘w(pO_!/ AR FF *&Aq@1!+ ƿW=} a'~#QA00Pf ]w@"<3Ђϸ-D\r2lt ǀh!!T(3 RG`?GcKTo~@:70};A1@f`aagQ PJl_e `V7$@ &&Dꀏ@W;a90@Q+$?YPCd_/rOA9r ( (FK1}d\@[Z2tr>|(Ԑ5f0sцt)^k tAM# S?[2&Jph dK@Ά^Q [!@PL3TG ; mw*2Ht Kő Xny˗3J)HKEKjZ.n(,,(_K,JVGO6KUy9[P#yX^G_>GBByEbbbMF)^\ eIe{$J~y7 z!eUjjj5K-F\OmA]I[=WU^qHc@cIGKs)tgf3[Zd-[Tmva:NN]XL7^**UU Hzzzz }/<.Wa  &6>6ymc61eݫ_D1y`J36cg܌gf6gna^k>΢|YŬh ->XY[J*Ѫjv sM5S֪֑|e6|[Hgvjv&{mS xK/9!NNNCT@j.... 9nn <=I<=yxzaok5rvw>O|a|j۴eݻǁZ}A栥``~Aȶ[aذ7 /ܰeÍ6^Dl:"8%SOdCb{Tmۑ}c)E[GEXǔZwPx"q%)8=|K&r7+n޲y8E7 jz0ukJ6u 2&3m2k2ge"epֽ[g]r9}*r'om޷CmG靮;O"Ju;0,= ;~p@W0jOݏڻzo/›EEE72}1JJbJcm,(.:}\MoTT"8įR*TW=ZP^+_v0#mu uEu}PZ٠Pq s,ƠƁMMEMOpOOo6onno)i[3ZNmzmtD2vLYٶ_5~uvB[;ݡ[{i|N~^14 U Fmr]y8+&or l!n:+}w&+ygfYϻzg ']e_xz XONPPqyA\,GGӐA($i@UNpq̸~o =+C}DZcbSbs"])$JO&wZ_g>>}?D˜KK+DZ}xCöcot;d:yt' CV` F-)mO}OOz8Ʉp!?69xS{tyJ _q ?:ϼ:7~jX7Fp lO8lڕ<'baqI;&~`gy $>8صV]ݓ-B:$#f05>~cs97)'fuY_n{9̑8ر5oǣX }k3FB}}=G& Q/<$I כ?bXcKu'%\LӊsRkS$bI)lj:%)i|:4Z_민4 1UwOR0q$y3uĕ\b7^N^x{{tcW-8$ո{]WyE\7 .b)8I,H2Ũ+07W/_CuU=0KG$Q}:6~"$} Û 7XROMG\> A~7_&GPR^!t/}>dɼqvx}F~Fۮ&8>75?E=&"v%in:rT#=^?eCuDDF#FIY8^O1xb;v甀80A u$&%HmO4s1:Dh+OsX6;J)$v'u$GJuFL=ɼst?\;™Δ&^gnxȮec[alr|2󰺱S Kk04:szBKK'#6>[(5Hj%m?R /UȌG1~ñ/xqG@-Iciip$)qBxljCy8mƜŒ OS1nguǍw%v{v܀uNAj=5eƍP{8 <> Fs*iLN/sKo.i>?c׾@uxg鼯Yb&f r9N 'QŻɉ@d2)FB 2ōa} Ac3m嫽9cllUΤ?C:/|)(`S74GNlp?"CJ4RE8iT#IIzS] Ivh4]_<)˰{}fngOt/|>o>8}Q]hk_}w%?վTǒ3wc=z8/U4#GUyŒ)3M ꀟ7_KYX]DAa V6PԈ "@iE {݆eWTbalyadg9;qx +!eb?S}Ki2llStoNbpliunWgz^FQQVWpEK@IIjȃ0=Յw·GF'>YǮ XU%4`%A;#vPZZdesrFQRXŅ9Rz`?|@0󱼼B#W6BSqV^_<^w^^.tܩy냦/|sO׻;^\" K׏gdd` jLLL /j053C5-[[[hjh >QEp}Q܎Wq@Z Agcing{5`~f->{.`zfg:P6}sa: pdQo@ qHO..%nI2}>uD]ğq =s| d|ҋByqfFzR[  JKrQO [ɶڵx^Mw} -ٰn+҃r#SIZoB}b[\ X__GcCaoY9ܦ$-* 1úèIw `-lGFm-g]v|wsBЉ9;;;;fs%:+3qCVp8:UmӃۏս020`w3ıLSC\H'Cf!XoSxm6+h,$T7s .v(I%ƛH:ɪR o? x>ښpF~VS箳hog!.,`rLUTT ݆Fޤ*BA‘# Sao 8.a(NdqrKƒo{u7!=:JҦ6GԂG^JFiJzݨol99y2?^9nu9 ac+Du 3>AqI7c6llnm 瓮S8{D+fds؎=ZX$3̬\ieebg7fEKk p@ox :?)OVN.6d4jO&ZSK;A)\2m[]};GcS;U 4uam3 wYy\m`h|?/b?N!das3a:dPSI x?0sxvf{jlm %0(HwJ=OŁ& DHySs869#C<Ya_7v # Po&f6}΄A~^"N'P4~]T!;V9ĝ|5s9kK8~o$℄aɌ+s]\?5tvvbw{EXFA~'Gcs}jE6.]z &'G1JI$ :JZJ:l.%t6bcm%TϖfJudjvm8&*173R.e4Waog9tw=)xk+ ; J~_u5<>V ,M¹.JЍt,/TisR\\[><>sNﻱS t4::e(.CxUa?biy  }g9c`x>-cXX޴!~2 vP}z"~޳hǻu.wWbz|@lL$/; }T03;B2'x o~Eu:Q$̻Mb'BWҫku=$R%q!pupOˣG$9+\&W9pGxoBk]1s9dӦ r8?`jٮbqquGi^ dh7~~_f"wcD?Kt\4\ZRՕd[R2Iu*,*zlRP sss6RO29z[訩#j>g8 ##SI 0uRKwwلMH=c%Eکŧ=’jT^^ISKSS3dytƆZLLLs1Z)011gh%莎N<^㑓99٦V666`lbZp}]fֽ'y[X:DhgS V6M!tRaPd{{;(*-"@MM 9MMFsU5rp\'$ > UTU!Bc.2Q6>:$QCASļ#.Hݧ]7Zq[|] .*#Gڛ;1sVcc?@^,ߡ>Ao/"e5T";zy%yϙEGS5Wyz`k5Cxy߾ X%&oGlW^A[[%K}3 tZ׹~%cl2qEX{W}olhg)9wJJJ*NF;\:"#'i|GҨ'TD*v?S-a?1Ky%M*1V|ѷӏ}|/!-HuVgZ znt ɬ֌VQ]QF݉\ ZA4 ǀ+}/A O}4.R,Ciˬ1 6n{{idfqr \[x5X~̃ɩ%~/1-6T(4== }x;0JȨȢjoۛ-\!N ޏ0r?׃ԂTMXGb Ȥz# n 524g"z; jG{+ߍZs8‡~4F3Sh sq`G-B^ R1Udj1Wy$FGNy} I`:vbLY"b s__+T!`cd'>׹E\ãS8 ٟ=w5C?v7B( R՚_+& 8&8Dq!uOŽ.C8\Z"b{|6x-d#8 VdTXҘ$^ƿOW_;J(WQ\RU2E%g.O fbmyg:*=]پCT0Z;1:DP?rs2Lƹ/"]\"6մ@:1'JJmk8tNxɧށ){yTÅ~9cR)jSk %#e7C+%!%S'}?::-]"p141&cV5UƐ$$122b L6VZSS=W׋I5X^C&R9)Ƣ_*udlܞ+ۑĤWS$a|ṭ޾k=u\wI\5w@ w8߷˘Bu}d1/}k's""ACRيԹG&!(AmM BAa.+ yyf sAAJ3.ڸxNXΎśikk9㨯1>ݦR<1-2Lpw_[$J$sSG ^Ǔ~9"3ܡ0Fff=VOF0HXBFj{rlml_)3,fĴm+[GIAA^!$cj-\S T#R-k2UWTR "K!QpϮokpM>2* M5yuM\ TEG6WFa[^ רb]f ɑA G(x4T1Ss0Nah?`:53K)>&2>9a:L>0;;o]ic켅>̰^y~s-mRǩ5 495}\aYOLK2,Dympn:>O]1gxCi$_?AkUX\BU ~dL4o<]lg>>|/bwyeԺCs(!C:"F)g~vg@E;a~[17?cĔf/,Y>¢[`SϜʔH+dVO$k:Oݧ_ #_&/dfP"+GՌ_@?u24秏qW^ZA bhutus<=%j*+0F4'qQLKp_Z}-DhRpXw2_$tk"cX(DojēO>G(kW^˗!~;Q.7_x6c.\<޸y pF9PJf| E#6i{/u-E(F[K1.-16t g{s>@Up[{:'G]+9[\5@)/ؙFurҬ>'f:]q>*ʖƍ:AN% ݙBZ@ IDAT?F$ÒrgR:6Z#nx|h2OeĤҩoD)}65<4}GdT3r,Nk%]mkom&c™vK㩮*GAN&],5&ƾ";r NWWk,3@՟y3 1ne21Gy]eW_fLicɚ0҂f@Ҹ]ktx#j >44` g=J!&'F,zprjҊS}q~֌ݳ 8d:p.̓9ǣdR3.=>A4uAj4@R8ʆifahly1(Ն^>w./adz,Oki>k#x(=NKK dzg*q{{g>x]UXF1jrlw+I.|EL؜s(+"ۙNhtRG{ffQU^I2/Q<%ٓ@4j dFG&Aa30kt\Y/r{/PG-Q|ovKZi[vNt*;"pL7."FjRW0oDG buq.44c2!NItwU %L2no%zq=n(H׵6k!kz8`&+NҹP]Y XZmiNUU'6܎ ct/nL-23a#?;q3]u& ֶ:K npjwK2+AUj ^9?yvXm©LQ_cL2$ﯚY '0f}=vv dǿ9{a;|lG?%s*,oqdaieL2[{dX^"dasmo<ֻYA A|=NSؒѓ[r;0he5:Fayl)%ǔʇGΦ _?qmc_"U@_Y*/_p)}RtՉ- jmbX5ћ]\,En[zLii KCcs;{bw9텑W]N 9AN*,tw`g#"y`wuR3*1U"#3|*D4 S~TwJ*Mɵgj&Dei~q 9yfIXV^nOL{v>ϧ*m'r↤v嘴ln35+]s17Q2OqSm 3(.,.&L- 0dR9V! 0zqﰊ?Okrm*.A*`v>VFW{{(.)Dhkj1Bw|>f4"s0I&V1~#CllՕdXT;14fEb677`hpjg) |LMNA~L%EdN]2F_җO}/&b1^N/v0f<ȢD#96#> zj]fTWYS'98oxd]aRH)tQTl@*j?::ڭE?ں:ilq9FF'l~] ^~ Q.!..s1<4Js Xh3Sa+y:928[kvIvMXLI,EU%LE ĮRI $#U@-y+*ʜJ#üj |$یITsqY8g(;:O#YF8}x/ ׮]o!g8ZՃ>Ksg+rA/_C[ '˪؜jkvL.AT@}uMf%,Dڛ% )eI3hnkI%[.W՘b dhtq^QYf 22Xڥ2Jc)$XYF7pMiaE%ZD 6\#׮IS(L\HNz O`09N¢rLM/J -΍v*T5\q@" }}{u|--IG,/%S55F Oi#J3~NMMasv^cuu͍.o-Asc.LjzbbN Q@yE)Ay}z͛7`AO'PQ@;MA !<0TN1|ҷLF Wz:nqӳĈƣi wbq~ rZjt! g}MQyuԬ44X:Uݟ{19/_%:lS'#e`qy/m^p֗?r`'z#q u ~mXp+tefŬ\ωt2Nn!VQG8C'trrr\t+(%} k6IfO PVcj\NUg9lokT jnLL-QE&ڍ!;yi1O&pͤCŸ].nEVw00 ZPZ"}%NRgb qlnS,y9 2Gb\3\x}|hC` cjnMPH, "%(+Df|l2)"C961"[1 PAuSMK(f?I)0\k_oM3G輂 qTTUcfve E{{'2Ix 4}G[9A|~wu>sa)acרעL7jɜJ8kF.?K,NU@.1S'4)zJ-b;Rl9%cTr23,y`jY8]1$Z8).&pJOUE'lsQcum*DUYsSj||'^ VP[]LR :mm45̂'eSK\E&HZ^NƷ!55G@EE~lk'.ddJ2\22)G[l:9W,,6:;;PlZ)`⻎-cBQw2Q6*oU69ɻ,%[r&"'&Fr?>9@NFU]Uc憜\2oq#UeWe vwwƩqt=Ӱ7~7́w0'[mXū`Ê`yCٰgT߿{(/+ECC('lks8i28 (Utss:WpOA{V\dkTjl񗕪8QcM4%*xOd*% }GTZ^YAe*輞c \%YMbnX*VTVceyR{yZiSbu xGqK1ŀedao1"Xms K+lN1}rԴYK\tw5Qŋ]W[fښj 3MrT`jSSS#&E5=1mY2Lٖ橦59!VjSKQҤln7+/@}T?  XG@YFFN=j+iW:n ;k[!PCx{e%;ڛ1nAuR,$+M=l5Ґy~{SHX~TTFwwQv A'Fr6ȣK(WAIhU[kd4>#vWq;;ViƱLŶa20ЇN2&B $bL Y-jLD]&??\˚HMgeeUV1M^v͐7-N #3_rL%@רTc@иI˫2-cmcL஽dJM`}e?|qtvV`j'&d^ڪ]v$m6~RlN R1A56wT Zrhk1j"#P{J+qѵ$$:JR@qabe۪dfaq)Qޭ:ۨB#)580jB'LV9)rgiC ->Sjlf%Tc8A V\5AeBLOvO[BTWwlyW/hWsrlr#1Ey8Q<]kHEyEqv,-uvPrS&̰N/]dIb!p\u'fs$ؼnnk6p [b>Fq?99 ('}եVSi^^(2)wvaފ* | gQQlrvXnDiEe/S#j-솬8A1ω}kx1{-&WUH*@,@LA hP~0cs짚* 0oG4~ubRTKm>7HFBY9Ji:I\YEqby5 rv=p y6TrWQZ^b@vTRSdL_ .>plVb>dKsIAV9TJ䧺)`h0i~*nKG1,j` Fm+:OLX"~B:}p[GyGSݡkx;FkN5rӪ~UaQ.rssNʵh"'3gA 2Nϛh#TN|sҞsn 4TĮl[#}Tt'dqO_GwiIٝH9EdF[:V7يIVcza~ [8{V7#]=vMy+&FCq}m%y8>Ɲ=އAyA Ut6`K8A."cDc8TSLKm##(eSin` 9-͠,lOd}}ϳb4G6QRLczeB[x@ IDATϙ=/>U*MJ52BIyVPYۄ 92UDb~,_!o]h+8`/sXx|L[륗/Mw6)Lֆr ]TbXj ,Ujۏ$6V6 ';<9fZb^CI,%Oq4Œ$"mK9{َ&mR7U-epty[;sku*5%~$ V-UHH,VUn|bq.̂"Mϓ5,r^!Xfr^T"fjJvV:wq ĨzuG*JHѾ 3&QGɬ6z(TFS0zd \GՐh)8m-֖v l:bVvxaRtIec%*$^S?fΚz.,wop9yX#o[}T?/'Gνmy5T/}= :qSs3hoAT 0E%BOTyoS\r(hU_XNMM|iՓe^Zk^,9ՙj+ST@IbJ5N1μm}'7CB8ZE C!){ A2Vu~'OQ&%upqΑUR6Yehm0L‚ls<#$3^mBf G0:d{C{[s䟝sh*;vTTO5d`ZZ--aXl$͊guar1TTWhniµ~ Z:@O *RYYea4b㩱\XXL*ɤMP8 ۨdQmsF`R}vL4ՔnG>:\Dc6 CRiAS֮'۔ڡ,1*(0 U[fx7l;NjH@⋦R֬n'Ca5J'-p^ٳgQ@bSǷZȱ>͖WOƒ2ׯ܀S%\cyDDj֋݆/Ksk}2 Z$8u`CmK"[X37}MGTg={Mw,U0A)(sNbQ:W"щYZEk(*,1CkOW%D7QrL4Bu%^F6ob|4dXٷ4(C0/&ol't4ʖ[TmJ\6h*_SSHWܑl&KV 3_3~.JR2 k t  ;#3 t`WqI98Sc褀l]︗2]-c' o;)m)AyƢnFd72O6:Nz6:NiE *)S#69滧yyN8;Ƣ]^csq TrA [<\>ٗ>ZY^2tvS¶Om^r#Cu9UH.oNs.RM&o|:R0n;8Ywrrlsއ#[qgה0aąǞ|_1ZBmFjW)6:;8t׽߬6wEV1S( %'dD#)y&}̉9^>uymX˰&+'N ?KpLETgaLAT["pcMm-T꫗qI'l*!jES^`B/T*F6'S^U5# "T!٦(XBjA5ɮ -fY]Fa~L[{ | [QDA'3C!ռfZ* :H2)ƆLm>F8pr\O -Hݶc1%K/OB t4Čl׮t2 l|'m"+T\{V3 *UpleV!$ P]қ+5lbx_SpKz8r>%x[z*W==]+ݮ7`E\TqeTr]c- .*Ncr͍er;l)~Wm+N6)-VgZDm2֤vZm$<ޔ,Nj-.ٻ]7u^,ıh҆{'EؖY|k߲J\Pllr[Bl9H k 8߮XlՎRS= Y;dj8iҜ|Im甚2k2vvt5s2dlbSǍ(SXPhJDAi ƆƜ*s S6):}/51EU$@ǬȜTS?-#h g_P8ٙ>QuAr>+Eau;S!Yg I(ĉRTIiWIT Ɣ?)/* vTlV3[vs}ٮR68wˎ~W w[~O2GfIs?E?쳸l;~6տ%;tDKX潅 X6lʎY{,R)g*@.8dJ$u  L(M@GMVO!;TʢQ jjJR̠΁07rBLgPoi.V궵ZMLZ7nrF:.sbFcdX57%<7hU'TN)@455X.cVٕȂm1ƥ!Ҍ+zlX*Mb׏J wy<}*1<6^%c}s( d)jwH#\R,{ sq+(-QatwbL^Kn+KNA=DΡ+ͣbvVOkaZbH}d":.0^;}d+4ELu>\[7PZ4'гp-'1]\FfSϰcTje&p~nM}3^zOk^AT@l*4Oxp'r& TXָ6*>DA]=N`e[}Nxɦ$0J!(Uh}c^KWze!s`i%&qOF<ʨ>moT 绩` zUU^GomeO5L!M-fR4J4:dgkV\"Ij+GG_鳢j?}}$t?8ե[= y [ŗ9cu-.>{dd"ӣ(2zy:.L/m862'U{Ol&0MyT]X*zSrk+jHyUUiZE`SRZn4.Ў٤ &?Rx‚N%zbc2R^ sv*t &3LɨHƙ%.(fQ𱤺hѺDG9!cІ 2_|es˛xJܾt+ P?UoɥM0g#J籨=m8"3ЎYi*Qwu6c|x&KfIW@2k Zu MZ5um{GeJsІia%UldXۡ`j`\kPzWe 20i&eWg,[l1=W-QF NZc翄ØXgwY%^Yw.To\@zZmU`~z]nTF✆s[ʝKږV51mi.CN=˨n)^>U~[6q'O|@6*yWVJRUl Pbl :}ᇭjQQùsgc'?u qĵ]!SO=v}vۿu֠1,0]꓿KqXT1e +JQ 㣨`%Mڣ,qb -u1! 35 >74I1)6ùXvxrٴABue)٫l+*ZduwouI(;H*=G"U΂Tt"SANS&WײU hI&'LnZA G*OFNB68ԋc5F.1+2,۫(ʛ_{0ɲJgv52 i`givWb,;OaIվlVVz&̞"0{2++3{{~wQ&ML׶nMEnB3/1Y67F Jqu0ÇVRW]"Yil-g0 ΐ@xg=V'gprW x,3F5,ӓx=<OvMC@ԩSڛQa}K˔)UXD'0,3VԣG}eBI*‡sEjxع8YAH2j[tH>}Vz7vpcLr*62k'փk$?3]2S1aH|X*.o=sXfNFhZwPe&4)zⱷesg_:zTobjVt!`<.mpo[ZՈ  x"6$ԐU&ApR: S^U%Jвn*]gd\q]`{_[ď7ӏIynז$ؑ)I3X0)\Ce_fPݼn6F!haqQ)&fWz(=e|rI^%kX=VdlP.:c~t,/H^.(#%Ÿ}Ft+ɱ #CVg9%ol0+(^N~E bMM*SsT,ZLwO79?x'4scx. 98tIqо<%m6{ԈUݿ}D.\(xwmj&bB@s-,X0UC9ͱ|CBY~|wZij4Ev`碬=Q׵Gjq 'tO{uƞ[2[7Nm)i0^\REQ- S\_#YIrU2>2)9<0]yk:C 5 :B}Ɩ&iXd LÆ^7~]fH)ccrwfͫAP[_>'&J_/J7䁫Jfj Ώ4bE8 +dPRЌUם~#FG%y$5@:K-c/ޫz\\r}d]uY6XςUO#I5$PRA?*X1#cԧ>Iv;A߀-$ssZVZ*&OA_} ]V9ډD; *TQYƯ~krUW˿/b?>GVvJ{~2sv- O<kl{ i=ϡ҉Qkκ:i9V^$]F[o%ںSlo'$5|s*VN½d͘8))>3;=1%yZǦMg{4V);D?#$Sojtx!_fJ:dl`bG@>|QG%ys檗:UzwW2ه0ܢ$gƢdxBܑ;"qYY!EQ ?61u Mx>qx NbG}Ga _vV~߬nv$'2*y鲱<+'>._+'seg\vd)6%- x_mSQ:ekhhK0ŐY3Jã}.6+ h|jPRFhOMIAىtMnN:-C`:Pi`WVo:>ò+|:gBGDžVi%/tJ;VaJ!-E_';ik`󿒯dfrDLH(t8܅Cơ!Ս *$ vߐeuaǶv8s:BFjhT: IDATA8Mt jJII$KY_Ia~Q- o[IJٹ9zU;_{UMbiǿBҭ j]*W0.62Lԧ!JKQRwZ,JSmwK%^׾6T'NW>u=> aaTRUsR^ /pՁS|i2!20<2TJf m}g`եY,-N`rGqa=U.?x^>/}UhV%XhW?62.a<,!e(uC CFxxrcRËxjA9Je'v1[:ƪ"ÑF J8hErj̵\}VF52VҲ3#9etq{b6XnKlOֲH"ZYY&4]-ٸ4=HKM4]9qSɳqeJu ZX(M%eF:Vֶ{q`$U:MYX$B&J͕[M}&!i@/攪#L 9re`!8F:)8etbTMe٬kaa1 8ӧZG,ƖjSU MUW] ?dQS50(Ȭf}{&ie.ddEX)y>?=`٬(  Xs,R#`4-ַrIFQI QXvLOA.<RDI>ܼ^sa_è_Xx8CɥQ9s[KJzf:64{ZT8'0 ezt@e:L*X_S%LO#]\%`_t踤5Օ&fch`Z-'igǿCq^Yڕ֎@&jS' R <[*-JTQq#|u2>6 (TjΊI謬0N'|^n@H@%!%]Uv9dgiX{TakEb]!9~U6471ђ 矗"0~ɥߢ8K+*˵Ӽ @#K(*0!e,SUQB.&8=1X'BMI2[E 5t($L3lI`xy}w`d#| 6{UB~]= ?EB~~M2EPmwUa`hL.{>sAΜ>/Do$Q/;sG'(sD*W$gO EU_TÊ|wH*d7J^Q2 R^V$aʊ U,oddJvmc-CP ';vZ~aa$#%}Wq ?p"ő2ӒYZ]<|> HHØd0%ksh -?'WT̓̕=~0%igbJe~^N g%7s7VX*`R_ ,񞖱iA \ SƲPdGc]Fdžq_5.c2cV;ss5`$:<@-Wez̨ :#T#0qc lhKv{gtXa9#ziyVȘ:娕3ky1\܅ p>@*7N,[CzFi9"& ?V#z/!I2;b'{\Ymwgvu э/Yv+@ʘVu2>lf%55An8q )'&\lIi;Nj*a{t/;7SvPG u,&S2f#EcK!@HMXI)x\S6@12Җ^?+g;zG5vٚծxJґ935IBz0)Unn9=n86p2cui4c vՕg+LsFOt[ ;eƙ*k#^c[5\5Hc"OWW$$'ȅr=Kg[|_+6X&tAM(Dxi(lڬdIͻ [ }7]rh8s71wu RR@ Jg`S 6gʪ뤕c ;hGM0o+ߑ;*xe )P狉񋗺5q?u:H#DWmm4 ?"}a`AhIh]}55`P5:m<|1]6*Nf1 F}Na aPvN ;ݲdda}mEU%Sdku^7Wˑz(ɐIs!qKnA $P9[9840JWBg=9+XQd5k{Ձ{j8+NH&ǟxBk'{ .Xв;9#F@?8NCEo~aЄd_t"cS}PHFmGG[ϵu; TGp,flQB<:c8J7pLS܌8}U¿_#ij*;ۻ:%1Ϋ7},gŀi292<`AU L`WjBDb`B8xp;iфz'gNܮiiqdtrBZ(/5%2 _u,yyA͓~͵^`CUN,sHP?T$ m(z(EٳeæߜkA)\Wf%fg ? m̭aߚd)g?sVKsӲc̍q5υ $KSBQ> Zv~4{8td6!<\XTw\##|.R2ڢF9sdEŅڵ\9+LVɣFzjr*\o}# &fYT]ΟkU UsY:7?^ WaIb2a3+?=,?ޡpW'8^]yפTWY2695'AOjkB?6Jy 2IiiS/gB|R֌TI{[> #<\Ͳ㊕kSf)tuu1),A ?'eo=sLbbÍ&R}$4DyFC\Ecn4Z]SL29p6bt&UUV7[d4x/OSVŏEff$Tؐx@sGkevjH>uB:~ѷ"6#t̪@i)>7>'5282 nm-CXj$Xy\]n =&4@.LkyvM+dW͞nX'su%=C 5Ϟ=k)oohXH%uɃ&NFClvf^RepPvNlFё ͗_9)wu 1s |jܜ"5CC 5 9'B]V@O//ܤTXc0e:REqTjxWVZ- UN?*krX#ǡ<]mY,o:š wj+rXmW\rR:XOU1퇥fPioulcE:/vJxiw0ސN\fU, i*WjJl\*kq;0[1H-7pObN M!&>FMF096,u`re)/GhY,ZʴY`?פ{r2-VBg,+*:료uKS^9\<`dU`۸X񾋫Jk }`[xkR&_xLl~@ Mx_RfF#K""6xMG}\jkȼ 6@(߿gK|NsV>:fjeuHG1p+Am?`)9@{@FrjjoQʔkb=zkkBk'15IBKU^l$uؐ ,61ײ)OJ}Ud$48AMOauZO?XN`aa`tQiJ>C9pK4"R/¸<)Fz1y{[q#ƤNIf>eXS زHȪ< 'X䆞EK&oUmDSI#戴&mcVZTu*[TUM+볥GG`r1Ӯ |dķ~F,l1IJ{BWYe͂aVJ̙v$OiK_9aўl=a#Fw>2 @>{05xC朄s械Иet`o*\̅>,UYrO$=UM>qjT{gE\C%{P6팑zQB (XͭIe]LLKjR$aC!#c2R`,NuqX_DZO:# u TVƔ8CFYQkFtg UVTvU*\0nhGnT aXW(N^\# Y@ZNH0uiJ#TJTlaѦ5IMMU R1ď;UPttW_WՇU" M9tX,GPM0\IL̺r} ]/wuʪ듓JРT;#:IA5EF%~qL!v@0w+%Lh_0~:-nۜ 41A!!1GWnxmdͦ}nv6ClOr8UxktBagF -WehX;'[_rhoS'SȡIj82U!ὦ2XNJҏSa pQRQ k81%ʩ lbTY-҆L7<76+eEe-xA,ΐ{aL&u;--EvuY 7ozA8P=Yje6HKsR*'wv2h3O[7eO\LKLNIgZ$(鲷"WiD(2 k `Bo870DZtU`T` d71> `KCSؙBAq9NNHzFIl]qYZ,se! (εֶf$He}9=?Ԭ;2UOoaiwYDo]:/A]#p}Q,ap1"At5jd`)#A\wjKEgio>.0, IDATrU[ bst?V,fB/knm{1f=6P[ :M }n`$8Pʈ_g|;x튜" EBW@~ 63Xxyq<:YoygTK ax6 eŶOEϝkxMo~Ch\W)O|JCE 7mSiyа:LiIR*5Ԛi9D׶Z~WgB u3WTT>Xy#24P+z$LJITܒt;H l<#JSƾ-μ̍ jbgO!odrISTerSiƷigޒIYXے]q&&÷p . 3D.!9R&ÓZpxIY_^&"ʦ3PFG 4vl(Gxmۘ6*2Vݯxz`/;8x| qbjQClkzȃ+AK?e$7+O׷Pr̴%Le9~Y)ZVSSc-n-107+[|Aݘddܴ# Cjx\+3lBrUr gFWV&$g^5Q)p@fH~2*_^Ms]6 Tf(y(Mn75 l9Y xa#BPR\)?9{A~A W &4t?2)WGg 󝿑s5)ȌJ9^[ ^vHumX%𐋥c߯oBC w%S''`H]&!N{bc_X!7U Drl,m(u9(z" OM]B՜:ggt((!|cpREQ xS}[dV--u,N sԀ!W#x*G9AXʜx}5d|$=+RR'8J sdemSrUo x0!H0~eaTQn>\?L9,"Il6[z[a_xJsfu;vpv?M(پ9OOii!/hh;o_g\Oڔ=1~=X l/^!Q1R6IKz}С M#bc*!zPF_~H{yݟR0]sB3/H=Nds3(%e%bb1TU' b0jζqvL4畗j ;]^uI$3 d gJZTb<ѩ8;)5k]0tExEơPU>0S z4-KIdiy׃Ų4-#G斖$;/_R}e6侻nT`?N wkXLÇ&،a¨~&˶3oFf˞ Xj[6 u娡 ☟7ym m1f)$ ʏT`I"S\eFYA.Uռ|.l<MՒnglaHUdSc\ZO|*Io%ݝ`8ZU 0;Top5&|Ug)Us&S4~(Vk-2 {Q:N`ּNʭ)rڮfEXhgSϾ*32;X~U|r.֬,)o`4֔ImuO"+ ZIL  MxWz*5&O"cvϓŕ-P ut3\KX,IRbrnpuc]69sfIA$x% vV}G8&RZQ] VTRj9EM4 d<7Up]rU1]96*L3Pr<:\'IkաLN157pR,?񒌞F A(;u; c~#mؒ$Cಿn4F5z0rLk;`x^rѩ>UAQFJOW%dҐ1O<+|&;Y(MM7:Hq [ 8M6q SO?#\]-̮[;!LU?ܤ R&l=KʚRR5AUMgntXm4a&5&a0S +Ɏ6߷ ]֋5]A- UT/N0%`$qr- HMq F859fJPu!P:kg;3t C>~.({A ;AU}ѣ,Y6@MulGRSeL.D1063{r78*dxpT[ 86Up_O jq_Pn,};C8nJtܖf*'\Mb=3czcv*Iq0gh!SO!-jk Z'QE5֯zrIy"Je 2 cɈ0)bOGfQ׶j/ ybrVe~@B$$=i)#`dq@-c3ǟ~vTgs!/%_׿E5cPZacLW\|B--KByKI†&HR%a҉}ZFaua2^w}Ӝّ#u:nÄ9VmvF8ŚC6m{V_J$vߡ6 i.F'Ͼx a@6Ae 5x!#7Q?5ԩ<bScryy!j2S۝|Ksa%/׍$)~tk1>Wk7G8kz02FQq~wV_7TIbS{%-^8QE&1,,c6wɰ҂9vI{nMru}UO.PɉQU 8!E$5=E22%;/d[N\nC-t=Ky9Yxhb5S71w^cu+Aî>>B+`g/ H6Kv! sRҽg# }w^kX* enrTj~9ąQXԴ/..5/^Ikki7))گ49=!'D#`eB)^c}r< |,unaYu\'/?Gy/}1-)Cع$u9''%|^L&cc4ľxU7ޮ,jK)@e ?*rĊp{8=;_U`a| ^O@a/T\U1\+!u (pU& R+S䌗G?ZɈl7MyrA `1F佉7n2>"? Zg>nn]Y[7_{]}uu 6{ e{HA0{;DȮnlaF#*lLNL&Ac3|>6<'F3,!r}"{erB}4Yi9tL~ȣr]6k%1-}vi|vǸ+d~K+dŕ]y祾!Zi^Yޔ̬<ʰ?g'}xW! f0YYY*È9& SF7 s8 pTi62](V|` f5:R}1l;cLָKɹEIxblR=ܙ>i/Y4y&7;Mxy׭?YKYy67 Znk}ێBxQѤ@Far/E?GC/lT/#_,ڶtLd%11OE\smz3qJL퉗|_|_|QM}J=cĸعU e(Y]T厢!ȷh0wd`lI|Iy%u 20'u*I_qu)MKqXi:^Ŵ/pյuIIKe$(֗T Ex*>LMMrla 3gW4ʖw+d/lJ7Aqzn& i4X^rY\q8%21N"\.Vǭ qe#1 QILl3|bXBZithuWopD3'HQlrij%FIGXɂ mfxtM.XJḪaSߝbIC}|rW[ 1'f_k+P8#JcC΂ҿp``Xrz{GߒTIL&A!d]8OX?uM8wjtlJ3Wk"$ :ƺ$,̩djv^l*Օ),(յH.f|lBy*d=/'SoIAmvf'QdLJmxC xn:E6gtVD4;9$s'JmYԕ iﭻMAlzXICsā L.HiE23o #S˲.mqv-lILMRxNim٥Myenyib#7#м -⼦C}C[n*:t5SLiXXX;!`rgq jeeeР~=''7T%GB"]ʲr+QڡYZZ֋Ctt.**[ V\ eρUyL>~uxڼNvyr2i\c,˞sKvHkoe@d3/۩HrDc#+[259Ύ S:KX+ӓr%k٥]32bcXV%ac+,>'7xQd μw%&߯9~\JM|cco~hOf9\MmKjR2tNONKaQVnF'n&z:jΉ$$g;gJJj[ɧEg尬/ɡ29sfX*CCGIJnY]1KNm,<ڡ9,<\(c KdE @T.^\SfVGlU?M_]YaՖIYQHǚY#ks,j8(i>wi8† V$lƔc<8iq|vvF7VbMNNr#7!7#>d 88ߒ-rQ|+c-Azu}}Z5GϧHbRttk!7k.,;+;2hsW9&zǕͱr-|Q s+ƶںz{vN\BXT}+qDi17w$3#L=M^bn-Q+1,o7w(U<+]@ 0UMȏ@2 Ul9=Ν 'P7Um~~Y4M\mN$yIDw]3.&ԇ~U ÃKHIiz'UeR&wʼ;T3-226'۽/5uj5F^xI+C25(g<-78!#p|C|^0)*WsW&>8wΞi_B́QN̯wKLh9Ԣ]I>}bCXRi/[ wƊXSBg*S#2StYuZL&0 [[`? JgnDT|W䪫R&!\Wp7^SS  afׇG23W^}U}+{FS:듟07BTՈF"_ah}2[=3z7ޱr}u y \rsss Ӝlyu/zk+Ҩsv^Wu}CJ?IwS A?O, jZpSI=RX%\*u @)hy$Ql\6 7}ϧYX#r.jn+) ߻^A9eoBV +l>԰ 3-$ʼn HJGΜ}I+y{T$Du]E=$$YX 9շZ](y4$JtBy3Ҥ`rOO?[d('}*Q|OMNQc+$[j2J e%񳟽WryfEk!L+^חPrK Nի/A7o#|M}'!wqs0.BfmXz sf IDAT..;"㡲,}urȪ1'E2Becl裏 #90XP76Y4=o4‘F^T u"XH(**ЗW^=wtDvv]svzɗgKJѪ;S8ϝčzфJn ˁ6:W^^,bfy$ [DdxxDD>h`7TQGN4cH~7n4ĤxxZ'DsV:9}q235 Q[bZpefh9VYC/~0j\,{`9`ԣjokvІPdJ^z5~`y@3 KXk__;nA+ۮ%KRYYZ3M4K3 na3 pÑ lY4ÑSؘW$ ܬ6Ydx!ܝAصǽi?`\ɨv/ΐ WI @-4X9b:_W^~llYְ6OA\K=;qxNv [91᚝W6n%9,2)~/e[:0&sc9007H)@$iAՍtZ"cU7++Sc]|"!kspjr5qs*rquQkPsEf5ۢe9?Gb].K!K@&'gHre'zˡ#jmt ը~`G*ʋer|Tg&gfZf@g{D-# +3 !<t9rD+i6sX)R^\ ŅY8G*^8b=^-E9Cry-I/̗5[%%-GV,jaw.c8F1s?c&B81 rHڔZ-m-i>HW,j7),`͘O:L?Oa{Ja+~JˍKf!,cn?ύl˨oD:ܬ$UG d(IҬ}F3aɓ9:~喛4w,OXTl+ ,#cƦR90Lb؆?݋/=OgUİ`Hm Hg 7K]F*+T|s~G_ʿ8qBy`Oa,o݀Cq#h 4??fǴadžFF|'.FZi%iY8 {UeBkdg)S9;gq:t-GsEq ǾϺ"%ϾZB{QV6T]^^K8;77FT9WzxpHsoCFqd{uU3d CzP'-G_E. /'ſW(0D]QJݷ^>9z^f'ՙgyi^nmt,pjsbcn4wG%\,D+fV  w 0Ý\0<GsWSS5Jp䅳ZZL7θ7[gœʰt5_Zd̊2NXQy5ԍ7ިGp dl$dT1bޣj@!6~N6Ő9<]=(]dͲ-Z.,,NXeE%jT pI ?g#bp`b9]4W~Q`brLOi5~TGlDŰ!d'ѫDH;KGZUr41tֲs^y>Ь@A>umF}\4]8@}~]{x}7e1;g[婧_ҹ_,UVv{F#fHƩ; 1Im)RUW"84d~l9s#UzGU˜y!ؠW=}^n6YEؓIVb~zzFm>lph+t#2iCK~ λd͢x_]2?7+9}Zs5Yxg571Y$8ѱi4ղ|>y xan<[NM1]zS`4?rYRxsH#dl.+2d4æe Qb^#l$.5aW+l9 Pd3aXEWm1Ngu qzD7%"4NUiZ.K1y5?̉Fd4cZU#c&}TH 6[]]lkp[[vgtU^Ovn_v9*H@u "v8i̽<@##,/Lʑ#5?f6}$m"a:5Ve/SSSC8夾QF'ft sҭn+pp g?#R+O=yfgX&'Hc2^0D8<<@X֣ }`:*㴒C: vF\qg8W0'WO9:S~y/=m]C%O>iu, IW{p=Ы;F=ǀKz}zM*2>:fb aԘdܔ4j$Lݛ!V3S Z) :á+r1]?rFCD aw/=ܬ!)>psSMa9A`kG*Wk˃͂tT ! TIk3"a=g#m@ d.::ʻ"lY-4H:8- vs E_'C4Mɼ@RT%~XֆtJ0K~a5F6.;~Lf 6ʚ_(~efeYiBB'hWO`.G蘿,ލL[+%7& w58o[^ِ#GctRIr{HN*O?.l3)4+j,DUNRUH64UMrX rlan+wGT4~g\V{2;Ejֿ*]( Xd&3u CHdkT 51 t[m̙9oo)adUnJJWVV5sWD`(Einiؚqs?YNS2u{4ŀaЋΪ6~8S [#;!1 aQscrF xL3cUd~4 i7@5lWIɉ`F-}^|OZ%_QC+s}]1'宻RQ3M9-=8\?qGbܚ~𨺜,IBݥt<7Hc +ݱG$ Nz{J;۪y504(e282 ܕ>>x ʡUm&Qzo#btk5;a&B'*_S x,9tQgU&y1t_yœRލM歴="nHwx㵸nu 8F_VWpĻpViƐ_XٜXYRv I+h\).je ' mxprLL-n58 {e, ,hlڄ{dLVO#S:Gd_ U/V@N_[1Jq?!#=UWW$;'Cӓhy]}IcVe5 xb0fX> uy` Z*3gI-\꺳@gBP5!mn}bvIm +ÖJ.NVM|~Q*)U+LPکhElc1FКT&H=jc":{,U Y=Z}=wk8#Uu"&c11UqNJzeOg7k_Igغ٩#,3-)K-sTkezjR(9(4 sytɇ3@m-El jy'6Jh˫&NҪ2Yˠ;}8Iߺ]o$eOXVTݍ`߶)/tRjp I `E#'vo1,̳:S^YL8!F-V܄;tK>܄T$+J{ Mf֐*R!lԅ5$}Yc{a[Lf e\*2gXed{~A ;08H-5Z>jɒ1DY`0z(G"1fS5 Y4F' Q}aRE%zx''T"FGU!#V u?l\Ȩ2'NSVS oB) <%؇ FoR!֞t?o|RUS${L96RC맚RntoĴ$JiIY734˒| $O+un6lG^Ӫ]xQztqSDt3FKl̈Y{[ *|Yٝުm.@xk%{(J^s9  f0"%ʔ%-?ߖmٲ5Ҍ=eI$җ-Vb bsι9kskf>@W_svUex_vu0_Ҧh5QH AU5ZZZе EʺoF*_f"M' 9 pؚb7{w lDe'mG +M9&fb]xA zE1,$$X4 *vD@{=(&j|7 *\cLj4\ǟzB!U젠NZ\(*^!Udqi{W,?O%::5\L:iL(}n~yɩ9&01'=:6n]}~`Qf;6zjPU䟫r~OvIHJ&=ORS$1&y[hni5,cGX/_B :Ub.;! ٝzXzXJX[~5]%,iT 4v%dD<\`c:W99@=P(_"eRQ'g6@9bayG(۴-@#HH<>y^ct]Y5VA&P\LMJyEњl( H{8v01i$|f3ifAfV0VH~ /iXf`OUn@Q88D`|g0>,<"#x칀⧩9|.7ÂC3^V_4p\llݺY\`r^w]uT@=_#9)}cl&Xmg`~JQLxrYsJUM8g$(&^Ffvy=@bE_W5 KWcE5yuFº% >rƊb蒥9~oh"l86ᛐ̷Q MaQ#pYcZ<,S[F=p^ zW&BA3|ww' vBpV9(P?[zw*H$vK"-5 hCY+]JSkIyx!UiQ/\ 0cBK# 2&Dk0nC!v,iPB8r05B*It[-k*8yT }̓rێH/ȼ,/a}C-a"ʂ+au qӦ QEo IDAT5iLF#Rҥ\Bx#!I8Þ._yy}5D/0 R-֑2ra'ذd'K}P[#/Hs{GhGfzE^чlY[ 8,r"T0E?VN + r qD Âjχ7_zI/yH]H]!c!"K$~mRZ)9^d>EH%:JTn`ZB0~ݱ^4*1l6 NUadNIųA $ #AV7L]qY8R[L /՗sArJrseRaVYB"$uJfFNsa|ZԈdJ:|"l\Y!S7  nY(#:80 .G,79Y٦T?bâ"Tǐۿ*B zXܡ曇[w܏&tUBBΩg@$^mDQ-DEx*+8M><)Ѹq.,9]X^b߂ '8QFR`Pv}PNNLDa;k@eH1 -!Ū*Nv5:^V08..^`#w">ٹc?. z%LCK 3u'ѣ u\o1}#|tUΑU@?V$f贴t""EЩ {04BqvT64& ujrF~"#{|lB>iЛgi+KESN }]ppBI))R[W/߶Aξ}Q5K\lNQQ w)N0lb|yh:#6{(/KZe:" O{hJ "#H@V `Hk^.WBBdsxjj"g ddf@o1RWS/EjFt}äo-^x~z[d|*/Usx`,*r*>xEpQ8I~kĄӢ41J6H:Mâ<馱E%ڸfŭ9 VwaJۦ&I jR$TX,o3QmDc1u7ge<|N}YJ0 ^7blG9Wl(;mThD47BhzOrp`^c_BsP a p)PaeV}u j -@Rh֖y~cB ʨѠRZAJty[/˞ǞPBt2ZKS|gF6sφ(V2F,!0s `xjɥ(׍p<&i+₠@և#FxlŏG4˟kuӖy:EZoW%yC75Goܪ :dBaaiɗ `#R(oP8cflwv!ge&&KHXQgK7jDXY% 23sz3YQY$-ljk}yPgqrգT_ah#/_:=<0TlkkDb|o~J^x2xg!쟜ZGʢKfF$/FT2/.P"~ZkW- a-8?KzMs0Pˊ~=zdE㡹Q*pH0sf.!! XkDNK9]SUy{k~~\TƦ6indסf Q!a(-oD@mfvC#PT\ &Plu$JTTQ*!r^!2(-.Qg[%e g$ w<Adn? aMIJհj*oٳGr4ԤlsP>]oIR|d,"ed3ʼh}2>qUZ$V|R1F JXd\o,jްֶnE`]_P,'N"?ĸ89u49,W3ddIlL%&'fe@765rD`GGGI}mj$*>(~oFjXӀH"!Z[S(1[6oeo$O bxYS 8[.]?×sBjU9J(%mttv{y>_#7_tK.) QyLMO2TA;,*CktQ.V`Mna+s)GEz5RZ[;$!)M::{]OCWv޹zT )9i{ +8L7C8ҌR#㝯!84C`fX-}/). !Ph0 s[ޢ~˶xmEs`)286zGN@0r?;>G6UJnݾq_-T58{L&V;:-Q@"0]HbdPPǂ"$ب@U`qgZ_Xh& --m,,x8F exYZXd̏D,3|׮]/ӓbc$<Kˌdŀ=^ksCڤC߾^s̛cV=i̅3$ȩ:k7*5,76`""@r-Κ0-M#80Xɡ 8m '`,46'ƀՑQJl,CRlbr }9$Dɔu0OA$ZGF$/7]2ғ RRu*kWܪɓ}-66z?[> 0MMt8h†)(4,08χZ Ӣ>U 1 zl`tc]1-9z>" :{DGGPCfQ=k`<._k0XS  @D.lPk(++b`S3ӣL\+c&!!?@c=GDGhCcjjRF@Μ9c[!xXC˲34:kZo:!^X.\PrtwҺ w)^NMq05Q͸:<‘ـ(B-9j` /71+I~aDžRE.Ϸsm!ؤw9a@8+  /BeYpT?Iξ79СK0(@IxoM׃%' \/_mmPp= )ؗ}\/ Q7!]i#8[Y|48jP0YΝB|K%A /کLZ]P~̳}K_% Y@[.9oizq 9MD (vwP^1@O̍ifHlFT 0i箻$ܬ\.$Y0h|(TY0^@Yaaf&>ʕ AχM F잻vIq3f=( -WTLАd#l<>k> aFsZ[>"\'s58蕛!c= OeMȽFT>o r6F Auc}/K/*ʳ()s|xMdSMVI%A *^xqb~\7~Fg\7Vk $W3יCG\tSCT .P+naҝ7S;|C]}SorHHzE"F} O ʚ r1r=Z!_*0)R&)'X@?e py͓cGu^WWϲ3¨Bw @dm--gh }̸yFkp`HzUXO1 bR&ixElfڵ.\!s_sKF41M{p3vmco\e[]N]󧦥ȥUD80XX͛+e@Ò"= \{\cO8AYL6x8yVL?'¥6WO_/'tK:z;a~^p!(w߽KW7Ӹ2^O,|y-D^?Яjf1?Wha&&(rF"΀f&P7\efd:Wm۶B<kprH3U穩9s^7l3¦aW=>㺰DC2V_ߗ /EMuIa/7Q9 D![}"N_ӚmilT u.b= \_ޖ(dxPQ[v{. կ~U**+87憁ܹsD}6T qW_g#qlAeY\?<#?#N u+Jai+ =\pcnl,r5CbgE 9쏨CP# 9KTgǂ:%L|g7!QXi8l^: Zs s ;[)O=,z.v*\X3zY{<p9yzGVbW!W dd=Qiՠu %oP&f u,",^^Xy'%:2DSZsA)#=W m CyWW|ZY&qӓr8q0?*MU5<㊂FUOM1%$!q&XFe~a^G]Q2'"{ǮkTHzFW}v눢Bp\+7QCI[ZMŋVƍx]@|cc94lc|u$90WLpm8rrl،v.V(!,{zZcեa =t|.|//79a<?$jkAJ8OK98H"Ei(ȉUar˗ة`p7]T=Pdp"),$L2R%Ica/됌$ITk,&fR_ \DqjɑS34l`Hb %&œLˆ%&R8^ϋr7!Џףqi6cԐ̫Qپm  􌑛UV1 :yRoĂL]0b3zÅTn.~^Kx|!.$\y`\q(Q6"[QMոN|Mu*n$!j%%ҮGua̪j%A?xAF"|8/81$JJB  rQMƆ ̓PG¡CCkIJtT$'j"}hEɃz}g3dn\gayv* a`@Ye]_.䌁ɉ4m{:'HNJl< Q;sAT! * r)v3LMThlgt>=m>5қd@@FGEZݽr譓ZWW~z3M Ll)t@JFbS  [Áڵ䱩!_SYf3ᇉ@PxARNl5F'U ´<ٲBc;QW祣EсSÑvELy,rzJ vc{Vz}̬E+T4L wb|^TȡgClz\l@؃uB3;/JrA`i _*zQIє $ 4˜+ &'gi=T D`,@e@$nڰ ) ~?N@\L,(adq6µ\X> [a&$Z}||[kh\4jWJ~QhpN嵌>7aY{hdTB9KڵQv(<"`!I".ʲ,5!tY]lёqTݴrA%qACEa2ÇA%19I6o{9uPżzuHoSbh]@4R(.4UIUEϼLjJzz} JF#o,*h7G!e3뿁MyE#]q R^6m(\U#F95jYYe)Ҩc ua@cS1"4$9̮N5bI aΟ?˵(*[n5|̂ќO!E4f5D!yѶo^)`@ F ׀"!u0Y!0@)֙y8Pλx8AhoG?wk@Տ 5Kب(RUgYPv5 r ḘJ}CBuJr9")C%YM&t;;O渪i^ihvU:bGWxP;8(зD]ZK9@XPΰPIVؼ>*erC%>L,VJg[Ƙ. P56>P)~ITu61  Džm0)'Nu`/ڎvfa)f.;V Qahpm?.H/aeaΡX K3Llq4<c\×y5nHq+Az0MZTX̂J2@lPhUoFSaBE>5. Dp6_ ȓH"B#yVc0N_>kK#G2GWYYgMBp:H+'##R)y*vCWQ t@u !'@!jy0ؿ-*$vxR.ԋ\c87B6/􇆆3CIx}!Q7s %] 3]oJ7 H=յ/ gZP+U:/"}-I\l?vX?$fKb|NKNV}y_w^~Q7"}FnܼL BrMݯ-Nښfikd|9| ÇBd}pm"r1CC2 QsζvFp? | lejZU:^VDm[eƍ܏!- <`߀k>naٟlc?`erkҢ _^8aj?{wW/X' p=rx@{Xo<7J4&xEX~ik4ƦRW.ڟXOR~~.$=%Sk9{Z#ť$/}di걀@L2Q }9Ƶ:}&Ѹ,9ᄄS!PcN덀a" V2kZ_(:?'lo5gY3R{@Tqi+7bJ #ZPHpP=zBҒ2$\ߴt]țƉG~@;ۤ$ƻ(rvVAyH$i`ఀ 1rSݨeHa`O`14< ޶-䲆!,?s<Ө4k;Rx?:0@kˤ=0|UhC#?K 'H 0@ZM#<oacmZ( +W9{$OM{G+_׍DyIujHܳݫ _0C.mR"ywd$bQIeaz$߫Ivvi8G䒓K]rR2;8p;ډp}wz%19Q&&hD] j?+91Yڙkniҽ\! M {K>c9,ipgPkS M}T{u_߽{ǂ|K+4rKu]8mz/Sge͸=*|CB-t#1;"Z("*$;G85|3J$k 06"ͪRÓlfaÃbx̢/{9 t=嶭[4fZ0:&˅vsRQ^&ʐ)*0$1ܢ(|~5\}7eAS Ĥw~(>DFyt SH;knӃCʑn38Lں xiȉCR0 $?k){m:4su9i"굢ks^43"l -r3$(VmMLzָ_*q@KɥټywjR,.1^IS384 r5$n)9]mr];K':اg>m=' \^7˞jT0ɖD V`OĊa/4tB.ATf uPsFLLKT}HU14`9=3ǰ{r*n(% g}@CtXh5&CW2sWKc*\F z͝7p8>.^=a+-H5*.*Sc! !Y}ICd{ 3zuA굽Msn>mTUq*jWG;籵4sJ0/i1Ht6 xz,![nFS_kKiHnH)qP2EoeIJe }s`97)r6H:]]9mXk6|=Ksp@Ϟ}ӧ9NN/X[;hR,7_ױӢ=V ,4BsRآaZȀj&Y#C))>M]خ@SZZw7Hm]ohi3 ?:Eur)&7`{߱sj}Ll,0'O ]cNҩ9)RϘ؜NMxd_FkRR\ Mr `ziF2JKs<ބC UnH*!AS =@ 5**f6<; D`#DxOŞZx% rfGGޛ:=w.-[@]':> 8@윟c15n,0T7o%%>iP ? =3^<]XDT7 F'8…sr;4HӃ]'e%żO<$u2Ԩ(nmoa¼+35 |Xni W)1%% 9 C_^+WI再UϔCiDH(p1 @88rq96!V%qn~;rFAA/~}zN\ϙ8O7[#Gdr낪,͘(vd;\OzS׼pجLtTq qHq(zm5Ja!_|\οWG,[ov<T' ΀H&t$dYTr9*B{ߖd&WK'ejdm4D dͰ|s3};D/o.@jط0W*7˶MRV^@>SHz 9%Ũ@_rdڸe uz ߩ,66Y8qa@JoOMw9LsXQu:Cbqt" p BBMz۬<yߐnݘyZ\]:2H 7biZ QFZ6^W"^xJRjZROBnDGgY@mm2`:􀄀&ӏ-Ŋʟհ|z7o"- (FXjhcCZ@~GmY'NV~L O$]j,djzL Fl (1Bڡ ysV4U _:H#^QZeɥhDdA N0nF*htCE$~ެ,uv=^b rſP` HAaF"$܂rP]Q򛂞kJE)[ajΚBhE}ǝ[cǫ! 킶ɳ8xۯ}tKЍorj\}Ȫ Ϩ0@%tTW\n/KaA)4ށ~yG5ʕ-C: T'-#*EE^7n k֝!:]߮~ VmC,/3WŸy9C٩ﻡRdWDk*@jjkliA*#lege2 u|bETXe|u&0f|]vIHS g*b۲q[L{ ‚b%=x?P'RS[=*\KP>3 `shϐ¾BX jbwu9!( YҢ8'7O>"!QarjHx2 皒!]E[հ{7K)]%cMACf\pW8tg/G|2)[%VԪ ̉3̡ߖ5\ L?ȷm(We֭`\e6z{?&</s sXn eR( /c|45-wȥKzbI<`zjZ H&=$]ڲcx0Ӑ +lR4'c7z$a>^b>zW*rIHL`T?edZi v[ƍ&8ٺE.zQ0R^E6s9nKKCu@1 d/K 1Hی2IoFI݀:! $jY!я~Y~յDT55,`8Ig;NYA@NsF) :q>]ߧ0v kκ8* +n ڂHJr^O|n[s;uk@ٝe{[/ $˟gp[zH駟ְnY?_Ks楩'z2VfJ57ex!%B =w-wu'g׃c:4 5TbP]WFL= SڥE~\ \%] Nج׷vcE) |@} g} h#e"lz/a8@g7C}ᆛhhh%?/a۴y3sl@\AA.k!.M `hݥِs5|zfdϮ.Z1'OkKS3# ] B.¤95`-APC}a0F |*8 "u(Ǐe{;gR\\*AnÙ\#tt*BX1/C&Rrj29È0 (r.8m h6Q|s 6˾}Z:sV, IDAT˺~TtW7s`oav^-*""ŻxLsBCnE ^ Vg*gLKDƛߚg/]~^ץw1Z#xG.w~6JZXX^N8)Gտl\.*1|+`B (--[LWhxU.!^a篒92"\@`]cf_źi4l@(?FGM$uڷRT IS:88 z}DE3Lu˶}I/$PQ}Z9B_k|mir.?<%5{9yר(أ׿5n\UʅWeр ]|zq2ĤTyY ^!gtTܮFĉP['努 F̬LCfQ,fl" 8RltcoU MCU$jC{d2[ҿq=XaM w C#ƄlNQLчgF5! Bt *[Gz7W8j&7E3uҙh^YfI]":*))k#hϠ a=^{eSQZNtEEEXv9Q6AL`xfFjܜA-ڼi;As! q]-ϟ;G09>aڋ4̜}5GBEتNEL16p@D4ύxeGMMwU n/K~ןd}'9 % ?#j|ٷM6j>c/gQaC5Wq8Fl< tbؤᨭg:Xzj&;x16;>uBjrcn"6BI6~.cey7J a\: pNC)v6"G|x"|yQJ6wriMRׇ |dP_:2zf=SB@Apx*w) FF^$'&r1IkΘ#S[sI]íaf\6m`> = #[P#4[QV|H=-:h!p^x65*j #HH,HQ+BnڸYC0)LgBuy߾}VI%Pg\lD?9%Aɪ3eP: !:Q`1Y<( 2铑jsY?i;2(쁫FjuըO&"g6>6f*rJINC#T䲺4,fn zn)B:=~w<7?~cȯ'B8>gӍ#۟cG?17!x# 6T U}{9H!= ee簔hxQ>mf "OЃ6-{(96[@ФςЋBD#J5V.V&ԣJD{rBx ƑcCm[r=Gdu付@7?S A9r= /2(8De?F88wu1BV[CA}mmY֭Z]UP@*uMB09i-롏fZJKqۉg7ǵA"2qYy9+w/[^JKOD [4A p޾c0 +Ubs%J~V3,c{Nh_m-e0G9@^ >D WƨO l+#fcSƗw5\%Qh.*7:ے@0Np~X3O}z!,Da&ərszM6X ~!*xozVz4nrVXg…}UկNᰞymhTsMXRBs3ucU=q,'Mΐn 5|cۿY2O})w\pݸh !)+|G&JqzM^Rrj8s9]F0 dH-ꡈÏI ^#6F R]aJx"Mj0W88 5t"D*B["+)4̇Re C!$'du]и5F m3Ǫ0Dz!@zFUZz]og-LP=~􄆽fHîd:ar|JBePuF֩ȴI"wuv!z>МhOvK+|?(QĈ294 [ iq͡rEwˌV'^BpŚ( Ċ}KKi%)BXƳo`DhkQE5DީIzz)⪯XN̤(/dtZ[ڹ=¼Qh2_%/ M[J9yL`#oWUUC u7MO[bCÐ%~`Ȣ$T!zHcS-Ezk k+YG<ωαF T]f2{YHyGJYi)+FFaHAn*h`aTa@tbR:H|>WTlP#)!|K ?.ٙDQeFuEEM })ņovuI\1%3'(Uo Z=pDe41P}z.uÎ@3 ȕ(So\(TṨ6sGعY$"k[sZ^ e/v o'2SrRP?ٰ?yiR#_Yx0vJբn=\l3QwxCUiJr<./C74תܴQ"cʧ> 4SowU(ѱaSiy ), -6S!lvV,V$G 9r@&p8xX.7slt04F?U"3( zYNXAaP(cQE*89؈vEjIA獽(JpE{K~3mq HN>Cfݤ~AD<"䍎1 X4<-jX.m`q{Y,Jz% AϘ 9 aPi޽F_m2‹2(mVл*`$@9{h UιÃ4R-ͭmJ*Ov8ѝK]m^,0ԣ@H cD  x 2PH 0|7'L_?vPy18^{C{[Z۹ 'ޣ{kרA6113?*ϷܪU*Pc"'K8رc_&"86]TTuQ$EVW8Y%͆d*O υfb;L8PjFFnNM+*+_%9ϳ*;vZ-z#+sk^{Yidl#)C ss"|JАy+i٫wi (5H#Lj R0N۷`l3$ n۩*[5Y׳IAi -] &БD T&ȠW 8B3ց¼|ikRn|>Az#~M(zbkD~LȵU{H.uVwaȂs(8PΩYE)d"|EggW[u_z7ʇҦJ{! oS~ xtGP_haq(2)Rstwҳ5 0j8ԀRnA1sL09t-&gRA߈`G&쁚LDr6kć!K8QEQSCZ 44kd^J매.$\Wtt2+.1ƺZz}o쥠 Z`׮rbInDɓk!2vt BExt*^qz̙ C^y# pX{54* asFz6U>>ۉ@,@u%_8063"‚5ʍҡFr3H,?#܊1jTO#bk2uV5 ]BI"La_ak^hnj1V[[Ie!X(1FhpFqN{B !8c 0G^>L1HWی kQCHbeDN9% #C ijwWM[xoUQȊ?2>'67vIN>}uW>fm Jxꫯcb^>ay9<;vl(sˬa^-19U_,!! ]`zz2=>"m rG&;U Z0>uS&FPMOJiAJzV hDasUTHz(<kQV^dwV6 )x<ɾ{'gh 2rq5 |>z><+Y̐zUd(BJ+:Iq#EF ,B(ܜBn"Askס?9}N]I=eTxɏH')S %nL6:h&ܡiG.L}.uA+2,;A 'ɐ'M#J"593uC88#=uzK443Ge@H@V%RUU+++a9wP3)7|Þ((7FUTG4:W00 ̴Ғ 2ubm\ZubFK7mĉEuDa ;p /݆e@ K4f} y_0`}CB;D̙3}' FgϞ=t2ח‡^!L&A[&>qike `C5bs.FdCEn2F";0 "f}"wq ͸6+fS/&F?3ȾDu!y] KM-" 21>)yz(*"wJ- T /@t1::Fv5Oɶ-[8_|E9}ꔤ$->cҠ^7hNn^K $06v41sE=>+$\ac/Ay(QX^t $(0TU"^E!Dri'ϰ;èkawg̉Do!Q{0 .u0u9ʼ1VaQ|2RQ%#7И DiL"ma4Np: |hwWrPO@80hνp v L,uSd2k'Dգ?sXW`V*HȹW}Lb-/cO*k~>S l.SJJR UK>ʊ_O}SLL]A,T2cEn*)>FcSSxPĉ5NdFe&=HdiE*<.F40 NPP<3,Ex\յfԋ{Vu{qTRn)HHBHHܐBij7[۲^$[]N7߽x%͜9szW{_X@:g$5rYu'xu7)p3NH fL.]J ښ*uHe.K痖UH+Bt(;|Nohҍ7]/UVA3JKvIYU&Yz?덫j}07)'bP 4q VE\z&7u ž"2|X hD51 6/*LnpG DDxvM)'S%bK%mxa1R<F{4ҽ0}T[}bL0YU<`UPoY=&jin3 L`@ Œ a<ƔQA-ySN7a}0hkn7ay0rtBz6mdgݦCG5e.}/79nz]Qyyg˘lI#+&w `~{dȦ3 ?c}^SyON"4w˯*cFڵB&L x®ՅHL84>#FebH.+1X"d|2>??gՋKXY8ؼM28x蘵ΐLdJp@?LlLݱZ[.Z,omʌϑ_u7빾f 0l`9g٦E,s>ml۾ERTo֯5 , (6`RJd \R9pࠌMH:`[`~IR7=|U \PP"*u l?F ,.hв6EABGSzQ73͛6o_FmeoXLo[oʈ:`s*yT> AܩSPd{m=[x-55VHu`Y[^== 7:ŎUe>GkYF^;{a`z821qel8/S-Ԉ/X$4KV@$n-m?`E 7M| ygB6O w`bO=RKKSK[qXpXWlI6K.S: :vxln*߶`I- χjfߑq9#6KaQ1LaɳH IDAT~#G[LoŰIRFiy_S[%V@} ~n?$ Paݱcwŧ?}7*SNV{zGZjC5!8}{( \2dӴ{yW_F}+{NAΘqEc]s9Ő!GWظ#YrI~ װ9?fðơz.sĔ)T-Q0uv߉Q W&|sj:l9Xcԍ50Ǥa0Qcm1X5Z<``?Nyv\=CLƫl2"S j#Y[oQ [z2Fr˥ z[7pB x g#cV:jw}{HNv7lW\Ƴ)^rq}-G]g7Kr ^S^`/DZ- 1 VvT!OȎ[\R@@9MWz#Fndɲ=56),Vmm}V7{,Ar<,פ^F@[|>XÈʁ2Ga4g I6Ygmgc|\К7)du$Oz1D]`+Д]uA]˟l;`hm"䃳tD(zEUdZ AG6= Wŗ`J ˈ(qtzA0[',@6q,&o(dh+Z=#H`EHΒ ՅH^})Sw~@x).OJbiɋm d(6wo>mug>e)YvAtgJJsz2ȓCDR~N|(v2ҙ<]bGU2w<" OS-Gwȣ?!.αs%^dC(T@N hkT– aqm*.Tu١;g! ҃gP;̘Jܟ+gE={E%BE.Ą[< H,56tˆ&9)p<93h=J/ X.T,|.Z5ꔤx9V")*%M(k-ڛoH\ReAO[_Uns]|Jد(ݮnDk k-Z|tϖM*g&Lz Ty W瀬ZNi5@7I0*`;a:$CAt]+Rb*&Ml`'.P4= xU|j KM:t{WZ|O#P^QU8b=O3Qq%FZY4n #!O?5(2qX]/Bǟ|J]B ?wi U{dެ3ie2gLd=? ޳lvۺ3cA%`r/׵]hz_ .sNQVbQ:r aezm_Vt%%5Q2~㼽rC$,Sv +!`X~Lұw|+VX8_̡ $;:M\?JN43,:g\ޣ 8T6fOR@o"ǚwkhSp IE]5!=ve(ڬ-p}kk/^w!CVйWVx&]cDŽ%7LM&R!&!L> QaO"{n\|  &6G1ES7eK=vdEȯx\Ț7KOȌS,+79C]XR~H`[jYT~re穔ǥrw|.iֽ rySu2 u%2K<bW_y] vs΃'?\j>6SrR]Λ%?rdg(RF!j&*d.ihjz'o’B3.='>c6J0>/X֍7h}3?&ab׎6_AtYhok "D# h x܆a:[7o'xJ>Ywp;6>@ I m[=⹲k5ڌ-^eD6zGOe[`mXo㳎&; 9o7O5uFX(ARr FX )5A*J+dȰ4ٻ_z#` p&ḺO.J^c~!<:اaO)8i{tw2ޒɪ(,֗ U ڶ},]vihQGIu턕Uwqzϯ^#n6ӟ7z@bm|c}V #`H/RO֐HCDX Ve|ר vOYc#l }j;R)vʄ ldz:` ^W.=-Ә nƗŒ!y;!fC8lZU z0?`-X{c)jLjE;VHWd䭹E`ygL.}p(ꫭ%7!)9u҇sϙ)טڵ^K}ݚwP^KϟoneCiAeһo/G2ضE݆,5+3fE bntqm9GrBxfp6n|U>8QĚ{ ֟"NFғYsZ㫯n4F0gg?lR2>^U ǣV82g7~W'uR]Q!  6JSuv者Cǜ0f]\?gz v"2& wނy_/9ڴkv(R Ĉ,YX.^ϓԸXb|baS HuJ- į|aaE)#`i 0q}㳰əAMa4̪+@u2mmo[XֿAbn,6~Y:WGi؊DHl w bB⎟K*mG.* 5<Y,3ijIWwVZfRTv ;w.֪=HLiLM ?DqrkmLgBe#dEˤB)uc%&_uՇL:w&Q &bulk4Z%nNX=O[K1e*^ Åkpo?Ce=V. F5MwIhZ\:jFzmY&h0tqV\m۾pGYgcM5={ Dј۹de 7ָC }&L\2y+2w|VӆdC^ӹxκ`"3`ӥR U h@AtC37Zq30[ 9&XY0OY𮟓öXT*zVecbx_S\.6jݺuvln, o E~n^ϖbIRNBΨl)-7EQz](s+uϯngwĐL =R֮{4(EbsT|LQ75R edrFG?>|-طzd-`BgW<#o?.A8ƌk1qLXaeb/mJEH2Gd|}`'0~X:uŵYq0;,zls@+qLKJj5k$k ,Lmt/".Ξ+GjOHמd;= IDATnۗ. ocHS7v8S%+}6bIH"U].vm8_7V@ -vǵ41#mZJ ȨL,V ^TG k`İfzc`P|qO-v~}XȪL <}hYS"}nw]h2S*֑lpŹ.leK,2naU^k\q#3e3C\h@L?Dյ(t]_C\0Wf;SZA%\ #jp>|r;e oH$ˢ,AYJoڨuvn6&`pu]կ%3)ᒒBC{k>&߻v~g7^M{Wl}Ο[Wɶ훌Q]OZoN~֮Y#t}{<.󺘘C|SS:%~vzZҋI{jKtsdZ!åBz-M76KbjwTK[P*#s2ԁ<2 d4gY-{eMM [r89@@.`HVYv(-?fk8uVpɸRuNagt0T J"={U[܉̉Y;I0aYv{NF$1pH|ai8"-r 7Y~gx}ʐ%[B8|HE$ =xlxUikr ؉cnIS!Yfq/sK\"$J7ejI NACVnAcM6݋v57/,'}dt"sK/Bfu..UWV-,GN[k|i>Q-cVzؼ"_9 k=*@,]SȲb6 [ }Ww ǍRno>Yx\}YRT/h+s0Q6ojUSSg1O9_ʲr>ӻTfL" 6e>V+*ϧiY߇@|Qq3[6}^M*e6#CJ/((ֽm,~p2DgfaJ]]@ϵUXF0O?_%rvӥ m^I?˲>s O~E-kIE} !bA,6& ~V> #%={QqrQH- `l׷@L*>ְ'b6%b1`F(* :%ꄁYuJ@͗ExpX . O+V59c?,6 I_Cs+WPȖ~pz*omժMmrsdC~&ҍ]jzܹ~z;۶EgFi*(翐ɓ*<ydoJ,s1RջGm+37qϮ*٫kٳL/=mTȁ{fɂvn.$ L M֮vۘ1cY B <3knB[o^xI B~„RRa 20p7/$q @cр Ls^RsdcǎWU /b~_2וpAzcw H8vڎX'u'Ȩnh-Szyqý[myhI< C۫ӣ[),({:^zWʪ+]sG u@7 D\0<*3m56"LکL:N_?)v0?I1S*/Da[0-+\>X@mJ`w\JbJXcu-|"/Ң|ضe]bBung+Zۤ>_Af<\eKق k`.H!,s+OFIS<%! 1Vu1rgk;@7XVFGE=ULb]X'≨kLe☋/O}Sf)qM%.6`@cLFN1f]rɥVyT_s6طm܉&6c* Yt ԟnj'oe֬ ` Fe:GXuPn_-&ظAm&ek[P%Y5i :D: i&ٛ><]g ޷]ڥZZ1 Ifsbh5CbL L ԥ1'qnSFflW&Ǥan$4xAM嗖 %& u\=P9֣ΆgTYM.5w13@ ꖲɰq|{s䘿 q_9YRbq07֒- Sn8j={R5>e\#fZ<ޏz ?nq2dPCҗ?ݯFuzqm;@[ nqG/󫟷1} ˆcT|MflkOH,Povz (j;kLO5qcciqRWO4qBY7!/^<>[IW)%_ OJn7ׂņXz -1䑱݀G> kaha&+ LxqیoMXJz>J.a V7퐾XOƗ͢VTVX YXżys[ILx`d=2ɩ=dŊFʉu6h!Q?4 d0*BI6p@;./)@n 0 bj1!y6oo2 5vgT755`,>m4?&^I,z&93D c?s 遼uTl͛kh7ޤFjTW.¨zMcLd>mj>Y׺ :h` Sڷ&BJҵF#׵{w5jrW\'Vj`WEKl[ r6~e\ŹwGUA?믽.ӧ&ֿ$O>i uG qBroop| ,`i>V'o}Q ꪵޖ#umklh_ܨ@%^Gk嵍8jLHo%"k.oϊhGŹ``|A6ca}Ũ-\#ЬWAݿ+Jꡃyseַ%gD²tc)9j?S]%'۔gϐf>Ӓ> ywڦx+t#H&R?/q(s]X4NE jLo uR7diQ&%BzskM]{HBm ֳ cjCL*y @YQ;j w KvaK`oSc+wu7օ"o;G ҆Sm7xXkkfn!eN`uS#}zG%Q?#=cֻ#SJ]MJSu&Y}f؟sNzh9)l*ӟdY#,,x 6^'\m `]$(e0Efg1ڳ[z+K(*ma>cmzE-``sk}CQ.^s lOaoH(cc'2w04 v7ݫ2K5&&P~eFPa2.RPT)M zD+svugP&ע QY ?Av(tbk1 qAlK6*wr\'8L¨\L R3nve۸7uƁOHx1D7?~X/~00+R޳_Yi( Ehg#=cVlE-p`;n93oۺ\9?~ 7Us袠wrp.*/2u/?lmA :sFBnɈ`6" 6M9!ۼe(y;W`% `.K*2"$ 9/*sO?bK\֐jأO%AzR& (J@e"'czP[kdІkved&S|6nFuȸQ]&(󥽄)'J2GeQc nii$gOfF5IfyaT˟{V҇[ L%o$3]|\IzT 8{BYMiQe O)SdLLҿBuh@=9ݱG=ntӊU+ #6~Du[ EE@#Q2` $J!+a-]ײ݊qy?M7` lqYTʩ1̜>SEjkk9),'dC[@9s[ȼ"Kvp/T0Xz~הTW::GonRl"rhxi4Ɛi)A]-=Vf9>XQPy=sô(ݺ3KYjP?]heIBt\Ιs<_{(KZyX~w؛~X˜V4d<&3oe WW-2̄IB<PG_LTU'wrR9XdmGJR6]Q.R1 7 ǎUϯ.^&]qk$Aivj D6t-4t 6mHm tܟ FL`{$}{be6qfO>$`J< /` 1֖Fq~uϯ:Y\s;2{LJϰL rq ȔE|`;PɰrPք19a>$璘uSL[8=z.I2dj rձ 6Y[[QUs\XGĘp İdd4#ׯ@2|VmذA.RELK>5}ԓȆw#S4g}>xltk'I :DZ`LfHnJ_yd=t?Gt/ ^bn`i͞=Ÿ]uu3$K|b̽` >*9ћݤ@h1ήl) ?YQopfuR E%{ʋ I~JzPuqaĵr\'A(VDO %!Ů|μnrq+ a)r vd)u a[vŬ`da dQN16\7fs}ęfhxr۹~0"b/65f. i0DG,n IDATWŰwK P}v 1saɉ )i[NZw sOC8|d"}oyf/C86rD_O..n=3} sbXMWX\N-v}}s$L,{T 8ѷ7-RbORr\λgX:s9O7kLaF/XjȪAYXU>@,zXg͜iW#c8Y<ӾB^_/n#w d(8ä00D!+ &&ʓO9izi_PYLaL $!1nsXZCacT08&,?|{O5#-^b~I;:A+WYsfϷ/ Jv{"izQ߆[ Yg0hEcLEH ?„|M/]LLb Kk~6rv^'|Og%Ev+̡%%(!o[C(ڨsل9aAdPȸ_O&pi\<-mPWQͦ"Ħc@q 01{"eZ͈&>Q:|HdZMlxABRw츝kfE޳ϙ7O+l]eAC\ cdb\S& [Y^&K/^jAbc I1e6pǜ/2q|Gk],NAϓN*u>{||Xd}Ju7? Lo =h6 #PvHzύpE:? fH]o e2 ?RWFYVSg?/߸&6M#n,u-;{-6KQQ1Wcť|Jy:UM@c2!8JAG!WY&'NH#mQ/{nʴP1b%&oʧ08;e;w*ʴ ~%K,rM 1$d3\YRtS͐{ߵ]Hn7v qW[04fu P NE"1Ud(=`ʚvcrɂ g!Ro)r幕sDƎNt*_K'2-٨d ;Xayu%} GbK~M<;F A93=#2l/0XoS܁X}Q\X&N*g;%.)(%6fH꒒*MJ7Mٙ_`1+ªۙM`p18uTq v}9~>m6a:\GTt`+1tfP`mwyN4(lB7 kEL1eq+=[2O<礋sL:a{`w dO+̀ MSEgM{$k&+[jҬGJǗ]|$'K$P"{$%-;meY7@y//x/gr(h[d,XH#RWB+;>Z[ [9% M>!9V]\M K*czlʫdARH#^=T)&O"7u5*.6^OOJN 6>. ?l֡gNQ\/jݝ툍_-[ߊRdP%VŸ!Pl@&}MokJ#dr߲r1Ɠ}ƛ,4vX[m3OVvgF [w:b"׮b %{zW|eÂF}`q@an2cqdU.%nڴ+@@RYde4Ƙ1Bv淶{Zi}$&ע$}+YYiD Rh~GVKͶ-[nM߸q[Fل#lm+p 6K9,w^0qJBSau;gin ;yIYngۯ${fD- 1/ ;ך>T(hA8'A|X KȐ]ȱcRUUmn?6> ?~%;vxӎjXd)'ɀd^PbBBw\ '߭KwY&gԷ}b٩)LN<67l PD>1'*׺'X"Rs츬|~M>UTeA4F5)Ks-}A~^v1i|D~f0L+֓T`Jξx6ޔ8|ޟsN&%; صhllBJvD]b|%#,6gڬpqCmnns:}wYXv6?ӞBm c3 ` /.-eig rŲ,T65Z`9(q185_ή`ȜP̌d1xxzU[ ߈a!}lsĕ`DtI-H\Qk~*-uO0*GdKŮҳw(cQ#x޺&c !7(.(D'`d"uοvcQXbZ~3hHKdn u=v+x w:_<64K\K֏0L{:ia&0\"D4:vg`?JAkGIgn1 d|*/.OvnnCatQYz71s9G];EH44IJrWiow˔Ie]zO `&9yL~[x2BG޹l7N%98v<:W3nW^-Yz6 )s#/6Ϯ:&G$(p)cl*j9V.+5V2Jܹ~I]Bz䡤 3E:$q0ֵf{=熦ٳwOTTT;1ltcm 60eLAvx,_FJJM_~ q%Evo)B{'&X!WOIFHBX>YDe x2`§;q~ԚqI3?lbM-36EXo ?z_?~m&;#`26JU & XGCrxWE-^]’6TJR|:p@x}m#sd m$VT]B Ї%Fb#l 5 :HvKLRX/hFg*Wwgҵ[7.Ÿ#GKu>oH//)=e 쳦%.؄ĞLԜyGtYlWGWI_çq?Nw[:o4{QU?Y/;2S/&QjLrI,ϝ,HlEڛZd U. &IEYųEɩIUls{l^3 cb4yz^>TRY\*C}`{Unl)&!QB8X'] u?ل&Ȉ,wI>V'kA9Hg} /;Ӽ vct$}S:;/kKLŊ`_6W5q57H,cۃHYĠ~rIRdu,-oDБQd@^8bT0ʈQٲ0Wz"uIzLRZe2=9Y0)U)#}G' K%3;S^ݸUeU.mQA :H@=5hs `=N՝Ǭ`Y6Ѹk |;*Tt yup Di\=vjm[iʲ- "HfG~_¥ˤkjLɖ$VCB3F2(phSic$&Xʅ\̭EwyY44 f:nbB$Z%`Lȱ@VF)bdQh I*JAi,_=<-#'9~N.DMKqitv! `ף32$N: TRǜ+wĺS8UI` ~j LKVX)~{s1%2lLTI{j)Xο`ƅeTVg$I׮q `ղc64iM#&X5Wzis^dim pqi~64՚n^eFAuodYRĆVU풁+{'óeӖ<%W{Le ]iSC]:jĩ ̲zB"g S y%/! *qn:azsVjfuݶl٤@ʫ{7HҳOoIrqrӫ[_Q2wf4/6lA%%E`\G,j@?ϓ&ٻ_Ww2+k(O JyI)CJlR(hGUIyQ .6o*w䈜w|9f}~Xpt@'Pg7?0R󐫛:e8VyS =Mk X#{Mdo!tS wMO0>&W(: ՞YE^һ__v޹" qե; '^A\zJEa1]rg$m* 0yԝ8jAm[ $;3GV3`pʔRQZczQŅB)`Y]# qcsdOe1)Sp$%%rtyk ѣ .`\6ó>s4<Jg[w#3^7,1"⇯17$hV.&:wV45J2LŠ͍mUV+sثi;a_ Z^M[Ϩ56IfƎɊǟ׌#Jk~^.dԷ,`n}^rFII""ƎzL@4HSst]v.K.v~) Eձcʪ3H%(kV eW# /X_yq4}LXŜ<3|>k;ԟ ]TyGхPDA@9;b~%hjm.kR+ϗ[UmLzK1lcOȢ/sHV9ĭNDָQjrd2ds/f˺u/Z&m:8iim{(1,ٙhnɞ]e`UKo 6ի {BF̐GG(+Sƴ3-EiΈca_D/ۣj;|?X=EA-?2TA){e BUq->(F5uK\Ƅyk7fs-- >xx8P llg~JfL"}22mÏ=&W̠W HeJU-3ҳnٷ < CghF[1a*Je¸qbMʵe_AYfbdIW %;d¹ aik2VxB}yYG%igZjJDAjdkkE*I3u˃O~%uOӁ?(Ptg(/u˟E U.*eOC7~ы/~eMC ~NϭyJ XWũudzx$-.t=+]1n˗GX-]&^bcPozSh(&$mP S^Z22W>@yuz)ϳ*FHFVdgJÇ_/Lٓr-|>Oqa=|\HjZŶ釜}gժw6 `Mh&GnZg!b:g} 4yGe%8!+~B_!Dj޻W6o|Eoe2dp%g-2Rݫֺc*J16NFN, !,ڴEWny#r΅ Dr¡xYew蘌7IyJVG,;o4=Cou&qZ;})/˯jB؟߳,hsaKo7ߐUL*6QW_pP{nU`h@4&&S|?8X o!34Y:PZ, BG2D>c,@7,v]nOdigiؾunsK2fʓ.RƸkLpVOm4`m5hnnDm] (KΟq r-))c9c狑ZQ%փp <ːDݩ) cvS}u*))/O_yIwf}rY=NO-0-|xcjhO%Ӷ>0fg 'gǰR/mrXqIɛ ZOvԈIssf85FJ}<_—ul k,u)]`g-wwz!MWLPƒr y3u3F9wv܁ ttwhF7eO^6(|Dz'ʃZ^GzĻo#ruMkS앫LO){xch 8dgcx΅0{YFO9lw|0poIf\MNm'f]47sW'ǡU+P]Yp.*v 7@eHg?o?Ez!r6;{gu\4v5 H?|mK]=҄ o*&n߱WOEdL"c㐝jWӒ:7 83YJ@ZXv4Xj bb {h1gnçӅݬ)Y7. !lVYˣ.\-)hI}`i@Z0Er}b~vC4}/ofX!gyX2=9wH}:|M|`HVOu% KݢQٖ$wZpqMzyPdd%嫨} =z~͛7UhChL #!xA#g~p%S6~)PxoRsWQy{M{Pw Aȗ/? VbfN@Td,`Kn_&QMMqj ?͙l 69IILGja>Rs24 $j%^.vI)Ҹ둗ԛ2Cd aGC2ށdd_`l l܄TUƺ5GB^> 8$ S&J\Z\v$*<`c/(ڪ*`&K-hyDX >sIimX&&&@SD+HC=.1?<,)6׹$A_cdg!p.q@l2;@Ĉ0սHm4 Nj@{xFBƦ4R#A22Md.,P@nQT_V^l/Z([_~KZ^?RG育Qx_p_eZNvX{{6 &:^hd ke1ѩ#IBݶNՑ`KTg(q;v }hnj@Js 4Lč>L8=y®3e|%%Fh t%PǣS֊7' C KVdƶ]; 9[h׆^,f%͟Rc۱a3=޼Q _zU=wmhZ!}\mq= Yg%fny}4XRG`|Eɟ,SSx՟*淾|-eH)7}aZ,2T,@2%wtѯv.27i6yZzq鵷S׈O< Ą tMz1+Yl߸vYjfb9j ^(mtrM:I/B L=C{d|49KҖS|<-hÅ2d!iBi"ffuTa#pAˀD2Pi"8S\/}H@PЊIcMS=yAdHs r"Pi3*Ti2"p̑5WR-;p)l.FК։~RMu7![d[o6kqan]:|ܙ3/X6t6 ;o74Dz c"+Rf"Ğjpŵ=ǧjs֚Yu^0H+)kemv}=jaq糫o <>+/+G@y&FEEN_|(_2N(4}oq'vscX[#2Ǧ#|zڊpM#wե7pć)sUF~4|ԬEI8P RIk'w*?p+~GIs7YcoA-:2.9.V6L<@ TK|~ͭ.)7@.e!7AVv.T y}h"<)t.w4Oz-ݳ ҭmFht 'K.uoЄp-'!ҮI=}!,Brꑵ#X5ϭғF@ɢbh} _GG?Dm-#3z" ٤2.zYr ;ofF8Oɞdrl>*`tLim'IЯUi"dKpMc㖵xG;0?6aYS|+'&){-ޚWk GY/=Gb: ^{d6܂.Ǐa#cY1{PӦEnU˔:g#(xx0p pOxҀr 06!.+eQxX XK8E&) X CJӰOKA{vŋU@$oKLR"<2o9In߽.2]vt cj1:p͟F.N$!; +F}W;7Ŝ IE܈dNrG{/@Ocd%K@)4À(xdzXaWA na9IT%Rnx=K.\'][ \ݝH_M 2DŽ]Z,I. 5,Ǟ@TDy1Ձd= h:NKz^yQygWA]>/*.y|6)=)Xiv>4޹k._J10<@@\>uڰ3[k/==ÜY/-72j;8r#XkerZ{Qc k""/{Ÿ<櫼󠌷t7nbM|7?wK2GQ{ đP&l]j&,CJ಻m ~ݏ|l}ג/4j)Kd lȑ#oprs676I%wge$'jҨ8.eJɯy)v.2DItOS oCPHv NOAD6*5C3v&O7gBjzz 3q;4K+2S+ w@۫t"i;+Y>SF8?wbLefX( Dvy%% F_ [-.)Tp!TY6S%9DU6]>s ֭6yӄjx_ƒa0MeX)JiBC&xM4t݆I̬\LA9|MS罏NFͫǦA" pa޺l\aG$ WJQ, ϓL`\osycKKTƻ̘|]5kFPY_}/'F2]ՈF渺&{Ssj'ňOC<9yH wU0\7l|nrJՂIR`y- Kh5c]&)B>E~$OkG?dbJƗejm`i~>I/p 7ėLs͸zuF7_Th11&]Sd!6>oӎhhidXCBheQT\E+qjfj[8*|Hc &,FzA,}D Հ-d%q G@ts3E}M`V߇CY-7׋paK}5Ҧ3PV#lN݈uqh1HsAlĺkQy P dw%~CTy,lި=8}4 R7 /aux9n+MYWCUvI3GO;IҦNpFjPw'F-sWD$q1\MNvZF=x/}, "|P78exOK2SKGuu|--PQ`<;84N)Ca ɩ ^HJM݊rÚ0dnZk׌cPC- _2t~!?_cU ]+ Ѝ`&@|JsY{8[ 7Mb1Mm|N+[&HӁאTߺL=..Ovj;xpZKPjmL+CMq5,5ɈLI@1cݨQRz*;nkGG]-R$ǛrbHT!A]::]Q,x7n 'G;sG# UU(%GÇTz,ɨIP9 BkƧMj(h%gXR?|{qZ16oݤ[8{r,)/~f԰tyل9fMalE_8*2'iGE"H_SpL...\.8f(gQt|M/=\>v.͘4^cl"X%`Vڅ!Ѭr6nnimiʘɮL!LZLGڮ3=ܻ{DMً8믝;k)a1HRwo+CLLJA`H)/{}p*‰ҳ,L2JԴ:" +~2' @.R?kf6䜹\^&WD##by8pj+(s" pgx\5Oףqu%&LRVY5ҀPxk0Y(xHBc׼5ۑ? 6~O<%iM䕀 3w~?fY:6^Y&BHk )2I̜cHJ0 u#KgJoەD"b|J"|1\*>Gv(hܳnw/,`ydXwyG57JPC֐VʜIZ-[# My{no}}pKQ/%}W=J^2l:r Xƻ.?d:JLkufjܺS0tU~\ rGqZ b RmF;HiOc2A~8|DS! eQ"64 ʰ #CF! KOszУx#s>~HJGKn=Gc7b"׵{ͽyKL>٭Â<# LJrL-C$/案}ʕ\W~!I21֒odrVԂnf>nSٟn_Ԃ6~Ւi5㢞D%+/{v"xY m\թܔ4vtkRaRZj坴4 N|"IՐ =ma IRgO{!Jl;0hl:HǔVefg.I34N5)L/P"|u-| o(AK(Qn-6o݂a<&aNI5;?3 ʭ0~ϱhbtC,χ]>_إDޙi&N9OYJ9ԕE2^~=r[\1f3Oc`birif^kWQ|v=OKf*w1v GpR{ׯ۲ Aٰ^mnvm۪l`ҵM!8ӟhKWzE!yOo\MLG\)SՎ~wP%Gn!M:oi.fRP:ߒ,Ew]YXl۶ sj4"U(#+ZTlY69% IrVՂ a{mxk8z—&ij%Df` QXYjl7 %aVl*5+ حr+֮EŵRBE6Uܭ/DI+H.]$Md-,@M[+|#CDUuH@.f^2^2]9$Qx2ė#cZ, D9?)Z{Hλ LzB]1qDޝJ%X'0Hlu`*Ptt0''RbGv2Ԃ}׏;5neG$߄{p@sTxS;ԟ5؉Ss55ڻWY -i]7Xvr-8ů#h}%})q9(ĉ$Raagٚlj:u4 Ndbi""ז36^{P;'8-*hmL]_ tu'e_ǔ,X9Y,CG]568CVen7҅ہu֢W&Lс~uJ_zZ$Qdy aC1_o-MԬ%[QY¹f6}8&,My3+|tAس0&iҁe7\|}KM=zjbU ^i@B4.+8p`dNރ!<1IF7 $pbb^Ő$[!{diz%G_7%Isŕ+Xe# ׭Aue&-e)lJ) {}YUb,O#ocZh#p"|Cz%)d}gn(?Li#)'OY dHmwq\׬_k:A#-%[vBrZ*ZZa`hĹsWq. *Ug(`']Ӓ_8ॾpM~kׯAmu`,J"Swk$L[|] RuׁsI b͢ܭ&n^[Kp̽F ]Uރ7E' twQ \;IHd7ԢQsGWk=tA}4!;$ kl#yvE&sy9\SxiB.]j~!\ݔ5Ns KΩY+WApŘJS2^-Žq֠2h!VY$injL| -14ܼdF9GAYs_&EUܼy3>z 4ahh\L()۸};{-D!qҟ;l t%S|.On7=,Ba",_nZ( ZulaX#VF$,Ju>YQ*&]b uBvrtpW+/m7^idd)x+J._A U47R `% @Lki>x62HO[[/ig. zc|L3%^)p , $Hpݺu s>|Xc 03ac7I`ʘYn8q{I,75$d.=UbHaBĤov |MLE+Єw#26w?p@ujZ_~ Xn*V6JڛL.Iq: "=q65w+136BHD7oQ۩c,00%.>]ذ{hdFvdYLFs0\/"gΞGph$ $Mo68:A ώqc|m/$^JY"[<E' Jkj-Ǻ=?3V^~Y#хc%{{bz.u&]|6+QÒc7`Z8:>c-vq;q4rVG'#8)Kaxrя! }$'6zo7ȂL!^ @Jb:Zj `-lвVT݅#6 <.V]F˥}0/]?klt3>'iml$ê &J)M'?;d @!e*%yuNIؾc'N=] L A_H],:d5Y@|Kbѧpڳ0.%ROJ^ԏɴdYmf[DhgLDD]N$-6% 6lKxv0:2 <>YRظNQP.XIkc3i+'j?[>Y{e]>snP;q5u zYܤVǂpwk>XV8*c,xq3YTSJ*n!qE>co]u]}~.\ DS +ɲCh~癊Zy Bގ @dZ,Ft4 {`uAl! -PӀ+ $\3غa.:G[-4.O dEZI?ğ]tϞdPXB-"/7_{͛&;iY8T`'ѱ.>ͅ"#JODKU% uPA0;"^r#aWd_OP}> = X]?.2( 1scT^GU& M׾a\^'!h<|It9dQ`llqRspd'](spH0xiՋmJ @>oߪ%@t4T"#fi)'$ 3*2MnO⵾Ny+cY!sFh|/0(aCwrV+F eZI2%HIjsS 1>kbTLP{9yze4X|dv^K BS=%a2uPr h1L`}q$;N~ODF8mwqz ֛P[!yS>ONy5kjV =$eۜuc=*1wjqql!q!߽f¥iR#f1Ɂsugl®xd) 7٦B{] x}\|Y0Rs?qpÓ8; ByUbV!`fmDu2(#t+uVzX2\WW)T%IwmkG (h ,v3C0anHS.ND zkwd@V%Lمh6C"霸< ޅQ$H Y1[L;h圵<"{ wQX4fE_Nb w5{+/Ñ /2ZvF:;iV`|4׭/nʔSWL2a\2vdw%'kx.2յppmo-" ~b- +qGHDg}|ylZ5 TgE%U9`ICllfK?w|A I+k֬Iii;H-t*.biiCLt-%%=e[TBҢ7n^VG -F`s׮%;i(ZC2YyuPhK9sX!D}R! "W~YK0|[z}k"s ܬ=Zw0]~#N}U~%~t-Q*J)L&HrnHd_eMv#cYi% K6b!"kXiS%nҌunIo>olǗ{MZ7ga 2$Rfe`z΍[Wd2W"(&7~ +4i8.IGR2\Qqd85H_%H 橺rY') X, R`6ɫ7NBϵ#ɏII"wgpOh3T\+vn,ۇDǿ[by9)mR_qhP,!B;I૙KиhZIhX._-qV[ -wY Z@wkaBڦ wT'(*Gg4GshH[d= s M(BO?Oq_ o1Fw Z)'(f=uJtAtadqEE`;И h=KٷW[FZᄃk5lI4.\A+ p5Ӕ[~vJ#M۽i(6 ٵ 4yO(Z.LK:3OѼ֗5]zKWg~<8\BTuu \j79A*%gt/ [  7o^iE96ܩű+WF:_nڀ+ -2v]R 3'Oaw)$.0z!Ɉ+r /-$$)if܌ CtLRsL)a4S;M ]B&]% oP?2 qa}1)܉ʰnHG'D wv#->^[H, k?%5 .fd.~ۥ@&p mDBM= IN5V-e뒘^T2d9Gv$9җ^ ˊh&N*C;0:4q\|ӿ`ev&x>}-/XM4o@˸C`$_NRVmބ+dcncDe:ΝM&]!l^Z< O>7_}ʡk?0Ї[8<.p{<Ve~4N#r0{v?|FMf6|rOݴ!y-IuYl.XzMy(Ug}^힯dT$O,aFw tDQ间k.-陝Lz|Q<3y2(PbW߸ Odm(" 7%OPh8/;z&ݮƺ)66>}q Xl]+]*bw9 {s\x?8iSHѵeFHZuK_EՉa9~Ru}>NuDJ}l&[[L03yԈHLr3(INԡ|^3$htrc`E3EH&OC7N+=#.ǵ#dGJ?Mx/lJ꘶-mXiqI(isXW3(~b@L&,-z!CzK伹~!Ѹ{A/|DӦqIu ߋλw1I庑i'=IkǽK| |)7O}>2RUy2KAmlÅo#јeEFSo'2 kvmۂIaǞZf#qaڒz ׮!Uvoks-M>HDy})8HPՈ}1Ñ q(3hOR+hy}2XO5I⨌dO~yUrsX wmlݼ_yekڲ 55!'\ bӒjv05?M뱚 :tގ` |k_?ph^Mrғ=)]3dprӯS0)|kivj||ޏ_Mϙ^NӰP$3:|n5<0nҢzaT_5/;>sdi(^:[*GǎSOb$X|j`W6y_l5rZ[tܹS/FЄD:Qaꇚv$~"ad6R}P/ӂxBշ+E9s#Xs;J]EXt ‚'Z*))TSfÝrekW]^ٻ) :)oYV 57=E m)v$jZ+ Lbv#YD֮Ȟ׮߈^<٪wpbRl4i^ *}~9aف8*enѷbO[lFS} 2֬F %iOk ▧fz$%7ft;%ţ%N}7Ly }}fư< ׯRI_Ii8)EENsHkw~GotP`u4ӢV7Ԣgk֮UaF{PS| PvbxQ-=ivPvuw"y:yU?}b 5A6YUPzV&tv ]DoxR5ۯHVinI!o)i_ZNVu,6#%:'g47ġ}E}bVq kvr:!?= 4ӭޛz}"?|ATSR>![QMkNb2Ҥb ?<*nW`ӎH-\L~v6Vz5jo%XUI\O Ȏc"(0nU# ABx^ RR)|L/\;{)O#(~ʠP>KD=YeBCblzܻYtI}6;gHXv9˳tv5w:m"9WE|Jr7o0s{G&X(VjIFRf:bRq{]^$QSp@aUeFi^W^Ƌy9U ޘgXD,+.s-[u %>8q--56PoxP ie2RSE&tj1ܧAuz`'.ywT"䩏2b3sc2ZQʙpLNs+ivj@ΝE$PRf&c1@:h.4_2C8vmleZS/WB֊ VZRnb?ޫ~l޾\9 Mi,/ `Dd ҂ADI'Mo @ o'^i=Vl܈^E+^HNOGym4֣r"U;78D2r&"%T^"k '9-,L<gi'ұZCI_hxwq]׵ME`vR(jb5-˱;8߱8$_VMvXVfɢDQM{'@`I$:f};'H%R|W ̼y}Og:NBnMٖMhڤqt+Q:KcTXMk֭4ڴqv5+ d-s giTMg>^Rg!*)PZA$Ol+P/H(8=~HݷWyVR‘Y2?~u(X mg%5;r@90#'j9RK@u q. oWXh x 09T*RBUMn~#~Vk "#]狱"[Rox!.XPmm朞A#ygF5aC]BSrv(Y @ںzZ.SNn<6!S*(.:~ Y M-uWܟTn UVP4g[IKr->sJ2/? :O셧}d(QB]' MtwL2T}0.mEըIPɯ;w7IcΊ C-M} 3x$y FƋܮm j4t~Ԝ3p&@ ;RBsqA[Mn3 ͣ͠A)}!wq ՜X}3-[6M uGtqxd+1S- Jt C dg(# ni~4h`/?b7q+5||}qpNARoJI>taCء)B|?#Rt + '_M3 &_H +h7t7q@࢝d!|4 %`]_,71mZƦV[{t=)'Rr]Z~giߞ}X:O^Aݜ(JN,Cݻ7;rVlZE͡KKfϤW׬;|C۷ѳ{|C9_^lU(v_1:XZMuddVlj(@6QCf0"χݳN*M\KHٓa4]'i%]P\/.x?WisG`n4x"&VtCgՓ$ z%*kMk%I-P6@aޥn0q"͘6}Q9,߹*)#ܻVع C>G=!4!*&> эnȖTu مIxtd=AΑFXxbsv:GE\M _uXȑPR4' ; w Xp5RO- qЯoѴTƮK*ZB4_ Fv .bh\A9h +1'H{lb,B"QtݦFZh4IDLmM" IDAT+Ƶũd YT;h mXμA.6qT)5Ly=iEӵ\*&h,ru+ 󻒁xTLWаAмV 6@C|'+h,h$Q̮o6GK#'x;%AT `)X)p;@ ` "솿g?KZPe DF,wR]Sd$_z_Ġh'ܟ?j ě)Ql5(:@"S$(\D6,Wf0fANEkK(0vJUɥTao))t~ɮPA A_ޙvI;exFE=䦜c7s{vpi9S#%o.ݺRzQo8[M ݻӠQ#pƳ[(~|>rŚi~T =4eԽwiDDrmiܛඕ-:Ɗky8XlFqY7ƸvȰzË/=-t"FZGȘ0p!_GGW_#O)EXSAI08BeЃz^cmdm2ys@Q0o#ƌ^xbNRp$x Enc6=/&4}:_ߋt["lq>X5晞C u4 K5$,^N|tsaƝLR)q@֤nVyXBEP=--- H0E,rJҗ$EwpE//|+J_}r2^iRϷpZwE,,:6%} Ki\ǵ&"Kcʤ,ۗrR)5,ֲ4jPT4j-|5ڂLJ[)4ؚkkz%Y*-T2BFl|6lkӡG>){LvoJۋVE&qr3&&Ăx`kJ%;KWӮۨkBw :bjzHE->SzSUY.Z@'*NBӞ=.A{&KMwϣg=pRRS}_LI!%,s-|_*y@,崹hٲ7hƜٮ(%Z|4>>&gNz_@E&mٲMJQB|裸mJ#[Qt-YP 3ْ]([6~Ϯ9͗ - xZfTU\}w1pƌ?>k:h( lBЕ `@1뚙Lz0ad.lq;م\Sz7&1Ew V0$n <(KX.X R=+@ BtHByt…Ib|~~>d(F -{Scse 8Asdl8H&K3DosoLa7@0MiP 2?:^+47xV]̢?Stǜ$v]w`(bU]8?(@+wt# iHvAAϼP"աywC-).#} M9@K6[S5M|4d05|8L%F;ػ^{Tݻ[BB+(-r/>'F6m'Ɵ?i9 ?o^4tx;u:H眨h9-%Kє铩%5A{w=>k?2%) 核  V~fuEٝ=S/#u2C[W- ۫ĝDk|k!"YC-w+/ƒkakDn^w%#8 tW!SȮϞVMMk3~A# -`c, ]0Kmhι1{ѓxO5,>Qnh3ǩr r)Jl}EYuK#o=f@>YW9-CGDǏU,%a}sQuβŘ0bavYi?BOnA/@ fShC| Kd 0sytw8CJ2ĆfqV6AV2p>cmUFE7HA4˫Y=Rz R)L:fhŪuthyI4k&=³uf xB IM7Fj}Qoz*߹^{%W CA腋_D9;fҡ#쒤ASNV fЈ h^,R2nq䖏$BUnFeǝZ#y ƪinuS\1ҡiDx M:\JI-`"r2Q^Tq4=E4AȠX3h( 2G*\IC*s\=0Ȝ:ENj]ԭ;esięl5~,mXN@"Ʈav '%.YK]ĄLcTU]sBh$L1sR@&kPI*&&4NnmlTxb3a "tnnn&ptBwudaq!wӻ+h2g_<\.׾5z9N4a'{[ݮ,P LV3eAi eedT!@* H9ƓI=ĩG΃A}ibx *&s Aϣ_F1]㎙#>ÝvP _ iq)B,B_gNӃ,i"|p{"oLidB)z"ưPm %Uz}{"|VڡДI6M6OHCnjdG4AyU27&ʈf cAtAnE@c *`y괨tu O|RN-$b6F;C4SKsL?AsoZ\Gjx yϼ7-/_Ri 3% sue&CL@UR7b ҐmD$H*@D]}P8~Tzq+[g>M}~`pt z-Z] ~STKA*'?NEKU$IS"x? $}zgr͊һ[WS-Zu J̱Ԉ~{",K#ʨ\ e!>4 tw-q{b @R&6CC}!Nbl5h͖u4idIG`3Pj PWد:XCR!Mzz{eQ^T~\5E#\+AHy5ɡdFB|oS2Ө>Ja9uڭ/6ti~ U_K/< M_`)O*`/%( 6Ḫ)-殄H+~NH-[Lru4tش,abZ*S\Bh`7 e?7A":-ۊs4Kgz@bem˾ fʨdpPJDdBKIe^)F\j͢Q/O*[ ~O#Ǐ[E&O2v1zۃF M&H 4|+-zm|wp ¥+Z{&2h([J7L& h5T]*NW ̼j_ ֮!ip&e<da`ͣ.] Bɺ˓c7ҽxd~~ZL6N5DٙٔIb+IJ֑p?35yN8V\VSp:Ѯۥ=0f+i¤R~dl@N:Af [jR {P=͚s'NJioCG G*hutuf44aG=?)@cv+R&°UV!U)' ?:!+i6jA[Z|%8*aTv00s zwfkߤ+jGOkڴs;m߿Fٽz#hЖ#>e9 &vPhtQ0rN`͝:rJl4h+WP ̭ mFa yYEMh40L#%+ʫ:LW!\8Liړ6K>vK.1\v-hz*6O7)3[kҤYS5 ' {Xv=tiʂK*[Jm?SZX,*WAx]LQ%`kA 3@OSKv 4w4kVGVnlKL6 ]JKKE`~7~"iHj:p' 0/L"oj4Zzho޺ETqFV5ջN?-TRR^RE>Wp/>w)0i}t&3^&N &~AID\)X w4h{”P8(iBb̤  vmT*""Ǯ4ѱYfVdT|y3h o`=h4eZ⭭&Rt41D⡃heh@juZ{bH q(S)GYFI)-+J7<2W7m%&Al[*ﵲڵ5\ lz_=0W0`(a¢4{XP?O*@NR8 `Q/;8G"qЊw`t#'P/qX )_k@X[1&LYj-UWW3'lYj5C譥%$Y,4-eWN,th<]9tlEH5MB^L5k vN#P %3BYN0DK_C}7rfګȋ>ÇVeԫD9י΢ړggלhGtqj~km >Hnaq-=aFA`PIPWujSM^SSDcRK@&8QE짓5T3÷qk뛩`SP(rwq4<?LK,|+t} fΜ)*3dJ'+0BW /\dr$(41*(xJpó1%#FE N +HA KS^4rh*/?B%Md[OH G*>Iv쥛f΢wVql%|]ٝLc'R=DL!n3[vȒ͸ihEoӾ[iȐ"i-Irmq!,)߷Fb4ydJ)5 (hPQv Z0k4v:??I>ıB9FؒKGDwgI2 W}thgO|{)0>@CQ{)H6vo@KWrnھw7 =n^×(:d646"*DhsyUW01džuJLVgĮzo }sE =~6As f0 IPw ׶sAR635E+ qëY(0F7ҙpLǡ28F?}̈ݖnJy]:x+Y+xCPA0/UTQUN{5'#|>N/̗g+CMmٶF@kIrhԳO/JM뉆&r>Dgӟ9`K4 kdDBYZAMKȧ#sb A # &l DVbB,kG[zt͖n9߰YHEKJѬ(5hȨe=wMa6&5/tv*i)CqfgZrGID F]N}t۬)/0v#tap`ȕZ;ʶltTnCtrB{ (ѡ3[mȀu5ՔV˖ӧ>yv3 (Ůfص a!y;")XmC7˗ӏ~# Ҁê;ځ͛7Ozjw_7yOswV2.wZ IDAT1D\Lc]:ݦHoDR*,흣7xCJꛨdh1c]JaWb|!SXZ$3 .:;;_2aܾV#D'R^N-\͹]UвeKh 0x\ʃ6`Yu0fRT4yck4jڹk HGURReSq gI̍*\<~t}i4aTbRܡžkM ,vtE TP,=lZe% ]L'y4Qˎ8M72Ӳb_^fFwƺ: ɥ nx+l%ҚLɹ4`EFu>Y">X +Ԏdz-BPl7쌌,,kzd Xnݺ%E2C_.#K;ak(?r.;$3KtpLp"PD#P@V(h7X/\M7΢GL!:xr`>DE,S/CzZk S {|!ڷ7mHa"3=OSΦ \VicP/jhуuvcVR;J:y$XDJSpIٲWܛTQK p+E"-Σ~of4_u 2R9S+ߢq3ȦS^j(H:C~ xS{B:La%R ݍQ:cdyD%M̝bMZ.lyw^zXʙ҇EΠ+FA`jfȴooooC]m˪@+\ܾ{%iR> #SS*;~9Ct׾,<(W@ `sCdd>%)NRo .7J ,*E\ 4N|2'Q/oЌ(#/n[OӆXcϥKV1t͞5ZZȡRsܾs2\ҧsz*1==vm⾃靍[i0/Ṿ%@&.(t͖:rVL):Lz&9؅|(&SŤMu+|$dS{4pɘxK\Z[.<}]3ygitX.//O&!YpZ`;NlWg.8am,@J3{m1E۞]C]:tŲ{ޠ%LLQDfŤL#`J[VW=vuipV6:‹ 4 mɳo-VEۨǀnqvГZ|KG HrFdS*_~|Fz4$zP aKd(]<|059TtSGNPm9J eЪ˩ ֭G zdvl"v)W^z c |~ {9*. 7U Es`.֒pĜO^F3stu<]nZzehGS=ZFr{`5T1[KFWk%ȃ2q͹rK'P3ҸVx2L2z`t}¼ijƦ9gׯAPX׀jJúHp0=e`~: {A]Y~h: nvCN8 n ,'%VD<1yf ϿGT(Iwm@b!8ܳ@;r!-hy1&/Rѭ2ux єs4Ϭ}0CG~F}yK278\NP4Badwjs!Al x!/j^n35jaڋ ]GLQ/!v ÜbS*p,-io糂lڏ0:p[s9hiQ},-+=\ؖξ# poRi[pU555@&Y"NZzl=NgMtPHrvh?aYn˴\ʵ.~ Hc w ArЪKͮ8sI^V&@ 4/3"wpFuJj:"bf3-Wo|M]\QXs5ÎdΟ??IѰ+=??zClKgЎ϶ս[ 0o6if4loE^.93p\6 he,Ɔja!慯q%AA\9pȾȢG 8=5t6^8b30Lbm>`] FlX48i[@ :ђv}GLDd<(>|s=/{U@cfԊZ7Z ,3LHD3@ր>4> m:L~ߖ18$A*Lm`ٖ{\D6Fzj;)h^3ڛ'=qyCKf%Kg&e.67mƁ:RuT}vKl1B 0\gS7s='sҥK|ZZ6`?toRA2HjVEwK{.],,JH);?Xuy];G٠kUk[nECx/+}y+tڵםԑ:4Q@z(OEw.a+ ?$7`&c1:U:kes6U6Z0C2e1 *14{\Bl E|iņX Fq!(Uu]DK a5U zOIzMD9ǟn48}-= 7֚q.AyEsyҤIBqPQO+{s1T׮]Ej>xXv@d_Ȯz!{{#W^ z;jà xTIpEѝfk?q>ֵ_c_B) H3N:%ZuDtc aEP>z^aUm6!@YOifP~|к_6% B90('?i$],9`)A=1ZOi8UO1\įT00.\%`I|l_dތڻ[XXXp$*Ȍ (!BPngg:i+2# gmץK.cX^ŦWHz뭔׮\Kиަ$kP : DV^X رMӌtp]I]>< qlf<`ajZUoFxcx8TW與a9iζF=oWxԩR2]ϵ>ׯ/| Y ~!K oҵBbj- F&GZ:ŋ?y1lRQ'A:G玏e,s{鼵 L&2Ȟ`>cci A<|ĮxG]Ʈ tRټ z utÀx=~53vM^m+Ulq]Kn<lKKA`A.qy-/o[zghԨQ* %]sni:rv~I]Sf2[|Ζ!v5}4IQgޫwcX5˖Ʀ)\5ħ!`_EA0ݖ:FQ7@lٲeb!R$4>I]F w&% UT*&(^O|BTR)ZiC va.]廅yXFh'i&D=ĔǏUV#PގUv=o N } }UcLsۃi{{Wpp@X! ^ J{^fS6ٯ;>jVGO;9n?/%4@&0GȴAbt[J$ZoY HePUG6w0aF`LĤ@'[\C0wZ2F.;&w`umXX5+y1&doTkQa ]s4`e1 ` iv2/tY] .'NHۿM #" E1~F8$ȶFz;1ZW㫾vguǕa]-<,KXKJGgexOOB(*Fd\ l Xr ^ Guk74@qBA[` W~5o@@PMvg!a"Ŧؘmyێ 󊾩(chU'}O{{͵4.u!A5d'c%\œi;ud7XRxdAO/e'\Ԋ>  T>sE`MD3hǦwyY^# ii@ad3sBbĉv d]&L"g_z%1Wn'@K_`QP03 ?L2:QJ#XxV3sӉ ,Wٚn<|%zw]òh쀽]WAn KtfTJCB{GeGKbA*ኡ  2qv/ ֏NP},eC5BNs;v>@0A $kD,'7\]|&k`GȺ|pl^[<L32x$o7l"K*,ua!Uh{c=L5{Mf;}ߗ!~ӟAwLf:,ůT$w#!aqy[>)?_$XN O ,FtXkхqz`E&^|'& Fʸ7ycڪޒ0<(8zK{,eQ1oKp ͛7{y)ѶQ3GeIAU=x6pӟ x6ehK4+Owwg5{95Xj/HX)!^a2Z'*V jUz; * ॽa㵠+MD _YG22mB]GuQUף%vUUzCzp,Eq,~ߕ+dBLG/,);QM'*lѐ} IDAT]tt zLo̐9sf;>Su ЏBD^$Zu]Luo*}m/ ogb_5u- bp:{{/KK SXC\U@0VJ5~l6ρ5f[Tv}kG^ 7ϯGc/KVfj X )gʶ.eB`aÍ1LW*R l ǂm.J k˶̰fxʙpސTE|EOB؞rpL {!{U2ak)ٟeG-^\+\c|W~jKu{TN y7]u1 L_%H@͠.~_:IaA A|ٽawh!`g># +hit\J19\_d3b1 >X(8ZF߰@8БH"6g0%{y-Y%iz3v88?;ЭT[d :Fv!2 Ze!SM<<=Yϳ#v?| rtrk%@^j+P팪xa N% ?UXX h$͐ŽBjO~&zej轵;<(ۂ]MlR@dwBRL_kmԚ$ k05y x k׊g֖X%j}``fb;$R6k.MU_u">C?,#7kx}=ehĉb5x-Za`a`7X.'cy9bCzmʛtDZx=>1,kcZ0D6o\#:Ҁ"@jmٵj EkJ:5Ь \(Qٳg +/gA V@TE7n!XBQ H`㚰 ׬(0zjIkh- )SKJcA6RˑlW PzӧO]axfTTVSӬmبmѫ<-x/"o?k\nG-ZdU׫UX7txn-]Hcqb.Zn.ځu(E8OX!qz@׀c#x|p>l 5S 7EŸ&ʕ+C!2,CSH.jFFXL§ڌTcc^VcXWcxXWRհ!NU"ɪLJ,! 8?!{]b  GBl:BG{ɦ_Ukd%q.r< %L4k?Q{ Vb\/\A-~fثUUWۮXX&?KgX96#~H6Hz* b'7Hh;*+ ,&X8Wl}3Xlm:>3P6O ֚W# dbX^q{o,?|V=KA=]Б.>ke.!6 Z~-7A6Sjd8m  %X\JiQFc" ⫪$Ao}K*dXVRr TS^I N Jɥ .,bIvs[ۅ(FdTR8W9K**֖c1aM!nߙqH.u3 < J8ob`uM5.I~wq!.(QrGl EZGpŤ%PG@ X^H̯Gjt>N%5 .RꂷjX!:6hilە(oَݷRA \M0# \@fwbG\CSi~gٯ1<\î+m6eOM3}v㋋YYUaPh?[]R6+U  |ҥKEVI ґQD UYӷ v9%?,ގ;c0d!5s(G 2,CkmPY=G]'Ȱ*ٮXT+tuB"]chwy?W2 SW̎ ]\ZAb,Zz! Eʂ`i[ Nz^^VWN=*hRA`X?|?,>`X??,X??,:boCIENDB`qtoctave-0.10.1/qtoctave/src/images/editcut0000644000175000017500000000417111511434227017670 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe< IDATxb? 02226o>dűUΝ;>II{¿?>} BjNEff}&&Zbb ׮] 131bASSA;0(@sJ`rD^AA /ï_ ~u}# r$ H X(S`6r fm` ߾@ (?~A- >}-r`ї`&V0(@ ߿;P:`˭b<8!o0(HL,Yl>|pֽ@鿰, @Tp$`){{#=ee؛7m;u˖ӁJ2H@P+ l_b W-{>9ԙA%W`?{Ly>`vU s~rk4cu@TFlU2|z{G?}ֱ N\ [:2]\ۃ;SV}ǎjiZW@(b7×>k Kf~` T32s1XaV`6pfgPfKY]ϋ" ~1YZ^5e% d/c_nU7_  )$kN!N@~1HH;G&w[s ^13ueO;[lT00\ h?tuasa`Wg`0PO @(g~3bЗb pc+_}];p>FK/ /6lV%$( K^6GT BW/:(KPAsp.æ/| 3y=%'YghNB i MFM=?py޳?v?x?@09D h_7'3n'@xrHG `h93ES61e8b-t;6?vel}BЇd7߅ns߾ AQ%8LٺUϕ ![@*Pmh'O zy~_#w~.cQh@i#:=jÍYĐ|a5kfCC4u@QkƳo ~~R&@1׵_uCG j8$ ĹkUDqbxK={]x9jAv%z*IENDB`qtoctave-0.10.1/qtoctave/src/images/exit.png0000644000175000017500000000357311511434227017770 0ustar lucaslucasPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org< IDATXŗIlenq11m K4DfĢDB9p R a D+Bd2ec&[J<΂Yv]ݵ̡[sJ_-_u9(Ɓ0wT)`랐ޮXzCCDt-7orzfaӁnƍ\g>jYk,"h"(C)&+PM+E"ѡ!\'t`||p4aRJDP=%Ϥ*3g2>8/@8i3Rnp"M(@²mL)VVpVVu?˗Yuu6mcZ##$wBVǸX$  f\ `5<]3/ZG$29IRupqP.' @|x 5űm37ݹ9"CCt=07=͛WW*qPJ#J=_~ק)b}-DL`N]*ѿo_^5Mǜ;r?@{;kkD,d\KG"`sϑf4DDL\~cdu۷_~O^c==,5M"Dq sϑI|ڳtw7dH(Ze+7O`$K% }Na.\4T:sLї_@ꪖ֑JN&;ؗJΝMO>;wTH?ǵmb]]daLYu۶^Bxfh 84Tp,FPiiSM Tivc jyW]C5ZZ䭁4ׅJe\if,k j!P^Xw {y=bmJR*A>b]iV2*J t۶єBjU"B\׃LĶlR.#Qߐ!+-C?7@S cz:8>NAu(P5fe0J)@6 hW)AOYVv0T oUFڡL@k/ou*٬Px);X#Fw.]"i!PfQ4R eu" ލo_J}ƭ?v&޽たs1{ʉ`!k Z_'BiObO8y2 a"CZeO(D[4y|o)=XooЦ Akdbx]‡SY)Qtk^6l&*Gdo!B br}=z&&hn;)^FU"6:JmQl4Cm AS4 /D䭷|O2]#w1y(:oJV{̞=%f9w&5ܷk&8zהBD8sۋ%66F֭W2Tfg.,01mP*eIsMZҵ)ŃO?~qY Mcs8d^Z*:0uPx\넓(Eֹ&Yms"u*E_Ŀ'[lf~q .t`f>ʶ͂_װ]R?y =kIENDB`qtoctave-0.10.1/qtoctave/src/images/redo.png0000644000175000017500000000222411511434227017740 0ustar lucaslucasPNG  IHDR szzbKGD pHYs  ~tIME 3-T>6!IDATx]h[e$M6m&uVp8a9X 2]ɠs Sex0A&j729MүIs;Mc`@xHs7]^"k@[׉Xx^ c4TT{P}MW^'^uNU3-.G_)&>.c~de/CLdU.G ~(dp9D/6@ɖE?:ġn'ז"Oc||)@@yX ꑟRs5\bx4(I9܅fJ.Jܮ%!E/CzdX|% ljn@5ҧ$3c`ceE?6k.t`E`O Մȕ?&DCC47#@ 6n`78 ,!v~! @B@( ~iCs``B5a`D6utY 0Ҁ4 0иo$6z&ۍ |axB NewProjectDialog 0 0 400 300 New Project Name: Description: false Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() NewProjectDialog accept() 248 254 157 274 buttonBox rejected() NewProjectDialog reject() 316 260 286 274 qtoctave-0.10.1/qtoctave/src/projects/projects.cpp0000644000175000017500000002647011511434227021233 0ustar lucaslucas#include "projects.h" #include "ui_newprojectdialog.h" #include #include #include #include #include #include #include #include #include ///////////////////////////////////////////////////////////// struct Project { QStringList files; QString description; QString last_navigator_path, variables_list_path; QStringList command_history; }; ///////////////////////////////////////////////////////////// // Utils /**Gives projects.xml path*/ static inline QString _projects_path() { QString home=QDir::home().path()+"/.qtoctave/projects.xml"; return home; } ///////////////////////////////////////////////////////////// /**Load projects.xml*/ static QHash _load_projects() { QHash projects; QFile file(_projects_path()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return projects; QXmlStreamReader xml(&file); QString last_project; //Parse xml file while (!xml.atEnd()) { xml.readNext(); if( xml.isStartElement() ) { QString name=xml.name().toString(); QXmlStreamAttributes attrs=xml.attributes(); if(name=="project") { last_project=attrs.value("name").toString().trimmed(); } else if(name=="file") projects[last_project].files << xml.readElementText().trimmed(); else if(name=="command_history") projects[last_project].command_history << xml.readElementText().trimmed(); else if(name=="last_navigator_path") projects[last_project].last_navigator_path = xml.readElementText().trimmed(); else if(name=="variables_list_path") projects[last_project].variables_list_path = xml.readElementText().trimmed(); else if(name=="description") { projects[last_project].description = xml.readElementText(); } } else if( xml.isEndElement() ) { QString name=xml.name().toString(); last_project.clear(); } } //if (xml.hasError()){ } file.close(); return projects; } ///////////////////////////////////////////////////////////// /**Save projects.xml*/ static void _save_projects(QHash projects) { QFile file(_projects_path()); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return ; QXmlStreamWriter xml(&file); xml.setAutoFormatting(true); xml.writeStartDocument(); xml.writeStartElement("","projects"); QString key; foreach(key, projects.keys()) { xml.writeStartElement("","project"); xml.writeAttribute("", "name", key); xml.writeTextElement("", "description", projects[key].description); xml.writeTextElement("", "last_navigator_path", projects[key].last_navigator_path); xml.writeTextElement("", "variables_list_path", projects[key].variables_list_path); QString path; QStringList files=projects[key].files; foreach(path,files) { xml.writeTextElement("", "file", path); //xml.writeStartElement("","file"); //xml.writeAttribute("", "name", path); //xml.writeEndElement(); } foreach(QString command, projects[key].command_history) { xml.writeTextElement("", "command_history", command); } xml.writeEndElement(); } xml.writeEndElement(); xml.writeEndDocument(); file.close(); } ///////////////////////////////////////////////////////////// Projects::Projects(QWidget *parent):QDialog(parent) { ui.setupUi(this); ui.projects_listWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui.open_pushButton, SIGNAL(clicked()), this, SLOT(activate_project_callback())); //connect(ui.projects_listWidget, SIGNAL( customContextMenuRequested ( const QPoint & ) ), this, SLOT( contextMenu_cb( const QPoint & ) ) ); //connect(ui.projects_listWidget, SIGNAL(currentItemChanged ( QListWidgetItem *, QListWidgetItem *)), this, SLOT(show_description_callback(QListWidgetItem *, QListWidgetItem *))); //connect(ui.projects_listWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem *)), this, SLOT(activate_project_callback(QListWidgetItem *))); context_menu=new QMenu("Projects",this); new_project=new QAction(tr("New Project"), this); connect(new_project, SIGNAL(triggered()), this, SLOT(new_button_callback()) ); modify_project=new QAction(tr("Modify Project"), this); connect(modify_project, SIGNAL(triggered()), this, SLOT(modify_project_callback()) ); delete_project=new QAction(tr("Delete Project"), this); connect(delete_project, SIGNAL(triggered()), this, SLOT(delete_project_callback()) ); QList actions; actions.append(new_project); actions.append(modify_project); actions.append(delete_project); context_menu->addActions(actions); QHBoxLayout *layout=new QHBoxLayout(); layout->setSpacing(0); layout->setContentsMargins(0,0,0,0); ui.menu_widget->setLayout(layout); QMenuBar *menu_bar=new QMenuBar(this); layout->addWidget(menu_bar); menu_bar->show(); menu_bar->addMenu(context_menu); fill_projects_list(); } ///////////////////////////////////////////////////////////// Projects::~Projects() { //delete context_menu; //delete new_project; } ///////////////////////////////////////////////////////////// void Projects::fill_projects_list() { QHash projects=_load_projects(); QString key; QStringList list; foreach(key, projects.keys()) { list << key; } disconnect(ui.projects_listWidget, SIGNAL( customContextMenuRequested ( const QPoint & ) ), this, SLOT( contextMenu_cb( const QPoint & ) ) ); disconnect(ui.projects_listWidget, SIGNAL(currentItemChanged ( QListWidgetItem *, QListWidgetItem *)), this, SLOT(show_description_callback(QListWidgetItem *, QListWidgetItem *))); disconnect(ui.projects_listWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem *)), this, SLOT(activate_project_callback(QListWidgetItem *))); ui.projects_listWidget->clear(); connect(ui.projects_listWidget, SIGNAL( customContextMenuRequested ( const QPoint & ) ), this, SLOT( contextMenu_cb( const QPoint & ) ) ); connect(ui.projects_listWidget, SIGNAL(currentItemChanged ( QListWidgetItem *, QListWidgetItem *)), this, SLOT(show_description_callback(QListWidgetItem *, QListWidgetItem *))); connect(ui.projects_listWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem *)), this, SLOT(activate_project_callback(QListWidgetItem *))); ui.projects_listWidget->addItems(list); } ///////////////////////////////////////////////////////////// QStringList Projects::listFiles(QString project_name) { QHash projects=_load_projects(); return projects[project_name].files; } ///////////////////////////////////////////////////////////// void Projects::saveListFiles(const QString & project_name, const QStringList & files) { QHash projects=_load_projects(); projects[project_name].files=files; _save_projects(projects); } ///////////////////////////////////////////////////////////// QStringList Projects::listCommandHistory(QString project_name) { QHash projects=_load_projects(); return projects[project_name].command_history; } ///////////////////////////////////////////////////////////// void Projects::saveListCommandHistory(const QString & project_name, const QStringList & command_history) { QHash projects=_load_projects(); projects[project_name].command_history=command_history; _save_projects(projects); } ///////////////////////////////////////////////////////////// QString Projects::navigatorPath(QString project_name) { QHash projects=_load_projects(); return projects[project_name].last_navigator_path; } ///////////////////////////////////////////////////////////// QString Projects::variablesListPath(QString project_name) { QHash projects=_load_projects(); return projects[project_name].variables_list_path; } ///////////////////////////////////////////////////////////// void Projects::saveVariablesListPath(QString project_name, QString path) { QHash projects=_load_projects(); projects[project_name].variables_list_path=path; _save_projects(projects); QString home=QDir::home().path()+"/.qtoctave/"; QDir dir(home); QStringList filter; filter << "*.variables"; QStringList list=dir.entryList(filter); for(int i=0;i projects=_load_projects(); projects[project_name].last_navigator_path=path; _save_projects(projects); } ///////////////////////////////////////////////////////////// QString Projects::projectName() { return project_name; } ///////////////////////////////////////////////////////////// void Projects::new_button_callback() { QDialog dialog(this); Ui_NewProjectDialog ui_np; ui_np.setupUi(&dialog); if( QDialog::Accepted==dialog.exec() ) { QString name=ui_np.name_lineEdit->text(); if(name.isEmpty()) return; QString description=ui_np.description_textEdit->toPlainText(); QHash projects=_load_projects(); projects[name].description=description; _save_projects(projects); project_name=name; accept(); } } ///////////////////////////////////////////////////////////// void Projects::modify_project_callback() { QDialog dialog(this); Ui_NewProjectDialog ui_np; ui_np.setupUi(&dialog); dialog.setWindowTitle(tr("Modify Project")); QHash projects=_load_projects(); QString name=ui.projects_listWidget->currentItem()->text(); ui_np.description_textEdit->setPlainText(projects[name].description); ui_np.name_lineEdit->setText(name); if( QDialog::Accepted==dialog.exec() ) { QString name2=ui_np.name_lineEdit->text().trimmed(); if(name2.isEmpty()) return; projects[name2]=projects[name]; QString description=ui_np.description_textEdit->toPlainText(); projects[name2].description=description; if(name2!=name) { projects.remove(name); } _save_projects(projects); fill_projects_list(); } } ///////////////////////////////////////////////////////////// void Projects::delete_project_callback() { QString name=ui.projects_listWidget->currentItem()->text(); QString message="Project "+name+" will be erased. Continue?" ; int ret = QMessageBox::warning(this, tr("Delete Project"), tr( message.toLocal8Bit().data() ), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if(ret!=QMessageBox::Yes) return; QHash projects=_load_projects(); projects.remove(name); _save_projects(projects); fill_projects_list(); } ///////////////////////////////////////////////////////////// void Projects::activate_project_callback(QListWidgetItem * item) { if(item==NULL) { item=ui.projects_listWidget->currentItem(); if(item==NULL) return; } QString name=item->text(); QHash projects=_load_projects(); project_name=name; accept(); } ///////////////////////////////////////////////////////////// void Projects::show_description_callback(QListWidgetItem * current, QListWidgetItem * /*previous*/ ) { QString name=current->text(); QHash projects=_load_projects(); ui.description_textEdit->setPlainText(projects[name].description); } ///////////////////////////////////////////////////////////// void Projects::contextMenu_cb( const QPoint & /*pos*/) { context_menu->popup(QCursor::pos () ); } qtoctave-0.10.1/qtoctave/src/projects/projects.ui0000644000175000017500000000444611511434227021065 0ustar lucaslucas Ui_Projects 0 0 468 346 Projects 0 Available Projects: 0 0 Qt::Horizontal true false true Open Cancel cancel_pushButton clicked() Ui_Projects reject() 322 255 195 139 qtoctave-0.10.1/qtoctave/src/projects/projects.h0000644000175000017500000000540611511434227020674 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __PROJECTS_H__ #define __PROJECTS_H__ #include "ui_projects.h" #include "../config.h" using namespace Ui; /** Shows config window for select or create a new project. Project is a set of ".m" files. */ class Projects: public QDialog { Q_OBJECT QString project_name; Ui_Projects ui; QMenu *context_menu; QAction *new_project, *modify_project, *delete_project; /**Displays list of projects name in ListView.*/ void fill_projects_list(); public: Projects(QWidget *parent=0); ~Projects(); /**Last navigator path of project project_name.*/ static QString navigatorPath(QString project_name); /**Save last navigator path of project project_name.*/ static void saveNavigatorPath(QString project_name, QString path); /**Save variables list. Returns path of file saved.*/ static void saveVariablesListPath(QString project_name, QString path); /**Variables list path.*/ static QString variablesListPath(QString project_name); /**List of files of project project_name.*/ static QStringList listFiles(QString project_name); /**Save list of files of project project_name.*/ static void saveListFiles(const QString & project_name, const QStringList & files); /**History of commands of project project_name.*/ static QStringList listCommandHistory(QString project_name); /**Save history of commands of project project_name.*/ static void saveListCommandHistory(const QString & project_name, const QStringList & command_history); /**Name of selected project.*/ QString projectName(); public slots: /**Show dialog for a new project.*/ void new_button_callback(); /**Show dialog for modify project.*/ void modify_project_callback(); /**Delete selected project.*/ void delete_project_callback(); /**Sets project as active.*/ void activate_project_callback(QListWidgetItem * item=NULL); /**Show description of selected project.*/ void show_description_callback(QListWidgetItem * current, QListWidgetItem * previous ); /**Show context menu.*/ void contextMenu_cb( const QPoint & pos); }; #endif qtoctave-0.10.1/qtoctave/src/config_files/qtoctave.png0000644000175000017500000001615511511434227022027 0ustar lucaslucasPNG  IHDR@@iqsRGB7MS siCCPiccxgPi&0A$$A F&dqVI .AVQŀ((`@wE@YW^]ݧru|xW~OU$vrl@27}0@PHER}}_{z,"' 8p8a>!A; \Cw~ wp98RW&rW2; L_۾_K\KxJh72IK>tx>yFoĬm+a(E ^ %\Ѐ( 0 g|@ādY ԁF ΃Q4x ; A"CtHR!]bA63CP q ( AeP5T5C@ hzMBsGI05`ÞpSl8W ) ߂Ga>^DBD2G Cb)D* A{G>0(:J BQlT*j;U:D&Q /h2ZDCб,t݄@_E0 1ǸaB1 L10s 3,bXi.냍Ħc US؋4=S\pa8..WkFp3e8^os[%F|~L4 քBaFJ !*D 1XIr3 )]L_]#CFSlDOQS6R);yqxvsT:ՈCMS[74,MLihWhStJwipg$0?3 4  -5$Ltg&1Kgc̏ђ{%$G$d줢 ڥF>J+I;K'J~"ёɒ9"sUf^!k%˖-=#Hӑˑ;&7(( *"_%E~^`PЫ0HWQW,WBIB^)IR_iAYNM9C^yHyYES%P%O]*AZڧ歖֪HRS?>GKcVSJ]3[UsBeՠu_N>}W1Չөѹ ^^eaոI^/SUoR寧ߥ@ `CS$FF4#<u5WWޱ{k]h#&Lަ{LL?#kY /um`K3t3YY%ZXͮ\q͔uu5F& V6ҶǮn^>+CCÒ6KNSӐ39йKK˂k%7~qwyw{6~O:jg^:^<oZܵ]>_MT0~~5~smZײ]C@I@ JPxPsRSpY0? d[ȭP0lXPXSzOmܰeÍ26^Dl:"8%SOdCb{Tmۑ}c)E[GEXǔZwPx"q%)8=|K&r7+l޲y8E7 jz0ukJ6u3 2&3m2k2geB2Ugޭ3.sP9윾\]oGmۡ#Nם'wv%gWvw|S?Z V+cGԏ?]jBN"âO?Tʾ}C%f%GJ1ұOQ˲˦x,W*/,{p&u2+*ԪJ>UU8Դ]:9  Ά űaċb+Pmj1$KD I"g_zzU3oZ=XM^_{v!/Z^~/ixL? J_%ʿZk NP>B-N-?^s=ku?GB .qϺZ<]p;&յy*~=7?0 qj*{ʏP~|HxN8hprC I> Q"exDwxD L:? >Ǻ #qO/uݵqP(9۾qg+8' |$" T܆EQLk#q4C.C|xk|q*J 9u3c_~|@Λ8=kxT6Y$#/~T]5N}o'bOq@ wO %b**(ֈIDq8wG;܇OrM Dy>A%Xqǻx>NX.Ŵ*NᮑS#QbL}#K8܍rE["G\|x/gU~ 2|D?ʣCzKdJs#cqhB>f>CVfpp,ʂ>!E7S /%$P`FM8ǠB9K1Mn:@>}fO[KD?2(VV"Ql` =:N@y*qzPbN(kO"Ȃ@p7G`p|'EI%/QX>Ok.TLi6 5Fjptħ\^ X X-2*iS6j5 ]6n# 8,›bCrP"ER%%8͕DNgP>~DX "xVnQQ@ pߨ!ZkDȧ+x< :J iyE@; ¯A^N[~/R eNbGcC^Cdž"1-bՂ#$B62W"=+h Dˈ@D?u u'N<+Rc(K,wqo;K,y uxKaU$vwKh.BqY+Cft5SKZI^hI9I+=t4םcS|.GqV'1$j( rG Qe bc,~i,Djk* A7mFxcU^[d->n9\ Ka&|u^o:eoʹnSxYYL)u_x~_tEkk}{<)OcG?_9٧D:i{=?L܏}D~&]TZ`;)he+m5LU ?[kUz@}VJT/ik\f2o 'D*L Sx@}wU[kUPx5CӚ.[2Y ϒLOM^vKZ/&(ĤCо.}%9*zQKL{jbG+>k$+QZQܚCMmi&"Vz\!vc*PP1Ɏ*A 9͡v3e^oΡqc$wH|av" c4iYXUeku%U]nwC}3av#6Hz uG(ۆUͧWFG+G\ R-:S$7;B+'W+TX -K(pv0}tmD*zE`TMR\ZbEOR:3Ә;5Ɣ8u-? EٶLj%!!)d3ˢgd7Xs/vV0@_`fae]Bl(FBSo2 dID{ V^kQ HH14Xܓ)%!@T% ^C@{؇Gǐ@PTVC[<.[1֑"#pVKb˚·v}]xgS/aĊUyiDD2*n#V?JȤwR[\@Nޭ{QwA$"ElI' Td|TVUMEY^z ,V5 @@aQjNȧ9m\c1РZ !Jǡ[䶐l+\br4rc2t'QV-*[׶:% @s)-*+M{k 3hx5H5*I`dҪK2_Wi6R>6x/o(oϔ/r^o -]wkȗ-(a-r,]vomN&k}VSyr~sh&Qx]] w'Pꥆ-Q~P#Lg'W|rB4!M Ȭom@D20Q:;$a00-{~ <{U_1liPv ;"gF;_s(~ȹ./В}IaVHWZW){Jayg'֑@| ֿkiLX8GHw#FZ[W[Jٓ,6xx-pGg0ݿ'G؜Խ$qnnQ]< @+3țH~ٌ뱼zE">}T8slڽۋ2Pw9^\" dW=T^ l+;m6MLˇAvn^k 8xYͽs!] Ƒe &x॥-<߸A[ o|p֣'s>&ruRSEz6[ v%@%&J^SMÍ*žh b_ȪG!ePzVcIr#d֗=`@q{eXwo2ZN< ӣ"E.{B7'y +G=ɞ棷X=YX 3?X\f MhIF7fjIM0,#&/&'7t<3cgwWBWr3ZCF~TnO~ؿ#F|r~_f[JiR< ++ 4vz'F4K_WvmpM4C۵z/δma~$IENDB`qtoctave-0.10.1/qtoctave/src/config_files/config.rc0000755000175000017500000000030011511434227021252 0ustar lucaslucas# QtOctave main config file mode_work_area=last autoCompletion=true autoindent=true autoindent_statements=true bracketsMatch=true cols_in_terminal=80 syntaxHighlighting=true simple_rcs=true qtoctave-0.10.1/qtoctave/src/config_files/qtoctave.desktop0000644000175000017500000000021411511434227022701 0ustar lucaslucas[Desktop Entry] Name=QtOctave Comment=GUI for GNU Octave Icon=qtoctave Exec=qtoctave Type=Application Categories=Education;Science;Math;Qt; qtoctave-0.10.1/qtoctave/src/config_files/pkg-commands.list0000644000175000017500000004316111511434227022745 0ustar lucaslucasaa2int aar aarmam abcddim __abcddims__ ac2poly ac2rc acorf acovf addlistener addprop ademodce adim adsmax allchild amarma amdemod aminolookup ammod amodce analdemo __analyzerows ancestor anderson_darling_cdf anderson_darling_test anovan apkconst append_save applylut apply ar2poly ar2rc arburg arcext __area__ area are arfit2 arithmetic_decode arithmetic_encode ar_psd ar_spa aryule asci ASMbuildsystem ASMinitsystem auload au auplot ausave average_moments avitest awgn axes axis2dlim __axis_label__ axis azimuth BandToFull BandToSparse bar3h __bar3__ bar3 barh bar __bars__ barthannwin base64decode base64encode basic basic battery bchpoly bddemo bd_tree benchmark_dtmm benchmark_intmath benchmark_stmm benchutil_average benchutil_default_arg benchutil_initialize benchutil_is_octave benchutil_parse_desc benchutil_set_result benchutil_verbose bestblk best_dir_cov best_dir betastat bfgsmin_example bfgsmin bi2de biacovf bicg bilinear BIM1Alaplacian BIM1Areaction BIM1Arhs BIM2Aadvdiff BIM2Aboundarymass BIM2Areaction BIM2Arhs BIM2Cglobalflux BIM2Cmeshproperties BIM2Cpdegrad BIM2Cunknowncoord BIM2Cunknownsonside BIMUbern BIMUlogm __bin2hex__ __bin2num__ binostat bisdemo bispec biterr bitrevorder blackmanharris blackmannuttall blkproc bmpwrite bode_bounds bode __bodquist__ bohmanwin bolling bound_convex boxcar box boxplot __bridge_lut_fun__ bscchannel bsc buffer buildssic buildsystemIFF busdate busdays butter buttord bvp4c bwarea bwborder bwdist bweuler bwhitmiss bwmorph bwperim bwselect c2d __calcjacobian __calcperf calcwing cartprod caseread casewrite catmullrom caxis cceps cdiff center cheb1ord cheb2ord cheb chebwin cheby1 cheby2 check __checknetstruct chi2stat chirp chisqouttest Ci cla cleave clf clip close closereq cmorwavf cmpermute cmunique cochrancdf cochraninv cochrantest coefficient_of_variation cohere col2im colfilt colorbar colorbar colorgradient colstyle combinepolars combs comms compand compass concat condeig condentr_seq conditionalentropy_XY conditionalentropy_YX __conditional_mark_patterns_lut_fun__ conndef constants constants content contents Contents contour3 contourc contourf contour controldemo conv2nan convmtx copulacdf copulapdf __copycoltopos1 cordflt2 cor corr2 corrcoef corrector cosets cosint count cov covm cplxreal cpsd cquadnd create_lookup_table crossoverscattered crossoversinglepoint crule2dgen crule2d crule csape csapi csaps csd cstrcmp csv2latex csvread csvwrite ctranspose ctrb cylinder czt d2c d2_min damp dare dateaxis datefind datesplit day daysact dcgain dct2 dct dctmtx DDGelectron_driftdiffusion DDGgummelmap DDGhole_driftdiffusion DDGn2phin DDGnlpoisson DDGOXddcurrent DDGOXelectron_driftdiffusion DDGOXgummelmap DDGOXhole_driftdiffusion DDGOXnlpoisson DDGOXplotresults DDGOXTelectron_driftdiffusion DDGOXTgummelmap DDGOXThole_driftdiffusion DDGp2phip DDGphin2n DDGphip2p DDGplotresults ddmat DDNnewtonmap de2bi decimate decode default_db deg2rad deintrlv deletewithsemaphores delta_method DEMOcontrol demodmap demo_octgpr demoquat deriche deriv detrend detrend dezero dfdp dftmtx dgkfdemo dgram dhinfdemo __diagonal_fill_lut_fun__ dialog dilate dirac diric distance dixoncdf dixoninv dixontest dkalman dlmwrite __dlogsig dlqe dlqg dlqr dlyap D dmr2d do_pkg_init downsample __dpurelin drawnow drawnow dre dst __dtansig durlev dwt dxfwrite easter edge editdistance effrr egolaydec egolayenc egolaygen ellipdemo ellipj ellipke ellip ellipord ellipsoid __ellip_ws __ellip_ws_min empty empty encode entropyfilt entropy entropy eomdate erfcinv erfcx erode __errcomm__ errorbar __errplot__ ExampleEigenValues ExampleGenEigenValues example_netcdf example_opendap example_optiminterp existfile expdemo expfit expint_E1 expint_Ei expint expstat eyediagram fatal fbusdate fcnchk feather feedback __fetch_google__ fetch __fetch_yahoo__ fexist ff2n fftconv2 fht fibodeco fiboenco fibosplitstream figure fill filtfilt filtic findfiles findobj findsym fir1 fir2 fir2sys firls fitscalingrank fixedpoint flag_implicit_samplerate flag_implicit_significance flattopwin flix float floweqj floweq fmdemod fminbnd fmin fminsearch fmins fminunc fmmod fnder fnplt fnval FPL2dxappenddata FPL2dxoutputdata FPL2dxoutputtimeseries FPL2pdequiver FPL2pdeshowmesh FPL2pdesurf FPL2ptcquiver FPL2ptcshowmesh FPL2ptcsurf FPL2trspdesurf FPL2trsptcsurf FPL2vtkoutputdata fplot fracshift frdemo freqchkw __freqresp__ freqs freqs_plot fsort fspecial fstat fullfact FullToBand __functionstatus__ funjac funm funres fvl fv fxpow fzero __ga_concatenated_bitstring2doubles__ gacreationuniform __ga_crossoverfcn__ __ga_doubles2concatenated_bitstring__ __ga_initial_population__ __ga__ ga gamfit gamlike gamstat __ga_mutationfcn__ __gaoptimget__ __gaoptimset_default_options__ gaoptimset __ga_popinitrange__ __ga_problem__ __ga_problem_private_state__ __ga_problem_return_variables__ __ga_problem_state_selection__ __ga_problem_update_state_at_each_generation__ gapTest __ga_scores__ __ga_selectionfcn__ __ga_sort_ascend_population__ __ga_stop__ gauspuls gaussian gausswin gca gcbf gcbo gcf gconv gconvmtx gdeconv gdftmtx gen2par genqamdemod genqammod geomean geomean geostat getfields gethostname getid __get_object__ __get_parent_arg__ getusername __getx gfft gftable gfweight gifft ginput gisequal glimh2 glimh gliml gmm_estimate gmm_example gmm_obj gmm_results gmm_variance_inefficient gmm_variance gmonopuls golombdeco golombenco google gpc_plot gquad2d6 gquad2dgen gquad2d gquad6 gquad gquadnd grace_octave_path gradabs gradacosh gradacos gradasinh gradasin gradatanh gradatan gradconj gradcosh gradcos gradcot gradcumprod gradcumsum gradexp gradfind gradimag gradlog10 gradlog gradprod gradreal gradsinh gradsin gradsqrt gradsum gradtanh gradtan gram graydec grayenc grayslice graythresh grep grid groots grpdelay __grpltfmt__ grubbscdf grubbsinv grubbstest grule2dgen grule2d grule gtext gxy1 gxy2 gxy h2norm h2syn hammgen hann harmmean harmmean hartley_entropy heaviside helpers __hex2bin__ hggroup hhigh hidden highlow hilbert hinf_ctr hinfdemo hinfnorm hinfsyn_chk hinfsyn hinfsyn_ric hist2d histeq histfit hist histo2 histo3 histo4 histo hmmestimate hmmgenerate hmmviterbi hold holidays hough_circle houghtf hour huffmandeco huffmandict huffmanenco hup hx hygestat idct2 idct idplot idsim idst ifht im2bw im2col im2double im2uint16 im2uint8 imadjust imclose imcomplement imdilate imerode imfilter imginfo imhist immaximas imnoise imopen impad imperspectivewarp impulse impz imremap imresize imrotate_Fourier imrotate imshear imsmooth imtophat imtranslate infoentr_seq infogain_seq infoskeleton __init initsystemIFF innerfun int2aa interp intrlv invest0 invest1 invfdemo invfreq invfreqs invfreqz inz irr irsa_actcore irsa_act irsa_check irsa_dftfp irsa_dft irsa_genreal irsa_idft irsa_isregular irsa_jitsp irsa_mdsp irsa_normalize irsa_plotdft irsa_resample irsa_rgenreal is_abcd isbusday isbw is_controllable is_detectable is_dgkf is_digital isfigure isgray ishold isind is_observable isposint isprop isrgb is_sample is_signal_list is_siso issorted is_stabilizable is_stable javaaddpath javaArray javaclasspath jet707 __jhandles_add_listener __jhandles_add_property __jhandles_exit __jhandles_get_baseline __jhandles_get __jhandles_go_axes_init __jhandles_go_axes __jhandles_go_barseries __jhandles_go_colorbar __jhandles_go_delete __jhandles_go_execute_callback __jhandles_go_figure __jhandles_go_hggroup __jhandles_go_image __jhandles_go_line __jhandles_go_patch __jhandles_go_stemseries __jhandles_go_surface __jhandles_go_text __jhandles_go_uicontrol __jhandles_go_uipanel __jhandles_ishandle __jhandles_set __jhandles_waitfor jointentropy jsucdf jsupdf kaiser kaiserord kd_tree kernel_density_cvscore kernel_density kernel_density_nodes __kernel_epanechnikov kernel_example __kernel_normal kernel_optimal_bandwidth kernel_regression_cvscore kernel_regression kernel_regression_nodes __kernel_weights km2deg kullback_leibler_distance kurtosis label2rgb laguerre lambertw lattice lauchli laverage lbusdate lcrcl lcrcu leasqrdemo leasqr legend legend levinson lfdif liftanalyze light LinearRegression line line_min linkage llow lloyds loadpolars loadtestresults loadwing loglogerr loglog lognstat logsig lookup_table lpc lqe lqg lqr lsim ltifr lweekdate lyap lz77deco lz77enco m2xdate mad mad makeflow makelut makewing map marcumq marginalc marginalr mat2gray mat2java mat2xls match matdeintrlv matintrlv __matlabfunctionlist__ Mcapacitors Mcapacitors Mcurrentsources Mcurrentsources Mdiode mdsmax mean2 meandev mean meansq medfilt2 median meshc meshgrid mesh meshz METLINEScapcomp METLINESdefinepermittivity mexihat meyeraux Minductors Minductors minfo minimize min_max minpol minute mirr missingfunctionstatus __missingmatlab2txt__ missingmatlabfunctions mktheta mle_estimate mle_example mle_obj mle_obj_nodes mle_results mle_variance mlp9_1_1_logsig mlp9_1_1_tansig mlp9_2_1_logsig mlp9_2_1_tansig mlp9_2_2_1_logsig mlp9_2_2_1_tansig mlp9_2_2_logsig mlp9_2_2_tansig mlp9_2_3_logsig mlp9_2_3_tansig mlp9_5_3_logsig mlp9_5_3_tansig MLPScripts Mnmoscap Mnmosfet Mnmosfet moddemo mod modmap moment month months morlet movavg Mpdesympnjunct mplot Mpmosfet Mpmosfet Mresistors Mresistors Mschichmanhodgesmosfet mscohere __mse MSH2Mdisplacementsmoothing MSH2Mequalizemesh MSH2Mgeomprop MSH2Mgmsh MSH2Mjigglemesh MSH2Mjoinstructm MSH2Mmeshalongspline MSH2Mnodesonsides MSH2Mstructmesh MSH2Msubmesh MSH2Mtopprop multicoredemo multicoredemo_octave multicore multiplot mutationgaussian mutationsinglepoint mutualinformation mutualinfo_seq mvaar mvar mvfilter mvfreqz mvncdf mvnpdf mvnrnd Mvoltagesources Mvoltagesources mvtcdf mysql_basic mysql_empty mysql_high naninsttest nanmax nanmean nanmedian nanmin nanstd nanstd nansum nansum nantest nanvar narysource nbinstat ncauer ncbyte ncchar ncdouble ncdump ncfloat ncint nclong ncrule ncshort nctest ndgrid negvolidx nelder_mead_min newff newmark __newnetwork newplot nichols nlfilter __nlnewmark_fcn__ nlnewmark nls_estimate nls_example NLSnewtonraphson nls_obj nls_obj_nodes NLSstationary nmsmax nnetTest nnetTestMLP nomrr normcdf norminv normpdf normplot normstat nper npv nrm __num2bin__ nuttallwin nweekdate nyquist nze obsv oct2dec odbc_basic odbc_empty odbc_high ode23d ode23 ode23 ode45d ode45 ode45 ode54d ode54 ode78d ode78 ode78 odeexamples odeget odephas2 odephas3 odepkg_event_handle odepkg_examples_dae odepkg_examples_dde odepkg_examples_ide odepkg_examples_ode odepkg odepkg_structure_check odepkg_testsuite_calcmescd odepkg_testsuite_calcscd odepkg_testsuite_chemakzo odepkg_testsuite_hires odepkg_testsuite_implakzo odepkg_testsuite_implrober odepkg_testsuite_impltrans odepkg_testsuite_oregonator odepkg_testsuite_pollution odepkg_testsuite_robertson odepkg_testsuite_transistor odeplot odeprint odeset onbalvol oneplot optiminterp1 optiminterp2 optiminterp3 optiminterp4 optiminterpn __optimizedatasets optimset ord2 ordfilt2 ordfiltn orient outlier __outlist__ pacf packedform packsys padarray pamdemod pammod parallel parameterize parcor pareto parseIFF __parse_stem_args__ parzenwin patch pburg pcolor pdist peaks penddot pendulum percentile physical_constant pie place plot3 plotbynameIFF plot plotpdb plotyy __plr1__ __plr2__ __plr__ __plt1__ __plt2__ __plt2mm__ __plt2mv__ __plt2ss__ __plt2vm__ __plt2vv__ __plt__ __pltopt1__ __pltopt__ pmt pointfig poisson poisson_moments poisstat polar polppder poly2ac poly2ar poly_2_ex poly2mask poly2rc poly2sym poly2th polyconf polystab postgres_basic postgres_empty postgres_high poststd posvolidx __power prctile predictor preparedata9_x_1 preparedata9_x_2 preparedata9_x_3 preparedata9_x_x_1 prestd prettyprint_c prettyprint princomp __printAdaptFcn __printAdaptParam __printBiasConnect __printBiases __printB __printInitFcn __printInitParam __printInputConnect __printInputs __printInputWeights __printIW __printLayerConnect __printLayers __printLayerWeights __printLW print __printMLPHeader __printNetworkType __printNumInputDelays __printNumInputs __printNumLayerDelays __printNumLayers __printNumOutputs __printNumTargets __printOutputConnect __printOutputs __printPerformFcn __printPerformParam __printTargetConnect __printTargets __printTrainFcn __printTrainParam prompt proplan PRSIFFparse psi pskdemod pskmod pulstran purelin pvl pv pwelch pyulear pzmap qamdemod qammod qaskdeco qaskenco qcalc qconj qcoordinate_plot QDDGOXcompdens QDDGOXddcurrent QDDGOXgummelmap QDDGOXnlpoisson qderiv qderivmat qfuncinv qfunc qinv qmult qp_kaiser qtable qtdecomp qtgetblk qtrans qtransv qtransvmat qtsetblk quad2dcgen quad2dc quad2dggen quad2dg quadc quadg quadndg quantile quantiz quaternion quiver3 quiver qzval rad2deg radon rainbow randdeintrlv randerr randint randintrlv __randomisecols random randsrc rangefilt rankcorr ranks rastriginsfcn rate raylcdf raylinv raylpdf raylrnd raylstat rbf_centers rc2ac rc2ar rc2poly rceps read_options read_pdb reckon rectpuls rectwin reduce redundancy reedmullerdec reedmullerenc reedmullergen regdatasmooth regress relativeentropy rem removefilesemaphore renyi_entropy replot __rerangecolumns resample reset_property residued residuez rgb2gray rgbplot rgdtsmcore rgdtsmcorewrap ribbon ricedeco riceenco rk2fixed rk4fixed rk8fixed rldemo rledeco rleenco rlocus rmle rmoutlier rms roicolor rose rosenbrock rotg rotparams rotv rsdecof rsencof rsgenpoly rsindex run2dtests run_cmd runmedaspk runme runm safeprod samin_example saveMLPStruct save_vrml sawtooth sbispec scale_data scatter3 scatter scatterplot scloseall scores second secs1d secs2d select_3D_points selectionroulette selectionstochunif selmo2 selmo semilogxerr semilogx semilogyerr semilogy sem seqreverse series server setalfa setfields setfilesemaphore __setx sftrans sgolayfilt sgolay shading shannon_entropy shannonfanodeco shannonfanodict shannonfanoenco shanwavf shg Si sim sinint sinvest1 skewness slice slurp_file sombrero sortcom sos2tf sos2zp sound soundsc spearman specgram sphere spinmap splot spwinterp sqlite_basic sqlite_empty sqlite_high sql squareform square ss2sys ss2tf ss2zp ss stairs starp startmulticoremaster startmulticoreslave statistic std2 stdfilt std stem3 stem3 stem stem __stepimp__ step strappend stretchlim strjoin strsort strtoz strtrim subplot subset subtitle subwindow sum_moments_nodes sumskipnan surface surfc surf surfnorm svds swapcols swap swaprows sym2poly symerr symfsolve sys2fir sys2ss sys2tf sys2zp sysadd sysappend __syschnamesl__ syschnames syschtsam __sysconcat__ sysconnect __syscont_disc__ syscont __sysdefioname__ __sysdefstname__ sysdimensions sysdisc sysdup sysgetsignals sysgettsam sysgettype sysgroup __sysgroupn__ sysidx sysmin sysmult sysout sysprune sysreorder sysrepdemo sysscale syssetsignals syssub systematize sysupdate tabulate tansig tars taxedrr __tbl_delim__ tblread tblwrite tcdf tclphoto tclsend tempdir2 temp_name test_d2_min_1 test_d2_min_2 test_d2_min_3 test_ellint test_ellipj testExample1_1 testExample1_2 testfixed test_fminunc_1 testfun testfun_octave test_gsvd test_hyperg test_min_1 test_min_2 test_min_3 test_min_4 test_minimize_1 test_moving_surf test_ncrule test_nelder_mead_min_1 test_nelder_mead_min_2 testofdm test_optiminterp test_optiminterp_mult test_quadg test_sncndn test_struct test_vmesh test_vrml_faces test_wpolyfit testX text tf2sos tf2ss __tf2sysl__ tf2sys tf2zp tfe tfestimate __tfl__ tf tfout ThDDGOXddcurrent ThDDGOXelectron_driftdiffusion ThDDGOXeletiteration ThDDGOXgummelmap ThDDGOXhole_driftdiffusion ThDDGOXMOBN0STD ThDDGOXMOBN1STD ThDDGOXMOBP0STD ThDDGOXMOBP1STD ThDDGOXnlpoisson ThDDGOXthermaliteration ThDDGOXTWN0STD ThDDGOXTWN1STD ThDDGOXTWP0STD ThDDGOXTWP1STD ThDDGOXupdateelectron_temp ThDDGOXupdatehole_temp ThDDGOXupdatelattice_temp thfm thirdwednesday tics tinv title tk_busy_cancel tk_busy tk_dialog tk_entry tk_error tk_init tk_input tk_menu tk_message tk_progress_cancel tk_progress tk_scale tk_yesnocancel tk_yesno today toggle_grace_use tpdf __trainlm train transpose trastd triang triangular tricontour trimean trimmean tripuls tsademo tstat TSTBWEFUNJAC0 TSTBWEFUNJAC1 TSTBWEFUNRES0 TSTBWEFUNRES1 TSTBWEFUNUP1 TSTbweuler TSTbweulernr TSTDASPKFUNJAC TSTDASPKFUNRES TSTdaspk TSTTHETAFUNJAC1 TSTTHETAFUNRES1 TSTthetamethod tukeywin tunstallcode twice tzero2 tzero Ubern Ubern Ubernoulli Ucolumns Ucompconst Ucompconst Ucomplap Ucomplap Ucompmass2 Ucompmass ucp Udescaling Udopdepmob Udrawedge Udriftdepmob Udriftdiffusion2 Udriftdiffusion Udriftdiffusion UDXappend2Ddata UDXoutput2Ddata UDXoutput2Dtimeseries Ufielddepmob Ufvsgcurrent2 Ufvsgcurrent3 Ufvsgcurrent ugain uicontrol uintlut Uinvfermidirac uipanel uiresume Uise2pde uiwait Ujoinmeshes Umediaarmonica Umeshproperties Umsh2pdetool Umshcreatemesh unarydec unaryenc __unconditional_mark_patterns_lut_fun__ unidstat unifstat unitfeedback units Unodesonside unpacksys unscale_parameters unvech Updegrad Updemesh Updesurf upfirdn upsample Urows URREcyclingpattern Urrextrapolation Uscaling Uscharfettergummel2 Uscharfettergummel3 Uscharfettergummel Uscharfettergummel Usmoothguess Ustructmesh_left Ustructmesh Ustructmesh_random Ustructmesh_right Usubdomains2 Usubmesh Utemplogm UTLplotbyname UTLsbnserver var vec2mat view vmesh vol vrml_anim vrml_arrow vrml_Background vrml_browse vrml_cyl vrml_demo_tutorial_1 vrml_demo_tutorial_2 vrml_demo_tutorial_3 vrml_demo_tutorial_4 vrml_DirectionalLight vrml_ellipsoid vrml_faces vrml_flatten vrml_frame vrml_group vrml_interp vrml_kill vrml_lines vrml_material vrml_newname vrml_parallelogram vrml_PointLight vrml_points vrml_ROUTE vrml_select_points vrml_surf vrml_text vrml_thick_surf vrml_TimeSensor vrml_transfo waitforbuttonpress waitfor wblstat welchwin wgn wgt1o window wkeep wpolyfitdemo wpolyfit wrev write_pdb wsolve x25 x2mdate xcorr2 xcorr xcovf xcov xcubed xlabel xlim xlsread xmlwrite xsquar y2res yahoo yeardays year ylabel ylim zagzig zenity_calendar zenity_entry zenity_file_selection zenity_list zenity_message zenity_notification zenity_progress zenity_scale zenity_text_info zero_count zeta zgfmul zgfslv zginit __zgpbal__ zgreduce zgrownorm zgscal zgsgiv zgshsr zigzag zlabel zlim zoom zp2sos __zp2ssg2__ zp2ss zp2sys zp2tf zplane zp zpout zscore zscore qtoctave-0.10.1/qtoctave/src/config_files/octave.xml0000755000175000017500000015410311511434227021475 0ustar lucaslucas [a-zA-Z_][a-zA-Z_0-9]* all_va_args break case continue else elseif end_unwind_protect global gplot gsplot otherwise persistent replot return static until unwind_protect unwind_protect_cleanup varargin varargout casesen cd chdir clear dbclear dbstatus dbstop dbtype dbwhere diary echo edit_history __end__ format gset gshow help history hold iskeyword isvarname load ls mark_as_command mislocked mlock more munlock run_history save set show type unmark_command which who whos for endfor if endif do until while endwhile function endfunction switch endswitch try end_try_catch end argv e eps false F_DUPFD F_GETFD F_GETFL filesep F_SETFD F_SETFL i I inf Inf j J NA nan NaN O_APPEND O_ASYNC O_CREAT OCTAVE_HOME OCTAVE_VERSION O_EXCL O_NONBLOCK O_RDONLY O_RDWR O_SYNC O_TRUNC O_WRONLY pi program_invocation_name program_name P_tmpdir realmax realmin SEEK_CUR SEEK_END SEEK_SET SIG stderr stdin stdout true ans automatic_replot beep_on_error completion_append_char crash_dumps_octave_core current_script_file_name debug_on_error debug_on_interrupt debug_on_warning debug_symtab_lookups DEFAULT_EXEC_PATH DEFAULT_LOADPATH default_save_format echo_executing_commands EDITOR EXEC_PATH FFTW_WISDOM_PROGRAM fixed_point_format gnuplot_binary gnuplot_command_axes gnuplot_command_end gnuplot_command_plot gnuplot_command_replot gnuplot_command_splot gnuplot_command_title gnuplot_command_using gnuplot_command_with gnuplot_has_frames history_file history_size ignore_function_time_stamp IMAGEPATH INFO_FILE INFO_PROGRAM __kluge_procbuf_delay__ LOADPATH MAKEINFO_PROGRAM max_recursion_depth octave_core_file_format octave_core_file_limit octave_core_file_name output_max_field_width output_precision page_output_immediately PAGER page_screen_output print_answer_id_name print_empty_dimensions print_rhs_assign_val PS1 PS2 PS4 save_header_format_string save_precision saving_history sighup_dumps_octave_core sigterm_dumps_octave_core silent_functions split_long_rows string_fill_char struct_levels_to_print suppress_verbose_help_message variables_can_hide_functions warn_assign_as_truth_value warn_divide_by_zero warn_empty_list_elements warn_fortran_indexing warn_function_name_clash warn_future_time_stamp warn_imag_to_real warn_matlab_incompatible warn_missing_semicolon warn_neg_dim_as_zero warn_num_to_str warn_precedence_change warn_reload_forces_clear warn_resize_on_range_error warn_separator_insert warn_single_quote_string warn_str_to_num warn_undefined_return_values warn_variable_switch_label whos_line_format airy_Ai airy_Ai_deriv airy_Ai_deriv_scaled airy_Ai_scaled airy_Bi airy_Bi_deriv airy_Bi_deriv_scaled airy_Bi_scaled airy_zero_Ai airy_zero_Ai_deriv airy_zero_Bi airy_zero_Bi_deriv atanint bchdeco bchenco bessel_il_scaled bessel_In bessel_In_scaled bessel_Inu bessel_Inu_scaled bessel_jl bessel_Jn bessel_Jnu bessel_kl_scaled bessel_Kn bessel_Kn_scaled bessel_Knu bessel_Knu_scaled bessel_lnKnu bessel_yl bessel_Yn bessel_Ynu bessel_zero_J0 bessel_zero_J1 beta_gsl bfgsmin bisectionstep builtin bwfill bwlabel cell2csv celleval Chi chol Ci clausen conicalP_0 conicalP_1 conicalP_half conicalP_mhalf conv2 cordflt2 coupling_3j coupling_6j coupling_9j csv2cell csvconcat csvexplode cyclgen cyclpoly dawson debye_1 debye_2 debye_3 debye_4 deref dispatch dispatch_help display_fixed_operations dlmread ellint_Ecomp ellint_Kcomp ellipj erfc_gsl erf_gsl erf_Q erf_Z _errcore eta eta_int expint_3 expint_E1 expint_E2 expint_Ei expm1 exp_mult exprel exprel_2 exprel_n fabs fangle farg fatan2 fceil fconj fcos fcosh fcumprod fcumsum fdiag fermi_dirac_3half fermi_dirac_half fermi_dirac_inc_0 fermi_dirac_int fermi_dirac_mhalf fexp ffloor fimag finitedifference fixed flog flog10 fprod freal freshape fround fsin fsinh fsqrt fsum fsumsq ftan ftanh full gamma_gsl gamma_inc gamma_inc_P gamma_inc_Q gammainv_gsl gammastar gdet gdiag gexp gf gfilter _gfweight ginv ginverse glog glu gpick gprod grab grank graycomatrix __grcla__ __grclf__ __grcmd__ greshape __grexit__ __grfigure__ __grgetstat__ __grhold__ __grinit__ __grishold__ __grnewset__ __grsetgraph__ gsl_sf gsqrt gsum gsumsq gtext gzoom hazard houghtf hyperg_0F1 hzeta is_complex_sparse isfixed isgalois isprimitive is_real_sparse is_sparse jpgread jpgwrite lambert_W0 lambert_Wm1 legendre_Pl legendre_Plm legendre_Ql legendre_sphPlm legendre_sphPlm_array leval listen lnbeta lncosh lngamma_gsl lnpoch lnsinh log_1plusx log_1plusx_mx log_erfc lp make_sparse mark_for_deletion medfilt1 newtonstep nnz numgradient numhessian pchip_deriv pngread pngwrite poch pochrel pretty primpoly psi psi_1_int psi_1piy psi_n rand rande randn randp regexp remez reset_fixed_operations rotate_scale rsdec rsenc samin SBBacksub SBEig SBFactor SBProd SBSolve Shi Si sinc_gsl spabs sparse spfind spimag spinv splu spreal SymBand synchrotron_1 synchrotron_2 syndtable taylorcoeff transport_2 transport_3 transport_4 transport_5 trisolve waitbar xmlread zeta zeta_int aar aarmam ac2poly ac2rc acorf acovf addpath ademodce adim adsmax amodce anderson_darling_cdf anderson_darling_test anovan apkconst append_save applylut ar2poly ar2rc arburg arcext arfit2 ar_spa aryule assert au aucapture auload auplot aurecord ausave autumn average_moments awgn azimuth BandToFull BandToSparse base64encode battery bchpoly bestblk best_dir best_dir_cov betaln bfgs bfgsmin_example bi2de biacovf bilinear bisdemo bispec biterr blkdiag blkproc bmpwrite bone bound_convex boxcar boxplot brighten bs_gradient butter buttord bwborder bweuler bwlabel bwmorph bwselect calendar cceps cdiff cellstr char cheb cheb1ord cheb2ord chebwin cheby1 cheby2 chirp clf clip cmpermute cmunique cohere col2im colfilt colorgradient comms compand complex concat conndef content contents Contents contourf convhull convmtx cool copper corr2 cosets count covm cplxpair cquadnd create_lookup_table crule crule2d crule2dgen csape csapi csd csvread csvwrite ctranspose cumtrapz czt d2_min datenum datestr datevec dct dct2 dctmtx de2bi deal decimate decode deg2rad del2 delaunay delaunay3 delta_method demo demodmap deriv detrend dfdp dftmtx dhbar dilate dispatch distance dlmread dlmwrite dos double drawnow durlev dxfwrite edge edit ellip ellipdemo ellipj ellipke ellipord __ellip_ws __ellip_ws_min encode eomday erode example ExampleEigenValues ExampleGenEigenValues expdemo expfit eyediagram factor factorial fail fcnchk feedback fem_test ff2n fftconv2 fieldnames fill fill3 filter2 filtfilt filtic findsym fir1 fir2 fixedpoint flag flag_implicit_samplerate flattopwin flix float fmin fminbnd fmins fminunc fnder fnplt fnval fplot freqs freqs_plot fsort fullfact FullToBand funm fzero gammaln gapTest gaussian gausswin gconv gconvmtx gdeconv gdftmtx gen2par geomean getfield getfields gfft gftable gfweight gget gifft ginput gmm_estimate gmm_example gmm_obj gmm_results gmm_variance gmm_variance_inefficient gquad gquad2d gquad2d6 gquad2dgen gquad6 gquadnd grace_octave_path gradient grayslice grep grid griddata groots grpdelay grule grule2d grule2dgen hadamard hammgen hankel hann harmmean hilbert histeq histfit histo histo2 histo3 histo4 hot hsv hup idct idct2 idplot idsim ifftshift im2bw im2col imadjust imginfo imhist imnoise impad impz imread imrotate imshear imtranslate imwrite innerfun inputname interp interp1 interp2 interpft intersect invest0 invest1 invfdemo invfreq invfreqs invfreqz inz irsa_act irsa_actcore irsa_check irsa_dft irsa_dftfp irsa_genreal irsa_idft irsa_isregular irsa_jitsp irsa_mdsp irsa_normalize irsa_plotdft irsa_resample irsa_rgenreal isa isbw isdir isequal isfield isgray isind ismember isprime isrgb issparse isunix jet kaiser kaiserord lambertw lattice lauchli leasqr leasqrdemo legend legendre levinson lin2mu line_min lloyds lookup lookup_table lpc lp_test mad magic makelut MakeShears map mat2gray mat2str mdsmax mean2 medfilt2 meshc minimize minpol mkpp mktheta mle_estimate mle_example mle_obj mle_results mle_variance modmap mu2lin mvaar mvar mvfilter mvfreqz myfeval nanmax nanmean nanmedian nanmin nanstd nansum ncauer nchoosek ncrule ndims nelder_mead_min newmark nlfilter nlnewmark __nlnewmark_fcn__ nmsmax nonzeros normplot now nrm nthroot nze OCTAVE_FORGE_VERSION ode23 ode45 ode78 optimset ordfilt2 orient pacf padarray parameterize parcor pareto pascal patch pburg pcg pchip pcolor pcr peaks penddot pendulum perms pie pink plot3 __plt3__ poly2ac poly2ar poly_2_ex poly2mask poly2rc poly2sym poly2th polyarea polyconf polyder polyderiv polygcd polystab __power ppval prctile prettyprint prettyprint_c primes princomp print prism proplan pulstran pwelch pyulear qaskdeco qaskenco qtdecomp qtgetblk qtsetblk quad2dc quad2dcgen quad2dg quad2dggen quadc quadg quadl quadndg quantiz quiver rad2deg rainbow randerr randint randsrc rat rats rc2ac rc2ar rc2poly rceps read_options read_pdb rectpuls resample rgb2gray rk2fixed rk4fixed rk8fixed rmfield rmle rmpath roicolor rosser rotparams rotv rref rsdecof rsencof rsgenpoly samin_example save_vrml sbispec scale_data scatter scatterplot select_3D_points selmo setdiff setfield setfields setxor sftrans sgolay sgolayfilt sinvest1 slurp_file sortrows sound soundsc spdiags specgram speed speye spfun sphcat spline splot spones sprand sprandn spring spstats spsum sp_test sptest spvcat spy std2 stem str2double strcmpi stretchlim strfind strmatch strncmp strncmpi strsort strtok strtoz struct strvcat summer sumskipnan surf surfc sym2poly symerr symfsolve tabulate tar temp_name test test_d2_min_1 test_d2_min_2 test_d2_min_3 test_ellipj test_fminunc_1 testimio test_inline_1 test_min_1 test_min_2 test_min_3 test_min_4 test_minimize_1 test_nelder_mead_min_1 test_nelder_mead_min_2 test_sncndn test_struct test_vmesh test_vrml_faces test_wpolyfit text textread tf2zp tfe thfm tics toeplitz toggle_grace_use transpose trapz triang tril trimmean tripuls trisolve triu tsademo tsearchdemo ucp uintlut unique unix unmkpp unscale_parameters vec2mat view vmesh voronoi voronoin vrml_arrow vrml_Background vrml_browse vrml_cyl vrml_demo_tutorial_1 vrml_demo_tutorial_2 vrml_demo_tutorial_3 vrml_demo_tutorial_4 vrml_ellipsoid vrml_faces vrml_flatten vrml_frame vrml_group vrml_kill vrml_lines vrml_material vrml_parallelogram vrml_PointLight vrml_points vrml_select_points vrml_surf vrml_text vrml_thick_surf vrml_transfo wavread wavwrite weekday wgn white wilkinson winter wpolyfit wpolyfitdemo write_pdb wsolve xcorr xcorr2 xcov xlsread xmlwrite y2res zero_count zoom zp2tf zplane zscore abs acos acosh all angle any append arg argnames asin asinh assignin atan atan2 atanh atexit bitand bitmax bitor bitshift bitxor casesen cat cd ceil cell cell2struct cellstr char chdir class clc clear clearplot clg closeplot completion_matches conj conv convmtx cos cosh cumprod cumsum dbclear dbstatus dbstop dbtype dbwhere deconv det dftmtx diag diary disp document do_string_escapes double dup2 echo edit_history __end__ erf erfc ERRNO error __error_text__ error_text eval evalin exec exist exit exp eye fclose fcntl fdisp feof ferror feval fflush fft fgetl fgets fieldnames file_in_loadpath file_in_path filter find find_first_of_in_loadpath finite fix floor fmod fnmatch fopen fork format formula fprintf fputs fread freport frewind fscanf fseek ftell func2str functions fwrite gamma gammaln getegid getenv geteuid getgid getpgrp getpid getppid getuid glob graw gset gshow help history hold home horzcat ifft imag inline input input_event_hook int16 int32 int64 int8 intmax intmin inv inverse ipermute isalnum isalpha isascii isbool iscell iscellstr ischar iscntrl iscomplex isdigit isempty isfield isfinite isglobal isgraph ishold isieee isinf iskeyword islist islogical islower ismatrix isna isnan is_nan_or_na isnumeric isprint ispunct isreal isspace isstream isstreamoff isstruct isupper isvarname isxdigit kbhit keyboard kill lasterr lastwarn length lgamma link linspace list load log log10 ls lstat lu mark_as_command mislocked mkdir mkfifo mkstemp mlock more munlock nargin nargout native_float_format ndims nth numel octave_config_info octave_tmp_file_name ones pause pclose permute pipe popen printf __print_symbol_info__ __print_symtab_info__ prod purge_tmp_files putenv puts pwd quit rank readdir readlink read_readline_init_file real rehash rename reshape reverse rmdir rmfield roots round run_history save scanf set shell_cmd show sign sin sinh size sizeof sleep sort source splice sprintf sqrt squeeze sscanf stat str2func streamoff struct struct2cell sum sumsq symlink system tan tanh tilde_expand tmpfile tmpnam toascii __token_count__ tolower toupper type typeinfo uint16 uint32 uint64 uint8 umask undo_string_escapes unlink unmark_command usage usleep va_arg va_start vectorize vertcat vr_val waitpid warning warranty which who whos zeros airy balance besselh besseli besselj besselk bessely betainc chol colloc daspk daspk_options dasrt dasrt_options dassl dassl_options det eig endgrent endpwent expm fft fft2 fftn fftw_wisdom filter find fsolve fsolve_options gammainc gcd getgrent getgrgid getgrnam getpwent getpwnam getpwuid getrusage givens gmtime hess ifft ifft2 ifftn inv inverse kron localtime lpsolve lpsolve_options lsode lsode_options lu max min minmax mktime odessa odessa_options pinv qr quad quad_options qz rand randn schur setgrent setpwent sort sqrtm strftime strptime svd syl time abcddim __abcddims__ acot acoth acsc acsch analdemo anova arch_fit arch_rnd arch_test are arma_rnd asctime asec asech autocor autocov autoreg_matrix axis axis2dlim __axis_label__ bar bartlett bartlett_test base2dec bddemo beep bessel beta beta_cdf betai beta_inv beta_pdf beta_rnd bin2dec bincoeff binomial_cdf binomial_inv binomial_pdf binomial_rnd bitcmp bitget bitset blackman blanks bode bode_bounds __bodquist__ bottom_title bug_report buildssic c2d cart2pol cart2sph cauchy_cdf cauchy_inv cauchy_pdf cauchy_rnd cellidx center chisquare_cdf chisquare_inv chisquare_pdf chisquare_rnd chisquare_test_homogeneity chisquare_test_independence circshift clock cloglog close colormap columns com2str comma common_size commutation_matrix compan complement computer cond contour controldemo conv cor corrcoef cor_test cot coth cov cputime create_set cross csc csch ctime ctrb cut d2c damp dare date dcgain deal deblank dec2base dec2bin dec2hex deconv delete DEMOcontrol demoquat detrend dezero dgkfdemo dgram dhinfdemo diff diffpara dir discrete_cdf discrete_inv discrete_pdf discrete_rnd dkalman dlqe dlqg dlqr dlyap dmr2d dmult dot dre dump_prefs duplication_matrix durbinlevinson empirical_cdf empirical_inv empirical_pdf empirical_rnd erfinv __errcomm__ errorbar __errplot__ etime exponential_cdf exponential_inv exponential_pdf exponential_rnd f_cdf fftconv fftfilt fftshift figure fileparts findstr f_inv fir2sys flipdim fliplr flipud flops f_pdf fractdiff frdemo freqchkw __freqresp__ freqz freqz_plot f_rnd f_test_regression fullfile fv fvl gamma_cdf gammai gamma_inv gamma_pdf gamma_rnd geometric_cdf geometric_inv geometric_pdf geometric_rnd gls gram gray gray2ind grid h2norm h2syn hamming hankel hanning hex2dec hilb hinf_ctr hinfdemo hinfnorm hinfsyn hinfsyn_chk hinfsyn_ric hist hotelling_test hotelling_test_2 housh hsv2rgb hurst hypergeometric_cdf hypergeometric_inv hypergeometric_pdf hypergeometric_rnd image imagesc impulse imshow ind2gray ind2rgb ind2sub index int2str intersection invhilb iqr irr isa is_abcd is_bool is_complex is_controllable isdefinite is_detectable is_dgkf is_digital is_duplicate_entry is_global is_leap_year isletter is_list is_matrix is_observable ispc is_sample is_scalar isscalar is_signal_list is_siso is_square issquare is_stabilizable is_stable isstr is_stream is_struct is_symmetric issymmetric isunix is_vector isvector jet707 kendall kolmogorov_smirnov_cdf kolmogorov_smirnov_test kolmogorov_smirnov_test_2 kruskal_wallis_test krylov krylovb kurtosis laplace_cdf laplace_inv laplace_pdf laplace_rnd lcm lin2mu listidx list_primes loadaudio loadimage log2 logical logistic_cdf logistic_inv logistic_pdf logistic_regression logistic_regression_derivatives logistic_regression_likelihood logistic_rnd logit loglog loglogerr logm lognormal_cdf lognormal_inv lognormal_pdf lognormal_rnd logspace lower lqe lqg lqr lsim ltifr lyap mahalanobis manova mcnemar_test mean meansq median menu mesh meshdom meshgrid minfo mod moddemo moment mplot mu2lin multiplot nargchk nextpow2 nichols norm normal_cdf normal_inv normal_pdf normal_rnd not nper npv ntsc2rgb null num2str nyquist obsv ocean ols oneplot ord2 orth __outlist__ pack packedform packsys parallel paren pascal_cdf pascal_inv pascal_pdf pascal_rnd path periodogram perror place playaudio plot plot_border __plr__ __plr1__ __plr2__ __plt__ __plt1__ __plt2__ __plt2mm__ __plt2mv__ __plt2ss__ __plt2vm__ __plt2vv__ __pltopt__ __pltopt1__ pmt poisson_cdf poisson_inv poisson_pdf poisson_rnd pol2cart polar poly polyder polyderiv polyfit polyinteg polyout polyreduce polyval polyvalm popen2 postpad pow2 ppplot prepad probit prompt prop_test_2 pv pvl pzmap qconj qcoordinate_plot qderiv qderivmat qinv qmult qqplot qtrans qtransv qtransvmat quaternion qzhess qzval randperm range rank ranks rate record rectangle_lw rectangle_sw rem repmat residue rgb2hsv rgb2ind rgb2ntsc rindex rldemo rlocus roots rot90 rotdim rotg rows run_cmd run_count run_test saveaudio saveimage sec sech semicolon semilogx semilogxerr semilogy semilogyerr series setaudio setstr shg shift shiftdim sign_test sinc sinetone sinewave skewness sombrero sortcom spearman spectral_adf spectral_xdf spencer sph2cart split ss ss2sys ss2tf ss2zp stairs starp statistics std stdnormal_cdf stdnormal_inv stdnormal_pdf stdnormal_rnd step __stepimp__ stft str2mat str2num strappend strcat strcmp strerror strjust strrep struct_contains struct_elements studentize sub2ind subplot substr subwindow swap swapcols swaprows sylvester_matrix synthesis sys2fir sys2ss sys2tf sys2zp sysadd sysappend syschnames __syschnamesl__ syschtsam __sysconcat__ sysconnect syscont __syscont_disc__ __sysdefioname__ __sysdefstname__ sysdimensions sysdisc sysdup sysgetsignals sysgettsam sysgettype sysgroup __sysgroupn__ sysidx sysmin sysmult sysout sysprune sysreorder sysrepdemo sysscale syssetsignals syssub sysupdate table t_cdf tempdir tempname texas_lotto tf tf2ss tf2sys __tf2sysl__ tf2zp __tfl__ tfout tic t_inv title toc toeplitz top_title t_pdf trace triangle_lw triangle_sw tril triu t_rnd t_test t_test_2 t_test_regression tzero tzero2 ugain uniform_cdf uniform_inv uniform_pdf uniform_rnd union unix unpacksys unwrap upper u_test values vander var var_test vec vech version vol weibull_cdf weibull_inv weibull_pdf weibull_rnd welch_test wgt1o wiener_rnd wilcoxon_test xlabel xor ylabel yulewalker zgfmul zgfslv zginit __zgpbal__ zgreduce zgrownorm zgscal zgsgiv zgshsr zlabel zp zp2ss __zp2ssg2__ zp2sys zp2tf zpout z_test z_test_2 [+-*\\%=<>&\|!^~] (&&)|(\|\|) (==)|(!=)|(~=)|(<=)|(>=)|(<>)|(\.\.\.) (++)|(--)|(**)|(\.*)|(\.**)|(\.^)|(\./)|(\.') (\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?[ij]? [\(\)\[\]\{\}] "([^\"]*|(\\")|\.)*" [ =(\n]'([^\']*|(\\')|\.)*' '([^\']*|(\\')|\.)*' qtoctave-0.10.1/qtoctave/src/scripts/clc.m0000644000175000017500000000045711511434227017450 0ustar lucaslucas#Clean screen function __qtoctave_clc() fprintf(stderr,"~~ClearScreen\n"); endfunction #dispatch("clc", "__qtoctave_clc", "any"); #dispatch("home", "__qtoctave_clc", "any"); function clc fprintf(stderr,"~~ClearScreen\n"); endfunction function home fprintf(stderr,"~~ClearScreen\n"); endfunction qtoctave-0.10.1/qtoctave/src/scripts/diary.m0000644000175000017500000000270011511434227020010 0ustar lucaslucasfunction __qtoctave_display(varargin) %disp("QtOctave diary"); if(length(varargin)>0) if(strcmp(varargin(1),'on')) fprintf(stderr, "~~Diary: on '%s'\n", pwd); elseif (strcmp(varargin(1),'off')) fprintf(stderr, "~~Diary: off '%s'\n", pwd); else name=sprintf("%s",varargin(1)); if(length( regexp(name, "^/.*") )>=1) % UNIX fprintf( stderr, "~~Diary: file '%s'\n", varargin(1) ); elseif (length( regexp(name, "^.:.*") )>=1) % Windows fprintf( stderr, "~~Diary: file '%s'\n", varargin(1) ); else % Local file fprintf( stderr, "~~Diary: file '%s/%s'\n", pwd, name ); endif endif else fprintf(stderr, "~~Diary: change '%s'\n", pwd); endif endfunction #dispatch("diary", "__qtoctave_display", "all"); #dispatch("diary", "__qtoctave_display", "any"); function diary(varargin) %disp("QtOctave diary"); if(length(varargin)>0) if(strcmp(varargin(1),'on')) fprintf(stderr, "~~Diary: on '%s'\n", pwd); elseif (strcmp(varargin(1),'off')) fprintf(stderr, "~~Diary: off '%s'\n", pwd); else name=sprintf("%s",varargin(1)); if(length( regexp(name, "^/.*") )>=1) % UNIX fprintf( stderr, "~~Diary: file '%s'\n", varargin(1) ); elseif (length( regexp(name, "^.:.*") )>=1) % Windows fprintf( stderr, "~~Diary: file '%s'\n", varargin(1) ); else % Local file fprintf( stderr, "~~Diary: file '%s/%s'\n", pwd, name ); endif endif else fprintf(stderr, "~~Diary: change '%s'\n", pwd); endif endfunction qtoctave-0.10.1/qtoctave/src/dynamic_help/dynamic_help.h0000644000175000017500000000231311511434227022274 0ustar lucaslucas#include "../basewidget.h" #include "../config.h" #include #include #include #include #include #include "../octave_connection.h" /** * If you write a command in Terminal's command line, DynamicHelp shows help of commands. */ class Dynamic_help :public BaseWidget { Q_OBJECT public: Dynamic_help(QString octave_path, QWidget *parent=0); ~Dynamic_help(); /** Sets QLineEdit from keyboard signals are listen. */ void setLineEdit(QLineEdit *lineedit); /**Sets session.*/ void setSession(Session *session); BaseWidget *copyBaseWidget( QWidget * parent = 0 ); private: QTextEdit *textEdit; QCheckBox *stop_help; OctaveConnection *octave; QTime time; QTimer timer; QString input_text, octave_path; /**Listen opened session tools.*/ void listen_tools(WidgetType type); public slots: /** * Shows help when of text. * @param text Text from QLineEdit. */ void textChanged ( const QString & text ); /** Reads and shows Octave output. */ void readyReadStandardOutput (QString line); /** Updates shown help when QLineEdit changes happend. */ void update(); /**New tool to listen.*/ void newTool(WidgetType type, QObject *tool); }; qtoctave-0.10.1/qtoctave/src/dynamic_help/dynamic_help.cpp0000644000175000017500000001106111511434227022627 0ustar lucaslucas#include "dynamic_help.h" #include #include #include #include Dynamic_help::Dynamic_help(QString octave_path, QWidget *parent):BaseWidget(parent) { widget_type=DYNAMIC_HELP; this->octave_path=octave_path; setWindowIcon( QIcon( QString( ICON_PATH )+"/help_index.png" ) ); setWindowTitle("Dynamic Help"); textEdit=new QTextEdit(this); textEdit->show(); textEdit->setReadOnly(true); textEdit->setPlainText("Dynamic help..."); textEdit->setLineWrapMode (QTextEdit::NoWrap); stop_help =new QCheckBox("Stop dynamic help", this); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(textEdit); layout->addWidget(stop_help); centralWidget()->setLayout(layout); octave=new OctaveConnection(this); octave->setOctavePath(octave_path); octave-> startOctave(true); /* QString command; QTextStream(&command) << "function ayuda(s)\n" << "a=[completion_matches(s)];\n" << "len=columns(s);\n" << "s=strcat(s,blanks(columns(a)-columns(s)));\n" << "ok=0;\n" << "if (rows(a)==1)\n" << " help(s(1,1:len))\n" << "end\n" << "for i=1:rows(a)-1\n" << " for j=1:columns(a)\n" << " if(a(i,j)==0)\n" << " a(i,j)=32;\n" << " end\n" << " end\n" << " if(1==strcmp(a(i,:),s))\n" << " help(s(1,1:len))\n" << " ok=1;\n" << " end\n" << "end\n" << "if(ok==0)\n" << " completion_matches(s);\n" << "end\n" << "end\n"; octave->write(command.toLocal8Bit()); */ QString command; QTextStream(&command) << "function ayuda(s)\n" << " printf(\"Completion matches:\\n\");\n" << " completion_matches(s)\n" << " printf(\"\\n\");\n" << " help(s);\n" << "end\n"; octave->command_enter(command.toLocal8Bit()); //textEdit->setPlainText(command); connect(octave,SIGNAL(output_ready (QString )),this,SLOT(readyReadStandardOutput (QString))); time.start(); timer.setSingleShot(true); connect(&timer,SIGNAL( timeout ()),this, SLOT(update()) ); setAttribute(Qt::WA_DeleteOnClose); textEdit->clear(); } void Dynamic_help::setLineEdit(QLineEdit *lineedit) { connect( lineedit, SIGNAL( textChanged ( const QString &) ) , this, SLOT( textChanged ( const QString &) ) ); } void Dynamic_help::update() { textChanged(input_text); } void Dynamic_help::textChanged ( const QString & text ) { if(text.length()<2 || stop_help->checkState()==Qt::Checked) return; if( time.elapsed()< 1000) { input_text=text; timer.start(1000); return; } time.start(); int separator,pos=-1; input_text=text.trimmed(); separator=input_text.indexOf(" "); if(separator>-1 && separator-1 && separator-1 && separator-1 && separator0)input_text.truncate(pos); QString command; QTextStream(&command) << "ayuda(\"" << input_text << "\")\n"; octave->command_enter(command.toLocal8Bit()); textEdit->clear(); textEdit->insertHtml("Results for "+input_text+":
\n"); } void Dynamic_help::readyReadStandardOutput (QString out) { QTextCursor cursor=textEdit->textCursor(); cursor.movePosition(QTextCursor::End); textEdit->setTextCursor( cursor ); textEdit->insertPlainText(out); cursor.movePosition(QTextCursor::Start); textEdit->setTextCursor( cursor ); } Dynamic_help::~Dynamic_help() { octave->command_enter(QString("quit\n").toLocal8Bit()); octave->kill(); //while( octave->state()!=QProcess::NotRunning ) ; delete octave; delete stop_help; delete textEdit; } void Dynamic_help::setSession(Session *session) { BaseWidget::setSession(session); connect(session, SIGNAL(newTool(WidgetType, QObject *)), this, SLOT(newTool(WidgetType, QObject *))); //Listen tools listen_tools(TERMINAL); listen_tools(HELP); listen_tools(EDITOR); } void Dynamic_help::listen_tools(WidgetType type) { QVector tools=session->getTools(type); for(int i=0;isetSession(session); bw->textEdit->setHtml(textEdit->toHtml()); return bw; } qtoctave-0.10.1/qtoctave/src/menus/menus.ts0000644000175000017500000000607011511434227017665 0ustar lucaslucas UTF-8 Analysis Análisis Equations Ecuaciones Integrate function Integrar función Ordinary Differential Equations Ecuaciones diferenciales ordinarias Export Exportar Solve equation by bisection method Método de la bisección Linear equation Ecuación lineal Nonlinear equation Ecuación no linear Ordinary Differential Equations by Euler method Ecuaciones diferenciales por el método de Euler Integrate Function Easy Integración sencilla de la función Integrate Function Integrar función Simpson Simpson Load matrix from file Cargar matriz desde fichero Save matrix to file Guardar matriz en un fichero Format of the displayed output Formato de salida PDF PDF PNG PNG EPS EPS qtoctave-0.10.1/qtoctave/src/lang/qtoctave_pl.ts0000644000175000017500000021522711511434226020656 0ustar lucaslucas UTF-8 BaseWidget View Widok Show outside of main window Wyświetl poza głównym oknem Show inside of main window Wyświetl w głównym oknie Add to... Dodaj do... ClipboardListView Edit Edytuj Delete entry Usuń wpis Delete all Usuń wszystkie Sort ascending Sortuj rosnąco Sort descending Sortuj malejąco Up W górę Down W dół Top Początek Bottom Koniec Stop append Zatrzymaj dodawanie Stops append text from clipboard Zatrzymuje dodawanie tekstu ze schowka CodeEdit Undo Cofnij Redo Przywróć Cut Wytnij Copy Kopiuj Paste Wklej Delete Usuń Select all Zaznacz wszystko Toggle breakpoint Ustaw punkt wstrzymania CommandList Copy Kopiuj Clean history Wyczyść historię Right click to see menu Kliknij prawym przyciskiem, aby wyświetlić menu Command List Lista poleceń Commands' List Listy poleceń Editor Editor Edytor New Nowy Ctrl+N Ctrl+N Open Otwórz Ctrl+O Ctrl+O Save Zapisz Ctrl+S Ctrl+S Save as Zapisz jako Close tab Zamknij kartę Run Uruchom F5 F5 Debug Odpluskwiaj Next line Następna linia Send to Octave Wyślij do Octave Undo Cofnij Ctrl+Z Ctrl+Z Redo Przywróć Ctrl+Shift+Z Ctrl+Shift+Z Cut Wytnij Ctrl+X Ctrl+X Copy Kopiuj Ctrl+C Ctrl+C Paste Wklej Ctrl+V Ctrl+V Search and replace Znajdź i zamień Ctrl+F Ctrl+F Error Błąd You must save the file first Musisz najpierw zapisać plik Close this window? Zamknąć to okno? You are going to close Editor. Are you sure? Zamierzasz zamknąć edytor. Jesteś pewien? Close Zamknij The file has been modified. Save changes? Plik został zmodyfikowany. Zapisać zmiany? Print Document Wydrukuj dokument Options Opcje Editor Options Opcje Edytora File Plik Print Drukuj Edit Edytuj Tools Narzędzia Indent Wcięcie Unindent Cofnij wcięcie Comment Zakomentuj Uncomment Odkomentuj Config Konfiguracja File list Lista plików Small Clipboard Mały schowek Empty Pusty Can not be saved Nie można zapisać can not be saved nie można zapisać Show/Hide Objects Pokaż/ukryj obiekty ExportToDialog Export to... Eksportuj do... Select format: Wybierz format: OK OK Cancel Anuluj FileActions Processing files... Przetwarzanie plików... Starting process... Uruchamianie procesu... Cancel Anuluj FileEdit File... Plik... Choose a file Wybierz plik GeneralMenu General Menu Menu główne Terminal Terminal Font: Czcionka: TextLabel TextLabel Select Font Wybierz czcionkę Color: Kolor: QtOctave Terminal example Przykładowy terminal QtOctave Error example Przykład błędu Error Błąd Background Tło Foreground Kolor Maximum number of lines in terminal: Maksymalna liczba linii w terminalu: Max number of columns in terminal: Maksymalna liczba kolumn w terminalu: Editor Edytor Use external editor Użyj zewnętrznego edytora External editor Zewnętrzny edytor Select... Wybierz... Internal Editor Wewnętrzny edytor Font Czcionka Automatic indention Automatyczne wcięcia No indention Bez wcięć <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Automatic indention for while, if, for, switch, do and try statements.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Automatyczne wcięcia dla while, if, for, switch, do i try. </p></body></html> Automatic indention for statements Automatyczne wcięcia przy słowach kluczowych Other features Inne cechy Syntax highlighting Kolorowanie składni <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Brackets pair are iluminated when cursor is over one of them.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pary nawiasów są podświetlane, gdy kursor jest nad jednym z nich </p></body></html> Brackets match Dopasowanie nawiasów <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">When the user starts typing a word, it suggests possible ways of completing the word.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Kiedy użytkownik zaczyna pisać słowo, wyświetla możliwości jego uzupełnienia. </p></body></html> Auto-completion Autouzupełnianie Simple RCS (Revision Control System) Prosty system kontroli wersji (RCS) Octave Octave Octave Path Ścieżka Octave Octave arguments Argumenty Octave Folders: Katalogi: Add Dodaj Delete Usuń Easy Plot Easy Plot Use Easy Plot Użyj Easy Plot Easy Plot Path: Scieżka do Easy Plot: Help Pomoc Help path Ścieżka Pomocy OK OK Cancel Anuluj General_Menu Open File Otwórz plik Help &Back &Wstecz &Forward &Dalej &Go home Katalog &domowy Help Pomoc Navigation Nawigacja Main Select table Wybierz tabelę Matrix name: Nazwa macierzy: Open Otwórz QtOctave About Acerca de QtOctave MainWindow Name for layout Nazwa układu Name: Nazwa: Delete windows' layout Usuń układ okien Delete Usuń Cancel Anuluj Close Zamknij You are going to close all QtOctave's windows. Are you sure? Zamierzasz zamknąć wszystkie okna QtOctave. Jesteś pewien? Octave is saving data. Press ok at end. Octave zapisuje dane. Kliknij OK po zakończeniu. Your changes will have effect, when QtOctave reboot. Do you want to do it? Zmiany zostaną zastosowane po ponownym uruchomieniu QtOctave.¿Uruchomić ponownie? Command List Lista komend Change Directory Zmień katalog Quit Wyjdź Histogram Histogram Error Bars Słupki błędów Bar graph Wykres słupkowy Plot of three-dimensional surface Wykres powierzchni trójwymiarowej Contour plot of three-dimensional surface Wykres konturowy trójwymiarowej powierzchni Terminal Run Uruchom terminal Matrix Macierz Help Pomoc Docks Docki QtOctave Help Pomoc QtOctave About O programie Show/Hide Objects Pokaż/Ukryj obiekty A**n Exponential A**n wykładniczo MenuExtCallBack Input Parameters Parametry wejściowe Output Parameters Parametry wyjściowe Ok OK Copy to clipboard Kopiuj do schowka Cancel Anuluj Help Pomoc Blank parameter Parametr nieustawiony There are blank parameters. Please fill all fields. Są nieustawione parametry. Wypełnij wszystkie pola. Navigator &New folder &Nowy folder salir Wyjdź Cu&t Wy&tnij &Copy &Kopiuj &Paste &Wklej &Back Wstec&z &Forward &Dalej Up W górę Delete file Usuń plik Rename Zmień nazwę Go Idź Filters: Filtry: New Folder Nowy katalog Name: Nazwa: Remove file Usuń plik Remove selected files? Usunąć zaznaczone pliki? Navigator Nawigator Navigation tools Narzędzia nawigacyjne NewProjectDialog New Project Nowy projekt Name: Nazwa: Description: Opis: NumberBar Stop Here Zatrzymaj tutaj Current Line Bieżąca linia Error Line Błędna linia OctaveConnection Octave crashed Octave nieoczekiwanie zakończył działanie Octave has crashed. Restarting... Octave nieoczekiwanie zakończył działanie. Ponowne uruchamianie... Octave finished Octave się zakończył Octave has finished. Restarting... Octave się zakończył. Ponowne uruchamianie... Warning Ostrzeżenie QtOctave requires Octave version 2.9.9 or better. You can select your Octave executable in Config/General Configuration/Octave/Octave Path Your version is: QtOctave wymaga Octave w wersji 2.9.9 lub wyższej. Możesz wybrać plik wykonywalny Octave w Konfiguracja / Ogólna konfiguracja / Octave / Katalog Octave Twoja wersja to: QtOctave in: QtOctave w: Couldn't be opened. Nie można otworzyć. Plot It should be a column vector. Tutaj powinien być wektor kolumny. Line style Styl linii None Brak Lines Linie Dots Kropki Points Punkty Lines and points Linie i punkty Impulses Impulsy Steps Stopnie Boxes Kwadraty Error bars Słupki błędów Box error bars Prostokątne słupki błędów Color Kolor Red Czerwony Green Zielony Blue Niebieski Magenta Karmazynowy Cyan Cyjan White Biały Point style Styl punktu + + * * o o x x title: tytuł: Add Dodaj Remove Usuń Ok OK Copy to clipboard Kopiuj do schowka Cancel Anuluj Projects New Project Nowy projekt Modify Project Modyfikuj projekt Delete Project Usuń projekt QApplication Run an Octave Script Uruchom jako skrypt Octave Octave Help Pomoc Octave Table Tablica Editor Edytor Projects Projekty <b>Completion matches:</b><br> Generates possible completions given in comand line. <b>Dopasowania przy uzupełnianiu</b><br>Tworzy możliwe uzupełnienia w linii komend. Dynamic Help: Shows help of completions matches. Dynamiczna pomoc: Pokazuje pomoc wyników dopasowania. <b>Stops process:</b><br>Stops uncontroled process, infinite loops,... <b>Zatrzymaj proces:</b><br>Zatrzymuje niekontrolowane procesy, nieskończone pętle... Clear terminal Wyczyść terminal Variable List Lista zmiennych Navigator Nawigator Save actual windows layout Zapisz aktualny rozkład okien Delete some windows layout Usuń zapisany rozkład okien Inverse Odwróć Determinant Determinant Eigenvalues and eigenvectors Wartości i wektory własne Transpose Transpozycja Submatrix Podmacierz Mean Średnia Median Mediana Standard Deviation Odchylenie standardowe Covariance Kowariancja Correlation Coefficient Współczynnik korelacji Plot Wykres Polar Biegunowy Log scale for the y axis Skala logarytmiczna dla osi Y Log scale for the x axis Skala logarytmiczna dla osi X Log scale for the x and y axis Skala logarytmiczna dla osi X i Y Axis scale Skala osi Title and labels Tytuł i etykiety Svg Canvas Obraz SVG General configuration Ogólna konfiguracja File Plik Help Pomoc Data Dane Matrix Macierz Tools Narzędzia Statistics Statystyka 2D... 2D... Config Konfiguracja View Widok Dock Tools Narzędzia podręczne Windows Layout Układ okien Export to... Eksportuj do... SearchDialog Search and replace Znajdź i zamień Search Znajdź Regular expression Wyrażenie regularne Replace Zamień Options Opcje Case sensitive Nie ignoruj wielkości liter Only full words Tylko pełne słowa From cursor Od kursora Cancel Anuluj Session Empty Pusty SvgCanvas Width Szerokość Width: Szerokość: Height Wysokość Height: Wysokość: Save File Zapisz plik *.svg *.svg Table <b>Reload matrix.</b><br> Some operations change matrix, use reload to view changes. <b>Wczytaj macierz ponownie.</b><br>Macierz została zmodyfikowana. Wczytaj ponownie, by obejrzeć zmiany. Table Tablica Copy Kopiuj Copy as Octave matrix Kopiuj jako macierz Octave Paste Wklej Delete rows Usuń wiersze Delete columns Usuń kolumny Plot Wykres 2D 2D Polar Biegunowy Log scale for the x and y axis Skala logarytmiczna dla osi X i Y Log scale for the y axis Skala logarytmiczna dla osi Y Log scale for the x axis Skala logarytmiczna dla osi X Bar graph Wykres słupkowy Warning Ostrzeżenie Comlumns will be deleted. Continue? Kolumny zostaną usunięte. Kontynuować? Rows will be deleted. Continue? Wiersze zostaną usunięte. Kontynuować? Error Błąd TableForm Table Tablica Cols Kolumny Rows Wiersze Change Order Zmień kolejność TablePlot Title Tytuł Use columns or rows Użyj kolumn lub wierszy Columns Kolumny Rows Wiersze x X y Y Angle Kąt Radio ? Promień x Error Błąd X y Error Błąd Y Style Styl Line style Styl linii None Brak Lines Linie Dots Kropki Points Punkty Lines and points Linie i punkty Impulses Impulsy Steps Stopnie Boxes Kwadraty Error bars Słupki błędów Box error bars Kwadratowe słupki błędów Color Kolor Red Czerwony Green Zielony Blue Niebieski Magenta Karmazynowy Cyan Cyjanowy White Biały Point style Styl punktu + + * * o o Ok OK Cancel Anuluj Terminal Insert your commands here... Wprowadź polecenia... Insert your commands here. Use arrows and tab key to commands navigation. Wprowadź polecenia. Użyj kursorów i tabulacji do nawigacji. Octave Terminal Terminal Octave Ui_Projects Projects Projekty Available Projects: Dostępne projekty: Open Otwórz Cancel Anuluj VariableList Edit Edytuj Clear Wyczyść Save to file Zapisz do pliku Reload variables' list Ponownie załaduj listę zmiennych Name Nazwa Size Rozmiar Bytes Bajtów Class Klasa Local user variables Lokalne zmienne użytkownika Functions Funkcje Variable list Lista zmiennych Variables' List Lista zmiennych qtoctave-0.10.1/qtoctave/src/lang/qtoctave.qph0000644000175000017500000012422511511434226020322 0ustar lucaslucas View Ver Show outside of main window Mostrar fora da xanela principal Show inside of main window Mostrar dentro da xanela principal Add to... Engadir a... Edit Editar Delete entry Eliminar entrada Delete all Eliminar todo Sort ascending Orde ascendente Sort descending Orde descendente Up Subir Down Descender Top Arriba Bottom Abaixo Stop append Parar engadido Stops append text from clipboard Parar engadido de texto dende o portapapeis Undo Desfacer Redo Refacer Cut Cortar Copy Copiar Paste Pegar Delete Borrar Select all Seleccionar todo Toggle breakpoint Alternar punto de interrupción Copy Copiar Clean history Limpar o historial Right click to see menu Clic co boton dereito para ver o menú Command List Lista de ordes Commands' List Lista de ordes Editor Editor New Novo Ctrl+N Ctrl+N Open Abrir Ctrl+O Ctrl+O Save Gardar Ctrl+S Ctrl+S Save as Gardar como Close tab Pechar o separador Run Executar F5 F5 Debug Depurar Next line Seguinte liña Send to Octave Enviar ao Octave Undo Desfacer Ctrl+Z Ctrl+Z Redo Refacer Ctrl+Shift+Z Ctrl+Shift+Z Cut Cortar Ctrl+X Ctrl+X Copy Copiar Ctrl+C Ctrl+C Paste Pegar Ctrl+V Ctrl+V Search and replace Buscar e substituír Ctrl+F Ctrl+F Error Erro You must save the file first Debe gardar o ficheiro primeiro Close this window? Quere pechar esta xanela? You are going to close Editor. Are you sure? Vai a pechar o editor. Está seguro? Close Pechar The file has been modified. Save changes? Modificouse o ficheiro. Gardar modificacións? Print Document Imprimir o documento Options Opcións Editor Options Opcións do editor File Ficheiro Print Imprimir Edit Editar Tools Ferramentas Indent Sangría Unindent Eliminar a sangría Comment Comentar Uncomment Descomentar Config Configuración File list Lista de ficheiros Small Clipboard Portapapeis pequeno Empty Baleiro Can not be saved Non é posíbel gardar can not be saved non é posíbel gardar Show/Hide Objects Mostrar/Ocultar os obxectos Export to... Exportar a... Select format: Seleccionar formato: OK Aceptar Cancel Cancelar Processing files... Procesando os ficheiros... Starting process... Comezando proceso... Cancel Cancelar File... Ficheiro... Choose a file Escoller un ficheiro General Menu Menú xeral Terminal Terminal Font: Tipo de letra: TextLabel Etiqueta de texto Select Font Seleccionar tipo de letra Color: Cor: QtOctave Terminal example Exemplo da terminal do QtOctave Error example Erro de exemplo Error Erro Background Fondo Foreground Primeiro plano Maximum number of lines in terminal: Número máximo de liñas na terminal: Max number of columns in terminal: Número máximo de columnas na terminal: Editor Editor Use external editor Empregar editor externo External editor Editor externo Select... Seleccionar... Internal Editor Editor interno Font Tipo de letra Automatic indention Indentado automático No indention Sen indentación <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Automatic indention for while, if, for, switch, do and try statements.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indentación automática para as declaracións while, if, for, switch, do e try.</p></body></html> Automatic indention for statements Indentación automática para as declaracións Other features Outras funcionalidades Syntax highlighting Realzado de sintaxe <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Brackets pair are iluminated when cursor is over one of them.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Os pares de corchetes resáltanse cando o cursor está sobre eles.</p></body></html> Brackets match Coincidencia de parénteses <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">When the user starts typing a word, it suggests possible ways of completing the word.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CAndo o usuario comeza a escribir, suxírenselle varias formas de completar a palabra.</p></body></html> Auto-completion Autocompletado Simple RCS (Revision Control System) RCS Simple (Sistema de Control de Revisións) Octave Octave Octave Path Camiño do Octave Octave arguments Argumentos do Octave Folders: Cartafoles: Add Engadir Delete Borrar Easy Plot Easy Plot Use Easy Plot Empregar Easy Plot Easy Plot Path: Camiño do Easy Plot: Help Axuda Help path Camiño da axuda OK Aceptar Cancel Cancelar Open File Abrir ficheiro &Back &Retroceder &Forward &Avanzar &Go home Ir ao &inicio Help Axuda Navigation Navegación Select table Seleccionar táboa Matrix name: Nome da matriz: Open Abrir QtOctave About Sobre QtOctave Name for layout Nome para o deseño Name: Nome: Delete windows' layout Eliminar disposición de xanelas Delete Borrar Cancel Cancelar Close Pechar You are going to close all QtOctave's windows. Are you sure? Vai a pechar todas as xanelas do QtOctave. Está seguro? Octave is saving data. Press ok at end. Octave está gardando información. Prema Aceptar ao rematar. Your changes will have effect, when QtOctave reboot. Do you want to do it? Os seus cambios terán efecto ao reiniciar QtOctave. Quere facelo agora? Command List Lista de ordes Change Directory Cambiar cartafol Quit Saír Histogram Histograma Error Bars Barras de erro Bar graph Gráfica de barras Plot of three-dimensional surface Gráfica de superficie en tres dimensións Contour plot of three-dimensional surface Gráfica do contorno da superficie en tres dimensións Terminal Run Executar a terminal Matrix Matriz Help Axuda Docks Docks QtOctave Help Axuda do QtOctave About Sobre Show/Hide Objects Mostrar/Ocultar os obxectos A**n Exponential A**n Exponencial Input Parameters Parámetros de entrada Output Parameters Parámetros de saída Ok Aceptar Copy to clipboard Copiar ao portapapeis Cancel Cancelar Help Axuda Blank parameter Parámetro en branco There are blank parameters. Please fill all fields. Hai parámetros en branco. Complete todos os campos. &New folder &Novo cartafol salir saír Cu&t Cor&tar &Copy &Copiar &Paste &Pegar &Back &Retroceder &Forward &Avanzar Up Subir Delete file Borrar o ficheiro Rename Renomear Go Ir Filters: Filtros: New Folder Novo cartafol Name: Nome: Remove file Eliminar ficheiro Remove selected files? Eliminar os ficheiros seleccionados? Navigator Navegador Navigation tools Ferramentas de navegación New Project Novo proxecto Name: Nome: Description: Descrición: Stop Here Deter aquí Current Line Liña actual Error Line Liña de erro Octave crashed Fallou o Octave Octave has crashed. Restarting... Fallou o Octave. Reiniciando... Octave finished Terminou o Octave Octave has finished. Restarting... Terminou o Octave. Reiniciando... Warning Aviso QtOctave requires Octave version 2.9.9 or better. You can select your Octave executable in Config/General Configuration/Octave/Octave Path Your version is: QtOctave require Octave 2.9.9 ou superior. Pode seleccionar o executábel do Octave en Configuración/Configuracións Xerais/Octave/Camiño o Octave A súa versión é: QtOctave in: QtOctave en: Couldn't be opened. Non foi posíbel abrir. It should be a column vector. Debería ser un vector columna. Line style Estilo da liña None Ningún Lines Liñas Dots Puntos Points Puntos Lines and points Liñas e puntos Impulses Impulsos Steps Pasos Boxes Caixas Error bars Barras de erro Box error bars Box error bars Color Cor Red Vermello Green Verde Blue Azul Magenta Fucsia Cyan Cian White Branco Point style Estilo de punto + + * * o o x x title: título: Add Engadir Remove Eliminar Ok Aceptar Copy to clipboard Copiar ao portapapeis Cancel Cancelar New Project Novo proxecto Modify Project Modificar o proxecto Delete Project Borrar o proxecto Run an Octave Script Executar un script do Octave Octave Help Axuda do Octave Table Táboa Editor Editor Projects Proxectos <b>Completion matches:</b><br> Generates possible completions given in comand line. <b>Completado de coincidencias:</b><br> Xenera completados posibles dada unha liña de ordes. Dynamic Help: Shows help of completions matches. Axuda dinámica: Mostra a axuda das coincidencias de completado. <b>Stops process:</b><br>Stops uncontroled process, infinite loops,... <b>Detén o proceso:</b><br>Deten procesos non controlados, bucles infinitos,... Clear terminal Limpar a terminal Variable List Lista de variábeis Navigator Navegador Save actual windows layout Gardar a disposición de xanelas actual Delete some windows layout Eliminar algunha disposición de fiestras Inverse Inversa Determinant Determinante Eigenvalues and eigenvectors Vector propio e valor propio Transpose Traspor Submatrix Submatriz Mean Media Median Mediana Standard Deviation Desviación estándar Covariance Covarianza Correlation Coefficient Coeficiente de correlación Plot Gráfica Polar Polar Log scale for the y axis Escala logarítmica para o eixe Y Log scale for the x axis Escala logarítmica para o eixe X Log scale for the x and y axis Escala logarítmica para os eixes X e Y Axis scale Escala de eixos Title and labels Título e etiquetas Svg Canvas Canvas Svg General configuration Configuración xeral File Ficheiro Help Axuda Data Datos Matrix Matriz Tools Ferramentas Statistics Estatísticas 2D... 2D... Config Configuración View Ver Dock Tools Dock Tools Windows Layout Disposición das xanelas Export to... Exportar a... Search and replace Buscar e substituír Search Buscar Regular expression Expresión regular Replace Substituír Options Opcións Case sensitive Diferenciar maiúsculas de minúsculas Only full words Só palabras enteiras From cursor Desde o cursor Cancel Cancelar Empty Baleiro Width Largura Width: Largura: Height Altura Height: Altura: Save File Gardar ficheiro *.svg *.svg <b>Reload matrix.</b><br> Some operations change matrix, use reload to view changes. <b>Recargar matriz.</b><br> Algunhas operacións cambian a matriz, empregue recargar para ver os cambios. Table Táboa Copy Copiar Copy as Octave matrix Copiar como matriz do Octave Paste Pegar Delete rows Borrar filas Delete columns Borrar columnas Plot Gráfica 2D 2D Polar Polar Log scale for the x and y axis Escala logarítmica para os eixes X e Y Log scale for the y axis Escala logarítmica para o eixe Y Log scale for the x axis Escala logarítmica para o eixe X Bar graph Gráfica de barras Warning Aviso Comlumns will be deleted. Continue? Borraranse as columnas. Continuar? Rows will be deleted. Continue? Borraranse as filas. Continuar? Error Erro Table Táboa Cols Columnas Rows Filas Change Order Modificar orde Title Título Use columns or rows Empregar columnas ou filas Columns Columnas Rows Filas x x y y Angle Ángulo Radio Radio x Error Erro X y Error Erro Y Style Estilo Line style Estilo da liña None Ningún Lines Liñas Dots Puntos Points Puntos Lines and points Liñas e puntos Impulses Impulsos Steps Pasos Boxes Caixas Error bars Barras de erro Box error bars Box error bars Color Cor Red Vermello Green Verde Blue Azul Magenta Fucsia Cyan Cian White Branco Point style Estilo de punto + + * * o o Ok Aceptar Cancel Cancelar Insert your commands here... Insira as súas ordes aquí... Insert your commands here. Use arrows and tab key to commands navigation. Insira as súas ordes aquí. Empregue as teclas de frechas e tabulador coma ordes de navegación. Octave Terminal Terminal do Octave Projects Proxectos Available Projects: Proxectos dispoñíbeis: Open Abrir Cancel Cancelar Edit Editar Clear Limpar Save to file Gardar nun ficheiro Reload variables' list Recargar a lista de variábeis Name Nome Size Tamaño Bytes Bytes Class Clase Local user variables Variábeis locais do usuario Functions Funcións Variable list Lista de variábeis Variables' List Lista de variábeis qtoctave-0.10.1/qtoctave/src/lang/qtoctave_gl_ES.ts0000644000175000017500000021555311511434226021236 0ustar lucaslucas UTF-8 BaseWidget View Ver Show outside of main window Mostrar fora da xanela principal Show inside of main window Mostrar dentro da xanela principal Add to... Engadir a... ClipboardListView Edit Editar Delete entry Eliminar entrada Delete all Eliminar todo Sort ascending Orde ascendente Sort descending Orde descendente Up Subir Down Descender Top Arriba Bottom Abaixo Stop append Parar engadido Stops append text from clipboard Parar engadido de texto dende o portapapeis CodeEdit Undo Desfacer Redo Refacer Cut Cortar Copy Copiar Paste Pegar Delete Borrar Select all Seleccionar todo Toggle breakpoint Alternar punto de interrupción CommandList Copy Copiar Clean history Limpar o historial Right click to see menu Clic co boton dereito para ver o menú Command List Lista de ordes Commands' List Lista de ordes Editor Editor Editor New Novo Ctrl+N Ctrl+N Open Abrir Ctrl+O Ctrl+O Save Gardar Ctrl+S Ctrl+S Save as Gardar como Close tab Pechar o separador Run Executar F5 F5 Debug Depurar Next line Seguinte liña Send to Octave Enviar ao Octave Undo Desfacer Ctrl+Z Ctrl+Z Redo Refacer Ctrl+Shift+Z Ctrl+Shift+Z Cut Cortar Ctrl+X Ctrl+X Copy Copiar Ctrl+C Ctrl+C Paste Pegar Ctrl+V Ctrl+V Search and replace Buscar e substituír Ctrl+F Ctrl+F Error Erro You must save the file first Debe gardar o ficheiro primeiro Close this window? Quere pechar esta xanela? You are going to close Editor. Are you sure? Vai a pechar o editor. Está seguro? Close Pechar The file has been modified. Save changes? Modificouse o ficheiro. Gardar modificacións? Print Document Imprimir o documento Options Opcións Editor Options Opcións do editor File Ficheiro Print Imprimir Edit Editar Tools Ferramentas Indent Sangría Unindent Eliminar a sangría Comment Comentar Uncomment Descomentar Config Configuración File list Lista de ficheiros Small Clipboard Portapapeis pequeno Empty Baleiro Can not be saved Non é posíbel gardar can not be saved non é posíbel gardar Show/Hide Objects Mostrar/Ocultar os obxectos ExportToDialog Export to... Exportar a... Select format: Seleccionar formato: OK Aceptar Cancel Cancelar FileActions Processing files... Procesando os ficheiros... Starting process... Comezando proceso... Cancel Cancelar FileEdit File... Ficheiro... Choose a file Escoller un ficheiro GeneralMenu General Menu Menú xeral Terminal Terminal Font: Tipo de letra: TextLabel Etiqueta de texto Select Font Seleccionar tipo de letra Color: Cor: QtOctave Terminal example Exemplo da terminal do QtOctave Error example Erro de exemplo Error Erro Background Fondo Foreground Primeiro plano Maximum number of lines in terminal: Número máximo de liñas na terminal: Max number of columns in terminal: Número máximo de columnas na terminal: Editor Editor Use external editor Empregar editor externo External editor Editor externo Select... Seleccionar... Internal Editor Editor interno Font Tipo de letra Automatic indention Indentado automático No indention Sen indentación <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Automatic indention for while, if, for, switch, do and try statements.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indentación automática para as declaracións while, if, for, switch, do e try.</p></body></html> Automatic indention for statements Indentación automática para as declaracións Other features Outras funcionalidades Syntax highlighting Realzado de sintaxe <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Brackets pair are iluminated when cursor is over one of them.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Os pares de corchetes resáltanse cando o cursor está sobre eles.</p></body></html> Brackets match Coincidencia de parénteses <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">When the user starts typing a word, it suggests possible ways of completing the word.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CAndo o usuario comeza a escribir, suxírenselle varias formas de completar a palabra.</p></body></html> Auto-completion Autocompletado Simple RCS (Revision Control System) RCS Simple (Sistema de Control de Revisións) Octave Octave Octave Path Camiño do Octave Octave arguments Argumentos do Octave Folders: Cartafoles: Add Engadir Delete Borrar Easy Plot Easy Plot Use Easy Plot Empregar Easy Plot Easy Plot Path: Camiño do Easy Plot: Help Axuda Help path Camiño da axuda OK Aceptar Cancel Cancelar General_Menu Open File Abrir ficheiro Help &Back &Retroceder &Forward &Avanzar &Go home Ir ao &inicio Help Axuda Navigation Navegación Main Select table Seleccionar táboa Matrix name: Nome da matriz: Open Abrir QtOctave About Sobre QtOctave MainWindow Name for layout Nome para o deseño Name: Nome: Delete windows' layout Eliminar disposición de xanelas Delete Borrar Cancel Cancelar Close Pechar You are going to close all QtOctave's windows. Are you sure? Vai a pechar todas as xanelas do QtOctave. Está seguro? Octave is saving data. Press ok at end. Octave está gardando información. Prema Aceptar ao rematar. Your changes will have effect, when QtOctave reboot. Do you want to do it? Os seus cambios terán efecto ao reiniciar QtOctave. Quere facelo agora? Command List Lista de ordes Change Directory Cambiar cartafol Quit Saír Histogram Histograma Error Bars Barras de erro Bar graph Gráfica de barras Plot of three-dimensional surface Gráfica de superficie en tres dimensións Contour plot of three-dimensional surface Gráfica do contorno da superficie en tres dimensións Terminal Run Executar a terminal Matrix Matriz Help Axuda Docks Docks QtOctave Help Axuda do QtOctave About Sobre Show/Hide Objects Mostrar/Ocultar os obxectos A**n Exponential A**n Exponencial MenuExtCallBack Input Parameters Parámetros de entrada Output Parameters Parámetros de saída Ok Aceptar Copy to clipboard Copiar ao portapapeis Cancel Cancelar Help Axuda Blank parameter Parámetro en branco There are blank parameters. Please fill all fields. Hai parámetros en branco. Complete todos os campos. Navigator &New folder &Novo cartafol salir saír Cu&t Cor&tar &Copy &Copiar &Paste &Pegar &Back &Retroceder &Forward &Avanzar Up Subir Delete file Borrar o ficheiro Rename Renomear Go Ir Filters: Filtros: New Folder Novo cartafol Name: Nome: Remove file Eliminar ficheiro Remove selected files? Eliminar os ficheiros seleccionados? Navigator Navegador Navigation tools Ferramentas de navegación NewProjectDialog New Project Novo proxecto Name: Nome: Description: Descrición: NumberBar Stop Here Deter aquí Current Line Liña actual Error Line Liña de erro OctaveConnection Octave crashed Fallou o Octave Octave has crashed. Restarting... Fallou o Octave. Reiniciando... Octave finished Terminou o Octave Octave has finished. Restarting... Terminou o Octave. Reiniciando... Warning Aviso QtOctave requires Octave version 2.9.9 or better. You can select your Octave executable in Config/General Configuration/Octave/Octave Path Your version is: QtOctave require Octave 2.9.9 ou superior. Pode seleccionar o executábel do Octave en Configuración/Configuracións Xerais/Octave/Camiño o Octave A súa versión é: QtOctave in: QtOctave en: Couldn't be opened. Non foi posíbel abrir. Plot It should be a column vector. Debería ser un vector columna. Line style Estilo da liña None Ningún Lines Liñas Dots Puntos Points Puntos Lines and points Liñas e puntos Impulses Impulsos Steps Pasos Boxes Caixas Error bars Barras de erro Box error bars Box error bars Color Cor Red Vermello Green Verde Blue Azul Magenta Fucsia Cyan Cian White Branco Point style Estilo de punto + + * * o o x x title: título: Add Engadir Remove Eliminar Ok Aceptar Copy to clipboard Copiar ao portapapeis Cancel Cancelar Projects New Project Novo proxecto Modify Project Modificar o proxecto Delete Project Borrar o proxecto QApplication Run an Octave Script Executar un script do Octave Octave Help Axuda do Octave Table Táboa Editor Editor Projects Proxectos <b>Completion matches:</b><br> Generates possible completions given in comand line. <b>Completado de coincidencias:</b><br> Xenera completados posibles dada unha liña de ordes. Dynamic Help: Shows help of completions matches. Axuda dinámica: Mostra a axuda das coincidencias de completado. <b>Stops process:</b><br>Stops uncontroled process, infinite loops,... <b>Detén o proceso:</b><br>Deten procesos non controlados, bucles infinitos,... Clear terminal Limpar a terminal Variable List Lista de variábeis Navigator Navegador Save actual windows layout Gardar a disposición de xanelas actual Delete some windows layout Eliminar algunha disposición de fiestras Inverse Inversa Determinant Determinante Eigenvalues and eigenvectors Vector propio e valor propio Transpose Traspor Submatrix Submatriz Mean Media Median Mediana Standard Deviation Desviación estándar Covariance Covarianza Correlation Coefficient Coeficiente de correlación Plot Gráfica Polar Polar Log scale for the y axis Escala logarítmica para o eixe Y Log scale for the x axis Escala logarítmica para o eixe X Log scale for the x and y axis Escala logarítmica para os eixes X e Y Axis scale Escala de eixos Title and labels Título e etiquetas Svg Canvas Canvas Svg General configuration Configuración xeral File Ficheiro Help Axuda Data Datos Matrix Matriz Tools Ferramentas Statistics Estatísticas 2D... 2D... Config Configuración View Ver Dock Tools Dock Tools Windows Layout Disposición das xanelas Export to... Exportar a... SearchDialog Search and replace Buscar e substituír Search Buscar Regular expression Expresión regular Replace Substituír Options Opcións Case sensitive Diferenciar maiúsculas de minúsculas Only full words Só palabras enteiras From cursor Desde o cursor Cancel Cancelar Session Empty Baleiro SvgCanvas Width Largura Width: Largura: Height Altura Height: Altura: Save File Gardar ficheiro *.svg *.svg Table <b>Reload matrix.</b><br> Some operations change matrix, use reload to view changes. <b>Recargar matriz.</b><br> Algunhas operacións cambian a matriz, empregue recargar para ver os cambios. Table Táboa Copy Copiar Copy as Octave matrix Copiar como matriz do Octave Paste Pegar Delete rows Borrar filas Delete columns Borrar columnas Plot Gráfica 2D 2D Polar Polar Log scale for the x and y axis Escala logarítmica para os eixes X e Y Log scale for the y axis Escala logarítmica para o eixe Y Log scale for the x axis Escala logarítmica para o eixe X Bar graph Gráfica de barras Warning Aviso Comlumns will be deleted. Continue? Borraranse as columnas. Continuar? Rows will be deleted. Continue? Borraranse as filas. Continuar? Error Erro TableForm Table Táboa Cols Columnas Rows Filas Change Order Modificar orde TablePlot Title Título Use columns or rows Empregar columnas ou filas Columns Columnas Rows Filas x x y y Angle Ángulo Radio Radio x Error Erro X y Error Erro Y Style Estilo Line style Estilo da liña None Ningún Lines Liñas Dots Puntos Points Puntos Lines and points Liñas e puntos Impulses Impulsos Steps Pasos Boxes Caixas Error bars Barras de erro Box error bars Box error bars Color Cor Red Vermello Green Verde Blue Azul Magenta Fucsia Cyan Cian White Branco Point style Estilo de punto + + * * o o Ok Aceptar Cancel Cancelar Terminal Insert your commands here... Insira as súas ordes aquí... Insert your commands here. Use arrows and tab key to commands navigation. Insira as súas ordes aquí. Empregue as teclas de frechas e tabulador coma ordes de navegación. Octave Terminal Terminal do Octave Ui_Projects Projects Proxectos Available Projects: Proxectos dispoñíbeis: Open Abrir Cancel Cancelar VariableList Edit Editar Clear Limpar Save to file Gardar nun ficheiro Reload variables' list Recargar a lista de variábeis Name Nome Size Tamaño Bytes Bytes Class Clase Local user variables Variábeis locais do usuario Functions Funcións Variable list Lista de variábeis Variables' List Lista de variábeis qtoctave-0.10.1/qtoctave/src/lang/qtoctave_gl_ES.qm0000644000175000017500000010135711511434226021221 0ustar lucaslucas9[M[nkCuG%GJ'JJ [T sXNyXnY[`6JQj3iyyEy ye@TT~K~kKl4p t% %WOT*0+0207U0=0W;~YH5u^VEMVEmf f3^fssdZsdhUQ: io6vOį1į7^ \E)r4m*2*?*y?+r4-Zb+6qPm@uG4HN%jInJInk)J sJ(t&J+tVJ6IJ65JcbKJcbkJ KZ#6LG VLGaLb Lb) LbfMez*LNLNlNb<SM!Sm-T8ATArV%V0Vh,Wb[WbhWTZXznZy%]Zy%i!Zy%jZsNZso2Z%o_[ %o[f3[f3^ \X]N]p"]cyC|۾Q#): uwws$s$5GhtS""1vۨ,aEJvEjZ9+nRDueGN ogc.:ɸD;:b>\q'$TW5ٗ0I;մOZ(r]k>bEMw} wwW@jqBJ/h'&h+A9x*so;}M}mAw9ذT3iun4Ind|<L?|<l]I]`III'I4I=IJI_[IkXIsX,t6Z'L NLShɓt    ; h   .,,(,6>c b  b( bV`fRB8րCB9kzGhbXT D$` c,3!6b$He878Y;~Z$CTPH8DT`]Z-ect^vNNvnx}%RFNH5CAapߺc1r |r":1%$5E*ͺ)-uN -un1@A7ADBAKBAlBFC5FC:4^d7{{`{h- F!f0BuUڠ&ܽFdM ` fR@%m -t[ (- !BZ . EBz 6[} \c= i4 tr) tb 0  ~q [ de Z( A ZY N _ )'Q DZ _UR dv i$2Q i$? qS yKr8 PI PiJ YI g X gH `Q \TB%2K|St+:bI/k>D^Dv گ2w4h=Ҵ6og| lڊ3y/"|0ΓANLp2,C4iw&Engadir a... Add to... BaseWidgetDMostrar dentro da xanela principalShow inside of main window BaseWidget@Mostrar fora da xanela principalShow outside of main window BaseWidgetVerView BaseWidget AbaixoBottomClipboardListViewEliminar todo Delete allClipboardListView Eliminar entrada Delete entryClipboardListViewDescenderDownClipboardListView EditarEditClipboardListViewOrde ascendenteSort ascendingClipboardListView Orde descendenteSort descendingClipboardListViewParar engadido Stop appendClipboardListViewVParar engadido de texto dende o portapapeis Stops append text from clipboardClipboardListView ArribaTopClipboardListView SubirUpClipboardListView CopiarCopyCodeEdit CortarCutCodeEdit BorrarDeleteCodeEdit PegarPasteCodeEditRefacerRedoCodeEdit Seleccionar todo Select allCodeEdit<Alternar punto de interrupcinToggle breakpointCodeEditDesfacerUndoCodeEdit$Limpar o historial Clean history CommandListLista de ordes Command List CommandListLista de ordesCommands' List CommandList CopiarCopy CommandListJClic co boton dereito para ver o menRight click to see menu CommandList(Non posbel gardarCan not be savedEditor PecharCloseEditor$Pechar o separador Close tabEditor2Quere pechar esta xanela?Close this window?EditorComentarCommentEditorConfiguracinConfigEditor CopiarCopyEditor Ctrl+CCtrl+CEditor Ctrl+FCtrl+FEditor Ctrl+NCtrl+NEditor Ctrl+OCtrl+OEditor Ctrl+SCtrl+SEditorCtrl+Shift+Z Ctrl+Shift+ZEditor Ctrl+VCtrl+VEditor Ctrl+XCtrl+XEditor Ctrl+ZCtrl+ZEditor CortarCutEditorDepurarDebugEditor EditarEditEditor EditorEditorEditor"Opcins do editorEditor OptionsEditorBaleiroEmptyEditorErroErrorEditorF5F5EditorFicheiroFileEditor$Lista de ficheiros File listEditorSangraIndentEditorNovoNewEditorSeguinte lia Next lineEditor AbrirOpenEditorOpcinsOptionsEditor PegarPasteEditorImprimirPrintEditor(Imprimir o documentoPrint DocumentEditorRefacerRedoEditorExecutarRunEditor GardarSaveEditorGardar comoSave asEditor&Buscar e substiturSearch and replaceEditor Enviar ao OctaveSend to OctaveEditor6Mostrar/Ocultar os obxectosShow/Hide ObjectsEditor&Portapapeis pequenoSmall ClipboardEditorZModificouse o ficheiro. Gardar modificacins?)The file has been modified. Save changes?EditorFerramentasToolsEditorDescomentar UncommentEditorDesfacerUndoEditor$Eliminar a sangraUnindentEditorFVai a pechar o editor. Est seguro?,You are going to close Editor. Are you sure?Editor>Debe gardar o ficheiro primeiroYou must save the file firstEditor(non posbel gardarcan not be savedEditorCancelarCancelExportToDialogExportar a... Export to...ExportToDialogAceptarOKExportToDialog(Seleccionar formato:Select format:ExportToDialogCancelarCancel FileActions4Procesando os ficheiros...Processing files... FileActions(Comezando proceso...Starting process... FileActions(Escoller un ficheiro Choose a fileFileEditFicheiro...File...FileEditZ<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indentacin automtica para as declaracins while, if, for, switch, do e try.</p></body></html>

Automatic indention for while, if, for, switch, do and try statements.

 GeneralMenu@<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Os pares de corchetes resltanse cando o cursor est sobre eles.</p></body></html>

Brackets pair are iluminated when cursor is over one of them.

 GeneralMenuj<html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CAndo o usuario comeza a escribir, suxrenselle varias formas de completar a palabra.</p></body></html>

When the user starts typing a word, it suggests possible ways of completing the word.

 GeneralMenuEngadirAdd GeneralMenuAutocompletadoAuto-completion GeneralMenu(Indentado automticoAutomatic indention GeneralMenuVIndentacin automtica para as declaracins"Automatic indention for statements GeneralMenu Fondo Background GeneralMenu4Coincidencia de parntesesBrackets match GeneralMenuCancelarCancel GeneralMenuCor:Color: GeneralMenu BorrarDelete GeneralMenuEasy Plot Easy Plot GeneralMenu(Camio do Easy Plot:Easy Plot Path: GeneralMenu EditorEditor GeneralMenuErroError GeneralMenuErro de exemplo Error example GeneralMenuEditor externoExternal editor GeneralMenuCartafoles:Folders: GeneralMenuTipo de letraFont GeneralMenuTipo de letra:Font: GeneralMenuPrimeiro plano Foreground GeneralMenuMen xeral General Menu GeneralMenu AxudaHelp GeneralMenuCamio da axuda Help path GeneralMenuEditor internoInternal Editor GeneralMenuLNmero mximo de columnas na terminal:"Max number of columns in terminal: GeneralMenuFNmero mximo de lias na terminal:$Maximum number of lines in terminal: GeneralMenuSen indentacin No indention GeneralMenuAceptarOK GeneralMenu OctaveOctave GeneralMenu Camio do Octave Octave Path GeneralMenu(Argumentos do OctaveOctave arguments GeneralMenu,Outras funcionalidadesOther features GeneralMenu>Exemplo da terminal do QtOctaveQtOctave Terminal example GeneralMenu2Seleccionar tipo de letra Select Font GeneralMenuSeleccionar... Select... GeneralMenuXRCS Simple (Sistema de Control de Revisins)$Simple RCS (Revision Control System) GeneralMenu&Realzado de sintaxeSyntax highlighting GeneralMenuTerminalTerminal GeneralMenu"Etiqueta de texto TextLabel GeneralMenu$Empregar Easy Plot Use Easy Plot GeneralMenu.Empregar editor externoUse external editor GeneralMenuAbrir ficheiro Open File General_Menu&Retroceder&BackHelp&Avanzar&ForwardHelpIr ao &inicio&Go homeHelp AxudaHelpHelpNavegacin NavigationHelpNome da matriz: Matrix name:Main AbrirOpenMain"Seleccionar tboa Select tableMain A**n ExponencialA**n Exponential MainWindow SobreAbout MainWindow"Grfica de barras Bar graph MainWindowCancelarCancel MainWindow Cambiar cartafolChange Directory MainWindow PecharClose MainWindowLista de ordes Command List MainWindowhGrfica do contorno da superficie en tres dimensins)Contour plot of three-dimensional surface MainWindow BorrarDelete MainWindow>Eliminar disposicin de xanelasDelete windows' layout MainWindow DocksDocks MainWindowBarras de erro Error Bars MainWindow AxudaHelp MainWindowHistograma Histogram MainWindow MatrizMatrix MainWindow$Nome para o deseoName for layout MainWindow Nome:Name: MainWindowvOctave est gardando informacin. Prema Aceptar ao rematar.'Octave is saving data. Press ok at end. MainWindowPGrfica de superficie en tres dimensins!Plot of three-dimensional surface MainWindow"Axuda do QtOctave QtOctave Help MainWindowSarQuit MainWindow6Mostrar/Ocultar os obxectosShow/Hide Objects MainWindow&Executar a terminal Terminal Run MainWindownVai a pechar todas as xanelas do QtOctave. Est seguro?Fallou o Octave. Reiniciando...!Octave has crashed. Restarting...OctaveConnectionBTerminou o Octave. Reiniciando..."Octave has finished. Restarting...OctaveConnectionQtOctave en:  QtOctave in: OctaveConnectionDQtOctave require Octave 2.9.9 ou superior. Pode seleccionar o executbel do Octave en Configuracin/Configuracins Xerais/Octave/Camio o Octave A sa versin : QtOctave requires Octave version 2.9.9 or better. You can select your Octave executable in Config/General Configuration/Octave/Octave Path Your version is: OctaveConnection AvisoWarningOctaveConnection**Plot++PlotEngadirAddPlotAzulBluePlotBox error barsBox error barsPlot CaixasBoxesPlotCancelarCancelPlotCorColorPlot*Copiar ao portapapeisCopy to clipboardPlotCianCyanPlot PuntosDotsPlotBarras de erro Error barsPlot VerdeGreenPlotImpulsosImpulsesPlot<Debera ser un vector columna.It should be a column vector.PlotEstilo da lia Line stylePlot LiasLinesPlotLias e puntosLines and pointsPlot FucsiaMagentaPlot NingnNonePlotAceptarOkPlotEstilo de punto Point stylePlot PuntosPointsPlotVermelloRedPlotEliminarRemovePlot PasosStepsPlot BrancoWhitePlotooPlotttulo:title:PlotxxPlot"Borrar o proxectoDelete ProjectProjects(Modificar o proxectoModify ProjectProjectsNovo proxecto New ProjectProjects 2D...2D... QApplication<b>Completado de coincidencias:</b><br> Xenera completados posibles dada unha lia de ordes.SCompletion matches:
Generates possible completions given in comand line. QApplication<b>Detn o proceso:</b><br>Deten procesos non controlados, bucles infinitos,...FStops process:
Stops uncontroled process, infinite loops,... QApplicationEscala de eixos Axis scale QApplication"Limpar a terminalClear terminal QApplicationConfiguracinConfig QApplication4Coeficiente de correlacinCorrelation Coefficient QApplicationCovarianza Covariance QApplication DatosData QApplicationPEliminar algunha disposicin de fiestrasDelete some windows layout QApplicationDeterminante Determinant QApplicationDock Tools Dock Tools QApplication~Axuda dinmica: Mostra a axuda das coincidencias de completado.0Dynamic Help: Shows help of completions matches. QApplication EditorEditor QApplication8Vector propio e valor propioEigenvalues and eigenvectors QApplicationExportar a... Export to... QApplicationFicheiroFile QApplication&Configuracin xeralGeneral configuration QApplication AxudaHelp QApplicationInversaInverse QApplicationLEscala logartmica para os eixes X e YLog scale for the x and y axis QApplication@Escala logartmica para o eixe XLog scale for the x axis QApplication@Escala logartmica para o eixe YLog scale for the y axis QApplication MatrizMatrix QApplication MediaMean QApplicationMedianaMedian QApplicationNavegador Navigator QApplicationAxuda do Octave Octave Help QApplicationGrficaPlot QApplication PolarPolar QApplicationProxectosProjects QApplication8Executar un script do OctaveRun an Octave Script QApplicationLGardar a disposicin de xanelas actualSave actual windows layout QApplication&Desviacin estndarStandard Deviation QApplicationEstatsticas Statistics QApplicationSubmatriz Submatrix QApplicationCanvas Svg Svg Canvas QApplication TboaTable QApplication$Ttulo e etiquetasTitle and labels QApplicationFerramentasTools QApplicationTraspor Transpose QApplication$Lista de varibeis Variable List QApplicationVerView QApplication.Disposicin das xanelasWindows Layout QApplicationCancelarCancel SearchDialogHDiferenciar maisculas de minsculasCase sensitive SearchDialogDesde o cursor From cursor SearchDialog(S palabras enteirasOnly full words SearchDialogOpcinsOptions SearchDialog"Expresin regularRegular expression SearchDialogSubstiturReplace SearchDialog BuscarSearch SearchDialog&Buscar e substiturSearch and replace SearchDialogBaleiroEmptySession *.svg*.svg SvgCanvas AlturaHeight SvgCanvasAltura:Height: SvgCanvasGardar ficheiro Save File SvgCanvasLarguraWidth SvgCanvasLargura:Width: SvgCanvas2D2DTable<b>Recargar matriz.</b><br> Algunhas operacins cambian a matriz, empregue recargar para ver os cambios.TReload matrix.
Some operations change matrix, use reload to view changes.Table"Grfica de barras Bar graphTableDBorraranse as columnas. Continuar?#Comlumns will be deleted. Continue?Table CopiarCopyTable8Copiar como matriz do OctaveCopy as Octave matrixTableBorrar columnasDelete columnsTableBorrar filas Delete rowsTableErroErrorTableLEscala logartmica para os eixes X e YLog scale for the x and y axisTable@Escala logartmica para o eixe XLog scale for the x axisTable@Escala logartmica para o eixe YLog scale for the y axisTable PegarPasteTableGrficaPlotTable PolarPolarTable>Borraranse as filas. Continuar?Rows will be deleted. Continue?Table TboaTableTable AvisoWarningTableModificar orde Change Order TableFormColumnasCols TableForm FilasRows TableForm TboaTable TableForm** TablePlot++ TablePlot nguloAngle TablePlotAzulBlue TablePlotBox error barsBox error bars TablePlot CaixasBoxes TablePlotCancelarCancel TablePlotCorColor TablePlotColumnasColumns TablePlotCianCyan TablePlot PuntosDots TablePlotBarras de erro Error bars TablePlot VerdeGreen TablePlotImpulsosImpulses TablePlotEstilo da lia Line style TablePlot LiasLines TablePlotLias e puntosLines and points TablePlot FucsiaMagenta TablePlot NingnNone TablePlotAceptarOk TablePlotEstilo de punto Point style TablePlot PuntosPoints TablePlot RadioRadio TablePlotVermelloRed TablePlot FilasRows TablePlot PasosSteps TablePlot EstiloStyle TablePlot TtuloTitle TablePlot4Empregar columnas ou filasUse columns or rows TablePlot BrancoWhite TablePlotoo TablePlotxx TablePlot Erro Xx Error TablePlotyy TablePlot Erro Yy Error TablePlotInsira as sas ordes aqu. Empregue as teclas de frechas e tabulador coma ordes de navegacin.IInsert your commands here. Use arrows and tab key to commands navigation.Terminal8Insira as sas ordes aqu...Insert your commands here...Terminal$Terminal do OctaveOctave TerminalTerminal,Proxectos dispobeis:Available Projects: Ui_ProjectsCancelarCancel Ui_Projects AbrirOpen Ui_ProjectsProxectosProjects Ui_Projects BytesBytes VariableList ClaseClass VariableList LimparClear VariableList EditarEdit VariableListFuncins Functions VariableList6Varibeis locais do usuarioLocal user variables VariableListNomeName VariableList:Recargar a lista de varibeisReload variables' list VariableList&Gardar nun ficheiro Save to file VariableList TamaoSize VariableList$Lista de varibeis Variable list VariableList$Lista de varibeisVariables' List VariableListqtoctave-0.10.1/qtoctave/src/lang/qtoctave_es.ts0000644000175000017500000016647511511434226020664 0ustar lucaslucas Load matrix from file Cargar matriz desde archivo BaseWidget View Ver Show outside of main window Ver fuera de la ventana principal Show inside of main window Ver dentro de la ventana principal Add to... Añadir a... ClipboardListView Edit Editar Delete entry Borrar entrada Delete all Borrar todo Sort ascending Ordenar de manera ascendente Sort descending Ordenar de manera descendente Up Arriba Down Abajo Top Parte superior Bottom Parte inferior Stop append Parar de añadir Stops append text from clipboard Parar de añadir texto desde el portapapeles CommandList Commands' List Lista de comandos Right click to see menu Pulse con el botón derecho para ver el menú Command List Lista de comandos Copy Copiar Clean history Limpiar historial de comandos Editor Editor Editor Options Opciones Editor Options Opciones del editor New Nuevo Ctrl+N Open Abrir Ctrl+O Save Guardar Ctrl+S Save as Guardar como Close tab Cerrar pestaña Run Ejecutar F5 Debug Depurar Detailed debugging Depurado detallado Send to Octave Enviar a Octave F9 Undo Deshacer Redo Rehacer Cut Cortar Copy Copiar Paste Pegar Search and replace Buscar y reemplazar Ctrl+F File Archivo Clone View Clonar vista Print Imprimir Close Cerrar Edit Editar Toggle breakpoint Activar/desactivar punto de para en la depuración Tools Herramientas Indent Identar Unindent Desidentar Comment Comentar Uncomment Descomentar Config Configuración File list Lista de archivos Small Clipboard Pequeño portapapeles Show/Hide Objects Mostar/ocultar objetos Empty Vacío Error Error Can not be saved No puede ser guardado can not be saved no puede ser guardado You must save the file first Primero, debe guardar el archivo Close this window? ¿Cerrar esta ventana? You are going to close Editor. Are you sure? Va a cerrar el Editor. ¿Está usted seguro? The file has been modified. Save changes? El archivo ha sido modificado. ¿Guardar los cambios? Print Document Imprimir el documento FileActions Processing files... Procesando archivos... Ok Aceptar Cancel Cancelar These files will be copyed: Los siguientes archivos serán copiados: These files will be cut: Los siguientes archivos serán cortados: These files will be removed: Los siguientes archivos serán borrados: FileEdit File... Archivo... Choose a file Seleccione un archivo General_Menu Open File Abrir archivo Help Help Ayuda Navigation &Back &Atrás &Forward A&delante &Go home &Ir a directorio de usuario Main Select table Seleccione una tabla Matrix name: Nombre de la matriz: Open Abrir MainWindow Your changes will have effect, when QtOctave reboot. Do you want to do it? Los cambios serán aplicados, cuando QtOctave sea reiniciado. ¿Desea continuar? Command List Lista de comandos Install Octave packages Instalar paquetes de Octave Change Directory Cambiar directorio Quit Salir A**n Exponential A**n exponencial Histogram Histograma Error Bars Barras de error Bar graph Gráfico de barras Plot of three-dimensional surface Dibujar una superficie tridimensional Contour plot of three-dimensional surface Dibujar el contorno de una superficie tridimensional Show/Hide Objects Mostar/ocultar objetos Terminal Run Matrix Matriz Help Ayuda Docks QtOctave Help Ayuda de QtOctave About Sobre QtOctave Name for layout Nombre para la disposición Name: Nombre: Delete windows' layout Borrar disposición de las ventanas Delete Borrar Cancel Cancelar Close Cerrar You are going to close all QtOctave's windows. Are you sure? Va a cerrar todas las ventanas de QtOctave. ¿Está usted seguro? Octave is saving data. Press ok at end. Octave está guardando los datos. Pulse aceptar cuando finalice. MenuExtCallBack Input Parameters Parámetros de entrada Output Parameters Parámetros de salida Ok Aceptar Copy to clipboard Copiar al portapapeles Cancel Cancelar Help Ayuda Blank parameter Parámetro en blanco There are blank parameters. Please fill all fields. Hay parámetros en blanco. Por favor, rellene los campos en blanco. Navigator Navigator &New folder Nueva carpeta Exit Salir Cu&t Cortar &Copy Copiar &Paste Pegar &Back &Atrás &Forward A&delante Up Arriba Delete file Borrar archivo Rename Renombrar Navigation tools Go Ir Filters: Filtros: New Folder Nueva carpeta Name: Nombre: Remove file Borrar archivo Remove selected files? ¿Borrar los archivos seleccionados? NumberBar Stop Here Parar aquí Current Line Línea actual Error Line Línea de error NumberedTextView This file name is not valid. Este nombre de archivo no es válido. Octave doesn't understand this file name: Octave no comprende este nombre de archivo: Please, change it. Do you want to save your changes? Por favor, cámbielo. ¿Desea almacenar los cambios? OctaveConnection Warning Advertencia QtOctave requires Octave version 3.2.0 or better. You can select your Octave executable in Config/General Configuration/Octave/Octave Path Your version is: QtOctave requiere Octave versión 3.2.0 o superior. Usted puede seleccionar la ruta al ejecutable de Octave en el menú de configuración. Su versión es: QtOctave in: QtOctave en: Couldn't be opened. No puede ser abierto. Octave crashed Octave se ha parado Octave has crashed. Restarting... Octave se ha parado por un error interno. Reiniciando Octave... Octave finished Octave ha finalizado Octave has finished. Restarting... Octave ha finalizado. Reiniciando... Operations qtoctave_pkg not found qtoctave_pkg no encontrado qtoctave_pkg can not be executed. Please, install qtoctave_pkg or put it in PATH qtoctave_pkg no ha sido encontrado. Por favor, instale qtoctave_pkg o póngalo en el PATH Plot It should be a column vector. Debería ser un vector columna. Line style Estilo de línea None Ninguno Lines Líneas Dots Puntos Points Figuras Lines and points Líneas y figuras Impulses Impulsos Steps Pasos Boxes Cajas Error bars Barras de error Box error bars Cajas y barras de error Color Color Red Rojo Green Verde Blue Azul Magenta Cyan White Blanco Point style Estilo de figura + * o x title: título: Add Añadir Remove Quitar Ok Aceptar Copy to clipboard Copiar al portapapeles Cancel Cancelar Projects New Project Nuevo proyecto Modify Project Modificar proyecto Delete Project Borrar proyecto QApplication Run an Octave Script Ejecutar un script de Octave Octave Help Ayuda de Octave Table Tabla Editor Projects Proyectos <b>Completion matches:</b><br> Generates possible completions given in comand line. <b>Sugerencias de línea de comandos:</b><br> Genera las formas posibles de completar el texto de la línea de comando. Dynamic Help: Shows help of completions matches. Ayuda dinámica: Muestra la ayuda de los comandos que se van introduciendo en la línea de comandos. <b>Stops process:</b><br>Stops uncontroled process, infinite loops,... <b>Parar proceso:</b><br>Para procesos incontrolados, bucles infinitos,... Clear terminal Limpiar el terminal Variable List Lista de Variables Navigator Save actual windows layout Guardar el esquema actual de las ventanas Delete some windows layout Borrar algún esquema de ventanas Inverse Inversa Determinant Determinante Eigenvalues and eigenvectors Autovalores y autovectores Transpose Transpuesta Submatrix Submatriz Mean Media Median Mediana Standard Deviation Desviación estándar Covariance Covarianza Correlation Coefficient Coreficiente de correlación Plot Dibujo Polar Polares Log scale for the y axis Escala logarítmica para el eje y Log scale for the x axis Escala logarítmica para el eje x Log scale for the x and y axis Escala logarítmica para el eje x e y Axis scale Escala de los ejes Title and labels Título y etiquetas Svg Canvas General configuration Configuración general File Archivo Help Ayuda Data Datos Matrix Matriz Tools Herramientas Statistics Estadística 2D... Config Configuración View Ver Dock Tools Windows Layout Esquema de ventanas Export to... Exportar a... SearchDialog Search and replace Buscar y reemplazar Search Buscar Regular expression Expresión regular Replace Reemplazar Options Opciones Case sensitive Sensible a las mayúsculas Only full words Sólo palabras completas From cursor Desde el cursor Cancel Cancelar Session Empty Vacío SvgCanvas Width Anchura Width: Anchura: Height Altura Height: Altura: Save File Guardar archivo *.svg Table <b>Reload matrix.</b><br> Some operations change matrix, use reload to view changes. <b>Recargar matriz:</b><br>Algunas operaciones cambian la matriz, use recargar para ver los cambios. Table Tabla Copy Copiar Copy as Octave matrix Copiar como matriz de Octave Paste Pegar Delete rows Borrar filas Delete columns Borrar columnas Plot Dibujo 2D Polar Polares Log scale for the x and y axis Escala logarítmica para el eje x e y Log scale for the y axis Escala logarítmica para el eje y Log scale for the x axis Escala logarítmica para el eje x Bar graph Gráfico de barras Warning Advertencia Comlumns will be deleted. Continue? Se eliminarán las columnas. ¿Continuar? Rows will be deleted. Continue? Se eliminarán las filas. ¿Continuar? Error TablePlot Title Título Use columns or rows Usar columnas o filas Columns Columnas Rows Filas x y Angle Ángulo Radio Radio x Error Error en la x y Error Error en la y Style Estilo Line style Estilo de línea None Ninguno Lines Líneas Dots Puntos Points Figuras Lines and points Líneas y figuras Impulses Impulsos Steps Pasos Boxes Cajas Error bars Barras de error Box error bars Cajas y barras de error Color Color Red Rojo Green Verde Blue Azul Magenta Comentar Cyan Copiar White Blanco Point style Estilo de figura + * o Ok Aceptar Cancel Cancelar Terminal Octave Terminal Terminal de Octave Insert your commands here... Inserte sus comandos aquí... Insert your commands here. Use arrows and tab key to commands navigation. Inserte sus comandos aquí. Use las flechas y la tecla tabulador para navegar entre los comandos. VariableList Variables' List Lista de variables <b>Filter:</b><br>Use wildcards to filter variables. Example: a* (all variables that begin with a) <b>Filtro:</b><br>Use los caracteres * y ? para filtrar las variables. Por ejemplo: a* (todas las variables que comienzan por a) Reload variables' list Recargar la lista de variables Name Nombre Size Tamaño Bytes Class Clase Local user variables Variables del usuario local Variable list Lista de Variables Edit Editar Clear Limpiar Save to file Guardar en un archivo qtoctave-0.10.1/qtoctave/src/lang/qtoctave_cs.ts0000644000175000017500000021570411511434226020650 0ustar lucaslucas UTF-8 BaseWidget View Pohled Show outside of main window Ukázat vně hlavního okna Show inside of main window Ukázat uvnitř hlavního okna Add to... Přidat do... ClipboardListView Edit Upravit Delete entry Smazat záznam Delete all Smazat vše Sort ascending Seřadit vzestupně Sort descending Seřadit sestupně Up Nahoru Down Dolů Top Nahoře Bottom Dole Stop append Zastavit připojení Stops append text from clipboard Zastaví připojení textu ze schránky CodeEdit Undo Zpět Redo Znovu Cut Vyjmout Copy Kopírovat Paste Vložit Delete Smazat Select all Vybrat vše Toggle breakpoint Přepnout místo přerušení CommandList Copy Kopírovat Clean history Vyčistit historii Right click to see menu Stisknutí pravého tlačítka myši pro zobrazení nabídky Command List Seznam příkazů Commands' List Seznam příkazů Editor Editor Editor New Nový Ctrl+N Open Otevřít Ctrl+O Save Uložit Ctrl+S Save as Uložit jako Close tab Zavřít kartu Run Provést F5 Debug Ladit Next line Další řádek Send to Octave Poslat Octave Undo Zpět Ctrl+Z Redo Znovu Ctrl+Shift+Z Cut Vyjmout Ctrl+X Copy Kopírovat Ctrl+C Paste Vložit Ctrl+V Search and replace Hledat a nahradit Ctrl+F Error Chyba You must save the file first Nejprve musíte uložit soubor Close this window? Zavřít toto okno? You are going to close Editor. Are you sure? Chystáte se zavřít okno. Jste si jistý? Close Zavřít The file has been modified. Save changes? Soubor byl změněn. Uložit změny? Print Document Vytisknout dokument Options Volby Editor Options Volby pro editor File Soubor Print Tisk Edit Úpravy Tools Nástroje Indent Odsadit Unindent Zrušit odsazení Comment Opatřit poznámkou Uncomment Zrušit poznámku Config Nastavení File list Seznam souborů Small Clipboard Malá schránka Empty Prázdné Can not be saved Nelze uložit can not be saved nelze uložit Show/Hide Objects Ukázat/Skrýt předměty ExportToDialog Export to... Vyvést do... Select format: Vybrat formát: OK Aceptar Cancel Zrušit FileActions Processing files... Zpracovávají se soubory... Starting process... Spouští se zpracování... Cancel Zrušit FileEdit File... Soubor... Choose a file Vybrat soubor GeneralMenu General Menu Hlavní nabídka Terminal Terminál Font: Písmo: TextLabel Textová jmenovka Select Font Vybrat písmo Color: Barva: QtOctave Terminal example Příklad terminálu QtOctave Error example Příklad chyby Error Chyba Background Pozadí Foreground Popředí Maximum number of lines in terminal: Nejvyšší počet řádků v terminálu: Max number of columns in terminal: Nejvyšší počet sloupců v terminálu:: Editor Editor Use external editor Použít vnější editor External editor Vnější editor Select... Vybrat... Internal Editor Vnitřní editor Font Písmo Automatic indention Automatické odsazení No indention Bez odsazení <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Automatic indention for while, if, for, switch, do and try statements.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Automatické odsazení pro příkazy while, if, for, switch, udělej a zkus. </p></body></html> Automatic indention for statements Automatické odsazení pro příkazy Other features Další funkce Syntax highlighting Zvýraznění skladby <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Brackets pair are iluminated when cursor is over one of them.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Dvojice závorek je rozsvícena, když se ukazovátko nachází nad jednou z nich. </p></body></html> Brackets match Odpovídající závorky <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">When the user starts typing a word, it suggests possible ways of completing the word.</p></body></html> <html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Když začne uživatel psát slovo, budou navrženy možné způsoby dokončení slova. </p></body></html> Auto-completion Automatické dokončení Simple RCS (Revision Control System) Jednoduché ověření verzí Octave Octave Octave Path Cesta k Octave Octave arguments Argumenty Octave Folders: Složky: Add Přidat Delete Smazat Easy Plot Snadný nákres Use Easy Plot Použít snadný nákres Easy Plot Path: Cesta ke snadnému nákresu: Help Nápověda Help path Cesta k nápovědě OK Aceptar Cancel Zrušit General_Menu Open File Otevřít soubor Help &Back &Zpět &Forward &Dopředu &Go home &Hlavní adresář Help Nápověda Navigation Navigace Main Select table Vybrat tabulku Matrix name: Název matice: Open Otevřít QtOctave About Acerca de QtOctave MainWindow Name for layout Název rozvržení Name: Název: Delete windows' layout Smazat rozvržení okna Delete Smazat Cancel Zrušit Close Zavřít You are going to close all QtOctave's windows. Are you sure? Chystáte se zavřít všechna okna QtOctave. Jste si jistý? Octave is saving data. Press ok at end. Octave ukládá data. Stiskněte OK na konci. Your changes will have effect, when QtOctave reboot. Do you want to do it? Vámi provedené změny se projeví po opětovném spuštění QtOctave. Chcete to udělat? Command List Seznam příkazů Change Directory Změnit adresář Quit Ukončit Histogram Histogram (sloupkový nákres z obdélníků) Error Bars Pruhy s chybami Bar graph Nákres z pruhů Plot of three-dimensional surface Nákres trojrozměrného povrchu Contour plot of three-dimensional surface Obrysový nákres trojrozměrného povrchu Terminal Run Spuštění terminálu Matrix Matice Help Nápověda Docks Panely QtOctave Help Nápověda QtOctave About O programu Show/Hide Objects Ukázat/Skrýt předměty A**n Exponential A**n exponenciální MenuExtCallBack Input Parameters Vstupní parametry Output Parameters Výstupní parametry Ok OK Copy to clipboard Kopírovat do schránky Cancel Zrušit Help Nápověda Blank parameter Prázdný parametr There are blank parameters. Please fill all fields. Některé parametry jsou prázdné. Vyplňte, prosím, všechna pole. Navigator &New folder &Nová složka salir Salir Cu&t &Vyjmout &Copy &Kopírovat &Paste &Vložit &Back &Zpět &Forward &Dopředu Up Nahoru Delete file Smazat soubor Rename Přejmenovat Go Jít na Filters: Filtry: New Folder Nová složka Name: Název: Remove file Odstranit soubor Remove selected files? Odstranit vybrané soubory? Navigator Navigátor Navigation tools Nástroje pro navigaci NewProjectDialog New Project &Nový projekt Name: Název: Description: Popis: NumberBar Stop Here Zastavit zde Current Line Nynější řádek Error Line Řádek s chybami OctaveConnection Octave crashed Octave spadl Octave has crashed. Restarting... Octave spadl. Spouští se znovu... Octave finished Octave skončil Octave has finished. Restarting... Octave skončil. Spouští se znovu... Warning Upozornění QtOctave requires Octave version 2.9.9 or better. You can select your Octave executable in Config/General Configuration/Octave/Octave Path Your version is: QtOctave vyžaduje Octave verze 2.9.9 nebo vyšší. Můžete vybrat spouštěcí soubor Octave v Nastavení/Obecné nastavení/Octave/Cesta k Octave Vaše verze: QtOctave in: QtOctave v: Couldn't be opened. Nepodařilo se otevřít. Plot It should be a column vector. Měl by to být sloupcový vektor. Line style Styl čáry None Žádný Lines Čáry Dots Tečky Points Body Lines and points Čáry a body Impulses Impulsy Steps Kroky Boxes Okénka Error bars Pruhy s chybami Box error bars Pruhy s chybami dát do rámečku Color Barva Red Červená Green Zelená Blue Modrá Magenta Purpurová Cyan Modrozelená White Bílá Point style Styl bodů + * o x title: název: Add Přidat Remove Odstranit Ok OK Copy to clipboard Kopírovat do schránky Cancel Zrušit Projects New Project Nový projekt Modify Project Upravit projekt Delete Project Smazat projekt QApplication Run an Octave Script Provést skript Octave Octave Help Nápověda k Octave Table Tabulka Editor Editor Projects Projekty <b>Completion matches:</b><br> Generates possible completions given in comand line. <b>Odpovídající dokončení:</b><br>Vytváří možná dokončení zadaná v příkazovém řádku. Dynamic Help: Shows help of completions matches. Dynamická nápověda: Ukazuje nápovědu hodících se dokončení. <b>Stops process:</b><br>Stops uncontroled process, infinite loops,... <b>Zastavuje zpracování:</b><br>Zastavuje nekontrolovaná zpracování, nekonečné smyčky, ... Clear terminal Vyprázdnit terminál Variable List Seznam proměnných Navigator Navigátor Save actual windows layout Uložit současné rozvržení oken Delete some windows layout Smazat některá rozvržení oken Inverse Převrácený Determinant Determinant Eigenvalues and eigenvectors Vlastní hodnoty a vlastní vektory Transpose Převést Submatrix Podmatice Mean Průměr Median Střední hodnota (medián) Standard Deviation Běžná odchylka Covariance Kovariance Correlation Coefficient Koeficient korelace Plot Nákres Polar Polární Log scale for the y axis Logaritmická stupnice pro osu y Log scale for the x axis Logaritmická stupnice pro osu x Log scale for the x and y axis Logaritmická stupnice pro osy x a y Axis scale Velikost osy Title and labels Název a popisky Svg Canvas Podklad v svg General configuration Obecná nastavení File Soubor Help Nápověda Data Data Matrix Matice Tools Nástroje Statistics Statistika 2D... 2D... Config Nastavení View Pohled Dock Tools Nástroje panelu Windows Layout Rozvržení oken Export to... Vyvést do... SearchDialog Search and replace Hledat a nahradit Search Hledat Regular expression Regulární výraz Replace Nahradit Options Volby Case sensitive Rozlišování velkých a malých písmen Only full words Pouze celá slova From cursor Od ukazovátka Cancel Zrušit Session Empty Prázdný SvgCanvas Width Šířka Width: Šířka: Height Výška Height: Výška: Save File Uložit soubor *.svg *.svg Table <b>Reload matrix.</b><br> Some operations change matrix, use reload to view changes. <b>Nahrát matici znovu.</b><br>Některé operace matici změní. Použijte "Nahrát znovu", abyste uviděl změny. Table Tabulka Copy Kopírovat Copy as Octave matrix Kopírovat jako matici Octave Paste Vložit Delete rows Smazat řádky Delete columns Smazat sloupce Plot Nákres 2D Dvojrozměrný Polar Polární Log scale for the x and y axis Logaritmická stupnice pro osy x a y Log scale for the y axis Logaritmická stupnice pro osu y Log scale for the x axis Logaritmická stupnice pro osu x Bar graph Nákres z pruhů Warning Upozornění Comlumns will be deleted. Continue? Sloupce budou smazány. Pokračovat? Rows will be deleted. Continue? Řádky budou smazány. Pokračovat? Error Chyba TableForm Table Tabulka Cols Sloupce Rows Řádky Change Order Změnit pořadí TablePlot Title Název Use columns or rows Použít sloupce nebo řádky Columns Sloupce Rows Řádky x y Angle Úhel Radio Poloměr x Error Chyba x y Error Chyba y Style Styl Line style Styl čáry None Žádný Lines Čáry Dots Tečky Points Body Lines and points Čáry a body Impulses Impulsy Steps Kroky Boxes Okénka Error bars Pruhy s chybami Box error bars Pruhy s chybami dát do rámečku Color Barva Red Červená Green Zelená Blue Modrá Magenta Purpurová Cyan Modrozelená White Bílá Point style Styl bodů + * o Ok OK Cancel Zrušit Terminal Insert your commands here... Vložte své příkazy zde... Insert your commands here. Use arrows and tab key to commands navigation. Vložte své příkazy zde. Použijte šipky a klávesu tabulátoru k pohybu příkazy. Octave Terminal Terminál Octave Ui_Projects Projects Projekty Available Projects: Dostupné projekty: Open Otevřít Cancel Zrušit VariableList Edit Upravit Clear Vyprázdnit Save to file Uložit do souboru Reload variables' list Nahrát znovu seznam proměnných Name Název Size Velikost Bytes Bytů Class Třída Local user variables Místní uživatelské proměnné Functions Funkce Variable list Seznam proměnných Variables' List Seznam proměnných qtoctave-0.10.1/qtoctave/src/operations/general_menu.ui0000644000175000017500000005777011511434226022236 0ustar lucaslucas GeneralMenu 0 0 574 550 General Menu 0 9 4 0 0 710 168 Terminal 6 9 6 0 0 0 Font: 0 0 TextLabel Select Font 6 0 Color: 0 0 QtOctave Terminal example Error example Error Background Foreground 6 0 Maximum number of lines in terminal: 6 0 Max number of columns in terminal: Show QtOctave IDE commands Qt::Vertical 692 77 0 0 206 46 Command List Max. number of commands Qt::Vertical 20 355 0 0 315 488 Editor 6 9 Use external editor 6 0 External editor 6 0 Qt::Horizontal 40 20 Select... Internal Editor Font Font: Qt::Horizontal 40 20 Select Font Automatic indention No indention Automatic indention true <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Automatic indention for while, if, for, switch, do and try statements.</p></body></html> Automatic indention for statements Other features Syntax highlighting true <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Brackets pair are iluminated when cursor is over one of them.</p></body></html> Brackets match true <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">When the user starts typing a word, it suggests possible ways of completing the word.</p></body></html> Auto-completion true Simple RCS (Revision Control System) true false Qt::Vertical 20 40 0 0 556 349 Octave 6 9 Octave Path Select... 6 0 6 9 Octave arguments 6 9 Folders: 6 0 Add Delete Easy Plot Use Easy Plot Easy Plot Path: Select... 0 0 556 349 Help 6 9 Use internal help instead qtinfo 6 0 Help path 6 0 Qt::Horizontal 40 20 Select... Qt::Vertical 20 40 6 0 Qt::Horizontal 131 31 OK Cancel okButton clicked() GeneralMenu accept() 278 253 96 254 cancelButton clicked() GeneralMenu reject() 369 253 179 282 qtoctave-0.10.1/qtoctave/src/operations/general_menu.cpp0000644000175000017500000002425011511434226022366 0ustar lucaslucas#include "general_menu.h" #include #include #include #include #include #include inline QString CHECK_TO_STRING(Qt::CheckState s) { return s?"true":"false"; } inline Qt::CheckState CHECK_FROM_STRING(const QString &s) { if( s.isEmpty() || s == "false" ) return Qt::Unchecked; else return Qt::Checked; } General_Menu::General_Menu(QWidget *parent):QDialog(parent) { ui.setupUi(this); //Editor ui.use_external_editor->setCheckState(CHECK_FROM_STRING(get_config("external_editor"))); ui.editor_lineEdit->setText(get_config("editor")); if(get_config("autoindent_statements")=="true") { ui.no_autoindent_radioButton->setChecked(false); ui.autoindent_radioButton->setChecked(false); ui.autoindent_statements_radioButton->setChecked(true); } else if(get_config("autoindent")!="false") { ui.no_autoindent_radioButton->setChecked(false); ui.autoindent_radioButton->setChecked(true); ui.autoindent_statements_radioButton->setChecked(false); } else { ui.no_autoindent_radioButton->setChecked(true); ui.autoindent_radioButton->setChecked(false); ui.autoindent_statements_radioButton->setChecked(false); } ui.syntaxHighlighting_checkBox->setCheckState(CHECK_FROM_STRING(get_config("syntaxHighlighting"))); ui.bracketsMatch_checkBox->setCheckState(CHECK_FROM_STRING(get_config("bracketsMatch"))); ui.autoCompletion_checkBox->setCheckState(CHECK_FROM_STRING(get_config("autoCompletion"))); ui.simple_rcs_checkBox->setCheckState(CHECK_FROM_STRING(get_config("simple_rcs"))); QString font_name=get_config("textEditFont"); QString font_size=get_config("textEditFontSize"); if(font_name.isEmpty()) { font_name=text_edit_font.family(); } if(font_size.isEmpty()) { font_size=QString::number(text_edit_font.pointSize()); } text_edit_font.setFamily(font_name); text_edit_font.setPointSize(font_size.toInt()); ui.textEditFont_label->setText("Font: "+font_name+", "+font_size); connect(ui.textEditFont_pushButton,SIGNAL(clicked()),this,SLOT(textEditFont_pushButton_callback())); //Help path ui.help_path_lineEdit->setText(get_config("help_path")); ui.qtinfo_ok_checkBox->setCheckState(CHECK_FROM_STRING(get_config("qtinfo_ok"))); //Terminal //Max. number of items in command line ui.lines_in_history_lineEdit->setText(get_config("lines_in_history")); if(!get_config("terminal_font").isEmpty()) config_font.fromString(get_config("terminal_font")); set_font_label(); foreground_color.setNamedColor(get_config("terminal_foreground_color")); background_color.setNamedColor(get_config("terminal_background_color")); error_color.setNamedColor(get_config("terminal_error_color")); set_color_label(); ui.max_line_num_lineEdit->setText(get_config("lines_in_terminal")); ui.max_col_in_terminal_lineEdit->setText(get_config("cols_in_terminal")); ui.show_ide_commands_checkBox->setCheckState(CHECK_FROM_STRING(get_config("show_ide_commands"))); // Octave ui.octave_path_lineEdit->setText(get_config("octave_path")); ui.octaveArgs_lineEdit->setText(get_config("octave_arguments")); QStringList dirList = get_config("octave_folders").split(",", QString::SkipEmptyParts); QString aux; for(QStringList::const_iterator i = dirList.begin(); i != dirList.end(); i++) { aux = i->trimmed(); if(aux.startsWith('"')) aux = aux.mid(1, aux.length() - 2); ui.octaveDir_list->addItem(aux); } ui.easy_plot_checkBox->setCheckState(CHECK_FROM_STRING(get_config("easy_plot_active"))); ui.easy_plot_path_lineEdit->setText(get_config("easy_plot_path")); // Connect connect(ui.editor_select_button,SIGNAL(clicked()),this,SLOT(editor_select_button_callback())); connect(ui.help_path_select_pushButton,SIGNAL(clicked()),this,SLOT(help_path_select_pushButton_callback())); connect(ui.font_button,SIGNAL(clicked()),this,SLOT(font_button_callback())); connect(ui.foreground_button,SIGNAL(clicked()),this,SLOT(foreground_button_callback())); connect(ui.background_button,SIGNAL(clicked()),this,SLOT(background_button_callback())); connect(ui.error_button,SIGNAL(clicked()),this,SLOT(error_button_callback())); connect(ui.octaveDirRem_button, SIGNAL(clicked()), this, SLOT(octaveDirRem_button_callback())); connect(ui.octaveDirAdd_button, SIGNAL(clicked()), this, SLOT(octaveDirAdd_button_callback())); connect(ui.octave_path_pushButton,SIGNAL(clicked()),this,SLOT(octave_path_button_callback())); connect(ui.easy_plot_path_pushButton,SIGNAL(clicked()),this,SLOT(easy_plot_path_button_callback())); } void General_Menu::background_button_callback() { QColor color=QColorDialog::getColor(foreground_color,this); if(color.isValid()) { background_color=color; set_color_label(); } } void General_Menu::error_button_callback() { QColor color=QColorDialog::getColor(error_color,this); if(color.isValid()) { error_color=color; set_color_label(); } } void General_Menu::foreground_button_callback() { QColor color=QColorDialog::getColor(foreground_color,this); if(color.isValid()) { foreground_color=color; set_color_label(); } } void General_Menu::set_color_label() { QPalette p(ui.color_label->palette()); p.setColor(QPalette::ButtonText,foreground_color); p.setColor(QPalette::Button,background_color); ui.color_label->setPalette(p); p=(ui.error_example_label->palette()); p.setColor(QPalette::ButtonText,error_color); p.setColor(QPalette::Button,background_color); ui.error_example_label->setPalette(p); } void General_Menu::set_font_label() { ui.font_label->setFont(config_font); ui.color_label->setFont(config_font); ui.error_example_label->setFont(config_font); QString font; font+=config_font.family()+" "+QString().setNum(config_font.pointSize())+" "; int weight=config_font.weight(); switch(weight) { case QFont::Light: font+="Light"; break; case QFont::Normal: font+="Normal"; break; case QFont::DemiBold: font+="DemiBold"; break; case QFont::Bold: font+="Bold"; break; case QFont::Black: font+="Black"; break; }; if(config_font.italic()) font+=" Italic"; ui.font_label->setText(font); } void General_Menu::font_button_callback() { bool ok; QFont font = QFontDialog::getFont(&ok, config_font, this); if (ok) { config_font=font; set_font_label(); } } void General_Menu::editor_select_button_callback() { QString file = QFileDialog::getOpenFileName(this,"Choose a file", ".","*"); if(file.isEmpty()) return; file.replace(" ","\\ "); ui.editor_lineEdit->setText(file); } void General_Menu::help_path_select_pushButton_callback() { QString file = QFileDialog::getOpenFileName(this,"Choose a file", ".","*"); if(file.isEmpty()) return; //file.replace(" ","\\ "); ui.help_path_lineEdit->setText(file); } void General_Menu::octaveDirRem_button_callback() { int row = ui.octaveDir_list->currentRow(); if(row > -1) { QListWidgetItem *i = ui.octaveDir_list->item(row); if(ui.octaveDir_list->isItemSelected(i)) { ui.octaveDir_list->takeItem(row); delete i; } } } void General_Menu::octaveDirAdd_button_callback() { QFileDialog fileDialog(this, Qt::Dialog); fileDialog.setFileMode(QFileDialog::DirectoryOnly); fileDialog.setAcceptMode(QFileDialog::AcceptOpen); if(fileDialog.exec() == QDialog::Accepted) { ui.octaveDir_list->addItem(fileDialog.selectedFiles()[0]); } } void General_Menu::apply_config() { QMap config; config["external_editor"] = CHECK_TO_STRING(ui.use_external_editor->checkState()); config["editor"]=ui.editor_lineEdit->text(); config["help_path"]=ui.help_path_lineEdit->text(); config["terminal_font"]=config_font.toString(); config["terminal_foreground_color"]=foreground_color.name(); config["terminal_background_color"]=background_color.name(); config["terminal_error_color"]=error_color.name(); config["lines_in_terminal"]=ui.max_line_num_lineEdit->text(); config["lines_in_history"]=ui.lines_in_history_lineEdit->text(); config["cols_in_terminal"]=ui.max_col_in_terminal_lineEdit->text(); config["octave_arguments"]=ui.octaveArgs_lineEdit->text(); config["octave_path"]=ui.octave_path_lineEdit->text(); config["syntaxHighlighting"]=CHECK_TO_STRING(ui.syntaxHighlighting_checkBox->checkState()); config["bracketsMatch"]=CHECK_TO_STRING(ui.bracketsMatch_checkBox->checkState()); config["autoCompletion"]=CHECK_TO_STRING(ui.autoCompletion_checkBox->checkState()); config["simple_rcs"]=CHECK_TO_STRING(ui.simple_rcs_checkBox->checkState()); config["show_ide_commands"]=CHECK_TO_STRING(ui.show_ide_commands_checkBox->checkState()); config["qtinfo_ok"]=CHECK_TO_STRING(ui.qtinfo_ok_checkBox->checkState()); if(ui.autoindent_statements_radioButton->isChecked()) { config["autoindent"]="true"; config["autoindent_statements"]="true"; } else if(ui.autoindent_radioButton->isChecked()) { config["autoindent"]="true"; config["autoindent_statements"]="false"; } else { config["autoindent"]="false"; config["autoindent_statements"]="false"; } config["textEditFont"]=text_edit_font.family(); config["textEditFontSize"]=QString::number(text_edit_font.pointSize()); // Directory list QString str, tmp; QListWidgetItem *item; for(int i = 0; (item = ui.octaveDir_list->item(i)); i++) { tmp = item->text(); tmp.replace('"', "\\\""); str += "\"" + tmp + "\","; } config["octave_folders"] = str; config["easy_plot_active"] = CHECK_TO_STRING(ui.easy_plot_checkBox->checkState()); config["easy_plot_path"] = ui.easy_plot_path_lineEdit->text(); set_config(config); QMessageBox::information(this, "Note","Reload QtOctave to apply changes."); } void General_Menu::octave_path_button_callback() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"./"); if( fileName.isEmpty() ) return; ui.octave_path_lineEdit->setText(fileName); } void General_Menu::textEditFont_pushButton_callback() { bool ok; QFont font=QFontDialog::getFont ( &ok, text_edit_font, this/*, tr("Select Font")*/); if(ok) { text_edit_font=font; } ui.textEditFont_label->setText("Font: "+text_edit_font.family()+", "+QString::number(text_edit_font.pointSize()) ); } void General_Menu::easy_plot_path_button_callback() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"./"); if( fileName.isEmpty() ) return; ui.easy_plot_path_lineEdit->setText(fileName); } qtoctave-0.10.1/qtoctave/src/operations/plot.cpp0000644000175000017500000002452011511434226020703 0ustar lucaslucas#include "../operations.h" #include #include #include Plot::Plot(QWidget *parent, Plot::Type type):QDialog(parent) { setWindowIcon( QIcon( ":/images/help.png" ) ); this->type=type; switch(type) { case PLOT: setWindowTitle("Plot"); break; case SEMILOGY: setWindowTitle("Semilog y"); break; case SEMILOGX: setWindowTitle("Semilog x"); break; case LOGLOG: setWindowTitle("Log-Log"); break; case POLAR: setWindowTitle("Polar"); break; } vlayout=new QVBoxLayout(); //vlayout->setSpacing(0); //vlayout->setMargin(0); setLayout(vlayout); //Entradas de texto para x e y QHBoxLayout *hlayout= new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *x_label; switch(type) { case POLAR: x_label= new QLabel("Angle",this); break; default: x_label= new QLabel("x",this); }; hlayout->addWidget(x_label); x_label->show(); x_lineedit= new QLineEdit(this); x_lineedit->setToolTip( tr("It should be a column vector.") ); hlayout->addWidget(x_lineedit); x_lineedit->show(); hlayout= new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *y_label; switch(type) { case POLAR: y_label= new QLabel("Radio",this); break; default: y_label= new QLabel("y",this); } hlayout->addWidget(y_label); y_label->show(); y_lineedit= new QLineEdit(this); y_lineedit->setToolTip( tr("It should be a column vector.") ); hlayout->addWidget(y_lineedit); y_lineedit->show(); switch(type) { case POLAR: break; default: hlayout= new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *error_x_label= new QLabel("x Error",this); hlayout->addWidget(error_x_label); error_x_label->show(); error_x_lineedit= new QLineEdit(this); error_x_lineedit->setToolTip( tr("It should be a column vector.") ); hlayout->addWidget(error_x_lineedit); error_x_lineedit->show(); hlayout= new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *error_y_label= new QLabel("y Error",this); hlayout->addWidget(error_y_label); error_y_label->show(); error_y_lineedit= new QLineEdit(this); error_y_lineedit->setToolTip( tr("It should be a column vector.") ); hlayout->addWidget(error_y_lineedit); error_y_lineedit->show(); } //Opciones de formato hlayout= new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *style_label= new QLabel(tr("Line style"),this); hlayout->addWidget(style_label); style_label->show(); style_combo= new QComboBox(this); style_combo->addItem(tr("None"), QVariant("")); style_combo->addItem(tr("Lines"), QVariant("-")); style_combo->addItem(tr("Dots"), QVariant(".")); style_combo->addItem(tr("Points"), QVariant("@")); style_combo->addItem(tr("Lines and points"), QVariant("-@")); style_combo->addItem(tr("Impulses"), QVariant("^")); style_combo->addItem(tr("Steps"), QVariant("L")); style_combo->addItem(tr("Boxes"), QVariant("#")); style_combo->addItem(tr("Error bars"), QVariant("~")); style_combo->addItem(tr("Box error bars"), QVariant("#~")); hlayout->addWidget(style_combo); style_combo->show(); QLabel *color_label= new QLabel(tr("Color"),this); hlayout->addWidget(color_label); color_label->show(); color_combo= new QComboBox(this); color_combo->addItem( tr("None"), QVariant("") ); color_combo->addItem( tr("Red"), QVariant("r") ); color_combo->addItem( tr("Green"), QVariant("g") ); color_combo->addItem( tr("Blue"), QVariant("b") ); color_combo->addItem( tr("Magenta"), QVariant("m") ); color_combo->addItem( tr("Cyan"), QVariant("c") ); color_combo->addItem( tr("White"), QVariant("w") ); hlayout->addWidget(color_combo); color_combo->show(); QLabel *pointStyle_label= new QLabel(tr("Point style"),this); hlayout->addWidget(pointStyle_label); pointStyle_label->show(); pointStyle_combo= new QComboBox(this); pointStyle_combo->addItem( tr("None"), QVariant("") ); pointStyle_combo->addItem( tr("+"), QVariant("+") ); pointStyle_combo->addItem( tr("*"), QVariant("*") ); pointStyle_combo->addItem( tr("o"), QVariant("o") ); pointStyle_combo->addItem( tr("x"), QVariant("x") ); hlayout->addWidget(pointStyle_combo); pointStyle_combo->show(); //Título del dibujo hlayout= new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *title_label = new QLabel(tr("title:"),this); hlayout->addWidget(title_label); title_label->show(); title_lineedit= new QLineEdit(this); hlayout->addWidget(title_lineedit); title_lineedit->show(); no_title = new QCheckBox("No title", this); no_title->setCheckState(Qt::Checked); hlayout->addWidget(no_title); no_title->show(); //Lista de dibujos aceptados plots_tree = new QTreeWidget(this); plots_tree->setColumnCount(7); QStringList headers; switch(type) { case POLAR: headers << "Angle" << "Radio"; default: headers << "x" << "y" << "Error x" << "Error y"; }; headers << "Line style" << "Color" << "Point style" << "Title" << ""; plots_tree->setHeaderLabels(headers); vlayout->addWidget(plots_tree); plots_tree->show(); //Botones hlayout= new QHBoxLayout(); vlayout->addLayout(hlayout); QPushButton *add_button = new QPushButton(tr("Add"),this); hlayout->addWidget(add_button); add_button->show(); connect(add_button, SIGNAL(clicked()), this, SLOT(add_callback()) ); QPushButton *remove_button = new QPushButton(tr("Remove"),this); hlayout->addWidget(remove_button); remove_button->show(); connect(remove_button, SIGNAL(clicked()), this, SLOT(remove_callback()) ); QPushButton *ok_button = new QPushButton(tr("Ok"),this); hlayout->addWidget(ok_button); ok_button->show(); connect(ok_button,SIGNAL(clicked()),this,SLOT(accept())); QPushButton *copy_clipboard_button = new QPushButton(tr("Copy to clipboard"),this); hlayout->addWidget(copy_clipboard_button); copy_clipboard_button->show(); connect(copy_clipboard_button,SIGNAL(clicked()),this,SLOT(copy_clipboard_callback())); QPushButton *cancel_button = new QPushButton(tr("Cancel"),this); hlayout->addWidget(cancel_button); cancel_button->show(); connect(cancel_button,SIGNAL(clicked()),this,SLOT(reject())); } void Plot::add_callback() { int style_index=style_combo->currentIndex(); QString style_text=style_combo->itemText(style_index); QVariant style_data=style_combo->itemData(style_index); int color_index=color_combo->currentIndex(); QString color_text=color_combo->itemText(color_index); QVariant color_data=color_combo->itemData(color_index); int pointStyle_index=pointStyle_combo->currentIndex(); QString pointStyle_text=pointStyle_combo->itemText(pointStyle_index); QVariant pointStyle_data=pointStyle_combo->itemData(pointStyle_index); QString title; if(no_title->checkState()!=Qt::Checked) { title= title_lineedit->text(); } QStringList plot_data; switch(type) { case POLAR: plot_data << x_lineedit->text() << y_lineedit->text() << style_text << color_text << pointStyle_text << title; break; default: plot_data << x_lineedit->text() << y_lineedit->text() << error_x_lineedit->text() << error_y_lineedit->text() << style_text << color_text << pointStyle_text << title; } QTreeWidgetItem *item= new QTreeWidgetItem(plots_tree,plot_data); switch(type) { case POLAR: //Line Style item->setData(2,1,style_data); //Color item->setData(3,1,color_data); //Point Style item->setData(4,1,pointStyle_data); break; default: //Line Style item->setData(4,1,style_data); //Color item->setData(5,1,color_data); //Point Style item->setData(6,1,pointStyle_data); } } void Plot::remove_callback() { QTreeWidgetItem *item= plots_tree->currentItem (); item=plots_tree-> takeTopLevelItem( plots_tree->indexOfTopLevelItem(item) ); delete item; } QString Plot::command() { QString _command; QTextStream command_stream(&_command); //Plot command switch(type) { case POLAR: case PLOT: command_stream << "plot("; break; case SEMILOGY: command_stream << "semilogy("; break; case SEMILOGX: command_stream << "semilogx("; break; case LOGLOG: command_stream << "loglog("; break; }; plots_tree->selectAll(); QList list=plots_tree->selectedItems (); if(list.size()==0) { list=plots_tree->findItems(".*", Qt::MatchRegExp); } for (int i = 0; i < list.size(); ++i) { QTreeWidgetItem *item=list.at(i); QString style; if(type!=POLAR) { if(!item->text(0).isEmpty()) command_stream << item->text(0); if(!item->text(1).isEmpty()) { command_stream << "," << item->text(1); } for(int j=4;j<7;j++) { if( !item->data(j,1).toString().isEmpty() ) style+=item->data(j,1).toString(); } QString title=item->text(7); if( !style.isEmpty() || !title.isEmpty() ) command_stream << ",\"" << style << ";" << title << ";\""; //Put error lines if(!item->text(2).isEmpty()) { command_stream << ",[" << item->text(0) << "-" << item->text(2) << "," << item->text(0) << "+" << item->text(2) << "]'"; if(!item->text(1).isEmpty()) { command_stream << ",[" << item->text(1) << "," << item->text(1) << "]'"; } //Plot Style command_stream << ",\"-"; for(int j=5;j<7;j++) { if( !item->data(j,1).toString().isEmpty() ) command_stream << item->data(j,1).toString(); } command_stream << ";;\""; } if(!item->text(3).isEmpty()) { if(!item->text(0).isEmpty()) { command_stream << ",[" << item->text(0) << "," << item->text(0) << "]'"; } command_stream << ",[" << item->text(1) << "-" << item->text(3) << "," << item->text(1) << "+" << item->text(3) << "]'"; //Plot Style command_stream << ",\"-"; for(int j=5;j<7;j++) { if( !item->data(j,1).toString().isEmpty() ) command_stream << item->data(j,1).toString(); } command_stream << ";;\""; } if( (i+1)text(0); QString r=item->text(1); command_stream << r << ".*cos(" << a << ")," << r << ".*sin(" << a << ")"; for(int j=2;j<5;j++) { if( !item->data(j,1).toString().isEmpty() ) style+=item->data(j,1).toString(); } QString title=item->text(5); if( !style.isEmpty() || !title.isEmpty() ) command_stream << ",\"" << style << ";" << title << ";\""; if( (i+1)setText( command() ); } qtoctave-0.10.1/qtoctave/src/operations/table_plot.cpp0000644000175000017500000002113411511434226022050 0ustar lucaslucas#include "table_plot.h" #include #include #include #include #include #include #include #include #include #include "../config.h" #include "../table.h" TablePlot::TablePlot(QWidget *parent, QTableView *table, ComplexNumberTableModel *model, Type type): QDialog(parent), table(table), model(model) { setWindowIcon( QIcon(QString(ICON_PATH)+"/print") ); this->type = type; //Title switch(type) { case PLOT: setWindowTitle("Plot"); break; case SEMILOGY: setWindowTitle("Semilog y"); break; case SEMILOGX: setWindowTitle("Semilog x"); break; case LOGLOG: setWindowTitle("Log-Log"); break; case POLAR: setWindowTitle("Polar"); break; case BAR: setWindowTitle("Bar"); } QVBoxLayout *vlayout = new QVBoxLayout; setLayout(vlayout); // Title QHBoxLayout *hlayout = new QHBoxLayout; vlayout->addLayout(hlayout); QLabel *title_label = new QLabel(tr("Title"), this); hlayout->addWidget(title_label); title_label->show(); title_lineedit = new QLineEdit(this); hlayout->addWidget(title_lineedit); title_lineedit->show(); //Rows or cols QGroupBox *rows_or_cols = new QGroupBox(tr("Use columns or rows")); use_cols = new QRadioButton(tr("Columns")); use_rows = new QRadioButton(tr("Rows")); use_cols->setChecked(true); QVBoxLayout *rows_or_cols_box = new QVBoxLayout; rows_or_cols_box->addWidget(use_cols); rows_or_cols_box->addWidget(use_rows); rows_or_cols_box->addStretch(1); rows_or_cols->setLayout(rows_or_cols_box); vlayout->addWidget(rows_or_cols); // X, Y (or angle and radio) hlayout = new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *x_label = new QLabel(tr("x"), this); hlayout->addWidget(x_label); x_label->show(); x_lineedit = new QLineEdit(this); hlayout->addWidget(x_lineedit); x_lineedit->show(); hlayout = new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *y_label = new QLabel(tr("y"), this); hlayout->addWidget(y_label); y_label->show(); y_lineedit = new QLineEdit(this); hlayout->addWidget(y_lineedit); y_lineedit->show(); if(type == POLAR) { x_label->setText(tr("Angle")); y_label->setText(tr("Radio")); } //X and Y Errors (or none) if(type != POLAR && type != BAR) { hlayout = new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *x_error_label = new QLabel(tr("x Error"), this); hlayout->addWidget(x_error_label); x_error_label->show(); x_error_lineedit = new QLineEdit(this); hlayout->addWidget(x_error_lineedit); x_error_lineedit->show(); hlayout = new QHBoxLayout(); vlayout->addLayout(hlayout); QLabel *y_error_label = new QLabel(tr("y Error"), this); hlayout->addWidget(y_error_label); y_error_label->show(); y_error_lineedit = new QLineEdit(this); hlayout->addWidget(y_error_lineedit); y_error_lineedit->show(); } if(type != BAR){ //Style QGroupBox *style_box = new QGroupBox(tr("Style")); hlayout = new QHBoxLayout(); style_box->setLayout(hlayout); vlayout->addWidget(style_box); //Line style QLabel *style_label = new QLabel(tr("Line style"), style_box); hlayout->addWidget(style_label); style_label->show(); style_combo = new QComboBox(style_box); style_combo->addItem(tr("None"), QVariant("")); style_combo->addItem(tr("Lines"), QVariant("-")); style_combo->addItem(tr("Dots"), QVariant(".")); style_combo->addItem(tr("Points"), QVariant("@")); style_combo->addItem(tr("Lines and points"), QVariant("-@")); style_combo->addItem(tr("Impulses"), QVariant("^")); style_combo->addItem(tr("Steps"), QVariant("L")); style_combo->addItem(tr("Boxes"), QVariant("#")); style_combo->addItem(tr("Error bars"), QVariant("~")); style_combo->addItem(tr("Box error bars"), QVariant("#~")); hlayout->addWidget(style_combo); style_combo->show(); //Color QLabel *color_label = new QLabel(tr("Color"), style_box); hlayout->addWidget(color_label); color_label->show(); color_combo = new QComboBox(style_box); color_combo->addItem(tr("None"), QVariant("")); color_combo->addItem(tr("Red"), QVariant("r")); color_combo->addItem(tr("Green"), QVariant("g")); color_combo->addItem(tr("Blue"), QVariant("b")); color_combo->addItem(tr("Magenta"), QVariant("m")); color_combo->addItem(tr("Cyan"), QVariant("c")); color_combo->addItem(tr("White"), QVariant("w")); hlayout->addWidget(color_combo); color_combo->show(); //Point QLabel *point_label = new QLabel(tr("Point style"), style_box); hlayout->addWidget(point_label); point_label->show(); point_combo = new QComboBox(style_box); point_combo->addItem(tr("None"), QVariant("")); point_combo->addItem(tr("+"), QVariant("+")); point_combo->addItem(tr("*"), QVariant("*")); point_combo->addItem(tr("o"), QVariant("o")); point_combo->addItem(tr("x"), QVariant("x")); hlayout->addWidget(point_combo); point_combo->show(); }//End if //Buttons hlayout = new QHBoxLayout(); vlayout->addLayout(hlayout); QPushButton *ok_button = new QPushButton(tr("Ok"), this); hlayout->addWidget(ok_button); ok_button->show(); connect(ok_button, SIGNAL(clicked()), this, SLOT(accept())); QPushButton *cancel_button = new QPushButton(tr("Cancel"), this); hlayout->addWidget(cancel_button); cancel_button->show(); connect(cancel_button, SIGNAL(clicked()), this, SLOT(reject())); } QString TablePlot::command() { int i, j, k; QString x_values, y_values; QTextStream x_values_stream(&x_values), y_values_stream(&y_values); QString x_error_values, y_error_values; QTextStream x_error_values_stream(&x_error_values), y_error_values_stream(&y_error_values); //Get X, Y and error values if(this->use_cols) { j = x_lineedit->text().toInt() - 1; k = y_lineedit->text().toInt() - 1; //Check index if( (j < 0 || j >= model->columnCount()) || (k < 0 || k >= model->columnCount())) throw "Wrong column index"; if(type != POLAR) { //Get for(i = 0;i < model->rowCount(); i++) { x_values_stream << model->data(i, j) << ","; y_values_stream << model->data(i, k) << ","; } //Errors if(type != BAR) { j = x_error_lineedit->text().toInt() - 1; k = y_error_lineedit->text().toInt() - 1; for(i = 0; j > -1 && i < model->rowCount(); i++) x_error_values_stream << model->data(i, j) << ","; for(i = 0; k > -1 && i < model->rowCount(); i++) y_error_values_stream << model->data(i, k) << ","; } }else{ QString a, r; //Get for(i = 0; i < model->rowCount(); i++) { a = model->data(i, j); r = model->data(i, k); x_values_stream << r << ".*cos(" << a << "),"; y_values_stream << r << ".*sin(" << a << "),"; } } }else { j = x_lineedit->text().toInt() - 1; k = y_lineedit->text().toInt() - 1; //Check index if( (j < 0 || j >= model->rowCount()) || (k < 0 || k >= model->rowCount())) throw "Wrong row index"; if(type != POLAR) { //Get for(i = 0; i < model->columnCount(); i++) { x_values_stream << model->data(j, i) << ","; y_values_stream << model->data(k, i) << ","; } //Errors if(type != BAR) { j = x_error_lineedit->text().toInt() - 1; k = y_error_lineedit->text().toInt() - 1; for(i = 0; j > -1 && i < model->columnCount(); i++) x_error_values_stream << model->data(j, i) << ","; for(i = 0; k > -1 && i < model->columnCount(); i++) y_error_values_stream << model->data(k, i) << ","; } }else{ QString a, r; //Get for(i = 0; i < model->columnCount(); i++) { a = model->data(j, i); r = model->data(k, i); x_values_stream << r << ".*cos(" << a << "),"; y_values_stream << r << ".*sin(" << a << "),"; } } } //Command QString command; QTextStream command_stream(&command); switch(type) { case POLAR: case PLOT: command_stream << "plot("; break; case SEMILOGY: command_stream << "semilogy("; break; case SEMILOGX: command_stream << "semilogx("; break; case LOGLOG: command_stream << "loglog("; break; case BAR: command_stream << "bar("; } command_stream << "[" << x_values << "]," << "[" << y_values << "]"; if(type != BAR) { QString style, color, point; style = style_combo->itemData(style_combo->currentIndex()).toString(); color = color_combo->itemData(color_combo->currentIndex()).toString(); point = point_combo->itemData(point_combo->currentIndex()).toString(); command_stream << ",\"" << style << color << point << "\"" << ")"; }else command_stream << ")"; return command; } qtoctave-0.10.1/qtoctave/src/operations/general_menu.h0000644000175000017500000000165711511434226022041 0ustar lucaslucas#include "ui_general_menu.h" #include "../config.h" #include using namespace Ui; /** Shows config window for Config/Generan configuration menu. This class is part of Operations module. */ class General_Menu: public QDialog { Q_OBJECT public: General_Menu(QWidget *parent=0); Ui_GeneralMenu ui; void apply_config(); private: QFont config_font; QColor foreground_color; QColor background_color; QColor error_color; QFont text_edit_font; void set_font_label(); void set_color_label(); public slots: void editor_select_button_callback(); void help_path_select_pushButton_callback(); void font_button_callback(); void foreground_button_callback(); void background_button_callback(); void error_button_callback(); void octaveDirRem_button_callback(); void octaveDirAdd_button_callback(); void octave_path_button_callback(); void textEditFont_pushButton_callback(); void easy_plot_path_button_callback(); }; qtoctave-0.10.1/qtoctave/src/operations/operations.cpp0000644000175000017500000011646611511434226022123 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "../operations.h" #include "../editor.h" #include "../projects/projects.h" #include #include #include #include #include #include #include #include #include #include #include #include #include Operations::Operations(QObject *parent, BaseWidget **active_widget, MainWindow *main_window):QObject(parent) { this->active_widget=active_widget; this->main_window=main_window; //File actions connect(main_window->actions.value("exit"), SIGNAL(triggered()), this, SLOT(exit_callback())); connect(main_window->actions.value("cd"), SIGNAL(triggered()), this, SLOT(cd_callback())); //Matrix signals connect(main_window->actions.value("+"), SIGNAL(triggered()), this, SLOT(suma_callback())); connect(main_window->actions.value("*"), SIGNAL(triggered()), this, SLOT(producto_callback())); connect(main_window->actions.value("**"), SIGNAL(triggered()), this, SLOT(exponente_callback())); connect(main_window->actionInverse, SIGNAL(triggered()), this, SLOT(inverse_callback())); connect(main_window->actionDeterminant, SIGNAL(triggered()), this, SLOT(determinant_callback())); connect(main_window->actionEigenvalues, SIGNAL(triggered()), this, SLOT(eigenvalues_callback())); connect(main_window->actionTranspose, SIGNAL(triggered()), this, SLOT(transpose_callback())); connect(main_window->actionSubmatrix, SIGNAL(triggered()), this, SLOT(submatrix_callback())); //Statistics signals connect(main_window->actionMean, SIGNAL(triggered()), this, SLOT(mean_callback())); connect(main_window->actionMedian, SIGNAL(triggered()), this, SLOT(median_callback())); connect(main_window->actionStd, SIGNAL(triggered()), this, SLOT(std_callback())); connect(main_window->actionCov, SIGNAL(triggered()), this, SLOT(cov_callback())); connect(main_window->actionCorrcoef, SIGNAL(triggered()), this, SLOT(corrcoef_callback())); //Plot signals connect(main_window->actionPlot, SIGNAL(triggered()), this, SLOT(plot_callback())); connect(main_window->actionSemilogy, SIGNAL(triggered()), this, SLOT(semilogy_callback())); connect(main_window->actionSemilogx, SIGNAL(triggered()), this, SLOT(semilogx_callback())); connect(main_window->actionLogLog, SIGNAL(triggered()), this, SLOT(log_log_callback())); connect(main_window->actionPolar, SIGNAL(triggered()), this, SLOT(polar_callback())); connect(main_window->actions.value("errorbar"), SIGNAL(triggered()), this, SLOT(error_bars_callback())); connect(main_window->actions.value("hist"), SIGNAL(triggered()), this, SLOT(hist_callback())); connect(main_window->actions.value("bar"), SIGNAL(triggered()), this, SLOT(bar_callback())); connect(main_window->actions.value("contour"), SIGNAL(triggered()), this, SLOT(contour_callback())); connect(main_window->actions.value("mesh"), SIGNAL(triggered()), this, SLOT(mesh_callback())); connect(main_window->actionAxis, SIGNAL(triggered()), this, SLOT(axis_callback())); connect(main_window->actionTitleLabel, SIGNAL(triggered()), this, SLOT(title_label_callback())); //connect(main_window->actionToEPS, SIGNAL(triggered()), this, SLOT(to_eps_callback())); //connect(main_window->actionToPDF, SIGNAL(triggered()), this, SLOT(to_pdf_callback())); //connect(main_window->actionToPNG, SIGNAL(triggered()), this, SLOT(to_png_callback())); //General signals connect(main_window->actionProjects, SIGNAL(triggered()), this, SLOT(show_projects_dialog())); //Config signals connect(main_window->actionGeneralConfig, SIGNAL(triggered()), this, SLOT(general_config_callback())); connect(main_window->actions.value("qtoctave_pkg"), SIGNAL(triggered()), this, SLOT(qtoctave_pkg_callback())); } void Operations::setOctaveConnection(OctaveConnection *octave_connection) { this->octave_connection=octave_connection; } void Operations::setMatrix(QString matrix) { this->matrix=matrix; } void Operations::inverse_callback() { /* BaseWidget *top_widget=*active_widget; QString window_name=top_widget->windowTitle(); if(top_widget->widgetType()==TABLE) { QString aux; QTextStream(&window_name) >> aux >> matrix; } */ bool ok; ok=input_dialog("Inverse", "Matrix name:", matrix); if (ok && !matrix.isEmpty()) { QString command; QTextStream(&command) << "inv(" << matrix << ")"; if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(command); } //else if(window_name.startsWith("Octave Terminal") || window_name.startsWith("Help")) else { octave_connection->command_enter(command); } //else if(window_name.startsWith("Table:")) //{ // octave_connection->command_enter(matrix+"="+command); // ((Table*)top_widget)->windowActivated(top_widget); //} } } void Operations::determinant_callback() { /* BaseWidget *top_widget=*active_widget; QString window_name=top_widget->windowTitle(); if(top_widget->widgetType()==TABLE) { QString aux; QTextStream(&window_name) >> aux >> matrix; } */ bool ok; ok=input_dialog("Determinant", "Matrix name:", matrix); if (ok && !matrix.isEmpty()) { QString command; QTextStream(&command) << "det(" << matrix << ")"; if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(command); } else octave_connection->command_enter(command); } } void Operations::eigenvalues_callback() { /* BaseWidget *top_widget=*active_widget; QString window_name=top_widget->windowTitle(); if(top_widget->widgetType()==TABLE) { QString aux; QTextStream(&window_name) >> aux >> matrix; } */ copy_clipboard_ok=false; //Se muestra el cuadro de di�ogo. QDialog dialog(main_window); dialog.setWindowTitle("Eigenvalues and eigenvectors"); QVBoxLayout layout; dialog.setLayout(&layout); QLabel matrix_label("Matrix name:",&dialog); layout.addWidget(&matrix_label); matrix_label.show(); QLineEdit matrix_lineedit(&dialog); matrix_lineedit.setText(matrix); layout.addWidget(&matrix_lineedit); matrix_lineedit.show(); QLabel eigenvalues_label("Eigenvalues matrix name:",&dialog); layout.addWidget(&eigenvalues_label); eigenvalues_label.show(); QLineEdit eigenvalues_lineedit(&dialog); eigenvalues_lineedit.setText("eigenvalues"); layout.addWidget(&eigenvalues_lineedit); eigenvalues_lineedit.show(); QLabel eigenvectors_label("Eigenvectors matrix name:",&dialog); layout.addWidget(&eigenvectors_label); eigenvectors_label.show(); QLineEdit eigenvectors_lineedit(&dialog); eigenvectors_lineedit.setText("eigenvectors"); layout.addWidget(&eigenvectors_lineedit); eigenvectors_lineedit.show(); QHBoxLayout buttons_layout; layout.addLayout(&buttons_layout); QPushButton ok_button("Ok", &dialog); buttons_layout.addWidget(&ok_button); ok_button.show(); connect(&ok_button,SIGNAL(clicked()),&dialog,SLOT(accept())); QPushButton copy_clipboard_button("Copy to clipboard", &dialog); buttons_layout.addWidget(©_clipboard_button); copy_clipboard_button.show(); connect(©_clipboard_button,SIGNAL(clicked()),&dialog,SLOT(accept())); connect(©_clipboard_button,SIGNAL(clicked()),this,SLOT(copy_clipboard_callback())); QPushButton cancel_button("Cancel", &dialog); buttons_layout.addWidget(&cancel_button); cancel_button.show(); connect(&cancel_button,SIGNAL(clicked()),&dialog,SLOT(reject())); dialog.exec(); matrix=matrix_lineedit.text(); QString eigenvalues=eigenvalues_lineedit.text(); QString eigenvectors=eigenvectors_lineedit.text(); if (dialog.result()==QDialog::Accepted && !matrix.isEmpty() && !eigenvectors.isEmpty() && ! eigenvalues.isEmpty()) { QString command; QTextStream(&command) << "[" << eigenvectors << "," << eigenvalues << "]=eig(" << matrix << ")"; if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(command); } else { octave_connection->command_enter(command); } } } void Operations::transpose_callback() { /* BaseWidget *top_widget=*active_widget; QString window_name=top_widget->windowTitle(); if(top_widget->widgetType()==TABLE) { QString aux; QTextStream(&window_name) >> aux >> matrix; } */ bool ok; ok=input_dialog("Transpose", "Matrix name:", matrix); if (ok && !matrix.isEmpty()) { QString command; QTextStream(&command) << matrix << ".'"; if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(command); } else // if(window_name.startsWith("Octave Terminal") || window_name.startsWith("Help")) { octave_connection->command_enter(command); } //else if(window_name.startsWith("Table:")) //{ // octave_connection->command_enter(matrix+"="+command); // ((Table*)top_widget)->windowActivated(top_widget); //} } } void Operations::submatrix_callback() { /* BaseWidget *top_widget=*active_widget; QString window_name=top_widget->windowTitle(); if(top_widget->widgetType()==TABLE) { QString aux; QTextStream(&window_name) >> aux >> matrix; } */ copy_clipboard_ok=false; //Se muestra el cuadro de di�ogo. QDialog dialog(main_window); dialog.setWindowTitle("Submatrix"); QVBoxLayout layout; dialog.setLayout(&layout); QLabel matrix_label("Matrix name:",&dialog); layout.addWidget(&matrix_label); matrix_label.show(); QLineEdit matrix_lineedit(&dialog); matrix_lineedit.setText(matrix); layout.addWidget(&matrix_lineedit); matrix_lineedit.show(); QHBoxLayout rows_layout; layout.addLayout(&rows_layout); QLabel from_row_label("From row:",&dialog); rows_layout.addWidget(&from_row_label); from_row_label.show(); QLineEdit from_row_lineedit(&dialog); from_row_lineedit.setText("1"); rows_layout.addWidget(&from_row_lineedit); from_row_lineedit.show(); QLabel to_row_label("To row:",&dialog); rows_layout.addWidget(&to_row_label); to_row_label.show(); QLineEdit to_row_lineedit(&dialog); to_row_lineedit.setText("1"); rows_layout.addWidget(&to_row_lineedit); to_row_lineedit.show(); QHBoxLayout cols_layout; layout.addLayout(&cols_layout); QLabel from_col_label("From column:",&dialog); cols_layout.addWidget(&from_col_label); from_col_label.show(); QLineEdit from_col_lineedit(&dialog); from_col_lineedit.setText("1"); cols_layout.addWidget(&from_col_lineedit); from_col_lineedit.show(); QLabel to_col_label("To column:",&dialog); cols_layout.addWidget(&to_col_label); to_col_label.show(); QLineEdit to_col_lineedit(&dialog); to_col_lineedit.setText("1"); cols_layout.addWidget(&to_col_lineedit); to_col_lineedit.show(); QHBoxLayout buttons_layout; layout.addLayout(&buttons_layout); QPushButton ok_button("Ok", &dialog); buttons_layout.addWidget(&ok_button); ok_button.show(); connect(&ok_button,SIGNAL(clicked()),&dialog,SLOT(accept())); QPushButton copy_clipboard_button("Copy to clipboard", &dialog); buttons_layout.addWidget(©_clipboard_button); copy_clipboard_button.show(); connect(©_clipboard_button,SIGNAL(clicked()),&dialog,SLOT(accept())); connect(©_clipboard_button,SIGNAL(clicked()),this,SLOT(copy_clipboard_callback())); QPushButton cancel_button("Cancel", &dialog); buttons_layout.addWidget(&cancel_button); cancel_button.show(); connect(&cancel_button,SIGNAL(clicked()),&dialog,SLOT(reject())); dialog.exec(); matrix=matrix_lineedit.text(); QString from_row=from_row_lineedit.text(); QString to_row=to_row_lineedit.text(); QString from_col=from_col_lineedit.text(); QString to_col=to_col_lineedit.text(); if (dialog.result()==QDialog::Accepted && !matrix.isEmpty() && !from_row.isEmpty() && !to_row.isEmpty() && !from_col.isEmpty() && !to_col.isEmpty()) { QString command; QTextStream(&command) << matrix << "(" << from_row << ":" << to_row << "," << from_col << ":" << to_col <<")"; if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(command); } else { octave_connection->command_enter(command); } } } void Operations::copy_clipboard_callback() { copy_clipboard_ok=true; } bool Operations::input_dialog(QString title, QString label, QString &input) { copy_clipboard_ok=false; //Show the dialog window QDialog dialog(main_window); dialog.setWindowTitle(title); QVBoxLayout layout; dialog.setLayout(&layout); QLabel matrix_label(label,&dialog); layout.addWidget(&matrix_label); matrix_label.show(); QLineEdit matrix_lineedit(&dialog); matrix_lineedit.setText(matrix); layout.addWidget(&matrix_lineedit); matrix_lineedit.show(); QHBoxLayout buttons_layout; layout.addLayout(&buttons_layout); QPushButton ok_button("Ok", &dialog); buttons_layout.addWidget(&ok_button); ok_button.show(); connect(&ok_button,SIGNAL(clicked()),&dialog,SLOT(accept())); QPushButton copy_clipboard_button("Copy to clipboard", &dialog); buttons_layout.addWidget(©_clipboard_button); copy_clipboard_button.show(); connect(©_clipboard_button,SIGNAL(clicked()),&dialog,SLOT(accept())); connect(©_clipboard_button,SIGNAL(clicked()),this,SLOT(copy_clipboard_callback())); QPushButton cancel_button("Cancel", &dialog); buttons_layout.addWidget(&cancel_button); cancel_button.show(); connect(&cancel_button,SIGNAL(clicked()),&dialog,SLOT(reject())); dialog.exec(); input=matrix_lineedit.text(); if (dialog.result()==QDialog::Accepted && !input.isEmpty()) return true; return false; } void Operations::simple_comand(QString title, QString label, QString _command) { /* BaseWidget *top_widget=*active_widget; bool ok; if(top_widget->widgetType()==TABLE) { matrix=((Table*)top_widget)->getMatrix(); } */ bool ok; ok=input_dialog(title, label, matrix); if (ok && !matrix.isEmpty()) { QString command; QTextStream(&command) << _command << "(" << matrix << ")"; if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(command); } else { octave_connection->command_enter(command); } } } Operations::MenuResult Operations::menu_window(QString title, QStringList parameters_labels, QStringList ¶meters, QStringList output_labels, QStringList &output, QString help, bool accept_blank_parameters) { copy_clipboard_ok=false; //Se muestra el cuadro de di�ogo. QDialog dialog(main_window); dialog.setWindowTitle(title); QVBoxLayout *layout=new QVBoxLayout; dialog.setLayout(layout); QLabel *parameters_label[parameters_labels.size()]; QLineEdit *parameters_lineedit[parameters_labels.size()]; if(parameters_labels.size()>0) { QGroupBox *input_box=new QGroupBox(&dialog); QVBoxLayout *input_layout=new QVBoxLayout; input_box->setTitle("Input parameters"); layout->addWidget(input_box); input_box->setLayout(input_layout); input_box->show(); for (int i = 0; i < parameters_labels.size(); ++i) { QHBoxLayout *parameters_layout=new QHBoxLayout; input_layout->addLayout(parameters_layout); parameters_label[i]=new QLabel(input_box); parameters_label[i]->setText(parameters_labels.at(i)); parameters_layout->addWidget(parameters_label[i]); parameters_label[i]->show(); parameters_lineedit[i]=new QLineEdit(input_box); parameters_lineedit[i]->setText(parameters.at(i)); parameters_layout->addWidget(parameters_lineedit[i]); parameters_lineedit[i]->show(); } } QLabel *output_label[parameters_labels.size()]; QLineEdit *output_lineedit[parameters_labels.size()]; if(output_labels.size()>0) { QGroupBox *output_box=new QGroupBox(&dialog); QVBoxLayout *output_box_layout=new QVBoxLayout; output_box->setTitle("Output parameters"); layout->addWidget(output_box); output_box->setLayout(output_box_layout); output_box->show(); for (int i = 0; i < output_labels.size(); ++i) { QHBoxLayout *output_layout=new QHBoxLayout; output_box_layout->addLayout(output_layout); output_label[i]= new QLabel(output_box); output_label[i]->setText(output_labels.at(i)); output_layout->addWidget(output_label[i]); output_label[i]->show(); output_lineedit[i]= new QLineEdit(output_box); output_lineedit[i]->setText(output.at(i)); output_layout->addWidget(output_lineedit[i]); output_lineedit[i]->show(); } } QTextBrowser *help_text=new QTextBrowser(&dialog); help_text->hide(); if(!help.isEmpty()) { help_text->setHtml(help); layout->addWidget(help_text); help_text->show(); } QHBoxLayout *buttons_layout=new QHBoxLayout; layout->addLayout(buttons_layout); QPushButton ok_button("Ok", &dialog); buttons_layout->addWidget(&ok_button); ok_button.show(); connect(&ok_button,SIGNAL(clicked()),&dialog,SLOT(accept())); QPushButton copy_clipboard_button("Copy to clipboard", &dialog); buttons_layout->addWidget(©_clipboard_button); copy_clipboard_button.show(); connect(©_clipboard_button,SIGNAL(clicked()),&dialog,SLOT(accept())); connect(©_clipboard_button,SIGNAL(clicked()),this,SLOT(copy_clipboard_callback())); QPushButton cancel_button("Cancel", &dialog); buttons_layout->addWidget(&cancel_button); cancel_button.show(); connect(&cancel_button,SIGNAL(clicked()),&dialog,SLOT(reject())); dialog.exec(); if (dialog.result()==QDialog::Accepted) { for (int i = 0; i < output_labels.size(); ++i) { if(output_lineedit[i]->text().isEmpty() && !accept_blank_parameters) { return CANCEL; } } for (int i = 0; i < parameters_labels.size(); ++i) { if(parameters_lineedit[i]->text().isEmpty() && !accept_blank_parameters) { return CANCEL; } } if(output_labels.size()>0) { output.clear(); for (int i = 0; i < output_labels.size(); ++i) { output << output_lineedit[i]->text(); } } if(parameters_labels.size()>0) { parameters.clear(); for (int i = 0; i < parameters_labels.size(); ++i) { parameters << parameters_lineedit[i]->text(); } } if(copy_clipboard_ok) { return COPY_CLIPBOARD; } else { return ACCEPTED; } } return CANCEL; } void Operations::compex_comand(QString title, QString _command, QStringList parameters_labels, QStringList & parameters, QStringList output_labels, QStringList & output, QString help, bool is_table, bool accept_blank_parameters) { MenuResult r=menu_window(title, parameters_labels, parameters, output_labels, output, help, accept_blank_parameters); QString command; if (r!=CANCEL) { QTextStream command_stream(&command); if(output_labels.size()>0) { command_stream << "["; for (int i = 0; i < output_labels.size();) { command_stream << output.at(i); ++i; if(i < output_labels.size()) command_stream << ","; } command_stream << "]="; } if(parameters_labels.size()>0) { command_stream << _command << "("; if( !parameters.at(0).isEmpty() ) command_stream << parameters.at(0); for (int i = 1; i < parameters_labels.size();i++) { if( !parameters.at(i).isEmpty() ) { command_stream << "," << parameters.at(i); //++i; //if( i < parameters_labels.size() ) command_stream << ","; } //else i++; } command_stream << ")"; } } else return; if(r==COPY_CLIPBOARD) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(command); } //r==ACCEPTED else if(!is_table) { octave_connection->command_enter(command); } else { //BaseWidget *top_widget=*active_widget; matrix=parameters.at(0); /* if(top_widget->widgetType()==TABLE) { if( matrix==((Table*)top_widget)->getMatrix() ) { command=matrix+"="+command; } } */ octave_connection->command_enter(command); } } void Operations::mean_callback() { simple_comand("Mean", "Vector name:", "mean"); } void Operations::median_callback() { simple_comand("Median", "Vector name:", "median"); } void Operations::std_callback() { simple_comand("Standard deviation", "Vector name:", "std"); } void Operations::cov_callback() { QStringList parameters_labels; parameters_labels << "x" << "y"; QStringList parameters; parameters << "" << ""; QStringList output_labels; QStringList output; QString help("Calculates covariance: cov(x,y)
To calculate variance of x use cov(x,x)"); compex_comand("Covariance", "cov", parameters_labels, parameters, output_labels, output, help); } void Operations::corrcoef_callback() { QStringList parameters_labels; parameters_labels << "x" << "y"; QStringList parameters; parameters << "" << ""; QStringList output_labels; QStringList output; compex_comand("Correlation Coefficient", "corrcoef", parameters_labels, parameters, output_labels, output); } void Operations::plot_callback() { Plot *plot = new Plot(main_window); int ok=plot->exec(); if(ok==QDialog::Accepted) { QString command=plot->command(); octave_connection->command_enter(command); } delete plot; } void Operations::semilogy_callback() { Plot *plot = new Plot(main_window, Plot::SEMILOGY); int ok=plot->exec(); if(ok==QDialog::Accepted) { QString command=plot->command(); octave_connection->command_enter(command); } delete plot; } void Operations::semilogx_callback() { Plot *plot = new Plot(main_window, Plot::SEMILOGX); int ok=plot->exec(); if(ok==QDialog::Accepted) { QString command=plot->command(); octave_connection->command_enter(command); } delete plot; } void Operations::log_log_callback() { Plot *plot = new Plot(main_window, Plot::LOGLOG); int ok=plot->exec(); if(ok==QDialog::Accepted) { QString command=plot->command(); octave_connection->command_enter(command); } delete plot; } void Operations::polar_callback() { Plot *plot = new Plot(main_window, Plot::POLAR); int ok=plot->exec(); if(ok==QDialog::Accepted) { QString command=plot->command(); octave_connection->command_enter(command); } delete plot; } void Operations::error_bars_callback() { QDialog dialog(main_window); dialog.setWindowTitle("Error Bars"); QVBoxLayout layout; dialog.setLayout(&layout); QTextBrowser text(&dialog); layout.addWidget(&text); text.setHtml( "Please use Plot menu.
You can use errorbar command to plot error bars. Also you can use loglogerr, semilogxerr and semilogyerr for log a semilog errorbars graph.
Another way to plot error bars is use plot command and the next function to generate error bars:
"
	"%Error bar matrix for plots\n"
	"function [xx, yy]=error_bar(x,y,lex,rex)\n"
	" k=1;\n"
	" for i=1:rows(x)\n"
	"  for j=1:columns(x)\n"
	"   yy(1,k)=y(i,j);\n"
	"   yy(2,k)=y(i,j);\n"
	"   xx(1,k)=x(i,j)-lex(i,j);\n"
	"   xx(2,k)=x(i,j)+rex(i,j);\n"
	"   k=k+1;\n"
	"  end\n"
	" end\n"
	"end\n\n
" "Per example:\n
" "If you have data in x and y. Errors are in ex and ey. You can plot error bars using:
"
	"%Create horizontal error bars\n"
	"[xxX, yyX]=error_bar(x,y,ex,ex);\n"
	"%Create vertical error bars. IMPORTANT: x and y position are changed.\n"
	"[yyY, xxY]=error_bar(y,x,ey,ey);\n"
	"%Plot points with error bars\n"
	"plot(x,y,\"+\",xxX,yyX,\"-b\",xxY,yyY,\"-b\");\n"
	"
" ); text.show(); QHBoxLayout buttons_layout; layout.addLayout(&buttons_layout); QPushButton copy_clipboard_button("Copy to clipboard", &dialog); buttons_layout.addWidget(©_clipboard_button); copy_clipboard_button.show(); connect(©_clipboard_button,SIGNAL(clicked()),&dialog,SLOT(accept())); connect(©_clipboard_button,SIGNAL(clicked()),this,SLOT(copy_clipboard_callback())); QPushButton cancel_button("Cancel", &dialog); buttons_layout.addWidget(&cancel_button); cancel_button.show(); connect(&cancel_button,SIGNAL(clicked()),&dialog,SLOT(reject())); dialog.exec(); if (dialog.result()==QDialog::Accepted) { if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText( "%Error bar matrix for plots\n" "function [xx, yy]=error_bar(x,y,lex,rex)\n" " k=1;\n" " for i=1:rows(x)\n" " for j=1:columns(x)\n" " yy(1,k)=y(i,j);\n" " yy(2,k)=y(i,j);\n" " xx(1,k)=x(i,j)-lex(i,j);\n" " xx(2,k)=x(i,j)+rex(i,j);\n" " k=k+1;\n" " end\n" " end\n" "end\n" ); } else { //octave_connection->command_enter(_axis_command); } } } void Operations::axis_callback() { copy_clipboard_ok=false; //Se muestra el cuadro de di�ogo. QDialog dialog(main_window); dialog.setWindowTitle("Axis"); QVBoxLayout layout; dialog.setLayout(&layout); QHBoxLayout *hlayout= new QHBoxLayout(); layout.addLayout(hlayout); QLabel x_min_axis("x-min:",&dialog); hlayout->addWidget(&x_min_axis); x_min_axis.show(); QLineEdit x_min_lineedit(&dialog); hlayout->addWidget(&x_min_lineedit); x_min_lineedit.show(); QLabel x_max_axis("x-max:",&dialog); hlayout->addWidget(&x_max_axis); x_max_axis.show(); QLineEdit x_max_lineedit(&dialog); hlayout->addWidget(&x_max_lineedit); x_max_lineedit.show(); QCheckBox x_autoscale("Autoscale x",&dialog); x_autoscale.setCheckState(Qt::Checked); hlayout->addWidget(&x_autoscale); x_autoscale.show(); QCheckBox x_tic("Tic marks x",&dialog); x_tic.setCheckState(Qt::Checked); hlayout->addWidget(&x_tic); x_tic.show(); hlayout= new QHBoxLayout(); layout.addLayout(hlayout); QLabel y_min_axis("y-min:",&dialog); hlayout->addWidget(&y_min_axis); y_min_axis.show(); QLineEdit y_min_lineedit(&dialog); hlayout->addWidget(&y_min_lineedit); y_min_lineedit.show(); QLabel y_max_axis("y-max:",&dialog); hlayout->addWidget(&y_max_axis); y_max_axis.show(); QLineEdit y_max_lineedit(&dialog); hlayout->addWidget(&y_max_lineedit); y_max_lineedit.show(); QCheckBox y_autoscale("Autoscale y",&dialog); y_autoscale.setCheckState(Qt::Checked); hlayout->addWidget(&y_autoscale); y_autoscale.show(); QCheckBox y_tic("Tic marks y",&dialog); y_tic.setCheckState(Qt::Checked); hlayout->addWidget(&y_tic); y_tic.show(); hlayout= new QHBoxLayout(); layout.addLayout(hlayout); QLabel z_min_axis("z-min:",&dialog); hlayout->addWidget(&z_min_axis); z_min_axis.show(); QLineEdit z_min_lineedit(&dialog); hlayout->addWidget(&z_min_lineedit); z_min_lineedit.show(); QLabel z_max_axis("z-max:",&dialog); hlayout->addWidget(&z_max_axis); z_max_axis.show(); QLineEdit z_max_lineedit(&dialog); hlayout->addWidget(&z_max_lineedit); z_max_lineedit.show(); QCheckBox z_autoscale("Autoscale z",&dialog); z_autoscale.setCheckState(Qt::Checked); hlayout->addWidget(&z_autoscale); z_autoscale.show(); QCheckBox z_tic("Tic marks z",&dialog); z_tic.setCheckState(Qt::Checked); hlayout->addWidget(&z_tic); z_tic.show(); QCheckBox show_grid("Show grid", &dialog); layout.addWidget(&show_grid); show_grid.show(); QHBoxLayout buttons_layout; layout.addLayout(&buttons_layout); QPushButton ok_button("Ok", &dialog); buttons_layout.addWidget(&ok_button); ok_button.show(); connect(&ok_button,SIGNAL(clicked()),&dialog,SLOT(accept())); QPushButton copy_clipboard_button("Copy to clipboard", &dialog); buttons_layout.addWidget(©_clipboard_button); copy_clipboard_button.show(); connect(©_clipboard_button,SIGNAL(clicked()),&dialog,SLOT(accept())); connect(©_clipboard_button,SIGNAL(clicked()),this,SLOT(copy_clipboard_callback())); QPushButton cancel_button("Cancel", &dialog); buttons_layout.addWidget(&cancel_button); cancel_button.show(); connect(&cancel_button,SIGNAL(clicked()),&dialog,SLOT(reject())); dialog.exec(); if (dialog.result()==QDialog::Accepted) { QString _axis_command; QTextStream axis_stream(&_axis_command); axis_stream << "axis(["; if( !x_min_lineedit.text().isEmpty() ) axis_stream << x_min_lineedit.text() << ","; else axis_stream << "0,"; if( !x_max_lineedit.text().isEmpty() ) axis_stream << x_max_lineedit.text() << ","; else axis_stream << "0,"; if( !y_min_lineedit.text().isEmpty() ) axis_stream << y_min_lineedit.text() << ","; else axis_stream << "0,"; if( !y_max_lineedit.text().isEmpty() ) axis_stream << y_max_lineedit.text() << ","; else axis_stream << "0,"; if( !z_min_lineedit.text().isEmpty() ) axis_stream << z_min_lineedit.text() << ","; else axis_stream << "0,"; if( !z_max_lineedit.text().isEmpty() ) axis_stream << z_max_lineedit.text() << "]"; else axis_stream << "0]"; if(x_autoscale.checkState()==Qt::Checked ) axis_stream << ",\"autox\""; if(y_autoscale.checkState()==Qt::Checked ) axis_stream << ",\"autoy\""; if(z_autoscale.checkState()==Qt::Checked ) axis_stream << ",\"autoz\""; if(x_tic.checkState()==Qt::Checked || y_tic.checkState()==Qt::Checked || z_tic.checkState()==Qt::Checked) { axis_stream << ",\"tic"; if(x_tic.checkState()==Qt::Checked) axis_stream << "x"; if(y_tic.checkState()==Qt::Checked) axis_stream << "y"; if(z_tic.checkState()==Qt::Checked) axis_stream << "z"; axis_stream << "\""; } axis_stream << ");\n"; if(show_grid.checkState()==Qt::Checked ) { axis_stream << "grid(\"on\");\n"; } else { axis_stream << "grid(\"off\");\n"; } if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(_axis_command); } else { octave_connection->command_enter(_axis_command); } } } void Operations::title_label_callback() { copy_clipboard_ok=false; //Se muestra el cuadro de di�ogo. QDialog dialog(main_window); dialog.setWindowTitle("Title and Labels"); QVBoxLayout layout; dialog.setLayout(&layout); QGroupBox labels_frame("Labels", &dialog); layout.addWidget(&labels_frame); labels_frame.show(); QVBoxLayout labels_layout; labels_frame.setLayout(&labels_layout); QHBoxLayout *hlayout= new QHBoxLayout(); labels_layout.addLayout(hlayout); QLabel x_label_label("x label:",&labels_frame); hlayout->addWidget(&x_label_label); x_label_label.show(); QLineEdit x_label_lineedit(&labels_frame); hlayout->addWidget(&x_label_lineedit); x_label_lineedit.show(); QCheckBox x_label("Show x label",&labels_frame); //x_label.setCheckState(Qt::UnChecked); hlayout->addWidget(&x_label); x_label.show(); hlayout= new QHBoxLayout(); labels_layout.addLayout(hlayout); QLabel y_label_label("y label:",&labels_frame); hlayout->addWidget(&y_label_label); y_label_label.show(); QLineEdit y_label_lineedit(&labels_frame); hlayout->addWidget(&y_label_lineedit); y_label_lineedit.show(); QCheckBox y_label("Show y label",&labels_frame); //y_label.setCheckState(Qt::Checked); hlayout->addWidget(&y_label); y_label.show(); hlayout= new QHBoxLayout(); labels_layout.addLayout(hlayout); QLabel z_label_label("z label:",&labels_frame); hlayout->addWidget(&z_label_label); z_label_label.show(); QLineEdit z_label_lineedit(&labels_frame); hlayout->addWidget(&z_label_lineedit); z_label_lineedit.show(); QCheckBox z_label("Show z label",&labels_frame); //z_label.setCheckState(Qt::Checked); hlayout->addWidget(&z_label); z_label.show(); QGroupBox title_frame("Title", &dialog); layout.addWidget(&title_frame); title_frame.show(); QVBoxLayout title_layout; title_frame.setLayout(&title_layout); hlayout= new QHBoxLayout(); title_layout.addLayout(hlayout); QLabel title_label("Title:",&title_frame); hlayout->addWidget(&title_label); title_label.show(); QLineEdit title_lineedit(&title_frame); hlayout->addWidget(&title_lineedit); title_lineedit.show(); QHBoxLayout buttons_layout; layout.addLayout(&buttons_layout); QPushButton ok_button("Ok", &dialog); buttons_layout.addWidget(&ok_button); ok_button.show(); connect(&ok_button,SIGNAL(clicked()),&dialog,SLOT(accept())); QPushButton copy_clipboard_button("Copy to clipboard", &dialog); buttons_layout.addWidget(©_clipboard_button); copy_clipboard_button.show(); connect(©_clipboard_button,SIGNAL(clicked()),&dialog,SLOT(accept())); connect(©_clipboard_button,SIGNAL(clicked()),this,SLOT(copy_clipboard_callback())); QPushButton cancel_button("Cancel", &dialog); buttons_layout.addWidget(&cancel_button); cancel_button.show(); connect(&cancel_button,SIGNAL(clicked()),&dialog,SLOT(reject())); dialog.exec(); if (dialog.result()==QDialog::Accepted) { QString _axis_command; QTextStream axis_stream(&_axis_command); if(x_label.checkState()==Qt::Checked || y_label.checkState()==Qt::Checked || z_label.checkState()==Qt::Checked) { axis_stream << "axis(\"label"; if(x_label.checkState()==Qt::Checked) axis_stream << "x"; if(y_label.checkState()==Qt::Checked) axis_stream << "y"; if(z_label.checkState()==Qt::Checked) axis_stream << "z"; axis_stream << "\");"; } if(x_label.checkState()==Qt::Checked || y_label.checkState()==Qt::Checked || z_label.checkState()==Qt::Checked) { axis_stream << "\n"; if(x_label.checkState()==Qt::Checked) axis_stream << "xlabel(\"" << x_label_lineedit.text() << "\");\n"; if(y_label.checkState()==Qt::Checked) axis_stream << "ylabel(\"" << y_label_lineedit.text() << "\");\n"; if(z_label.checkState()==Qt::Checked) axis_stream << "zlabel(\"" << z_label_lineedit.text() << "\")\n"; } if(!title_lineedit.text().isEmpty()) { axis_stream << "title(\"" << title_lineedit.text() << "\");\n"; } if(copy_clipboard_ok) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(_axis_command); } else { octave_connection->command_enter(_axis_command); } } } // void Operations::to_eps_callback() // { // QString file = QFileDialog::getSaveFileName(main_window,"Choose a file", ".","Postscript (*.eps *.ps)"); // // if(file.isEmpty()) return; // // QString command; // QTextStream command_stream(&command); // // command_stream << "__gnuplot_set__ term post\n__gnuplot_set__ output \"" << file << "\"\nreplot\n__gnuplot_set__ term x11"; // // octave_connection->command_enter(command); // } // // void Operations::to_pdf_callback() // { // QString file = QFileDialog::getSaveFileName(main_window,"Choose a file", ".","Postscript (*.pdf)"); // // if(file.isEmpty()) return; // // file.replace(" ","\\ "); // // QString command; // QTextStream command_stream(&command); // // command_stream << "__gnuplot_set__ term post\n__gnuplot_set__ output \"|ps2pdf - " << file << " \"\nreplot\n__gnuplot_set__ term x11"; // // octave_connection->command_enter(command); // } // // void Operations::to_png_callback() // { // QString file = QFileDialog::getSaveFileName(main_window,"Choose a file", ".","Postscript (*.png)"); // // if(file.isEmpty()) return; // // QString command; // QTextStream command_stream(&command); // // command_stream << "__gnuplot_set__ term png transparent\n__gnuplot_set__ output \"" << file << "\"\nreplot\n__gnuplot_set__ term x11"; // // octave_connection->command_enter(command); // } void Operations::show_projects_dialog() { Projects projects(main_window); if( QDialog::Accepted==projects.exec() ) { main_window->getSession()->setProjectName(projects.projectName()); QMap configuration; main_window->setWindowTitle("QtOctave ["+session->getProjectName()+"]"); configuration["session_name"]=projects.projectName(); set_config(configuration); } } #include "general_menu.h" void Operations::general_config_callback() { General_Menu dialog(main_window); int ok=dialog.exec(); if(ok==QDialog::Accepted) { dialog.apply_config(); } } void Operations::hist_callback() { QStringList parameters_labels; parameters_labels << "Vector of values" << "Vector with the centers of the bins or number with the number of bins" << "Normal"; QStringList parameters; parameters << "" << "" << ""; QStringList output_labels; QStringList output; QString help( "Given a second scalar argument, use that as the number of bins.
" "Given a second vector argument, use that as the centers of the bins, with the width of the bins determined from the adjacent values in the vector.
" "If third argument is provided, the histogram is normalised such that the sum of the bars is equal to norm.
" ); compex_comand("Histogram", "hist", parameters_labels, parameters, output_labels, output,help,false,true); } void Operations::bar_callback() { QStringList parameters_labels; parameters_labels << "x" << "y"; QStringList parameters; parameters << "" << ""; QStringList output_labels; QStringList output; QString help( "Given two vectors of x-y data, bar produces a bar graph.
" "If only one argument is given, it is taken as a vector of y-values and the x coordinates are taken to be the indices of the elements." ); compex_comand("Bar Graph", "bar", parameters_labels, parameters, output_labels, output,help,false,true); } void Operations::contour_callback() { QStringList parameters_labels; parameters_labels << "x" << "y" << "z"; QStringList parameters; parameters << "" << "" << ""; QStringList output_labels; QStringList output; QString help( "Make a contour plot of the three-dimensional surface described by z.
" "z must be a 2x2 matrix." ); compex_comand("contour plot of the three-dimensional", "contour", parameters_labels, parameters, output_labels, output,help,false,true); } void Operations::mesh_callback() { QStringList parameters_labels; parameters_labels << "x" << "y" << "z"; QStringList parameters; parameters << "" << "" << ""; QStringList output_labels; QStringList output; QString help( "Plot a mesh given matrices x, and y from meshdom and a matrix z corresponding to the x and y coordinates of the mesh. If x and y are vectors, then a typical vertex is (x(j), y(i), z(i,j)). Thus, columns of z correspond to different x values and rows of z correspond to different y values." ); compex_comand("Plot of the three-dimensional", "mesh", parameters_labels, parameters, output_labels, output,help,false,true); } void Operations::suma_callback() { QStringList parameters_labels; QStringList parameters; QStringList output_labels; QStringList output; QString help( "Use + for matrix addition." ); menu_window("A+B",parameters_labels, parameters, output_labels, output,help); } void Operations::producto_callback() { QStringList parameters_labels; QStringList parameters; QStringList output_labels; QStringList output; QString help( "Use * for matrix product." ); menu_window("A*B",parameters_labels, parameters, output_labels, output,help); } void Operations::exponente_callback() { QStringList parameters_labels; QStringList parameters; QStringList output_labels; QStringList output; QString help( "Use ** for matrix exponential." ); menu_window("A**B",parameters_labels, parameters, output_labels, output,help); } void Operations::exit_callback() { //octave_connection->command_enter("quit"); //QApplication::quit(); main_window->close(); } void Operations::cd_callback() { QString dir=QFileDialog::getExistingDirectory ( main_window, "Select dir"); if(dir.isEmpty()) return; QString command("cd \""); command+=dir+"\""; octave_connection->command_enter(command); } void Operations::qtoctave_pkg_callback() { QStringList arguments; QString working_directory; bool ok=QProcess::startDetached("qtoctave_pkg", arguments, working_directory); if(!ok) { QMessageBox::critical(main_window, tr("qtoctave_pkg not found"), tr("qtoctave_pkg can not be executed. Please, install qtoctave_pkg or put it in PATH") ); } } qtoctave-0.10.1/qtoctave/src/operations/table_plot.h0000644000175000017500000000135611511434226021521 0ustar lucaslucas#ifndef __TABLE_PLOT_H__ #define __TABLE_PLOT_H__ #include #include #include #include #include #include class ComplexNumberTableModel; class TablePlot: public QDialog { Q_OBJECT public: enum Type {PLOT, SEMILOGY, SEMILOGX, LOGLOG, POLAR, BAR}; TablePlot(QWidget *parent, QTableView *table, ComplexNumberTableModel *model, Type type = PLOT); QString command(); private: Type type; QRadioButton *use_rows; QRadioButton *use_cols; QLineEdit *x_lineedit, *y_lineedit, *x_error_lineedit, *y_error_lineedit; QLineEdit *title_lineedit; QComboBox *style_combo, *color_combo, *point_combo; QTableView *table; ComplexNumberTableModel *model; }; #endif qtoctave-0.10.1/qtoctave/src/qtoctave_doc/menus.html0000644000175000017500000001225711511434226021532 0ustar lucaslucas QtOctave Menus QtOctave menus.
Menus structure.
Simple way of build menus.
Complete way of build menus.
Menu's icon.

QtOctave menus.

QtOctave menus can be found in /usr/local/share/qtoctave/menus/ or can be located in user's home.

Menus in /usr/local/share/qtoctave/menus/ are read for all users.

Menus in user's home are read only for user.

Menus in user's home are located in ~/.qtoctave/menus/.

Some menus are fixed and cannot be edited.

Menus structure.

Every folder you put in menus folder represents menus. Inside of this folder you can put other menus.

For example, if you you want put a new menu in help menu, you must create a new folder in menus folder called help. Inside of help folder you will put your new menus.

There are two ways of build menus: Simple and complete.

Simple way of build menus.

Only add to your menu folder a .menu file.There is and example of .menu file:

#This is an example of menu for qtoctave

menu_name=Menu title

input_label= Parameter 1
input= parameter1

input_label= Parameter 2
input= parameter2

input_label= Parameter 3
input=

output_label= Output Parameter 1
output= output1

output_label= Output Parameter 2
output= output2

begin{help}
<html>
<body>
<b>This is an example.</b><br>
Help of example.
</body>
</html>
end{help}

begin{command}
title("%i1%");
sombrero(%i2%);
[%o1%,%o2%] = hola (%i1%,%i2%,%i3%);
end{command}

Lines starting with # are commens.

menu_name property is name of menu window.

input_label is label of input parameter.

input property is name of this parameter in code. You can add all parameters you need.

input_file property is name of file in code.

begin{input_list}...end{input_list} lets select one property from list inside begin{input_list} and end{input_list}. Each line represents one option.

output_label, output, begin{output_list}...end{output_list} and output_file properties are similar with output parameters.

begin{command}...end{command} is code that will be passed to octave.
%i1% is 1st input parameter, %i2% is second input parameter,...
%o1% is 1st output parameter, %o2% is second output parameter,...

begin{help}...end{help} is this menu help. Help must be in html. This parameter is not needed.

Example: Easy integrate.menu has the next code:

#This is an example of menu for qtoctave

menu_name= Integrate Function Easy

input_label= Function name f(x)
input=

input_label= 1st limit of integration
input=

input_label= 2st limit of integration
input=

output_label= Value
output=v

output_label=ier
output=ier

output_label= nfun
output=nfun

output_label=err
output=err

begin{help}
<html>
<p><b>Integrate a nonlinear function of one variable using Quadpack.</b></p><br>
Use quad function for more options.<br><br>
<br> The first argument is the name of the function, the function handle or the inline function to call to compute the value of the integrand. It must have the form:<br>
y = f (x)<br>
where y and x are scalars.<br>
This parameter is a string. Ex.:<br>
[v, ier, nfun, err] = quad ("f", 0, 3)<br><br>
<br> The second and third arguments are limits of integration. Either or both may be infinite.<br><br>
<br> You can use the function quad_options to set optional parameters for quad.<br>
</html>
end{help}

begin{command}
[%o1%, %o2%, %o3%, %o4%] = quad ("%i1%",%i2%,%i3%)
end{command}

This code creates this menu:

Complete way of build menus.

Is very similar. You can put an executable file in menus folder and QtOctave will put in menu. When user selects this menu, QtOctave executes this file and sends output to Octave.

Example:

You can put this code in file called Sombrero function:
#!/bin/cat
title('Sombrero');
sombrero(20);
Then put this file in menus folder and make it executable using:
chmod +x "Sombrero function"
This menu will appear in QtOctave and makes plot of sombrero function.

Menu's icon.

Putting icons to menus is very simple. If you have an ej.menu file (or other), you must put ex.menu.png icon in the same place that ex.menu. That is all.

qtoctave-0.10.1/qtoctave/src/qtoctave_doc/index.html0000644000175000017500000001247611511434226021515 0ustar lucaslucas QtOctave Help

QtOctave Help.


QtOctave is a Graphical User Interface for Gnu Octave

QtOctave is a graphical user interface for gnu octave, which is an open source program alternative to Matlab.  With QtOctave you can do perform computationally intensive mathematical tasks that would take much longer to code in C or C++ or practically any other modern computer language.  It is especailly good at matrix and vector operations.  The graphical capabilities are very advanced.  It is used heavily in engineering, and is a tool well worth learning.

This document describes how to use QtOctave.  It does not describe using octave.  Octave help is available from the menu Help->Octave Help or by clicking the Help Icon button on the toolbar.  Often tool tips are available by hovering the mouse over the various tools.

File

Open New QtOctave Window

  • Opens a new main QtOctave window

Editor

  • Opens a new editor window

Run an Octave Script

  • Allows you to select an octave script to run and runs it

Change Directory

  • Changes the working directory.  You can do the same thing with cd "directory name"

View

Windows Layout

Save or load actual windows configuration.

Toolbars

Select here the toolbars you wish to display on the Octave window.

Docks

Select which panels are open.

Show/Hide objects

It shows or hides tools of QtOctave.

Analysis

Tools to solve differential equations or integrate functions.

Data

A graphical way to enter and save matrices

Equations

A graphical interface to solving equations

Matrix

A graphical interface to common matrix operations

Statistics

A graphical interface to some statistical functions including...
  • Mean
  • Median
  • Standard Deviation
  • Covariance
  • Correlation Coefficient
  • Histogram

Plot

A graphical interface to plotting functions

SvgCanvas

You can show plots in SVG file format. You can export then to PDF, PNG,... Qt supports the static features of SVG 1.2 Tiny. ECMA scripts and DOM manipulation are currently not supported. You can find documentation about SVG in SVG 1.2 Tiny
QtOctave has several functions to work with SVG file format:
svgcanvasload(n, file_name)
Shows file_name in window n. File_name must be absolute path.
Example:
 svgcanvasload(1, '/home/user/ej1.svg')

svgcanvassave(n, width, height, file_name)
Saves plot in window n in file file_name. File_name must be absolute path. File_name can be a PDF, PNG, JPEG, PS,... file format.
Example:
 svgcanvassave(1, 200, 200, '/home/user/ej1.jpg')
 svgcanvassave(1, 200, 200, '/home/user/ej1.pdf')

svgcanvas_delete_on_load(n, file_name)
Shows file_name in window n. file_name is deleted. File_name must be absolute path. This command is very useful for animations.
Example:
 svgcanvas_delete_on_load(1, '/home/user/ej1.svg')

This is an example of SvgCanvas. It plots a Lissajous figure of phase phase, and frequency ratio w:
function ej(w, phase)
	if(!exist('w'))
		w=2;
		phase=pi/4;
	endif
	out=fopen("ej9.svg", "w");
	fprintf(out, '<?xml version="1.0" standalone="yes"?>\n');
	fprintf(out, '<svg width="200" height="200" version="1.1">\n');
	fprintf(out, '<path d="M %f %f', 200, 100-100*sin(phase) );
	n=1000;
	for k=1:n
		fprintf(out, " L %f %f", 100+100*cos(k/n*2*pi), 100-100*sin(w*k/n*2*pi+phase) );
	endfor
	fprintf(out, '" fill="none" stroke="black" stroke-width="1"/>\n');
	fprintf(out, '</svg>\n');
	fclose(out);
	disp("Ok");
	file_name=sprintf("%s/ej9.svg", pwd);
	svgcanvasload(1, file_name );
endfunction

Configuration

General Configuration

Set up things that are specific to your system.

Octave

  • Octave Path: QtOctave needs to know where octave is installed on your system so let it in on the secret here.
  • Octave Arguments:  You can supply octave with arguments at startup.  So list those, use the argument --help.
  • Folders:  Add all the folders where you have .m files that you want octave to know about.  Especially if you have installed octave-forge, you need to make sure octave knows where those files are located.

Help

  • Help Path:  This is the location of the base file for octave help.  It is called octave.html.

Editor

  • External Editor:  Select if you wish to use an external editor, and what that editor is.

Terminal

  • Select colors and size of the terminal.

Help

* Build your own QtOctave menus.


qtoctave-0.10.1/qtoctave/src/qtoctave_doc/about.html0000644000175000017500000000353411511434226021513 0ustar lucaslucas

About.

QtOctave version 0.10.1

Pedro Luis Lucas Rosado

  • To Pilar, my wife and my angel.
Alejandro Ávarez Ayllón
and Unalix Development Group:
David Saldaña
Willinton Vega

You can send your comments to:

Project page: https://forja.rediris.es/projects/csl-qtoctave/

Email: "selairi _replace_this_with_at_ gmail.com"

Acknowledgements.

To Pilar, my wife and my angel,
to Rafael Tovar, Rafael Rodríguez Galván and OSLUCA help,
to Javier Arantegui for your suggestions and MacOS X install instructions,
to Ricardo (Lical) for your first suggestions,
to Daniel and Hugo from Dpto. Física y matemática de fluidos (UNED) for your suggestions and nice coffes,
to "Primer Concurso Universitario de Software Libre" for your second prize and diffusion of QtOctave project,
to Rob Frohne for your suggestions and bugs killed :-)
to to anybody who has worked and has suggested new features.

Copyright (C) 2007-2010 P.L. Lucas

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307, USA.
qtoctave-0.10.1/qtoctave/src/qtoctave_doc/menu_integrate_easy.png0000644000175000017500000010047111511434226024246 0ustar lucaslucasPNG  IHDRMWe IDATxqLg/o^QiHD*FJVD]]۸5dnՅt n[ն!m\m6hۘ8cGm]m#N:E%?& 6!|? g73aݝ;/ """kߺ*=8][ gsu֙u]YVDb§yR2CDDzdSKi嬃V $o@4AWM{s8@6ˈO1u\ w]; Z[]7LI-$}Ծ6_E Ҋo/g5ك& -Ϸ_!P4@n\tDD-1OrQd#YDtT'P1y;D a DDDٳ [pV cGp,!8['71'̦~q.DٍH;R486yw!Yh56];; >wR $BWƉNUxy|@* ?bهZ OD7skrc `H" 32A\~4NE7-!^F Q0-"TH^lkH" fIM(|G\CyV'B,O| 7^0joM 'gݞIW_;*HРAL` C*,K9DS"JU@ k ֻ+% :@ׁ$,k5~0gDh)`w[Hpl@2 &=MmI5A#jֱeQ§4 Khz<7g!"vnDPoM%1z:"fmf-|8y.״0X9m$}bM}to$ag}DTŹbs(P{'3A9u;o_ lgE1 M+eM`C"%)@^顥4Wӓgq4>%a;p ߘ%IUDc._)3B#v;g8ݯi@WDHWq$4xЦHUfuX!``3[q?\iI[ @_peDh$bf1 Qؐ]4 "dI_-OI% ™m|z[hx#M` ɵs5>m& QµMk0fP>7X(@HbW3:m:8s϶ALE 0TQj;hyV!OT`{k$Bz ?MdXkLp9$FU($^t;B8 2 uW@ߧ29ǩ E"2oG!Xge 9{K)-kZAJ{0o[]*@< T z ;5t~P*N<וDyiO-T?)ć. S8P ڭHTuNJ~s A„ؔ\F^z\qF7I{74H@OIItAKhzgULM`&DqVXګ*o c[#@;{XaJM3Qm}.gDž-Mv@>;\;exk艙0MOݧ㪂DD+=C hqo) zC]+TjS'Uh&D;e$!06h{uI"8 kT\Cu"Ip8Lq״w=ԤNqʬ)S qm;툸NVOɜ!"~ㄪ hخ?6xaU=<^,ffO<; h'5IQ_!q18p96/EiX#u{W򼑫(ُoov}S7f4_}HS>X7hVX9sJܰj^8v@(e`_T5 .e6ӕ*\u2Jp?.!|=p$7P6KjQ 5㰚ED,ɹԚ)Rcoڝ㌮:r)sI4n]Qa6ha5%"9˹-sw_Qa,a7I4܏`D/,ByXDuc3A>/ . [`J78 xT$.%+ %3SvH&oDiz Q bc d*$ģYxc| CRh1Jj+M: Bh5B56[a ˪K9en0uP!#~p^s & > [ό$H~@t-Q喜 Cyv'a%oo: =6lܿkJMU@ȇNS-ة|TzKšN}mo+Hv"pwj/sݺV@gP+1L$DIARBHY\+t=/PZ<,w{bu9X)RiW4Ac;d2$`vŎZ$5gOOTyendGR @"Xp=(RA~sI 7?F76LD3cݚ㳗ŶS>V* PŦofk; 4hx=yZߔ%vV!B4=<[&аSB2 ^)@+bn]kʹioLYl{g1\2ol*:S` =CfTs"LNHh:,WTLVEhZ0Aڠ证<Hj*~_@Z ?+YNۮ&gOG=.GcYo$MO38E?^tYaŅ(H|\ NQqI?]+1?<>ADDf96;<5݈fS5+@H`x$""2IDDdÓ 'A O"""DDD1< bx$""2IDDdÓ 'A% ]];476#z=ZJ~6" ^ "1(Mgt3mIVZGe ONu]( :nbˋ? exUUg./X >VykXoX,Pv(^8?ełΎN1 X,4ڔY^ɢ'ܶ|竵ll@QBE=oDDT=./! "z3s!Dpϗ"-{[T='{`61_x1 @ $_iGfhLE`QaF1xvN/ǁ?sI~>0w-X>bI\FsQcKDD@RXK zdqW ;G_{ܙ4DEs=5o}Bkǝnf ]Bc!D':d#e1g*4MCZ'\rV{}E"ùݙy_^%tp |Ja aoRX,~Pq)oǁ !%f9붖RUUiPv(5Mul,?VV;:^7z3\O^M CDM ,%@K bDQԛ꼰I0AO$:o|)w( /De͙^Z^hA -H$8vFϯ{ JDڴԊ+l۾wMiЦ4xYO1V;FFF7pֺIB4ZЦ4kێs@2IfFG3Ӻss~Ti 9#"Vtxt9ajնc=o.{\Om{ òɂrmP:{Pv(hp7wއ5y1|!>B$m~F#ݶkzoӲMjk%"Zk֙u]]{!}ݳi[.bfJuADD+S d$o=O""IDDdВ?y}胈?$""2IDDdÓ 'A O"""DDD1< bx$""2IDDdÓ 'A+z'P]!J fScxҲH(TRh *U2Y#D"U˹ UUUY_fDG|֍{J~vcIi6}h=Rܱ֗ZWID:|ϳwN˱q ^ "1Ⱥ@#Lե;bb}6s{\O T Ew^GPJB;uWUUgޮ=Nu]( : fWo& #߃j1xv@mvh7,K2;W]^b@١?kłΎN1 X,4ڔ6ͱmm坂=z OE'jEz#`vfNDaɴmk@_pls`dd$gz ๙kv}hysfC!eMqcrrvBEkN6&''J;6Cfq0F<;}@ ?ݟYAyT$F? _WOo_/\On úي v{fkݿFӡ&hcGF8pf^ .DDkAOff`h\yh, AluMЦ4@}87P_u{&>]xjsfoZ_nP)Zcq'\?p AFZ(щ(:wlz󾢶;q;RʺFnnnb1tz\HdOE%HB/ug*t7ʋښĭ,FYWׯ:}Sߎ@,CRKmEZRKUUA١d4 ֙ 1LY{oDsS3z;o% XT[:$ of2z=ZG\.Ⱥv(]hYpջU/dńgϛ=y~ ^>דޤ/."g,Y'ִ҆adsN>ðX,hjlBǝXn:{Pv(hp7wއ5n#GD"mɂ/F</jݦM/(w??z~uWӏ?=DDk:Ӷk_7"4+s^Z_WΎNX7[3g&/ij׃/ OD%{?.T=XknlFz;_uu1%fk߹nL~;#-Ks,U2DDYIOnzA$E/xhi95\[1vW!KeA)|%)LDtӽ 3nLPr/:a`d(֎X,~j̞Nmt>}jjLE ?n6[~#_GGaX;z OE'j͹8Γonn(ÇEɢLۡ!re1xm[lbsvyQ[[ eg]q(mDDъ9 wއAL~;ahFf }8E _Fh`g|b||H,7&''1_kGh,޾^tus./! "z3s <`r|b/ ) ^8o'Nۏ|~89099W|ơжF+&<Ai^ )@6ːr+J+; V7BwK`,mJC+mi׈sHk{W ˆBNDqǫH+|}W>sk^G͚uh<sku3Fh[1Io87 텩:CXZR˵ZA[ ^(#Z\ ‚SB4(;}A٪uţ桚ymHR8u@ŐԒ.flJb<~>p8 ]҂LLPoY7Ues5,0W" ƙ3z]&nL,^]^9up/èX-UrQ96,I->B$m~#Ч\>X6YA"p IDATs ew|}\`%"`i[Gڵ {/^ʮ`3Pb +Q{}?lቨ(tљd4vT[A$&|+'-X~Q_gq+l[Z^4ziffg0.X7[!{][I/) mçq_# ,#].. !:EB#!0_g8Sym=z4kֽ @5W)Xw1`dۈV_$!4lT)=[x8p=Bo{a6-!,fsm-Zĭ/o*+6UUiPv(4MUGC5ڐq)oǁ !% ]86"{)P3$μf^tЂGVwI3ʴuzSY6YcȲ s/a<ˮkĂEřSg25R(8CIO1ptެhS 0"$DF~uNBD b{y-:$ /4M1t9 XO MgC[kcl"dT>\eX6YP`B{}D"cGMj'6& ?(݉&>ðX,hjlBǝ%#GD"mP& ]0uPn5k?@D3mHu#2@S1;:} R5lFs^a%{0<EUU/:׮j #y+Ą<e H55~-?Iv ~M`67s.T=XD776#z=5݋6Wyۈʩdmxw&`?D<7^ "1U|ؖͼ岤m+qDDIi3x93n78s 8?TUU!q{;./X >V]^n(;YoisB}xbC3'ũ|~(;X,tvtBhp7b ЦjLgMضp n[Nl6X6Y( Bcj"$ H`Tg)Ff }8a4h<Dpϗ"-{[T] 9B}89099W|6p"|/E-?|aQ DfӋq O{nsPU09>G1pvn[s wއAL~;ah.jlgK*W9k}' T 9{eD"%pCx^>KjH=cV""6sѬm/|˭*X+p>nu5n誾 !:!ei/i,?VAiׂp=l㟢#ըl:8C2dҧS{ToLRzS%b%g8u@ŐԒYVh} ٜu[K{B4(;㚦A:s{b]}w|\m/L&(Dӿ/%@4m[LpMP)w@ x`HfB3qљ3J՛꼰YL:ogNA8F0j6@Ki91BdYڌW0 Y~>p8  IDԚwƴX%9)~مv < j> RB-=MU_v$eشwMiЦ4xYOŶYlڔA`ѧU111/Qd=3^fun[AU'dUiy=ˋ*KvpL /fr{A=]81teJ_ke̜儭ՊW2-͹s ew|}\#D"ضg~0xm[h=& ,6 4MC竝~δ#׍M߻{ǽl[lNj?b_}Qͯ]?AFV /GDDdÓȠ%γ>~_ADD< bx$""2IDDdÓ 'A O"""DDD1< bx$""2IDDdЪ0r (wDDN8% =8#~8x""Z>?,@Wp8""ZN/Yx'A O"""VMx>VP ""*]xzz=wðmRUBDD4% Ϧ0pv`gѸ.ѪQt?F"@o3L$a4hxbC3ζ脷kfVN}p=o[_nE˭""KS}v/f:?#vطmLNNv4liznsPU09>G1pv t >w}sLU4wޗ99xv3a22˚͈\#4Bt"@ ei5@~Hc#?AsP;DDt)FN]p t5q)oǁ !%hq>UUiJ>MӠlUX+0xvMMspN=ףj}O3u./.EQO d* uDej3_\kFCb XrDDs1Og?Ԧ4kن}###gg:L'E}FT M`lGpDDt)yxeۉT{s ew|}\7{vvp| ']YH-6X6YpÈ'⋪@#F>:6KDDk[Y>]yqb{~::/Ùuee3YRӚ6 uьUsy>""IDDdÓ 'A;v'#~8ՃVww^p0< W8""Uʼ.GODDy$""2IDDdÓ 'A O"""DDD1< ZI(wDDTFN^aX#~82Z@tUgJ}rBDDe|‰% O$""2IDDdPIóZy?C2W""ZJwºzZs!"' 5h4R l:dxjDDmVN}2m ^rT 3{VaO" ,'mF'jEcK:""Z+vsI~>0yD'y$""2hEg ,,3c¨B\/rCDDeyvy7z~SRVԞgV Ԗbj G.Vm ':ݮPRcZDc^ ۉvyj(i_uCٮj³C`}C~HF(֭[UU3뷾܊Οwn%\ 7<7IٍaX7[ޢj: (*?Џ?S. և-O{DD<<[fwջ\1dV[O/Cm %ORBX4hTijKӴʰNK$SD"ҥ%AM1֊vԛ*?.sE3DGwW抈TVQufzW\xzrcDDD1< bx$""2IDDdÓ 'A O"""$B\ ""*v'0dTh,DDGP/3p%>OK!"2p>D'y$""2IDDdÓȠ"[.(>"""8<՘ ~,,m'3ٶ=..(N%}aO" <&mF'jEcy#""Uynsp?*~f;{W~>UU۽gܸ ?l|%U`x V=Xщ(:wlz2G+FJщ(z~<Ȳc`f֗[df+ٞ4 ʎWMӠl-UKu_174 և3weLjrGDD4[Se~,Mf7ђGDDkGɦmuH& ^h^"t5tOstBOJ&zDR&"WI϶"l[llOY| "z z{ %=V68} ':?>""VEV0'A O"""DDD{Ź '.ʠ>]%OG̕Q9],("<=@K9pDDv'A O"""DDD1< bx$""2IDDdÓ 'A O"""N׷\s}}iHdI׶,V v璯 DD'A O"""DDD1< bxmCc!""{U þվ"J?%3p%V; Qf=8۝87P$""*l{z'XkK' Ѫ6-9:$"UIK%7ÓVTfxT15nݺuXnj+I( =8tnZicrb/XW3-ǿ)e,Xn(zC-P+\^9]X5K; G yOt#4w⭓oA٦|0VrY cm*T*wO|9iP(xb%iX$yn7Zrd{ *טJv?nSɤf&-,YY,Uvu]i驉7!?$c(X"t5KfYF<끸^(pջ*i;p9Z{-DQYZ^luzu^= s>g=6HXnwێ\\ )= ׋X:(?j#_sqX|lΝN|:8r֭CJ0n2ur+֭[hHua+W սx>j3טzM-G]F^M2紖Cdo;\ 2 QؔysNjz l$Ipxm*(=o-~ iM2;i #כNۏ'w)ە>3p&lNH_tiɔt:JN%}ڼQokᄑ?96UwIg}{3}}hAHݷ7|c:N?9v러OHlYRM,O.>3O֧4T _GQm^fo/XG(zכџMOOft:۫mnG/M?Y50wP1r=dz]_JH;'isrrrIb1C/f+͹c69c:3QT5,mZL&S6nk1|A3?ܦbByLx}rg϶>Ak;M}*#r-P`}?2sqz'M]$Z$PUU9M寫PMs- x nĊjÈu #> mczqf"Oχ6e]F_~u߷\ #n?H._̶g7]FsS3cCmc? ϒ)c_iE0,_(f=fhFZ* b挶q)l3*%.@ri1h?ca~h~ J0b>;Q ""_EX#6lԷ!t-d2 Q'.Sr/hs9(7{‹SBt" Rg0kH;ðZdˑm-5(".~|[qp'1a:}*s CbXQ~mc8@ATp+8VYT[N#T"NSNŔjeUtmv]iiTS-ũé gWтbE:P=Z"ǐ؞{UY%xg33~pw" c{t:"D}׋AžaZq֛`joPyxRrl`hF'|wӀPkg1 խ=;q'ʏ}Vꐼē'e(欣 Cu%h06DE՝PE6!ޞ^w۱sN@)W9m0p!F3AD2}R=cUwbSQ0Dǿuޏa0ax܀ɯ&YAϋ= %F ݻՁ)[U9e*g;J͖_MbڞjG`Z?p{ҋV?#}@,;':{F'qKjnBHYyFB'y>D@YqWq\F! MWuҦyrf fFy'!vaMqږBOyB! 5e: %q7hZcNL!R.^CMU<=mao06Suz՚O@!T*g"m}}MG~9=DPvTmrn0l"S&1` ŕN|X 5_B!ͣ*_U -('޶Նխ1@NN)ѩ(wtq\'`fCz{)ضِL& SԽ/ΎԸ򦑒 U ;;gCq%#30yԂcBtgb4б??SV Ysdgo+\j& 0->aZ8 L݀ȍ&6{wz#3>6!fgp"ino"u/_br&& : ^)0-N$ Eh[߆p8T*` oBu BV 5NE yh[ 7t k ]$Mp:#v+&vbjE*8ܯVF6zvB|'||]3<<'<%o{JOuGz G<:XcPoRU.ՂyL~5 <>s=:ЛC¤ .q? 3Ù7aUQ9:welvVA xK\'_uhlA+a"a!0 ,̲4857gW|$ʺ;?ea~ KE.cбChelOi\L=9;;훳1(A<]ƵFƾH|@v~;Tb,\Jޓ^qUnO!y?X<6gjjkk54qP!x eVr߉KnWuVH.0|*lOi\wV9u:8 >SSIKNEs>A;:4G8VѩhNgZcPoR?yڻ|kP { Dtzp$,.e]&| 7o0]!2{sFz gb si[w[1e'Ih4qԍ̺®(.Զ78kX-[s5?cFo MpS\^j[)m?R|sD{) yZǠ )mکZVՌE?XGCo @ ff9$ſ\DjYf;S`Է,b wt,rqc0`ò9sҼ00o4wڗJuy[]O-m9b=hڇ޽`1̻g ps~0 6;FyLKUڞ#n{MXrz Ua:!յH/mr#24_9ၾU{wuFpp J k R߸q+ v'>ػ`GCScI!1{ 24!PӍ<%꠯B'!uBByB! QI!(t7 BY TNJQFBByBiXk\Z$6ߙn`jww/]Vq^`[XZ#?4\\`[X0z>׉x<6U\q~pa`4+!,l[lp8:_h"b NYk`.n`h0[Uol 7LM9u.wP=+^5~Lyn)/mv>Rum? ۗvTlGuQ{ЮKw ӆiîݻwe?Mt)Z6}/sB*ۻխa CխA[yn.g_tsWWҺotziu`ݻk_Jkj}m!h4~=@~:N}yoﵾzjI{ݻ7oZmz37f> xKViWh;e7iE LA>!:ЛC8^vaHYqwKkj<&8`Y4}:DeNdo+ix-ļ V˲0?k"1! ՛ufXJUZǿ~I35wV ôބ]=_)X'czcH8Dhrȩ'l6Guq$ :|~vzTζ?z#✱@0b)}Vq!tn~8{f!iU+ [*tV*hxÐ鷎 !W:7d:;[9aT;|7?duֲJ^Ga%|T/v|2QIx7PǿuR+{ߧ&}ٺ{Y&aߜVh0b`b<\Ͱjg]Qp[u\e%CݗCYYνzwww@pڧ*m4Xj^:PY@:X246aMsjWrn€_β%CݗC^hyNx<.o P}hew;}Wy׻LWIH1Τ .;o@M@adCp*ѩ(ks:_R`?*=vwuuP;rf_~%eǹT4sjT]m[IHlq@4ع¡` 6Y \x[J_j? V< RR<2.2g?j=-,,?caA(Ru>Sγ%8 Gd| ~V ؖ¹Uj*ۻ0=mGCףoO|N:J|=vƥg:hf@a؄`[X\ \O1 ƩP6!R+yB! Q6!*FG'!^j-!uBBU<97?|k(u7!TTTAF1'槞RJ9ބWSIPqUX6R=SYJv9Ey9m[*a؎GiB-Tl6RC.-,e z=Bd(/\*0^ + FWzFώ7RY\!v톡7!.EV 7#;t:8حjɺ )gFN$ އs3"W#⩾mHR{[N}`fC =ޞ\ѳ}B8,w9swڇHK! ÕL}P~Pn;N);3&NV]+R咻~{>X~bC"lln"Ja|l^ٗ3Q}~/y?7!D[$Tj 0qb`u܉#|[mJ.ՂyaYVJ9)8_JF4y$AIqBٝ!Vbkpڍ}!z# Ϭ>9,4P~yz 6Vn0ZNjRc!AnDoGK;_۲U֥{pNuܽGdTX-\oU;\b%a؞wG K_;vW|^r G™?N& IDAT.ˌ+-T `V!:0DHcSQ`qxeY DwW74V;|wƇoJy ff9$nU"n l,B(t>aa؝;aiЗ !d .قNHߵ \ hBaHll j1νBHSStqQbBz3ΖwÝy:.4dI!dj{ $ ,|-uBJ2)LRN9{L!B! V-㜝JR y 0vqMgZogB!d쎓F0NKsƒ/C}x}@bBQ<+$`7y?aa"ǎC#|#>ػ\6B!ґgNTԷhUzg%ύ|maaa8:aj'A49~ yBy1tl=IA5< ~S||%O/ByR),d9+V0`y7uRv0 RRX5!iGBHȳ''4< !j',j\\.ƼVq}NB*C#OB!D!yA P~܄gU:O)/l[3Qb5 ޹UH 0`FX. 3v+Ve dfb[XZ0 ٔvq`F raZo^k`Y!b-,G*[iʭprma,cS9`ٜKr+ !diY ߉=5ϼ vphћE./7;LBш#nLۇgS (΍|Mv`uѫJO8.e]8u<*)r+ `g04SFRx U˳F.""W#Xr0˄qcwܔ.@Z :F3|}0<.}=60o0uⳁď;!F|Kny ff9$qq#,<'<ʣܥ;剒Li.0\]חtpw/@ߪ.p݊y w[QB!Tq,(|g|9Wx@!]ɩ1a !W3 -γ !Gy5D݄ҘaZ->$X}l:;Y3P:;dE~֛`4amɇT,k`.n`h0[rS,ڹ׉x<6U8*Wb]lPy'$yn!WѲYma-8M"!d~5SRس G"B u8A9RˏEa!PNNpۻgxqWxt:?GVL+ /FI .b"%;lp_/$qy?U>!G2#y%ޓ^yRȳXv6!:.x\YI島a4t0S) /EI .'ZGo4B89 'ԇ=KIrvHst**vpJ×+ '@X ɩ?[t*O8nƥEo.E #䇏ㄐGr A.dA$ 0xdu7˕_ flN4лdK3_*5$yG~>0l~G*٣R4P*{MXrz P\Qu^C^0xOz%WBn)R,/Y8,#fq&sVNv?ć$+W P_ 0x~~AleY!$STG934q47 '<4𡢪 CpPUL-=' ݻ}oN$9+)U/G~P<憏Tb:ϡ7й=sSH.maJ2w/]Vq^bѢE9olN>9_9\dj)DW΍ Dz<F26zvVq`YhZZ23 à9B,}d9o}敺;vfL] ¢ d' 1ح/ xeyضeTVP]4x{^葽W! ɡ ARN7 :"e+fZgB$27`[X,t9mw> -m|͜fXlbOy^Nnh'Gd1wvuY eKF 9MYg<>パp=[: YhGт?Ϗ˨uWU9="ܠq.hьܰlUݿryE˥(P[lޓ^{wb #y?ĝĜ kJ_.V|` ~*;P>t\^>f#$tu"p9ޜ}> B xx*ie6gwW7\]݊aKFs@u/I/bRR?7SB傟$DBjFCM>Pnx덷r~u7}{a; 8EWn98v hWha,}(ݿr) TcgN;s)U?J5GwO/ BHv ]P|ͷswDZӱ˗/V{НsQ/BaXmcsn \6a !jaAT.Y_G1V p](m Bn{Rpp#Ղ z83Eǧ[6[~-`Bo^ı>ػaWm Eտ|gxշQ/S}|VKBg^oYV 3!0 S):E'!UB*n5?!UN$< !,)H#OB! yyBiLU=H< !4&< !ef3:g nUM7 BiLs: ww?ϓBQUVVsU>yB͇ͿOy< !8{HD'!TƘnh| FcpWp9لdg.aWμKo-7O``ȫct,?"tmG~辒ecyll0Mط7gU}xm ue|G'VL\AӋ ü֧[WZ}֭[ߛ>9_ E(F?G DՍOHuώ>g3!t:Q!tvuv6Nz| #MtWE?ޏq_~Fv4DO0M8_r?zF0@ =vػ߄ccOm2(?G0Bv g3J;aXc@E_m`u3 .R iY$ S\0|:S^U:.B_z/9 [;0vvL,cWcWefZ-ﳒm-Dkn052N>| FAyY7[.es{Z"™#sx02có|Z?ڲcҳ;6l r-"پB_~`*PnD瑚I0}MTUtW!zDNfђ9v\ F{W'`atu#gⲱU2s;wSQwqp+soүҕ? T[ ,GW<X2gMRӡӶe0 ۶M`Y-4, Qx6^ ;z8<ɧxi#|{a}X !p1o(LOeNIYt͂'6k+g]ݘAwWQ%'\01Ndm;(#xhz #Rlf_e/Q>:[d1N}4խ >)|ס}^$jˊIRޟOa4>}{Ow&-ҮK[܈Lc;GoD?}?HOn -֒xNx`Qvd21(%fcIg7,2䔿%'??&TB=%R䶣|?z4R߅S!,QC=egV0KK/W[ZF@Gs\'Tv*ROGO? N)_YL/DT* #[^ ]* #00AA00 "[^"]*" #FF0000 '[^']*' #FF0000 qtoctave-0.10.1/qtoctave/src/syntax_files/h.xml0000644000175000017500000000320011511434226020507 0ustar lucaslucas \b(auto|const|double|float|int|short|struct|unsigned|break|continue|else|for|long|signed|switch|void|case|default|enum|goto|register|sizeof|typedef|volatile|char|do|extern|if|return|static|union|while|asm|dynamic_cast|namespace|reinterpret_cast|try|bool|explicit|new|static_cast|typeid|catch|false|operator|template|typename|class|friend|private|this|using|const_cast|inline|public|throw|virtual|delete|mutable|protected|true|wchar_t|and|bitand|compl|not_eq|or_eq|xor_eq|and_eq|bitor|not|or|xor)\b true #0000AA #[^ ]* #00AA00 "([^"]|\\")*" #FF0000 '[^']*' #FF0000 //.* #555555 (?!//)/\* \*/ #555555 \{ \} #ffff00 \( \) #ffff00 \[ \] #ffff00 qtoctave-0.10.1/qtoctave/src/syntax_files/cpp.xml0000644000175000017500000000320011511434226021042 0ustar lucaslucas \b(auto|const|double|float|int|short|struct|unsigned|break|continue|else|for|long|signed|switch|void|case|default|enum|goto|register|sizeof|typedef|volatile|char|do|extern|if|return|static|union|while|asm|dynamic_cast|namespace|reinterpret_cast|try|bool|explicit|new|static_cast|typeid|catch|false|operator|template|typename|class|friend|private|this|using|const_cast|inline|public|throw|virtual|delete|mutable|protected|true|wchar_t|and|bitand|compl|not_eq|or_eq|xor_eq|and_eq|bitor|not|or|xor)\b true #0000AA #[^ ]* #00AA00 "([^"]|\\")*" #FF0000 '[^']*' #FF0000 //.* #555555 (?!//)/\* \*/ #555555 \{ \} #ffff00 \( \) #ffff00 \[ \] #ffff00 qtoctave-0.10.1/qtoctave/src/syntax_files/m.xml0000644000175000017500000003737311511434226020536 0ustar lucaslucas \b(all_va_args|break|case|continue|else|elseif|end_unwind_protect|global|gplot|gsplot|otherwise|persistent|replot|return|static|until|unwind_protect|unwind_protect_cleanup|varargin|varargout|casesen|cd|chdir|clear|dbclear|dbstatus|dbstop|dbtype|dbwhere|diary|echo|edit_history|__end__|format|gset|gshow|help|history|hold|iskeyword|isvarname|load|ls|mark_as_command|mislocked|mlock|more|munlock|run_history|save|set|show|type|unmark_command|which|who|whos|for|endfor|if|endif|do|until|while|endwhile|function|endfunction|switch|endswitch|try|end_try_catch|end)\b true \b(argv|e|eps|false|F_DUPFD|F_GETFD|F_GETFL|filesep|F_SETFD|F_SETFL|i|I|inf|Inf|j|J|NA|nan|NaN|O_APPEND|O_ASYNC|O_CREAT|OCTAVE_HOME|OCTAVE_VERSION|O_EXCL|O_NONBLOCK|O_RDONLY|O_RDWR|O_SYNC|O_TRUNC|O_WRONLY|pi|program_invocation_name|program_name|P_tmpdir|realmax|realmin|SEEK_CUR|SEEK_END|SEEK_SET|SIG|stderr|stdin|stdout|true|ans|automatic_replot|beep_on_error|completion_append_char|crash_dumps_octave_core|current_script_file_name|debug_on_error|debug_on_interrupt|debug_on_warning|debug_symtab_lookups|DEFAULT_EXEC_PATH|DEFAULT_LOADPATH|default_save_format|echo_executing_commands|EDITOR|EXEC_PATH|FFTW_WISDOM_PROGRAM|fixed_point_format|gnuplot_binary|gnuplot_command_axes|gnuplot_command_end|gnuplot_command_plot|gnuplot_command_replot|gnuplot_command_splot|gnuplot_command_title|gnuplot_command_using|gnuplot_command_with|gnuplot_has_frames|history_file|history_size|ignore_function_time_stamp|IMAGEPATH|INFO_FILE|INFO_PROGRAM|__kluge_procbuf_delay__|LOADPATH|MAKEINFO_PROGRAM|max_recursion_depth|octave_core_file_format|octave_core_file_limit|octave_core_file_name|output_max_field_width|output_precision|page_output_immediately|PAGER|page_screen_output|print_answer_id_name|print_empty_dimensions|print_rhs_assign_val|PS1|PS2|PS4|save_header_format_string|save_precision|saving_history|sighup_dumps_octave_core|sigterm_dumps_octave_core|silent_functions|split_long_rows|string_fill_char|struct_levels_to_print|suppress_verbose_help_message|variables_can_hide_functions|warn_assign_as_truth_value|warn_divide_by_zero|warn_empty_list_elements|warn_fortran_indexing|warn_function_name_clash|warn_future_time_stamp|warn_imag_to_real|warn_matlab_incompatible|warn_missing_semicolon|warn_neg_dim_as_zero|warn_num_to_str|warn_precedence_change|warn_reload_forces_clear|warn_resize_on_range_error|warn_separator_insert|warn_single_quote_string|warn_str_to_num|warn_undefined_return_values|warn_variable_switch_label|whos_line_format|synchrotron_1|synchrotron_2|syndtable|taylorcoeff|transport_2|transport_3|transport_4|transport_5|trisolve|waitbar|xmlread|zeta|zeta_int|aar|aarmam|ac2poly|ac2rc|acorf|acovf|addpath|ademodce|adim|adsmax|amodce|anderson_darling_cdf|anderson_darling_test|anovan|apkconst|append_save|applylut|ar2poly|ar2rc|arburg|arcext|arfit2|ar_spa|aryule|assert|au|aucapture|auload|auplot|aurecord|ausave|autumn|average_moments|awgn|azimuth|BandToFull|BandToSparse|base64encode|battery|bchpoly|bestblk|best_dir|best_dir_cov|betaln|bfgs|bfgsmin_example|bi2de|biacovf|bilinear|bisdemo|bispec|biterr|blkdiag|blkproc|bmpwrite|bone|bound_convex|boxcar|boxplot|brighten|bs_gradient|butter|buttord|bwborder|bweuler|bwlabel|bwmorph|bwselect|calendar|cceps|cdiff|cellstr|char|cheb|cheb1ord|cheb2ord|chebwin|cheby1|cheby2|chirp|clf|clip|cmpermute|cmunique|cohere|col2im|colfilt|colorgradient|comms|compand|complex|concat|conndef|content|contents|Contents|contourf|convhull|convmtx|cool|copper|corr2|cosets|count|covm|cplxpair|cquadnd|create_lookup_table|crule|crule2d|crule2dgen|csape|csapi|csd|csvread|csvwrite|ctranspose|cumtrapz|czt|d2_min|datenum|datestr|datevec|dct|dct2|dctmtx|de2bi|deal|decimate|decode|deg2rad|del2|delaunay|delaunay3|delta_method|demo|demodmap|deriv|detrend|dfdp|dftmtx|dhbar|dilate|dispatch|distance|dlmread|dlmwrite|dos|double|drawnow|durlev|dxfwrite|edge|edit|ellip|ellipdemo|ellipj|ellipke|ellipord|__ellip_ws|__ellip_ws_min|encode|eomday|erode|example|ExampleEigenValues|ExampleGenEigenValues|expdemo|expfit|eyediagram|factor|factorial|fail|fcnchk|feedback|fem_test|ff2n|fftconv2|fieldnames|fill|fill3|filter2|filtfilt|filtic|findsym|fir1|fir2|fixedpoint|flag|flag_implicit_samplerate|flattopwin|flix|float|fmin|fminbnd|fmins|fminunc|fnder|fnplt|fnval|fplot|freqs|freqs_plot|fsort|fullfact|FullToBand|funm|fzero|gammaln|gapTest|gaussian|gausswin|gconv|gconvmtx|gdeconv|gdftmtx|gen2par|geomean|getfield|getfields|gfft|gftable|gfweight|gget|gifft|ginput|gmm_estimate|gmm_example|gmm_obj|gmm_results|gmm_variance|gmm_variance_inefficient|gquad|gquad2d|gquad2d6|gquad2dgen|gquad6|gquadnd|grace_octave_path|gradient|grayslice|grep|grid|griddata|groots|grpdelay|grule|grule2d|grule2dgen|hadamard|hammgen|hankel|hann|harmmean|hilbert|histeq|histfit|histo|histo2|histo3|histo4|hot|hsv|hup|idct|idct2|idplot|idsim|ifftshift|im2bw|im2col|imadjust|imginfo|imhist|imnoise|impad|impz|imread|imrotate|imshear|imtranslate|imwrite|innerfun|inputname|interp|interp1|interp2|interpft|intersect|invest0|invest1|invfdemo|invfreq|invfreqs|invfreqz|inz|irsa_act|irsa_actcore|irsa_check|irsa_dft|irsa_dftfp|irsa_genreal|irsa_idft|irsa_isregular|irsa_jitsp|irsa_mdsp|irsa_normalize|irsa_plotdft|irsa_resample|irsa_rgenreal|isa|isbw|isdir|isequal|isfield|isgray|isind|ismember|isprime|isrgb|issparse|isunix|jet|kaiser|kaiserord|lambertw|lattice|lauchli|leasqr|leasqrdemo|legend|legendre|levinson|lin2mu|line_min|lloyds|lookup|lookup_table|lpc|lp_test|mad|magic|makelut|MakeShears|map|mat2gray|mat2str|mdsmax|mean2|medfilt2|meshc|minimize|minpol|mkpp|mktheta|mle_estimate|mle_example|mle_obj|mle_results|mle_variance|modmap|mu2lin|mvaar|mvar|mvfilter|mvfreqz|myfeval|nanmax|nanmean|nanmedian|nanmin|nanstd|nansum|ncauer|nchoosek|ncrule|ndims|nelder_mead_min|newmark|nlfilter|nlnewmark|__nlnewmark_fcn__|nmsmax|nonzeros|normplot|now|nrm|nthroot|nze|OCTAVE_FORGE_VERSION|ode23|ode45|ode78|optimset|ordfilt2|orient|pacf|padarray|parameterize|parcor|pareto|pascal|patch|pburg|pcg|pchip|pcolor|pcr|peaks|penddot|pendulum|perms|pie|pink|plot3|__plt3__|poly2ac|poly2ar|poly_2_ex|poly2mask|poly2rc|poly2sym|poly2th|polyarea|polyconf|polyder|polyderiv|polygcd|polystab|__power|ppval|prctile|prettyprint|prettyprint_c|primes|princomp|print|prism|proplan|pulstran|pwelch|pyulear|qaskdeco|qaskenco|qtdecomp|qtgetblk|qtsetblk|quad2dc|quad2dcgen|quad2dg|quad2dggen|quadc|quadg|quadl|quadndg|quantiz|quiver|rad2deg|rainbow|randerr|randint|randsrc|rat|rats|rc2ac|rc2ar|rc2poly|rceps|read_options|read_pdb|rectpuls|resample|rgb2gray|rk2fixed|rk4fixed|rk8fixed|rmfield|rmle|rmpath|roicolor|rosser|rotparams|rotv|rref|rsdecof|rsencof|rsgenpoly|samin_example|save_vrml|sbispec|scale_data|scatter|scatterplot|select_3D_points|selmo|setdiff|setfield|setfields|setxor|sftrans|sgolay|sgolayfilt|sinvest1|slurp_file|sortrows|sound|soundsc|spdiags|specgram|speed|speye|spfun|sphcat|spline|splot|spones|sprand|sprandn|spring|spstats|spsum|sp_test|sptest|spvcat|spy|std2|stem|str2double|strcmpi|stretchlim|strfind|strmatch|strncmp|strncmpi|strsort|strtok|strtoz|struct|strvcat|summer|sumskipnan|surf|surfc|sym2poly|symerr|symfsolve|tabulate|tar|temp_name|test|test_d2_min_1|test_d2_min_2|test_d2_min_3|test_ellipj|test_fminunc_1|testimio|test_inline_1|test_min_1|test_min_2|test_min_3|test_min_4|test_minimize_1|test_nelder_mead_min_1|test_nelder_mead_min_2|test_sncndn|test_struct|test_vmesh|test_vrml_faces|test_wpolyfit|text|textread|tf2zp|tfe|thfm|tics|toeplitz|toggle_grace_use|transpose|trapz|triang|tril|trimmean|tripuls|trisolve|triu|tsademo|tsearchdemo|ucp|uintlut|unique|unix|unmkpp|unscale_parameters|vec2mat|view|vmesh|voronoi|voronoin|vrml_arrow|vrml_Background|vrml_browse|vrml_cyl|vrml_demo_tutorial_1|vrml_demo_tutorial_2|vrml_demo_tutorial_3|vrml_demo_tutorial_4|vrml_ellipsoid|vrml_faces|vrml_flatten|vrml_frame|vrml_group|vrml_kill|vrml_lines|vrml_material|vrml_parallelogram|vrml_PointLight|vrml_points|vrml_select_points|vrml_surf|vrml_text|vrml_thick_surf|vrml_transfo|wavread|wavwrite|weekday|wgn|white|wilkinson|winter|wpolyfit|wpolyfitdemo|write_pdb|wsolve|xcorr|xcorr2|xcov|xlsread|xmlwrite|y2res|zero_count|zoom|zp2tf|zplane|shell_cmd|show|sign|sin|sinh|size|sizeof|sleep|sort|source|splice|sprintf|sqrt|squeeze|sscanf|stat|str2func|streamoff|struct|struct2cell|sum|sumsq|symlink|system|tan|tanh|tilde_expand|tmpfile|tmpnam|toascii|__token_count__|tolower|toupper|type|typeinfo|uint16|uint32|uint64|uint8|umask|undo_string_escapes|unlink|unmark_command|usage|usleep|va_arg|va_start|vectorize|vertcat|vr_val|waitpid|warning|warranty|which|who|whos|zeros|airy|balance|besselh|besseli|besselj|besselk|bessely|betainc|chol|colloc|daspk|daspk_options|dasrt|dasrt_options|dassl|dassl_options|det|eig|endgrent|endpwent|expm|fft|fft2|fftn|fftw_wisdom|filter|find|fsolve|fsolve_options|gammainc|gcd|getgrent|getgrgid|getgrnam|getpwent|getpwnam|getpwuid|getrusage|givens|gmtime|hess|ifft|ifft2|ifftn|inv|inverse|kron|localtime|lpsolve|lpsolve_options|lsode|lsode_options|lu|max|min|minmax|mktime|odessa|odessa_options|pinv|qr|quad|quad_options|qz|rand|randn|schur|setgrent|setpwent|sort|sqrtm|strftime|strptime|svd|syl|time|abcddim|__abcddims__|acot|acoth|acsc|acsch|analdemo|anova|arch_fit|arch_rnd|arch_test|are|arma_rnd|asctime|asec|asech|autocor|autocov|autoreg_matrix|axis|axis2dlim|__axis_label__|bar|bartlett|bartlett_test|base2dec|bddemo|beep|bessel|beta|beta_cdf|betai|beta_inv|beta_pdf|beta_rnd|bin2dec|bincoeff|binomial_cdf|binomial_inv|binomial_pdf|binomial_rnd|bitcmp|bitget|bitset|blackman|blanks|bode|bode_bounds|__bodquist__|bottom_title|bug_report|buildssic|c2d|cart2pol|cart2sph|cauchy_cdf|cauchy_inv|cauchy_pdf|cauchy_rnd|cellidx|center|chisquare_cdf|chisquare_inv|chisquare_pdf|chisquare_rnd|chisquare_test_homogeneity|chisquare_test_independence|circshift|clock|cloglog|close|colormap|columns|com2str|comma|common_size|commutation_matrix|compan|complement|computer|cond|contour|controldemo|conv|cor|corrcoef|cor_test|cot|coth|cov|cputime|create_set|cross|csc|csch|ctime|ctrb|cut|d2c|damp|dare|date|dcgain|deal|deblank|dec2base|dec2bin|dec2hex|deconv|delete|DEMOcontrol|demoquat|detrend|dezero|dgkfdemo|dgram|dhinfdemo|diff|diffpara|dir|discrete_cdf|discrete_inv|discrete_pdf|discrete_rnd|dkalman|dlqe|dlqg|dlqr|dlyap|dmr2d|dmult|dot|dre|dump_prefs|duplication_matrix|durbinlevinson|empirical_cdf|empirical_inv|empirical_pdf|empirical_rnd|erfinv|__errcomm__|errorbar|__errplot__|etime|exponential_cdf|exponential_inv|exponential_pdf|exponential_rnd|f_cdf|fftconv|fftfilt|fftshift|figure|fileparts|findstr|f_inv|fir2sys|flipdim|fliplr|flipud|flops|f_pdf|fractdiff|frdemo|freqchkw|__freqresp__|freqz|freqz_plot|f_rnd|f_test_regression|fullfile|fv|fvl|gamma_cdf|gammai|gamma_inv|gamma_pdf|gamma_rnd|geometric_cdf|geometric_inv|geometric_pdf|geometric_rnd|gls|gram|gray|gray2ind|grid|h2norm|h2syn|hamming|hankel|hanning|hex2dec|hilb|hinf_ctr|hinfdemo|hinfnorm|hinfsyn|hinfsyn_chk|hinfsyn_ric|hist|hotelling_test|hotelling_test_2|housh|hsv2rgb|hurst|hypergeometric_cdf|hypergeometric_inv|hypergeometric_pdf|hypergeometric_rnd|image|imagesc|impulse|imshow|ind2gray|ind2rgb|ind2sub|index|int2str|intersection|invhilb|iqr|irr|isa|is_abcd|is_bool|is_complex|is_controllable|isdefinite|is_detectable|is_dgkf|is_digital|is_duplicate_entry|is_global|is_leap_year|isletter|is_list|is_matrix|is_observable|ispc|is_sample|is_scalar|isscalar|is_signal_list|is_siso|is_square|issquare|is_stabilizable|is_stable|isstr|is_stream|is_struct|is_symmetric|issymmetric|isunix|is_vector|isvector|jet707|kendall|kolmogorov_smirnov_cdf|kolmogorov_smirnov_test|kolmogorov_smirnov_test_2|kruskal_wallis_test|krylov|krylovb|kurtosis|laplace_cdf|laplace_inv|laplace_pdf|laplace_rnd|lcm|lin2mu|listidx|list_primes|loadaudio|loadimage|log2|logical|logistic_cdf|logistic_inv|logistic_pdf|logistic_regression|logistic_regression_derivatives|logistic_regression_likelihood|logistic_rnd|logit|loglog|loglogerr|logm|lognormal_cdf|lognormal_inv|lognormal_pdf|lognormal_rnd|logspace|lower|lqe|lqg|lqr|lsim|ltifr|lyap|mahalanobis|manova|mcnemar_test|mean|meansq|median|menu|mesh|meshdom|meshgrid|minfo|mod|moddemo|moment|mplot|mu2lin|multiplot|nargchk|nextpow2|nichols|norm|normal_cdf|normal_inv|normal_pdf|normal_rnd|not|nper|npv|ntsc2rgb|null|num2str|nyquist|obsv|ocean|ols|oneplot|ord2|orth|__outlist__|pack|packedform|packsys|parallel|paren|pascal_cdf|pascal_inv|pascal_pdf|pascal_rnd|path|periodogram|perror|place|playaudio|plot|plot_border|__plr__|__plr1__|__plr2__|__plt__|__plt1__|__plt2__|__plt2mm__|__plt2mv__|__plt2ss__|__plt2vm__|__plt2vv__|__pltopt__|__pltopt1__|pmt|poisson_cdf|poisson_inv|poisson_pdf|poisson_rnd|pol2cart|polar|poly|polyder|polyderiv|polyfit|polyinteg|polyout|polyreduce|polyval|polyvalm|popen2|postpad|pow2|ppplot|prepad|probit|prompt|prop_test_2|pv|pvl|pzmap|qconj|qcoordinate_plot|qderiv|qderivmat|qinv|qmult|qqplot|qtrans|qtransv|qtransvmat|quaternion|qzhess|qzval|randperm|range|rank|ranks|rate|record|rectangle_lw|rectangle_sw|rem|repmat|residue|rgb2hsv|rgb2ind|rgb2ntsc|rindex|rldemo|rlocus|roots|rot90|rotdim|rotg|rows|run_cmd|run_count|run_test|saveaudio|saveimage|sec|sech|semicolon|semilogx|semilogxerr|semilogy|semilogyerr|series|setaudio|setstr|shg|shift|shiftdim|sign_test|sinc|sinetone|sinewave|skewness|sombrero|sortcom|spearman|spectral_adf|spectral_xdf|spencer|sph2cart|split|ss|ss2sys|ss2tf|ss2zp|stairs|starp|statistics|std|stdnormal_cdf|stdnormal_inv|stdnormal_pdf|stdnormal_rnd|step|__stepimp__|stft|str2mat|str2num|strappend|strcat|strcmp|strerror|strjust|strrep|struct_contains|struct_elements|studentize|sub2ind|subplot|substr|subwindow|swap|swapcols|swaprows|sylvester_matrix|synthesis|sys2fir|sys2ss|sys2tf|sys2zp|sysadd|sysappend|syschnames|__syschnamesl__|syschtsam|__sysconcat__|sysconnect|syscont|__syscont_disc__|__sysdefioname__|__sysdefstname__|sysdimensions|sysdisc|sysdup|sysgetsignals|sysgettsam|sysgettype|sysgroup|__sysgroupn__|sysidx|sysmin|sysmult|sysout|sysprune|sysreorder|sysrepdemo|sysscale|syssetsignals|syssub|sysupdate|table|t_cdf|tempdir|tempname|texas_lotto|tf|tf2ss|tf2sys|__tf2sysl__|tf2zp|__tfl__|tfout|tic|t_inv|title|toc|toeplitz|top_title|t_pdf|trace|triangle_lw|triangle_sw|tril|triu|t_rnd|t_test|t_test_2|t_test_regression|tzero|tzero2|ugain|uniform_cdf|uniform_inv|uniform_pdf|uniform_rnd|union|unix|unpacksys|unwrap|upper|u_test|values|vander|var|var_test|vec|vech|version|vol|weibull_cdf|weibull_inv|weibull_pdf|weibull_rnd|welch_test|wgt1o|wiener_rnd|wilcoxon_test|xlabel|xor|ylabel|yulewalker|zgfmul|zgfslv|zginit|__zgpbal__|zgreduce|zgrownorm|zgscal|zgsgiv|zgshsr|zlabel|zp|zp2ss|__zp2ssg2__|zp2sys|zp2tf|zpout|z_test)\b #0000BB false [a-zA-Z_][a-zA-Z_0-9]*'? false (\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?[ij]? #BB0000 false "([^"]|\\")*" #FF0000 '([^']|\\')*' #FF0000 #\{ #\} #008800 %\{ %\} #008800 [#|%].* #008800 \{ \} #ffff00 \( \) #ffff00 \[ \] #ffff00 qtoctave-0.10.1/xmlwidget/qt4/src/parser.h0000755000175000017500000000231211511434226017367 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __PARSER_H__ #define __PARSER_H__ #include "xmlhandler.h" #include #include "reader.h" #include "output.h" #include class Parser:QObject { Q_OBJECT public: Parser(); void setReader(Reader *reader); void setOutput(Output *output); public slots: void parser_input(QString input); private: QXmlSimpleReader xml_parser; XmlHandler xml_handler; QXmlInputSource xml_input; bool new_data; Output *output; }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/xmlhandler.h0000755000175000017500000000306311511434226020235 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __XMLHANDLER_H__ #define __XMLHANDLER_H__ #include #include #include #include #include "output.h" #include "widgets/widget.h" #include "widgets/widgets.h" class XmlHandler : public QXmlDefaultHandler { public: XmlHandler(); bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &attributes); bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName); bool characters(const QString &str); bool fatalError(const QXmlParseException &exception); QString errorString() const; void setOutput(Output *output); private: QString currentText; QString errorStr; QStack last_element; QHash widgets; Output *output; }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/stdin_reader.cpp0000755000175000017500000000206111511434226021072 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "stdin_reader.h" #include StdInReader::StdInReader():Reader() { } QString StdInReader::read_available_data() { char *p=fgets(line,1024,stdin); if(p==NULL) { return QString(); } return QString(QString::fromLocal8Bit(line)); } bool StdInReader::end_of_input() { return feof(stdin); } qtoctave-0.10.1/xmlwidget/qt4/src/main.cpp0000755000175000017500000000211611511434226017354 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "stdin_reader.h" #include "parser.h" #include "output.h" int main(int argc, char *argv[]) { QApplication ws(argc,argv); StdInReader reader; FILEOutput output; output.out=stdout; Parser parser; parser.setReader(&reader); parser.setOutput((Output*)(&output)); reader.start(); return ws.exec(); } qtoctave-0.10.1/xmlwidget/qt4/src/reader.h0000755000175000017500000000206011511434226017335 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __READER_H__ #define __READER_H__ #include class Reader:public QThread { Q_OBJECT public: Reader(); void run(); signals: void data_ready(QString data); protected: /**Read available input.*/ virtual QString read_available_data()=0; virtual bool end_of_input()=0; }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/CMakeLists.txt0000644000175000017500000000221611511434226020462 0ustar lucaslucasFIND_PACKAGE(Qt4 REQUIRED) MESSAGE (STATUS "Use file: ${QT_USE_FILE}") SET(QT_USE_QTXML 1) include(UseQt4) include_directories(${QT_INCLUDE_DIR}) include_directories(${QT_QT_INCLUDE_DIR}) include_directories(${QT_QTCORE_INCLUDE_DIR}) include_directories(${QT_QTGUI_INCLUDE_DIR}) include_directories(${QT_QTXML_INCLUDE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) #include_directories(${QT_QTSVG_INCLUDE_DIR}) FILE(GLOB_RECURSE xmlwidget_moc_headers *.h ) FILE(GLOB_RECURSE xmlwidget_sources *.cpp ) FILE(GLOB_RECURSE xmlwidget_ui *.ui ) # run uic on .ui files: QT4_WRAP_UI( xmlwidget_ui_headers ${xmlwidget_ui} ) # run moc on these files: QT4_WRAP_CPP( xmlwidget_moc_sources ${xmlwidget_moc_headers} ) add_executable(xmlwidget ${xmlwidget_sources} ${xmlwidget_moc_sources} ${xmlwidget_ui_headers} ${xmlwidget_moc_headers} ) SET_TARGET_PROPERTIES(xmlwidget PROPERTIES INSTALL_RPATH ":usr/lib" BUILD_WITH_INSTALL_RPATH true INSTALL_RPATH_USE_LINK_PATH true ) TARGET_LINK_LIBRARIES(xmlwidget ${Qt4_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTXML_LIBRARY} ) install ( TARGETS xmlwidget RUNTIME DESTINATION bin ) qtoctave-0.10.1/xmlwidget/qt4/src/output.h0000755000175000017500000000174611511434226017445 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __OUTPUT_H__ #define __OUTPUT_H__ #include #include class Output { public: virtual void write(QString s)=0; }; class FILEOutput: public Output { public: void write(QString s); FILE *out; }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/xmlhandler.cpp0000755000175000017500000000661511511434226020576 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "xmlhandler.h" #include XmlHandler::XmlHandler() { } bool XmlHandler::startElement( const QString & namespaceURI, const QString & localName, const QString & qName, const QXmlAttributes & atts ) { //Is it a widget or element of widget Widget *w=NULL; Widget *wparent=NULL; //Parent widget if(qName=="widgetserver") return true; else if(qName=="quit") { QApplication::exit(); return false; } if( last_element.isEmpty() ) { w=new_widget(qName,atts,widgets,output, NULL); if(w==NULL) { errorStr="Widget "+qName+" unknown."; return false; } } else //last_element is not empty { wparent=last_element.top(); bool ok=wparent->xml_start(qName,atts); //printf("Se ha procesado el padre\n"); if(!ok && wparent->container) { w=new_widget(qName,atts,widgets,output, wparent->widget); if(w==NULL) { errorStr="Widget "+qName+" unknown."; return false; } } else if( !ok && !(wparent->container) ) { errorStr="Property "+qName+" unknown."; return false; } } if(w!=NULL) w->xml_start(qName,atts); if(w!=NULL) last_element.push(w); if( w!=NULL ) { QString name=w->name; if( !(widgets.contains(name)) ) { //printf("Insertando %s en la base QHash\n", name.toLocal8Bit().data()); widgets.insert(name,(Widget*)w); } } currentText.clear(); //printf("Se ha limpiado el texto\n"); return true; } bool XmlHandler::endElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName) { //fprintf(stderr,"Texto entrada %s: %s\n", qName.toLocal8Bit().data(), currentText.toLocal8Bit().data()); if(qName=="widgetserver") return true; Widget *w=last_element.top(); bool ok, property; ok=w->xml_end(qName, currentText, property); if ( ok && !property ) { w=last_element.pop(); //w->widget->show(); if(!last_element.isEmpty()) { Widget *wparent=last_element.top(); wparent->add_widget(w); } } else if( !ok ) { errorStr="Error in "+qName+" end."; return false; } return true; } bool XmlHandler::characters(const QString &str) { currentText += str; return true; } QString XmlHandler::errorString() const { return errorStr; } #include bool XmlHandler::fatalError(const QXmlParseException &exception) { QMessageBox::information(NULL, QObject::tr("SAX Error"), QObject::tr("XML Parse error at line %1, column %2:\n" "%3") .arg(exception.lineNumber()) .arg(exception.columnNumber()) .arg(exception.message())); return false; } void XmlHandler::setOutput(Output *output) { this->output=output; } qtoctave-0.10.1/xmlwidget/qt4/src/reader.cpp0000755000175000017500000000165311511434226017677 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "reader.h" Reader::Reader():QThread() { } void Reader::run() { QString data; while(!end_of_input()) { data=read_available_data(); emit data_ready(data); } } qtoctave-0.10.1/xmlwidget/qt4/src/stdin_reader.h0000755000175000017500000000176111511434226020545 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __STDIN_READER_H__ #define __STDIN_READER_H__ #include "reader.h" class StdInReader:public Reader { Q_OBJECT public: StdInReader(); protected: QString read_available_data(); bool end_of_input(); private: char line[1024]; }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/build.sh0000755000175000017500000000006711511434226017362 0ustar lucaslucasqmake -project echo "QT += xml" >> xmlwidget.pro qmake qtoctave-0.10.1/xmlwidget/qt4/src/output.cpp0000755000175000017500000000156111511434226017773 0ustar lucaslucas/* Copyright (C) 2006 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "output.h" void FILEOutput::write(QString s) { s=s+"\n"; fputs(s.toLocal8Bit().data(), out); fflush(out); } qtoctave-0.10.1/xmlwidget/qt4/src/parser.cpp0000755000175000017500000000276411511434226017735 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "parser.h" Parser::Parser():QObject() { xml_parser.setContentHandler(&xml_handler); xml_parser.setErrorHandler(&xml_handler); new_data=true; } void Parser::setReader(Reader *reader) { connect(reader,SIGNAL(data_ready(QString)), this, SLOT(parser_input(QString))); } void Parser::setOutput(Output *output) { this->output=output; xml_handler.setOutput(output); } void Parser::parser_input(QString input) { QString buffer=xml_input.data(); //fprintf(stderr,"Buffer: %s\n",(buffer/*+input*/).toLocal8Bit().data()); xml_input.setData(/*buffer+*/input); bool ok; if(new_data) { ok = xml_parser.parse(&xml_input, true); new_data=false; } else ok = xml_parser.parseContinue(); if(!ok) { fprintf(stderr,"Error en la entrada.\n"); } } qtoctave-0.10.1/qtjs/doc/espanol/guis con Qt Designer y qtjs.odt0000644000175000017500000127630611511434225023323 0ustar lucaslucasPKi#:^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKi#:Configurations2/statusbar/PKi#:'Configurations2/accelerator/current.xmlPKPKi#:Configurations2/floater/PKi#:Configurations2/popupmenu/PKi#:Configurations2/progressbar/PKi#:Configurations2/menubar/PKi#:Configurations2/toolbar/PKi#:Configurations2/images/Bitmaps/PKi#:-Pictures/100000000000030E0000016989F88827.pngPNG  IHDRiNtIME ;3E)tEXtSoftwareXPaint 2.7.8.1=bM IDATxw|iwYHz%vbNNszr)N.ɥ]%$\_$nr$jV )^6 r")iwIŎ? 1<;yx>|Bu@ oS;"o|›gy̆}2̦ԶqfϜ:>6M)eDLF0lB-XSrdщYbEiɳ.`H<?al?:NI/<=ŤdutRƥy\$MQ0@x腖 ]+Ϩ9 Vw=m+h]uUgV:<MJ L Ed1l,@;K]f3"bI| O``@H0( 10@ $$h4gƒFШh B&]YB4 2FA"64@gS!+PbcC8~rc_ v̓I)e#+ !jrϽ~? O4Hhvƺl)hHWy@zhbTUvSE8-!B1t)P1K&3,`0€<[`۰3O+5FSZsȺeK*x!HJ +iQJYZ!#2HXpɓ/m ,ڌ!B3Y̰m1Y 2 % c"tc0$,;n#樣%LumjZQ \ı>0~b]BU!~Rk.Ҕr*1篚YoY̓bLh;HRwe$}ѧ*(>WұFs%>" HXE( 1 S`l8amQH(uSN%} 9ypQT٥]i3dI o_U0\X RdB'oNmJrK-= #9`6嫥Nw4EŎW-ȉY5U }982gΆWYyu}wevm=#05?zie={SyْLe,L i,Xc,ٹc\I*s.z))e\iZ_7;rq2SJev<-\*@5Ŷݼi;w`Ns=oF`pռ1tIha@ 4*-e3E =|<֩f /.^k_u$%[Dnٙs]]o]W[f>h4ܲd/~nEKW|u ,}?|us.M^^,2Oe֮xյ׿cHٲyK;w㝻vw}i͛73-}ࡇer.^XiD"対J+q.qS57̮[|o֬p7 @ # dIEWVVVz`/嫝]]I,c—n{X,>N܏}Yw4gO-[]/zco_jz=;{[_?3*wwsO70IOV?p1{ޅ cwm[`iɬ \I^0UU5Mu|3DiW|qD"qlE ׮YsX,vرMק_L)moKݤ?i97_A8x;}pСukf&~xgԥo*؍oz#\sUGsF@ G*zq[zdsKKj1Ǒp8Ex%3(AJSѳo_j8uz6??<Äi|u۶/}+\wCp\eK,Y#9~#GYyƫNgTYM]% x™3flrMW}3CAwtt.?Ǭ]\+2I>iOZ:|dr'Nf(\e{=#"Q Kۛ_2ҺZ&#@ isD)Z@ ^ۈo qv j;7.bۚxen\{^%"++tR)W^\ @]QPgk+]@ W1@ %J@ EM@ @ªwоV{K!Ok 8pၞW$ .dBOJ,repW.ˈnPŔ>+ }+o3XTtUI C.YʉxG$GJ'׿1 _9}?ʉ~ľJ@ EJ@ 55g$B'KVvWpi RY+x&X{{GOO-)-y7#L0#)`LSriim7 R a14eK}^S,GG`VI rW_ޞUʊy&;plcvi]SjةSglKF2I`-7(O*T=Gr%U\w?ӣ*ٖӴaee2p2nzTE }W5"P+j{Zz.o?Qnyn,aIE˿/rVv03w-Zz, ]0ꪪ9H3****B(װ,H4P"4Lcp`pɒk׬N&JJ)XC[˝[ZZ?;E-S._rN^+/3t!lS`.!FxƜU&V,IR={_rƦ}aEQ0Ʀiڶ|MD`R8u*:ĵ[>IY\P@'M˺'s]NwfU}$cQJÄ0J1!m۔Rx,_=#Ti6&i+{vWbS/|m[yŵR)o]XX8mEXo3܈" 2|OsVwtG2VU‰n߿{& !@z^ K޻=UBM"־ecHZE6ۦ}}a`IzyyN3f̖d2p8**+%EyC)R Nnji@r9eYv,k̙|rɲUVVĖeK={vh`gS[}LRˊF^w=-̚5SQJi"())ϭkkogekI:X588ԓes嵷tTshw9^v~) F,IZjՎ;66ήɲv$IeY`JeY\C⧲yRI"jة8 S9KI*ˊm[=ڶ-IcԶmUU(3H9>o???mI0bXNj#nvȊ5vR۶EI1&Imۖea-m#cj&Tlm7U>BHdd$ȂʖIL dre!+P^~iNMo2A2=V1,@mFD\v9ֿ߾+W,̓1n ͛9{32CycCښQSf-sx]J"`Pdv74wS8+K!t,!!&%MnkzClR2uc4aRFɤ$g 󝎌`5CPR1Š"(J^^^WOS˦ׅ1vUVYY2dH$&g%K .(((((P! zt">p$άQ3:v,IAWY}Fcej [p9eb1JI$uz_hx3=%~*+!I#u]箔Xu0Bd嵶+avK(Jt$ m75tw`(c<2B?0 ',-)8no˲%X-I#S-L&O_+//PR\r̳*idp:#L2-.i2B_7}Gu_'~LOo(RQ.qc]njYVgϐ+8/D0qo~Կ!\gɻJ3k)Y̡Sǯ02+"##*I8JxaqNs+sa\0^G7o#HJR3}936gB%N !|np%$I%tMN,:[0LEC\sgWgAAeDcxҤX,2D#e?r$q7<84U'u=H$d"!rAA%5L,m /[zI[^^.KeS"F)!݁-m--ճjFzTq$GFF‘|>Rf׊Ȳi,˔f= !.L>=Dz&s-Rr"HRO U20?&6b1"Ia۶(D@e41”Q@OOOWWwRJ7~HksEUfB3F`xxxh(tYU)'E$Tp8L۶URQd2ɟߩ{pqz+wk?Ou=pm"X<:::ZZZl/|=߸A0WUpdxx8jj~~'1MBǀ-"q8~Lp"} #H$Hضt8 ]pK-nӽ}`!H$DGb1OlcٵWmz(r8^coYVje5~iҔ -"K7s0Fa,4ViL˲B)5LA6\Bkb|aI]p: HO˦j5!"I,eΔZy7*Q]mnRꗸ' -V}Wuw]~b}JA~_!XԮ?k;nβqg5 ={ylS*wLuC#tN3~ݽn|Ϊpw7-sSPeJUVRt|s̊yTGFFR_eKcק'Ǟxc0i4[ݴqMzxkza(<-7t@sݸg9N kUP09@NŅbM`2s]ɖK޶tU!'MӢRh{N.\n >A"l=stW18$,kH$qY4MeE$0aBQd)b88n"nk?oޱcbј?8P00dYx<qO070sFMUM3 3Ȧijr@s-->ͮ...r\ᑑ0!DbϞ::-Zؘ{9_EEEX蚫/ gFee'บw.ϔR۲c+.$$0F<8yI]hkk;KN#s$~yH,㔶jjYe[Z  (>:@ڮ0p/KyFg7d^f(pwC=c˲m,,p\j P!Muw<ZVZ폛- 3Yt1JIO1@szKA&KF[wn-r;$2 ݰl=i:Ǟ++>st w<ՎC?]ҺlJ͙"Rʀ2fS0mA71 %C̰-B֞>s&x=^0B.3QFNDG EF˶. ]O$N9.O~0uC fϮI$⽽g4zܞ򲲡p(OضZ[[###sjk,wBݞΝk.+-4xp(4o&co{a99f8 ?qJ$7o.754Mr1$"YA&Tm%xp D:#vˑ#Gx&вP݌l #$I zߙ*y7ʼF鬬v3-z*dY=o F7l):я)$e*QKyd洵}#v弾#,I=si_ 1jSfN:鍙j#fw;NgJp}s3-˲ Ŷ|JWb IhsxY7Oj9תO %V2a3W\l3g2 $ :1MFFb####)R*V%BP(p8 3MNvUU c408PXPph>u ?[N gN])E ht8...RUuphhddRGGgg^ MO$64mm,BCxܴx,VX,/+ MV$QJ-6L$+q$XO$zzz{l R]0PRHQcHrR1ƖeUxVM$˶YJX˲ ˲A&K2߶`ڭJ,KQ˲dI>v(c")2c`e1|Ulf1e|O<݉0@ X|d:W ׼yn?Љ͆ c ,RU2 Cjê'~?)xa kiM[";'ɝԵqA>B&^[^q?cgⲒ2pFfeYHVIv o+<84SKESq>wʌܠ6M)C4>K5f2Pw$PXN?NfJL>lܵ&fiE"zS` {A]7 w?/nX M]'aڶy#m;EEEپƠ;X27qj% 4\j`ѐoKά[YJ&uʨc}^mii. BX\4ߧHRoO_"-e9888XR\,iDv=gFѪYb1E-\C__Ggsmm{_7wnݜږgڢ &) (3-DR٪/*c׳nǟxr$iٖe4(5J _F$$ɔR -|+)oF˲)I=S~yDlpF$L"XHS%LPe$!2Ȳ 0|+HB?掞M] bkp`Td2c3.8Llv8A aǡ~3X%_3I=U/g7K܈1;]VMf-e{֮H(5p8 x]nSSaYȡr..l,`ITJ4/8Y?25sf^~H-xikk/..q;CC3gJ$S,lllr9]%wG!,\/?vs0.S;; O[((Iڴ̑StHwk\ e!&cEV<c[} /X0??//cƈo ΘO7ywLpm)v5L i^66lPW`270Mo3ͥ (#A2Ʒ7'$tRJeI,ysuy뙗c?OK;bOoeUUJ׊R\9;^xq\Y"m׷󧦤ߘrgG%E}% m}^4r7iUJoTe9ї@$60- s`$jlOs@dǑx !ɲL#$Π3 <EoœMƊ,Ij8udw,&2gΰmN $iU+3h4y˖Oz=3gTܮlwX!ܮ3*Y'-?wNC6ˊcCEzr˖MNefleK.,+Їz{CuuP0bcKJ {ͪU֓&พķ,+eRJޗ$0áp0HX 5Lzͩ꫸};I,7 S<%e ԆHQqs4RB$۶0ƄH\=CS!z\;ڳ#1 8B_N)=qwӡ>D%iX?1~( &hс3,!$IDe`: _7l)N\fr RiBϰf  ?4~G p,9B}c(cTe`u>0 ƛ.F]YiKɤ[n1cOp_4O|(jmi{R>p?UVVNE'{5oMT8Ӹ `l?l`d+40 VrۮݲCqǴl])M`.COn?b6lp]9O4"iM۝78*qӻVrږ Zi]Ҙ?;fͪ' *+=,ґ$̜Yqsfͪڶ^w-oOۦ]==k׬bL&lfU8rhu,1884 aI4MFFzz5.gΞ- }~%KO<Oϛn{|O}-OBk˲57{c߀$Ia6 ְL2q[ϟǷx!y 'c]Ƅ1ᣙyR0:R,`a,לS㓿R5MQd~1Ԋ'g~سm3 L-}"(Ul?ٽ,Y}[[%y`3=|7Bp|FO&%#dX*M%2+<2◿ϲƨe[Y3gFDH<0ʷS;,7 U qU 7``#`@pi09QשHښ‘H2y+wٿXsv[T͚ Tґ pjjk>"/4Ͱ+*OM"GtT{^fNS%`=ػ~dZ0k [eG39[0Oe9mo{-ٮD"۶}1m) |#_`SpwO/\aN쓟XuUU-.ڥKey, q_% F@('L@0u(3mDsf Fm۲m* m_|ptɪ_0(XTU/Fs?-*[OX`ʂMj]YYQZZjmc_Ic]3{x8r YQ4M 4n[@^h8TVR$D]SS5>lDE|9 ضYT\zMꂂaLHuuUqIc'Ν+.*r\ᑑ@ JiH[ 7sbӥ͟;7X `۶;:::Ñ0_`|(((x;[C@^0rg)//+kxxcL)KAxݛbӋ1oq/'ϛLDz1g!0- S2|RVXjE &LTedcNeKGTU*)Tih,^1cJY.-k{j~Hb}$&'eeR"/`M]Q|'a [y:ϞsU92+,J3ŗvַuc֬I(jYf>sL?{E7swi J)@BK(T(E_DA@P@ H@$@*=- Ǚ%4ϓ']YgӆyqqvV=9Ggΰۼc\Jt Y{k VL%l(:McVjJ=t9z`g''k>-E`kkqZ-a|>1.qRie2UiiUED.ޔ1Ol3Fŀ Ú)b8.y|H,6&=ZV$H*#+Zl)a" QHHHFfF_z2%7!l:7/R֨5\kM{NmmMtieeZʒq9ܪdzH$EQEEEEEEE*^oG.MN;NQs?i*6)f$ߔX *5*sݱp (ER@$b7j)XޭȂfsh Z[Zls`b2$ k腎*×3d'ݻܾ\{x=Ud#-Hů[p}r_zt'c&1y^:pIY`ƊQ99k0{^uv蘝ضӫqgN;~pG<~ç.xפc})]rNQ5!N*e4h祑6ϒ P D"H cܒRFKd!I-^IfRPܼ‚BJqoD(0k1枝6666"_Rt:\ =LInn+7Йd8ƧCflih+nk0f$I&Oʧ.f^YKbf>3aƾQw5Hqpa4$YhhٓhiS_9!sz q8fpI*JVUUUZ $IǗn8*BĒo;5jE&.D"1[nbb#Vu3Kuw"6 ***jB{t-ޙyz1dgwɀ==<D`hƽ|Ge2<_z{DHTe0_˗;}mmVV<. &< |p8l\o!W#0L tuIp3lߘ۵U*5AbM*65Tj+j4jƸ\갻ۅ Z)Tjoo/f۠+ d`\b++eA.*5TmbJeM]C(}|# jK{cv^}mj 8{ؽO 8I7-N2`,| 8'JM995>-&5m:ΰxk9VxtdSWi1CTjY  3Y.Ip^}ur?gg'Bh$5ݵiy\.elfs ; *pM>Xvvvv*Zs8_31P$I?86g'7La\ufVcGIvvm)ev?|]wf{bbWqp8B!g: )2t2G\>49D=krk5=̲TWt]˽w7bvA}^AOʶ?6G{Ejh׮xkVUA_HǒQZOs  J  B WG9qE~WGh-2&A;8%&$\_irGC@ '0ÜiժggBݸm@Aiwh-^ۻFñmAg5R233ۤ%Ht濗ں  tCLa8?UB! /tCL& @A AAB%AAzռ.ԇ1=|61@zx߷g% ʊ(QuoL5I>ހa:yzt#ku۶U;kƌϏ r:}xQ׮] 3+OĀGyyNqlX]}U?Z\3T8D&TvPx \oލ^_o!woe{\<umtuq8s̶m H 9s>ٹ}ϗƎ?u∧G̮.: yk&VMQձ/1)3`@񏃕7^xʋrtysAFǰs/+r@[x0_;b`UUyyuyr~~S{zgRɯ?>':wj2G3gN|23уkLK/]fH|KuGAZȊ&OvzC֮9 8{OOm1d>n&%7p3p_"Gus_&}A}"FMJNe5a}? U>ffetQcǷKJZ\3T;077.'p"OL0qO,zWϟQ>O~3)n%Cb>[pO?2}H. :d0{o\%gXg; ͙BBŠ˘ >Uo&Ai ; r1q7NJ&Mo>9}ڍ/}ߝɮ2o֬Z[(+/UORO?>qTU===&^4qW4ڧQ(--  =%^ضV>L ٧wx|¥ꔔYYCGW_a+*_:&M|9sɱ_sqquFׇۥñK-Bxi;b͜>8%K-[k'L0 L0+/c !Ai2͖H$ƉR[ۊ f1F訤dlOm2YՍIG ;{)4a<ޭ <C/Z fA7QW^֌}iSp6п߅ ..AA8GhmmխkWkYɦP*\KKlj `gggاj괙8j*g1U"b𣘿wUd8[Z>;)/Ebg1&e?_؀˗8 AX[$YY)2$I2 j㲵OmU*͜Y,EõslQru7[U_q8fWՍ($|hSpҠ~߲#o~I oBkZWQQ$ B\.@wwCJfql WUə\jk NaqV{}EPS|tAZH$ ?zS&O:ݿ'z^R B\.>rNT*E"MY4&nN_wۿo JR,5N73nRZ}ىӧJR[[w7gGD{;;sb GGch8'7$h;gu D"р6HWST ?5֬^񧋌K̵2fMykA3|+v:z1aأp`サOmWsO}솟~d7fRrPH^a}-E >YۡCw58(ȯV}jGDxf 'o'#A1MZty}ڹQؖޑ9x賅}j_6g_Lphe_ u'2$e+p9ޑ_pA}5k)q51(yH4awĴ;fsm۟vvv23מ52<k#<Ϙ233sk $۪NL1l萙8qt``>͘1}۶?컫sooggB>csJۺ)O?;oO7ZYYgjl|:1AImAYY{ 0LJ3nS&uCZlP)0f-hU'L*J ں97þ{h)(0QƃV ]}k[VUڸqWc-Njw㳅mFALڸq*ڸqcbh yP i&Nw)^̷3abNw \p$ ޞ+-k~Yy.P 1VU=jz 4Mr}y!.\,|[;tg]\\jbQO}09e ): SQ4U{Y$D1!BVLnCk(4. HiG)CE }m ^Uj+4UWaYy3o5駟VÂd>4dRlz) `6ʊ9rlsM,YYQ)IϘ?0(0(<0P@.'T",8[JgjM54]b HoBQ4I?[@Yyw;zxv~yW<{njpbp~X{y__-ur|XEFlG屣GqR~`k FfG Ir˿Xf ?`μO4pNccp~j?砿4še ݬl`T HNO*i]ݘ7iμv hoђXhi+ `jSJEhC4'U` ~[\ڋyO>hv4apƟ7m%؆:G<}泅Io-[-d=dE7w|ev'G9Uku߭ժQnOwՀ/wvѧհv)e;'| ~*ݹ_\_pkz̛D$ET'N.Tba*Xh"(q(qV$[\|Bb.W-_}x0=puq9w>ذ3z$ǼzM.;w֗S\(Z^oΜѢ{}kYoS{:D\"}<.%꭬];ؖU*ƈJmwDݻu52/}Aa! ̪q'T#ob4 EQ&4jccӏt 0&],W0˅E[<ܽgxpqJ}J5.W y'TǽJS',2&T]QrJ=GVO?5wD|4zH8~_,~51//ݹau%%%+Oeiѐae={_̯B낃[:Nu@a/r\!b#sYe.qJQԄbl=rqc){ Nr7&tvd_6p[7x%_,?&ƿK>[x豖;mKfAєǐ9l_9l?)UB).U]VO?dlwy{o~٣v~"hђϻu*)'VTV~3VS~8Cowvv:y"ч|EF~5Mѵ2wodV޺YSFG gOe3]@yE{>?,Ǝ旗 ~eUUbf\˥ԣ;`6NjC[}Zo׬8?[q?y|PwN1c;'OFM?=O4eh9uVP(f3X2&{Ý:3ikk$e2%I@ӏw(W(4%8(p:nޙ{;z1@X#EZR%j7 pD@BYَ'k5A%BPy58 Ap2iNَHPܺ}gp :de^/J/}v/ e? D 4yo͜1iCGf;;D rٛ}ͮ KX6uwޞ} ~5bYy_''Nrss܇J:_/Ek\VkإZ-9╯V}}/5uE mׅ~L䯛uVA] ˫A3qҤ1=szFjvPJ!Nx  |ɪN,V{Vɫ86eaaѢͮlYڇciJ&ID"b֭߰nFoW}Z;= ("˱qYA(h&4EmvGg^*jǡ*0y-$7FZ?cvvA1 lOSI^V[jg^%N_ֿH^":19SL3g!~۾}{BBBûݼyY4iuݸR!t-BARRڪH"C7i$-MÖط$C*t\ymƌ;v0N믿f̘@( ,0FRk ρh당y"rm& ٺͲ;=Afr0JP٩v$˝n߾ =z(((to;w\ҥK'O>hРQFݹs$Ʉ??SN=>!!!-;v,;v>KNN}{3'=|pp6L~_֯lTz|vxB(g7w>VI'=OI,WI"3fǎ_|ܹsdڴi∈ק#55L}zdd)1cŋ͛W-[U >I\]ƌwʜ 77/&TrtrnL쮪Ve׈F(RyB~tjoTT_-SX-}ƌ9s0Ҏ;֯_ǏSNO׏Ք'N4i=z4..N.8pX,ٳO^gdu^n+)6c H'G,4x- PT{bN;af+] ċ-}|YX/Lbb-#O3qd:9 8w&6QƀWtW7{wnv5<ʰ:}u+'zhFv߰sw![7t5 衣mmIz9a7f0fBQ՜=3sM:uU-HIN(.(,--swg5 A4իWq4hTVV=c:88\.7b#AAAǏrttqʊ Jʚhj A LUac :a7*%P(*ϹpP(j5ׯېacϝeF 61TryYiƉG"X,Ren^Nv WwWK zBܱ}#FpT;QCv@DW%I&> љNۨ~^%&Zw4kL[(RTRUgbM{nǧMJN2dKOO7:M2%&&s'N[[[$e2-w*T H{ez37޿|+_W7ϣMӷo]2lLJged<aPVZbRo3aWWjEDZ A sܽ޶+).教joiVVV6Lȕvg@(BK+z/ٯs&W{R)t-6ZzmaMrrD Q",X,'g̘1x`O8 >?ꫯ4ͼy>3 Z-L9@7n_|qX֭[t)I7n=zT*%Ç~~~vjr] tA}jX%Ċh FV1 I䓻((IiY6}fFb|Ftg°(K!4Ѩˊ5!TxH$=^$̴ڎc"AO_<{//'9I=֪?___fIfΜKQɓ==={\]]\]];4bĈ3f̍7j,uHHHyyuٳg4=p˗ … FFF͞=v]aaa&P.!WrY-x<>yBZetڲ"o߮4$zyw͓(g@h2/7 BU93^qgI`B:8q$IDPUoWURl~h퐙*q9ܬļFM`gc\7sN:t8חpOL|ڭInC 19Rϕ+W\FJfu! &wt:mΣ̀03 43~EAGTOZZRf}9u 9`WNDe2vz<DRV+YtiȜֽGij8W/bl2s\:,41N**4q޽5kִi+AɃGLܬ+΋Dbג~ p1KVQ~IܜLON%pa0CG TM2$&\8=t7?0Am\a7?; u`{fٺuzB' mꏛuQiyIihE 4hÆ mu s`mE[v H&`A>-cSBoƲaGe=ύ/jbo=q4fՏB=u矾"IF2n]rZiw{vZc1hGs˺mxhڷ~I7$${)7Myv򃻷lٺ K*0yJE.0h+a}ٺyPuͷ?:zx3,,Fέ!ae=ٺ:J [cn )27;=)I=GEAa tPzCÆVޱ,rcC"cͲvQwVyˑx'N^0YxB!$A1HOvό;,).ع}w4jjC3*YJSF-))tp  fѨ ܫXRkMazqzJ;Aiek7FU ÞMۯۺ  B3FIHÆ 6%ۉgZ% b2*! [myIQUrVx*.- uzBT3C0 \[P|r,%B FA1lUrՎC Hش?a㾋쿘[|:>e_'lڟqoܒ6Hش?a _YlQ }hknEg@G$Nա>WS2[}+Daix|Ero_»y>7]JhnA:2[zH҄f0uW H5%3rr^Wr}D^/ KI7S䲊."  BƎfac( g@QA4꜇)==HD4#''߿Q-o͛P" !W 1`p9mdY#*(=%G5^_`Aԅ  Hi^% Xl쿡 06 3Uenn/3uTBGEEjXHHȁcǎWa.(L֥Kf  K+*alY`}zhhhfffZZ/∈7vo'O޷o;iҤm˖-\.755ݽG  H"cp " Wcܫ=Ά?+Pt] :Iqqq~!Xٳg;v zQ`ƤI;hѣ&L AA^柭c%7CbpX7J13=W13***pbҥRiYYQ ?% IDAT흝]g  LUb3g7\XO=W>$Id2fήzbʔ)1118qb}U`fYOP4FAA3S*1J pp{emU€$[&֭$7n8zȸqΝ;w &WT*%Çk. !BV7B)mE[ֶ݊ +UZpXa՜,d[nv횯ig F[Vm" ;>VRǶn aÆF33ޚu)!ODdMmmvϲ֯A$={uC=8z/kV_)J͜:UBAy>yIQUrVgVD, RM4`& \ &˱q4AAk'<3vJR Hأ>* @Qdp'܎%+IAR J%T  FTVW{@7̽JZJyR5TIZPX #?bZGS_IMϳb2-߾pJw#  T Y(-Ⱥ$hJ$ Ȓyr\׫V@F>j^z U%)rYEee%EQׂ  J d% g33H,KX(i (JܾTp;QSE$/ )t`:={vРA;wԩSWZE֊rrrk$D)|>i͛XxAig1sÖط$iKeB.c9ISo)HYz#೬$"Z~pZqJYpq>[շcǎM>}ժUKNN}jTwq59l 1Iѹzu EZ#=hãG||| L)t~~~*秧3;RTVwРAJҰCCA4yappB(((ڵkqq1wwwJVVVVVV8}'NU4[7 74[7nʊnHIp6`0myh֑!̴=r#WqjՕSN6e$UHIN(.(,--sw} ֖2T ob(#˧Mv}޽{7,,I2eJLLLΝ'N$Id2&Z*--0pB0 H[M@:*0"o{DB|70)Z%pwzܩw(*˅"' 5kּk^^^C׷yzz?~|̘1111V%K.$InݺUz3nܸ/ݻ ׭[tR$7n8zhTJÇv0@ 0 H=AQZfWI,u.)uzuDhעG֮.=zxXx:;KJ_.R[BC}:uԩ/ׯjF222̙ӭ[>}]tkk됐 777֭[]gaa|rKK˅ FFFϏzU_:Ai{ZI[w[wk0X%.ݽ' <\i ejfx:89ko+T($IX87YԩS}}} C_}ռQ7:""5$Kx PlejU/PQf1WI lϋ,Xd_ASGA8ו hd833S*N0L[\ڛfDqqj5FR2_Kp$&с-1d+8usE? *!4[.Ə9z,gd >j@oϟ;//yNFزq]QqqP}3܅ܿɱ߾Mf 9bl;8WVVyX z"7nޞ>k ?#FS->yF4l22M\l@peQ޽bW)]>֗+lƨRi9W׸CQ}vwL-*-+K*~ԏ4fk@F'S\R=M*dTA'^uII P!*xU hksuO[50Q)*E_gi%%T"D8ү/aC߻?H']$˃z?K|qq7cc7nݒmGjqE"\6llü|??Lee}A:Z_8iQ:Z9( 8+J/IMXLPUQ8pqF84W^G3ٳgʔV*5fTJQYn}J&ㄏׯQ˨|  CKK--+&jjj<**+&Mf0]]eۑ222rqw°C+KKz*q,VM;Ľ×Oˢ1VX8 7WIKC:05&U 2en´T\*,<*XdNa`V \%Af%ӨuutiFTRZZ|UUj u=}꘥tQ#G=v0ŘH$RVV.++mjWBu5^gY%EU4iw=\ t166ݻ^Czz rlԖ)999 rbAAAlƍ...&&&^bÇ?JnN>M/]Сl6Uᨫ@PPPEEcvvvQ UBi_B{=v%}>"h֜y990 0t;w_4|萺GK_O<6=wV冺+5RxRCѕ*UTf=y2+ijjdyS]XReXMm啞`0,Y7oޤIII۷oMJJڵk?ʸqNoD}R9u.sֻ[EdN~jޣgM ޼ʨ~cX&[U 6mvYY6ܻw/<<ʕ+|>fs8; B&کS'P`0RSS=<<<|''B6maaq-}}zݥKZ]]pR[׭ pj\ķS߭_MfV>OLܺ0S A,]ʱc\ں#5 \Af0gNS=A w YqqyyuU~zz:Tk%%E|XIS y)'h8w7UwRff&/))jJo1L& 4MYY h4A򟅉˗lll:BJ >/ޥ\mݑ/ADDxtzoջvS-5~$!aB\rqL($B,(jcmoQKG-]Z=AMQ[h+H>XuPWWOWf6fN;i7{ZE%yY4ՅBa{֬Yf͚E{||AsQ~/SPI,Mz0 #I{| &rB!4"-PIOG髌/<h1TUT쬌Μ[\TD8[EWPRR`@J V.H(*Rq2V+**q\Mmfj<²T(J&ݷI lB%Kɸ6I$Ih4:NѴ5lLdsԁ/ UBi6t EZH6hߏԅ$Bi.lm97oXI;|*q*۪_< /7$BiF.,&x"*ݽ e6'3FΜ;?l`TJQ)*,4?s<'FyzzlٸxQ}mACGJJKZy¥U.=R /whkXJqqSV/ RYEUYM8){Zj|!v"&z-RֆEFu#kukQ ?2| :}Vc׎Ægdxlڰv҄/8mMBG<{Š_W?{^O{ $-z=֝W+JYJJLLefd$']OպODϜnܸ`jH$phuZ)n޾mT A3%Ta^qcBvrN>i3"$P7&taètqI'8f#IN^|ʠ$)@,!1 =H[j*.WEMM,0[7w`np$IjA11 ՞֊ݭK(3Sݻ8wScSunbh H5iRvNҤ6uuuKʨT&SIdFcXԳJ4XTY,I K14$޽l77?IԌ*c RTXV:;N[t:Iii~=$ׇ IDATg8~Ν:=OJ|o RRRDUEu;==KJKDN} ZxјQii}2h7oc\ܸy=l5U];y+fܸBJ ֤K㕕UTTZZ}Z"U|Z_iy<>ǁFƚl55Un}҇׌4+:d666rO~ O J+KO]忞q4?O?_$|}}6o\_TT噜:\|Kn.854 &t UWW?,?={~R+j!)h뾴 %@"0 {Kj䷡#{;pv\pvK-ck++ H6lA}AM#77 O]8GĐAzqZK 0223Zu ߟ &f/zq!뫠s$7#Afk%twKd_\ U| iK(,*GݺyuY 'ljr1)yN&T"*k֫(O*[jݚUoW^@$TUQ!BUEGn޺8NLeL&SYE_QQ1z\u/㻺:b1Y,&Ajϟټulm6GYFzX[} 9PZ鼬|OUJU8AX;mwhf+**Rޥ9wQj`lPIf$Ų"!'7;v\tQCW`TUU\M )?Lt~$Ihkb.NdFFӧ,--GIOϐ=wb0eSE:AK (HZ@xSS+ E&ÆݴiނBUr.I.ǟ^>okcC?gyzSsh4ڙsdžr@ H$v:|0H};96 $>}788eK E.7{u/:gko<Wvuq>sDAH(TBA> S'լYN$OLytdڿB,6iK7eR7AH+X+~,&[cV֝;we2 Ɔ<ڷ}Usтc&8ㄫ[ dzw`uuu&|/K߸5d}***Iį6c7A#G 733M\\ZYZvb)+mިJ_ R0*EmKv$ĂG!$'$$h$ P$GbdC@I$M4:C 9RK IKL~Pŋrۺ# 7n^aSii)IQK;:vAg4rp1K[]۷> D"'-X4u32z7uՀb'{h4KpӺ H{e's ~YbWh4PgtxI" y)_;w@w_ I(((5Wݹx^f.Yeff<ӧ/sA|+Ib\I74' C CSSS6S_OlwAJJ</))g˸gd 2K223 cnjVmD8q󿪰K|Yp_}EbB".!fϞѣjKZ]7SZr Aiot%Iyy4DG[J }'ݍ`wOGGNEeU[eԠVM&b1l6Hۯ 4wuq$W$0L|ɓǜ4Nuoƍi=4?ШdJQ)*:K?;]:wxlk|t^>w?wEMMM,D"R&1(++V=}ĿNz6HEb="nݷ/m" ɓܜiS"qXjUVFnY[[ߨm!uJZ7 _k /Ϟ;ȡn<+3gϻ|񜝭 $pǶn.姪zӺ]ܽV\1h`%ˢfp;uu۲q]Hs/8~ӌFFK/D -3{& hn|r39${$s5Ӻs@U\ud&%& ߏ/ĸ<ˤ];YZXdtn4 | ~o3svm'$h=rrsvrrҼj~-ܡCiտΜ3WpNpd动7oݻz[{wrv{L'KB,^}rrI's4%5םZ'j͹J$I8.Hp`0/Q~ݘtE(渺VWW?كNJJ Wh!Ç9Ϟ>YtnnߺiMTښR~}yHgNF% }ogcVk025JJ nFM9Uq|G TWW///T$g}y"' ,,,>}w  ;0/?nVlsnnrKd4TG6Jh?qA#@tnj:>tD舡fXj+TsTI"ș3gǏ?Nro޾};Fc2pNӿ[[۰0.p,,,O4obbCll,;???{{{'O@IIɐ!Clll= mY  mKUUuENٻOky{sx+ZOOi4t֭c Æm{]F$@yyǏhĈ!!!p[niPPеkZr\AA'B}{_R,SOG mmnEŹGorޗS{YJzfa!7b%''K7iPVV`0k/))7SN[8NLL&SEEt:62<<3Z7;vl``۷o~y'MظiӼswVVճ>|3x̘'N;wn'l|]d${}|i}}eX>|xBBB4O'OZn݌3tttn߾^RRz{{M<A7nuY/Z7 _Zmsd1WI$I#JQ~z ̛;<{} ^a~u*?ijjz…˦eXFiعsΝ;/Ãd{ OuEQuk>GD ;3rYK[(xpJndWWQQGAQg IylBF'~]/K>';3;wXSI8^zP AAEY 5^m뺕 -RQQ&uKWZ['''uqq}vϞ=իK,ɑn  FI8N49fܸG69TsTN?}ӧfllF% xAiݽ=9`0W訨4jߺ3  'ҚJJJJ&&&TУ}֗  uS`3TFAVٽذI%%;܁C1k\Bٻ/Z6'ᐁCL02DjMm֑+Tzh4%%%6fh49 _RTu~XLĿx|%[  ÖUZkǍ9~oٜ'N7BסjZ7QhnAljݵ~yY拗F*=#cQ}|yy3ph4ǖ늊.\$pNNee?͘m2\0eqv6,sq]Oȯn.۱7,- ;'?0̬ig ذ^=ߪכ#08/+ ~Q>{dcʖJ;~(+Z5GHH$BqBD"},AA Ø,&...:on%<`W^ UVV;&t՚udYGgOZ4*?l;;oFƍ {굑Ç6ƠOX:y!KY6~G͙pG.E}2$72krk>@ 611С-:rȑF&}# '&H ח0!r?tI?N$IRWA qq7.= F=nܺ#mGj6lDb]> ǎ'O_N'H\_l6b)++X,&{nDB%A͉1p5f\d*++@yEҤuuuKdʰI :|Wgv\ݰ0ЁY/ &??;a|q9oEO?D-TXXX,Ţ$*H8^  uS ::8WVVQRii`UUU54@OWc}32msg_>FcCG} A:Ns8oon OH y_TܼyYAAvG]]=gܳ`\?p@h. u-6 :|d"h%sfϔmĔP(dCmwbY5qc`0N8"X"8saI+J$8'-3,ٜfʫuS$o*M^f/ &gwThȒKRǏ:u4?`PSSIF~QǏm^Z{ժUK.U2l> -5S@C[WiBR :.A8`O*AD! ~X[KW h$Cu͙5sάCG::GE7z܇6 {lYƕd77mߨ;7-YlB*>1J>YSm놵ZUٵ,?==\yԨ܊ ޽{/-Nmfff&&& 2ѣp,,,OTQQ蘝-O 11!66|˓'Oy,Ay.1ں#_ EBUWs+*+JJJ s֎Z/K=kM(-+p8v옮n yKijj>fLL̰a455̙caa~ٳg@aa͛7b-/6wɓ',]t̚e˖M0?ܵϕQ)*Em[4ɊU >j455ۺ/G(jn6l3~6͛;Nynncovر1c]=..nԩ)))cǎ`[nu‚|>p8]t wZdxxxpr===BWWWo= ZA/Z7Ґu֢5'jA6IZ¢aKwYӼsݻW&-q2ӗ?TݻP(|x{IDATaÆQx<P 4SN[Iׄ:" ^kk+y>B=>gȲ;vޝ&uNO4ѣ cҤIi}}k׮Y[[Kq8yRUU5iҤ7ov+\Iiii{\AM@ߕOlQPCuyyyݹs9Ooeee/;teǩkTЪ&2""ٳgϞ>6`{P(333e3LDBO"H"8::8~XaϡCʕ+hA,8~>cfb\hfkQϟ?'N:`0/>K'N?{IٙQ97n|򥝝]N d뛙y{{=z(;;ŅΦnJL:SN~~~ rtt :t~…Ə |\~fkQ+z4c4tb/]8|l?Gm۶ٴ$j9{Y;;;+hQlmmfc2c AA!KHj y燽Sz+fD$Wo`޳רL83iX=H$!J  {EVnP q@P]]mbb٫WĻC]]]MM 0 SqG&  HȫRC[sZD";;;OOϾ}N81<<|ܸqG 2eJdd@ H?Ss`TJQiۖ~0a䰉}CttteK :?p¤&Mۯ()}`C`hhkk׼}* Oz'} Unպy<^aaazzz>}zꥮbɤ۶mu5@u#e\Vn !ë*%G7uug8hhEEyMsg )yyW/jӠCH\YYь @d6(.RѨ[(?u7B4A`0]UW@EyوQc]ަJzUe#Gqquu:; Ͽ]UeՍ\n 4TB1J>V64-=}>keeCAFzqtH-_I7Z3Tb0***:::,H111^  )#c2*N.[^^flbJmv04*/+$rˌ?=y'5Z޾yԩs@^AH`X^ݛl픧ϏaK!M|6' E{;7OSS/JQJJ\X}/(Tj+RTJ۶kVRREvwusWUmvaXui1P'P~#?K,<ӿZ?vXϞDC%LMM&*u3:,jAEEEZZOoټaA-eݛqI .^x%VVߢRTJQW}Du NYnǿGOPu+ iznAw>{*Brv¢b-M.K$fJU\bR9N91nl(A]:w*..&b틞0~\H!*AR=Kx,i AlC2PI][_^uE |P$HCH$+W:}? PI H3RA))-% Tb01g6oݾyv;[ ~QI}IJ *.o.2I,@$XU$Pb0Ɔ̚*.갴4xEEɶIUn1m;vMaĖAI! VnXیdoD;G~Wu܉ mDjgk{)Hp/M ?q| /ۦ4,qٮ.·b(a0A=pر|j BS8v;W 0߱m3AfL0$"|Uݩ˱CTј]۷Κ;Û$<}Au df;8w]RVfoۼQs 8Avǹ'D-/9Wސ+IӉ =*PfEYzт̥rƅRMHsp_6s8T} sd*zeQ= y@q"C OPC%h1I[wA UBdɎ*I0L܆]ad@AiI4M~AW3_&ddL3LkKXPqJ/g9v cJY24,"?%(ŋ_rJҶ-Dxfyp5ok>vVmSMb1?yos"& 013ߺn#r?ZEmrzu% W,]ʱc\ں#50N]W>QmrM=,MbN:?[k 晴@ ד\qަٱ&pYS':OqI ҳNZPX%AO`+ذ3ހ313. |1䟫7Z`zM;\3^p+ts2}ѢOYk߅Q=}>y}ƋM+7=xbώ580kaKeuVǫ  DJth`cmqʍgPrzd8su=y撿ȡ/P];};)l,ThijP I fG4l߅=l@ߥG*'Y_C=b×>~'޺t@#9wƏ&:U #SqKWꘜں?7 fGٳϟWWWree%*++˳ (JzRiScC(,*6 ;P }]jߴEL]{j35-Jwv ս tnd3^2; D.$`е4M}=r&];T-h4e2D[,Ό8ADv+T'N3__YfJ HLEK }JkwF$y`jbDmռT_OQ:Zmm IѤ}G 1.ØҜșUTǔ/ tup2}]ӣSI8s+++)TTTKJJ|~AAZ5)>~߶޺pڜ_h4ZTQrJ?>m^u1rHȳ篲s$/J_Jޘa~WT>:9ڍ1TiH$f*1i48{1VEurQq˨S AC]-86o[kZyTZ"4հb\H$/AisQ g8'ؚM;Y8˝%/(Ätsw^gԟ;kV\QY56y¨gQ?}?iu?B͘ìӽ,y a޲f'{\Yŭh(27mlddtȑF i񠠠 GGG*ӿ[[۰0.p6nbdd#}.~JQ)*EGi =|ں#H (ݪUH$afdd/### @cb*-..^hÇ߾}|X,~Ů]/_H80hР*۷^^^驩 cɒ%PXXsΨ(AAO`pjHsssȐ?$Hv=xpְl={4hРAFM4 jL,;::@aaV||[n>}%J##g̘AuD&ͬBAi'(z]@6;p^hqk?, qƍu֭_~۶mFFFL&dB _qLQXlٔ)S._,癖1 mmmjS__?" i.|6w%-5)[_ر#k*S Ǩ4EѤOqffyyybxÆ W^@IIiҤIwnZpb9 \G.n[׭3n\Վ=.ӴQ>eN?z4ڔ-U5+<%%A:Y+V8uꔊ˗jdJ$@ Mhhho۶-** ]v Iߐ  =ѣWsqsjJ\%騒*iii-\G摑T2͖g#=Dbeeo߾733633pt###Hի׊+?╫qW@Amؐ6qR[{mJA}#?8FTN}狂U(X|; |omL6Z?Jۋ1Kr]z<$)w!ZaXL&S?ӓJڃBYGGGGGG=gmmō_h[r !QwB ]V FfTA˓̜C#Wۄn\/WҝLvx]UŽTXU2L6ɖjwiyR P?Z#]I e܁H~<700W*Y9$Iڬ&mllhuY%I3Μ9S0{^{6l6SaH=H?4qqX/\pȑVd2ѣٛ7o8p0,4fT >l5n)^81Ͽ> d~q]JꟲU-}6]_29~8_֗ C32ߏݗo*E&x0}c<ω'nݺḊwbYH_oPڼE;\ƮW_{[jgX%xoG~Wt(<9M.B}cwU%EQ:;;6773Ln"G#$y<EQܖ*RSfO}E U>3뻙aeUI={kcTU5*iْ̻&ZW]JD}o74]']JD X<,ZT[T.[JD_Oz8! N:oPo16oUyPDCcccvVҟ{/UrzTi{_퉇?>=컸¿ÜFDC:98ljiZYW432UTSywu8 tIME );'tEXtSoftwareXPaint 2.7.8.1=bMsIDATX7W0$*"t0^L5L ^:z3D߹;dϗ_ ((P#B54>Q2o@R>[Юʇ0jօƦps Qn%жi F{0s^G))thґQ* d7R&& cjpf1Wrxg %mƲqlVV#cQ\[7!6q=?!8>q3=~~a C]zXqmonw\;{uάd:cT>INp'q6K?hg@o@]>Ro5oE'v$Ty/'U)C<IENDB`PKi#:|-Pictures/100000000000031E0000019100DA39E0.pngPNG  IHDRd!MtIME 7tEXtSoftwareXPaint 2.7.8.1=bM IDATxw|̖:InY{6.ظF - I $1$t0 Ɲƽc[mJI:L|?|Vf޼w!]0[U0[U0[UdtI `0 O~`0 O `0:^e}Tu$ JRhd)KYR,i< -7V<$b/$''9`)KYRuijJ g}^CG\:a.ۥn۱ԼW~˔Yr&^ =)ɑ7PUS .],e)KYNLq-\:BS,+>\vԴySo^yGߥc g"@(%i^?T{kj4Hu:c6RT3X(PJ8P*VH B% Pˁޗg[Ypżns0!w, :"q-w͍.,-9Q0l*73 񭲺_nSzô3OuiZD%w m*:Bht FgAQ,h#(P&*4T@Mk$Ah91kl6Dzj|.~1nׇozûчR k j@@D] /vƘ b0%܃SEKoЊxDLq.^FTUk0#rF-uIl6 Р>r"|4׺DjZU6[?i]QKfXOp 59]u1A )@]{I嚚Z:' jjjD5M0DxlM#|+b0&H8hkY"M8rB1;W #Y0`0`TF& c l4#HC8Z8"FqKiC0rCm&q#J1 > 4 íuv>XNL-{9hBGG ؒoZ ŭIIKȱpQ~}WH6[׻]sԖc0~7sXWq j\LB4J[J(C3k@(>znE>#'i ,k@BWDP-J^Rp9_ؐiM~}S~S(m,+Qa?KYکiokA}#$w AQdE0b9'1j[q A!5nPf}|?"" I3yF P"ʂh,Le*D^?I@49v鷖s]JpFD1^nM&*XNBW֠34M!@( aD HczV9:':m cj@C!&VĮ&o31H 2D&@W]}hZq-cV@+Q&$V&IEQRmM??.Kh fK6Lpo;GsW. >#ҟ` >I5"`&=Xbདྷx]*,dEQiP0B[DCRfQMA:kOPD-T&GQ༒ FGMV5027}h )lMסyֶ-"P4B,l%j8Iϭ:kM+R N6#** F`E9_J&j3 Z '@QདྷF ,Xو:camcT'Fmuv KYY~{chEGO FWB-5j܋8rDs^4Юk?W`0XtVUV]nq^nyyt8Ҭ؟kNuuYYK1 BiC@TfO*w;"Iq٠rPi*0ڤ#`I}jq@nSv ={JTU@藃Bz-ګod0CA|f L!d11K&.8l&! zH&kl0 j@Qo ȝFtdo_-=|4!'jKJwR~AK:-@zY8#fQ?YRǖ=?`0 Ho2 `0r$`0 `0 OKeQ.tt5덿j`b; `TWU}_䪌̎&.*_XԊ`0V6|n3~\1y`-K@`0A($j2dd`0 F;)xܯUHLڟ2vy,]rsKKJSRZ*G)mhh1rԖMk`0Z1C)%^z3ez׷C sv3R%Z!t~[UUv3 ѣ_~%KomtիV⋍\cŲ~ժ^. (,,LKKkhh ¢&N 펻Jʦ\x7'GfK_{_9~ . 5eƬN`:q} b; 7})5553\fp(-+Ey="mN-Z(j8~^4gG np$-[g]<#Fr5ǎhs->jܶ/zQXXʡҮe0-3'`ПM'W իVzիVG oP[o}ƍB߾;͟-S?+nNl O%3g>ߟ<9.Ytؘ1UUUeee4- tt:#N?iǟ 9zgII#G.DtCG),,U˫|x.^t~א_˫S0dʏ?92uƬ'8y_Wr>L޼eŗ2b L1%bWpwEK\sϷe񓦖yblݶ}1xŗuٷMv&$RV^d5#N5n74 ÆnٲMkͺ/ٺFe-2W.ʥ|_Qҫ|cgDfDZ:kjk^ߐ'_~{!D9fg\<1.2}4c?u{ k~X1 }`ȊrTU`ꌍ7ŗG:cko;t@vVoE z''N6n'NFw>SrZx!y> ҫ>Ւ$|>[__z@Ӵ?̰`.9ч{ej̝3~ϞeZZy{K)ݹ{O)ݵɓ&9^.҅>(ɲޝZ=iWZx_zYv_x/d5b6ntGذn͎/[?߸)T8ƮxY3/zΖt{٧Aն.9914Ow}MNS}6+݊bbG ccOnyZgYnsTf̘џ|?ԯ_mۿlkNmql쬬^={\zŒ>YU[[kXL&m`h;뮹_n?$6:nѣ/9if9A ?x-]^{w߿m6:tnMa-2ru]|1f0vPJN_|k}>6XhhF쥔b fnvbZVnOJJl6-)) c*j# L`Z/ؖ~55yҤ_|=\hG}|EmFmbذÞ4q7W\3?x-}re~;Kl޺U$ؼy h|wg^4Ϸ[ʮvq{ԭͽ17Z!=~c|5Wo޺bBGL7m|^oq*Y3s8{'{}'OUUoϜ9#<%;5r#0dK"!xr`0ٛ?_444Ys q5xlc>INN4tD}&# GiZZZ6> .hN׷C`l}!aA <Ѓ14hLAh)~}]ּQTj2DQB` |Fh4UGHMMݷtߢ]`_qǫp[|ё5|m۶9[gKvflڱk 5.Cnju-(p]WϞ, 6쵿(y3T8b׷;YvݧSLnS65o/YQEQA3_z}j:%%E4mOJ:R1݂>XQuuOe&fM[< Jnq8aǗZ.;Ĥjзo|˚El+GNrJ(^jPJwXCtC*Y3/JMMM fYUU(u:qJIUHQTfgƈ18Icg3)&ܣ)&Wj393/l㦇|R,93/`Jwرjժ7x㥗^z'/_裏>>+믿K`XlhH)~ᴷ}R tgϖĮ.K_>߸dMĬykG?4qB}jͤy8nڔ)ZY}[$Uz졪Ȳ(%͝;قys)Xz@!C @1wC-M|6|ojI75M -iޮIMM%gmҵetJǟjh!yRJUU}͙=3(tt\0ѣ@ {wF+^wyp#y>#lᚴSg (?1|!v.cZGʏ([mg?p0ѹϷ-ݻ~_o߬VKFFZ#3#cҕ}ܒc]Ph/BhݧQJ7m2|[d0TCkDUUUz_o=!8uڔݣ:mJK-;fje;&B?[\X^QN)PJ0gAUU5M/N MMZZer&N!\pA׮woY {C G\cF>\~3g#; IDATg_xqz Ñzu\0mFeܵ-YO aÆd!w6it( 0I+ZGQS.I 23[1|ذQy轫>]-xe/Cq׽W<9o=?f7-슜k^ڊB=cj{{)҉?VVUE듰t;ztD3~%C<͘޿_?`O<x) bhG ֺ)oӭWD4 2gVF9TCA^x?߭&KxtM =r!4h5<0b绲j]PxJ)TUSZd0Ј*2\_ÏF陟+bZ'LXUJ(jyebKII1L|i@RVf&sCwӯo_\mE*ϘuGϷ" F (ǎ/Yz{mO>Lo.0xx7W}"~ 1+vMb0 Փ&O6lnan;99y1 lp50*a?ujӦ-W\~V`\s/z]شy˰CϷ:  f̜?*r>[~ v]T~ַ_?} +8 ۷m>d@K:xX?Xbsf:ߺϘ=#[#OA=ٳC?&EESg*:ݾa0ly_4+-=# Z@m]c'ExyB"+,DaIII`0 Xlqy#>Geg)`0 hv*`0 uϧz1SYRћP-TG\93cbɆ'Ϟ/Bg2A4YSi#5e՗RE(=ݸGhri$G}~bt>P 5XxB`oSH620[Eΰi-U;O~^qrud#ÆgLO35TT6>V*k*Rg]“ltC [% JKHpCzX -^o6)iԠ[GjMcf (BPBYR_ P$P:9AqWPw)kj=>aмͳfϞ6~|G:woeii;vlMM$IF_b1ke6U6̇Kj9gO2zyIERO_SN>|6fTpc,Y+rәWTi'vw |-u%dqieU2sNUȣvQ蕄hS=;Eh>gqX Y,;E$+IOq+ uO?#>sW ݻdSJJ|gVȃI#wK=JarSmF3 B 9B2ӭ-akǀ7{ =uYOξ>ˀd5,0 !BA@J *UT5PL+rVuuGQȊJ&7 R'!5䪺`q^64K1(#ߟ7jp|G?lب1cF㫯ּ.B(~(4,KQ: qا" 4jL^힣xQ=)tژ>嫊g-sM&+_v>?%]e%/5y)ׄ H"H(`2纋+%Tsb@FNdzi'kNUmU~%t"W*]W T 2I UBCp b#݉@R?@Y 5Κ4(&D ;p2PUWU*"zvAxoe8,Gcg65[Ǝ+Rzh0(d6Fc}}}L%gKUUeY4&N$].23R~-* 9Y R[iE~Ü4 'MR^|6f  (JO?AkvNz54ԿXV IH,fKnP ܼch=J=su T`IqP3~̜s,ϓhV5ͫf`  Fa ~i(_؜TMv+`讕ŽO*+w%9םYs3(oZ̳YFt1UUB^] +TyDcWEUU>SѼFp@! i:AΛlNxNV/}מ?2xe٤-'Vv99vȲjiffX }]gP+óT4B|~'j2jݞۑ qE_=[곘dh1$Lx\~W6V[NMMm\HI۽Xz%~o۰=?~a_%e0~$)BP09=EPɖo滧K }=RUjWyRqӠɠ(*hL0S۲ .kV6X4=0 I I'inûmz! ɚ\5ygKy畼q`hTѐ ԴҳfSb$JAI= rJ)&UFQSl5 i&#/2u!W}w矟8rD$HJByGz(G 0U r>NZ+>#Ǵ^mLfgc, QQ(4ڸЊPJ(P BaԶ%ej\(',K F>j21Ɍ5< Dl&feN38{N__[ٺ }#˱,2^~9Z6lJBg%)1t+DVhP!~RYjf{p~d6Nw'1J xK]]sBnjɲa " c4˻w>tБ3>\U QTw96'_(@+OwJcs} BȜMOR&xrI뫺>%>S<҂ҳ=u7Hs4:)ٿ/3Y Z%)W5N)y5}N)8Q< 1GzVͯP3~n MUeY6 JE`wPS >68JqژaLn*Uˡv N=BOAx}6[ 61f3c@TE TUCo5'j5V(  G (шFR+8D8^o#F?nJBPaQUNg~`@Ekn(1loUqB) 1 Bx_y&& <(xEU  qjljF{_kp˵N'xM "PZU[[jNNNnnlϷ턐n]l 8}5,@mmilWCQUq/?W[Ɛk#˲ M1'7n[n}ݷ k}zKm<{Š{߃Z}{4y66V˯b0窋L$jUe;GFRzZ~)Za^ Prrbz*tc~>S<]2 ؒ]'Ok[VeL[Tdw߀f>XzlFUw'-=͐׭`#dW}KrPL3B ZIF񵥨`I %HUr F(r>;9xwu?.7?z 999UU UZXXF ~0D TBM4ÀZ&9^./sm_^/H|1 ;wBIJ++ڷ/U-~4DQX&[Ȉ@T^<J @VjA ,!`ʹ355}pnS]Qsb/i:Q p$)P_XWjR*%J4 5'ES iG 7x:iC wMӌFcvvvVVV߾} 7 n]eU޾v)oq4MU{nE*0$)¯ Z9!C>_]o~^xN:d2wݳr 5vNon} g~iS'Oqod|Xӧ}nuuu7cǎ p^|=‹-7wc_~syںGzhuUU+}%C!35+}xEpС˻J$jAr@ $^/KaoC+6?`y?c91N{WWVs<<9CGDl z ]HO UWT:22L-}C򮽺fJ0knx Pr8\ y1E>HkOVA#^y rUSmGsC)~8[ U@(%f@VdIP0` (z/+*>JUSX~{s59Pt^۔Yt8 8*K?ss@N ',v J2  @ ~x@=QW>[zёeoSp{З;K"rTX071ںҐf&t :a1Cu5~2T.M2c1PARU R hPR/-vUUTi*q`$*) i2O0(ݞԔ8]Z#39I6޽{kvY՚QyEnFJg   `9%Ie'=S@hN65`Au+o2p]w3}/Y3/}؍B -]DQq &rd.)q6gq~JW^j0frRD"PKzn__cj昜:]!{I,p$C R,`HxP: +8bXkN(ލ[iӖjEvcD#nz8yؐ?Y>P^ (QuĐh}2&`wVZ<ŊϞ0xxR6I$j5.[chCKY[KIQX>t(!ׅ9rOP$G|xasyB59 0E*+ Bȵ J )WUVU|=rՉ1Ub 4)I:c*=XE HFtܢӲ-J8`UPUSCd33MM4g(Y"7|o@81tP(&O!U,?nW fe=iYy%ɈqI%8-c_|u㦏5&8d@xH6O2ŀԡ,L,jEŹjM#+.MU\Wx_~}:S0"`ʣ@5U}eFK?>fPs~k`0~<Ϸ^v ѿ`.%(2=c^3A*| 'Om*RӲW*{fHQtה!ɉ\/=n);5``cJ*)a@|KNbMJ***$Y1 a(3 ҵ8o7Q" @KrI~ufvHW4..K_7O78OIN1TiT5J)G@JOJtJ(39wqRT;{_,r," `G<0$F^1#F_h $bhP#r"13gzzcwzwvWu=yj1qǴWEIvXRݓ'UҕJW]D!C[f56ENDŽC?y[CCzxDpړGښ[=榖|Q<΍r( _|tjopI7p[2` G ri G6{3^?;rپxb00rHًvseh&br5 ]mi _`#\iiuVpCM 9*R_ߟrE{ Z97j' C -m A`_H#RqLhO/WMEe%Z9jXInOdmGO9"JNn$v-#dYV_577(*w(8y!dp%RQz[,0E4Gk׏]S( '#{,=Ff͝suG0jx ]j1Adn5-agnפ3?cUU׷\{[e qq|aS?w׊Ҧ;"ĭ۰i3)>ڻg̙0.U7WLm!++f9zcS#JoK{С];wؾ԰c #ApPdKdK;,>H^ˍ)P_s2;XF. @?W"\fs7z&8 Γ Q5'n<{aq$9=ng^ȇuvABȐA#),,jkkA8QD'K9pT~^^Y<}Իݜ4}eatzߏL+nmN8$<'z3ݢ"F1o$[oKg@6|Iu+Mv+_ϧ` tڽ/JJ2nYY(N47Y~8N;UWU>Vtq8~3ZfXt|–{^vغk%y_suM~ߗ}1Ιt#I]UspI{^oۑCz~ҩgWٳu?=fTŘ}\. U5OK%[e—qޕyQC=mү{ż;Ya?JuU_sR)vՙzR8Tu qPSk=~􁟮O d۳r_^Ahiiy^DJNHiMkfuM}^нgG&N.v8 9Hw=.5,PFA!r 9S[W|)e(P em3G8>˃ihl8MoV]>Pz~<'71p`An+F,LOr:2( ~؉|:ΙFdF=㛣_!N32}UӮ?Z FS8z?A~F׆gϙMb~+$J~9i6J/9 GwW[VVhѢ (-püy l޼ ^{uyСOܜBܜ8Qu @]}}%[veweNvvkۺt2<+@P]tZx>}un֘V>M-9*:D7.S( YXݜ3BuUqA [?U}N` зVxa~i抋NClܳW/EJ[Z;#oOyyiD%϶-x(MMM۾)@;Q|^o}c ok@8B9݋36pUޭn)HZѫA%8Z֝=iVaWֳǨVwdV[H߰_/)1>p#yi%k>z>-Ƙ;ĿŖ[1W_11c5їsDZ M-57,Ogٳz'u>7664 Hq:yy=JJe7h}/V:Kwp8]Soo}Κu׏^o͚VZǟ0~OK*قpl[V<{22?qVOV_)}޶3ϜPXP]{z:"Gp<8gs:JkQOTlanοH9䒌˄-+[1Zrbg]mmgR/gߟ}e.i-[&N4}!N|<ω"DQ;Iˠ~}}0 AEEɰϑZHμи{e`tW"xc~bQޕ&Օ5t>O%uͪ5loWL4*PᐽP'O9szW 5oYyNdɉC3󢎌}J8Oh~@zz]A @=隫{Xo޻wǎ8tp޽y9D;)g.]@"@H YN{33! al)?0~YvC{4ygU=f;x9 }5o;ЍwaS" s(>[WojT$sfer}ts[MNMl7:ҭJoͿ_B?D}'s Hjgە-N!wkl=Mmmm y=^]C9ك<Ѻc4]sUIݻwuQTX%BZZZ g;';{݊㸌쬌D٣M疷n9~8x-w@)Nwe7Wѯ9ڼ]E՘#o]pǾY[o9('ьl;Ϋ'.1m=Dܤ:A,X+ &'s  ڗ ("[- Q'q?%4 \ bDSO8>J*N -~ ]9jm+nj@oV}&V߶kfk9jD"V<IzJB2,<š^}Э_yl` ޣ㉧!$Sv8YYYRv&Bzb^++m1 @F_pܞn+?vLҞmeӞM-Oʲ4}ogtۿwネk?r>H[jyi:$pbá%'D+Cƒw#!V @Ss YJE5+;; ]r)pOi<׃#n.B|"ZD.H p?99"(ӷ;@(ٺ+c!֥CMF=~%k%A?IS2a)KK-' g@oYiN8ŕ=;vL[陮(Չl<ޗAq8[;Nw;|oC\[O.)O Jrz}MrDb4 iLR/NNBO4Jq4(?-DN>7&hPs3M窫.Uwg[IsG+խ U7z&M?1\eu 8 ,1`m7{6lG JS\u@Cvݸy뤊ѪG9N)hB =bH+ZQ8 L"!G|BUJ+ D#T]A)'R:_lc$ ]itWVW0޺ܴԢ礊)b0 ]8ԹVм>F EoJU5>۲uREh( Bh7֔<@p 9i_t\/lӝ+4? _E歏Fo}VH2]j/w[\+յ3U !P1cD~Uhd`0"U I#Yk~q0%"ǘbEAa2sJy'fR8B4g8>3mh ~Qpqm׊f m~Ar4z}89$_s$ˇZo^| "4uLRTܘ:wNumQ LЫֵ6Eyyo4ߪ V #2\ 0x>KޝwA+;~RUu~kʴK\1쳥`SKKNVia5[&r-[9z B:@9)Պ88C=ih}*2le|we<&ۺt8&̷¤ W];\?ݻG}{?;s>:xىսGՉO{k҇%:3F3: ֵ9x^ A\qޕ ~x91#qaÇv]N[6lحw";'[YRG+ٲ,'etM=eIliwɷ-2%GwV¤ 8zmw&va/7&ۄ0fOצsmW SCȮw&vke_J=<# [w;,ٶ0 FشkBH{[LhW:`0T%tn0 ``0 0b0 HLZ1 `$ 7׬]Z7xE,6th[fNS>!7\8r+=v˜3ͷ666V?lg)f )7|򩧧L1x舿&l߱sgL|ƄgVٰo|K*G뇏8+|[6g?bISϞyޖ\N#y{%?qG"g3ϙ)}^fÏ,]v93)O?}ʇYOu3 DV ;v~}ʕv3'_DQ\?i~Uթ ׽?oO?%}^cs@ ~G\yM?xRsfxl]%I]];`?x{Qh~;i/?\aE ?P\ZE %L<9e6n$ `,tLծTKӵ#;;[[açexzn/WP>||S _)8c#GZWͽBYt3WiiikW_9s9s=/=TF:Zf  `0]=u|M۶l6/?jLŘ&ԹVG|_/J^ZY]]]XPz444|O=W_|WMJz<Z^?b̟^Yo7_4[BGeGq1x~?r%z5.n7}@k+|>  AzpĂ |30+| |́χ4ӰdV9-xY̙][zq Ԙ{QʕaOP^}tٳ1m^z Ng`T`0]IWm۲yM&IcC,y>W^}2233O;녗@?.{eօ$m^4p W3 f?6o{.sQh p5wǘŋ;rw^ .ۍqYq8xN:nXT I0kf{y]2$d!kxI|Dy92Qixih CW²ef{X[b@ b'T;x+ܳ3Œ~B~)>-VH):e{x3'էOZG/|n<]SOϹ< ƌտ_񓦺].;n6{/~JQGF믝1QL2EFӦLXsk$]%E/>Ǩ;uV9(]Cѣ*+vYg}$=S7jԐJ<8\X~>V2|@uD,^eJJ;&IHKiWj+ak"m5k%)ˑb0 @6}iIlzYբY.nZf#GZY)_YYYZZj݌>4ejXU ~)Sd ӧQX#G=qv]oġC aga =T8o7/oOWg֙7_ 鎮mq㍸3/=Q Fŵ+`NSO%ȾNŵFQ=M`UVH?u<&!h3'tr`0!;dTU `0:df-n?& щ!$4F&Ó%/*^I+`t&'1Zgk2X=Q;:-ѥ1FT1"TRZ%C2AZ[u RI+(ɥX;78ihG"TV"=0iWp*IBcggi,Y&w%u2ЧfĚ5F F"YZ*bsLc1TMZوyp #v LqiW㏣6?Á)M%ҥ_ &gMK4CʹRkMGϦg0]H$$CvܹcSGW0hPvN\ [%[vG#e LKE2Űvoޱs?tYg-կznݫ9y#GU1w~.^[͗q^yT=mү{_a?NbB88{+-++[h?Azz|aU'O>RD ()+M@DQu"pNJ8J9QKSg#86V{`t#xbQ^&Օ5t_;K|YF]Wܞ.~Hd)J2G@@!=7qZŗ[ *?J 6~}vWPqNpqHiJ=q\P\ݽo ׯUzAW !VtIM-둊x̏HσHsmx𷄤bϋ( HPmh^H;A)Jo rJ' C((} -ppBpNPq>8(ѩW/Q`^ȼT@{|@e! ׭nҜa7D~X}{%㕿 8LZًTRDoh؎8"Ūԏ~BT&B8< ~ ~C.DDQEޑBr"< {J%>J T҈@N~@ < )@ppPJ́ §74/^ᣆ+7EVY @6yf<TOwh^G{롽]*+\[];DU2yhP1-)ߪF%Rꍓv"uIiHdzd^wB)"F^_|+ =S#G3%84Lw>z J !n'rJ x\NBHOh!Nv@]H3q9Z|H{hW*&v(@2\DjpBEZ|V;7O}>;p+.r.SQW;^]=Y(F0RYK%$帘88{ŗV;# W\1w < :oreZzsvҳ%'+zK@ٍTXf Hdnv}t==()9Man.ӭ %v2+<_.r0 Kb3 +*v_sow~^py5j#G/>SZ!C䯳{I'jO\D*}^ңÏ8N]]KuRMKaCscXau? v]ɖcr[Ilɖ]jޭ.-# rO`l1H&8#WyvM6}ʴDTɖlɖ]mRsRɤRc1d,`BlphN+e%b8">V FbCŸQ,SQu%LcGd`0ž:gӒR*1}7Y0\h þæOLc%& F%K)J+D"iacvyb0]].t 0i`0:=]?dr%d~.]^f06]l#R;=ht?r% ,:5LZ1 S{'q%6QJ:F[]co XI+a{'YpeFt.@:1A4V<0i`0L'ۈNvv:6i`Ҋ`RTO.뤔VǕ1HƲV Ô. /$EF?ذ`~,¤0'w6$ :i{g~,Ƶb0c*rH>Mۏ 1doQбư0i`0I> )h[uDGxGț{cleXRaKI+4D(7IlxT+kQxyZd>>t$+`Ҋ`$1WWѢTyZdzLb7k㵏%HΓKAŤHlϵMBUN&BÏ;{C`ɡ%a1h."Z/* E~muZsqǒ.V þHJ"nV]it%e"Apk}8X`Ҋ`tz|PIDGq>ftRXHr*ؗi1]Ⲓ߻},͌I"k`0Hn=ɠ1Ϟpn[0i`0I>@|cBG2cβ.m8``+m+cR& FҐ 5/D7Q٠]z$cTZj>>0:& FrS,ʦ@*(]lx_ [i㵏%`:ai #UU?Njz/啺b(d϶:-ɂyR^Qɝwݣ\ӳOAt^vMiI;_k& -Vr[S͝p@vT4cY)Wds蟴Ch4lsZ`>t1* NϖƌZY*+DQ8 _Ϸ7\dH9N1*ǃJ>@v3'$-Uz[0Q.>_},bب?!~T]wwРeeeRFy2mƐ'zzʴoJkjc'8ͷޖj{߃d9:kF03z󭍍v?hQg=so+TАrƝ9y׮ݒVeF-̾~)ѵg?bISϞyޖ| S|r3yq0CGB>*Fb+nm㳱%1&ce^UUrr7_K~~۰~SyT?ҫWϭx筕-xcΜ0Uo;VٺM_nyncO(>ؒ?Z,ݧL]]}~}㫮'M,ٰ~oO>t~ن^zj:U]_Yޗ?y{_HauK&ş]c=Z=.9>>ftR'_OG,)WP>||Sk~8 JJu>hhhg8׬]'Ft3͒SRz/0s6ojbUsPY+kU۝?v=xr ՕVW]T@=m,3ʺ `JII]3ƕt-3¤UԔ>{7K: rx>(78e)?tN<-ϯwrJu2x<<OSSek%t+qig_F<9 0 IDATJI1(Hte (-} bouӊ'V3caL4uҟehW翵}T/^1ՅVnwMM>|挌Ƭ,7jlŘ?=o-_}n<0JCK ٳ(%[r\^4BN>HÇ&cjcc a^X˽޻~$01hA~/W osfhkk/9xrkffige̺|ykaAA޽׬;}B|f؊1JWN/Vmڼe׶\ѣG11#򷀑J(0V]Vӭ$IW V>¤U̻Lsvv‹.9G5E|kwŸ&UPPاwoUn-[+M>]N瑣G&N7gTʌeenv]e1J"Y_V1)V)Di,ȰR-:'KcʻC*ht& FrS"DOtic R:^bt+ϒ+nluu1a0i`0lMmϵ>cSWLSH&0i`0:=ڎ3$:H8罉*J #ď}.NX`3 ˪@= mt1b0FLdV!WE06Rhs/}6 B땇D=kD{\l2VtRb0A^zy'HZ9Şo %ȸ$oIo SKb1,82[]۶2¤H )#H=g<7*E%s92=uhu=7nPABdp4QEAx.c[20i`0y[:QQk\`F  ]ubh෤}gO2teɺJ^JIR* OY`ig[muä]!Au*'r {\ss9ś$L])6Sƨ4XJBAU6=%6I+H0u唒E%1àqQW vXEjPB[*G>j>& #v#|kީkao+n w(]SFjBP]Yj40zUVQ֎TFIlZX#/![yleLaҊ`0,I`:Jf^o- EɊH?!2w\!ҮpY0WVD]PDiZ+e+)c+cV av6ԙIڜUrהu!a*1A#{=Se]%!L.49Q{oF0 +, ,{\b0$bC$~ڻg2K*' U׾TTWU  %YqPn8Jw(D4QT* LW%& F2T[@96Vvhp(^_`:؁e*$P@ SonV/ПLW ga>EWiQVny#Ov&USSSM`ĂI D"ksu-*vuZH]}.3,(U!̤|e[Rf2͙W4Ayqed8˺b(5=krҪiɶ fU٧ $t c& ) HTB$RTF:Tc23ͧfCǕ @$sz auJYpk&z>.]ߕ上A] y֝o0Librҵ|K܀ԕWu]B1l*J05U^*7~{4&]ԒV6lX a°apv at41tI0 M7%X@E]Y Bak{d1 WBW)wˢ2*ŒP95#=ev"tXUv!"W2dDZRQ)?⸊8Ci4߸ `EWPWJ2Xi)ѼgGI+uգ L8fQle2*%)RUaAuLJSQ0FKPJED0j)H*bez`ZzSoRVo XwaҊ`$ ]]R` #ֵvs4t3=I$jψ8`Dv%U@}]en%~*OK0/M+̽u4v<#&p6 |cǎ-++3f̦M \s̀h?T<$g !$2+h4)1J4 Luz+]W=>}]UdazE!O_>: &PW-x Ih J.@,c椴׊RzUW-[~饗n&I]={z{od` Rυ'T+qQ @;*T3zD7J뻊|2Gp.*-Q +Qc^+SO}LwI_vo+V$LaXRW-#j㩒K+qd2!VN/>ƍpɚAI {`0atDrV)ՕF4Mx1:F)!W-z{$U0]r\!we%iTOa"&WIh=U2F5XʒHii%_<k֬t:IOOg0ZTɎ`Rj#2]UX9,hV:Vz ST;{Vy`}d쫄 $† ʿo#F~233m#HaJ Y,IK)w}{X:dPi#Qh`(*V$W? tPiE/}+UmEi baNKoꫯ^rĉ5EEEEEE{>|8ofȑIHu:0U~[=M`\tTaȎ+Lv~ЈhuѝGZ#$]`Xur5re*- bRʼ`#Ug*+-ZCIWzCUoT(5mzJMJK|''O/)Y~}n/^ӟt]wusM F"?t$ɢU?Ui,4tue7O`W&W+אad‚f+LU=!j}ebeU ҍVWjcn{ Ҫo߾QFFk0vŤUQ*-Bs`BQw(>S%jb4)~*e}cAYLzDST2"]e-JTUJbJBJK+5{Q%m.Mqg&! )UfrY %eWJ$)EQ,ge0嘠VJJ)*Y+] eGvU@SzTZhA,SWäXҪT JXX(L])s <W!ԳznU"" fQ裪kO=W3#iN"En;M%,( LM^MJj_PU0i`0:=v!Q%p^O - _}ki 0=- } ,2 녪*BcOOTYV21[1A3H%J**HXϲRe)O1^V þUrߦ|KvV +-@K$Qi2U$<C1A+8g(>hBLʹtW_CԺ*,+ 4n-u۲ЍW5UjQJhFnKBIa,+weQ %y1*-ܦvYI$沊Ht+5RH4iQz$DJ /BˡUI&,+!j͵']& ݉@#$L*L}aPR$ % ,Ƞ6ee[ \o}YÄ&dTOXq\En EŨhs @Q̙*h]2, a辣tU6V6,ن0b//??myɶaw QVgr'+IHTXWYUJ bB XQ%Z .2 Teژ4=K$[9":#PTGyzJ+^Mf.*eާzGUVWAK)HjInfO!X6㼂n͍6a;R}MUJYQTN5zaPB(BjUHNIA‚V̲b.3D4 %liRUJzH]}UW,+(ӒLt %Z ;dˆH tU P*IT=qDAdf(?eXG+PKUFiX^1WWzL_XKl,xMҭvTW*y5][/ӄr_VN^YAuWJ+K"X`tQF`*9̠7a?#b4zK7xsxr2* 짍‚I r0/ay,+v%QneoUt 8zd\7D \n@@#jǾgF]8]4M%V f0opjg*sPHVn(q8љYF+#Gy7S]I +I pK% sMЮX"$G󚡵\nJ>̙L|\wbUqFrU6:s߹H8PWSD=T괖[oSL \]QqДK=7_)l[a'k] kA܊SeӕEw5[2ZQp(“w YʗՇŽTsd<[Z\?߲ЕCV\*KWrUidJkdΠE# qd$t+<]Xʒfw`"*ҕk{k블\qE15,Tz:WRMU^Ԝ̮\YzvnҼkRҤۍCTVErVDLu[1x޳Us]扶W +D8 YW?gpF)K5R+2S5dczX5mz߉q4骙~oU-]6u}vT,e:ϒfrd:RM.w| QT._r\j=p%QD FFab^d,*V<}F+"N!/RjjVsJzҌu+}M,Up!+t@ӳ0Q)3D8,{R7Bu0ZQ,>G݇>9ÓzJxG%`i/%/Q0R+gTe/zZ$6*ܹ*9THpKa6cyѸa"jL8I֪e@;R,;)_i)WW 񞞪iʊ2ėT5J$67ru\*|)ziy\0ZQu⚥XH늈oћW UЗGr|k1^߮,k^|MCTXj%Uk*ndf^unΥzF+"NW22 ߧ[aKIZU(JY pb1ey0iQ9и1} Xs6cʔ_귒%XޭX1ZQ a0cY>'AP !uҕ,urLPeo]\iiK@48mJdsUvsU/apKƱjab"F.4Ny,8+ dN V N I k=4Q#++:Tn**P*![?8VmL00l [ZŻԽA>~ܻG9Xp%1ײ|殣ڻ,DoBtrDU-OrW U>> {\|}Dc"No2O.YB3_9&)|{af$];NX}YPNzѾ9F+ʨsLvk4nZcr@K"|+j|<e$IjC HO/ec/WE҉'tG_ɁI8XnbZkM']%^ҧU~#/߀Y8F+H'9jEwaH׽Ŋ+J!&#-ᒮ F1as2EWVvmCƳ@_rkEDD\;ⲜW~uZѡb`Tr;teۙ>ǼK~mvW5e$Is~9reBVWX: V?׹kMUD(:±NǪkUDG`,]y\<@2IF,'iW;oRVjp8BBBW;?NkF"KB_lag @JBS`RG1;U>h8yٳg Cq廫%I:x(/ug3KHj3ڽyb|y?vެEwVʍiT~1;+Wӹ[;ݜO'/ɧ-vUb~=v~C67wLMKx} "Fmv̖gvʆ$I~JΙV:"Uo+ |5lB&`n(͗b-GV4_׭9N9ӵkp |sWg}ofzyn]>}aÆ_>gxep mОݻ=1.S^8fs^g~]Y}ؓ#:qwvWhhKSkO F'%ǏCr'$7t JW\BP(F6aIZϵ:Bī[)VQ^?$IM6g| I*++s=rc1h`$Iڴ)-+p?3g\{[|do%IZaiKtk[;.IRAAK'W}…Ͽ&iC6^Qe޽G 3&6gⓀBGE14撨\w,inU~ss,#xKfϟ?2hphh(/ޡ}{I #Ou ;卤n);.n]pN:r חk>wkEGGF+"*{λǰf͌+X{˖+E^l]Y:ZuV1yYyyݚ_/^L>uwǟ|Gޒ$EFF^..q@ny5 v4hٳh ߙD~)@=!\nѡrffWb]n޻{ߕ2K4kevqGllce1.W0y} "I.y_xM15^ܨCϔR/Yʭ7[e$KnGf 6x{2$nOs{4j9k+f"wcMKV^8#M4Y[wsK2s]+\Mu ߧ[1Dc?1YaPҩ H0FPn4:7 jf;9Y /ZъJ8hQMt^,)Q=?miDiA_Rw˜U-0ZYaw +}$\q,oBvY>#DqE1KUGV;J]L+XXjV™d/wHev{Y-Ve`d?I1|8?7MNUq}/]v!~Íw ՌHk.w2'>cVaw}`wwl\\ "=Z_*t Uv:^Mˮ||fsUmheظԴaWE?*{K "s,M+0 `c8D1ZY჈&\+l8Yʯ'*2ъӿp~j |FXU/.E1ZNrc@3)T?RhEDT܆,L^\u.DYъLx;sg&(0 CSL9T1Z똓Q%#͈j6F+""xQniL8Cˋ8׊F+""EZqVDDd0D5^H """9Hφ ]Ue8FEy駳]U`Ңڊъ49sȑ#<@ 5iVDŋuԩ[n !"6HSdddYYYiii !"6HS\\\\\B F+"d̙O"jъ 80???UU;8qf`BDT=pԊ<7ovDDiѢŮ]]QhEDDDdF+""""0ZYъ2VDDDDa"""" e,hEDDDdF+""""0ZYъ2VDnv DD?nVDv DD?nVD䙣*Zٮp[hdEKem~Twνhx?UZ1ZgF ?6M5["b$Z{!/]Y^ה,g0X,[u c͵?F,jv}ʟ^lQA\nTa'fk3l15Bnm޲>3;?'[RUK> \wSƏP3hp~L=Rk\qs㍬5o 2ZgvOVsµ~8j„%;AsYZi9vp8~zzޫBkEDuuزu]E=d@U&ZF{6RwK>lsGTͦh=%^ 6F(Egْ罊Lq]+$"pȇyċa{u=ꞍĻO//*ǧεee0<>f6jj&#qF+"L3槟9}מWpU\X_;>n>OQpTY'(Gi9 frҡ\@$ 銍h捈</ƤIx]a$&5hFVSh=IPT'0hNɓ ?k>11xsu#F୷ԩ8xmۢvؼjnMLp4T{i^f0s&~ `qKQ:ѣHK/sapCw$޽л7AD!:r͛c wjogN"Z);O"ص:x:TD+-?Npb@j.]7aԫR7ogoj+WHMϻε"JBa:v j)5x!*"OQ s'|ҥq F_R F+"v `5Rh(vDU O?GDT1Z?GDT1Z/JDF+"ѣh>۵Q곶xS-Ztgj4F+"s8|ҿS 7`wsfu܎wFlbA?Dъ8,X.=Csx!4oVb#>} ! x]x5hVp[ۑ$&9yߏѢ{ EE8xBhWkz8n/#) IIxu>;Fb"7GVV?|3k:كѪz.lސV',Iu V K"H#%v1۱r%RS`X\=5 1X1` 0v,v?y3b>0ɐ!fa~`DGݺس3f`Z[Nۇ}z} o_ߏ¬YΛϔ", }W^ /8[fd - ?^΅}jސV',8aIDT9Ġwo\ |z?b_W]", x-:u?[ ۱t)JKQVfֆA֢~ߨ˱?vrK"HF7*N*9 !m"6"rINFl,ZB֘<IHJB(-uZڻ.En.XLdX 6mШ{ιx˖a&lnK#:cinЧqZ 7$,A K< `t[oE6^Q-`q_k h[2-UȼӞyn|yYaw8^GXbEjڰ_|OpԊx""/-ZoC/QL[2Y3YQ[{FM] U80=G"" A""""0ZYъ2Vdѣh߾o{ѢOav*7v,nIIzIxG#!y7$Iﻢ7PqeC7Am}ꖗ.!/z#Oɓ7'O"6˒CNx1S))`oC" GjN?^uQ^={б#ZBbb-y}?AB8xBhWݎ$aK6 >;7+݋AZpmxyothL֭ѪphYY-7e絪_]~uNyshCQ-X._ =Csx!4oVb'kE j[oŷFƟIBHJ½$ܐԢ#,|y |#iԻi|TdېWvDUogNϋ*=IKH$:%I{H[K$%$Iҿ\"I7H\#/sɁRXXEĊ""*(l٬;$IWW?|Xj!Po($DZ^ 6m6u.٤ %IL|Psuӧ8/4[ ;y]҄ $IҀCw!e\$I.ItԨ;{V N$IZ^z Ex@%imHl i _R Lz7MnlmHDΘ*Kˊ/~ይ?|C';c'5UUk2E0A:xPVVzH$T*-$Ig^=g$@ڷbrd).v+-OeI۽7]Pn]i~gr充$I|#]w….H!!ҥK/] F+a.H6o΅۶I-Zhfϖ$Iڲ"6n,#8s;^[WzU n$!#VֆϦp8[X7}=SRކDk60xB&JJظO=>h֮EhSqmaahժRu "BBpmKEԩ~ԯ4U+9p!$gO\ }]w/:whj##QVRԩgY Ũ[/:3q11(+CQsʱcW;>cb`ygo_ ~ڵS7h½=zYYxQ:YLq+ HxCC5_nF0#K ې&/ [ncd]ZD8qв%oG(.FYacR/[C\svʕ~/F+e`Ftbnݨ(쉅  ?:5ׯR= Ι3* w݅s""п?23ѱ#5s.>&cp9"^7' u"9zu/>nHGƒlAb0Zϑq:oC"2?Qgp]F誫]w$%qc6mЭAb"nD&!) {yfJy6OS'$&V:V^S,:u|9MLZ}.[Mв%uK/sg͖>mڠQ#<^>,]\$$ ) 4Ig̜m[$'#6ZukLŋ|ˆ{A/x1M=2mHDrBx[ߪܞp8}/+*.KD5_߆D5ȼӞyn|yYaߵsAmp\"5m'5ZL Ӧa&tjj% | bĈ:>޵2/$I6^10O5SQQѐ!Cׯry/_6lXÆ ׯ^\\ fܹs˖-6MEEE W^TTTZZZyy>z$]z 5n+5l[1))i֬YLOO{n۶mKNN֭KJJtvS&Ml]>3-RQm6ԩSz衈i{'|222m۶V$""1ZLǏ_|yϟzc4iŋfϞhѢSХKl1W_}wߝ7oСC,Yrʔ9vؠAdff:uop¹m 4'@ /=ݎ;j-ܷo͛ ?~xn}ƍʎ!G)!!3 7nܸi&ϵk׶mvĉ{7oVjIDD>n"ots6mop-;v,???>>>66VںuW_ݵkW%>|m۶wܹ)Sƍww{&L>}ѣG㯽&M| \:g̘.7f̘uI$Mgn;%l)< +j=:J'OlǏ?YRRbxl^|922O>6l0UzuaK(8,F7J njӧOkN~gNjӦW^:;_t8>5kJJJݻ:ydxx򪫮vܹ[v$$\p86m4>I [? B$?HNN8;ԫk$""1ZL78{{󏞷z+""bG駟=z455U^lٲ%KOF5jh:wؑѡC[,3g΂ :ԣG+VOO["ZɄG iP>OS%ҒL\]dŋsss//|EgDGGݻ>O3())Nlߟ>}W^ӦM _*LIIٻwoNNNAAAFF˕6l(oW:q8p/ܷo—^zw?ömRRR!5i)< 7tӮ]֭[7y䰰= %ϑKI>ODDZ8jU3͘1… G/>}zaa?`Ȑ!ӦMϜ9333;hԨ<5} &,X ,,lժU۷o߿~-ZԧOe_tKKK{ꕑPXX(2p@Gyp' lHK={vzzzZZZVV֚5k %MO5Kj;^>+//۷u[IqqpXvvv.]_U_nYo-,, 1"""vڥ^޺uCDDhE5Ν;Ǎ'Injr`:u*(pF9rȑ#]^ e,hEDDDdF+”)SnoꫯÇv62 :JT 71cƬ_~ٲe'Nhڴ/(jǎ׿#FС/x#?S8J$S)y∈ZLEEEC _~TTTJJ\|yذa 6_~zzzqq1Ͷs-[l6% 0^zQQQiii>hhh|oIdO=Tttt Feەƍf͚5ptw=ʝ^l۶-99[n˗/wr#z&Ml6[׮]yZD)[yl(}6mԩ=PDDDH/OFFFm_~1^–DD;Fi˗/7oW^=vX&MZxqVVٳ-Z4uTt钝-?ꫯ:t%KV\p8>C999ǎ4hSN}7.\8w\ ޯ^=z4y;vTuر9s(-۷y!CǏ?^k7[߸q#-DQJHH0cƌ7nڴICsڵm۶8q޽{͛g$յZx\{M6or-ǎϏnzW+l>\XXضmݻwwyʔ)ƍ;{ &L>ѣ^{m&M[4h:uΘ1#333111'''**ڵ?СCe3fݺu$ {ٺ[o–⺢c4ydyqӑ%%%Əfk߾}nn˗####ߏxIՅ-u &nnJOn׮8&&fϞ=N:զMya^tV;v쯿*p8"""|5k֔ݻw7tp~ysfffnZ$SOuOY*ǦMϟG5i0uaKDH}y=A9yUzuDD#Fq<gϞ?YcccOr[oEDD 0@#"##?ӣG SRR-[dɒ~iԨQ¸F-^XQg;222:tu֘y֭[DGG?~'̙`CcŊօ-$$$@~~Vo2QzTTI$""S8תfzsss,Yx 7|sѢEY'{LJJJ䁓-[OիWttiÕY))){)((X|RCÆ ʞ}Y1nܸ|?nV/R޽m۶(C8j:[7Rx@n]v[naa{ 2m4̙3333Fc]ӧO0aBJJʂ VZ}oѢE}Q^~K.?W^J L.' ~eW'N08u#-diiiYYYk֬Qz0xԛ 7u<ռ.Ik&""p{U4Z<<hEDDDf$"""w=IENDB`PKi#:1)-Pictures/10000000000003100000016C2FCFEA52.pngPNG  IHDRl9tIME 3tEXtSoftwareXPaint 2.7.8.1=bM IDATxwxLپ˲DR{.;vv}\S/\%9'_$nr\&ɶ;%{/]nZrybx ΋G/Zr^niΨb}-AǏofccccccc*2Xp>z緾s> i{+A*t Bs>>C;C;C;C;| 흊AznM(/OJ)V(Fn\Ce\ p@䠲 B#ءڡڡ;X)P 8hzM &m4"I'yxz{Jϗ L Hppc9P8J-t$I1qު=;sut?+ h<1YaFKZ?8ڡCKqqd$0cءaVT$'䕕jYVB tw_K&Wo./!)yͬۇ+S0-,#qͭc cY1>&+bXb#8a&8+@!`8-y&Ok0:ܟmn$OO1ar2Qt#12)*,>tbы! ^1{ZN,Z>bF+X1Іwܲ,suUW̞Yy\ӈ1>.+i2!0g 0GT:POE8`(Tn%dEUeٷugGT~ȑ1fY%p5 jkf[Zʹ`0pҀ0,De`*Ա0'̇",$Fz bc ,0@` 0<%Q %!$Uq 2XbBGS1t-IzVj3O|q$@,Z%xA>ݾs§.Tjkס f9`;oBcU 5]LӲ,2޲1͑n cJ'i/H22#ϵ <$ts##2BQb0HPq I98G0A|L:G&G0Hg41 1Th*,NP1~_"naP'-cyĄ@L!b"9\1HEPImo;e8fs8H  IgH'J0 5 [$ )tR1iSr^/}O}~mo_Sɸ2si'E8 1~YlɘkG΁ .$u d*z 0, d:^[0`@3QL#8wID&#iBYQ0q%-JtL1Ɓ`W`&:z̃f 3L' ´KOſ-c L|/.Ln<#쳆4MO1bOc#-Mkc.@!@dcs9pL:Lg#1q!z0 .ii1sxfVܰLNpqCC.aXn.xF!iMqÄBSM_+\>0~|M*IZ|)c5$4$\,V(LkgVg-@݇jGx+Mk`l/T&hQC;|pc[L3M{\ 1G BD2!NYB% K7- 9GT1$clr[Pܪ$G0n1 42s8,L|21`6 #DBǦz51xO'86O|L84g'J;A>bTH;BI** J@BQdE]ԚI\/cZJ7H<}8X"`ZVvhv8=!s% ʹLeR8eӗ^CK\4ߥL&=C4,`v\Å@.O$t|i_C;|S맒E =zzhWJgTYxyC&R_I W*&uV3/MpfSI+bᄦRq`<3>?O':'xRigoػo|339K_wm<LjO$I,eKػ]/`p}}}V|p}^gdzO}q3MVp$2cFη?0A666666-LaxEgk˞۶{/oڰa/d(uL@(jjn+-o.LZ{>cm0뮽Fb!ϟ?sI&{EQU7\.A^;g/ZvꝻvbcǎmڸ>bxGz&l ˹as-[66|{R&8׿pՕW9rt|il666666>\ԇi #S:}vB0Em!m|HdX$Y9^g8#˄" !^GdŕB(RJ)Ȳ1nj E CxFR\v/WUf\je&r7o‹;JK-Y1^v]>ܹu~?44jMsڵwА$I֭ ee;7\7M%-Qt:9N#e̔a ?UVVLKQ\.a)28< e# .%C,%K׆aSܾ/f"kM3gXn-[?YaAM/vX|+/1mޗXrfM%uaxtF13-mlllll.D>L|b g+|d2yv ֤UT?m;=>F%ԲD"˹is4{5c8L(w:|~ HPJ-Ze(tSO_s^R\9m6nS񵛰/VիWoYr9缦uu94 oYcO<9.YDl@aj3koxy&4 c+۶o}k߸낅c/[dɊ5ɹ9zl6^t:pgsjr')E gΘaU7];gB7ooX0Yvu㹦U+Wd|׭=t`OP%$k<#_"撠W 66ܲkZ'Mfw}ۦaF1m-l^;[~ؼ,;gUrnWgi:wKDVrWR.k&dr&/$%9sFsP"&'0u4Nxt_,i:Qd'dr&/竡666666c}llllllll.dcccccccs PhԶyͣdz$^j+] W;:qm^[?~ml2!'%^2˗enȔ>kccc |ۂEE/dcc󚤷]tc-: k'{79 _>accZއ %x]MPq+"`\gFꉳTR ^d 缭衡0&1Ya0XQQ*jn9www70a@`>WQ)` $e;u-$M%wنK(5իV,M܎?}eΩeR$$ ۲ySSY%>Hߝ\k.c+(Lit7CX:b# nEYfZL3֧Kf _zQ-Z#Ip;w3+ӝ9@qoҪHmc?Q]UU;6 ;~bFEEEE9BhIF8J$,YxdR\SJ{:nm.wr{{G4onn>23:O9|9z XL4, q.D60]ַ iRJS={_| نO~!Y1ƆaX%|UUD`18}0:[>CQ\P@% Ӽ'O8yޓU"ns_еPJsccB8ccز,c @<O Ӵ, r K{vWbo/re2k9cceopڊ|!hpӽEg.EcMm[kzd2´ 2כ{I#0BLez^k K޻=UBU5"־icp(ET7b}cJw~^̶%L: qIQq^ C"ӥ3醮*a%\Ni{LӜ5sucbr\$uttf+e%gϞZGA4N8beYf,.eeiX30 \B0 Su]M1bڥmc|$'q?)Dbxxز,˲NP$I$)cQJL'|d𞃧zz{k$g5#gq9n(x\p1Y ]'ʲ,J(@Owv,e 1j eYl̙qc2 C}|^7|eڷޔ:jc['D2ot8S)h L`:NHFZTQŷxxg`ȫX֏{}>c,vl1؛ly7Wc9G DŽ``#gqOvuu{=K*L9 ;Eq{ܔ";1'N+LܾcG z(3pggW"زyeՙ(Dr(<=x5WS4\ַJ$3h4zׯ[s"ȬY3eYf%ֶܺ6y&iI-iPa{z{NG@>|~znCblke1111DLh:,11fQBce&Pr#'c t: כL&u]WEXhrRy gϵvPީ̮^D>Uq#t3S'"])!UUńpXi,Dff 5}:HY*[z&3-gFSc?vl9j}{nOs.XϾd1^̴A-\=φϴCԹtkj38P߰w$e=PHCc()#RJB3f!TxB #-f]RDέ=ήn<6 !p:>7Lvttf>9RTp  IT޶}ǼsKJpLj E9ԪAQ4ϛ& a,.LB!7_x c"HA0h梅 ^xqg gܴ,psKK{GԄڤG?!+Wڱ}ن55YЖ(iRaX4M'SYB 󒪪ngoC,j2u 缣0in0Β$ 󝎌cن5PR0²,)"r^^^gw[ IDAT˦׵s~UVy2䜏H$&g%EQt*(((((eԩ`01H&5Օa 3 s)+--9yT8nnKXbĸ$4M3{^L+"4'јaQ<:Q|쪂 #"2/l}tMp8.%.=#_ L`"F bF@I 0p3MMY੟xur+blw膹k+) zRO J&O8uΌMKRCa="PL :)BĜ=KQJ%JNGs Q$ʢʼuݐ <5utv䛦L$0pKjZ8wH4Ry+G #p>OUqRD"H&$8uBWeK?{%*#p4MknimnnuUWzh4Oe0- e=<<}yqЅnx@$UU%Ib,avϟgtOkfkkcrE‘A a$~>LHOwϕWlbRe1B)ȒFq&B\aJ_ 'w,_ m.+JլYa .0ePJr.B0 CXG,JYɤx~#iIoodk{w{?Nsi\UUe˖}ηwyKx`z:|2uq1Nԅ3\UU+Bs,Q<[_u^*+*vޓ=//@%*Su!@)S\R,6LpwWכK!~߶;RlWl@HXm9.]\*#^ia,LbXB%BWZ }n9.I-ɱG_paD\IMGmVԹfӛ+ő]%pk/9V.FH0s7,J@t8:64̙]{Ŗ^1oA3i`KRkB3cD€$MXdƘnzL#Ff0uHjK$cEH =]:?q2?//ׇǭoVN!Ƶm J9~BJJN,p.Y1oܚpSBlIc?,`G7m8u兵Ê"ޚ^<{Ӎ785k71E&FNZ4 OSq0喉i196 \gybƒw,@kI0 4Γ ۼi9- v|t718(TYK$D*$KJ# !DhYw4qE>޼cǎŢ1 pTu]$~ ?q 3*=bY|$Y2 CU57޾~4ru]'={Ο??l\hQCCCn x%'ÍpfY)^Epe#1ɓ8Դ6XdX:t:0Q1Shto$YS:F1*iZeRBZ  I GX]{Td/ Y؀ai8/It49th*ms@q(LШ<~;جisܖC3 ##L_܍!@8I--LI\Lq@sK8OzkWmmu;aɄOcϖ~9ڇڟlCġzV`i]B) E9sT}380-h:$w=i3/D!ggÅylinK% )g$񞞾/7xܞP(OXZZZ"sjk,BݞΝk*+-VUx`04o<766uuwY]5H2'+@٥>o~@f8 ?qkL$7o0;PU\l$0Fb]'cq @LÉJW4BJ0,S=!K9 s%47~I$1QnY&^Ɉxdd7)0-N$eN}%:x8+iT_@j8 ={]62Q:+<4? I*}ݲ8 uJ#.%SC.>Lh~d9mmolHdx]9SJ|><+b,eKeY$&:t7PK:/~sa*Kwknp,fwI'1SMyeV PX1. Ȕ&L*4aDB6߶U㱘eARgYR-5sݻϵhɁ(l,&D>ӄfŹDp$ kV<Ep8‰D=EC!D sx<@rC騭zE8$gN\P.YP=֐tqsKˢ TEu:yyCT)2088<<#/S().Fg|>kK$Ph0 e*jc#ՖU%ƘiY4ӓd%.Dd2DwwOOoZp`jԄF8 b1F !LGw8_`LaM+TE[d[5JiY$1(4-BYb8HW$* 9` 4eE6MS~{福~}d+$Ie@(h\wz-lc  S/:ya 8@I5 z*Mw} Um/<͸9( WgO@Oq/x~ }Mg";'ўعqA>B&\]^ /d$沒2UrFfipVIv ˲408ēHEԗS/[|^u,RίՍi\jTeyYL@aI$ו~<0[3G 8rםLh1T5M~޿zVn*d4vk,nhaY-l_oeB XZpXǒɸ33IJRn5?|:2nmd23gN].y}>(XP\R"FbqUU~LiOwo"-#h|a``XRUU")66GUU><bb0ه޾Nv9[Z[oܺ9g6=9uEAM2tISjf~Ӄ3nJR*1%-c׳nbRC7L4-K]8\P b!#J%FNz>@4icT%)/Lȼ_"t8DC))cPLYP$9S q3Y&Xl I}Lcond\cM$12aTE{_eZCa (8{[w(MonYgĺŸm=MZrMzxw?a~4 "IJpvIrZ%7ydIzFwwϽ%Ë?[g4 eF{CXLKj˗-Mi[}.3EGUGVPf+71SMy#Ci}` Ȱ)o\I kzh ;ޖӻ*gTCֿBxB3M#;pEE%99t`4XQw+Rp.c4C\l,` cldٚO<5<5sf^~H-imm+..q;Ζ 3, ]NWAA~qqIK[ۼu=G$I.5i σ=0Iq.Չ1}sjg#a!u)%55Նi G}^睢SHӷn:HM83MaD0˒N'ʜ;4myypcׄ)PpG*Qo b48q540HLL} a `Be˰c!  1 8[t:cULϭ^0#{Hw\ww 8WƫhYpIĕƓs1]{ { c,&DHΓbm^R-w!GZ7CAĜ:qO7'in17DwJAPH!>߿CLg&D%DUՂ@7^m#՘Mye%Y0F`1+'<ΓI#I$Λ؟Hw^VLt<H8**]O+V e%HiG>wÎgm4-DEQ$B08p J\M텒 á,/8p89'g/߸~K>4J|8H/`a⣋sԴ07f2Ka @ YwEih&?h%PT6sg>#'B4 =$Π3 u??6|󇂅9;!eI"֟> G3.F@ġRBPeY@tDQTUUVZEce)e0cǏ/_,44t)3sFvGB9;~rsZ^Vtb4 m{` TWW[XP t,))F=v0׬Zua-mJNhKb4S:JBC!]7"aE+++76;7+p$K),uR'>S!5ەڦ8C>h#Z1&J2sMkKpg}jo0J\V!b;cL}g]n( C7e sGߐe0 P<⹣/dBRB% FqywḊ4zʷ<}2]BhJm7l@i~A嗽~7[o4WWH;Ȳ<ڪ\L1$I[ɣ<\԰~b0ܘ ΔLjo+:;~B{Ē|E&(PKs1)÷KeeT4WT%4d0 zF`Y i$un&!]<Ҷ,:P1LK4:V(~jۏ *++nW7#PUvƼ+P$bu1=Nsz39]N41S0kVo钥'O'm>1=)RiZ皚<O,u=y*燫fy˪U+L˔%)?/Og;:~,IUjK<7 ]N<RFjkJ Kǩ9ѕ=,x|ێSRyB깡P=aL8g>K]]] NEƒn F9_L8u?0[?s,cf<'>m88kuÞ}I5H~> ~kYovbNl_|zQuqD9dN;Z2. @&r؇i*YV U(cCW[<.U IDAT8ge[f͜Fs"vbʷt_+u;;N՟weE%gqV` &$&J` JPDMc f|h_kk N G"!Ʊ udcMnR5kV0tgo\I"$$ u3ְAmXZ4/*akWT8yR va1)g)Ʉ@ɖ榪ꪂlKPJ}^_LzO}ޡPfyyd>3*Je#9].EQ;TP`0%I*//w$|eK677>s.\p0n$FсZ,`6(PYQsNǓ1Uu\T<̍qN 57]aPB4W%30-X%`GyxK Pa];N)L!ԟ ER.&nӪynwy?[DsA쭑kd.1I3;Ma ~L>Z #`\&ߔH$mܷՙ"pmmͧ>1)@>uueƸ(_?>OVWUr]T&G^m2ea, !p(41qp$OQ):cb&(RL .,((PKϹfڕ[16u~CC+VH q{TyPYIЖ:j)EdY|˓XQT\zZ[[ꂂRR]]U\Rt؉s犋\.Pxx8/RzM1xܹX,t e"Xt:nֶp$,/X0 VRbNPЍ\/3S; miSqb̛7w̋SϛLjaF<9C#,ڔ U+Zbg󎏢۽~Ko[ &5H A@( қ-PKKOH\.wdž.ɥ|?$8$9Lba8V ԧw0 85cp1LV&wqsr5Ug߭?N17VJJ  aS ս>0A J'8Shu0ZX#Z.m$Q1P:)R-Cv@{xsrt7BΟ\oOܝ9]% BɯmkSEH- 4%2[D[´o3;[X=(Rݩ{Xʔ jxz1߹1~VV\.(0VTqcrD"/)*I<][;ps5Y &\JB01%q9\@(_ nIoD!W"k 5LJI.ɼZQEaLG(jΛLLVT\\,)J6۶Mz[ju|BbAAJ409l<{H$GIΑ+vݑ$ޢyly[4f+1^HdJDX #@yΓ>5ǵ}+ɋ:zyzqjlb0xLK){*uErփ8ۈM-`ҌBdMpTYVy,G*UI$eRIjX,R ңQW:Uz 0ܪܩ"̌djbDTxxx89:xc2ZzHJJLFQ08R*222 Fc.YZZpy<ˍꎕeZzzNN@ 0TjGҎ5ɔH$q99 0غ@(Ê tXֿ6r``$E'S1BP`@VK0Y8a3Ii鍰岙8g8VKY -d2p..+)b{ܣuhDZxK==n<$IVj0Zy\RnVo<֡D0J҈QPTT(j*)J$UD,YqL(28''7!!`\wW>0M ȉ8/ޔ'[NNۦMVb.ƲQTǚ[9pK^<gj\$2E.ї.ePp\h`lxb+1r|x<@ x 掃}eߴ|R .0{mf|~5ON`Ws+J>-L\vOjT*KL(/PbH$rrWK{|5eJ/g]wUӍa ?$\Qo#cO[QHQ`@g^P8a9rʶF䪇" X Sbxez4IF%I[}F &B.KJJJJ:*rFKATto`0+ِ4&/3{̱s'Ye^nD"*t#5 IXPoX}]QQ*~CM{w D lN8FkYP-&1Q|ޣH~±dg`ooiiAjtn{];!ϫ5Œfq\G;I\0,bݲ#L x<^K/-5IP8r8F>Zܹ{W.WhZP"[uXl-[+ ln(JERX, lQT\|jMqqǫ0LP]szKd2K&Nݿ)KҜ WĝN^I̭l*2s-E}ZQ]o4 }P;oI=jZ&і;LNY{iYzu56^s;tѳ^i*;Uyk֮915cS+V&?ρVԩD&vtt[71g-l$%%Eql.aYl6dL&K7֠0)6666rBѰXFLk) 9\n7ૈn29%2+iieaeuXyXڽQA$TEݮ]mڻщM !]upgXf|>Z-A.4H+ ~'qP`X, jrlv kI*1Is[sw4M۵;!oo?w0mdJtV7_ӡ}ZYw_I))ӧO>$EVvm5{TS|޽\YOOA;sʒ- mɉyW(.8(a&?4>«Oa,oϧIQߐm\ru_طsvaεpsTNήa0i$qy0]3 UDEL`RTt }ӷO{򿡫׮ۻo'p>]{'-,,*4on]{8=DڵG@FFf߿_̬_YcOӥdA;?3)%KXI._@n,#&f:+oToP*=|me 7|!,yv=]3(0}ѣmGW v6+kʖ:qto껕Z&D:rn᥯YQ+k`@a]F{K04d lݦSqA~]{>}Lص@Bba~]{ a5]rJJN>v'uNǎ[۵k=x(9%Že7vۿ{cktn49%K1zl=a`CW ꭯բ%֮vY.¯ۨˏ{~|{O` \XdY.m;,YB%Iߴji`ȰTɧ ڴܶϢ%-IR# Ѳ_;~ th5}pQv"-]g^ӱG?nwk7OşcPO]=Z^SQTe4JKK{d@`}A#ʃjF,ߌ0~ *vmɼ3M~>wvׯ|q5.] F^%%-nDN?nhb7 ݻu={D}<Ƣ`CvzTBOܩgQ7=z'0PYTT2p@0 {o(-,,*JIM2h Li|wZh#MSg.[JKKcn|qiS/]`0ò+W^󏛛H8vlvlߨzJ@$գC ea&-e0ZekiX.zw H#l6K굈ٳf5@MxOsjw+Ǐ}C;ߥΝ֭[vY\\M?;;rŲS&:r44,~eccs`_&߶Olo&"2Cv˿Y7n:WzoSlպW몊P/&'<%tY89ye h"K$L&S$ EE1EQF <|VkHJ0r064$Jx$9aXо]~Ap9.YX+:ey~^b.BX Wz9t8&W)p8%5 I$i3* 0-Dhc^ѽvܫGaX>~]g|[w¥iNV"%Xjm\!*̌; cS7WG=z-"2*/ 3Y;@7l;6.n{Ci}Z#0PuU.?a{/$Č_m IDATlĤǎXx]ny=ztjZ5B?~X0mGoJ;ćP޹oV**,0>qT7G\#0j۫_bny;펎;jޢEמ6ni3Y̬AZf_{jtn4;mM`߮=M !EQ=ytb o%{ecc3thHK/]̬d#y5<@Xy͛وY?D\0ƴ R.οTsY}'^={sGW|Gė/-۵/)7^|UtuvvvEuקO֭[f;;;8t薟xE_-s?l\FZZD_/|s|uD#ht ;H_=gظ^ |ya䉕$%;pN =|?+O?#Ϣ9b8Uwoddd|5ytʀCuϞ?ʞgb|0Q~76tԉY3?$IK $njub\ IGDFE#Np1ܠB@rؽ7--},YT_wU.XX}#.\rϿ~ڻc{IGENׯ_FYjYl~i_;b޻АFkl^F]ސY> HXdh8IP:l-I};;;Ν;]ofgk"-`BeAa~IwgOiF]#*}t|3ơ '햕DC`ff&ԞkׯvYNӡ!sgm[~LK~ܲ؉*xA9/hϟ?eYѣ !1i<-?,veIkǎ8;;5=60konaӦLvt733J=~2 6m\7lݶc8\};Wšvzr{I?R)6TZZ:OΞޭؠA¸1:ueKѣFReeiID"177(Bii)}طGVoݶcGs?[7*MUTW5@ jGAg*--_e{AތnлjTJKK?yjH N`ٷ+'OY[1߭YC[.\ wqq6ai?ԏ0UZ"LiFBBj<=5j4Jbf݆gG'I v^KK Vyqrerg7|y?y\wN8XOHQ*&QoZ)ׯ\l>SDd2E"Plm]T\DS5jp?x_._zIpp;jD{!!?8{ ҿ_&6TH+ra:Х_ffp9.Ǐ4pd2$ִ >}v%iq&TV:ɝ[-Z̜1kWW.r5b1gD>>EEm;~޲˯Qk y<ނ8}T {{;?_߶:9^6nqs=c<:ho]v .x7i׮ݿ ؆ztXbii؈˧X,P@&{md rΝJ%,у;#-**Fs[~.+='@p[mߺmukwZQP& Z }|Ju s~vZvׯY~*Ջ:clmfcc}`nK}dїh3'hwW@KC D->ޝCϟ`Db>}zF.|T* Z[Y<~U'JjF& RRS2KC xwt64lڔWwkAҏ?{DqBhϾ=՚m;~xwoU4DV\-I+4/_^fXE>NKl\Kao-[w?y9*agΆN?b%v?-]R-?suq3gLrڢ%N8%RIYjգ{7ݷƌRZmK// :h4lþ=p\ow.Vե ֏0i5u]h`6lVq9MrՑC@ԧ?bUQaEQZ<}nE(;;G`طWU+_߃$Gruq_vGG?_v|:ϷQ߮ðN;?{R0gΘ޽WozkG?-ZtX>O>ޝ $u.]p4n>b䈺,\0oym 7y{|-6ԷI7wX||ZjiiqE<=t)agLkm oPp ;6mXi:8&*}q(5u&Gg;7A<م>j4$IhI$IRhhH9[FWCr. -o(h~pԘLdU *@ ER\c[hr5}Ƭ6Q @ Jixo=o#5a2["HD*Wkȟf *u@ $m[HMa*.QhF،3ed/r#aHfP!!/#zGTjMB3d|'>~'/Ba-o}8arL?P )Rc-H.)*..&IWal1@ jKDdTchf8Ief}=}j*$I E5ähjVyY& @ u@d,d4z]#L"!DOVvF5vc8㕭7ng}< -((1cƓ'Ol+&Nد_#F|0==}qqqu}Ν:tP*-ɂkԖeYI4G D=adaa5uB`2yO)ekj;]񦆫g}y<>`XqQ˅y0i'wD>1gO=%Nݧoѯj┏ݶF6tJ/բ 6qI>KȈKh4w-"J#L"hԨQo#GDSNuuu=sLff_`` l۶-11CF0qcǎٳg'LӦM <S~~~p.́䐷@ M;v꒒\'%U7Uͽɣ{@&%yee` qO 5%C.p> ӅBs Vi/ÔzHRBVLsq}lie=911=-YrV㕘wWVs}UrϳJ}\U0"uf+'K ǪZ9}0 .В?s͚5JrK.gXZVPx}ٳ  u+Vcǎ#GbVߪUֺ-<ڵ3UQ w'xPc[0)~ ggD ]rHQ$l IBVZb9ղ_ (ժv%E^ L[1Jq.TaN^$J%9Ef:+‚\Rs1^_l6 VWY>jhUrBclbLb7![[T0yyy999d~I'NlѢ~ٹ[naaaÆ {5޽{`ii_XXBK3g///j*>x@9sTl[nF>(Ur6v}msFSemHO-NAwP %:3X,Fp* 2ѽYiֶ&Ź9g3 . ן[xצEVxx}N:e'ER'%HڽB^FҡQ $Z:: AܗByVcd㯒c[X9R6VN0Tieeui} FL̫-C?qtt8pܹsf]vet%Jn􄩍mxWh =$G8nai-).lݦNо͘+ &Oߐ#jr3 &E`0pack߭G߰GZM^nV>u͈~gggd2=<\?R)`X /WPI-Z&%>jY>X&d2W76:+>O$qg2Yt88$-F<Y `SDѤdr77ٳggϞݸqcZabނ/h֨UʻF?wu5mg>J%V*L V{ҙFHJ|~Yl %EON%h2?/>HmݦcvaWC֭GPUq>xpL0<';s/?'iHMIюPfqOFE؊+O,YdϞ=ymh6H$E4ߌr3 }K T*Ν>hP_6_sq54j(}|`_®_ 3m Oxl۽Gߓ\z\J+FO/%9>{w_4!%E*>O"Äwd( $ȍ%'%J$$kׯ_QF D #IKM?p;=]$ 9999w=Z4\JG "V#jf:T@4qF~zpȘCw[7 4?@T\ ;a:&%q.\S\TddF`C QO$&$dHc[t_%v@ &Ho)%%wPp빭ZSF!z~*,,(e˖˖.nݺxuM< @ wmBs-_|nw7c"o݈4qcǧl^0$Y$eӟR] IDAT(Sr%$'_RPiDaqNH"#L@ B-?yүzWY+n;({gϞ@QQєi3?Yn˖vX̐ƍꖶ5`9L%R% $E`g /Z I¯c."Zq%^hdj1iǏ5kcǿYmt5h4b82ʏ?mݸi_{vwN;;'g!ݺw;+O8`_VS?aR5% ͐P$vVv~\Rf 9R޽a!䰅$*IO||N^^]X(@ ZD>@/+ʦE > ۷\v1p ѽ -7`DB}UQau CL*!E iϓ2ҥ6FRP5nǴrpJ˕CV$+Z[@ fM-"L΅m\!'Bb de2())L\޹S'Sn,,,ZD" -,-)0. ej$Ib08`$IjZ c0Z]iަ:(J}L&{iiiÆ {MZȮ]fB &$d3U~ilN8?..~pHy(F+|~T(]]]teSRRjP(h߾]& /]ܳG4CXh1j[6VWa 800 zZU&$IWW4͢E-}f>_t]EWwWTտ*hEġG4F ΅@]|pJr/?_vݻ 9soȇ@FV) ( 073?;-7#%;-҂&^%^w0`a^01`aPA!CxxxxzzN<411O? NLLrI8,,ۻ&t&&& H$mڴIKK ՘IlUt]EWwY[[8}j@~C8q\$|ٯVX<6[}..r dVk?>}ߞUZBIM},0Ua80qП]QL6-00$IN>o?~nnn@@m+wbĉǎ=z4={v„ U5Qݻ;t[[A ۀs[r-_f5qKA\l<] }{wWUISca# ;i'[fW?z000`cK?„1.6z 4K҈?p3gNXXh4#F` &BCCǍWU@T EA}2bbn4!&~0āOXGt17Flv/^EEE C7 _,5{{xxT@ 2}qG?i\o&,DֶV6b7a}Շf6ś 6=#LUammMD"OmlljYK&Mt3gΌ?&0 -+--cx@&˗T $9o?nl6&=[a€Rv*Ban AرcȑH1c\zɓƍ XjtAj E @ DE W!7>`UH+Aj͞={̙EQT߾}WZU~NQFݻw,-- ]\\j/^800eΜ9snݜºukWM/~L*,$y$IQ7^&\fWUK?k%-etrr:w\U9\]]u1uk׮]>U2@ 51TRHo>Vɕ*a*O+S0HxٳgL؆ YbdK闖ֹs5x5С׿kW pՑ^zjժe˖Çΰ !ԚmU*K:eɒ%۾}ycb,M3/;KzLx}x ֏U_CHq۶mOHH1cFpppJJJU B}a2g_F˴~QF5!5iEWUt]}gi$&&:;;o޼s ѦMCU_[xxnMܑbҥ7nOG9u 6T02S ӊ2%9|YI\V*V&IȡC}|+Vk9LI&>x(;=UT2h ZM³ I/i5#+G )S9L=:~ŋ'O _|񅫫3g233aܹ[n=zt`RH!J0U z~Wܿ1ѸTUύ(֝JT#L" j5vq̋%2 1c+/Dj|35>@ DQs Z&lٴ`AMp/^Fj01p\l)+EQ8aɖ$I h9؜$I}:@ B{Kě֓eSj4oI~nM:SMGd1 8A R5@ cT41}o@ f,7#IA,nE ,+xئ54g%„@ Dӧbdo&T&a 'T8DdTRYLhKe 0f1rFKq,s&}#10 Dʡ  xP}̈́2Ĵ8wTt'wq,)鹗=ۉ'w(5=oߩ]'w~_Dp.M3/j$ G-$Ma uBȢ.8Sv^''1x~kpkjbfw|Y7@oDZ P&D0sׂEK/YX<@.+9rЂK ^C%۴Pˎ:Ticŗ/5\TyP )RH{.h4r-Byt;T*ՐX #$]Ѣ9@4l+rhH4UmI%Gdq^fȢZJՒ$)W)zIIjB[0RJjjT)W\ׯ_֭[lپ}uULP^ĺ%IrSh@ >9WMa  '൚G,|};7#]V,. $+!NXB3.n!Pq7JЌ岫 ={ǻw)))Gh4+V$iM)Yhi!@4]* Be,fRl>/+҃w S3 &^%'GdeK=mZ-lܩ0+PP`8Z9:\eٲe=-{tt4~1ɓ'vСR3gQFi>C\;v0`%KF aaaK.}azzٳ0 ޽Ν;sssu&&&z{{d2ݦᮮFڀ@ CDJT11*9F,!ⳟ$|aNAI?IMH+&q1MZXFEFM/?{7{w{U*E V콋&1 `/$j/1#1Q !HP8:كg̬pqqq```\\bIBPɖXbΜ9ׯ_d L:… tndd)S 44'+++##b[ڎ=pP yx۽UqvU/yy$ѫyU6{<g &@M逐~bD?OWNfUI!$Gy|}]VVVX,}}}_GL& FKyy9 :tHGGGӃ`ʔ)7oH$W\x"0y慆)  Xg*Sxߞ]ܜT2D7>HT>(Aa/fea[ut؆b~|MYy9`چUHyvmiiYr$I? p8 @9w AБk-,,rrrX,N7AQW"e{蘩5S8I0L$$0\,$KED$pla\&$!H0EDD̟?_SёdtϐMuuY^xKo6mZDDDΝ'O Ax<:f*--555e0}|bGATniZS}? E?$Wt PMEvVl55D8>r-K&Q,ݻw?qȐ!xbZkjjpڵcFDD(sR.]q1La͞0aƍ_x ܿxx8A3f 鮮gΜ+dt\LˑeC(A^ AYI*^[($q1 #IR[ݙd?N 8X 'k}Ut5Cwܩr 55'ZJWW*Pϟobb2mڴ-[r;uꤸBׯ-Ztݻw޾}FU^^D.((7o^ZZEQ?pֺu~7[[y-[L vUyJ/_ p~耩UVպw5Uq@Oކbjjeb`emiL'ڪh kowqq##Fo.uyTv++Z[[GEEw۷oK,Kc˗/nݺZAO"*Yr|ѕgzpFNIEjZ@ERlD,s+M-b0"QJ^|{mF`yAT]BPq %>aHlnBs e2YBltv^֠b^?WRZffRRLeڵǎ 7iAI%Q 0EN>01b ⹱#)%@AVfx$IvܹsΝ A>KhnyeEmϻ &'ˑJdFB(HXUYnhdO '2^>fdIc:87Oz l5.YYYk,OIT~QeEiiki;9Z޺۷$A,u5F9Ņy>t5յ;z j_B=}z_sӇwߪI_Ok耒JLӯKK016ruq,)-x8ki;40KzAK(4{XL.IQ`0L&ն6#I`LIT,ւ&AfCPD%9~p*e0,KMMb &Io$Y nMFߗ#\r;Nn{i SJHÚҷoWVVF+}׸feeyFPQYYY1JHk@cAKhVvoHn]SVj̉CgNob{.efjXOo2 LuMej?~"3;vgGٳC[^Zc&LW o59zZH,}w`KOWSnj͟ tAro֮[f~$9I$IiF4ƚ0 SfUKGs k:ؘOjjyZk0缽qP8a~N0HPc ګ3(Ä lMΘ6u)=j섐aC_Jς%Wr ǽKJK9#]v)Xի4zՊ*CDUU zՊ#B &m;c=[q/]fld4bx%+;w`7Mkxb=HM2I>@ڍcG+s"Vݵ}[B\H$%ƺΦ*;[7o_ȩNעc,9"!dWÓBAYYAv5zSP(ͨSx 4PǏ89t`-Ç >'d {(3j$ 4bv(XZZXcboJR3fb | @EEeVvA0rNn'6&V4cطTcKZk pMZ~a 8OғdռgXLA Wr]]]]]][?7=ms`<Ä l^BacXzv## `- WU5} Bݭb=rn=?eoognf`o[&ἫGm}KtzCu&%%h1LZo32**es8Oo/ pLa*];Ƞ6 V^ aBiF/624сHyy1`&]8gog'7X0aKQ\ǎQ~LIRuu6TPlpZc\-Bzw 6؁YZO;3GISS5 <}t>r/^rmllfeeuԩ͛7:uJŋtիZCC.rutt 88u%77y(׼1LY5X;+_-56Afk0P~}a cC 1^0h`Sg@*.]27/O'DGHHuuQXmL-t9F 15PvR1VkaU S^yO?EϹ| COO?=dbG4fZhhOVVVFFZni̛79%%СC6mR(SNp2eJ}ѣtߘWiJI61F(~E%@4g/om-W.(,Bğ֬_J;V++K/On==?yj`ᮥemmUX50㐾۵ݦ! IDAT7̬.5OA WF<Jwq +"#J |pҙ8v}¤!dkϣr0.\BCC_*444\nΝ% ֭D"aX^^^JEaaa׮]544MLLTq 9EV^> /ٽ=y_#|K윜Ȩ%%%۶l4qqGTܫtۖM'ΒӡFw!hV}m+ڥ/?oaKOwE1aR|M$ƑiVI貲bDgXŇϞ&tuuE,`bbRVVFcl6 :1 N<==]haaTߡ[UkazQo3$I.Xd]B~&j֬ )Aq2}};o^zaؾ[O8#K=Kv䈐M[5ж;W- H:0ׯӯ݈ٴq}{7c0{v'꼡VM-OSv3(R&$T$HEDL*J1A<\JKKM֌WiӦEDDty`PEOS=KN>&_xwzQw gUPPXZ$N=w0l1tؑ$)&*1Kc L4[hyێ3g}g^{#Q_dgm,S ܏fT80LuZqׯ$"L L4oo]]݁߿?<< C3(c„ 7n|Eddd}611q<==̙3l6qXrzTc} w*w92j߁" y,(VSq8%{K9KѶ!4I+099:6~\o m;X1(X:tܫAn9ϳl̝mv ك;#WWWmm͛77\777y˫v {ꥭmؽڇ_fM>}ílll|}}mllIŸfenU^QUGXaa/_9sf;550g 9dN..cORf==aCF?ps#K+9K Hk@=LJVS_dbj%%y; 9eEӦƠ(֝Cˇk;vn`6мG;9:߳kǞ];tR­)Vްn͆ukt 5d𠗩tz AP0 %@CFkD\YY  " J* rߘH$0ܹsΝ݊8ACQT R|׊wd2٫GWN'p0JKrH'II"}7E(vV~w#1mqH(dR]m&>/.-)!Iŀ@!~{J Pm`b2w3:XhUUUacm9ξ\"pjVf~\ǁn#4"*Zfifdnb@QEQ d2 =mg+-Ԁ Ä lD+ګ0Ԇ!4[}Ьlog'Hݺvi&&;J˟ŋtp UՎ^jG %TQ߬]zͺ"%I/Sa~ޑ_cS>n_[decۼ}Q H)y 1mS +;{ !Æzǽ~#q2r–zWZ1~X_2u- /g=vB]C][K뇽yפxkTLiii׀$*uM-uu "(hAm?N߰=۳k0!4P ؜wπ*--n: ncc}ԉoK;v97M6yWsϝf݆I e[x72`9;>?H" 8~r ;1NK{РA?N_r IFܺzP*zyy ڻQ*0gci\]P H)s qC{l(Ç5[Q.EPP[(;z |p9G۫4544~?yzIC2xjNR E%I"p sC9QV?SU2x곔ff(kHl.BAHL9\+bOtq׎m~>=߆IAORԖ8r;%bAQdNZZZ>\(" $`)_@hWIq1/pٓ" &~m[(fdYXogܞ?"^ٵGϘXii}3OoGQ$QZZ2f܄N]u~y6GK.<4"={wܵǏ[ԠZ\䶗.{0 Þ0xI7cF$iaa޿oPt ÆF$Ӧ2xt$jm8Afk%TOOoifΒoߺ9|aR^$I76+;[__۷}8~&_|>/ vn?)?|zQp5W$A:ADyNu3Ycuk6[CCgkhhp{egٵcϮt:)ǩ,JC($&^ ͛7ݽw\;wx=zPkpamIay謆{Z./? ta!!臫`& |=]\UZZ!Ed2>CQTvvvdee+ߏd?;?ɏ[ZCAtHJ 2bHJJOMQxE%VֶcF&F2L&I4?ѽ(ޒ#\Zy_/q-ɉIab0_2iўbqgg N:aT*u/{5MNtoGQV99v1,?/O$Y=俆5kW2}IA?7|V\zQء$InٴqaRw/_NuVv6PŭgNaokaBAGQTrQʃbJDP2 JH %m(%2 '0o K${>fgϟ}cgcO vVFF,&SMG/A$ctg挩3gLqP)E -oܹmm鷷oݠ7:^Kq_]]ߏVbgk+?[÷o W,! MB T!1"J f )3bX %*XS( ޽`ϰo߾}oDh")d2I$pԒIQf08Ν0aT"񲴰dL&S&$p xIh{8Un (L@V@ &"PI@$HԤ"B.@1``4}y_*ALRMMM.H"I:lVz#É^H{6~HOllba2Se^3icHK}hڕ+~n:z(\w{H(o/Sg 2fixR>5odeg[;7 'NDf`0ncF/Kؽ6ۿ;?9}w`K²d2|p Cg/2 Pߨb0FGwV\\||\||\7oݼsf䕫]Rd䕫W]{V۷LUxr9oKJ".=}oP?K + SGfOc\ށ} L, 8}\EL>vC T{Nb>56m޲CY"!J{~9w9\ L,ϛqK8qח&z݆|zaɤB|9j~/]Qeeg7M-0̵gN*Tl& p fpYCGSϔߗ[PLs;9g~}YAwt))++5IoY.]AA䃶uێ ѣ}=]zwfΘu*6!1߾YٽK\ފx2c#Cߊd }ٳflܼ+*-{*a^bMxἍNvd2)KOA&{hҨfk)5$ɢҊ?|r?%9a`'IRm͹  :>As[m Iۼ|HH3bxEAQQ$&%תkwmߖK?|5[6mLMIGq݆pgO\·H?XR z$YVY}޽O<{;s?uuVTt ! ȇcXzzzM+@CCvbX,NOpw/]PҷYك99Æ )' bv(XZZ_XE>.AE7bbR_&?I&prٲyojy?#! Hah`xe%@Nt;ᎍ x'Р[׮FF*]/s8lC__F>akhhAͼXLDn=\_1R$?zT ݛ7(P__zAOnݯ\FtL@o:={߽w?07{뫸LIR(7jiia.aPQQ!/lldt1{w޻"¯)ց/忻q={WS=*[`EmdgJL A^b{kϜ=tbg=K%ҫn ++KbbnL&v=.]7ߊ" >y HҥW8AH$V?[\AAaYIqz(+t0oޒKuB=L 'ja|eO^zzrȅg\\'/?g=->5no~ۧ@333Ɲ۷,Y!ݺtDۺ94^Mlm,<=xi,j?招 MZoq:=#ݺ٩v*0QEARSScX>jo*r=zP \@ h=#GLIIQ 'hQcG뻽.^{ן}i'GGzM2xd:dB:1f#G0/^huXW/w~;Z*,}ۺR s/^eiihѳVeAӦM8qb~ttt*++b1 )Y^($I;;Z8u|Q.E(<_AaA$9y㿟7b<ϟs8Sr\q 'CrԕU07}+F%N~0lX$60ɥɏLi_'Zj3g]co0$)322uaÈ:Zz_?ޔT,Y$9ȡT*oFShhOVVVFFZn64`ŊsIOO_~=G?~FFƆ f̘˗/ʺye[x\A}1UEKv7!.\o-5p֪Dߍ0L&@IOg2e tҸiVduuV+ɺt"ax"0y慆a6zhe\[tt4??<|!7nСpڵx jqAȔ =2t50x{[61+OӳrrfZ|}8NZҷb[pĤ._{"""v- #'f555d@ee1ceBؒ" ґ)}WR) r.> A?#}S0chݻw@(71A<޻VKKKWSmYf>P"&^L0GWWw'СCcƌiF=rR.]q1Laɓ',Xp#Gl۶M"}-9. f>M@>HD"Ng_9ciص~~~#w9W^;6o<y:K*ɔ;v'OH.X[nw8p۷O8?jii:u ;g$Nrw  H[**,h&  0IRL*iaV:\^=BF\\\j亸WbZqM&;;;:B>>Ϟ=۷/ܸqcݺu/_9撬7 v_*)8~ Ilg{¿+}r |Ǐ111NNNF P(T,Ou  HG}?r *,,,,,rbhhkW  mJ=Ljjj:::VVVt裩kW  mGٕ)b455 ͕aQ^V# degY5eҲ;܉[6t#G+n9G.mamFj= jg1 555 mmmmmm 555|y%  *a޻ޝԧlWYK?ZH0lӖ*]L:|ğ[qa՞3c3e AA>t3MMY=ܽYnPPP8a4w/_o lN]/ի4(:#?ϋըgUU>}#G٧Rѣ? 67//cGJy~}}o+ՔmmLkPmLK[W62l*{(q\"B~BD"q\q t9l:]ZZ0/OgOgD#»N  ]qi?HZ|uhhjbba.%GX,VVVffq1LMM3g40$AAO:d0ÆϿtd2zaؼ(^i`ߎ[Q.EPP[ȍ;zRztL,aڔ+YpBw; NooZCjƴEu.aq\ Џuqq޽~:jԨ'N>}8+S-Ҁ/E(~XdFDw}$6[]]*y<Go722*6 BxUUg͡k{^UUb=rn=?ffhZP@Tg)"(O \ <7`iJ>TD/T\\, 9Рl6Ntԩ  e^\r;fnGF&k!AUUtT^^nbl D"---@FF#ή ]_vϮ{vI 7[a::s:A(Slߞ]7J߁[H80+zڂ<᜔"r&MJIIʢ$''O4lԨQNNN]t9{,p\;;ŋx.]*rHNNvwwwuuuuu7~wޝ:urss{4|\%  __3y҄nȧ0T"DB_U]Uɫ((+)+)*)*(*{_G ҷ@]W((tK8wQË;ԩSӧO3FOOovvvYYY7o\lY~~>=zᤥ)=lŊsIOO_~%+Ο??##cÆ 3fAOm;Fg==n Zk׮cV}G~ ISLIIIQٳgSN]_uppptt4`6zt3DGG7Ç'Nq=y5 |껗߾~:b06 i=5KKƬ?E+WHJJz S^u1+訨$$$=C7or7SD4"tRuu={K.]$rH$_}UNNby6X,V~Tx.]8vL&0L__ɓpaÆ1:z(\^l,K۽zoq?z10Pɟ\BBB߾J^z?.ڛ)*#00/UTT̙3ŋ$IN:u\.G JKKzȑ#QScǎG#)`ѢE.\pppؽ{wXX۷CCCʴ~W__߆ۨ}#߈ܻw{i}?HA#I{~9w9\Do ǹs疮ZcI;I$I?{l޹'LL2tng78lkuc^;pzݴ]ԀJFFF.]R"ZX,VRRN!)өt޽{A '$wLkL{&xޛ߯ol9;;'gz8YޡA =~ Ե{2`(  qƐ!C[1`Nms3gefj pgX,ń  Bko,)i`ULAb@`eeݿDX\ 奣  1S  -ab| FV&#K쬬!_^V>G;ߒcX111 ,I0ВOjcaiYYQ!-+++,ft>ReޣKyyRr޽z9tojfޭ{P <]]$I`0䧏D]>btiIÇiP;ߒаTS@Zߗ#k/&GQI^iFCC)nH$tZ]]\~tʪvN%Eotљ*3_pJKJ@ҀޒWWA~kT@E$% H[z|cG~mt hkI$ <]SCSqcH$/ihdT~ MMK-Y뽫GSWYI m'RCn`+żEV6 A^DH5*+LLʹnZ]UIWWc`h0"[SKNhhjX\]]-|vvDDNvVS4ɻ0?ьֳoϮIgA) (j"؛;v}WVVNQTή7mޭ+dfeyFO-Di^m_0{z2̴W/ܔd[;?}xʳd]u'ȸΩm99.\u55:wV[^VFoڭ{.])|<000)z[u(?N83]}کJ6~ޭgv_|#m~XӼ!ʋ]dgO@dԕa#F߼@?!DIΏOJFkss N!GIOɦsyׯFyo%$U+~)(733wp,++}a<~feo O#w/_f'?}hW/_t=o?/Cj%'QuJϘ> D$y.sAc1 [̖'ڠ. iTm[7Irý;xGo>&&{վE:Ojs'vګ^67]ߏ^vxR5cx{?zێ4&ӧN]sT 'vɏ5xЀH"33ۗ_Y Y~+K tӣ"/1° קסKJJ-Zp̹v:ea/:~/O:+#OIM:xƐC/X廽?#׶CFYY?)6~od~- WK'W0L DT@1`z?D&!)R~,?yzذ!$I*ng/ԧ2 _$I~9o +))1tſ/߰i eee7nᦙ]v=Uw:v (tKiHyE߉qyEEQ@QTk_}-d?'GԔztYNNv>}%IګmruܒvHR&R}=S@qyJ BD'`10Q,'A[LIq8짏[\x_)xH7,KWW.idhXV^Nb#-m-+8;ٽϯN 0!{䕫3OovFAt`0b_녿ۼlǦ"tA>ŅQ!`R~@Q=T}nΗQ<Ś:eґc'n{5O'/<O__JLL뤋i/Oӿd:4w[RWFFo\ռ]]}zytC <٩=ۊ 24JG7c{tF.\˰X,'"<կoСYJ ~9ۈaޝ5qq@KmxТ(XZ\.jV Z-U<zUҪ]UA+*Yȑd1B #7̛D'ϼyGҖ.ےL֤ YJX @]_fϋjw}۹sgZ~%V]]\fL>cbcdn!@c;S;l!=veä )_T*KKiS 1sN!YO;z׎+9ii3>}W_ZٳfeWHcg.]z{L*53rYa²T?pf gmV?'Sݞ&hݗ&&/O[C ![ǿ1W&^獲oeIg]Tj9qcŲuwٶ%NU^^ADk\Zů:I&3keaa"-B<$aZ| ˆ@9ra0-YhS ]Ͱd0~ll~æ̙kΎݒwegnCsgN&y˿ٲ+abޟ6C{y^dW..Nq_|~瞔b]x|b@ R*r^~eQY5|2_ۙGNn#&"\޶Yg|Żow$x}A9QKs&艃G?KuLϧ:y`cZ#w`Q Ӧm-l:8;= \L ! [Og_nν),`ڹ˞`"rqrlʜ&6XQN8K+IDAT2Q#z_˺To>J%q{_)7^MO#NM=:wEk󈖈(!,fԱ=ܼudǞWa,Ȧ][mN˿=D|=̤R%bcCxtsk?kn.;~0)tҜH$Wb1cӮ8wy<7+B|X^AIi6V%egx(~2\P=O/=劥+ yR_pf y2qNNN\}OИXT2~ײ#K=yO>D!ƚ2^_Ֆ&/0z oK~鮽K37|条z>222~Ʌ6ro*HD\kFf~Aטw&Φ][uWo"ʪνy.D=Qz{WUɕJΣ q+ TQQ)(4gʔJe{DTZZZUU%|+1q ;/_y5}z/>s~wG{\5KzX^>i,B1h/DD*~P"ݷ,;_fcb̩aO{<|qԬ NnmiO}PRZVVU~vmZ[C:w rӲEs`JV}V-6{P۟ok䰷N1 #?qrȷ<չKw̤2Yņj}_k;=a*++9s+8N?.\0pnݺuUϣhw G/N׿FSԂq6VWww] UBv^6h, WEs\ܺm"9LR)@9+'?yCGWAfXL]q՚NNNAAABo.we/^Գ%"+VPexwob9L q3%J333333o޼4eaI333\B,7irMcQR|^ ab4&GM&M&MQVV%+:;;wܹsr垞vvv۷o׳aÆݹsG\\\ o߾s]\\\]]'LPZZeool2///;;$1Ճ7g@b"*.t&RP( ݝG i6)sB+Z[AA9sΜ9sʕ\.tڵk {́:lܸX1$$O>׮]H$}mŋk֬1 i_1,oė5nܸ7 0) |d2ss󄄄,H4qD"ͭ9QZ.{xxQ^^^6mN:%p0DTRRw^"!!!SNUT^^^qM!WfJ%[)-Y߉ٙɠJ+>8/66VWO++'NvuʕvvvD$sM,WĆ1#G|ߗH$쩍Maa!?"ݙKw=+FhL5;9LD*322XfSFF 01'}{K. 9v옐HD&&&'N׳ڵkq\qq1 lmm(rxy;nn;{֮_Iף&iI|%{ufbsƯ^ڭ[7~*ٳg,Xߚlڴ^$Lmڴ={vYkd2Ւ}Jiƍvnoo߷o_{{V8|Mju@@ rrr1}whǎϾkȠ /]0@11w^Z!! ?zM%977JM-Zh+X,^jժU4񛻹i6cT{Ӭ/QJJ>"M5Djjr+- 9!DOtv# [D/8z"=0=0kizunغ*#@sƢ: $Nyu\:?DZLNnI`I$=x^kQVUUX,6e2"SN ***Ν;nbb"Hl`*m_U2s7kkĜ?sW>|P`5Qg0I$4#pww 23r`R;3aJk}S~ ^Kfny8C1dI"*:?-Xlbbbeeecccaa!(͆\Ϲ#hjd,[[k?څfeʊ'΀ amժUUUq򏺈D"Dbfffaaʊ1Saݖ4OiTԳ50`Z}0dI,ZZZ9LjZHb&FQ,KD i D[\oݮ}z]5M ?څfO+-.7;`ub1 mT-HYIek|Y{/v]OC&M [0A}ܻ6v05ELO~^w[Ր&Zwt=TTTR>#ooo T*d+g5 sK[Y۵97ZOGg0qwq#FhVE"k [n1cƮ]lll0@h9ٚQ\1dIT>\.#JVH$""ѣGZZZaau_s˻g\Lqwۙݳq <{coUgKoV+**RRRǎ3^*H***DMvv#U l-]iw"C4ȷjuT\;b+H%iìM'M?i~zYpϰhʼ{B0`t8C/N{zD|vx ;tt{0M&: `&: `N)&'X؝=uBc,ZJLմFK ь0 ?8BP;ZʩT*B-hT0@ +Z0!-häR!-h&&hFKD!-h&d-aP£%-SDKuxhEtLc 9udtbLޔHjuuHdfPVцe1}H#( I2Ljs#A"R#bF`뤠0s׶es2͚SUNU|(k۲Z3-e\@%?Po=1JF"gx3#Hyw` Eh2hMt+Q4Y|!J$IJEx8GqqD*b"Hq8I/pdd1d`1R@|鳈oZ9&22O$s#*bđ π$""qS/$<Q^+-$Zr(n%YR~E""Gq*"D"8I8IJn #2t$[)U:GEX>i*r3<:ꏓ{{Ƴ?0_O7sԹdygĘnhס#"b*5"+}jP"xWqT$L%M>11w)crV$IiUBh2DDlrswgHD *U,)ktN+g=999YT~9*ΤjQ3;/6wOl!ī9yDvhs:EnzgA%v>9*pסV8C=88NQ%Ӵ|hbG$14%Ib*x^Qw~g|, EQ #" `AJ4q"dӬsiJyE5gײˊSPR|ە7sLxvD7t|˒^w^n#al I_yöDD<0%/APcJ>IQ@ogUu6=TM T \P,U5fY<baX(fY<b:tiuO6TZ(iC9+ &~P "Ϊv&̌@Tǎ7?SjW.]櫹*O<\pHgGLo~e4Z:W.]e7W}aA1듏\/((PTw/hᗥ_|u$5klԩS:cO׻o={vKhܤyJJGZƍ Pj4OMzBc$KU?GW5j`4'>qc $"G!+**:y⤟ρoeT[ӗ;"~;nh5D&D4z#H.j_} jqC|Eh6a?33O7jⳙG6lle^TLl.]&TiEDn~19ˍ>|(}VmZ ۰a]O$O?k~_ᑱ8$qǎd II9rmݲUGnj:st} k6:_Pm*9dLdKYǝs5C~u!!'j+'_xIb׽٧OxM߳c矾$ILjܨё{G|iHvg_c>~߫zׯִS{ɫV$i=w[wb6m=tLL)yͷqvqݚl,.Ł/hTn5_h揮dq]e $IT{.7n$IҨ#$Ijۦ`|h؃~zzcC$O_-ڲ#}%s*t>0M5_>$i-bvNζ;~ZD>ĸ1㟞g7gI;15gqw;CjƤ;RO峹)I8̇G#"˜j $#Fq_%Vnn$y NJfK(zsW'-9kYs7kײefƍoܸ!܈oƍLbZQd/gԱ3wr 2TvOd˹~dzEb5jh~655Ͳ +3yyyz>;'\ ''g3$-ɓz9c,:*rEa?;ooYWLooo"Jlj[:f":˱XO_' Ko,IRͼP#$t}zZ7N),*8W_~|aJ. XKL8nʤG?QQ M&Sf͌F?,3EEEOьO,M~M]n]̛䉯¯8-:lu0S$zW]WZZMکu⃂FGEjˏKߙֳ/+IҰ &_ $IV_t)6hEK"~~O<>C L{M ~ࡕ$9]ppƍhZ왟SL*_ɼ9^z嵈XXB|䉯{qڍ9}SSSaÆSUu0h4N4쳰e˖B~.^h3gm;.\(3gBBB>𠠠%&Θ1I&Z9p̛Dc92!88~>}zxxxݺu|7uе'''[|Wƍwԩ7x_zv̘1:tHMM=} SN% &|'G9tUݻ޽mo>"ھ}{ϞoS`syM6M&w}7p \tӰaC_v7%%eܹo6O2eϞ='N6mZRRRyb(xbIII3gO?ݬY#%f2??,ׯ0auydEEE&)44TE {yzzkD$yZnz[ly0!!aqqqDh"VM&SAAAzvڰ0" 0LN""_hmwlo}&&&㸻`53ś#7mtڵ۶m ,8a„֭[wyz,hѢ7o޼e˖uYf=S111m۶-wwΝ;QΝ>,{ؐ~p׬YɓbbbZli+W䝽{ f͚j8qGm`sdPb΂ה'{]e18KIIݻ7HX#df\ŪOfM'y'D 8pDԾ}{DNGʹiƍ7c ___BO],s1'"\sX 2 x,@>i[IָqܹsT1jP UUdiii}*1X @y\Z{d:ng@@ٰrV};vV/-u@qpeXfd>lnݲ >YZ*JOV0 V}R> @Gu>ltxc)5 ,@>iyV}*DuVO*}6qpk5k'5Y马E\a(P6_SV}y/" E,^V#V}*krrpY|X՚>Ul''-JO\a(PXªOe"G2/ {`#V}P,\<8 x,@Tvlwl~ЇbW}8nܸqwnuwKW2 }'aaaNۺuky!D|fUǶXUv-2]v9;˹T޽7o,޽}˖-Ý;wuE=epxڷovZabbJd^d)>99'04y޽{ߵ7h 22|S0ؓ5*:hɟ>|*ʯ:l0S{*ԑY.]._|y"ڼy>WKNNݻ]yggϞ}Ἴȑ#WitW+V޽;0֬YS/nV\RNnUC XªOp$baX(fUn3*cuv YOJp|μ66脖}A&FJTϾfƣ`UOhHmEW 8m AƐ r/_:/ q w5 8f^>!ϟsҠ5k>>~<;oD԰Q^}=}BFzRTXp.>{_GĽ:yhuG=ղpnY{˺ce[|0ktqrQ_;6No2\РaSJxڿ/iDԩ|}|Υ&"7}R!1nԤűD}BjF5j 6h$';ˌI/ iФFƵ|y%"h(&hEQ4DoªNH$"R4ׯP{U׵%/?!+֥iDtRZ] .?kYh0 T/>h4 /(DTP%Ysxj_R*iP9d5n…;R|AA^vvf-y6ܼ\:Lh0ssi۴""A{(I<ϫTje+]~s>^hUn]{ smY۳GF?}#yG0"ڱsWPݺqqnjIYh4N~}:2zS1 |g(HK\@az/˽۲e븱-_$?LNN٣ӧ#bbsnцC$* 7?s>O>1v7o_%7?=᯿h4o>e&,bmҊMj:]HC!TJ~h1IFDR ˼oy\a:ursK9yA._"IRm=zt}G{wm3|ŗ?|}:||ՉS<窕L|⥯h4Gj5o5m{Ɣx}kjW3XtgNT j:w)yKn^NEuJ޺5;'#ݺ$H%8ڧW/I D$IJOOOMK߷$I!$i 'IRPP]߸܎Zqv 3u$0xR 5Rx"$'@{Qnf)kn]l q\|\֭}۴ns-"&IRfVFhԒ$yyz$IYFH@%т Q~^~DD܎^:iYsfΚӼYO>SǎR*cם=})sѽۂ4i8!.1t֍1f`0ڌ7AӻƢ"Fc>HD~+OlԨ,iTltT% /c8뎧 9Z|YӶM¢Ukw$^Pغ w"IZoÆ ֭ IWݰq$I?yx$<Νd88lȼ|Jq\mP]Ix}+_M7]6nܶMq;iKND3>|W'~ {JyWgio=Kѱ$ {(FGEj7jԾcVjug~UR_\M%S$J慖LY\@r1&L~DD&aK٣C*)ߗ㸿[==ݗ,Zhn_>ze}##mg$*/)^DHDz,\J{t}z|tȵoWJ4bUzo2 x L|}_y{{Z>F#p5IG]!C8||S:wz|%°ytf/]vldzjZZLl\fMd"LzYӦwܕ(O / 5#/$HJ\aEEE{ݿg{:{~SˌFw-ِLV۽cѽk;ITΒP9,'HڽCCl߼8==#777< 0yMs_\KxF8gsssۄGW nXPP@D5ivn߁DtG3jD8-ݬNtK_z}zO}}|sOOKD11ї/_|f7nL;w>DȈZY$IжMr FcL^PW)Op5L񾾾D9XOO.јթS9vmzϾ WTj8$nef %qfB|23M={>}AH}///+ݬ?;1k}g'^ :2iU>cb11fsrr4N#@lV;i?HZjLV{^^^yd%{9ܹ _ҥCC{cʤSVa?__Q7noؠA^^͛;D7n ;w%rGGE.Y4ҊUݻu<̳/|^7Mn޼Y*xqNF1??rss===2HDԸ1 s9JDI*ѭk-XHD(.fQ[ull"j٢oYQRD~0>?:""8$IY/2L&SEQ\OFh4N``ݺu7''Ͽ&v5eI??Ib00;lܴG~aE<4bpvDljDt+M8B5n%rY~Cãڷj1tΦsvhf+͉}W!o?DQҪ5 I޸I r1h45ьO?=aݚ$Dih4N}k1:{p%z^|_k[>ܻKnj^n$I<_ÿ2\ ߉hGll":VQw Cƍ?2MXTDL/Zj;{]_؝ 8nAk)5":}L"cb;w9xb6GdeeE^tIwwkGDǍ7 {[taۄE ӹD9EFߵǡGteelj}^ymҀAC~=1kxTН{?H*/;;;Ѿ{YЯmcXVVVƍ5}167BBO9zLt21vz[g~|Tc `a\]cfM9Wb6G`9=!뗿_;;fbӻ^o9n㟞u<`ʡ}{oM7yCv>yҚ2izzzkW`eko>G+N;v(ʓ[T*7o!>{s6b׫׭kMHQ vmۦg^T`l1}v5Eq9Sy!ܺf1rffܿll߱ OnN-nɥ˗3u$*c\ mkx:\t٪ \WV~(޼y|zzz``o7Gu߯\t23jNeq'E9G@ޯPJ ̹nU!#`bq㆟u%}y ^^^??7n^_|>͚NcmR#wFjz0XYsEQn۩R8Y)yxxDEFZ2\n}]}јsrs<=o54OMMa;^ק5w*lu-;;`0zxx05i@έt6X+V[-?C??_Q(ƍ"Zd`żJ++Oe3ϮIZ1É'{* j*{ͩ}UK/>'?8nU?׭d`>?iff&ѵ_"bbߞ_/XibBۄ8x^v*z_ִ;n߾cݚ$??_29t\@O2)2"I1wz_̚I%Q~b\Nq߯o-~! 'hX[gPXPurhrsq1o\ F W]KF Q/ DԤy{3>$ uv$w= 섁 b0(d@f{ 8C}%X Kxaعgnr-;H*?5Hu+S^Vq(I,^Q$Q2ΎڙLe#XBWQ2MgGQ켸1%xEDd/nF#`8ŋX0`_/2tvkW0ppmɾA'S}HXh~JNף׮YQTש[S';u~voKmj߭)9_ݓAwvը e0|.^$&M B) C)IDAT@j ek=?/I4%)^,@ix"zWDOJJ9s&fϟ?p-@>QDRnPLJp%RƮ^|F(PJ[Qc^LIENDB`PKi#:c6-Pictures/10000000000000630000002F91781176.pngPNG  IHDRc/xIDATxZY(]K"{1qaV )Y"[2qwa\( RJI B2ɒ9}o,ό=s;E" |112rG )ZpLтcS-8hFxxPػl566Y_]] )2irre@kk@ Y,cؘMeeeޘA(2FEF#FwQ1Eڧ~CiƧ8py>eZPFƦrgiii[[[ҍ̫k{{{hh2%&&&"H__(WǗǦBvvvHHK}L hnn.XOOOM|N7 BBB&,G X^^><< VWWK+::,d&&8ёx3P|OLL#"":;;ཨ(<<-XHhoo^a66}ww󶶶fq///KKK:A. 122SSST-11,ب)ccc&(#]PP\]]sDG'NNN,,,uttbbbYBnnnh|}}}zzP3 O|Q$''#Έ4E!2 (4+^;O2҇/cURR)-hՕ𑼼<;;;:FA&tFFF777, Q@賵)[ʋ\|axq u bppNy,Ddd7$ήl O'ypppvvk>ɀA'OM#[4$=??B\\\TTTff&ZȘ2˔J-2)))8ara2Ғ 8Brʂʘ$/u100 2BKK |:,,C:6ٙyD5'''b(dxq9*\K^'0==-#K#k'بn{VEFcrT9FSPh/hldcJ xA-i)`,6|>讴*S}/ Q[knWZXL3JSt^.h1E )Z wx3YIENDB`PKi#:!DD-Pictures/100000000000008900000030F833F6CF.pngPNG  IHDR0?FPLTE矝ܥ222&&&000YYY"""###www!!!kkkeee>>> ֫BBBԤIII===rrr___777'''ZZZj,tIME  .)^9tEXtSoftwareXPaint 2.7.8.1=bMIDATX[S@x"St@Q;x*i; 0v׻;BDDq\ڞpe{ DLK6?(tXr`+UUJlg&PۍfK H%]I\C>$=cb8"v, ?ǩRp__7ww}ǧ|UJwc+$G3%Y왱dltZ:$&p<|qhZIENDB`PKi#:{W??-Pictures/100000000000014700000137C92DA7D3.pngPNG  IHDRG7 tIME ,9=#tEXtSoftwareXPaint 2.7.8.1=bM IDATxy\TUǿ BF" BᒩkfO˯z7\}4r Es)E$R}`fqzΰ8|޳~ι;s^QFMILLO t}}Z)ÇdUh|0 ߟ 0uTDX=qāmmm{}O>._^ -Z:u#+V&j͛7 KRD"h4vvv4䥗^"ѣMz?(Ç'dff^: `ܹ+W??ŋ<800𫯾"FL9''>AAAΝ;{yyhbر(dBFY|*t;+ @RFI3fL&S*#F ח[T>}N:UQQAi׮j߾}EEűcƍVFYBSƮ]Çţtپ}k;w^~2:uϧiY(ؼysfffDDKKKg͚%H*tK%@WPVVp711eY//!C={600{.]Ә@Srh^ѣGZ񎎎'N]`W#F8|AjjÛ¢"8y$rEggg(r<ؾ}{BQ(]O0ATҐprryfJ\.'Dϝ;w۶m;~= *4+"-..qㆷw``_\~=555//OcM%^`âWq]~;77\]]ܹ#L:zDнMHHHHH`Y111wvqq1o -U@fţtݢsDO#""nܸ޾}ҵkdҵk+J(?r]&˟zL[uN`T%\tiȐ!r666Çx0 4n֍RhӦ0gBHIIϟ4i0D"vhhȑ#Vqcbbru(=qF`` ҿ'77W$Jw*JK\\' KJJ7neYvرǎGzٳJg[0k,J_MT*ռyմ6Ǐ?~ڵk !f?~[lYTTtA988]~~~llBOOOΝ;㸘QFm۶[.=ztС+VԺ8p`xx7F! ɓ'sf͚[JrFvرhѢC:ẗ́ɓ'ԩSn 𫆿;v,q~!C~Dz2OOO(a.\O:^?~YY7|S.3d3^^^'/L߿EL;r۷osGO $$񑑑ZpZrrR,((7~!!!ɓYtwLZ}ZHYBٳg_K,^iZnݽ{*+++**4U+y|7RSS+***h(o}JJOO_zm- AAAAAAf@ttNjL|…#yV[,_S(GJ4꣏>qFeeÇ?S!\"Q"o۷JeRR>zHRedd|g!ߕ/-# Eg^z3gBBBᵶ^ -|_o-[6@ALҕ | w_֭ X#V=z}􉊊 ){WzF G0ڗ&]ݏ9}>ʤ~ɓ''M514s75RALksCC%顸|IV}ܹ f>߄a_AF?v5%7;[zwҥY,ASm^+p?Zo+<\ vvP*33ܸ~폫W߻4p@77~'Z{շOg; y:'JjCKѺN -v PT۷o:)EYYY>XiwRvjժC[{ӔS9&99yC_YɹܥM0L]9PXTd?E_ sh9jU歝vE LFj ƖeY_2?/o_;{v޼yݻwt]L&ajzxa@aXFh4jjFDՈ8e` p*A""aaì"0 !j`aZ ˀ0 j`*q^F"+aQ*`@ *iu@4`؋7(Z^{&9柏sU-C#@_i5nv[oM·e`Z" ^0pꂚ3SjaaYRY\RZVe|Hee% f)ʖZY܌_;j`Ԅ `/a 0*5 2QAME0PbMu2iX@T0Luv[lYz8XHTr! 0CՏJՠ&^5:[fhh%qûG7a]*n쎭Z]8]i9P|W-+p)V1ՕAɚ`Ѻc`YJGh:+!tjKe8PRRlXa^cq aY`eU+H#aXBWiL끪pz#/|Zð c^7)Uc\ ?tnh`-M[{@]ݵ k= Usu ZW h?CeYty.J@Z }BhWm9"e 2G+5 ! ˲ P#1+^CeaZ5J:FRR}sd0y21Zzk K0<2vjZ# ۻm˹HXjyjT_/Vʪ? KatJRCFRv2RV)Si4#`+a%}uԜTl'ckFHiLQ D Pz,ݡŇ8T-ʼnL :h[mPvJ3=ՇʪnjZ88Da}>~UWVV^xamm/޵J,>ȯLH! ؖ66ta\V9{VT`ж\JY[#x2Ld#c\Tk@2-de wNTs,$-;P.Wӝvv+vB[_^=%]WVT^:X5[u!XՆMχ~-Ѽ2aĉa;V1Lv۳~ r&@iy9VD%*іupƵ=ct,L&`+XO2GѫUZ^]iԸp3/|q@@uÇN=ҹsg/ϟS x!$OOEÇ<QB/K˼\z#͓z':;U=mS ^[z_pʮݺ͝SK{ך~nshkW歝 =j ˰OjZv/ !_=kv+|{T_(LD#H3akiΝXjCP(;w 2#:mo#Rgd<~\ _(M"AR _(MAR _(<$&&6Xhbm A'+rEPI#O] Bi\d2ٯ'O^76-{Ο9A8Ai(T*?2Bi\XYh{K{)]tՃ?mݽۭWM[0xg޻x4cn^ޫSz{}i[,$tdf=>lRo}|fΙ[RR"ׄSݽ |q|nB]qZ^Uvvvv)63/ZdsSJUV}ԓݻz)eRL&alll$ _{}Z?p"lmm @"89 En^_xqIMUJ'''>\o%dPZZjr;|s5҅vb x02 CWKJ . ž=;;<,v.hZQm:88TV***lmmrERZhQRRҲcRݷRi˗sߺx~@ [uN`^MJE._:+j&Ncz9_ӶPQQ΂32Co@|Fmm_C&0 GG|}"ReRZQ*zU%%_jR ~ ҤL2ёnjꝷ2t]=L/U+nܼ׿ g6϶o`1ɗ?E Vd!/XLw!q{.[+|1S''O?λon$&%˽c~}X?1qA={Nmij Dݻ/ '3B.F͞NC Xx Z5"sxāV Z5XhbmU#V Z5X A BAk} U؆.Pts/yR@_(bmVY5@A} V B1 %C}77X5N1 .  Ԥ{ 1.:q6ZIwBЭ[娗C-I26Ъ@Fk\tۻk׮}IJJœ&MԩSΝ/^"fvB??322r֬Y4|ɒ%ׯ_??`VH}Z /pmcǎ3 ckk;o޼m۶U&ҬA_(C&+tѣtۣGtBûtr-ID=&=>w6Fxu;2_nooo"f}ԅ3g΄ڵgϞRj5---S MT*jt E_ꫯٳg4m۶m۶?7ze>H}ԅ3f 'O6mZ`!RkO>ѣe˖ѐSN~G3gԩ˲'O8qyu"͖D\Q;:tʥEMAtP@_(bmA j6Ъ@Fk]p*:<,*|^m綮m/- 9uU[HVmeYs[-#ͤ@h X A ܹsA} U؆.Pts/yR@_(bm/6Q6Ъ@_(bmA j6Ъ@FkA*+. !<.\H1<AjMsuhh1cX 6*AN՗/_wզM H=jϝ;V VÇ>|V VѪJyfeeV VBFFƈ#83V7*%l ƭ 4O=|kvsht'[E3¸U'%%7ƣ>tphs itb>^7jh؍MPPЌ38`ܪ†?:ŜFcn!δS4+'--eװjD"H4:,>>1 pgnNsh%pW^ySSS333y3jvBHs͡DU>}4!Y8*.,,Db !bxW5*^zzΝkW;էƌL tLݲIK?0afr+M ZyHxIK?JE>DZyu63 U7)ƨ9jcДUԭg/~BRyV]`N;v[mG7;wݹk7-JJJAsxį]<{ k^Lƃ!ӽWߩgiTU?aD-}3nׯ&|QKe7ٰn sxoz([._s>}_Mzw]NVmVL9S"Lw؉ӧBڵ{jAO T#ib&Fٽ{J5P(;[XMjDa,!=3O#x?xIͽv_$MU>s_o!0 3}_sB2Ryڵ*lIDATٳg8TQQQaVV 1ɮne)a&wBBֆ&ɤR沱aYnsU0%C{y;~" )**;jE5K$VZ4 "77BR G U*^^^O?4۰aÜ9sRRR_b^։ #ԜrV(Y>AZ]d"Ys>߯ |1ҢEr6'7lZh ;'MgmAnZX/rɍ7X###W^iӦ~:*^zleE[{~F^QQV=th4bwT*Jզ϶?vhJGG!}hFـJƍGȑ#fg6^ ח7&_ݯ_K/oٲ;w"##;6bĈN:7l̒fީTOSZR{v\H.F͞NCXHHH wdP((`¹*0w?7/?8111rڵkJ2((Ȍ-RBzz˓srr`֭˖-+**JII1Tpj*h9Jy G]h~ʢ\\\>'jJ4ZZu"'V,4U3jU3:kƨ/!cC-щ?/[E3l0F61hu--(Zq4,A*=z4}|… yq 3f p&W Hݩq_}{YYYYYYmڴijQF5BF+5z!Z5X _#jxFhb%ddd18jyRHHHHHH0~.--m54ƭ:)) R"""[uqqqXXXhB>~jXD"H$J u5rssaթ҄ HP5~i___~7ZbTYuaaabby  [(bmU#V Z5XhbmP?LT^vm4N*FGGgddTTTU$ @J'9r$44TTzyy=4nÆ s̉JII ~my"b"R'Oћ6mjyR`y ƍsss#ziggw3CÇ'''3BAj AAAr< 77w2 "R;?8111rڵkJ2((Ȍ-Ҡ3f8p ==m999ue˖[* &('=ztѢE4+++rqq̫AaLL 8:ujL=Ԏ;مp٨i1 Z5XhbmU#V FU=BypBR!RkjCCCnj/\U!Rwj|wڴiԢx_ kV VkCjxFhb%~ЪJI&Ň򤐐`\]ZZji([uRRRqqqHA>EDDⰰ&Є H}հjD"HtS70A۷_y77Vn.M4UsOJATYuaaabby  [(bmU#aUk4FՁ H}ZVq\AZVj`8s5PVVT*]6{l'J322***\ B‘#GBCCJO?M6l0gΜ!!fR q8ZO?ɓ41222::zӦM0hXsHE$8ྚ0n8777>gϞvvvGrZ(O&&F.;99]vMTM-A14cƌ-_<999''nݺlٲ|^ BWWׂG.Zƽ{eeeQQQ... WEI- 1ʘ_Kޟ:9q R_~iU^|cAj0 a";  >YoN=  =BypBRMǎͧ MP.{ +cʕZ[v*g \. U>|x4ڇ9p"C Zqkw5UK$~*Ç+WdGP&H{_nJ8n$6 r aļ|{ݬ6m4Teuf۶mFZjեKaRnݺTh9єh4 .m>SFʕ+[cywN> \pɕa(@𤤤򼼼;w:;;@XXŋ o߮5V dyjrڵYYY \nݺ5c vAxo1ܹsJʕ+ݻw7E&}1ܵkmo/T"އz,DЅU߀VmccyfazaD"h4vvv4䥗^"CvBHXX˲iiiǏ6l؝;wѱ|ٲe|Ν;^JhoL24 CMi( Z=sLKO4{{C?NP?˲[ dҥ ܺu=::ĉ[lנ~=zYQ.^H7222hFq\7w.H.]DwϞ=Gչ7Dy5k6mwܹsiiGxxxVk>Dϟ-FVM/=znoo8qD__ a]C.YZl %%%@?)Ӌ#gMQJ%ݠ7ND\& GGG(..EEE|Tz(˖-صkL6￯xS??χgE|`X \ƭZ<~;77 quu={B뒥 N_mV\#MuVh7 !.PM/_5c'CzܹsQ/&LТE7J```^bbb~&DX [5+` oRRR3 H@G:-,wOO˗/͞=[PL:U\# ~zyyy= C0dHTׯ_h4&0ix,KwZ`CRSSZM֝Pm {P,D̖lْ>4hgggP(Ӆs8.&&&00pԨQ۶m%%%G:t+233Y"""~ƍ$u;vIT*q¼z g}W^MyFAH]"s"2D ...;v4zEfb#88ĉӧO_x1!СCF*M<Ã릏M6mZnn2ڇՉ !`BFym!3GFFj^KNNV*qqq-$$$==NOrG>}AeeOQYH]"V-"Cɔk׮UTTh=4Bϫ\Bh=moWW׍7޾}[RBrrr*4Txԗ_~ihL蓒ϟ{VסC>DX \5ԩCM˲?s^^ތ3ڴiӲevڙ[T3B*BB(--}|1LL2"qpCvڵ B})i,pu!LWB߻ LNN[ '''^z5| L&֭69D/ħ'ѪiJ]&\dM2AAyi,ue̙)))>w $%%i}7n߾T*[jG!H3¢.333,,LolDD}[WqG}O?i3GFEYԩShggw_߳gݖH$7|#NKĒaC4^\\\ii;#,_LKK+))ꫯ Ӽ{ޱcGQQQqq hTDD}ݻZ 2cTT-뭷~+W! {߾}tW߿_kݻwLyĂC4_~Νǭ[nǎEc޽;nܸiӦiק|ɐ!CBCC.] 3g8n͚5 ?~EEūj4;;Yf9''SxeѿB}:u*qZ6m4D#H`낈 j =z'xzz FFF\7oNKK _|.l/>Lx՛Kݛ2`Voܸ AAAΝ;{yyhbرaٳgk4d % @JKKD~C֌wvwwweh;wիM6Vs^zieT!]3L ܹW\G!ZkyrssYmnF'֐qP|=^~-[>BH׮]ix׮]߿ϻ.8;;k4-mb9<^&uD?_}6D7DJJJ^^KbM]Ux-JŻ>}j &|gyyyIIIƍX;vcǴ͛ČHf̘qt77˗'''֭[-[VTT;5ʢE\>}>@SBq[[wYqJBoӋDpiӦuЁ7r A, h33=k֬{oٲEAW_}())9{ P..>[("պ%CJߩS'BH߾}  Hbkk+hXz51 ff̙W\iVZ w"    ֈ^"^cNS*1{xx\RZP?-sÇY}Xg!2Ġ7N]vz?H$~*Ç+WsMP8*26D"Mf՞ 8ДF;z䶵}Be7._,lVVVVV%,NڶmۨQVZuҥ}nذAT[)ZNo4%… z[=`O?\o5wy')) RZAA \FD,E OJJ*//۹s']bv򂂂۷kC.Y^uZ-ڵk*4& {cĈΝS*W\_>aD` kO~A;[ V+ KB̙#|!pvv.++~SP8p~j&W_}eA4zv֪###9۸qc``1cK2dɒy <888ի|".YRRR'xӳnJG^nRho\z5,,,888--̙3Fe43f_5F={/3Θ1~H71M V>ҳgϦ^lYFFpg@]A4Ъmllrss7o,LcDhxA\BXMKK;~aܹ#8]nRho K|MQ\& 4Z Z߄'o6UtE. e-%FKX U^^^ "66VVO>NP?˲[ dҥ ܺu=::ĉB_HzwR7Fx"Ƞejr޽D"t={,U͛k֬ٴiw}s]4Z.j_уb!2s5U Gi;::N8w/2䒅:]())[ᔞ^ݤMQx I"0B-u ,[c׮]0mڴMa?C~~>Biyݩ'Feܪh.uM quu={BIHH wdG4~N_mV\!&IBCaqlzB.hOGp/0a$00W^111@-YZ^AFsjjWZ g@"Ph44dȑzrr|r^^ٳ p^nRPooD2ZM̯Qׯk4~]²xuZ7,888xzz,XpСTaVu'kۇB a*"e-[0 G* t|ܹs9 5jԶmۼryIIѣGbŊLa߸q#))Fݼysǎ0i$Jq\||0^YիWB^uQuP(Rܡ &Kee;|||<==> :>q/^L9tPFFQJ8nhMunu"Bd2X#G޾}8B#$$񑑑Z-yרc8zN''O,"%22RPGh>\.*4& Ej"Mӏh=4Bϫ\Bh=moWW׍7޾}[RBrrr*4Txԗ_~ihL蓒ϟ{VסC>DX \5ԩCM˲?s^^ތ3ڴiӲevڙ[T3B*BB(--5HuP2eBpe;,[[۵k7+! 0] }:00099YkӫW/dݺucن E"Tשh4%q׮]kϛZ DbU, ^"V Z5XhbmU#V Z5XhbmU#V ZU/5(IENDB`PKi#:ecE-Pictures/100000000000030D00000169886D88BD.pngPNG  IHDR iQyStIME wtEXtSoftwareXPaint 2.7.8.1=bM IDATxw|\ŵϔ{ժKdY{o1Z$䑗Fz/A^KwӍ޻j-3JZJcg5{gΙ{{\h%H$D"H@$H$D2(tLzuH$D"yPgּ;?G:vn*.v{qxp. BH10}%ST2Le~O5h.'!Du4OZؙ(!A9G8 3#[Le*ST2}o3i|/Hz,Գ֞9^#ɲ tDw8 ؅~V #7;JVvsktﺝ(ST2LN9}wuwp݊P;!RWnF~?oM!qܾ!xvff(W=} fgeut$V%S2-ŜLeR:ܱ~8 ywAU5@S݋ikt}>:'3x.X!q'h|ɘU5t`s.U%HF c#B0-$D:2 > G SGX@0$zzOWU3?!'8xHZzr' V?}S39l۱ys ]Է9ۭ44%'Vc9H$#dEBc9`(T:\E0Gc(<۷;-O$M!a_2DE>(8g8+r0ƒ/>d̉hҸCEQ<`b`tuM>ؼ1G)Ä$93f? :a<9u&~ eJ9M1ƹWD"L !d:CTQ A0faYHѠF[ 0 @( D ak! $} ,~:оR$9$mhꄲc&B\13lN(w,~[D@idr`!#ۮ*@0p Un̲c51_/$sB$H#*G!L"@. f"1F@@`  Db aD , `{} Bԉ8 )D2<3' ߻&S~R; $ pF@k-d9 "( $" wH5ra@1^a`0``0Qyr LeAJ7=rl=Ν6|c}x@>=>ߠ͌t !G"Bio|Ҩ{޸| 1K_XeK91n%;]SaۍDszJ4 L2鈤q!P0}GrxV@a@ܲG;,?7*U6Q>z7"UBgvn0fbqnh}ϞO'[D"Y, &L*o`2* mğVk`@79QL#p+D%eapPB\DLc;vq.@YL0F0F ۥw*(]" c}~80mg0Jı~` a*+Z2g 1C$n &7>ɦdk1v LcBwHAsAL{g]e*Z\8[FTh֔n2@r(ĥKUBQC*Ɩbq(v~]!ǁ,]*q; c T4 /S~~AXIZ] rd8 Q$uYWfH-x ǭѨ9ƃ Q%T%StdR R芚,.TǸTRSC [Sܚ2 6h  N9rU 突L@mL?xt0hmfEVo1Ρ*L|U$2~!D0أ(BOH%HePukW:;#mBJ)>@UUs񴳳sA3nO=t{~%#welUX8{ E n۞(/ĖڭsɢE}ή.EQ.^}3 GyNʪ/bV[r !\.g8NGH$$=?)33cn4M]5M: `@{{{VVֈKIR;*3k̇g4痿kdd\d̘ŋ sW,_eA,*G6l8wΜ1ckjjw|*mTncZV$q\PDD"H$1xp p\rE<"o&:OEEXAK/G eEѴEݮ˖BXqTT>F)ӧOG:er^[ B7\|~Z lݠ>=,7olcOhŋ?0o7g#G }R)и>7~HH$dhPcm廭DTVUduu H$D2m#D"H$~71D"H Yvwi5ԜaCkD$wd*傶kh&C3ChXR2̉ D"H$C+m$D"HC4MID"H$C $D"HvuD"H$c?)3Gf@۵}{y|?;ѮwW;ȮH!+% ]8υ26(yߑ{p%]p[r.\$W^zaYN+/_%M%D"$D>㕗^XuPx>p"$D"H$H;I"H$dp> nF3X28F}̝ 'Bőn&ICOܟ7|n~^ѿMtG}OBDCL!bW17?kZZZ Bc4@`Y~OӴa֡SU)P`zIz}}.pV_p]{>Ɨ?wNz6n}ĉSBPfQ$"SL^by6m>rXJE#.7%wI2*v!v4Lu&Mʦ--[Κz[2|c lTQ#/()UkێusN ??{VEXzRs_|~˖hljyՇg\1c‘o&j@&#V~޵\~HV0V4omWWW G}-oƆ'Oϙ5v ],)\!H !0`hmiIj a1U! fqJ1b̅O؅AO—RUcl&c̾G4r1Ɯs8q-Ҷxy/dgg1ӲAܑ6\=v-Ժ~LshRBι9!1fq΅c@"F&I D֎R ĖN1feO3γF\ɟ3*!|4+o|ԫPx)RͿy[nbI7je/kwF0Bq]_p`5/(q8CHGT7;C[ZiĒeld0[ZZLL˕j7JO-.t>=1dO?0~*BhDDTy҈4h3 ',$;ЙQl[iY ]Y;3.KUbUuY3O>ffּwtyQDccǔ秳*b@]1Ɛ 3&@so[±8sE%%@ptƀ x0 !%+%0c.+(D"=[t{v=Ҝ..̚:~BwwLč;&mqin**dE"BpUU5 P 471RJcǎ,.*<<̔(.yFD\J tI]Bk']Y)V|_|ȓ' @`uW32q$RaտQ33f?|~V1߱~շeQK~qe|c@c@`B0Hq=Աeo666wA=*Bm?P{rׇT5Ʋ 7^RʸFWX~AM`wG-4~PD8.YǟW;=""*v=q6b|N+ wuuf['ayg㉉ nQr̦j5"X<$t,fwkniq-ßw:~g}qNpA0c !eQJ,r:5ƀpq&(AB@-JZeL*У3JNJt: !e\.4mbahfcs29Ygkwn #ӕLዳ!0(!a;NƘae7.US>N6XS[{G>l===;vUV6.LUUS-q+ B1кc#ۺ ]z/>JaǏN8%oeC߹ SKpX&8zO.^VotvkQ&Ln ʧoWQUCgR&˥ȈmCS:9cLUj\A)eY1,*`!kf&\UT_m0uvvηvB==gfge[b%3"Vޑ̑i뇢Yajd[|fF шvMZ֮I/D:]ϗY2~2:M;j*jQEh\٬Mh4*lk=y7gFJB1Bv[e!!Lr8wΪ:T0HOBur'kQ0 (04f{_ıydDϜ?3aUU4MSU533ĉ&M=zHͅpΞ{;?6`ٹXSl'`PO\0N(-,(IEЁ) @HZp{/gl/' /7st#՝O^!8/,,8zXww~PݔPι@ j IDAT=GZD|>tE+}ұcSr !%!=LbJP=@U@p U( A B0h*U؟ IS^JW ƽ#p:-t]X !dGޤ{LrG__wι`FwݶR|.9s&|)Sح3MpXr)GBm01G,!UUMӌdp$ToFSL##GD\b%MM͓&NHȴ(׮[wG>vJ#%Bv#pI},`c͚'[[C3 'Ǝ-M=P)q$vLaԋ \wZ5{6ԆGiXz9'`sf~Ք" F~?##Cu;v2>ZpuwFi?ޮm[r2Kfud@BB1(ɨkNNr8p8lY̡is;\4UWWysffqr~h{d]E#tB2uXF}ݷ17v겥JE` b "P #=xy9nutn=wnfa1.Rhsenq;0 qPJUU d@,ga9ǜ&WH۟Xߴy3<˗www=j8K$w'-䵷Ӧ|2,y6j ~ O^!X4M+VFc6ltE+P0mki.Q\33|myG(JzެѡN܃;ݡZr-,[~RX,bXsx@(l nhqȜ\`,Dn~n4$g›F#BtuuZzK!F*Iֽgn;zqٲ=}ٳ*>Rd2FAq>+^)ɦKL F!YYY7|ݺ/K|no7%aT^KWlcMg7{䇷vGf}sq[*",~LժHuбش3SbqT]ȪIc/?>@0yn ˗-aMS#ȳϭITs7jL 2L쬬$3ґbI&>k8dBb -8)3Yj*1 =fU7>pt+F{wavO)\Tb NGHDEU(!" FBPhN%#~׼-=cGg?EmN () $j?k(9YQQ6߯e99" ɞg4;nZ٪*Ov;zzz D;vN2agΜIN܂K.o19 o:uO9k'ٺ&gL=kIj2^T͊1aeZBB-B1FcQcz[[[MM-tΚ9^r9 ۟DR+lOR혤/(Ac  !NqB8[-ۡ%{G/#{rܶl7ROgc'\y0ټoxg=@^ k Yvfdۛ $=?H浝/p+Rj9=߱kv20ƌWw湚[e}Mj_˱~;vSa4$%A v$u񖕍=jTGGGgWg$e`O HEeg篼Gvkn.O+nJ 2o&LNqu`Q@@(*VH*t40C=a;;;9zUh0}L\n;8Jp UA8Gw ؠl=3")АiB`1F @a FLTLJ{^,15(l8c`{Ae7C07'XLP;SΘX{ۡ)I}/fD(vGzWXg3zL)LQ oZtB(Fʙ\Cmݚ"bw^uG'ߢDsf[KETnGn|.7j |PN|$?g&OMm5W_e <`m^ʎ׽aPU9gFUv>7@F4D "'?,3x$vfϼr ~ ߟ;v|}ьj(!X4 W2/爄ÌAL7*v8.eM۪V%#Q+2SK(D̽l]% QD ޣH ł=ᮞ iN\ЊZXCDp"@A!ÔB;sm2؊e/xe뢱.rl8IܮƦ&1>mCs@mmݾ&4s.Ng]}}f @Q>iv{G ސ=z+kgu7V]4uF>7DQ Q=@riڱ,viU/i EQ-fEѦ]`ƴi2l``(%i"dJ11 p:eq!Lt8U! @7,M%b È 0 Bi0BI.}I#@ejYBz;Pnq;0EP!МrO6*Ml`-zִ_=z1 "=V[s#u>εNvTmG,K4.8 NZW;Ї}޴ݾ$g*Bl;#F4,(Ԫ;؎O'R2nfeY`OJEm-eʫ3V˱'~?~M~+UA-W5wfϼ.@NA 1sÆOȘ[c#@d1aV0WTQ7#WM­u|r+)EfEÑ'S7LLot{޺W4///է4' "#Eh[1",n-qdus.\NE H`@QB0 KS)g NW~,;%Iiߗc.ӾPJJ(Ƙb(&Yo9I3Gy 2 AT5h8Yrt,bwp.rS Oy0vT oLT9ܾ㐶D ;"3ߛp?tJ0+0&Y>m 0TI͋G"Ƀχ/Zƞ14CP[{GSSsSSSGgG(cٳ^8t 2rs򳳳^ѻ2U3/ɘJ#qej2ӭؙf7l=ۊ/g8kDu2@(I-**z=i!vWt8~wL;s{. ˊzճR9]SX-L\΃'6}#|c26[WOᬫ߶si9yɿcRysrsΜpYյ'O~BEq=551]:e2mIgC(Ngh4wߖcwEKC{{&LS4ϼF%\PaaNQ`@;$ tݤTn_ Ի+y6lܤԩS23mG؎Y(Ȏހ#BKAp9R0UJ 0ƈ R;@IFJJ%iiIۧ%#1@ 3+T,\^:n2@xYÕ}š-)\me"NۭCB%Vq5UCmoݞ`ΣR70lUz2+{f @s[n:p)w|sȱk ._6s7.ZJ!BƢojq lݖ$.X;Sp0Ji~v-{>ɺz{?%0!BGvvvLڞ{\}UW\G3( J2So'ٷ]{ځ0#2D,fvcͱi aȷ5]G/7U7FwCqܣJΝ033o M׽R`1{)`.8 a ?F U@~`ݚΆU ˊ|>o|x;txug>uoN-vLTz_/((ϏFG1cq[mkjj8Fq\BيN4bXUp:Ssuvm߱ '[vdZvXݨ$&G}=2ŷdOTly?\L %A h._Yj:EkN'#tX7k?[}Oxz>o dJJǏ/#m$%i@0q A<;6X$8 B`@ P `⊂!4?祝ⓢ( `̲/x@7ҡ1JD!, gq-pkϜLa[fD$_A|y0w)JRzlc=-p"ωڐI|9׷ ]sW|p#ONJ{Dzwdmܴ_U3cK xT}k^};?wGA~'^h &v|[fkFH|Rbgƻ(~GmI`@;3;P!juD 8/}sH$,ӈň+Z|_+o#7''/`UQOƄ JJJ>9fW&\.{ So{RMoK-},-31++37BwɘJQ}ӦOw߾tjB1=rr{UU.9qr/_U-b-MQRuY1fOOPxѤIs0^X ᒅa/= u/ZxiʞB B`À`~ h& #UQy<]ҌtnRxm'19{v .vkw---цaRJ32,i7tݟ񆦦E a9!LbfLx?~baGZކɇkhQ|/?YZ:vE+2,xӖ\)W]y˺7n_zJ |u %,x8O⼒ {<˕KKxbTETT3u UQƍ+H)>`1t IDAT=#(m{T]v5A^Q4SXڻ:?#-/A}Yg, $qkI3֟ѠX4,U]n1 "X˂T՞={n n_5CU{-T!s+yǺjc 2@F823wסiIJ) EJ^>8XP 51h鳳2GA=6oyjLIc]}o!5Ǭ@L^P\&.tK}>#FΝ3ǟ(..4Dc=Z;vҖB)"tBIk2 K~eY*y5u}@ =TlZVکVZ]h( VŁexƄ LO>wy%'{.NN8f]cm[IZ-r?/Skm͎"7ROq/?j揉{+ ]ܺR"iT9 jz7>O?fȫ߸f1i4L\Wr]\ @@.1x0YYC݅p)>2}_ !ͬJ]QARNda=^TCa8Lbڧv=8lm6h=QpPw&S{;+Babҥx >!(pŇs?(,*6: bffy6bwtpPkթvlD6 %:$1dVl$2V8aP e`aFWI ^lfjb``d2[؍QH L&]y^w7[@b5=lky}J` &coi<2gnAI_=64wM ҃tc#~Ee%$J`_0IJ3 M[Teq:iak=G@`nYJv#z+Mb } s߼uo_E}3y%A 3j wREUwՖ!o;;lF ^BO=ftܼ*aT*P(nn}@ 3u29GFhR4//O&5˅ů__{՜4,xFMA( KDb1T8֜c{쥚s|A55 &ST*%iHoo?~> ŀ p9Sͼ杰АƗc0tGG scMSd2jjE6vv,f6"nߏ~u:Ԍ镪98:)$5˘DRIB.}5~PZU?zu~{\}[f!s%9Z])3AG{1pޣǏmrض<\0He{\;e#gvRI8@@ ξ蟿\7*뤐zzz-NAA`Hڷ!{`Ո%),K?wOc8oK >߈b~o#Ҩ063 DaŤR1dҨTH$T׼xQhuq373Fn3trԀݝHT*b.Fhlf@K~%/u4$$TZT"ОUܳk3 E`l2ax%29`L?} U 0M+)}X"7'g9'TIfiiD"604`2 :eGFqH$335eZQ\ ^y#v&l@mcML&B*FQ*%ٝjNQ19PP)4h Nvh41F,MIHo9-Xb99⟼zzs$С{fodp§iŬg驏00Ojq#-[ʮ FWx{naۢ{kNՑh֞DR,,DEWr{ό}MY`nf2_JeӌXbw/'>FNd2R.$,3>!D kE @gb¼' sg5ZكEBet:PBmhoVG?Wðm@8:X\0C-8xry2yB~E^oH> xI<+0`4gX\F0ZVpƳWdK= ,{9Yx<}=ܪ>ynnQQ54I$R[`l+>M*++3eՉ1 ].5!a/#XkH\ Zo**JWKg0 ;zCе}o +0*ȕn AxsIMBa=AP)4 B.tѨKǚR%3'S2+-@I tz=MqW(pj)I/H /8g]-~zZ[U܇+ /]N2lD{tҝf#whP0.[C},,u԰<}(7w:wR}-͍ [ca!]ae; p2634g2,fb14Ntr.Ys{RW0 Q]Bi}}rgVm7c;uEr{YSFmg5c 0lml._NH$8 SSSQ`n%ɂW7PiEŕ+!gTQodp̫nSۻtJ /ǀo12oA _\qOhfyϞiv AD -SN,K.ӨTDlb;tfs "L~#٭`k9.@WͬoǮ5w!H(ohDFӣQi2=\q\+a (Jd3{̞J*\5*oYfsI#:Ng\]=;5[ +}ph-){w1D"j.4 k S4@ DWI@ $6|sgڴ;l6@t @ S33+kԔbffm>* = @t=" &[Q5ԉ.@ S;Z@ N5TdO888?yC$A .Ǩ#r:DDƃjG@  4!Au_xs@Y@ $@ Az@ D-(4ǎ Ryߏ= $#/]r9A~VvvpXDu߁ߙH?@'G0Djee~[>vd}O5{1cz#HHpv岥z@Vvv@PXQ3eɼIS 9ةvuݍi!?=i`XȕTRO }=ԫLL42lWkԞN[8w+I[W;w>k+zo ݧvF\LH\ggΞ3>i{;;V-qBJ0wB$TSRߙ:99e+ɩCCͭ^~t.{/e IݽEڽΑ,+/:w@c@ԘUUBAyy^vĠd:?`ɞ>~^g?fێ1'kOO#"# W\E.^實XJb媫G Df_.'$x{I6o٪,-||?x:jm$a#||BondkB]z={߲uo@!idegn}_`H3Zе0eQcƷ٭m'aOO _XXWS= SSBT}xuk$] KZewSf.['~|eAA'GVC9dp$y>^o^U*f݆*,,LL|6\uMͻ3;rJʚիF7s"@wGFf2JKT&ג/M8 ߨ`Nv󟫟}ќ5>ؕ\No쫵__8柫K>x]O2iℵcZе0 %%%~mQb.''=~ӣo䔫w V,/#Mfg5d0Lzb{3yHHpK!|rrsK@uuuJչ 2s T]rժ5~nS'j,jl׬^E&*2@ @Ee%Fxcr2M訑vj1͡歴QQ#`.%7;&>KJKdX tg d`An7zQo57sѦCk\bmeERSR {UVUŪk : bʪ)fR<=+?I.۰qG{Ee%J50x!eםRۮ3@dzUJ3`#Y )IQ EEE2D t:éU9U t9R(}}{ht:0 q_[n۲uC _555dSaA9wt~MO40{z@P`M LaaRD"a2edL&Je \Yؘ?{Vը F0~C\U%$qYY/\Ѩ5i'AuS2+VB@'L\BC_d2H' yObv8jE͡ǟ4~N&DO 0RS@>^a!5= ðܼndN`̧O|ժmܰ_E*3ׯjǟ Օ|f3 16XZZx{u-e]w.&l{2o?_şf޽zx{zC# Rه5Y or]G D\/7C't60/|ZQshpHoq[]#xyz r՚-o_? 8HeKkaT3ЦC0VQR+A  =vⓌtiٻwo ot+qNт i!Xz+I:lyjO8(hqDge8[U|Q;wУtpt'!+QqbO&,+=kS 2"m7NWuǎw46{J7'!TbJ]X2(`ƥMV&lk3 ڔm͢rkDױcֲ;=wAIQ^"'!@"5_-K~@W-@PV&=UfvJߩ]E xNk%Z5?y9q/dRBt3h5R)Γ,_Ύͭz,gT-PB Fsz+.-]MIh? z~Ks;TTuѣOvIC?x+3 zk!^wֿ|Q ޸7ftyhm|pm6ɔi3/_IlY7~T)*?{HGK6lQ/ˌ c:WRC{QF g6 ~i٩rC͝$C\[T*Q9?X,Is?8w5dއ{YwO{ o2a ϳ+i! C0wk'*KnݼDz/o/o˴?J$%B 9XNqn/**-jŵ@f-6p8O' [=VZVfgg;nj{'|-o2:j$N?u6onsBb_vZ7%$8h]1 _'N:9:u Y9';AYP`k֝;P(FE\rs,|0c0TJ^3g O>]ܛC}[*iP%hq0nDWCpzݿxwVDC'hƋmY#=m[ IDATMUR? 0XTbafx-=խIZhA2!J-[m>0]{>s33~tiW|}7Kjjj}O~GG;~]˗-Rz=_ŒML[=Kv'yyz,_TJg7lt6n}-~0x6d˾$^uIdDݻ}A8YO[P*YO8鈮@k&$])I.] IS] ) W OСN'i)L$8APL8uJ&(F\.7p1GG Ubҥ'N''ѣF«dgk=iH$ھ'+KIƓ|" Aʒi{{ƉD|G_wp8}54~lܹ~>CG޻ϙWݻw={?xB!]޽׵&z҇L8fz }e]Pwy7ěIk඲')  EBB/aT*U(RT#뚊PPً<2b3cQY*8FP[)nZhW4^+OѨⅿ651Rodl iBZ̥w_2a=UTɎrye?,+/{qD)Fγgd~UUU^dȈO7j]jQ?={rr PVi{J.ho8kM mbO"[ YL;6=8~oT*"h_ק:,誼$2CCi/AIfe\Ŝ 9zt\*ɻ"}zR7ĴL)yj򁆭AjŎyH}% E,8^V^ek!ologO| 02喕¢BM Mc.}j9 ٓԪkVdOBޞDD~S~+7:x4qiEYEQAƩ+ct:J9 ðό}/iK ^Xͻ܊㌳/rEWvEuu'{Ds5ǝlٺϷ/vc5rDcaC޽z[{I$Srd233&'U5rvpD_'N:gHHP^ۿń?֊rsQޱn7^DUU&z{6B֦@t?(n~~hg/WPMh`=\y}y&NՇNo|ZLFl333)ɓS?|Ageg[٩ oVԙsbBзzx4ÇP̈r֥=)''we *{yIURPX*SUfrϟƞt ̚5KGS  AAA׮]spps玖RuZ8d̙ .ܿ… 瓟_,&b?p0z!# Qi ;ulOzQZ52WBc^ě;gm6 \NȤDuN*jT-3666&&VP49hjL>jn ˳}EC 1qҤ?־p, EEE2D t:éyjʴT*jE"OU*:FP(Y0]^^&'O6N9>r8nٺm=6|W34mO"Uޕ%/] 且HI M5uz@9EV M{ϛ7!TBhhd"HOOO(x\պ|vP(jjj8A99mxz=u欪O?!-8uoGC>^Je[`ނk洉]mI + ] 30^f,}C̵di(N&SL:ɩI)qߵkoܸ/HrBسgT*d 5>hZHuD L=~t6EYl霹ٿ?8wcNg1 ;y̤_v~}K$>hM~>޻3/]~rB,|W M]mYAaE<Ȼ9f͢ϖhS~7!̥/$$6'5+VPM3-]DvUeJҨ4L&KĹO_TI=)r#FL:iK=$h7AOJ}g Ϟ>jM#IAUOd8xK8x?RӓtލJ~/*xSS,R \&%+Eu%ZTsgbmJ=zĩuuGttddd$~{QL 2B*VE`m0a >Ą`plgK3K{PT6d:PZT?}\\\ c#ֶ}v۳@ 066fȘ@ v.bwtiO t:\k uuu{:u*Fc;011at:n yGۓ4k,T'HRJe0...,`4@ n΃ŋ쎖c{ ad`$B #ncFR) Ґ! YޞԖZVx14US%j \" mbOB  uZN2 - 2w;ZD{9fMR?w/-nh<%:?yPUo;LX4j\ZֲWlw:۝@B ]F4!z!UC&zEMGt?J}ǒ%K@*޽{ҤI  ϟ?`;w]gMMMd_fN%7ҐT5HhR-kA7T(D7@Q`dddh2Js8ZrYf?~?~ڵ=zDFF&&&zҵk/]DI桡jJRːd/*zRk@InPZC^FСxZCS6צzA077wُ=0~*..4hPTTTzz/hѢlܸӧǎ+**oNe/_|ELL $Q^aÆ;wFFFΝ;OJJz/011122233M,@||{'Fl<>>~֬YFFFgI#Siiロ`0V\^YYokk۬Ե@$X> mgyڈ+7wH^Z4}ุ8g̘lٲ mݺ533Ν;ӧO߹s'^dzP(LKK6lj#}] 왝]bbM;VPP`iih"Z۲e˘1c/^̜;w7|3a„̏?ɓ>>>wvsskEyI:2G ϟ1E3a~hn;7F jPzЛ8QHRWWW͛wҥcǎB3g,X ɢb8O><<>>$$7 I8ڶxUuyӦM3fHKKkG]:#o]Em 7YFyA!:?I999T*А<`0X,It:`d2N1 ~6>/|2ŋȄ[[[___*ݍzP(T d`fflbԨQ>>>͸S]&FN$[SL̴3330t\2IZ.\=/DBfܚ 8Ь4 W2%됙ԛ{#+J򰤤Drx<Ǐf>}:44L<899ʕ+aaavʕH*G*6>2L*f@ u~]?i龾YYYOqښ gϪI&&&qqqKfYXX?~7eaÆڵ bٳsrrt\.k T?M.8 kRgP(4C6+ȄP(lr(;-..600HII!Wt#k9,LwCRUBٳgΜ9NNNA 8p:e2l֬Y555r%..N ð8WBCC@vn^z͛7Ϟ=j̙JڦMfΜxttB󳶶>{ί{Ç8iܷo_uuu͒JH ^y5>bDGG+C:;;[JEP'=v!:g,wϝDuVSi]Jٶ}sqk2#%VVVO|鯿ZR-\֒ &w|>?!!AaСC;"d0|𼼼۷o+ nܸD:*?qDfffVVֺuJu9%)i\s[޿sۏm|IW2AAAwwwo݋9|کFֻUWWRJJ̙35jZŇ B@x}??fqw dh%ބ@u%>v9Ŧ>bĈ9s]ڵkgΜUj9sE ۡijjD53#k[Fjyp?m~%d[d&Jj۞ Z-ڻk_G pymw!]ؓ Je-MG3m> 6YvvH)Cws뢳i{qB*y-*M]]-HGԅ\lɣt~ַy=PS#}ekTWхЍBP(e@y?!+;;8,"[P`[P'i߁ߙf_b+BX\GPX,X\W=ĩg :,0qT*T`0bM8iۡxD ȕKCLn,'8RT[_-VdU_iS=b+]/]5f<8ϫ@twأ)35TGOucC>|AJ<)KGb@ԘUUBAyyJevo_߀CnG :Rj]W\v)08†$R{g2֦nII/rB>}o6߰qY`يVo^?q,+ >^o^U*f?[túW.D"efm*]O2iℵc rƘ|~As-JSҲ~}&/s㵽*(oՂF@ùh\U'M}_3O3^J8;hșٟxz8[eTڇT uuwoΌt 9)tqj"\>o,0wϯ mr] 'rHTZZ{#n?zH.#&ěkA}b֯7qD6SOoL6v(2]RZJx1c`aaxRL[C:%ꁽB̜>y b֯%떗Wdeg eמڜ:9? tH>ix5iIjŲ%,k' 9dpd7tI* 8DP]]~L7ΓO;?`ؽz7fxR2}pˮw(U+VVw -@7$%IuMn{Ι3'55UYr"K>}6tMh 5dZݩ2m AW]Ng2PQYIR ^eƫk% ]o?t}}}ׯFrozRq8޽w?(4,|i5HCBtE

U=pBC~P(ʳcc[ Zaةg Eo/UckDT:.W(bqRݼ6!zX,f0螞5h'~ RݬwSc^o~s[mֻH01cos3f4RqLxbmZ`0222>|5bĈ{WN;33p;K^2c;Lxao 6xҧ_@F6ǝ;@?@}=?S=qú}ajj֦w~!ejm2aGbxE >6zhȑ{htˠʊat777PجnBŽ{ ''ͭ@* cʕљ JOOW()))?bqdffWIOO +--3go*CRRfc $_ެ)Aj:vZ;*Ky򪒕Vi+7z$Ç{zyu /ь!N Z4ufgK2o5% !r6s ɩmbO 5Vc=ZiR:xQx<lkkG@qqqPPPRRݻI#e ;\o߾Ç|̙3?~| Jt/=A+(F &dD udH.3Ν_ouVtXYYLJdR RRRxʟd@t-4Eke]GItM , сڊ-n $_NRkkk F"LP i r+f͚111 B9qF2 Ztԧ}Gf=:[W+z7rꭡB6mڡC:4m4r*@@ѦMvu ӦM۶mǏO<# d`@ *ړzokf̘IRϝ;G 6l׮]k׮ ,/Tt\^Wض-#..o߾ HrBسgT*d:@9 x)).hA6OJ@* 4NNNVVVdٴi̙3pT󳶶矕ϟ?1b&GyZ y$w &&&sݻ}LLL|||DDĮ]Zu}ACb7.Tm$Re{8qB5IzJ*wJ;ePXJJH5ڈ2`H۶m۶m{.>eeF ͢+)9F}36'E +2C+FněBqf6:-h9霱[J:lkΒϺIu"ݘ6ǝ wΝ-@;3msPmx܈N5ƞVW;wWJL/@ $!zэa FYZZ޻wݝTH%޽{NNNHOB ѱYFPL&ˍ^jգGTzzz~'dHsl o,hx׉TҢz=ItcOhzzz`̘1rqrMLLhV`@ mR7QmKB\Ѡ't>@ ͠HIB @jaeًF,I$M;OHB0e{("'"hZGjZkn8p " 7{\Bazޯ9=7y@ u%ms@ɟ@ $>x@" @I8+JT*bT*U*핆h@\JzUnE 9]=nXVQ]ZWVR()+IrJ Lvq88)pxBd bƍp8,qgPt3nQP>nD8?;.6&>.VYwwOPmnݸq}P~2W 0V'!IQ2O0,..kLQ(rJdflxqAAp8L&SϮ:v(k*=6--mz\{O@ 9'woߪk ǓR\ en,6/ rD"\.tr28;88/P{ӡ Y# 5b} DE+! F^Fv1T\d'2CB{nȐ!...-[22E GҶm#GP3E!"IF6v0z7R a8r^&$f"Ɉ:iԩݺuKNN~5 ''y۶mT^:o޼tcN7ϟ?^5wQ #}G(m~aA4Gh4r8ݧBh۶-VTSNNꫯN:gR9rH=.=zN_x1::###}}}J1X4h\Ѡ E>O#Q}3? ð+W[HpWtlXXزevJLLޒ`|&??7hMR(**5jXiUݛWrj\9$} APD `޽k׮dsYlQNW)S5Vu.Ϩj >,k+zs#kh1٨O }C=ǭMNNֳ]B4b%x`|t:P_/N(-wtwqq\.W@b8v*Օ nooQzY=7)4Æ #ŋɂՙ3gtWԷxR &r]PQ#sՇ0"Y`0LMMMLLI 0IVVV\@j[o|&q7Z}Qe#Q}`0 #JKD%%y BryFߍ`oÆRSSɚf͚M8㙚~ !_ O͉N$))^{t\޾]6 lljș:eu("T-MrJJooߤgL|U}zn܄&%EsH9`0ƍ׷o|Hax$CA?p`(].Y|Te1&ˋ.Xۜ8a؏TfMHR*Xl}Jԕ5 ' ߸\\.'?SSStR@z 5Iύf A$A/&M=v$0dNȜ;aReӆܼ,\][W*ko|6j&9%_vۑAcɞO?FѴ]UʛJ\r{ǧ+VX;w.FF}U?8\{0z">Z-?BU*UHU*UC Htof}t:=tjpԕ@ظpʵ!S@(}-:Zс#\ueԨ 5;(,,JNI8Z%T䪶+QWHbՏW*ϩ)mOBOҽqj%'H*'4ֆ(JΛ$JD"p8eee<9X[Y:q:6EU0ftЙs\[kЍ*J\njjZXX`!N3aCUdYXXuD\./))X,ʕ+1 ZW3=}W]  յ_!Q#ܯa{0h4ڹ u?p0 ޽SiTan޺}.BgڡE+V\ Y. V5O0L,ݺuk޼y֭[j ) '54 Zцm6?l[KK`0._8O;~~}[Y 88}xxx OL(7 F||W.kG!!S.wԬچڃII$ 6׽[^s:  &@gt2MS""D]tH'L4ojv޽۷+UgϞ3f ><>>^ ))cǎ2XxgH*5%:m5 Gum P1qI*hKMMe!!Ut;(oO`hj)T|YRLfW_p[dɌ3IT@v(w9?hGhuV-_j2cyvb IDATOq\.D"(+0c&0g{k 0 JF}LiZ.W\o^zڵ۱cGAttt`[H$fffT4H=,HR33׏ہߺaAgKLq>6vT}q~v<mMWGuswkG3jpGhrrGidg Wo1$:njj&NqߗY^PpssѺgO&=x`~@QQѨQTLbX,R5JKKn|>U_k@ =BէIT^LL8MPPЀT*X,.,,x捫5k;ft dz&&Ga0tVKrTP B&SuPn=@=Ȅ@Or2UD'%a0G p\\xYYY^^6mZjri4|p8 !!! `0.]"kݻvZL6gΜe>Y8d2U*T*FD 899]x100ĉTn 1@ U=Bէrt:bjM}#spY" jooOȚM68>qD'''pNͻw޼yݻwS)cbb4cǎYfO&M*u;`\P< @ #=Hbt:NSɐrl6d9ǫB%Μ9^Jf0w!ˣG& )(a^:Qmذar6Xx>c@ z"t&@$2>H'kЏ!2=BSRzUS[wfIc@ z"17#+6{?B-lZQ+jz>'Oz˫{7[yPPX8nݻyS$b B ~͡7:ITZRKnV r#5D%5YTx+œT+*+aU*Jh4s'{92' ˾K0Z cEP&#W0:D*r8l\T)ҩL"ŸQB@fv֮+J,_lرZj_}۬y@TJ6ӧǕ˯]1j67ibS5?='̣7㣃Zhp$@2}rrlll?~A׮:v`#0HTXhC+~Z[{2\/[ah'Z`h]!VzZ`&Եx3Nmuׯ#wn^# )`^KKu C&: É~;moݦYqq񫗯;w4a0*:ϡ 1W^ML۶ض]GVm'N˗dSjj*0X WH?një]:u:|o[YY V?Stk=Co@ 18C@ieXbǵ-p.KvN#mERPss8f:v`TLq:T'vq$0 ;to~9yy%Ok@%߫׮;޻pfN;W&xk Q*/aZhu@ DL>[D) XAW3-h@*ݺszRɿćo@'>pʸwOi9}sLJLN"m]==t'w=q1rGFFjٵɷyyƴj۾CgG86pp@qqInionkvwѣr 4"T?sVԊZQO ".;蛃/qmșCO_zg.Cie.*0WWG^=&۱㥷G(((y8c \Ztp9קB-W;o!TcL?NۨzSs)bi3^>{&9٣wIAN~~KԤĦM^x)&6nxS&uSLlukIc0|~38 ߅whbтyIR]sǧqZ~3_yCyI,sIp?w)WrLP?q6cu̬>}݊e]Ίjߟ2 5P>nQo5j|܍ ZDL$2 Q&I4.RT2!bGLY1(K4ǷIo f gM<)##Fȷ88At: #&<#ySi&Ǐ~4fXLޥN`tMAŃDl N@*>`oO0pi  _^Eq4hO8噞׭Hff/]|嘩)wףǎ J|ʭKg^.64cW;R='fn))C q|҄Ǐ${yvv}F^˛!Lmf¿4q𠁃 ,P /@Khb M"$2@&3K0UJQ:`xvnjM>U֣8&&&& R8N%y)Io*GpAL̏:ɜonQVj*.'ߒ䔮޽ ɍ,zӣ[_euMm=,7se|Sm3,\J@guW@ ]>X  s۷]M6wnbLMY8 llK...;q29K"u&pq?wz훷n'/qV4? @  #01A pL Ui< >Vս^IAp Q0X,&|"* Tw"$٧OF p7kV-L# [MA[O]V*+ʃ{_?j =} bێg̚}qR)9NHdQ"hƬo/ѽۋD?A9o niʕuW<0iIxs|9tD#blM'2ŷPHB|p(MYQS'r&Tt9OiwvfF ρkol[AAA[Z|Y۶m]ruVnץHyلYOM'X FY- T`IRQ35 pUUTed^8B;;[Em: p.dL>J rR@Ak{Eq62&6neu|ai4&{r;e,T*k˖JJR.3Ç]yb?jx۱C{\q۷8.#prT链}SRz|֭ܽ]=|h+} ] XXR]q9w)p,-ȑ勿_p^P0D )A D]qzy ҹpidK;4DΚ_:8 x|.ӵ+~]_ty&\tz^];wd@Vl!e~jBdryΝΟ׶iSrxΝebmۼ q޽J<>rn>dԫעG9_ ww"N[޽\ֱCWO'Ou.^aӘсUݽd\K$A6 tڶ1 hױ˱/GS._ڇ@ fV.'E n۱巍i¤R)lܰ_~mO+CΙE"\hZuN'$G=YsՄ֩8g>y0~|G%nɱA۲~JDqFsw7Y*LTo :jm۶rZ=!!F={|f#煡w@,. [>[7GDwD-ۤ&%ZXXP?vμw+&8&`ȠY3g=v|LNIk_LۖO7kw<ouYY~_,jgܭ"߯/]!迮gE7ozސ*R*q~q>yKIQ3 u6::u(93#% ȕ{?\r-) |}{_]TY b7/aXHz9*Wq1q8F̛ׯ "I1R{tTJ Ϯ9qjݚf'asYxդ-߽yAhَ*"R"*#9@TK>_R[Z~oɷqs[HQ tL&ܼL %%C :%.kJ A5JT*J\"ä7IeM6&ӤEW}V)/J$kռ]_ gڷm}計3';6HIOIW}-ZkѲn/?hQ+jEux;t8zȨ^=+:D$͚=g_=sǝ=JD"R X[Y:q~;j: C$}JƄ\E޵\xiϟumR:%%>kkwٛͻtoǶ aWyvv˗}/˗,a*>OyIq1CIdJX4qN3\s~R-–ĄwV4z;F@fH@ÆQs/*c][rƮ9eNNӧK.vƨvlܤEVVwo?L:?j08 th"9%NF vxY$UcPzJkfmjj)4(/@cwA&@gG9\ąn:s8UL6_GܼFR^'9%p]0Dr߄力D*ʽ ;[g0 31axw I1d#EQ痑qvơQD?"I am?zqAFhѼ $u_u}6C3JեR|ojjZU Mӈ- /!Dlߺ˯mzZT]SeY G$:ZK'}*3ڣT233oG还/-vwwoR >UK䨜1okWjסfC Dy6tİuE=sI$]u%)=E҉'ƎKWWgdn7xF.BD˿!s3Sk@ S^Q's~رc?^VVֳgOٙ/]*|*|sD~˗e2aƺL\"gfgk@hi=|gfddxzz94@ uOBuImnӶmۄN:!l5ܜ4l&xk9a8o٭oҲO> EFF1=z{~3Aƍ]vŋ?22WS4 w @ H\lL|\n.Ɖ'3&&&N5mz͙su3X%[?Q(+Hp*= ɉ'6l 1  Lx@ tϲ:%" IDATNsW" 08ؑ#$J U6//knҥBp}.װ-Oڛ?+ [P\\lggϥrJնm[ ۧP(J%h'OGDDݻvZL6gΜe˖ӿ@;!F%z]U))g}7/'|nfOgSި`*$yCITTn̘1 ~]ݻwo"Iʼ̂QIXT*2R!T*eQB CT2YLף{sOp ]PRR ǭebUc9ubUYܾ]M0{rz5# :CJO0-_I=p~?TUkh$kþy OPHĄJ:tXbŬYr9ñm<" Z֍k@J AɷJj n߹{ /S=站 CVprZęS ӻ6&MMM#D9U#4aK/ǎgFF>hߨ/&MI?A&?"{-D 4]5DidTPp8+++>ߨD _K "&P(ݼ}ݻ^>"b2ɵE I ʪL&.+drp(AD֥z?vvv]:wr틐iգ䑎\92QL,H$}칈wJ$RM2tSO6> IPRNs\ 8SS#27hca: ,-1 +))%RAA5(JDpxӞl`P0o.NDf9wdn]_ PF˱LLkߨL> ,UGsL&ǫr'p#@  sss>޳d 74`0hsƏu?peS@@j#2B.̬{/ߦCѕORgӖme@CG@1UX[YTXқdז.'Nn\._:hak*]3ϤZ`IS x}ְ=z@͛5?='̣7㣃kA$#GvU4㉉?.++%%%7n8SnJH &!DٙJ ^(;vB飮9RBغMC0~ζ_#\CC)$m=-/Νp.yYkO [>f+*I'qk%(0"66{ҤI p} =@ GԀ ~Q?\^>:n@'QPA0Y/LqrrHKKtf%I5/ eQ+jEu@%7}x׌Ţ觵Fٸ~Ex]gh[34=W}zf4E,s5ƌ}A-TJbbb|||.]ԪU+_;ͪvU nX^@48b>n:RԮo蘟T4X{ ǭ$cp@A-[`LM'vDfɂJ"B]\*Z@ z[Y@aNyzOގcV$@f3,%s?`׮b… Ν M|sp/7ձcGJT*SRRZn ڵ={̘QOU~f,!DCTzZ4s̷"+UE{eo)OR7OҀ D"ѢEܵ }-<<|PO[4H4bD&$%%u111QKR*K,1X'4}utz%SQz`4m>RV(iLR]'y{)٤ZT#EaARLw O8U*Y?hРg϶iӆ}d.C@ǎ2eJqq1`ͩ۷o_333.zyyO6-!!Ju?#G&$$\~ݰ"#sj ٩@=\dZaD )[kcē>@@dd<oĉ{^ggG@ݩœd2YlaasΌ OOG nݺ/RtwINNV?R 0͛>uVHHH^^ҥK333mmm#""Ν;e##2I@&ٱc'E D}VEM{AͦJD Fńx:Z3RT*}ЩS7omp᭓q7x~g `oo9mڴ={L:UR?~ ^}wޔ)S߿_߹st:f>|^-С=郯R9rF D-#S3^2}& JDw7YO*[rkծCEF')lI$ ㏴4;B N=ztnO211QuH0}SS'0|. #YM˗gebXm6"QFbOOO`Xfffz@ OJD]A~!gV?T273"J/!f&+a*ڵkӦMook׮>NUK`cc>>ݻup<Df6_\]><< vm޵kҥ <((hԩ޽?W@ zuK}#TߠԒl2D"**+/--*~þ|d<(JRnjj@/_L̔J%) " `޽ fΜ*Νs;v̞=[,3LJ%Jw۶mիmv߾}áCJREЫh\ֺmmh$ #Y Ep)!Ro44d_4F,f 4*ׇ-[VBT;G,>/=a_|ZyΝ{SNm޼bOnѸi(iښGgWss3a#޷zxY48{BH|QOAӦ ;ppA}6V(UMfyF]1bĈ@X,… .\#멂>n̙36m;wJR$%0eʔ)SE-Z,۷o߾]>h8@ H2hKwqJ ƌd+\,p]ܣ_%ݲkiI鵫Q"Q) 6O IN.4-M҃w Iwoo'' RܿaMM͖iP%C?8D{\Fnk@r d'" D"QQQ=]Qa!)L$***~ܬNsJ' ][}3ZԶ}bqٓպu;ohzKҸG# 62/7{]Enֻhf243@ j$03c2@&|KljjZXPPQ+x ڵ lL''ܜoS333wܒI.._2HR@^n.( Ya7C׻'D ۷ol=T*}Q6mLLL5@(|\t}z|bfjj^cfjFOdfOŰ34 eiiB'8} &asrff=;nzƓ ߮]*5hӦͰax: 0>߲}J+ZJbx\.W.cVi`0LMM9IQmG_zikkڪux\ls]յ[~}Mmb=?C&OINfؘX^]@WdxY|=ygjēt:477''N""a |P2oH|޾A7Kϗ{>KU*՝[7ܺQT*oݸm{}<L&̌嚛*ܜ嚙1*l^g.`ԊZQkݶ6󲨲e>޽=8nrm>dDQ)(7h||8/]͙Ixxzkߑ R %d L}JvVVxFz>n=w#x>n@ H]$@ḷؘG3ɣ0f>r),,|:g @ jdVᨚ'~e"a{٭ବ,t@NF|lݸj9uJ\N[4L/_D: @ u7ֵ#ҶMJe?EX8񤬬ׯZ>NpЃ#)67|eϼًb???}D +a*a~JXP=ѹE]{Q99^_ַRɂ|=IP~/M򻧋Mn>Â4˅=z^"TamիWצMVZuaݺuoiii]t1bh Ԑp'ijKe ˼X!jjmTf9AoٹJYha8p̙3O8ѣGHII R*VlpN%*@ '50J¥*axg>fn͵Jew063dYv% bFsM]<"%`+)+W$Znݺu먨(='13{s~~#\\\ڶm{hѢERR;vbI$ؼy9s?@ rߒJͪ/h.Cׇ;c;?gȷCh5YIJ~k&pZVC̼l8 /'"d޹̭͊cIc[2zSbyYo‰WYZZ7tPJ.KrNN`^Z|ܹsY;88$''_zu޼y}wܼyÇp-R}\ֺmmLלk,]=uÊ/[=Qq@!8$>ߌ#ȏ;-~5QP6Ϝc &=ޝ5q!g ăKEHUZ9XzoIEVU[ZlqE۵E(*-*XT!pd\ ~7o7o3~x}`_.R {aKDƶ |OO>}P9r|T:77w…PQQ1;rȂ iѹttܹy>}JwmKK; п? A\ٻGHT,^e;(VY98zr\B"~Hdt~Ugo[KVKq;w:緓N#~}uo SXh8(vj#z)W} _ޓҟn1phϨ«% {7mXFV' 64';s1Ĉ Fl BXOJ׆X^mﱒCw %IR(:88_~ >>>TSSSYVVVRRRcc# >N$M0ZҤIE"ihh|PRRJGo!:8J8II듶m|š}ٱpW YjǛud-.\Nٱũ,z& ޏGwďѓ~Gt v9eذ̖?ח?ڵc[e5Fn}\--@_R1[޻1oޔҲgti0ķ}xޙ6DOzc#rFq zLIJTi}| i{8w$̭LyJQs{e?v6+IDATKIRlm:>TW+*/U0Ũt "ϸշF4o+ )4Q6{6YwJPH/Oɍ|\hljz[[kpf)xⱊ,`n{*@1n.Y7Ş9o lLr 1GђXTTTWSs(xdHKy䐾ǏԻwSjk300077͛7o믿֯_omm RZ]]}#G8qŋif;٥o޸q#9k,RI/JAQ!: $[^yB֛w{'_y{ݧ)-Zb7}UTrV=_w1b򸱗._-bax:=2i\[k%7f ۄł_׭yQqI=eBe t#"2:$CQ8tw`ě#9v;ڴ`It,~[ڻ{޵9I~flnnޗ \Z !PTѡ3M>nU|{ߛݯmj~O? ~~'FYb?7vq3OV|wBG=s'bº>lɘcSM͘ḈO5'?J z9/5͠)cCMC38DڲquQuw^C9qunӎ:=..nЙ+W.)/AF޷6JM~0z=myBH ̩a# }Bu}k=7;m칱t;mPN <vZ}Rߝ6Mw˙޾k?mPB V>$I/>mf!Psc1RHBˢ$}~SWj(`d>UDȴi5|0}DIGs%kuJl0IF,BAXX:oW o~N+}6m>~zH$ 4h 5KKK(Jz>>> ϶yR'NOq#:24Kob͂^23##.~r`mbnš>ZtܩoK'ۛV{H*ՔJyd>ugm 3>c67;3_%*RHd5SRbixRСC ,_|||J7|3r={zH$I#V:Bup= I|5Iƞ 1TtMfn':f`:c#MTΗy7 maIl6\$uazDvvvꛬYf>>>bbbb :: o>fBpΜ9W^555]nݴiJKKGw3f@nnܹs&NHoxiiihh^wy7 ̚t!2A-V6)rz bJgac^Jj J%}KN#m9s,Nn!'lJ 4I$I*J[[ۺ:8I"\|9""I\|yttҥKٳtk׮1-[ j;;+Wdee\-ZuI&%$$Лklzذa۶iE?&PI^gB O 1qNHꪟ}+Y,ա҅`ˊ /}+6F5^:l8zݦ'DO&P*MeegFΉHX[_8i aTdcc[WWׯ_?6l=RW@@@ETG9~8899=:77w$IFEEwMM ֖Rɓo߮q\>~x} }45S}P'RB毮-Ă'qx걅JXXU|R[aZP֠8b]ߤ_P0sV&<IMmQ[[rK P.&L`ll `bbbbb,D"155577q4HV6qmMI:w>2$:A=z>>utp~*9vԇ%)u57#o2VI| {Um? SLLL84fk=uBGWeV3?rǷۘϾ519S[ǩ/{۟6bD"edi' U[$5QDfAaaaQWyT f͚CBBJW_}7e˖"www///*v۶m[x=@#HzR:0PY+w;TInΙgy"d,# }QSSSSSStaa!'fwwwK$###kb }6޾~)INZfF!zӔb*0F_U (2 &vXLIQYl}5vpP(r\.d2 QdfdFlB=kLIv>.hαoDWUHP<ۣvq-AHۺ%/`PԺ%gNA!^䡶$B<O㒮!BaB!I!BaB!I!BOpziB!Zpzqw#I!B$OqB! 0NB!bI8> !BJDO"$Bu]A}$IB!E$BuMڂ$z|'!B+$HB!O"? !B]X$B!4O$Buq8> !BH3? !BH3? !BH+%x !BC<4:E$IoE=7IENDB`PKi#:>YZ -Pictures/100000000000030B0000016A53980135.pngPNG  IHDR jQ;tIME ;tEXtSoftwareXPaint 2.7.8.1=bM IDATxw|) ˲ER{sl'9ɥ84''f_bٖ%٪VdbemӀ W+v33 s@ )HBC@ 49e@ xP{߹ղ b(߅!uJ"E(B_=kmWv4듗V/ IՉ1# \(߅č  r|,`p(P"E9J>|;HR`BzdL ,N\t|3=έ*Lh.b pr+ů/i \n)?4~IiL)0$4$bP0uʨN%LJMLF@MF8Lh@E-K!,[12AL,9v㺌1F`q:1GaTB3-cwF_F{ MM5q(bX{jX?:Σ*HZp>b5I)IRi9WrH!q+>Sf@ӆգE4ޙzrê[>*BB Q-`vYJy✪ R[GB68BgnZ@0r ^HdL0rd3a]6D5 ˤԡ!0ƀp*CAc ";1{O82֏|L3gJ;F>cbX:`Ri^1@'=%${E˴{H.'%5:GYǀ10d%BpbB Pi)J^PCI]LzV;NUvs>:f  ];@°,KYr g9U<ѥ}_"|ǓڼgOQ;3x)r{Ϙ6=]]zK2[1ɳ PX~YA0fCPECq&e)c[8v96ڼ&1 }D|-P" -jG4R!ة*NUzK%BP ў(@ \$L `+@ =ou@ Fwd}U ĸ"@0aCC@ &aC@ ! !]_ ! @ "J\׿ֶwe6:e+􌸦b$_`"ojV]tEigۮ]?$? cRyOnjV\Vcdc^$/y~q5 `6$Ƙ,;m1lyd6ӹQsa~?nZL)ŷnyW,Y4kmv׶m`Ϟc_w-z}wA |Rޘ$f~~q0@  k %+GD#_tUb˱.XrW>6l Iʽֵe[{o¥+-[;>D-\oǍ78g5o?{gwrekfc^+2o~w%W+}t[fxmwn߱vdctƜ| ~s,ihh'7<]\6%<7UCCY?VdʵOz;gG1Fddo{%%{wm};mkoOOX37|wKE~˟˲cE|߾`5SgɒOqoyw~˶O~tOv!z{{=S_;‹/#s%--۶+cmv]:Gz=[^~~xO~v7a+W.߳wclǮ]g޷cl׬ZE㌈J)v(y;`?iyy*Jo fά1 X͜YۗuIƔ{pTUlmu׾tlKm[<T9/[mh4z5W^L)}Kݘ?f9W\g>طooeo˗&#~o`o*صW.9-M 41)uihlL?0 > ̙q?c,eYQƘ!e2VB~~%$I@Q1?):Yd G32t>~{{ϽS.]8k׬~m붒bW,_mWSSL)ݘ?f9W._~dY^b7o+).q] Tز$9ƘaƢ(@ dJ!}oeeRai'$T~eYp@___nnKIS 3޼a>/ޱ5Y֮yO)yu\s?4!VZ6kL| K/J'?f9WXŋ = rJ';'D@ u4e.@CcӺ7Տ_  mP@ a k 7Nso`^3󍭉܉:Z~KJr~_ηC @ ښb@ I `$I `$@p@ Fu#aCzؿ{ǂ%+RowēF-?) vhj |R+x_Ft!r@ twu=/r[/ I 3O͛?x}BI/#4$@/Ƴ>qD9b?$@  I `$Y6= l[[f8q˶htavvvz<"him b I)e%6Ֆ]ΝM=SJ!10f_`QUuomm(I^nI%ى=ҒQ3jwAvw.'M\havl{ĉ7,SFI2kukd)׎(x=By7ax5$4:w#w4 NZhHU^6!<L__/,ΙqmG6C`eY({Nm^V;E1B˗Neca36}Z(:|I ե&Ax0`(H7o˖& ~%c,IRwOW,NnmmDcM̧FSG{牓Οt:S޾E 蚆E0aRBgݐX,Ʃ5斖ko(0MSI0ơPh/ts_s``@Qaefd(pĉ[7g!m?u_$(#Di^@cY,Gr3x8xB$cQJÄ0J1!eYRX4^҄C- q3!sG2j 6:7,)((-BM[\ac=s ϺG\3[3݅Nc뭉D"S i˫Gg]ƓgǶ#^0B,)JI匪WܱkS;+6 YkF_0FSw{O0L]^^0X2,vw%v8L1Sn/-+%sۯJA 0QJRssn6fzaa0Naw}N4aRG)r[[{IIq̟wԩ^>%Omx7Lc.3Y5eryaa6LӌDcR1F@0Jă)gz__?o".9N$޳d%.'%ZeYڛ,˲,b1Kisy]Y ܹ0,+Ν5uZ(`|*LZ\:߯j,?TQC׉$)K,/@Wgfe lqcUlNnWf'.}&vːt57&2ѫ7H@x_~#~nAQ$$MPXٶqc.{=,^0Bc?{*&bC}Ä`xp_瓧$ۮq{.!ec׌E˛㛤5,!q}w+Jils$I5CP{{G<_vEU񄢪xb 4rܕwrʸ'8MM^s5mᠦD<_~eS82\QJi</**TW7025$4 LOh ˴}Ul^px~q\ u]$fs6ݲ,]MT%&9ͨq7{Go}]jzGf6L'kqF^TD"1Wf!n4/9d-M&! 酧OFed stǦMY0?~g)-ˈvNETGکIeKL@V8ϻj h,匧6/\i=6PaK$I!d:ȦaՒaaDbE ȺG`t߱'^9BY`ċ)K'wiټ4m0fsX<Ȳ$KڴyˌbrqZ\UhhhL$ʊ@ar&HCB󙠳&`px|U+WtuwןGp89g׶nTCbnljjmkדTO~BJhJ/YeSuuS2Id1V%4MS<&\#EuPhPn `UUeŲLD-˒$1jY*RnwsH\u嚅\GD"73YQt͒$ #p11jgSY1GՎRjYU;62$I,4Mi܅,cL4UU à*24 8ݝ~ʖIG` !\~?///+7YQsrs ]qj wN׳ooCʪ7T8x<g;Yw;nFB1B.t;BB! H6r/o˘EoCb~MyaB,*=j>;}JAϝNxT]ʪ޾`0iaEUUU%''ĉՓ&L{cl߾K,;06D"!.OqLH ?1100(Jm@ v0ƻM$Ueeabq#((-..:V[ ˙>+MӌbKҺK=Sdd q#BaD a!xr|b֙40$OeAFO C#aMp:D!4BKSs:Jsg刺{߿p T1R;>NU=K.D2 IDATq3sL^;0l6iN8BcLQnLeYe!X,S)vFEfJ2d-n3Z򸳳ztZGVh4K/]{Ns7@kCFC`0@ql6<t]0J;2\FrB F^iƽ#4ѨiN_ݮ3xtgk׷ѭ9k 5d?!HZa.*t|]ijH݆ FiTF$I涶?xѢ%??嬮!( DƦ&I)͛6-3[ hHaMn4x&.<4_xeec/3+jh j]UT0􄞈H ^8wk>;mB%< !|ޝp#$I%76<@gҤI$%a2 hTY9.xo^^%Bp(e9ޞ^]J].455?=bl\'Ovuu2"FSuuӧNdZM)ݽgOoo=s'>4Kl64Ɵ\E>#0 X^MDܞ4,beYnvRd [11bthRR׍xR]XDHJ#GdR3 $2\UJ¨iV}_FSBo}cv{g^OO? 85߻{cK[0(jOvkj#77[o嵛һn˹WP-ĸyB%E\K䋭;ʜnjlGFs[EO(Wں߶& 2cq]*#)YؐxoώҨȌq+WMttYHLZ[1WKhOo~Z4 OYz3j*Ã`UUbOlH- ŗ^*M((_3bDc&+hE0޶'mC%^ NeDiO0 r]Ӎ^MVYXXt:BbΝfΜ ϙ3.; n׌_zssh K.ᯰmmmO .䲲,βq4ý)ir_UkqG:`xpX푣܂1 h6$I&(}/@{)eT0”ReZD$]q31D$C*9*u/q+ϙ[yh0 <#]|E]Jm9q/d~pXɝUsw=.2tH{$K+x x  LZO{m-"E6=?yw^_(PWS>1llHɹ#3b\,OOlx +iZ6o 9N~(B|Գ=q7e2#;!LRVM0]|6kI(` ]o7u\i]2L#t=yIS?|^{@-m=}(P\P cUB5J^@( (cbq 4t `ٕ̆4[;-˱rv鹲1Rj*[UVM{NɫZz{rssdFZ#9Ht8L3tCӵԪx}>"Iٹ+T|!,)QZ4MsRImdyQW 18mHClg~M9!+ӴF7X{bF- Z+튫xIMDqUBf0w!d]Rc2qu:Y>I0#.P*6$U[5>!fGb)ZWݥ>kBˍ0>г|憀ںȜ6޾#//sz4C1ƍMMsfϲ6ݑoiiപUU) nҸ} "'^_sS,K`<3,)&}~MT zQJM ̿$#q$;;ٳS&0™bB,J%"1F)0X䄦aMlWgZ5ILRdR*aL"D>KL,|߁ !1c4MEULӔ%/wgRTEtCeL cha+U|L6f1lC ,6WT4e,tx:[';<گ3aiRF`Hn4u(t_@[#y.C: )I~$g"nH哊rlu!鶌dlCBg,C,L pj—{ cE}ddR_=~"?nXlԢIZnژ$3DG^~?(ӑz`6$ޱ&.t ?+Kt ƾ(*tf&i=rpףE+ZG M7,˰y&B{ 2}A%(.{VD"cLfdu~-  \Krd4&t PZUPS`ߵ%U駞*)sPn;ڝŦڊ 8UWTX(fKNV8U_?TTL`$Lj8&zzz{Zڽ^hjnӦ566:UrWO+8.(Jh{K/=s24H$頝֒\x1x+/{f㳋.$ 2M˲MnO2̛@@%/7#HdJ)wNj _ϛ4p}:/Mr$10&@-2cHIPFd`s#!럽d}:i2Mg7L/d(LP˄aS2-oy0a-l?&/h} k%I"WjHRc^ڑ>|jLqMt!yd$3I..ꝝ]>H/[|iP #wvvuvv#Ѩ.Ts7<#GN+ n61##~DG^Tί$M='yiX,AK*慂=w[[`(LӈF?YZZvG BU 5#\6w8{.æ*c4catLBܨбK_ ^x9uҥJ}^ormk|(UTIw~ p5̨o^BdYv:]- M5s o.E gMM-c;}P8Ŀbb‚$J4#^ӱ#SϠq%f&0"`Yq]a-j6kܜP(;d7 K aGw3n)1I%]ԹՐhFw0xqALejd{acB-_v;_o K'QD1F1eoBN2s8(&5 %z\w]uxKw_U228S;%w'S돡&xwҟz=ݟn̕$1dO6l;ҡy\;B^=xي]x>t.HkkL͖(w~|ݵ^uf~.DG^T?6~C4 56:K$`8ԕ=c2b3*{I#޶=C0*6Yp4nZxYN?$TE ԗsͽLfF%LH9P@S\Kփ/*+-xɕh;oi|WfTWxgO cΝ5b흝]KaA0!9]pj21ܜ`gfb[[ۊ&BeZn`_o_WWWE1sƌή{Λ;4OrFl$nnd:vYQ$BŞ^˴P&{:P.kUiH=\C@$,Z#FTM(y4TH fyA2CLP$] EŒ164WT&˄lv͑e9BebLey~iͼp`4nLx<ezk\_hk㾞1Hz>÷2T$I8%]:no7}P]:q٥/P9)~eI?uh4ɟ.!e #0a+2_+UAs_Ο}OofƆk%EίOEǏL^B]&)1M~xw^?$ u]I!nDL}ekO<EL SPO+O?t$MƊ,I:~~Y"vDJE9ֶ,ZQL9Kpu{~?[gycO,=궶_x\8=77'/B.gtȱ9gL޷nZYQcl"͑Xn w^Vdr*M~CJϟkfm^ءp[HY$]7$I UvJIDE'(%D,cL$3ɝ1L #qe#R_uT"K_cGQ0fj$IaHAt )w?x,ZBۮ[g=cC}} @JI~k,ߵLQVe|ލR*20ϮO@as:{aeWfěDB{7<0 tQn`4 A!>yƣWC#t#΄d04oIF`ߤ qo@c&u :N= 48\+f{՚R˙\ F$*5rxNz`Įб+2%yn@ґfNoMOcûV1ƾ{%K"^:ܵl^EA T$Ireͭ2bӖW׿rޞE;;/[F3!L$4xpʊ)v? B$lHx+WUYt:*+NqS ;cǎⱙ3fd9n3MI}4 n;\NEETEH㬨z%K䘖rnNȧNյ}>E+++TX=VܒW$]7{BgX&@NN /abR[{'?aoo|}L$o4XBrs=~,zգᑙ+JK_~eX"jRrKK&<(?i>)S*7^>gƿDT0M7tSe L0zUkf͜ԓWYQ|y Û6otpImdyQW_ IH0PPv@3eŔphzeadQ2-ټm<d7VMVzӓ#Pd9fvUcM'Ο7{VY^^vaMj~咙ehT׵_oUUnkLmi%ve:6d9ןs0VUUIV%QïG.oYFAamnnF *+r8D*++ >ZtaA 3H*FC bӧјiYS(eYknimmm C|iY3 //CoħxZ[[ UeҤIgf `)ephS;}\̘Q3UXm3 MH-Cn"F \OJS\OʒE ,:S'ƨE0dD,#ukל>B*dA0@P@00Wk,ݻvvvJ؉ (t0L85Pz>|;{{{q.(),--h1Y(I$NԔDӈ]X]dӣn$om/k^yHGu@P(1#d2HyZg}lƄbu*}ӯrODcr#u/:{mP|(pf b cf?JkH$D'0401+Ϙfh`:8()-%BM Ô<"ۿV>$hJ>zvi1HObp9FNL,M[~ffڻ7*Od`0~&P5hiiҕ|>D"1J N*)Q)2/*prr,MT۵3435m+-ӦitzכjSq*Ba2J %m*B2p}s˸\6[ܤbKLN*ptu%=H$ k׮IIDl@R_gJpR 2^9İߑp\ |ՔJt" &&0 tu DW3J$aE T*p**c$2ۉX: L"S|</:2h@0,)djF!kRaP4p @KCUKCMA6` C^І) _؆dRGEFAuu޾%+<SYͰmc[W[؇_=r@MM/!}ݶVa]TR"P >d޶^"ASGr%Ϙ}Y3̪ pU I2oxD !(ܬw/;-%m,heiFO~kb4 I`:v8Y"/˵zhk1h28MTI\B8)啕 ?|*)qJ9&0ʢiS-諨ȵe!H;2fF.w2&FfШTHTXT[XX3*$Jikmejb\T\LR{ L&yrPfih3L5MMԬ,KU] Lm--L,"YYٟ>%4&~w cHdȓn=gH7ҩ66jkk7%tRlqj v_>܋~]}&mkf 64e-yTUJ$: L`2ښ4cCCI`(3Le&dX,&ٔvhHIIx@"T-͵uUkxDTLeer)T[$fk=bjl6m dq$>S^n/262fU |}=z#=~[$gج,?uzn۷UW9\Na]t%S$ fSiT:sT:,fz4'CAAB.(( wsMKCǐtkXsۛ;b;MoKQ /6'If'ߦ:KZ!mI}蹞*Ӫ`0L&1 JѨ4-+| 5B"L@(8Bf()07fjbs.\$kW$:&5161eXtזPPXPIDl)㧚ih>}O KMi+շ3׮O$j,6:ҳ ,Kb<:gSH)[?H`D"*"UxHL|Ӕ2>H׽ӤĞ'9>V;ƛxeIi)1E+"鵭5k֯9_s-y4t GZ#[/5MmMQZ**ʊ NQq1Jt:Pit:BѨT*Mtޠ1$ d EB$l]r˅B!Fn"O0s1%U@_WFSS#)9J#Y? hYh}Ou^4T(ۭWa?:Mp"C#2LTPY 1  ~Qz{OEdr}>]]_rE B*:^ hM44S *$!KRRO !"'}s>ٳNj&~6 u[x+q@ Z+CB yH`gl&D Q;#D㡫ghdk¿@]=ƫ@|@ Z~Ql #BzAsۀ@ тURBFrf@ ZHD+tn|M@  !肩(~@ ~P@ B!!@Ȃ<$@ Yes=s!@ ZݳsېM-^8fHOJNMXV?JtIlڰC &ȑɕ5\@ ĝ?ښx۶˗,d7w/ʹct5SioRo{*<$/c^%%'uk^>:Hwc÷w̫I66lrյ{ll\=܍&%'wppcђAC7ڣm" !u暙㐕<.6FGscE~V"\lO._ YtEFFۈ###w+N=׻q9uFcW/xB!YqIw#nܼULЂF\_j%UQ7CxCoB@ w~>>{E߫ڏE1|ƿ*wm0mFĠq/>?okrsGs kׇݾὅ̻u;KL<9"pMhr7 .W/]h\( !1 WW{?~`ɭ^~!,((LJN#ɟ? F斆u|Yйs7w+\]h!poSL&O~Bضe銕+׬۹us !$\W \Z׬ZI$$nD@ &JliVAaq|ꕴZ宭˘A`@?;5aС]n^0 Ʊ'3z[`>aק˘WumnBQ}ZwꈷgT}#CCG Ž۽44lm555RN)NSRR55 ai)Nc0#x̸  ʸ\NU+Y$m3xܐ (Zşf~AwRPze+VJj`ͪ=B BSCC,ihKyy:DFpʤVڊKi4* d[Q4 H$aD+W ٱk]{,-7_CшTTTtu(Vщ4RԳCLݻ{w?7oVSQQ|>_II *++ "@H $ZCΘH$I5.R9z o7??_[K B©T  #3@BGgيIB buv~ѣ$ۡa^^JB!UVV.))aUVJJJ!aX8'u6ɱ={Npʪku?6ꂿء=ǿq{w00q<,N!ikiWB]==p|DSg͙JDb1ǫ;w <Ͽ]x_oڰnBy*Q@(eKYٳ卛΅\ D"]znuur.Xkc]8=wF 1N˘Qcy<Nsp'H Wаp'umnϭ.;D"yzzu؁tw떐,SύXWWWW"ܰn9{!^-YClcn.nZZ&Nv:?RRVɱk;wn#{vnʱk..U-a_{:9vX~cMϩrw,rwUo/?n}.NG DϞKVӗ/,VScgffv .Xkwmu]egW̜rahr7gh.T@+q'H޿nTb\|R/;OSrA]4zn&\0 k=ߛ- ˗.\TYo޼S3U-$}RJIbR߈TO:5P. Gx7bXGu!UE'I\>$22Y p 0LL))X,n:s[9?V] IDAT8:ZUU5c8ᢥ`dhx7".]rp@LMGr@dp"Y=JIDS:mff:"pݵD ;ueߩc"5޸yc^nnvoS&Gl0L,8;/cw޼yۺucծ=M_YY6H/)K\V~n sR.!!jEX,ʗ4PUhj.ᠦeE"ΫwlMjp%됨T srr\]\./H[[p& ꒴X,Vkg׉H|iiMIhM$U#e~A~Σ\|!v6DZCCWc[\]\]V5H?kYVW~8Kl̒.h$xOW!!j**g&c:?e[>|u/TWgڪ+WO),Ra~XQQQiog+$nFf&NMK=]]RzQptd20,@j0KMM-3S#$ rUU"YBDHX*ZvFZRL!!~hvK~rοYFhI)y&5Lی9ۈf:[^|J*w9o]{\?xD" 8^M沺meMML^y{7"2}bڔܕXj-VCn/_._IO?}朧 8w~!eeԴ*f$O,XI¶t%ed rrG8D"WVVVVVD"W?Z[INBBX,yIII~7P˄&c>bѨbS@ԃ}9v6򥋣WM/\uoYY[7oԩCe}5̛;b-ZVUUkmG((,cbWrgw/%V1FgZYZݰ}2~Xy^,qKU~eeJ:DDťۨAq<)9fZZO*?z ;~}uun<|P͈ꨵ VX,=ztyyyVV322X,ɔX~ a&&&_VTK&qJbnAnfJU(I6?4̶e)-'WQo_vkHӃgLH}5u7H Xkmsf͜3k$jURb^b2wdhhx1䬴I򘍐O 1I*Ȕm߹;kǎ{ ߸5h[L3 GݑrPr_(ܯ 3;vh~Q VH$*//2e̙3f?}4..ٳ$D"FEEܹD"h4i:r̘1 &&&OZqpph۶m۶m*zx777kkk{{gϞ@^^-,,lllN> ߜ$0ﰑ3?IQe<܍yp2 vsIhB*`)"3V2.֬۰jR=~}F ܾcDa< =B_P0jls7 #{prvsyjА%k VXֱC{ HAٷwwy۷K..#"+;:;yu9`!aV^^'()(̙3#GM˻q.>z̙3c2|zz|~aa 7ob6~%Kgggڵ+!!Ν;w„ 3g>~Μ9&&&W\IOOwrrIr`*Hd|M.7+tIaiPhPh5hT=ej60!fiIʯKS!f>^5RZZ;?ӻgiP^_[ךU%jK022<}hffOnf:a/_6eO{?}t_f}^lKX|#~< ,{ :/?^ u;HF١QiwF  9%0rǟR@Pq)o߼)fg-/f%@ \ wJJJ"##/^d2yʔ)AAABpРA\Pbᔫkjj*>}4"" ҧOyfdd$zzzֵ]^9` ^^0chELnJWz~eeeNNN lU @8`ru/kZw93+'$&I_ֻl+ESCC,ihKyy:DFp~+*.3nB2.SqI1F%2,3p k>kwr%ź_Ȏ]wciaqZWʒF2Q$U[ZspI늖X,.**"\z#dܸqݻw hjj RUUU---CCC%e1gyA9FD)!qȑ++l+buv~ѣ$ۡa^^DZ(r\ee咒6[UŐ3&&III@ p8, ϟP;]~Cz ?ۧ䲴W/]pq۟;9v>v@ ܵg1W4ѭyǐ-dL(5 ;~.S pjCUUU__;vXB,ٳ' H"F,>|X B555WWǏO6֭[>}?xڵky<^ppŋk+)՗j 0jWjeKM{;k]΅\ y%HW^9bаNߝsĩ̙=ظKB~8݈^pN$x<3,Y3Z[usuqc8lXQqD"X,>yP( o޾זc0 μx##Q-zt=d[t}bm\cWW~>Y_>]mv^|& DϞKV*/qm[jjnb#׬Z1=xcn 2޽sd2@ѮSsOvqrT>={ H$Rn^!񐴵~8޵KFD z邹رmsg{lQԣ &^TZZ:rnݺ}?fá7 M}s󜪦ViA~rOW\0`@]Mo]lߴOo_y4o뤇ﹹ{d]rLW11w%tjjE(%xΝkVk2*\jHJNvsJoҭ\@<̚Pm$`vjccc/\rwrnaeDn9In%.}nfp2scՋG4-CB 1k)(zϲk@?SS>?<5::|7$\߷EEEE@ D e̫cG˻Q:6pޥk׮uww0{{(///}%KRSS }@ Z8xѼ(&L~ω˰0 ===YٽqoBL(oB6}ѥ ǽz:WvF2]dCN޶S;1!1I$q8X+++ccc0 :Di4ܷoH$<$@|F%Eihw_3! 05799`ie3xxйJ SR P(426#<$n'={T?dJw!ŬCDp첲2:N uVVmD ď̚ޒUU~54pԈk*OJһvyHW/3DkXZ٩Eݎ}-g+} ##HL70n/> w/-l%)_5M߳c Z (q?J*715+EwO?b`T+OE~{;dx˄/+--Sj-(f I؃@ DSS'T5I~}g|8D=[w1Y)Qwok*+|ީ{3nU"ONNWm90)1޷w}aTU%E&n[Z٪T8F&^<.?*F~aB?}|kDէS,{)_o_4Nh-WZ۶,Td<$ 0???ikuՏ4YbRt٬v@rww=zi$رcWqo߿Ҥ6@ B2weWo^=526~ 8^}yL5fɔD"g p'-,//c2@$fX|{<)!NW 5%`|GY]]>} LfrR<}xն]Bᔤ$Ze}kn,\Yk׮]t)u1)m6T=lLKmK?~C=Ǐ?" 4a\ˮ@5qɓl6{ܸq&&&W\IOOwrrlww]v%$$t!..N&Ν;a„3g;vl̙>|iӦ7.$$dرs̩]C D pd \"5 S$98>yI";98'%\~阙*SO=|t&CDG|x#ޏ{pę$)>mIIDL8yNdem_",bbjːt7̛;[mP7rHٳ'{z 666666EEE@Dܶm۾}RQQ d2jv[#-3/E(ysB 2p8%W.}|`3'eHƇxkO=Ο9ލ=<}/2oԬ=1V~~~nAsM5y$kss2kҥXvZhӦͣG%:ǓICIIvDDD߿pKJJTUUqOLLׯZپiM]zzcjװ>qWK1II_$؈Ç PzquV߾}I$R"RRVOsV BN>FMQu>~a,K+{j/sK 9y%9Ey9yY{HuիWsܹuS`蹋/_ﰲ244lӦ!ټy۷ottt̤\\\s72tss;vVLRFg h!0@([ F( qX,b۷{oܞ7/θ>f (C<ƀ@ 76I,s8.]#7^yyy.RQQPԡѣO:%g1 ДQdT-q^xavm 9OᳫDNM+P"8NFFXYY+}`t%%%:NڷoH$=$4ˆ@ ?M65gGԱ#ܼu{7]111n9TXXeeet:H$h4 ifZP IDATǣƐ֯ߴ|b=}z?{|=?w3g%Bl\˫"ގ.wI :𯝝mAA4PnW^pӇ޷o߮]nݺqիW/ϟ?Wx 14Zf<_rQn"nܸr޾{SZث}}ܕYrͨDϞdY tBP[[;:Na W624xaHșe+Vfdf6ލ|j-<0##hL&SCC@CC:atek(6hYQinЯߠ[6$ph4jbR_/Ϯn cUUY߼ *m{KKNݽu=B]'̲1 }}}}}}Ãf~ƍcf7X, fώi :dpRrzBzz9I$R.N6obXvFD>kf~a:'\v>PܵW6dА%/?K"*[cמC*1TnJ'h]Hܠ~+ysgϛU.NpV虳^X@VVbB@(DvFaa]קS-/^|hvQ'}jFZ깓GZH!1p< pѓό=V<55;^:=xiɲFFOrss]]ܰra~fM}/XqW&\33'l۱væ5WgÆ޹0p0ϛzwtutnݺ<$nPzzq"&ސIP>Bpμ?ʸbD@ 002(?eff:a8wϞF˗.8rjlvffX$>r\,xn `llÌ!m~_uPϝ<2sBelOHLښD"|cc۶0z:Q:0i Dia# _30 5": Cܼ#^|xzz܍t*<<~ ANxHIɽ|`@~NigqbO`2Tiղ%  Ʊ'G˯w/?%Ѳ*Аp%N̠ pͿ6opDnnnY nX_my7Hǽ3$jǎ.hnnڗi+ڭ4p'8y2c4zt71m;&:GU* …L0^h Zcӡ}~}ms_k֤Q4 H$NP(DZ'TT\O>?kμY,?X~}$ZZ&awkrI"^aN-PPQi"UiՋ1x<:`3chck%rC%yu|:NtK+.l #$EϘ!uBЭۡ¨uhoaNg2IIIӻגE Cj|[fnҗ~l+c}ӯOeJXjŇظv;yjiiܳs[v]EYyтҹn\<{L]yI3һyxfgPޖ5< }'GGNxY٪ffn]]XfUo5 hڈ&mispq!,umi NQ!okv랟"hͺ o޾/䬴<))WvFD(I|IIwtD)˧;/ny7"MmASzq5afڗZQLmD A:*Q+%vfьlߴF$6q'H r8IHEPF gYs;88}2uK0̾SG3SӮݕt%%Ǝ! M!dcHoߞ4iҥKҥK>>>=277RĤNNGSRP(\`!abL$խt(4*&F9DӋ]`.!3*^rHpwѮLҾ$&F_5+֭Y!Jc 7ţC DdcH/޴i@@@Ç7nܸo_щ%K ޳f:~xvv-[ƌyyy'N|N_bŨQ5믿jkk!iOcǎ!C,X@&СC:tsC!BAs["l7@4/M3TPP@P#NTaƍ{{BxH044 666ǎOHH CٳGAc/5p#01 Bnj?wHs@ FiƐ455E"QAAD#}Y4AIGeeeNNNP::`0@]]]7DZLHT#c7*cFC ' if_tIzZڵk^^g8{6:J" "Dck415-QI3vĨ0VЈAP5z! >bymijjzy@\F{d2Dת@IdY`mkm~L$lnފQAM}Yf+((N:o߾6 ޳gڵk%ɼyꫦz9::3&1Il6[.bmm6+yM*HDz rjr1cܻw^y;zj@ {azi,//Օ^/ͥ(JM-Ix<ӳI8qu͇GGG'''Ϟ=tҤI A䤤[֯Yd*>$űsj7A$srr߿E?s8MMMUB sRr"{{{I\nǏ?>))iʕ.]RsFUr$\ﵱSsܦļ|./^XY,LOOWE.A l ߿4i$NKK[`̐@ .ͻ?r$**jƌW\8p;뢥iX0#0/a*HmmJH(@tZTFtttv=i$EHDHMҗT^ mUTL&>/JU @ NH[;nܸqƽq4"!GyHhz|HaD5@ ]wCBA] T7G=>$BTV9z%Ǟ={U c&JmՔ4aө )obI퉎~j)z|H4A tBϜϟ;::Ν;WueZɓ#F5Փ>X@ D=RRR;Z:iBjժdK&-$e>+W@^^. 6899իo߾wޥ+7oiiiyСf:)ÊCBBBaaaQQѰaÜ]\\&Olmm7meiiyAg@ Ntw6kcF  :5ܧt}AsKkp~ASMoU낂v. +i!=z.:}Hrq---qPnAu8khh4ZQQlٲ?ɓ'+W+Wwo֭~ό&N"f]MOzM{;ۯGeݸrVƐ!_TOYr3eWҺ A-O$2Xt^>ov' )`gg&}Hr|Ν#F4^KKK[[{׮]111111yyy'{zzO 8U^ c֬YkxZ@(^t>ɀ(f:tu]A|H|_A_um?شz='N0)PP<,<3<(2Y.lho𝁾>˯G\2~dM uu!zztу}咼g0 ݸۊ1c?O|7/_'zrjrz?_ NNNtmE5ˆ!"$$dÆ Mӻ|7luVKKFO0V8X.Xb̙<d*5655ݘ͏rw`xG+h .kHBtC4X-\|^UW-zrˊ$?yT+3p܅Kwgz2=?}ܔVpؿcCesTlB>$O* ;;Gtevv6]ܔ *F2,9>?qL&۸qclls~gXӦM۹sg3abbBDMM m$UTT8 AG{hEmwއ~9At"2nt .>$UN*V-RTҗMtERЁO>ussS_߾}{ժU}ݻwodzzz6%\qXux v1zt}?$@ : G YEm{eS6(m``tо}*۷K^zx]Z0zrSRRnkk`kk[RRBnݺw;wp\777UVa.@%gZώw8$ Z=U6#nݺue:#ضm۶m۔5z8•+V>899)6?V{^A{ZS6""۷o޽|Ynݺa|bњ" E!aV[[۪$R0 )2_R>hϞ=_?{etuud2ِ!C7}V@W(P6qҴU4bݻw{bL*tCN\.߸q $$/>aܹsgd!!n ݻOMey;!1;wfff>v=bbb455U[پ~L3޿zqy<+]0Es9uNKWh~~~*b虼I68.****++|\.o1_"`XzzzfffFFFoFgf5C"UyŸ33n U,PSY!23SwАICu֨Q.\QPPУGEԧOԼse!Krr9rǧy#B}wJ|HLGGG*Ѣap8w': iii&L8z8.Y,Bici=!ڀz ե(RB$UftE.ӧO'NDט?~LgE z"Cb0A>-[(#Snܸq޽b\SĻBo:!!ԩxō7˗/_N\vb͚53gtqqa0SN?~|@ h+6LJDQTYY٥K9U*$?s S19x@4O\gH{qfcNn> O4W:= 4<ų/?<-%U$۷YAAz'طA.]nOEQzߜp/رcBj@ LP 64x%K'ީh%IhRU I ״h(<6y*5ƾ}mml.^ozMڗ ˳e2D*DbktGfffeeH$RenHK@ zN4FZ:{-^| |Μ=G 8\~O@7qJ_PȉammPHȀ3).^ W) +x L_,8.Kj"? @t1Z qzQEEE`Oɺw &fwP[[p+GƯv=,_okku֩į/)y,ghď+2ۥ;?n(U&hɲ֭~bCBM*ZZښU+ki͹R_H?zLJDٳk߾ttt~dzgUWWD"\Q(ݐCj>e׊xbkEWGMc IDAT\.߷Ш!%ˇ |>?-=ٳ`Lv%(N21~f\xyF\,XYY^zUYqcF]xI* G*q9sǫ/(28F oj MP{kV OF!ZqP4h=z[[;ܻwC8_*w5N; W^'OTE7ԙdW˘*-dT*Zj7D9H>+W6j$' \ L&r *j'n߾`0<<nݮ>$U(**6lɓV6СC //OKKˣϋٳgHH](,,l8J^^M,--c7CXDDey@C ? h-ۿBuuu. bמãat |}`pdāT*]¢"e9l[Nƨ1oIN3jdbjbbogwe8u:^BrSvCPf:45jTӇD\.vrr++v;99xPD MMM%I2..n۶mkX9o޼f4!!!v\){ p2##$&&.]td5g@>b@Dԡ:ZD[ebf! :ZDWm[|ȷ_EQ!˖,zUZfq{`ͪ9 "Ir1vv>$kk+?_ޞ>UXK`ݚU##6|_.^qԻEYrm]!! g@HH} zmmÆ nM9kExk׮|666L&f`444RmSqH zjRR0YfƮ]aeL&ٳ'5#IrڴiU^^@lqH H`bf1i +ɩEû[YY=ta /\0_qiddx0s)ȴ>ḼF'5d㇯Bϝ,z65'?H>c2ieeeޮC+V9sfjj l6>0':ȇ?DץsBss_w"qqotќڭ߲6TLHܱcWuAƸzٟTUz{<p\n jjjhK̬XiӦܹ|@3LmE- @N ]Cl޸^__uyOh4AZ6Tp=r䷺:)'&8~ԩ^A]PPG<}b1zzz[nڱcѣlQTjj'rZCѭl6[.bEm=-@t!6KW_aajN36H0 Cqmm d #88@zN{Κ5R5pUV5ZYRR"I.;::&$$ҥKCCCf͚E MNN )))*^: *W(mPONm:c$A:~;SRR\XX\VV)%u266P(r'似gϞ޽4ZY.ZI999/:;>?yݺueeewޝ9s@ &^UUDC|Q+jEilPDSqYEM2 @u% m]]ggnTT4a}d߁̞='000*J.[֯Ϟ7cfFڍ!yIeefn' @4ON#Gxt"=rDWh~~6CH~~>glUUU8NQ$Ef} srWTVV^|^ 5𥁁{ذijj1&97b DBoz'NpqqqHR\WWܢ?bzaâY,GCCC SyAfB}c h|PW>$&;vh?ss;w={^^ p"DC h3xCbX>>>ǎwEQ$II\.HuuuB MM'OXXǏ |HfBы:j!q8SSS#HPSPE$X,H8`:::o?@ z"!l]]]---3o'3p\>|PI'>q7v4]|i3E]/N{@Jq);9r0{hQkd8.?zp%ss3ho+CԠ8$h3C*,*b2qGTlfXl60 `2ϩ9  S!Y'!EKEX"0ȈAYݎ>EH1L&`06 @ L^FFAFRUUInT@Ո($KBAVV-_h#lqΝofȑ\.=zݺuiii@*Ѽ<sUFB//Vik׮zX⧣uA .F^~ukC_w2R֥ dbp\_rŋ9.^n4&]򄄄/Ν{gΞ=˗/555D.7/GCC# bcc[T%K KMe⧣uA .Fk_;m/o@lɢ]Bbr /ĄKPV^ajjף6lؐqS,Vke8HHHx-[f͚c```hh;}ǻwﮮVœðq=zvsssssp]yy;;;C5yyyZZZ+QSSӳgϐPXXXTT4l0gggɓ'<[[M6yyyYZZ,&-j!QuL2FB盘}ӧOӕsٺukffPF9!!v\>O3G@j ux1*]UGW:9nEt(,}pkU1%"(AIo&b &Pu ;z$ND]\PXKfE^s&[/?uH {G;k+#cc&y-Ԧ>uNNNX,RY+V$%%9;;ikk72=55U!6//[ğ:m˩] ~(/+;zPGkLhEGkxtœj9W(}e_ D@ĘPB1C, ]I 0y/xKT~?}fIHKGIa `$I GcFlq6Ǐi|(}ܭ,LFYZSzD"d"*#A@&rpWxZ$..n֭?ӼyR\.ٳ'A{d89::3&11Q ar\,+ zzz[n'bǎGnpBAyYYJv"ΖEnjDF)\@֊@ &"L(D@$$TDHo *ZP0֧)Txr%f]1H Y,ɢ" `egR;B&'Ny3n@66@l=zq\(+7HRHT\\loo* cͫV633zݿ={FFF?8w\oooKFS΍TXXװlkk`kk[RRBnݺw;wp\777UV HI>=˥$A?gJI>V`E$IIEQ"IS) (eEK {S')y=è,E|ćYF pΎ6֪G8$ #|͛7Ϗ^z˥crsqzcUUUty۷o> 111/_ˋ/'D97{Lfzz:]V 99)ݸ\nKlDC^o0ysDtQ._~檪*\g2 ?7v dێm?3RۉG,:%eiᑭة5# |,"/]Ji:)ؗT)P\u x1a'^`flhg>hp&rEv=(tuuiTyaK.df=ieiiafTsSy/Ɍ\l>dEdW^eggϘ1hjjVcރZ?a.ȥ+WH9;j&; ~#ܽᤥgҟn[g W^F 9[$$I{羔@@崗 *=,<n*oXoI'`kkB^,V԰0 ʊ7q@*ף cǭXQ$ɒʇ=zJ,;Dn@5!1 MM?wǎsNEER<;;͛z?~fxK|ÿ amC\A^**z o ((--aw-Zuk_(9KWߍ55L&S___ĤWZZZnO?(FZP(|7yXx!#`Dp+x|Xh‡/^ VVaa^my: :ѹ f?̼IwAыbL&SSShСuuu"q`G__POO!!7YwoeYn)nh?lmmnehB۩mA #CC\^]]cd&pEe]vz #-Ȱw^F55t7]+| 6L!vL&";2gbw{'nڴya!-4j!ѰX,---CCC+++ggg.r 6XOYZUo|HEee&?z:oˡާʕ_D 7 !3nʷdT*Vkr lblxʹ7Ӳܟb#Klw @Q86L䤉(GK+*='~4^'gΘNQT~/_SUUU,`Hd$EQFZ" IDATHKEa6#. Fa3oᗞz{ܵC\gðТ/==AyϞדu}innv  ݳݚU fbbjoggmm:Y Æ: } Uy:9r**<^-^!!UTSSS3aT|PEQ[SSElŢkhh0 LXiؓnNeP$(A7קu(W.cc*^SsA2f1FINnæSIgm[6o۲.;;9QC?~IϝCF1jD aJ##C)d2RQ.)736eY)_VWj_ԁl X,fP??++֚GMZ9_g!:q͉=5ٰ?='(d2DYYUE422$M455ir.BBtn"]iZ0iШ!c=w[]bUFB1̚9p¸Qo#YWP;CDo@"[EaaK2\Jo8㸩݅ Scuuuu˯@Į 1Ԩ .p8۶|Y 4X]2.rמ[ŎMcu;!5Ý;wOjժRr=Qm+EQkW~/0_Z,7,(ML~QCrG}hɲaw},/?~WK7332fxnk/KW+wr+]kWyDpjC( \N-3p]vw//,F; z}ˊ  _Iܡ^0^Yѡq7W!D>MCB jC"bڵ555o\xw]4@TS3!aI||<ݏn`sD %j!򚚚@Da p>hѢWJ"5jeO}zEEٽ{‡4qD33m۶빗=z^YY EEE|Inn.a˯zڵӧO!CF5gΜfϖkFE$Ϟ7cfFڍ!:$Vfjf% ۳YH# O:7}}zoV5 M +bS01R~ffuuu}mmm^*|xĉe˖… O>]\\jkkgM6-11qʔ)-aݺu|>~kt"r|111elllhhhjj*Iqqq˗/:tyX?S՟$A1n'Ct!~D Bϩ-H^֟3/+K( 3G|dbbh6cXӒaشiӳ{#55ի`ccq1cܾ}ʕ+0vءCҝO>}ĉׯ˼)z eeeiiiPWWwդ$`0f͊ݶmۮ]bccrD":fݿVYκDnjh-Dw'-맸T ߿ߟǛao/7GezeddpX,V>MLL211ifl6`H.P]]=zh ~~~555l6[[[ ̙30<\$WX1sTd2 >қ>twwW!`na3:Zv':fEGk@ 5y`ɊmYFR>$Hj^ cTVUYKkjHp-0vto<===??3ߌu֑#>jjjzy'''EMmmL&zzzE={( 222M}s6*bM6mΝVSSCIfffX,DRo5hs 359H;":Z<"$ '=|XU Ia5Y R$1HOc0 {yﯭZZZL&cb֮];uԞ={R/l޼yʔ)Ս޳gڵk%ɼy+GG|ggϞ7o^jj*rqqٻwoڨTOOOӋܺuk||>su|PaWr{\@ ƧNpssyrޅ .\PYlS$''+lڴIQ޽{*sA UP 0d1 ?p&:`@ cskO~MVQY~?p7CܓOf6tx#6H@߰%),} Z5a0""`;=zji{4V=[4lio=nʭĮ:$I8rH&Mp4rc'MQ%`hbLu裏,..c0(`,bbC,]=zSS@tޫCK_Зz4Ïy_P0rÆ>ys%~ ð}~ش"bȰ|'Or44K}1ne9Ay6YCCsɢ/FDVՋ晨NHm>ߣWƍ+PXT(9sbظOUGx T{Ogߞ]{ٴbGÇ?̩`0RRRRRRTTW[[bD$8`劊 ߮O?xI͝fw>Q[[p+vۻ|EzU1$(0PYm.ܾ睿>C[HΏ52 v_.Iã}'M#G/]VE5|PV?h5ȱbji[^aOf2%%%%%%մ- FFFRZ#!} B_|3K1=vڧsdEQ*2b}pSI`eezA 9 ƍ~fTyE.&|xm!=HIǏЋQ}"ლ2ibw Xh>=CbXFFFrں(j@  B .k55L&@766fitttB!N6dP$TU ,4D"ܽwdD8}&y˶" v}Pul~m dX,CB DBGj7Ȉ :H251E"zz`blx^qo~AA2?7ԙdW˘.u8#h'~g2`sD܈/am&@o:'jˆak --fA 3> _wA=0 ;/\~;Rt/ Yl9A F~#LrʘQ]\I'MI=Gbdrܕ%#88lbl,y ěT;0U!BP j%"L*㲆 mj!!^cۖ_,DQThH%^j%Arm^X*~μH7v׷ϱxx667deeIdqav++F ͍ecc;M!z=|9vPEwEKUewr{xG$77ð_~,<<|ذaógϒJKK7oc8^}1RfDqq1'Ą *zM<d*n1556f0MMMzamWen@ D"8bx +[L:idS   A/@sS [3Lґɀ6$Y]]ph===???څ`֭TSSCWVTT5?6nFA ΐkEjAme]uyM+^yqeiG綜S!5ѱ&).k]ve(| /vwh%XXX5:ڵk/_~ (޼y^dd֭[ ;v=Il\.:JsEvlktHTi'O2_- 2miӇD 35};㙃5T*[Xpvoޟi3ܽ;?++7a=ՖS,=$AIA!~z֊mKa9رc WhΝ;_YYaƍx֬Y999E 8p۶m%%%򼽽Araa#CFSP&j*J95v(/yގ9OP<`۫6A@q7ڙ(QQQQQQ mllk\.me\#LDL&3==]!VQѭa2. PSO/VtP(j޸&xy\r­|_cF),'&aX[fБL&+ (à ?֟A(R+bcM!6}`Be4%0*++jhhT ŏ=gNm۵oV勬̎\ڷc")O@iI @(H,4uQ^6U>5`"Ie!@Srڛi7n8>_AB胙8y]܅$I  쮬iK5yIPQ^.i[EUMM-#411ʺ߀XӇ { ;v"Iа3Iŋ:ښ<33^1;upr){$1I-rp5cPf0g۶mqqq/^fffRejjڮ];o[>}|=B!B<}bjjfP(*!>LiQaHo.ܜW/잙abbjm>/O7F1.GlZvV3i b54}@jSf5xsN;z#$Pb.ZR@PXXh```bbCG!Z׮$?~mnnqL#/OxL! ׮ܸvE&_,_rY;wc(wTnpl6tС[n:t000r\s=_,R,m,/Ox?)uᩥ@,slMmT;\S!qkmkjKvBtt?E4IS*++|!';[CkjS޹l5?tnEyʛ[ndB">n|lnnT3k0ICLf0A+[HIDATMooѡ&!B5fիec첔Q6 $aS:B!k껋*eS!uIEaBpС>K*CRˏ.W3k"c,!1I"!ZRvBJ~n'Y V[:W~ #,Afv$sep )55UMMֶwމt`ǎ2B}d0I!B yvϝ1ҵЯe#liފ0'I 3u!\.ɟ94M9u!<]4`gř{4"ūLQIiٔEjԐms8 |җLԴ.]V egdOIJ敹~;~_?`[Y 7Z2nuBOiWCMl**K_ˌԦ_L*53-~8x>$8 ̙̪*e  JNN S_AAfb022.rbG XSSuG!Zǐ~Y['}x-W/ɢ]n_?CWL0]ѠoܵUK֯Xs`صw]0ҚM>M#ѓ'h.niܻf,ݽ/G\P_O7foB\bgkx3z_+E=wA.u_;SF&䜽{dȳ`>^K=x ~lS115 ~s8΄ /`ގ{ԴK6mH,**b"Phll\8Neeett#jQ,"^ ?row~Zlݱҕ[=ݳa}گg݇G.;rw8yhn>g ̙op݄-4;uxz)1( ~8AcG~;unԦM4Ǚİ?eQ4v$uvE0i0_USJ] ]a]ӻEQ,-M[+=mGI/zě2duѪ5j"##ysJߙ3g\]]Ȉ O:::o!!!$Inݺu IYf8qb̘1 uG9tPX߯ҳryv߲݅}ߟ9δYKΜ2xk}{ugd_ hkc(9ESU%Y,8&d0ѣ_n c=!f$u4IUcH 5Ix$QTzptoܬx$H$jCB!͎CO>wK.̤}o܎nn]/GO1%+-͙IKzqciVL7jLwS' }=J$nGMMmwf^:?/ 9CƎ:wꍘ%L uIn}=kki.[2}ZknT3$&p6 k''B I>yJpu4xIkB,{UȼU!3Y,s}vo[{mn:Zwl~Ţ+I61miJ6:۩Uה`,讚jʤKsȧ?<| |jƐ{jzHugi4ϟ#IQf|>%TB! |UVd(ҁYPqKWWk, s$i s,>L~"q$5s=_,R,mRTI31v(/{TP0jYS{?0G$t#I 3 wyn4g6BI҅n;0{2w d?ʣiًkuGIAJ4B!%ձjjfjniD;&O*I !jT!ZZ% BvRzSwhUuTRi5uBUK~򤩻>47е^pDdYҸk&OG2 !jq<<pDD<< NVF𰟗h޵b׌ .U!P>tHB|\bB|Sw}K:QHxج )!>{U^R;wz4"ͷO|3}$g]ؿw q1 SΎ,"׍nU=don-O2mώ`i0trU ! &efƏ07]cekGSfsӯ'Nrέt֭]3qױotecP!DŽGd]LS07K= 8ѰI )H JL _T/B/F98u~a"SSRm6nӻ]x_jni~P#'OJ{|{#G OMI3u(_FzNH6wpvqڽݻwi?#"ϟѻKՠz8yLA]l[x͟E  q1?-^MQ3ظ~͝W$>c'~5jKK["$_ۚXͫ|fGO{lw鄢|J*xl;E{Ş=S56` EQ.:DQ#`BPh<8txu2EQ"rB=]݋0M>y9woo -#1J`ffųsQiNOa^leLΕKȕCV.k˜')zod9}2} (.Wy@:]@!UۛadfhRs6Zu_Uɬ55%t'&de>+RL4UTãB*pARRXN {!Th+TQQ֯_Jh !PR~ǴDz3:08laÇ51Z.G5DE ~()t1s8"ózB2%hWuy_UN; сG?vZ<.)!7οƌk;s޿eUh]5TQ^xxzaBM#epn^}@!>Ccr!BR _5uB!B!daB!$ #$B!Y!!Bod!!BI\!!B1ѩ#`B!GB!txB!d#BN>IH _@k3v o0s1Q3rft”Ib=գΓL+IENDB`PKi#:-Pictures/10000000000000420000001D83373369.pngPNG  IHDRB-JIDATxWKHQ! CA`PX bA0ڄ 1E⃨hEe(BzlD)sZ_83gfsf(1 H$iI4$ItH.K(Ʋj$8t^E%www#ggg%%%qWXXxwwJKK/..~uuusssffC'''===Nr5 H$h4IdO> MOO㰗l6[(jii6 uuu۔}>@ qMM dgg)}٦&Jl;;;Ad2===UTTyT*Jwzhd@G<22R^^:>tRTTƹ<766vuu ϣ%B:Z򙙙|>7P\\DCVV&zC@zz:0J2\hX,Tj ( `4Dz#ᨱdiil65+`\e/Р|/P?pv- Z ߏE# a ..?R???Ѣx%q(jp hzSٱ8|/++C}}}777(e2ё*$277%r0{1JED4Ž='pUUUX4ynqJeS\m$c})$ :IҠo5^5IENDB`PKi#: content.xml]KHrWexэ-QٮEwW,jvkzv}M)){H&UUoދ }00`m'KzJ%j|DfD| _{1aĸn a7Vg_vQ?܏B}q'.|"/x@ׅB%D[h}\3%3zo'$wE;c[T|]*]lEzwwg5L^Ww3]hUR,z5mј$קa!1j4p# 8ކS Gx'WpSTB\6UvȂ˔T Tkjͪ[.d1 6qlǹhӠ] -*tb >nDUƑtQL+̏bOw&D&,]iҀq1 ܲYɦ)F`G1>B5]!4FT3">!Îsg B@ʏ25RТjvaF2 68v_H.;w@ Y]=mL¥h7 sE??$-wRΈ|]nu&/By֥;i,waw:; ̯tdl^ p45ܵ>ctb %ͲّGGi/.u^;m>x(]`36QEݮc…śq9K9C\/EHY ,7O7bѬۇ5KgVϼ}̰tꙷWHQ^Q)޳^S=#KAlҍk"k{i3o,q"QnZJ^brzOa?[r"Ki9qrn\KO`b;*7,nTHĈ6^5(Nq^Iz/>qrwsVi{j9 ́rwA8~%[D}0ۍ&=STPzx=١-SuFڭM6W;ڱYfykikԮ av뇿Q;v 7ѽlH @Zf{kwkԮ}Mm>Yҥo\Kr@N.ɥ?'wҟ\K.}OǍY1,ǭߩ=yrD>E4Qc: ]b?&'<˳,X@GrbɇT9;h^) dqk5̭4l(,cos*\3+7n堹խe7^ypřv\tJR=ƫ=Wp4T[Y޸窵VJg7^N-Jf=ڧ)Ӷs1q8^ŭSXxuzNYc)q<:e=Yǒ蜲OΝĭSxxuzNYc)qL:e=Wp8*fP֣w A vWLw >Qâ%JRq&Q,_jwoo7 |z18}hᮍ5ה8%i6if됂0sW|6cF 44p_*1q*N>ccs&4l/1=7)| ڍA Z0?,4\Q\27`CbJxJe!uAjBfCK%w c0$E/$4 !Z=$8JݘH;9Lcl_o ^>Rהbr,g CB\}u qU~OIA/C" 06#Ts MAneR`a}&AAd΅>PƷTǰ^h:}L>DӜn,2-lhSEV-:=T{|H> kγDՓ`<,@`\d1/q J%:Ƶ*mbKAوH?n>Hs.A RH71`>H_;Ib RXkZ\3[Vwzf:D\z轩=)rҁ7!姁ˣYƢKh{sk통( a]o`tapsAh+~=jΈBXxv"+^( ZDй`Q0~/~Uo{([6D|Lr#oĞ!DUi>Gwl9) >37Q&04LkbOfS/=m[WoZO=y"#\*b9Cw#>Q1Hi Ozqg΄:pT{JüXbڦ"dM5eڽnm۵:O.+S H. SB *¿. 4OK+~ F蜋~(~飣Lp?XebGMLV͎1[LC\(Pށ>>p!}p Tu`81J5o $i0f97ѫu[bC֙u*Q/&Fƫ$}O)\F)-,q ,-Fx9@-m@^4Í~~?  ,3W8pH s;/ TC#G1\v18,^PM/P$-+$5nqe*H869# Ӹ4K9Yk*J^@E)5L+ǯ|}TVK{7K*3"VZ!? ;hҫ̲F ̶AVG5ͭYj7W1춯WWOn /LndA(GL9Z77[VАQ8 Sm!6鋆2I7>!X'WaoL1tIeytH$L74nshT*}7Hx>hR#L`lKzLIH0Stb+F1SkG1ٸLQ0I-S2G;^ښRf;T2H7Tg~z9>S۟ ܤ U][[kg,l5z]p$uE1;pB?eHx_bK"]QO2F9H8 & 4XZ9r |%*;/DJx-o1s(5ZxP^Nw#BY=Ê5V-q&cժބtv܊Lx3rd})8kLf_;Hsp><溋D6ch{b*Y\B?'|rAօc4q.(F`!R4EDȐ.APk .Yhq={O`iwTޞTMrhP3LNWApBC"ȘLH0f tߋMҟ=/ ݳ.LތIzg?.~?QŽ~.=W(=E/TDM8jM3'\>h^.XI`Č4xܘGmc-4Г6m58=F vyݟG_H5?/V003чDG/ٺ9]ypHS=uߧs?/5 LXbc Ȉ≁l1 9ʲ92L3VJrܵoC覱vmA IHKԀ)gBH19 Q._VR Ag+$:sħB`!["`Q"HC3! 98BM2"]Xڪd]O<6мlK7Av@,Lc 5 2P 9=)۰YQrhk[s']ӲzٖVfGmt^d[ ho|X~S_܁:S.!# .gz|mAȦf4}7X*no\D$.HFeO~K-JՅ`4ǧ&#@j^ ʜ-ZLR`$hV…8̀Wmsyv%dR h*Kt 0'+O`ZiݞvZ.z&m͎~^+ &4]? C1 [Ȝ1&d<y4^>" jd'"ԞW:u,Y\db/TFg1>gG8/F0ܹQYM>6QqV(4"@dk?զ":ؑꮵV+U^5;e @v>.ynj[nY۸e$?O&@?U`H-{<\|S/UyLZOLcaÙ2A5^;N "!Y|4f.;b*Y4y@S7b_ F.ĥe뽹GLٜweZ!Zo{N^QXbٺjdppb, f>tv0"n F%-DI-N/Y>JyVVB{gSJ4~aܨ>CvY~{Ϟ4lERtC2~g|JM xp?ƶr~Y$E$͂GfGc&_dWQb$QC9kע&*Q1f%O7gf{ckfݙ^imZ*~m4:FAL4] Zm0RϋS]C4pcNT]&9<>K $IӡMK"0d19ň >9q SZBPVJ\/x% ,iK{Eaq|Ko޶_iWK,[kzV[Oϣ@T؊q :nUHA|ش葝?\ꊾTZhɧ:d,,j~RsRCHSPV>gFE#ߢ-]v}2|36#@ J#hP |QåJ 2Θ\<Ŋ쉴:{E)f+jf -_/~{fmZ?}Pj`o-xl(EqMhKٝ 4.3݄0|%ޅ1.x Md7>ۘƗ"+;\:3`[`x|X|2|t$=($T yl.MB'[ͽ.{pxa}?{PK jcPKi#: styles.xmlr6}BNH][3^ڙdv Аu9ABIѲ3Cp8w|g;*1`Fy*27?+~|wbf)]f" u1j\--1$_ ZrRPR;4a6 ԚTb=% OIJ`S|-TE$u8~ Z(\M?<@m,b,=1U*Y9yۧB4"MPnXFEKQicqQ 0B0u7=.R7(NH֤jn8Hhd"̄I fukwt-IJÌzf@kR8:n$), n;,%THjK2:<<M z P$" ɾ$G~yjPr=CY%}ކv([\yaPI|X⇤e@l JrKJRr uP7 ^Bë<(ɰ :}JQ0GCZVFj4NJmr7Uf!O~jeT ]"vߕ}{r88P-A=Lq)a@{60ø5I^MIh@rKfaN2uĸ++2:r` 3Q wq5[=۔"< (ӅR85hZGu.3R rŜUS?Qv%$r C)IϔxV$$،<#2 ks_N : %փ` Uᘺ>'X=YٱOKU J{ۮx~'54dn2.aNm,F.m\>G@u.sr\5/ }<}k,'щgRbԽAKIdm& %Q]fTM03p td0hGQIjqox`~Qcߨ^uKL11RM=8&+*mN`jw4 =e-ȳ(5$R9p?m IɸoIT'ݎԒ۪/U{}ߌ{U޿/s˜Sk7isAkN&FXQ!{\{  xn7lvf>ʤ͚s-/:W h1yì/]ZJ,@ٳ _)֦0yٕË.,&\7Qt+d%=-VP,p[th m=O!Y0Swi;ZT,&3ĪvVWKiKRnϠ3Kzn,$ b[ HuB|%PT&m (5y7o"M޽DDH}xFeօ M5T]r-}j)>!H^Q<%EG 3mf0> wXXkHy6 WбGNm}֩VZ0Si:2n2N(#0xwOZDzάe ,v'ak!`B8pH{!Ԓ0t:hEY4yõgAұX}+=Å+ ;7/Ǯ>Q)mm Ҹ'O63$SoфJ݈#*QOF VPhՋ$w^Ջ.~A9# qGŨPKle.K-PKi#:N((meta.xml OpenOffice.org/3.0$Linux OpenOffice.org_project/300m7$Build-93542008-12-27T21:45:312009-01-03T14:12:3048PT03H38M43SPKi#:Thumbnails/thumbnail.pngfPNG  IHDRB -IDATx Mǟ^ɾVJZY#IPII_D$_RH IT5Kvf,~3w{gz^q=|g<9,۶%>}.P'cђ3د|r뭷JJJ̘1CƏ/lݺ޳gԫWOj׮-w9rdH;wnLr}W+W.9qO7o.E^zIN:%R`A裏d޽r%ٲe̟?>+VL|bȡCL2sW^ҥK*U#+$i&}3gN)\Y44kc+̬A'Oiڴ4o(fFнv\.ybfcƌq|c xpiK҃XqqqQi!ժU ꪫnݺ8JW^iDy{رC~ʕ+eРA;V_X7J˖-e qqGʾ}TZhf͚jZINNʕ+K%t׭[S*THlȐ!:eжQ言}ix2|!OXGƆ/WN%nr{[Nekyed=Zbi⮨<H*Z8oz@IIܭl|5+~*4l*ȓn)o^ɗ/$'mV Lp[;wZx.U.WK}[TDcX}~Si*u:A![gsK\PA9~:Q:2~&z٫:̩c@'A^Y9RNm9͛&fX6WgS9~q ZuC 줉'L{5XIf7R\S4[pU͈mrl)HM4=ٳg,&3c<1cL\zm5RKCDժU j,C=ޝ uZnZYc6O?iJ &nX@z3Ym}?>{h3` QoժX)q0rЧL|rENחm۶i,MM}b`1KIo}r?c1:ŋklԨVӥKe T{=0߆+ݺuW<خk?}Svzx%}mS!۲;;j9UpN*3z2jգ ]'C ìX deo$)XjB,4(()y\,ROr-nJSLzO?kd#5:&d<|cKW}WͷC?뿛TyPFUIUB?8a7A3lI9|x.]|?̌:>K>fpԩk2x4.9q$;MgVK1|07-ԭ[-XlLד&bY1l#C7e*g daMN {r4ty"2LgvQcoSF7^4 NK^}%w=9rɴw?20pCTJsY8}wyukVT0P4o0i,4wD*h"9LVqxveֱcGbTmΒƯ{xh7L/)={*M1O=zl(.ˀ/rՉ12$ŝ*0dp;䶖,Yޚ㭩g\;L^eb9X5 <` YӧkP)oӱG}=!|nmm(XI ۂQ̵g?sxǟ`DT#☱0 g=N!\-:Y,e9(a)XJ 3f "Ob$P8?=H,INBU<kJ΂<€sd}Ybhg73/K䟘 RAN]vտ֋e02`,~vb2Ctweg`Eyp%z<%!{3saI|mX0MӦM=3Cfљ+3R%" ڥ!Q586ђ.Bϰ$F ,xYH&AȖѬFk q7!A9`{BhHӢdF(5y$oU&,$"A3sGVEaY4ͳ=CP=|֎5hƎ9MHg4_֣>ʈmRv khS H[/\&KVw8H&]F̠@ʝτHe˼ΓdoK3:  a\b:2@p6/`^jӇsdS({ py8w!x3k0A(]Cɗ͒y,.B* œӨƿL1eFg#wr$q ᷌X{L>c Y6BfcT-bq-`E@'f KYЦA5% bo1t 4oq~" O !`H)*M˝XC _?26BOs5V*{Vo)-wȉTsdٷ?Hܹ$QaH|WH"^'*fWBR\&{{"g;Hw!djbL1 DŽo3 Gi.ݍ:s3f;cڸ ޘ @T ,Pjq(đbC1x l( q-N !08Bg{$0ƙ9x@ s33߲XdFƍ:!|\>}l벴 m t~̬\0"3}t&L6(lع*`H8 ,T'*`LfϞ1p0ֹ C@= ժU<x`$(3ْ NC{D!pYa:*Y dJ#Nqb۶m=N"&(f1`p gj ht͹|dj܂ )Vk+=@n B)ԅ`TyT"T+"!͙1![ &\Gf/d#e肘M>FoC=DN.#e肘!Ȳ-.h.\fk׮iCHru0^<,3b`d^[6yHblcf8mZ SE/kٲ0a0ScA<1h#drbfK>bQf]?53ȄCB"PZ_"';k-eB_x/}ý>XFHp7gYVhj7?H*׌>}rWd֜;qVxG_fȠH (zȐ! `jqQj,x_$ޘS.J(E/MD||驺ى11`M OLX ӁHр H뜁i>A)@"rܘȈ-[n R^dMhqKK. % B`vP+$ C+?wBăDLDjp#IN6}}0JRmh , S's_YY "BB bnj0 D yh#fV2 }BhEĉX0y#$>tPЕ@Eb)Y ,9GdfԑGL MZZXlLΞL @Tv (2?0s'Y2>|{x:pT%Pg,ʺ@G6m+;/IA"L!q0l2\Qzc'5HWyԓD/&ՇnVr@ڨwaqFm*(2 fƏyf̘ae/+\{VR Ab`РV=D@jnܯkV$H3h꾔e 2+rsQ5WfmP"+ApذaFg.#0Eɀ`0ky+ D}l #$4 Q <5A!H0Z})Qod0j )3%‘M8Q{O߱16 3 `K P B,! S0j\Z h d`br>ll(FH0cB074Ab7"jnH 8J3Ō FTP7zi%H*{Go }4Axi:ujT=8JpcXmcClD-dhh^ ="( 3dt-yŊp중hb3;3bl 4`/iXʑʑrcqa{sKt4M(!+393?Y*SCIENDB`PKmkfPKi#: settings.xmlY[s:~?"w4 LBǐCC7a/Hrߕl2)`DbK{ʷ_1?y"wi;`ɝ@ztiEC#8S@[8s2#oq=NJhERirڔBpT '!G79vى$a3 I% t)*ysE*8✡$jmʧXka .`r4٢{sC[(± L,Ee!wrk3xcTk2ܶGW j,D78`H@h io :nx)2E;h:o_ELRU<JށƤ*HQ7Z㋀jIKe/msuf*%Ijw 6&/)Vm$480,Dj}p>JlP,qKisl[BYE!!, _WPX\0a]?8#,:lo&Re 3X*7>Y (5_kiͩ-trT%Q%D]nj)x8ǹAogy>f"2+=xiFDzDxCf8x!fa0Sb>rggw|Ř̖$(䩱H_pyߏLDb*v&;ˋuwCs셬&`fI ~D2}^r7%w}ePKGPKi#:META-INF/manifest.xmlr #*Ӊˌ#i޾fvN>9GSi'㻞3;ƫȒ~Z5=*>WfffǂH&cN*cUƢ|'JP?=i4 YMf`w]at\Z8mkVe|Y*ѪQ^%-qJ&U;& QZnyR):PWn;9kDщ[dHUGtML\ QO&RQ RIwj}Hjcl~4J7=~.BA^0_pBCX56g ς"+e` DZC8ĺ~|? >z ,¬Et*a D9f^~(Js{t@o#z{i!>F f`zn,0?@xZe#]+ա UaWї7ݼrj ԹpXy9]\_NOPK@ s PKi#:^2 ''mimetypePKi#:MConfigurations2/statusbar/PKi#:'Configurations2/accelerator/current.xmlPKi#:Configurations2/floater/PKi#:Configurations2/popupmenu/PKi#:JConfigurations2/progressbar/PKi#:Configurations2/menubar/PKi#:Configurations2/toolbar/PKi#:Configurations2/images/Bitmaps/PKi#:--Pictures/100000000000030E0000016989F88827.pngPKi#:eZGG-5Pictures/100000000000007B00000023B3D486EB.pngPKi#:|-Pictures/100000000000031E0000019100DA39E0.pngPKi#:1)-Pictures/10000000000003100000016C2FCFEA52.pngPKi#:us!AA-Pictures/10000000000001F6000001809928CBE5.pngPKi#:c6-sPictures/10000000000000630000002F91781176.pngPKi#:!DD-Pictures/100000000000008900000030F833F6CF.pngPKi#:{W??-`Pictures/100000000000014700000137C92DA7D3.pngPKi#:ecE-/Pictures/100000000000030D00000169886D88BD.pngPKi#:>YZ -$Pictures/100000000000030B0000016A53980135.pngPKi#:,C:-Pictures/100000000000008D0000002419842777.pngPKi#:- Pictures/10000000000000420000001D83373369.pngPKi#: jc $content.xmlPKi#:le.K- f@styles.xmlPKi#:N((Hmeta.xmlPKi#:mkf7MThumbnails/thumbnail.pngPKi#:G lsettings.xmlPKi#:@ s 2rMETA-INF/manifest.xmlPK2~tqtoctave-0.10.1/qtjs/doc/english/building guis with Qt Designer and qtjs.odt0000644000175000017500000127274511511434225025562 0ustar lucaslucasPK':^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK':Configurations2/statusbar/PK':'Configurations2/accelerator/current.xmlPKPK':Configurations2/floater/PK':Configurations2/popupmenu/PK':Configurations2/progressbar/PK':Configurations2/menubar/PK':Configurations2/toolbar/PK':Configurations2/images/Bitmaps/PK':-Pictures/100000000000030E0000016989F88827.pngPNG  IHDRiNtIME ;3E)tEXtSoftwareXPaint 2.7.8.1=bM IDATxw|iwYHz%vbNNszr)N.ɥ]%$\_$nr$jV )^6 r")iwIŎ? 1<;yx>|Bu@ oS;"o|›gy̆}2̦ԶqfϜ:>6M)eDLF0lB-XSrdщYbEiɳ.`H<?al?:NI/<=ŤdutRƥy\$MQ0@x腖 ]+Ϩ9 Vw=m+h]uUgV:<MJ L Ed1l,@;K]f3"bI| O``@H0( 10@ $$h4gƒFШh B&]YB4 2FA"64@gS!+PbcC8~rc_ v̓I)e#+ !jrϽ~? O4Hhvƺl)hHWy@zhbTUvSE8-!B1t)P1K&3,`0€<[`۰3O+5FSZsȺeK*x!HJ +iQJYZ!#2HXpɓ/m ,ڌ!B3Y̰m1Y 2 % c"tc0$,;n#樣%LumjZQ \ı>0~b]BU!~Rk.Ҕr*1篚YoY̓bLh;HRwe$}ѧ*(>WұFs%>" HXE( 1 S`l8amQH(uSN%} 9ypQT٥]i3dI o_U0\X RdB'oNmJrK-= #9`6嫥Nw4EŎW-ȉY5U }982gΆWYyu}wevm=#05?zie={SyْLe,L i,Xc,ٹc\I*s.z))e\iZ_7;rq2SJev<-\*@5Ŷݼi;w`Ns=oF`pռ1tIha@ 4*-e3E =|<֩f /.^k_u$%[Dnٙs]]o]W[f>h4ܲd/~nEKW|u ,}?|us.M^^,2Oe֮xյ׿cHٲyK;w㝻vw}i͛73-}ࡇer.^XiD"対J+q.qS57̮[|o֬p7 @ # dIEWVVVz`/嫝]]I,c—n{X,>N܏}Yw4gO-[]/zco_jz=;{[_?3*wwsO70IOV?p1{ޅ cwm[`iɬ \I^0UU5Mu|3DiW|qD"qlE ׮YsX,vرMק_L)moKݤ?i97_A8x;}pСukf&~xgԥo*؍oz#\sUGsF@ G*zq[zdsKKj1Ǒp8Ex%3(AJSѳo_j8uz6??<Äi|u۶/}+\wCp\eK,Y#9~#GYyƫNgTYM]% x™3flrMW}3CAwtt.?Ǭ]\+2I>iOZ:|dr'Nf(\e{=#"Q Kۛ_2ҺZ&#@ isD)Z@ ^ۈo qv j;7.bۚxen\{^%"++tR)W^\ @]QPgk+]@ W1@ %J@ EM@ @ªwоV{K!Ok 8pၞW$ .dBOJ,repW.ˈnPŔ>+ }+o3XTtUI C.YʉxG$GJ'׿1 _9}?ʉ~ľJ@ EJ@ 55g$B'KVvWpi RY+x&X{{GOO-)-y7#L0#)`LSriim7 R a14eK}^S,GG`VI rW_ޞUʊy&;plcvi]SjةSglKF2I`-7(O*T=Gr%U\w?ӣ*ٖӴaee2p2nzTE }W5"P+j{Zz.o?Qnyn,aIE˿/rVv03w-Zz, ]0ꪪ9H3****B(װ,H4P"4Lcp`pɒk׬N&JJ)XC[˝[ZZ?;E-S._rN^+/3t!lS`.!FxƜU&V,IR={_rƦ}aEQ0Ʀiڶ|MD`R8u*:ĵ[>IY\P@'M˺'s]NwfU}$cQJÄ0J1!m۔Rx,_=#Ti6&i+{vWbS/|m[yŵR)o]XX8mEXo3܈" 2|OsVwtG2VU‰n߿{& !@z^ K޻=UBM"־ecHZE6ۦ}}a`IzyyN3f̖d2p8**+%EyC)R Nnji@r9eYv,k̙|rɲUVVĖeK={vh`gS[}LRˊF^w=-̚5SQJi"())ϭkkogekI:X588ԓes嵷tTshw9^v~) F,IZjՎ;66ήɲv$IeY`JeY\C⧲yRI"jة8 S9KI*ˊm[=ڶ-IcԶmUU(3H9>o???mI0bXNj#nvȊ5vR۶EI1&Imۖea-m#cj&Tlm7U>BHdd$ȂʖIL dre!+P^~iNMo2A2=V1,@mFD\v9ֿ߾+W,̓1n ͛9{32CycCښQSf-sx]J"`Pdv74wS8+K!t,!!&%MnkzClR2uc4aRFɤ$g 󝎌`5CPR1Š"(J^^^WOS˦ׅ1vUVYY2dH$&g%K .(((((P! zt">p$άQ3:v,IAWY}Fcej [p9eb1JI$uz_hx3=%~*+!I#u]箔Xu0Bd嵶+avK(Jt$ m75tw`(c<2B?0 ',-)8no˲%X-I#S-L&O_+//PR\r̳*idp:#L2-.i2B_7}Gu_'~LOo(RQ.qc]njYVgϐ+8/D0qo~Կ!\gɻJ3k)Y̡Sǯ02+"##*I8JxaqNs+sa\0^G7o#HJR3}936gB%N !|np%$I%tMN,:[0LEC\sgWgAAeDcxҤX,2D#e?r$q7<84U'u=H$d"!rAA%5L,m /[zI[^^.KeS"F)!݁-m--ճjFzTq$GFF‘|>Rf׊Ȳi,˔f= !.L>=Dz&s-Rr"HRO U20?&6b1"Ia۶(D@e41”Q@OOOWWwRJ7~HksEUfB3F`xxxh(tYU)'E$Tp8L۶URQd2ɟߩ{pqz+wk?Ou=pm"X<:::ZZZl/|=߸A0WUpdxx8jj~~'1MBǀ-"q8~Lp"} #H$Hضt8 ]pK-nӽ}`!H$DGb1OlcٵWmz(r8^coYVje5~iҔ -"K7s0Fa,4ViL˲B)5LA6\Bkb|aI]p: HO˦j5!"I,eΔZy7*Q]mnRꗸ' -V}Wuw]~b}JA~_!XԮ?k;nβqg5 ={ylS*wLuC#tN3~ݽn|Ϊpw7-sSPeJUVRt|s̊yTGFFR_eKcק'Ǟxc0i4[ݴqMzxkza(<-7t@sݸg9N kUP09@NŅbM`2s]ɖK޶tU!'MӢRh{N.\n >A"l=stW18$,kH$qY4MeE$0aBQd)b88n"nk?oޱcbј?8P00dYx<qO070sFMUM3 3Ȧijr@s-->ͮ...r\ᑑ0!DbϞ::-Zؘ{9_EEEX蚫/ gFee'บw.ϔR۲c+.$$0F<8yI]hkk;KN#s$~yH,㔶jjYe[Z  (>:@ڮ0p/KyFg7d^f(pwC=c˲m,,p\j P!Muw<ZVZ폛- 3Yt1JIO1@szKA&KF[wn-r;$2 ݰl=i:Ǟ++>st w<ՎC?]ҺlJ͙"Rʀ2fS0mA71 %C̰-B֞>s&x=^0B.3QFNDG EF˶. ]O$N9.O~0uC fϮI$⽽g4zܞ򲲡p(OضZ[[###sjk,wBݞΝk.+-4xp(4o&co{a99f8 ?qJ$7o.754Mr1$"YA&Tm%xp D:#vˑ#Gx&вP݌l #$I zߙ*y7ʼF鬬v3-z*dY=o F7l):я)$e*QKyd洵}#v弾#,I=si_ 1jSfN:鍙j#fw;NgJp}s3-˲ Ŷ|JWb IhsxY7Oj9תO %V2a3W\l3g2 $ :1MFFb####)R*V%BP(p8 3MNvUU c408PXPph>u ?[N gN])E ht8...RUuphhddRGGgg^ MO$64mm,BCxܴx,VX,/+ MV$QJ-6L$+q$XO$zzz{l R]0PRHQcHrR1ƖeUxVM$˶YJX˲ ˲A&K2߶`ڭJ,KQ˲dI>v(c")2c`e1|Ulf1e|O<݉0@ X|d:W ׼yn?Љ͆ c ,RU2 Cjê'~?)xa kiM[";'ɝԵqA>B&^[^q?cgⲒ2pFfeYHVIv o+<84SKESq>wʌܠ6M)C4>K5f2Pw$PXN?NfJL>lܵ&fiE"zS` {A]7 w?/nX M]'aڶy#m;EEEپƠ;X27qj% 4\j`ѐoKά[YJ&uʨc}^mii. BX\4ߧHRoO_"-e9888XR\,iDv=gFѪYb1E-\C__Ggsmm{_7wnݜږgڢ &) (3-DR٪/*c׳nǟxr$iٖe4(5J _F$$ɔR -|+)oF˲)I=S~yDlpF$L"XHS%LPe$!2Ȳ 0|+HB?掞M] bkp`Td2c3.8Llv8A aǡ~3X%_3I=U/g7K܈1;]VMf-e{֮H(5p8 x]nSSaYȡr..l,`ITJ4/8Y?25sf^~H-xikk/..q;CC3gJ$S,lllr9]%wG!,\/?vs0.S;; O[((Iڴ̑StHwk\ e!&cEV<c[} /X0??//cƈo ΘO7ywLpm)v5L i^66lPW`270Mo3ͥ (#A2Ʒ7'$tRJeI,ysuy뙗c?OK;bOoeUUJ׊R\9;^xq\Y"m׷󧦤ߘrgG%E}% m}^4r7iUJoTe9ї@$60- s`$jlOs@dǑx !ɲL#$Π3 <EoœMƊ,Ij8udw,&2gΰmN $iU+3h4y˖Oz=3gTܮlwX!ܮ3*Y'-?wNC6ˊcCEzr˖MNefleK.,+Їz{CuuP0bcKJ {ͪU֓&พķ,+eRJޗ$0áp0HX 5Lzͩ꫸};I,7 S<%e ԆHQqs4RB$۶0ƄH\=CS!z\;ڳ#1 8B_N)=qwӡ>D%iX?1~( &hс3,!$IDe`: _7l)N\fr RiBϰf  ?4~G p,9B}c(cTe`u>0 ƛ.F]YiKɤ[n1cOp_4O|(jmi{R>p?UVVNE'{5oMT8Ӹ `l?l`d+40 VrۮݲCqǴl])M`.COn?b6lp]9O4"iM۝78*qӻVrږ Zi]Ҙ?;fͪ' *+=,ґ$̜Yqsfͪڶ^w-oOۦ]==k׬bL&lfU8rhu,1884 aI4MFFzz5.gΞ- }~%KO<Oϛn{|O}-OBk˲57{c߀$Ia6 ְL2q[ϟǷx!y 'c]Ƅ1ᣙyR0:R,`a,לS㓿R5MQd~1Ԋ'g~سm3 L-}"(Ul?ٽ,Y}[[%y`3=|7Bp|FO&%#dX*M%2+<2◿ϲƨe[Y3gFDH<0ʷS;,7 U qU 7``#`@pi09QשHښ‘H2y+wٿXsv[T͚ Tґ pjjk>"/4Ͱ+*OM"GtT{^fNS%`=ػ~dZ0k [eG39[0Oe9mo{-ٮD"۶}1m) |#_`SpwO/\aN쓟XuUU-.ڥKey, q_% F@('L@0u(3mDsf Fm۲m* m_|ptɪ_0(XTU/Fs?-*[OX`ʂMj]YYQZZjmc_Ic]3{x8r YQ4M 4n[@^h8TVR$D]SS5>lDE|9 ضYT\zMꂂaLHuuUqIc'Ν+.*r\ᑑ@ JiH[ 7sbӥ͟;7X `۶;:::Ñ0_`|(((x;[C@^0rg)//+kxxcL)KAxݛbӋ1oq/'ϛLDz1g!0- S2|RVXjE &LTedcNeKGTU*)Tih,^1cJY.-k{j~Hb}$&'eeR"/`M]Q|'a [y:ϞsU92+,J3ŗvַuc֬I(jYf>sL?{E7swi J)@BK(T(E_DA@P@ H@$@*=- Ǚ%4ϓ']YgӆyqqvV=9Ggΰۼc\Jt Y{k VL%l(:McVjJ=t9z`g''k>-E`kkqZ-a|>1.qRie2UiiUED.ޔ1Ol3Fŀ Ú)b8.y|H,6&=ZV$H*#+Zl)a" QHHHFfF_z2%7!l:7/R֨5\kM{NmmMtieeZʒq9ܪdzH$EQEEEEEEE*^oG.MN;NQs?i*6)f$ߔX *5*sݱp (ER@$b7j)XޭȂfsh Z[Zls`b2$ k腎*×3d'ݻܾ\{x=Ud#-Hů[p}r_zt'c&1y^:pIY`ƊQ99k0{^uv蘝ضӫqgN;~pG<~ç.xפc})]rNQ5!N*e4h祑6ϒ P D"H cܒRFKd!I-^IfRPܼ‚BJqoD(0k1枝6666"_Rt:\ =LInn+7Йd8ƧCflih+nk0f$I&Oʧ.f^YKbf>3aƾQw5Hqpa4$YhhٓhiS_9!sz q8fpI*JVUUUZ $IǗn8*BĒo;5jE&.D"1[nbb#Vu3Kuw"6 ***jB{t-ޙyz1dgwɀ==<D`hƽ|Ge2<_z{DHTe0_˗;}mmVV<. &< |p8l\o!W#0L tuIp3lߘ۵U*5AbM*65Tj+j4jƸ\갻ۅ Z)Tjoo/f۠+ d`\b++eA.*5TmbJeM]C(}|# jK{cv^}mj 8{ؽO 8I7-N2`,| 8'JM995>-&5m:ΰxk9VxtdSWi1CTjY  3Y.Ip^}ur?gg'Bh$5ݵiy\.elfs ; *pM>Xvvvv*Zs8_31P$I?86g'7La\ufVcGIvvm)ev?|]wf{bbWqp8B!g: )2t2G\>49D=krk5=̲TWt]˽w7bvA}^AOʶ?6G{Ejh׮xkVUA_HǒQZOs  J  B WG9qE~WGh-2&A;8%&$\_irGC@ '0ÜiժggBݸm@Aiwh-^ۻFñmAg5R233ۤ%Ht濗ں  tCLa8?UB! /tCL& @A AAB%AAzռ.ԇ1=|61@zx߷g% ʊ(QuoL5I>ހa:yzt#ku۶U;kƌϏ r:}xQ׮] 3+OĀGyyNqlX]}U?Z\3T8D&TvPx \oލ^_o!woe{\<umtuq8s̶m H 9s>ٹ}ϗƎ?u∧G̮.: yk&VMQձ/1)3`@񏃕7^xʋrtysAFǰs/+r@[x0_;b`UUyyuyr~~S{zgRɯ?>':wj2G3gN|23уkLK/]fH|KuGAZȊ&OvzC֮9 8{OOm1d>n&%7p3p_"Gus_&}A}"FMJNe5a}? U>ffetQcǷKJZ\3T;077.'p"OL0qO,zWϟQ>O~3)n%Cb>[pO?2}H. :d0{o\%gXg; ͙BBŠ˘ >Uo&Ai ; r1q7NJ&Mo>9}ڍ/}ߝɮ2o֬Z[(+/UORO?>qTU===&^4qW4ڧQ(--  =%^ضV>L ٧wx|¥ꔔYYCGW_a+*_:&M|9sɱ_sqquFׇۥñK-Bxi;b͜>8%K-[k'L0 L0+/c !Ai2͖H$ƉR[ۊ f1F訤dlOm2YՍIG ;{)4a<ޭ <C/Z fA7QW^֌}iSp6п߅ ..AA8GhmmխkWkYɦP*\KKlj `gggاj괙8j*g1U"b𣘿wUd8[Z>;)/Ebg1&e?_؀˗8 AX[$YY)2$I2 j㲵OmU*͜Y,EõslQru7[U_q8fWՍ($|hSpҠ~߲#o~I oBkZWQQ$ B\.@wwCJfql WUə\jk NaqV{}EPS|tAZH$ ?zS&O:ݿ'z^R B\.>rNT*E"MY4&nN_wۿo JR,5N73nRZ}ىӧJR[[w7gGD{;;sb GGch8'7$h;gu D"р6HWST ?5֬^񧋌K̵2fMykA3|+v:z1aأp`サOmWsO}솟~d7fRrPH^a}-E >YۡCw58(ȯV}jGDxf 'o'#A1MZty}ڹQؖޑ9x賅}j_6g_Lphe_ u'2$e+p9ޑ_pA}5k)q51(yH4awĴ;fsm۟vvv23מ52<k#<Ϙ233sk $۪NL1l萙8qt``>͘1}۶?컫sooggB>csJۺ)O?;oO7ZYYgjl|:1AImAYY{ 0LJ3nS&uCZlP)0f-hU'L*J ں97þ{h)(0QƃV ]}k[VUڸqWc-Njw㳅mFALڸq*ڸqcbh yP i&Nw)^̷3abNw \p$ ޞ+-k~Yy.P 1VU=jz 4Mr}y!.\,|[;tg]\\jbQO}09e ): SQ4U{Y$D1!BVLnCk(4. HiG)CE }m ^Uj+4UWaYy3o5駟VÂd>4dRlz) `6ʊ9rlsM,YYQ)IϘ?0(0(<0P@.'T",8[JgjM54]b HoBQ4I?[@Yyw;zxv~yW<{njpbp~X{y__-ur|XEFlG屣GqR~`k FfG Ir˿Xf ?`μO4pNccp~j?砿4še ݬl`T HNO*i]ݘ7iμv hoђXhi+ `jSJEhC4'U` ~[\ڋyO>hv4apƟ7m%؆:G<}泅Io-[-d=dE7w|ev'G9Uku߭ժQnOwՀ/wvѧհv)e;'| ~*ݹ_\_pkz̛D$ET'N.Tba*Xh"(q(qV$[\|Bb.W-_}x0=puq9w>ذ3z$ǼzM.;w֗S\(Z^oΜѢ{}kYoS{:D\"}<.%꭬];ؖU*ƈJmwDݻu52/}Aa! ̪q'T#ob4 EQ&4jccӏt 0&],W0˅E[<ܽgxpqJ}J5.W y'TǽJS',2&T]QrJ=GVO?5wD|4zH8~_,~51//ݹau%%%+Oeiѐae={_̯B낃[:Nu@a/r\!b#sYe.qJQԄbl=rqc){ Nr7&tvd_6p[7x%_,?&ƿK>[x豖;mKfAєǐ9l_9l?)UB).U]VO?dlwy{o~٣v~"hђϻu*)'VTV~3VS~8Cowvv:y"ч|EF~5Mѵ2wodV޺YSFG gOe3]@yE{>?,Ǝ旗 ~eUUbf\˥ԣ;`6NjC[}Zo׬8?[q?y|PwN1c;'OFM?=O4eh9uVP(f3X2&{Ý:3ikk$e2%I@ӏw(W(4%8(p:nޙ{;z1@X#EZR%j7 pD@BYَ'k5A%BPy58 Ap2iNَHPܺ}gp :de^/J/}v/ e? D 4yo͜1iCGf;;D rٛ}ͮ KX6uwޞ} ~5bYy_''Nrss܇J:_/Ek\VkإZ-9╯V}}/5uE mׅ~L䯛uVA] ˫A3qҤ1=szFjvPJ!Nx  |ɪN,V{Vɫ86eaaѢͮlYڇciJ&ID"b֭߰nFoW}Z;= ("˱qYA(h&4EmvGg^*jǡ*0y-$7FZ?cvvA1 lOSI^V[jg^%N_ֿH^":19SL3g!~۾}{BBBûݼyY4iuݸR!t-BARRڪH"C7i$-MÖط$C*t\ymƌ;v0N믿f̘@( ,0FRk ρh당y"rm& ٺͲ;=Afr0JP٩v$˝n߾ =z(((to;w\ҥK'O>hРQFݹs$Ʉ??SN=>!!!-;v,;v>KNN}{3'=|pp6L~_֯lTz|vxB(g7w>VI'=OI,WI"3fǎ_|ܹsdڴi∈ק#55L}zdd)1cŋ͛W-[U >I\]ƌwʜ 77/&TrtrnL쮪Ve׈F(RyB~tjoTT_-SX-}ƌ9s0Ҏ;֯_ǏSNO׏Ք'N4i=z4..N.8pX,ٳO^gdu^n+)6c H'G,4x- PT{bN;af+] ċ-}|YX/Lbb-#O3qd:9 8w&6QƀWtW7{wnv5<ʰ:}u+'zhFv߰sw![7t5 衣mmIz9a7f0fBQ՜=3sM:uU-HIN(.(,--swg5 A4իWq4hTVV=c:88\.7b#AAAǏrttqʊ Jʚhj A LUac :a7*%P(*ϹpP(j5ׯېacϝeF 61TryYiƉG"X,Ren^Nv WwWK zBܱ}#FpT;QCv@DW%I&> љNۨ~^%&Zw4kL[(RTRUgbM{nǧMJN2dKOO7:M2%&&s'N[[[$e2-w*T H{ez37޿|+_W7ϣMӷo]2lLJged<aPVZbRo3aWWjEDZ A sܽ޶+).教joiVVV6Lȕvg@(BK+z/ٯs&W{R)t-6ZzmaMrrD Q",X,'g̘1x`O8 >?ꫯ4ͼy>3 Z-L9@7n_|qX֭[t)I7n=zT*%Ç~~~vjr] tA}jX%Ċh FV1 I䓻((IiY6}fFb|Ftg°(K!4Ѩˊ5!TxH$=^$̴ڎc"AO_<{//'9I=֪?___fIfΜKQɓ==={\]]\]];4bĈ3f̍7j,uHHHyyuٳg4=p˗ … FFF͞=v]aaa&P.!WrY-x<>yBZetڲ"o߮4$zyw͓(g@h2/7 BU93^qgI`B:8q$IDPUoWURl~h퐙*q9ܬļFM`gc\7sN:t8חpOL|ڭInC 19Rϕ+W\FJfu! &wt:mΣ̀03 43~EAGTOZZRf}9u 9`WNDe2vz<DRV+YtiȜֽGij8W/bl2s\:,41N**4q޽5kִi+AɃGLܬ+΋Dbג~ p1KVQ~IܜLON%pa0CG TM2$&\8=t7?0Am\a7?; u`{fٺuzB' mꏛuQiyIihE 4hÆ mu s`mE[v H&`A>-cSBoƲaGe=ύ/jbo=q4fՏB=u矾"IF2n]rZiw{vZc1hGs˺mxhڷ~I7$${)7Myv򃻷lٺ K*0yJE.0h+a}ٺyPuͷ?:zx3,,Fέ!ae=ٺ:J [cn )27;=)I=GEAa tPzCÆVޱ,rcC"cͲvQwVyˑx'N^0YxB!$A1HOvό;,).ع}w4jjC3*YJSF-))tp  fѨ ܫXRkMazqzJ;Aiek7FU ÞMۯۺ  B3FIHÆ 6%ۉgZ% b2*! [myIQUrVx*.- uzBT3C0 \[P|r,%B FA1lUrՎC Hش?a㾋쿘[|:>e_'lڟqoܒ6Hش?a _YlQ }hknEg@G$Nա>WS2[}+Daix|Ero_»y>7]JhnA:2[zH҄f0uW H5%3rr^Wr}D^/ KI7S䲊."  BƎfac( g@QA4꜇)==HD4#''߿Q-o͛P" !W 1`p9mdY#*(=%G5^_`Aԅ  Hi^% Xl쿡 06 3Uenn/3uTBGEEjXHHȁcǎWa.(L֥Kf  K+*alY`}zhhhfffZZ/∈7vo'O޷o;iҤm˖-\.755ݽG  H"cp " Wcܫ=Ά?+Pt] :Iqqq~!Xٳg;v zQ`ƤI;hѣ&L AA^柭c%7CbpX7J13=W13***pbҥRiYYQ ?% IDAT흝]g  LUb3g7\XO=W>$Id2fήzbʔ)1118qb}U`fYOP4FAA3S*1J pp{emU€$[&֭$7n8zȸqΝ;w &WT*%Çk. !BV7B)mE[ֶ݊ +UZpXa՜,d[nv횯ig F[Vm" ;>VRǶn aÆF33ޚu)!ODdMmmvϲ֯A$={uC=8z/kV_)J͜:UBAy>yIQUrVgVD, RM4`& \ &˱q4AAk'<3vJR Hأ>* @Qdp'܎%+IAR J%T  FTVW{@7̽JZJyR5TIZPX #?bZGS_IMϳb2-߾pJw#  T Y(-Ⱥ$hJ$ Ȓyr\׫V@F>j^z U%)rYEee%EQׂ  J d% g33H,KX(i (JܾTp;QSE$/ )t`:={vРA;wԩSWZE֊rrrk$D)|>i͛XxAig1sÖط$iKeB.c9ISo)HYz#೬$"Z~pZqJYpq>[շcǎM>}ժUKNN}jTwq59l 1Iѹzu EZ#=hãG||| L)t~~~*秧3;RTVwРAJҰCCA4yappB(((ڵkqq1wwwJVVVVVV8}'NU4[7 74[7nʊnHIp6`0myh֑!̴=r#WqjՕSN6e$UHIN(.(,--sw} ֖2T ob(#˧Mv}޽{7,,I2eJLLLΝ'N$Id2&Z*--0pB0 H[M@:*0"o{DB|70)Z%pwzܩw(*˅"' 5kּk^^^C׷yzz?~|̘1111V%K.$InݺUz3nܸ/ݻ ׭[tR$7n8zhTJÇv0@ 0 H=AQZfWI,u.)uzuDhעG֮.=zxXx:;KJ_.R[BC}:uԩ/ׯjF222̙ӭ[>}]tkk됐 777֭[]gaa|rKK˅ FFFϏzU_:Ai{ZI[w[wk0X%.ݽ' <\i ejfx:89ko+T($IX87YԩS}}} C_}ռQ7:""5$Kx PlejU/PQf1WI lϋ,Xd_ASGA8ו hd833S*N0L[\ڛfDqqj5FR2_Kp$&с-1d+8usE? *!4[.Ə9z,gd >j@oϟ;//yNFزq]QqqP}3܅ܿɱ߾Mf 9bl;8WVVyX z"7nޞ>k ?#FS->yF4l22M\l@peQ޽bW)]>֗+lƨRi9W׸CQ}vwL-*-+K*~ԏ4fk@F'S\R=M*dTA'^uII P!*xU hksuO[50Q)*E_gi%%T"D8ү/aC߻?H']$˃z?K|qq7cc7nݒmGjqE"\6llü|??Lee}A:Z_8iQ:Z9( 8+J/IMXLPUQ8pqF84W^G3ٳgʔV*5fTJQYn}J&ㄏׯQ˨|  CKK--+&jjj<**+&Mf0]]eۑ222rqw°C+KKz*q,VM;Ľ×Oˢ1VX8 7WIKC:05&U 2en´T\*,<*XdNa`V \%Af%ӨuutiFTRZZ|UUj u=}꘥tQ#G=v0ŘH$RVV.++mjWBu5^gY%EU4iw=\ t166ݻ^Czz rlԖ)999 rbAAAlƍ...&&&^bÇ?JnN>M/]Сl6Uᨫ@PPPEEcvvvQ UBi_B{=v%}>"h֜y990 0t;w_4|萺GK_O<6=wV冺+5RxRCѕ*UTf=y2+ijjdyS]XReXMm啞`0,Y7oޤIII۷oMJJڵk?ʸqNoD}R9u.sֻ[EdN~jޣgM ޼ʨ~cX&[U 6mvYY6ܻw/<<ʕ+|>fs8; B&کS'P`0RSS=<<<|''B6maaq-}}zݥKZ]]pR[׭ pj\ķS߭_MfV>OLܺ0S A,]ʱc\ں#5 \Af0gNS=A w YqqyyuU~zz:Tk%%E|XIS y)'h8w7UwRff&/))jJo1L& 4MYY h4A򟅉˗lll:BJ >/ޥ\mݑ/ADDxtzoջvS-5~$!aB\rqL($B,(jcmoQKG-]Z=AMQ[h+H>XuPWWOWf6fN;i7{ZE%yY4ՅBa{֬Yf͚E{||AsQ~/SPI,Mz0 #I{| &rB!4"-PIOG髌/<h1TUT쬌Μ[\TD8[EWPRR`@J V.H(*Rq2V+**q\Mmfj<²T(J&ݷI lB%Kɸ6I$Ih4:NѴ5lLdsԁ/ UBi6t EZH6hߏԅ$Bi.lm97oXI;|*q*۪_< /7$BiF.,&x"*ݽ e6'3FΜ;?l`TJQ)*,4?s<'FyzzlٸxQ}mACGJJKZy¥U.=R /whkXJqqSV/ RYEUYM8){Zj|!v"&z-RֆEFu#kukQ ?2| :}Vc׎Ægdxlڰv҄/8mMBG<{Š_W?{^O{ $-z=֝W+JYJJLLefd$']OպODϜnܸ`jH$phuZ)n޾mT A3%Ta^qcBvrN>i3"$P7&taètqI'8f#IN^|ʠ$)@,!1 =H[j*.WEMM,0[7w`np$IjA11 ՞֊ݭK(3Sݻ8wScSunbh H5iRvNҤ6uuuKʨT&SIdFcXԳJ4XTY,I K14$޽l77?IԌ*c RTXV:;N[t:Iii~=$ׇ IDATg8~Ν:=OJ|o RRRDUEu;==KJKDN} ZxјQii}2h7oc\ܸy=l5U];y+fܸBJ ֤K㕕UTTZZ}Z"U|Z_iy<>ǁFƚl55Un}҇׌4+:d666rO~ O J+KO]忞q4?O?_$|}}6o\_TT噜:\|Kn.854 &t UWW?,?={~R+j!)h뾴 %@"0 {Kj䷡#{;pv\pvK-ck++ H6lA}AM#77 O]8GĐAzqZK 0223Zu ߟ &f/zq!뫠s$7#Afk%twKd_\ U| iK(,*GݺyuY 'ljr1)yN&T"*k֫(O*[jݚUoW^@$TUQ!BUEGn޺8NLeL&SYE_QQ1z\u/㻺:b1Y,&Ajϟټulm6GYFzX[} 9PZ鼬|OUJU8AX;mwhf+**Rޥ9wQj`lPIf$Ų"!'7;v\tQCW`TUU\M )?Lt~$Ihkb.NdFFӧ,--GIOϐ=wb0eSE:AK (HZ@xSS+ E&ÆݴiނBUr.I.ǟ^>okcC?gyzSsh4ڙsdžr@ H$v:|0H};96 $>}788eK E.7{u/:gko<Wvuq>sDAH(TBA> S'լYN$OLytdڿB,6iK7eR7AH+X+~,&[cV֝;we2 Ɔ<ڷ}Usтc&8ㄫ[ dzw`uuu&|/K߸5d}***Iį6c7A#G 733M\\ZYZvb)+mިJ_ R0*EmKv$ĂG!$'$$h$ P$GbdC@I$M4:C 9RK IKL~Pŋrۺ# 7n^aSii)IQK;:vAg4rp1K[]۷> D"'-X4u32z7uՀb'{h4KpӺ H{e's ~YbWh4PgtxI" y)_;w@w_ I(((5Wݹx^f.Yeff<ӧ/sA|+Ib\I74' C CSSS6S_OlwAJJ</))g˸gd 2K223 cnjVmD8q󿪰K|Yp_}EbB".!fϞѣjKZ]7SZr Aiot%Iyy4DG[J }'ݍ`wOGGNEeU[eԠVM&b1l6Hۯ 4wuq$W$0L|ɓǜ4Nuoƍi=4?ШdJQ)*:K?;]:wxlk|t^>w?wEMMM,D"R&1(++V=}ĿNz6HEb="nݷ/m" ɓܜiS"qXjUVFnY[[ߨm!uJZ7 _k /Ϟ;ȡn<+3gϻ|񜝭 $pǶn.姪zӺ]ܽV\1h`%ˢfp;uu۲q]Hs/8~ӌFFK/D -3{& hn|r39${$s5Ӻs@U\ud&%& ߏ/ĸ<ˤ];YZXdtn4 | ~o3svm'$h=rrsvrrҼj~-ܡCiտΜ3WpNpd动7oݻz[{wrv{L'KB,^}rrI's4%5םZ'j͹J$I8.Hp`0/Q~ݘtE(渺VWW?كNJJ Wh!Ç9Ϟ>YtnnߺiMTښR~}yHgNF% }ogcVk025JJ nFM9Uq|G TWW///T$g}y"' ,,,>}w  ;0/?nVlsnnrKd4TG6Jh?qA#@tnj:>tD舡fXj+TsTI"ș3gǏ?Nro޾};Fc2pNӿ[[۰0.p,,,O4obbCll,;???{{{'O@IIɐ!Clll= mY  mKUUuENٻOky{sx+ZOOi4t֭c Æm{]F$@yyǏhĈ!!!p[niPPеkZr\AA'B}{_R,SOG mmnEŹGorޗS{YJzfa!7b%''K7iPVV`0k/))7SN[8NLL&SEEt:62<<3Z7;vl``۷o~y'MظiӼswVVճ>|3x̘'N;wn'l|]d${}|i}}eX>|xBBB4O'OZn݌3tttn߾^RRz{{M<A7nuY/Z7 _Zmsd1WI$I#JQ~z ̛;<{} ^a~u*?ijjz…˦eXFiعsΝ;/Ãd{ OuEQuk>GD ;3rYK[(xpJndWWQQGAQg IylBF'~]/K>';3;wXSI8^zP AAEY 5^m뺕 -RQQ&uKWZ['''uqq}vϞ=իK,ɑn  FI8N49fܸG69TsTN?}ӧfllF% xAiݽ=9`0W訨4jߺ3  'ҚJJJJ&&&TУ}֗  uS`3TFAVٽذI%%;܁C1k\Bٻ/Z6'ᐁCL02DjMm֑+Tzh4%%%6fh49 _RTu~XLĿx|%[  ÖUZkǍ9~oٜ'N7BסjZ7QhnAljݵ~yY拗F*=#cQ}|yy3ph4ǖ늊.\$pNNee?͘m2\0eqv6,sq]Oȯn.۱7,- ;'?0̬ig ذ^=ߪכ#08/+ ~Q>{dcʖJ;~(+Z5GHH$BqBD"},AA Ø,&...:on%<`W^ UVV;&t՚udYGgOZ4*?l;;oFƍ {굑Ç6ƠOX:y!KY6~G͙pG.E}2$72krk>@ 611С-:rȑF&}# '&H ח0!r?tI?N$IRWA qq7.= F=nܺ#mGj6lDb]> ǎ'O_N'H\_l6b)++X,&{nDB%A͉1p5f\d*++@yEҤuuuKdʰI :|Wgv\ݰ0ЁY/ &??;a|q9oEO?D-TXXX,Ţ$*H8^  uS ::8WVVQRii`UUU54@OWc}32msg_>FcCG} A:Ns8oon OH y_TܼyYAAvG]]=gܳ`\?p@h. u-6 :|d"h%sfϔmĔP(dCmwbY5qc`0N8"X"8saI+J$8'-3,ٜfʫuS$o*M^f/ &gwThȒKRǏ:u4?`PSSIF~QǏm^Z{ժUK.U2l> -5S@C[WiBR :.A8`O*AD! ~X[KW h$Cu͙5sάCG::GE7z܇6 {lYƕd77mߨ;7-YlB*>1J>YSm놵ZUٵ,?==\yԨ܊ ޽{/-Nmfff&&& 2ѣp,,,OTQQ蘝-O 11!66|˓'Oy,Ay.1ں#_ EBUWs+*+JJJ s֎Z/K=kM(-+p8v옮n yKijj>fLL̰a455̙caa~ٳg@aa͛7b-/6wɓ',]t̚e˖M0?ܵϕQ)*Em[4ɊU >j455ۺ/G(jn6l3~6͛;Nynncovر1c]=..nԩ)))cǎ`[nu‚|>p8]t wZdxxxpr===BWWWo= ZA/Z7Ґu֢5'jA6IZ¢aKwYӼsݻW&-q2ӗ?TݻP(|x{IDATaÆQx<P 4SN[Iׄ:" ^kk+y>B=>gȲ;vޝ&uNO4ѣ cҤIi}}k׮Y[[Kq8yRUU5iҤ7ov+\Iiii{\AM@ߕOlQPCuyyyݹs9Ooeee/;teǩkTЪ&2""ٳgϞ>6`{P(333e3LDBO"H"8::8~XaϡCʕ+hA,8~>cfb\hfkQϟ?'N:`0/>K'N?{IٙQ97n|򥝝]N d뛙y{{=z(;;ŅΦnJL:SN~~~ rtt :t~…Ə |\~fkQ+z4c4tb/]8|l?Gm۶ٴ$j9{Y;;;+hQlmmfc2c AA!KHj y燽Sz+fD$Wo`޳רL83iX=H$!J  {EVnP q@P]]mbb٫WĻC]]]MM 0 SqG&  HȫRC[sZD";;;OOϾ}N81<<|ܸqG 2eJdd@ H?Ss`TJQiۖ~0a䰉}CttteK :?p¤&Mۯ()}`C`hhkk׼}* Oz'} Unպy<^aaazzz>}zꥮbɤ۶mu5@u#e\Vn !ë*%G7uug8hhEEyMsg )yyW/jӠCH\YYь @d6(.RѨ[(?u7B4A`0]UW@EyوQc]ަJzUe#Gqquu:; Ͽ]UeՍ\n 4TB1J>V64-=}>keeCAFzqtH-_I7Z3Tb0***:::,H111^  )#c2*N.[^^flbJmv04*/+$rˌ?=y'5Z޾yԩs@^AH`X^ݛl픧ϏaK!M|6' E{;7OSS/JQJJ\X}/(Tj+RTJ۶kVRREvwusWUmvaXui1P'P~#?K,<ӿZ?vXϞDC%LMM&*u3:,jAEEEZZOoټaA-eݛqI .^x%VVߢRTJQW}Du NYnǿGOPu+ iznAw>{*Brv¢b-M.K$fJU\bR9N91nl(A]:w*..&b틞0~\H!*AR=Kx,i AlC2PI][_^uE |P$HCH$+W:}? PI H3RA))-% Tb01g6oݾyv;[ ~QI}IJ *.o.2I,@$XU$Pb0Ɔ̚*.갴4xEEɶIUn1m;vMaĖAI! VnXیdoD;G~Wu܉ mDjgk{)Hp/M ?q| /ۦ4,qٮ.·b(a0A=pر|j BS8v;W 0߱m3AfL0$"|Uݩ˱CTј]۷Κ;Û$<}Au df;8w]RVfoۼQs 8Avǹ'D-/9Wސ+IӉ =*PfEYzт̥rƅRMHsp_6s8T} sd*zeQ= y@q"C OPC%h1I[wA UBdɎ*I0L܆]ad@AiI4M~AW3_&ddL3LkKXPqJ/g9v cJY24,"?%(ŋ_rJҶ-Dxfyp5ok>vVmSMb1?yos"& 013ߺn#r?ZEmrzu% W,]ʱc\ں#50N]W>QmrM=,MbN:?[k 晴@ ד\qަٱ&pYS':OqI ҳNZPX%AO`+ذ3ހ313. |1䟫7Z`zM;\3^p+ts2}ѢOYk߅Q=}>y}ƋM+7=xbώ580kaKeuVǫ  DJth`cmqʍgPrzd8su=y撿ȡ/P];};)l,ThijP I fG4l߅=l@ߥG*'Y_C=b×>~'޺t@#9wƏ&:U #SqKWꘜں?7 fGٳϟWWWree%*++˳ (JzRiScC(,*6 ;P }]jߴEL]{j35-Jwv ս tnd3^2; D.$`е4M}=r&];T-h4e2D[,Ό8ADv+T'N3__YfJ HLEK }JkwF$y`jbDmռT_OQ:Zmm IѤ}G 1.ØҜșUTǔ/ tup2}]ӣSI8s+++)TTTKJJ|~AAZ5)>~߶޺pڜ_h4ZTQrJ?>m^u1rHȳ篲s$/J_Jޘa~WT>:9ڍ1TiH$f*1i48{1VEurQq˨S AC]-86o[kZyTZ"4հb\H$/AisQ g8'ؚM;Y8˝%/(Ätsw^gԟ;kV\QY56y¨gQ?}?iu?B͘ìӽ,y a޲f'{\Yŭh(27mlddtȑF i񠠠 GGG*ӿ[[۰0.p6nbdd#}.~JQ)*EGi =|ں#H (ݪUH$afdd/### @cb*-..^hÇ߾}|X,~Ů]/_H80hР*۷^^^驩 cɒ%PXXsΨ(AAO`pjHsssȐ?$Hv=xpְl={4hРAFM4 jL,;::@aaV||[n>}%J##g̘AuD&ͬBAi'(z]@6;p^hqk?, qƍu֭_~۶mFFFL&dB _qLQXlٔ)S._,癖1 mmmjS__?" i.|6w%-5)[_ر#k*S Ǩ4EѤOqffyyybxÆ W^@IIiҤIwnZpb9 \G.n[׭3n\Վ=.ӴQ>eN?z4ڔ-U5+<%%A:Y+V8uꔊ˗jdJ$@ Mhhho۶-** ]v Iߐ  =ѣWsqsjJ\%騒*iii-\G摑T2͖g#=Dbeeo߾733633pt###Hի׊+?╫qW@Amؐ6qR[{mJA}#?8FTN}狂U(X|; |omL6Z?Jۋ1Kr]z<$)w!ZaXL&S?ӓJڃBYGGGGGG=gmmō_h[r !QwB ]V FfTA˓̜C#Wۄn\/WҝLvx]UŽTXU2L6ɖjwiyR P?Z#]I e܁H~<700W*Y9$Iڬ&mllhuY%I3Μ9S0{^{6l6SaH=H?4qqX/\pȑVd2ѣٛ7o8p0,4fT >l5n)^81Ͽ> d~q]JꟲU-}6]_29~8_֗ C32ߏݗo*E&x0}c<ω'nݺḊwbYH_oPڼE;\ƮW_{[jgX%xoG~Wt(<9M.B}cwU%EQ:;;6773Ln"G#$y<EQܖ*RSfO}E U>3뻙aeUI={kcTU5*iْ̻&ZW]JD}o74]']JD X<,ZT[T.[JD_Oz8! N:oPo16oUyPDCcccvVҟ{/UrzTi{_퉇?>=컸¿ÜFDC:98ljiZYW432UTSywu8 tIME );'tEXtSoftwareXPaint 2.7.8.1=bMsIDATX7W0$*"t0^L5L ^:z3D߹;dϗ_ ((P#B54>Q2o@R>[Юʇ0jօƦps Qn%жi F{0s^G))thґQ* d7R&& cjpf1Wrxg %mƲqlVV#cQ\[7!6q=?!8>q3=~~a C]zXqmonw\;{uάd:cT>INp'q6K?hg@o@]>Ro5oE'v$Ty/'U)C<IENDB`PK':|-Pictures/100000000000031E0000019100DA39E0.pngPNG  IHDRd!MtIME 7tEXtSoftwareXPaint 2.7.8.1=bM IDATxw|̖:InY{6.ظF - I $1$t0 Ɲƽc[mJI:L|?|Vf޼w!]0[U0[U0[UdtI `0 O~`0 O `0:^e}Tu$ JRhd)KYR,i< -7V<$b/$''9`)KYRuijJ g}^CG\:a.ۥn۱ԼW~˔Yr&^ =)ɑ7PUS .],e)KYNLq-\:BS,+>\vԴySo^yGߥc g"@(%i^?T{kj4Hu:c6RT3X(PJ8P*VH B% Pˁޗg[Ypżns0!w, :"q-w͍.,-9Q0l*73 񭲺_nSzô3OuiZD%w m*:Bht FgAQ,h#(P&*4T@Mk$Ah91kl6Dzj|.~1nׇozûчR k j@@D] /vƘ b0%܃SEKoЊxDLq.^FTUk0#rF-uIl6 Р>r"|4׺DjZU6[?i]QKfXOp 59]u1A )@]{I嚚Z:' jjjD5M0DxlM#|+b0&H8hkY"M8rB1;W #Y0`0`TF& c l4#HC8Z8"FqKiC0rCm&q#J1 > 4 íuv>XNL-{9hBGG ؒoZ ŭIIKȱpQ~}WH6[׻]sԖc0~7sXWq j\LB4J[J(C3k@(>znE>#'i ,k@BWDP-J^Rp9_ؐiM~}S~S(m,+Qa?KYکiokA}#$w AQdE0b9'1j[q A!5nPf}|?"" I3yF P"ʂh,Le*D^?I@49v鷖s]JpFD1^nM&*XNBW֠34M!@( aD HczV9:':m cj@C!&VĮ&o31H 2D&@W]}hZq-cV@+Q&$V&IEQRmM??.Kh fK6Lpo;GsW. >#ҟ` >I5"`&=Xbདྷx]*,dEQiP0B[DCRfQMA:kOPD-T&GQ༒ FGMV5027}h )lMסyֶ-"P4B,l%j8Iϭ:kM+R N6#** F`E9_J&j3 Z '@QདྷF ,Xو:camcT'Fmuv KYY~{chEGO FWB-5j܋8rDs^4Юk?W`0XtVUV]nq^nyyt8Ҭ؟kNuuYYK1 BiC@TfO*w;"Iq٠rPi*0ڤ#`I}jq@nSv ={JTU@藃Bz-ګod0CA|f L!d11K&.8l&! zH&kl0 j@Qo ȝFtdo_-=|4!'jKJwR~AK:-@zY8#fQ?YRǖ=?`0 Ho2 `0r$`0 `0 OKeQ.tt5덿j`b; `TWU}_䪌̎&.*_XԊ`0V6|n3~\1y`-K@`0A($j2dd`0 F;)xܯUHLڟ2vy,]rsKKJSRZ*G)mhh1rԖMk`0Z1C)%^z3ez׷C sv3R%Z!t~[UUv3 ѣ_~%KomtիV⋍\cŲ~ժ^. (,,LKKkhh ¢&N 펻Jʦ\x7'GfK_{_9~ . 5eƬN`:q} b; 7})5553\fp(-+Ey="mN-Z(j8~^4gG np$-[g]<#Fr5ǎhs->jܶ/zQXXʡҮe0-3'`ПM'W իVzիVG oP[o}ƍB߾;͟-S?+nNl O%3g>ߟ<9.Ytؘ1UUUeee4- tt:#N?iǟ 9zgII#G.DtCG),,U˫|x.^t~א_˫S0dʏ?92uƬ'8y_Wr>L޼eŗ2b L1%bWpwEK\sϷe񓦖yblݶ}1xŗuٷMv&$RV^d5#N5n74 ÆnٲMkͺ/ٺFe-2W.ʥ|_Qҫ|cgDfDZ:kjk^ߐ'_~{!D9fg\<1.2}4c?u{ k~X1 }`ȊrTU`ꌍ7ŗG:cko;t@vVoE z''N6n'NFw>SrZx!y> ҫ>Ւ$|>[__z@Ӵ?̰`.9ч{ej̝3~ϞeZZy{K)ݹ{O)ݵɓ&9^.҅>(ɲޝZ=iWZx_zYv_x/d5b6ntGذn͎/[?߸)T8ƮxY3/zΖt{٧Aն.9914Ow}MNS}6+݊bbG ccOnyZgYnsTf̘џ|?ԯ_mۿlkNmql쬬^={\zŒ>YU[[kXL&m`h;뮹_n?$6:nѣ/9if9A ?x-]^{w߿m6:tnMa-2ru]|1f0vPJN_|k}>6XhhF쥔b fnvbZVnOJJl6-)) c*j# L`Z/ؖ~55yҤ_|=\hG}|EmFmbذÞ4q7W\3?x-}re~;Kl޺U$ؼy h|wg^4Ϸ[ʮvq{ԭͽ17Z!=~c|5Wo޺bBGL7m|^oq*Y3s8{'{}'OUUoϜ9#<%;5r#0dK"!xr`0ٛ?_444Ys q5xlc>INN4tD}&# GiZZZ6> .hN׷C`l}!aA <Ѓ14hLAh)~}]ּQTj2DQB` |Fh4UGHMMݷtߢ]`_qǫp[|ё5|m۶9[gKvflڱk 5.Cnju-(p]WϞ, 6쵿(y3T8b׷;YvݧSLnS65o/YQEQA3_z}j:%%E4mOJ:R1݂>XQuuOe&fM[< Jnq8aǗZ.;Ĥjзo|˚El+GNrJ(^jPJwXCtC*Y3/JMMM fYUU(u:qJIUHQTfgƈ18Icg3)&ܣ)&Wj393/l㦇|R,93/`Jwرjժ7x㥗^z'/_裏>>+믿K`XlhH)~ᴷ}R tgϖĮ.K_>߸dMĬykG?4qB}jͤy8nڔ)ZY}[$Uz졪Ȳ(%͝;قys)Xz@!C @1wC-M|6|ojI75M -iޮIMM%gmҵetJǟjh!yRJUU}͙=3(tt\0ѣ@ {wF+^wyp#y>#lᚴSg (?1|!v.cZGʏ([mg?p0ѹϷ-ݻ~_o߬VKFFZ#3#cҕ}ܒc]Ph/BhݧQJ7m2|[d0TCkDUUUz_o=!8uڔݣ:mJK-;fje;&B?[\X^QN)PJ0gAUU5M/N MMZZer&N!\pA׮woY {C G\cF>\~3g#; IDATg_xqz Ñzu\0mFeܵ-YO aÆd!w6it( 0I+ZGQS.I 23[1|ذQy轫>]-xe/Cq׽W<9o=?f7-슜k^ڊB=cj{{)҉?VVUE듰t;ztD3~%C<͘޿_?`O<x) bhG ֺ)oӭWD4 2gVF9TCA^x?߭&KxtM =r!4h5<0b绲j]PxJ)TUSZd0Ј*2\_ÏF陟+bZ'LXUJ(jyebKII1L|i@RVf&sCwӯo_\mE*ϘuGϷ" F (ǎ/Yz{mO>Lo.0xx7W}"~ 1+vMb0 Փ&O6lnan;99y1 lp50*a?ujӦ-W\~V`\s/z]شy˰CϷ:  f̜?*r>[~ v]T~ַ_?} +8 ۷m>d@K:xX?Xbsf:ߺϘ=#[#OA=ٳC?&EESg*:ݾa0ly_4+-=# Z@m]c'ExyB"+,DaIII`0 Xlqy#>Geg)`0 hv*`0 uϧz1SYRћP-TG\93cbɆ'Ϟ/Bg2A4YSi#5e՗RE(=ݸGhri$G}~bt>P 5XxB`oSH620[Eΰi-U;O~^qrud#ÆgLO35TT6>V*k*Rg]“ltC [% JKHpCzX -^o6)iԠ[GjMcf (BPBYR_ P$P:9AqWPw)kj=>aмͳfϞ6~|G:woeii;vlMM$IF_b1ke6U6̇Kj9gO2zyIERO_SN>|6fTpc,Y+rәWTi'vw |-u%dqieU2sNUȣvQ蕄hS=;Eh>gqX Y,;E$+IOq+ uO?#>sW ݻdSJJ|gVȃI#wK=JarSmF3 B 9B2ӭ-akǀ7{ =uYOξ>ˀd5,0 !BA@J *UT5PL+rVuuGQȊJ&7 R'!5䪺`q^64K1(#ߟ7jp|G?lب1cF㫯ּ.B(~(4,KQ: qا" 4jL^힣xQ=)tژ>嫊g-sM&+_v>?%]e%/5y)ׄ H"H(`2纋+%Tsb@FNdzi'kNUmU~%t"W*]W T 2I UBCp b#݉@R?@Y 5Κ4(&D ;p2PUWU*"zvAxoe8,Gcg65[Ǝ+Rzh0(d6Fc}}}L%gKUUeY4&N$].23R~-* 9Y R[iE~Ü4 'MR^|6f  (JO?AkvNz54ԿXV IH,fKnP ܼch=J=su T`IqP3~̜s,ϓhV5ͫf`  Fa ~i(_؜TMv+`讕ŽO*+w%9םYs3(oZ̳YFt1UUB^] +TyDcWEUU>SѼFp@! i:AΛlNxNV/}מ?2xe٤-'Vv99vȲjiffX }]gP+óT4B|~'j2jݞۑ qE_=[곘dh1$Lx\~W6V[NMMm\HI۽Xz%~o۰=?~a_%e0~$)BP09=EPɖo滧K }=RUjWyRqӠɠ(*hL0S۲ .kV6X4=0 I I'inûmz! ɚ\5ygKy畼q`hTѐ ԴҳfSb$JAI= rJ)&UFQSl5 i&#/2u!W}w矟8rD$HJByGz(G 0U r>NZ+>#Ǵ^mLfgc, QQ(4ڸЊPJ(P BaԶ%ej\(',K F>j21Ɍ5< Dl&feN38{N__[ٺ }#˱,2^~9Z6lJBg%)1t+DVhP!~RYjf{p~d6Nw'1J xK]]sBnjɲa " c4˻w>tБ3>\U QTw96'_(@+OwJcs} BȜMOR&xrI뫺>%>S<҂ҳ=u7Hs4:)ٿ/3Y Z%)W5N)y5}N)8Q< 1GzVͯP3~n MUeY6 JE`wPS >68JqژaLn*Uˡv N=BOAx}6[ 61f3c@TE TUCo5'j5V(  G (шFR+8D8^o#F?nJBPaQUNg~`@Ekn(1loUqB) 1 Bx_y&& <(xEU  qjljF{_kp˵N'xM "PZU[[jNNNnnlϷ턐n]l 8}5,@mmilWCQUq/?W[Ɛk#˲ M1'7n[n}ݷ k}zKm<{Š{߃Z}{4y66V˯b0窋L$jUe;GFRzZ~)Za^ Prrbz*tc~>S<]2 ؒ]'Ok[VeL[Tdw߀f>XzlFUw'-=͐׭`#dW}KrPL3B ZIF񵥨`I %HUr F(r>;9xwu?.7?z 999UU UZXXF ~0D TBM4ÀZ&9^./sm_^/H|1 ;wBIJ++ڷ/U-~4DQX&[Ȉ@T^<J @VjA ,!`ʹ355}pnS]Qsb/i:Q p$)P_XWjR*%J4 5'ES iG 7x:iC wMӌFcvvvVVV߾} 7 n]eU޾v)oq4MU{nE*0$)¯ Z9!C>_]o~^xN:d2wݳr 5vNon} g~iS'Oqod|Xӧ}nuuu7cǎ p^|=‹-7wc_~syںGzhuUU+}%C!35+}xEpС˻J$jAr@ $^/KaoC+6?`y?c91N{WWVs<<9CGDl z ]HO UWT:22L-}C򮽺fJ0knx Pr8\ y1E>HkOVA#^y rUSmGsC)~8[ U@(%f@VdIP0` (z/+*>JUSX~{s59Pt^۔Yt8 8*K?ss@N ',v J2  @ ~x@=QW>[zёeoSp{З;K"rTX071ںҐf&t :a1Cu5~2T.M2c1PARU R hPR/-vUUTi*q`$*) i2O0(ݞԔ8]Z#39I6޽{kvY՚QyEnFJg   `9%Ie'=S@hN65`Au+o2p]w3}/Y3/}؍B -]DQq &rd.)q6gq~JW^j0frRD"PKzn__cj昜:]!{I,p$C R,`HxP: +8bXkN(ލ[iӖjEvcD#nz8yؐ?Y>P^ (QuĐh}2&`wVZ<ŊϞ0xxR6I$j5.[chCKY[KIQX>t(!ׅ9rOP$G|xasyB59 0E*+ Bȵ J )WUVU|=rՉ1Ub 4)I:c*=XE HFtܢӲ-J8`UPUSCd33MM4g(Y"7|o@81tP(&O!U,?nW fe=iYy%ɈqI%8-c_|u㦏5&8d@xH6O2ŀԡ,L,jEŹjM#+.MU\Wx_~}:S0"`ʣ@5U}eFK?>fPs~k`0~<Ϸ^v ѿ`.%(2=c^3A*| 'Om*RӲW*{fHQtה!ɉ\/=n);5``cJ*)a@|KNbMJ***$Y1 a(3 ҵ8o7Q" @KrI~ufvHW4..K_7O78OIN1TiT5J)G@JOJtJ(39wqRT;{_,r," `G<0$F^1#F_h $bhP#r"13gzzcwzwvWu=yj1qǴWEIvXRݓ'UҕJW]D!C[f56ENDŽC?y[CCzxDpړGښ[=榖|Q<΍r( _|tjopI7p[2` G ri G6{3^?;rپxb00rHًvseh&br5 ]mi _`#\iiuVpCM 9*R_ߟrE{ Z97j' C -m A`_H#RqLhO/WMEe%Z9jXInOdmGO9"JNn$v-#dYV_577(*w(8y!dp%RQz[,0E4Gk׏]S( '#{,=Ff͝suG0jx ]j1Adn5-agnפ3?cUU׷\{[e qq|aS?w׊Ҧ;"ĭ۰i3)>ڻg̙0.U7WLm!++f9zcS#JoK{С];wؾ԰c #ApPdKdK;,>H^ˍ)P_s2;XF. @?W"\fs7z&8 Γ Q5'n<{aq$9=ng^ȇuvABȐA#),,jkkA8QD'K9pT~^^Y<}Իݜ4}eatzߏL+nmN8$<'z3ݢ"F1o$[oKg@6|Iu+Mv+_ϧ` tڽ/JJ2nYY(N47Y~8N;UWU>Vtq8~3ZfXt|–{^vغk%y_suM~ߗ}1Ιt#I]UspI{^oۑCz~ҩgWٳu?=fTŘ}\. U5OK%[e—qޕyQC=mү{ż;Ya?JuU_sR)vՙzR8Tu qPSk=~􁟮O d۳r_^Ahiiy^DJNHiMkfuM}^нgG&N.v8 9Hw=.5,PFA!r 9S[W|)e(P em3G8>˃ihl8MoV]>Pz~<'71p`An+F,LOr:2( ~؉|:ΙFdF=㛣_!N32}UӮ?Z FS8z?A~F׆gϙMb~+$J~9i6J/9 GwW[VVhѢ (-püy l޼ ^{uyСOܜBܜ8Qu @]}}%[veweNvvkۺt2<+@P]tZx>}un֘V>M-9*:D7.S( YXݜ3BuUqA [?U}N` зVxa~i抋NClܳW/EJ[Z;#oOyyiD%϶-x(MMM۾)@;Q|^o}c ok@8B9݋36pUޭn)HZѫA%8Z֝=iVaWֳǨVwdV[H߰_/)1>p#yi%k>z>-Ƙ;ĿŖ[1W_11c5їsDZ M-57,Ogٳz'u>7664 Hq:yy=JJe7h}/V:Kwp8]Soo}Κu׏^o͚VZǟ0~OK*قpl[V<{22?qVOV_)}޶3ϜPXP]{z:"Gp<8gs:JkQOTlanοH9䒌˄-+[1Zrbg]mmgR/gߟ}e.i-[&N4}!N|<ω"DQ;Iˠ~}}0 AEEɰϑZHμи{e`tW"xc~bQޕ&Օ5t>O%uͪ5loWL4*PᐽP'O9szW 5oYyNdɉC3󢎌}J8Oh~@zz]A @=隫{Xo޻wǎ8tp޽y9D;)g.]@"@H YN{33! al)?0~YvC{4ygU=f;x9 }5o;ЍwaS" s(>[WojT$sfer}ts[MNMl7:ҭJoͿ_B?D}'s Hjgە-N!wkl=Mmmm y=^]C9ك<Ѻc4]sUIݻwuQTX%BZZZ g;';{݊㸌쬌D٣M疷n9~8x-w@)Nwe7Wѯ9ڼ]E՘#o]pǾY[o9('ьl;Ϋ'.1m=Dܤ:A,X+ &'s  ڗ ("[- Q'q?%4 \ bDSO8>J*N -~ ]9jm+nj@oV}&V߶kfk9jD"V<IzJB2,<š^}Э_yl` ޣ㉧!$Sv8YYYRv&Bzb^++m1 @F_pܞn+?vLҞmeӞM-Oʲ4}ogtۿwネk?r>H[jyi:$pbá%'D+Cƒw#!V @Ss YJE5+;; ]r)pOi<׃#n.B|"ZD.H p?99"(ӷ;@(ٺ+c!֥CMF=~%k%A?IS2a)KK-' g@oYiN8ŕ=;vL[陮(Չl<ޗAq8[;Nw;|oC\[O.)O Jrz}MrDb4 iLR/NNBO4Jq4(?-DN>7&hPs3M窫.Uwg[IsG+խ U7z&M?1\eu 8 ,1`m7{6lG JS\u@Cvݸy뤊ѪG9N)hB =bH+ZQ8 L"!G|BUJ+ D#T]A)'R:_lc$ ]itWVW0޺ܴԢ礊)b0 ]8ԹVм>F EoJU5>۲uREh( Bh7֔<@p 9i_t\/lӝ+4? _E歏Fo}VH2]j/w[\+յ3U !P1cD~Uhd`0"U I#Yk~q0%"ǘbEAa2sJy'fR8B4g8>3mh ~Qpqm׊f m~Ar4z}89$_s$ˇZo^| "4uLRTܘ:wNumQ LЫֵ6Eyyo4ߪ V #2\ 0x>KޝwA+;~RUu~kʴK\1쳥`SKKNVia5[&r-[9z B:@9)Պ88C=ih}*2le|we<&ۺt8&̷¤ W];\?ݻG}{?;s>:xىսGՉO{k҇%:3F3: ֵ9x^ A\qޕ ~x91#qaÇv]N[6lحw";'[YRG+ٲ,'etM=eIliwɷ-2%GwV¤ 8zmw&va/7&ۄ0fOצsmW SCȮw&vke_J=<# [w;,ٶ0 FشkBH{[LhW:`0T%tn0 ``0 0b0 HLZ1 `$ 7׬]Z7xE,6th[fNS>!7\8r+=v˜3ͷ666V?lg)f )7|򩧧L1x舿&l߱sgL|ƄgVٰo|K*G뇏8+|[6g?bISϞyޖ\N#y{%?qG"g3ϙ)}^fÏ,]v93)O?}ʇYOu3 DV ;v~}ʕv3'_DQ\?i~Uթ ׽?oO?%}^cs@ ~G\yM?xRsfxl]%I]];`?x{Qh~;i/?\aE ?P\ZE %L<9e6n$ `,tLծTKӵ#;;[[açexzn/WP>||S _)8c#GZWͽBYt3WiiikW_9s9s=/=TF:Zf  `0]=u|M۶l6/?jLŘ&ԹVG|_/J^ZY]]]XPz444|O=W_|WMJz<Z^?b̟^Yo7_4[BGeGq1x~?r%z5.n7}@k+|>  AzpĂ |30+| |́χ4ӰdV9-xY̙][zq Ԙ{QʕaOP^}tٳ1m^z Ng`T`0]IWm۲yM&IcC,y>W^}2233O;녗@?.{eօ$m^4p W3 f?6o{.sQh p5wǘŋ;rw^ .ۍqYq8xN:nXT I0kf{y]2$d!kxI|Dy92Qixih CW²ef{X[b@ b'T;x+ܳ3Œ~B~)>-VH):e{x3'էOZG/|n<]SOϹ< ƌտ_񓦺].;n6{/~JQGF믝1QL2EFӦLXsk$]%E/>Ǩ;uV9(]Cѣ*+vYg}$=S7jԐJ<8\X~>V2|@uD,^eJJ;&IHKiWj+ak"m5k%)ˑb0 @6}iIlzYբY.nZf#GZY)_YYYZZj݌>4ejXU ~)Sd ӧQX#G=qv]oġC aga =T8o7/oOWg֙7_ 鎮mq㍸3/=Q Fŵ+`NSO%ȾNŵFQ=M`UVH?u<&!h3'tr`0!;dTU `0:df-n?& щ!$4F&Ó%/*^I+`t&'1Zgk2X=Q;:-ѥ1FT1"TRZ%C2AZ[u RI+(ɥX;78ihG"TV"=0iWp*IBcggi,Y&w%u2ЧfĚ5F F"YZ*bsLc1TMZوyp #v LqiW㏣6?Á)M%ҥ_ &gMK4CʹRkMGϦg0]H$$CvܹcSGW0hPvN\ [%[vG#e LKE2Űvoޱs?tYg-կznݫ9y#GU1w~.^[͗q^yT=mү{_a?NbB88{+-++[h?Azz|aU'O>RD ()+M@DQu"pNJ8J9QKSg#86V{`t#xbQ^&Օ5t_;K|YF]Wܞ.~Hd)J2G@@!=7qZŗ[ *?J 6~}vWPqNpqHiJ=q\P\ݽo ׯUzAW !VtIM-둊x̏HσHsmx𷄤bϋ( HPmh^H;A)Jo rJ' C((} -ppBpNPq>8(ѩW/Q`^ȼT@{|@e! ׭nҜa7D~X}{%㕿 8LZًTRDoh؎8"Ūԏ~BT&B8< ~ ~C.DDQEޑBr"< {J%>J T҈@N~@ < )@ppPJ́ §74/^ᣆ+7EVY @6yf<TOwh^G{롽]*+\[];DU2yhP1-)ߪF%Rꍓv"uIiHdzd^wB)"F^_|+ =S#G3%84Lw>z J !n'rJ x\NBHOh!Nv@]H3q9Z|H{hW*&v(@2\DjpBEZ|V;7O}>;p+.r.SQW;^]=Y(F0RYK%$帘88{ŗV;# W\1w < :oreZzsvҳ%'+zK@ٍTXf Hdnv}t==()9Man.ӭ %v2+<_.r0 Kb3 +*v_sow~^py5j#G/>SZ!C䯳{I'jO\D*}^ңÏ8N]]KuRMKaCscXau? v]ɖcr[Ilɖ]jޭ.-# rO`l1H&8#WyvM6}ʴDTɖlɖ]mRsRɤRc1d,`BlphN+e%b8">V FbCŸQ,SQu%LcGd`0ž:gӒR*1}7Y0\h þæOLc%& F%K)J+D"iacvyb0]].t 0i`0:=]?dr%d~.]^f06]l#R;=ht?r% ,:5LZ1 S{'q%6QJ:F[]co XI+a{'YpeFt.@:1A4V<0i`0L'ۈNvv:6i`Ҋ`RTO.뤔VǕ1HƲV Ô. /$EF?ذ`~,¤0'w6$ :i{g~,Ƶb0c*rH>Mۏ 1doQбư0i`0I> )h[uDGxGț{cleXRaKI+4D(7IlxT+kQxyZd>>t$+`Ҋ`$1WWѢTyZdzLb7k㵏%HΓKAŤHlϵMBUN&BÏ;{C`ɡ%a1h."Z/* E~muZsqǒ.V þHJ"nV]it%e"Apk}8X`Ҋ`tz|PIDGq>ftRXHr*ؗi1]Ⲓ߻},͌I"k`0Hn=ɠ1Ϟpn[0i`0I>@|cBG2cβ.m8``+m+cR& FҐ 5/D7Q٠]z$cTZj>>0:& FrS,ʦ@*(]lx_ [i㵏%`:ai #UU?Njz/啺b(d϶:-ɂyR^Qɝwݣ\ӳOAt^vMiI;_k& -Vr[S͝p@vT4cY)Wds蟴Ch4lsZ`>t1* NϖƌZY*+DQ8 _Ϸ7\dH9N1*ǃJ>@v3'$-Uz[0Q.>_},bب?!~T]wwРeeeRFy2mƐ'zzʴoJkjc'8ͷޖj{߃d9:kF03z󭍍v?hQg=so+TАrƝ9y׮ݒVeF-̾~)ѵg?bISϞyޖ| S|r3yq0CGB>*Fb+nm㳱%1&ce^UUrr7_K~~۰~SyT?ҫWϭx筕-xcΜ0Uo;VٺM_nyncO(>ؒ?Z,ݧL]]}~}㫮'M,ٰ~oO>t~ن^zj:U]_Yޗ?y{_HauK&ş]c=Z=.9>>ftR'_OG,)WP>||Sk~8 JJu>hhhg8׬]'Ft3͒SRz/0s6ojbUsPY+kU۝?v=xr ՕVW]T@=m,3ʺ `JII]3ƕt-3¤UԔ>{7K: rx>(78e)?tN<-ϯwrJu2x<<OSSek%t+qig_F<9 0 IDATJI1(Hte (-} bouӊ'V3caL4uҟehW翵}T/^1ՅVnwMM>|挌Ƭ,7jlŘ?=o-_}n<0JCK ٳ(%[r\^4BN>HÇ&cjcc a^X˽޻~$01hA~/W osfhkk/9xrkffige̺|ykaAA޽׬;}B|f؊1JWN/Vmڼe׶\ѣG11#򷀑J(0V]Vӭ$IW V>¤U̻Lsvv‹.9G5E|kwŸ&UPPاwoUn-[+M>]N瑣G&N7gTʌeenv]e1J"Y_V1)V)Di,ȰR-:'KcʻC*ht& FrS"DOtic R:^bt+ϒ+nluu1a0i`0lMmϵ>cSWLSH&0i`0:=ڎ3$:H8罉*J #ď}.NX`3 ˪@= mt1b0FLdV!WE06Rhs/}6 B땇D=kD{\l2VtRb0A^zy'HZ9Şo %ȸ$oIo SKb1,82[]۶2¤H )#H=g<7*E%s92=uhu=7nPABdp4QEAx.c[20i`0y[:QQk\`F  ]ubh෤}gO2teɺJ^JIR* OY`ig[muä]!Au*'r {\ss9ś$L])6Sƨ4XJBAU6=%6I+H0u唒E%1àqQW vXEjPB[*G>j>& #v#|kީkao+n w(]SFjBP]Yj40zUVQ֎TFIlZX#/![yleLaҊ`0,I`:Jf^o- EɊH?!2w\!ҮpY0WVD]PDiZ+e+)c+cV av6ԙIڜUrהu!a*1A#{=Se]%!L.49Q{oF0 +, ,{\b0$bC$~ڻg2K*' U׾TTWU  %YqPn8Jw(D4QT* LW%& F2T[@96Vvhp(^_`:؁e*$P@ SonV/ПLW ga>EWiQVny#Ov&USSSM`ĂI D"ksu-*vuZH]}.3,(U!̤|e[Rf2͙W4Ayqed8˺b(5=krҪiɶ fU٧ $t c& ) HTB$RTF:Tc23ͧfCǕ @$sz auJYpk&z>.]ߕ上A] y֝o0Librҵ|K܀ԕWu]B1l*J05U^*7~{4&]ԒV6lX a°apv at41tI0 M7%X@E]Y Bak{d1 WBW)wˢ2*ŒP95#=ev"tXUv!"W2dDZRQ)?⸊8Ci4߸ `EWPWJ2Xi)ѼgGI+uգ L8fQle2*%)RUaAuLJSQ0FKPJED0j)H*bez`ZzSoRVo XwaҊ`$ ]]R` #ֵvs4t3=I$jψ8`Dv%U@}]en%~*OK0/M+̽u4v<#&p6 |cǎ-++3f̦M \s̀h?T<$g !$2+h4)1J4 Luz+]W=>}]UdazE!O_>: &PW-x Ih J.@,c椴׊RzUW-[~饗n&I]={z{od` Rυ'T+qQ @;*T3zD7J뻊|2Gp.*-Q +Qc^+SO}LwI_vo+V$LaXRW-#j㩒K+qd2!VN/>ƍpɚAI {`0atDrV)ՕF4Mx1:F)!W-z{$U0]r\!we%iTOa"&WIh=U2F5XʒHii%_<k֬t:IOOg0ZTɎ`Rj#2]UX9,hV:Vz ST;{Vy`}d쫄 $† ʿo#F~233m#HaJ Y,IK)w}{X:dPi#Qh`(*V$W? tPiE/}+UmEi baNKoꫯ^rĉ5EEEEEE{>|8ofȑIHu:0U~[=M`\tTaȎ+Lv~ЈhuѝGZ#$]`Xur5re*- bRʼ`#Ug*+-ZCIWzCUoT(5mzJMJK|''O/)Y~}n/^ӟt]wusM F"?t$ɢU?Ui,4tue7O`W&W+אad‚f+LU=!j}ebeU ҍVWjcn{ Ҫo߾QFFk0vŤUQ*-Bs`BQw(>S%jb4)~*e}cAYLzDST2"]e-JTUJbJBJK+5{Q%m.Mqg&! )UfrY %eWJ$)EQ,ge0嘠VJJ)*Y+] eGvU@SzTZhA,SWäXҪT JXX(L])s <W!ԳznU"" fQ裪kO=W3#iN"En;M%,( LM^MJj_PU0i`0:=v!Q%p^O - _}ki 0=- } ,2 녪*BcOOTYV21[1A3H%J**HXϲRe)O1^V þUrߦ|KvV +-@K$Qi2U$<C1A+8g(>hBLʹtW_CԺ*,+ 4n-u۲ЍW5UjQJhFnKBIa,+weQ %y1*-ܦvYI$沊Ht+5RH4iQz$DJ /BˡUI&,+!j͵']& ݉@#$L*L}aPR$ % ,Ƞ6ee[ \o}YÄ&dTOXq\En EŨhs @Q̙*h]2, a辣tU6V6,ن0b//??myɶaw QVgr'+IHTXWYUJ bB XQ%Z .2 Teژ4=K$[9":#PTGyzJ+^Mf.*eާzGUVWAK)HjInfO!X6㼂n͍6a;R}MUJYQTN5zaPB(BjUHNIA‚V̲b.3D4 %liRUJzH]}UW,+(ӒLt %Z ;dˆH tU P*IT=qDAdf(?eXG+PKUFiX^1WWzL_XKl,xMҭvTW*y5][/ӄr_VN^YAuWJ+K"X`tQF`*9̠7a?#b4zK7xsxr2* 짍‚I r0/ay,+v%QneoUt 8zd\7D \n@@#jǾgF]8]4M%V f0opjg*sPHVn(q8љYF+#Gy7S]I +I pK% sMЮX"$G󚡵\nJ>̙L|\wbUqFrU6:s߹H8PWSD=T괖[oSL \]QqДK=7_)l[a'k] kA܊SeӕEw5[2ZQp(“w YʗՇŽTsd<[Z\?߲ЕCV\*KWrUidJkdΠE# qd$t+<]Xʒfw`"*ҕk{k블\qE15,Tz:WRMU^Ԝ̮\YzvnҼkRҤۍCTVErVDLu[1x޳Us]扶W +D8 YW?gpF)K5R+2S5dczX5mz߉q4骙~oU-]6u}vT,e:ϒfrd:RM.w| QT._r\j=p%QD FFab^d,*V<}F+"N!/RjjVsJzҌu+}M,Up!+t@ӳ0Q)3D8,{R7Bu0ZQ,>G݇>9ÓzJxG%`i/%/Q0R+gTe/zZ$6*ܹ*9THpKa6cyѸa"jL8I֪e@;R,;)_i)WW 񞞪iʊ2ėT5J$67ru\*|)ziy\0ZQu⚥XH늈oћW UЗGr|k1^߮,k^|MCTXj%Uk*ndf^unΥzF+"NW22 ߧ[aKIZU(JY pb1ey0iQ9и1} Xs6cʔ_귒%XޭX1ZQ a0cY>'AP !uҕ,urLPeo]\iiK@48mJdsUvsU/apKƱjab"F.4Ny,8+ dN V N I k=4Q#++:Tn**P*![?8VmL00l [ZŻԽA>~ܻG9Xp%1ײ|殣ڻ,DoBtrDU-OrW U>> {\|}Dc"No2O.YB3_9&)|{af$];NX}YPNzѾ9F+ʨsLvk4nZcr@K"|+j|<e$IjC HO/ec/WE҉'tG_ɁI8XnbZkM']%^ҧU~#/߀Y8F+H'9jEwaH׽Ŋ+J!&#-ᒮ F1as2EWVvmCƳ@_rkEDD\;ⲜW~uZѡb`Tr;teۙ>ǼK~mvW5e$Is~9reBVWX: V?׹kMUD(:±NǪkUDG`,]y\<@2IF,'iW;oRVjp8BBBW;?NkF"KB_lag @JBS`RG1;U>h8yٳg Cq廫%I:x(/ug3KHj3ڽyb|y?vެEwVʍiT~1;+Wӹ[;ݜO'/ɧ-vUb~=v~C67wLMKx} "Fmv̖gvʆ$I~JΙV:"Uo+ |5lB&`n(͗b-GV4_׭9N9ӵkp |sWg}ofzyn]>}aÆ_>gxep mОݻ=1.S^8fs^g~]Y}ؓ#:qwvWhhKSkO F'%ǏCr'$7t JW\BP(F6aIZϵ:Bī[)VQ^?$IM6g| I*++s=rc1h`$Iڴ)-+p?3g\{[|do%IZaiKtk[;.IRAAK'W}…Ͽ&iC6^Qe޽G 3&6gⓀBGE14撨\w,inU~ss,#xKfϟ?2hphh(/ޡ}{I #Ou ;卤n);.n]pN:r חk>wkEGGF+"*{λǰf͌+X{˖+E^l]Y:ZuV1yYyyݚ_/^L>uwǟ|Gޒ$EFF^..q@ny5 v4hٳh ߙD~)@=!\nѡrffWb]n޻{ߕ2K4kevqGllce1.W0y} "I.y_xM15^ܨCϔR/Yʭ7[e$KnGf 6x{2$nOs{4j9k+f"wcMKV^8#M4Y[wsK2s]+\Mu ߧ[1Dc?1YaPҩ H0FPn4:7 jf;9Y /ZъJ8hQMt^,)Q=?miDiA_Rw˜U-0ZYaw +}$\q,oBvY>#DqE1KUGV;J]L+XXjV™d/wHev{Y-Ve`d?I1|8?7MNUq}/]v!~Íw ՌHk.w2'>cVaw}`wwl\\ "=Z_*t Uv:^Mˮ||fsUmheظԴaWE?*{K "s,M+0 `c8D1ZY჈&\+l8Yʯ'*2ъӿp~j |FXU/.E1ZNrc@3)T?RhEDT܆,L^\u.DYъLx;sg&(0 CSL9T1Z똓Q%#͈j6F+""xQniL8Cˋ8׊F+""EZqVDDd0D5^H """9Hφ ]Ue8FEy駳]U`Ңڊъ49sȑ#<@ 5iVDŋuԩ[n !"6HSdddYYYiii !"6HS\\\\\B F+"d̙O"jъ 80???UU;8qf`BDT=pԊ<7ovDDiѢŮ]]QhEDDDdF+""""0ZYъ2VDDDDa"""" e,hEDDDdF+""""0ZYъ2VDnv DD?nVDv DD?nVD䙣*Zٮp[hdEKem~Twνhx?UZ1ZgF ?6M5["b$Z{!/]Y^ה,g0X,[u c͵?F,jv}ʟ^lQA\nTa'fk3l15Bnm޲>3;?'[RUK> \wSƏP3hp~L=Rk\qs㍬5o 2ZgvOVsµ~8j„%;AsYZi9vp8~zzޫBkEDuuزu]E=d@U&ZF{6RwK>lsGTͦh=%^ 6F(Egْ罊Lq]+$"pȇyċa{u=ꞍĻO//*ǧεee0<>f6jj&#qF+"L3槟9}מWpU\X_;>n>OQpTY'(Gi9 frҡ\@$ 銍h捈</ƤIx]a$&5hFVSh=IPT'0hNɓ ?k>11xsu#F୷ԩ8xmۢvؼjnMLp4T{i^f0s&~ `qKQ:ѣHK/sapCw$޽л7AD!:r͛c wjogN"Z);O"ص:x:TD+-?Npb@j.]7aԫR7ogoj+WHMϻε"JBa:v j)5x!*"OQ s'|ҥq F_R F+"v `5Rh(vDU O?GDT1Z?GDT1Z/JDF+"ѣh>۵Q곶xS-Ztgj4F+"s8|ҿS 7`wsfu܎wFlbA?Dъ8,X.=Csx!4oVb#>} ! x]x5hVp[ۑ$&9yߏѢ{ EE8xBhWkz8n/#) IIxu>;Fb"7GVV?|3k:كѪz.lސV',Iu V K"H#%v1۱r%RS`X\=5 1X1` 0v,v?y3b>0ɐ!fa~`DGݺس3f`Z[Nۇ}z} o_ߏ¬YΛϔ", }W^ /8[fd - ?^΅}jސV',8aIDT9Ġwo\ |z?b_W]", x-:u?[ ۱t)JKQVfֆA֢~ߨ˱?vrK"HF7*N*9 !m"6"rINFl,ZB֘<IHJB(-uZڻ.En.XLdX 6mШ{ιx˖a&lnK#:cinЧqZ 7$,A K< `t[oE6^Q-`q_k h[2-UȼӞyn|yYaw8^GXbEjڰ_|OpԊx""/-ZoC/QL[2Y3YQ[{FM] U80=G"" A""""0ZYъ2Vdѣh߾o{ѢOav*7v,nIIzIxG#!y7$Iﻢ7PqeC7Am}ꖗ.!/z#Oɓ7'O"6˒CNx1S))`oC" GjN?^uQ^={б#ZBbb-y}?AB8xBhWݎ$aK6 >;7+݋AZpmxyothL֭ѪphYY-7e絪_]~uNyshCQ-X._ =Csx!4oVb'kE j[oŷFƟIBHJ½$ܐԢ#,|y |#iԻi|TdېWvDUogNϋ*=IKH$:%I{H[K$%$Iҿ\"I7H\#/sɁRXXEĊ""*(l٬;$IWW?|Xj!Po($DZ^ 6m6u.٤ %IL|Psuӧ8/4[ ;y]҄ $IҀCw!e\$I.ItԨ;{V N$IZ^z Ex@%imHl i _R Lz7MnlmHDΘ*Kˊ/~ይ?|C';c'5UUk2E0A:xPVVzH$T*-$Ig^=g$@ڷbrd).v+-OeI۽7]Pn]i~gr充$I|#]w….H!!ҥK/] F+a.H6o΅۶I-Zhfϖ$Iڲ"6n,#8s;^[WzU n$!#VֆϦp8[X7}=SRކDk60xB&JJظO=>h֮EhSqmaahժRu "BBpmKEԩ~ԯ4U+9p!$gO\ }]w/:whj##QVRԩgY Ũ[/:3q11(+CQsʱcW;>cb`ygo_ ~ڵS7h½=zYYxQ:YLq+ HxCC5_nF0#K ې&/ [ncd]ZD8qв%oG(.FYacR/[C\svʕ~/F+e`Ftbnݨ(쉅  ?:5ׯR= Ι3* w݅s""п?23ѱ#5s.>&cp9"^7' u"9zu/>nHGƒlAb0Zϑq:oC"2?Qgp]F誫]w$%qc6mЭAb"nD&!) {yfJy6OS'$&V:V^S,:u|9MLZ}.[Mв%uK/sg͖>mڠQ#<^>,]\$$ ) 4Ig̜m[$'#6ZukLŋ|ˆ{A/x1M=2mHDrBx[ߪܞp8}/+*.KD5_߆D5ȼӞyn|yYaߵsAmp\"5m'5ZL Ӧa&tjj% | bĈ:>޵2/$I6^10O5SQQѐ!Cׯry/_6lXÆ ׯ^\\ fܹs˖-6MEEE W^TTTZZZyy>z$]z 5n+5l[1))i֬YLOO{n۶mKNN֭KJJtvS&Ml]>3-RQm6ԩSz衈i{'|222m۶V$""1ZLǏ_|yϟzc4iŋfϞhѢSХKl1W_}wߝ7oСC,Yrʔ9vؠAdff:uop¹m 4'@ /=ݎ;j-ܷo͛ ?~xn}ƍʎ!G)!!3 7nܸi&ϵk׶mvĉ{7oVjIDD>n"ots6mop-;v,???>>>66VںuW_ݵkW%>|m۶wܹ)Sƍww{&L>}ѣG㯽&M| \:g̘.7f̘uI$Mgn;%l)< +j=:J'OlǏ?YRRbxl^|922O>6l0UzuaK(8,F7J njӧOkN~gNjӦW^:;_t8>5kJJJݻ:ydxx򪫮vܹ[v$$\p86m4>I [? B$?HNN8;ԫk$""1ZL78{{󏞷z+""bG駟=z455U^lٲ%KOF5jh:wؑѡC[,3g΂ :ԣG+VOO["ZɄG iP>OS%ҒL\]dŋsss//|EgDGGݻ>O3())Nlߟ>}W^ӦM _*LIIٻwoNNNAAAFF˕6l(oW:q8p/ܷo—^zw?ömRRR!5i)< 7tӮ]֭[7y䰰= %ϑKI>ODDZ8jU3͘1… G/>}zaa?`Ȑ!ӦMϜ9333;hԨ<5} &,X ,,lժU۷o߿~-ZԧOe_tKKK{ꕑPXX(2p@Gyp' lHK={vzzzZZZVV֚5k %MO5Kj;^>+//۷u[IqqpXvvv.]_U_nYo-,, 1"""vڥ^޺uCDDhE5Ν;Ǎ'Injr`:u*(pF9rȑ#]^ e,hEDDDdF+”)SnoꫯÇv62 :JT 71cƬ_~ٲe'Nhڴ/(jǎ׿#FС/x#?S8J$S)y∈ZLEEEC _~TTTJJ\|yذa 6_~zzzqq1Ͷs-[l6% 0^zQQQiii>hhh|oIdO=Tttt Feەƍf͚5ptw=ʝ^l۶-99[n˗/wr#z&Ml6[׮]yZD)[yl(}6mԩ=PDDDH/OFFFm_~1^–DD;Fi˗/7oW^=vX&MZxqVVٳ-Z4uTt钝-?ꫯ:t%KV\p8>C999ǎ4hSN}7.\8w\ ޯ^=z4y;vTuر9s(-۷y!CǏ?^k7[߸q#-DQJHH0cƌ7nڴICsڵm۶8q޽{͛g$յZx\{M6or-ǎϏnzW+l>\XXضmݻwwyʔ)ƍ;{ &L>ѣ^{m&M[4h:uΘ1#333111'''**ڵ?СCe3fݺu$ {ٺ[o–⺢c4ydyqӑ%%%Əfk߾}nn˗####ߏxIՅ-u &nnJOn׮8&&fϞ=N:զMya^tV;v쯿*p8"""|5k֔ݻw7tp~ysfffnZ$SOuOY*ǦMϟG5i0uaKDH}y=A9yUzuDD#Fq<gϞ?YcccOr[oEDD 0@#"##?ӣG SRR-[dɒ~iԨQ¸F-^XQg;222:tu֘y֭[DGG?~'̙`CcŊօ-$$$@~~Vo2QzTTI$""S8תfzsss,Yx 7|sѢEY'{LJJJ䁓-[OիWttiÕY))){)((X|RCÆ ʞ}Y1nܸ|?nV/R޽m۶(C8j:[7Rx@n]v[naa{ 2m4̙3333Fc]ӧO0aBJJʂ VZ}oѢE}Q^~K.?W^J L.' ~eW'N08u#-diiiYYYk֬Qz0xԛ 7u<ռ.Ik&""p{U4Z<<hEDDDf$"""w=IENDB`PK':1)-Pictures/10000000000003100000016C2FCFEA52.pngPNG  IHDRl9tIME 3tEXtSoftwareXPaint 2.7.8.1=bM IDATxwxLپ˲DR{.;vv}\S/\%9'_$nr\&ɶ;%{/]nZrybx ΋G/Zr^niΨb}-AǏofccccccc*2Xp>z緾s> i{+A*t Bs>>C;C;C;C;| 흊AznM(/OJ)V(Fn\Ce\ p@䠲 B#ءڡڡ;X)P 8hzM &m4"I'yxz{Jϗ L Hppc9P8J-t$I1qު=;sut?+ h<1YaFKZ?8ڡCKqqd$0cءaVT$'䕕jYVB tw_K&Wo./!)yͬۇ+S0-,#qͭc cY1>&+bXb#8a&8+@!`8-y&Ok0:ܟmn$OO1ar2Qt#12)*,>tbы! ^1{ZN,Z>bF+X1Іwܲ,suUW̞Yy\ӈ1>.+i2!0g 0GT:POE8`(Tn%dEUeٷugGT~ȑ1fY%p5 jkf[Zʹ`0pҀ0,De`*Ա0'̇",$Fz bc ,0@` 0<%Q %!$Uq 2XbBGS1t-IzVj3O|q$@,Z%xA>ݾs§.Tjkס f9`;oBcU 5]LӲ,2޲1͑n cJ'i/H22#ϵ <$ts##2BQb0HPq I98G0A|L:G&G0Hg41 1Th*,NP1~_"naP'-cyĄ@L!b"9\1HEPImo;e8fs8H  IgH'J0 5 [$ )tR1iSr^/}O}~mo_Sɸ2si'E8 1~YlɘkG΁ .$u d*z 0, d:^[0`@3QL#8wID&#iBYQ0q%-JtL1Ɓ`W`&:z̃f 3L' ´KOſ-c L|/.Ln<#쳆4MO1bOc#-Mkc.@!@dcs9pL:Lg#1q!z0 .ii1sxfVܰLNpqCC.aXn.xF!iMqÄBSM_+\>0~|M*IZ|)c5$4$\,V(LkgVg-@݇jGx+Mk`l/T&hQC;|pc[L3M{\ 1G BD2!NYB% K7- 9GT1$clr[Pܪ$G0n1 42s8,L|21`6 #DBǦz51xO'86O|L84g'J;A>bTH;BI** J@BQdE]ԚI\/cZJ7H<}8X"`ZVvhv8=!s% ʹLeR8eӗ^CK\4ߥL&=C4,`v\Å@.O$t|i_C;|S맒E =zzhWJgTYxyC&R_I W*&uV3/MpfSI+bᄦRq`<3>?O':'xRigoػo|339K_wm<LjO$I,eKػ]/`p}}}V|p}^gdzO}q3MVp$2cFη?0A666666-LaxEgk˞۶{/oڰa/d(uL@(jjn+-o.LZ{>cm0뮽Fb!ϟ?sI&{EQU7\.A^;g/ZvꝻvbcǎmڸ>bxGz&l ˹as-[66|{R&8׿pՕW9rt|il666666>\ԇi #S:}vB0Em!m|HdX$Y9^g8#˄" !^GdŕB(RJ)Ȳ1nj E CxFR\v/WUf\je&r7o‹;JK-Y1^v]>ܹu~?44jMsڵwА$I֭ ee;7\7M%-Qt:9N#e̔a ?UVVLKQ\.a)28< e# .%C,%K׆aSܾ/f"kM3gXn-[?YaAM/vX|+/1mޗXrfM%uaxtF13-mlllll.D>L|b g+|d2yv ֤UT?m;=>F%ԲD"˹is4{5c8L(w:|~ HPJ-Ze(tSO_s^R\9m6nS񵛰/VիWoYr9缦uu94 oYcO<9.YDl@aj3koxy&4 c+۶o}k߸낅c/[dɊ5ɹ9zl6^t:pgsjr')E gΘaU7];gB7ooX0Yvu㹦U+Wd|׭=t`OP%$k<#_"撠W 66ܲkZ'Mfw}ۦaF1m-l^;[~ؼ,;gUrnWgi:wKDVrWR.k&dr&/$%9sFsP"&'0u4Nxt_,i:Qd'dr&/竡666666c}llllllll.dcccccccs PhԶyͣdz$^j+] W;:qm^[?~ml2!'%^2˗enȔ>kccc |ۂEE/dcc󚤷]tc-: k'{79 _>accZއ %x]MPq+"`\gFꉳTR ^d 缭衡0&1Ya0XQQ*jn9www70a@`>WQ)` $e;u-$M%wنK(5իV,M܎?}eΩeR$$ ۲ySSY%>Hߝ\k.c+(Lit7CX:b# nEYfZL3֧Kf _zQ-Z#Ip;w3+ӝ9@qoҪHmc?Q]UU;6 ;~bFEEEE9BhIF8J$,YxdR\SJ{:nm.wr{{G4onn>23:O9|9z XL4, q.D60]ַ iRJS={_| نO~!Y1ƆaX%|UUD`18}0:[>CQ\P@% Ӽ'O8yޓU"ns_еPJsccB8ccز,c @<O Ӵ, r K{vWbo/re2k9cceopڊ|!hpӽEg.EcMm[kzd2´ 2כ{I#0BLez^k K޻=UBU5"־icp(ET7b}cJw~^̶%L: qIQq^ C"ӥ3醮*a%\Ni{LӜ5sucbr\$uttf+e%gϞZGA4N8beYf,.eeiX30 \B0 Su]M1bڥmc|$'q?)Dbxxز,˲NP$I$)cQJL'|d𞃧zz{k$g5#gq9n(x\p1Y ]'ʲ,J(@Owv,e 1j eYl̙qc2 C}|^7|eڷޔ:jc['D2ot8S)h L`:NHFZTQŷxxg`ȫX֏{}>c,vl1؛ly7Wc9G DŽ``#gqOvuu{=K*L9 ;Eq{ܔ";1'N+LܾcG z(3pggW"زyeՙ(Dr(<=x5WS4\ַJ$3h4zׯ[s"ȬY3eYf%ֶܺ6y&iI-iPa{z{NG@>|~znCblke1111DLh:,11fQBce&Pr#'c t: כL&u]WEXhrRy gϵvPީ̮^D>Uq#t3S'"])!UUńpXi,Dff 5}:HY*[z&3-gFSc?vl9j}{nOs.XϾd1^̴A-\=φϴCԹtkj38P߰w$e=PHCc()#RJB3f!TxB #-f]RDέ=ήn<6 !p:>7Lvttf>9RTp  IT޶}ǼsKJpLj E9ԪAQ4ϛ& a,.LB!7_x c"HA0h梅 ^xqg gܴ,psKK{GԄڤG?!+Wڱ}ن55YЖ(iRaX4M'SYB 󒪪ngoC,j2u 缣0in0Β$ 󝎌cن5PR0²,)"r^^^gw[ IDAT˦׵s~UVy2䜏H$&g%EQt*(((((eԩ`01H&5Օa 3 s)+--9yT8nnKXbĸ$4M3{^L+"4'јaQ<:Q|쪂 #"2/l}tMp8.%.=#_ L`"F bF@I 0p3MMY੟xur+blw膹k+) zRO J&O8uΌMKRCa="PL :)BĜ=KQJ%JNGs Q$ʢʼuݐ <5utv䛦L$0pKjZ8wH4Ry+G #p>OUqRD"H&$8uBWeK?{%*#p4MknimnnuUWzh4Oe0- e=<<}yqЅnx@$UU%Ib,avϟgtOkfkkcrE‘A a$~>LHOwϕWlbRe1B)ȒFq&B\aJ_ 'w,_ m.+JլYa .0ePJr.B0 CXG,JYɤx~#iIoodk{w{?Nsi\UUe˖}ηwyKx`z:|2uq1Nԅ3\UU+Bs,Q<[_u^*+*vޓ=//@%*Su!@)S\R,6LpwWכK!~߶;RlWl@HXm9.]\*#^ia,LbXB%BWZ }n9.I-ɱG_paD\IMGmVԹfӛ+ő]%pk/9V.FH0s7,J@t8:64̙]{Ŗ^1oA3i`KRkB3cD€$MXdƘnzL#Ff0uHjK$cEH =]:?q2?//ׇǭoVN!Ƶm J9~BJJN,p.Y1oܚpSBlIc?,`G7m8u兵Ê"ޚ^<{Ӎ785k71E&FNZ4 OSq0喉i196 \gybƒw,@kI0 4Γ ۼi9- v|t718(TYK$D*$KJ# !DhYw4qE>޼cǎŢ1 pTu]$~ ?q 3*=bY|$Y2 CU57޾~4ru]'={Ο??l\hQCCCn x%'ÍpfY)^Epe#1ɓ8Դ6XdX:t:0Q1Shto$YS:F1*iZeRBZ  I GX]{Td/ Y؀ai8/It49th*ms@q(LШ<~;جisܖC3 ##L_܍!@8I--LI\Lq@sK8OzkWmmu;aɄOcϖ~9ڇڟlCġzV`i]B) E9sT}380-h:$w=i3/D!ggÅylinK% )g$񞞾/7xܞP(OXZZZ"sjk,BݞΝk*+-VUx`04o<766uuwY]5H2'+@٥>o~@f8 ?qkL$7o0;PU\l$0Fb]'cq @LÉJW4BJ0,S=!K9 s%47~I$1QnY&^Ɉxdd7)0-N$eN}%:x8+iT_@j8 ={]62Q:+<4? I*}ݲ8 uJ#.%SC.>Lh~d9mmolHdx]9SJ|><+b,eKeY$&:t7PK:/~sa*Kwknp,fwI'1SMyeV PX1. Ȕ&L*4aDB6߶U㱘eARgYR-5sݻϵhɁ(l,&D>ӄfŹDp$ kV<Ep8‰D=EC!D sx<@rC騭zE8$gN\P.YP=֐tqsKˢ TEu:yyCT)2088<<#/S().Fg|>kK$Ph0 e*jc#ՖU%ƘiY4ӓd%.Dd2DwwOOoZp`jԄF8 b1F !LGw8_`LaM+TE[d[5JiY$1(4-BYb8HW$* 9` 4eE6MS~{福~}d+$Ie@(h\wz-lc  S/:ya 8@I5 z*Mw} Um/<͸9( WgO@Oq/x~ }Mg";'ўعqA>B&\]^ /d$沒2UrFfipVIv ˲408ēHEԗS/[|^u,RίՍi\jTeyYL@aI$ו~<0[3G 8rםLh1T5M~޿zVn*d4vk,nhaY-l_oeB XZpXǒɸ33IJRn5?|:2nmd23gN].y}>(XP\R"FbqUU~LiOwo"-#h|a``XRUU")66GUU><bb0ه޾Nv9[Z[oܺ9g6=9uEAM2tISjf~Ӄ3nJR*1%-c׳nbRC7L4-K]8\P b!#J%FNz>@4icT%)/Lȼ_"t8DC))cPLYP$9S q3Y&Xl I}Lcond\cM$12aTE{_eZCa (8{[w(MonYgĺŸm=MZrMzxw?a~4 "IJpvIrZ%7ydIzFwwϽ%Ë?[g4 eF{CXLKj˗-Mi[}.3EGUGVPf+71SMy#Ci}` Ȱ)o\I kzh ;ޖӻ*gTCֿBxB3M#;pEE%99t`4XQw+Rp.c4C\l,` cldٚO<5<5sf^~H-imm+..q;Ζ 3, ]NWAA~qqIK[ۼu=G$I.5i σ=0Iq.Չ1}sjg#a!u)%55Նi G}^睢SHӷn:HM83MaD0˒N'ʜ;4myypcׄ)PpG*Qo b48q540HLL} a `Be˰c!  1 8[t:cULϭ^0#{Hw\ww 8WƫhYpIĕƓs1]{ { c,&DHΓbm^R-w!GZ7CAĜ:qO7'in17DwJAPH!>߿CLg&D%DUՂ@7^m#՘Mye%Y0F`1+'<ΓI#I$Λ؟Hw^VLt<H8**]O+V e%HiG>wÎgm4-DEQ$B08p J\M텒 á,/8p89'g/߸~K>4J|8H/`a⣋sԴ07f2Ka @ YwEih&?h%PT6sg>#'B4 =$Π3 u??6|󇂅9;!eI"֟> G3.F@ġRBPeY@tDQTUUVZEce)e0cǏ/_,44t)3sFvGB9;~rsZ^Vtb4 m{` TWW[XP t,))F=v0׬Zua-mJNhKb4S:JBC!]7"aE+++76;7+p$K),uR'>S!5ەڦ8C>h#Z1&J2sMkKpg}jo0J\V!b;cL}g]n( C7e sGߐe0 P<⹣/dBRB% FqywḊ4zʷ<}2]BhJm7l@i~A嗽~7[o4WWH;Ȳ<ڪ\L1$I[ɣ<\԰~b0ܘ ΔLjo+:;~B{Ē|E&(PKs1)÷KeeT4WT%4d0 zF`Y i$un&!]<Ҷ,:P1LK4:V(~jۏ *++nW7#PUvƼ+P$bu1=Nsz39]N41S0kVo钥'O'm>1=)RiZ皚<O,u=y*燫fy˪U+L˔%)?/Og;:~,IUjK<7 ]N<RFjkJ Kǩ9ѕ=,x|ێSRyB깡P=aL8g>K]]] NEƒn F9_L8u?0[?s,cf<'>m88kuÞ}I5H~> ~kYovbNl_|zQuqD9dN;Z2. @&r؇i*YV U(cCW[<.U IDAT8ge[f͜Fs"vbʷt_+u;;N՟weE%gqV` &$&J` JPDMc f|h_kk N G"!Ʊ udcMnR5kV0tgo\I"$$ u3ְAmXZ4/*akWT8yR va1)g)Ʉ@ɖ榪ꪂlKPJ}^_LzO}ޡPfyyd>3*Je#9].EQ;TP`0%I*//w$|eK677>s.\p0n$FсZ,`6(PYQsNǓ1Uu\T<̍qN 57]aPB4W%30-X%`GyxK Pa];N)L!ԟ ER.&nӪynwy?[DsA쭑kd.1I3;Ma ~L>Z #`\&ߔH$mܷՙ"pmmͧ>1)@>uueƸ(_?>OVWUr]T&G^m2ea, !p(41qp$OQ):cb&(RL .,((PKϹfڕ[16u~CC+VH q{TyPYIЖ:j)EdY|˓XQT\zZ[[ꂂRR]]U\Rt؉s犋\.Pxx8/RzM1xܹX,t e"Xt:nֶp$,/X0 VRbNPЍ\/3S; miSqb̛7w̋SϛLjaF<9C#,ڔ U+Zbg󎏢۽~Ko[ &5H A@( қ-PKKOH\.wdž.ɥ|?$8$9Lba8V ԧw0 85cp1LV&wqsr5Ug߭?N17VJJ  aS ս>0A J'8Shu0ZX#Z.m$Q1P:)R-Cv@{xsrt7BΟ\oOܝ9]% BɯmkSEH- 4%2[D[´o3;[X=(Rݩ{Xʔ jxz1߹1~VV\.(0VTqcrD"/)*I<][;ps5Y &\JB01%q9\@(_ nIoD!W"k 5LJI.ɼZQEaLG(jΛLLVT\\,)J6۶Mz[ju|BbAAJ409l<{H$GIΑ+vݑ$ޢyly[4f+1^HdJDX #@yΓ>5ǵ}+ɋ:zyzqjlb0xLK){*uErփ8ۈM-`ҌBdMpTYVy,G*UI$eRIjX,R ңQW:Uz 0ܪܩ"̌djbDTxxx89:xc2ZzHJJLFQ08R*222 Fc.YZZpy<ˍꎕeZzzNN@ 0TjGҎ5ɔH$q99 0غ@(Ê tXֿ6r``$E'S1BP`@VK0Y8a3Ii鍰岙8g8VKY -d2p..+)b{ܣuhDZxK==n<$IVj0Zy\RnVo<֡D0J҈QPTT(j*)J$UD,YqL(28''7!!`\wW>0M ȉ8/ޔ'[NNۦMVb.ƲQTǚ[9pK^<gj\$2E.ї.ePp\h`lxb+1r|x<@ x 掃}eߴ|R .0{mf|~5ON`Ws+J>-L\vOjT*KL(/PbH$rrWK{|5eJ/g]wUӍa ?$\Qo#cO[QHQ`@g^P8a9rʶF䪇" X Sbxez4IF%I[}F &B.KJJJJ:*rFKATto`0+ِ4&/3{̱s'Ye^nD"*t#5 IXPoX}]QQ*~CM{w D lN8FkYP-&1Q|ޣH~±dg`ooiiAjtn{];!ϫ5Œfq\G;I\0,bݲ#L x<^K/-5IP8r8F>Zܹ{W.WhZP"[uXl-[+ ln(JERX, lQT\|jMqqǫ0LP]szKd2K&Nݿ)KҜ WĝN^I̭l*2s-E}ZQ]o4 }P;oI=jZ&і;LNY{iYzu56^s;tѳ^i*;Uyk֮915cS+V&?ρVԩD&vtt[71g-l$%%Eql.aYl6dL&K7֠0)6666rBѰXFLk) 9\n7ૈn29%2+iieaeuXyXڽQA$TEݮ]mڻщM !]upgXf|>Z-A.4H+ ~'qP`X, jrlv kI*1Is[sw4M۵;!oo?w0mdJtV7_ӡ}ZYw_I))ӧO>$EVvm5{TS|޽\YOOA;sʒ- mɉyW(.8(a&?4>«Oa,oϧIQߐm\ru_طsvaεpsTNήa0i$qy0]3 UDEL`RTt }ӷO{򿡫׮ۻo'p>]{'-,,*4on]{8=DڵG@FFf߿_̬_YcOӥdA;?3)%KXI._@n,#&f:+oToP*=|me 7|!,yv=]3(0}ѣmGW v6+kʖ:qto껕Z&D:rn᥯YQ+k`@a]F{K04d lݦSqA~]{>}Lص@Bba~]{ a5]rJJN>v'uNǎ[۵k=x(9%Že7vۿ{cktn49%K1zl=a`CW ꭯բ%֮vY.¯ۨˏ{~|{O` \XdY.m;,YB%Iߴji`ȰTɧ ڴܶϢ%-IR# Ѳ_;~ th5}pQv"-]g^ӱG?nwk7OşcPO]=Z^SQTe4JKK{d@`}A#ʃjF,ߌ0~ *vmɼ3M~>wvׯ|q5.] F^%%-nDN?nhb7 ݻu={D}<Ƣ`CvzTBOܩgQ7=z'0PYTT2p@0 {o(-,,*JIM2h Li|wZh#MSg.[JKKcn|qiS/]`0ò+W^󏛛H8vlvlߨzJ@$գC ea&-e0ZekiX.zw H#l6K굈ٳf5@MxOsjw+Ǐ}C;ߥΝ֭[vY\\M?;;rŲS&:r44,~eccs`_&߶Olo&"2Cv˿Y7n:WzoSlպW몊P/&'<%tY89ye h"K$L&S$ EE1EQF <|VkHJ0r064$Jx$9aXо]~Ap9.YX+:ey~^b.BX Wz9t8&W)p8%5 I$i3* 0-Dhc^ѽvܫGaX>~]g|[w¥iNV"%Xjm\!*̌; cS7WG=z-"2*/ 3Y;@7l;6.n{Ci}Z#0PuU.?a{/$Č_m IDATlĤǎXx]ny=ztjZ5B?~X0mGoJ;ćP޹oV**,0>qT7G\#0j۫_bny;펎;jޢEמ6ni3Y̬AZf_{jtn4;mM`߮=M !EQ=ytb o%{ecc3thHK/]̬d#y5<@Xy͛وY?D\0ƴ R.οTsY}'^={sGW|Gė/-۵/)7^|UtuvvvEuקO֭[f;;;8t薟xE_-s?l\FZZD_/|s|uD#ht ;H_=gظ^ |ya䉕$%;pN =|?+O?#Ϣ9b8Uwoddd|5ytʀCuϞ?ʞgb|0Q~76tԉY3?$IK $njub\ IGDFE#Np1ܠB@rؽ7--},YT_wU.XX}#.\rϿ~ڻc{IGENׯ_FYjYl~i_;b޻АFkl^F]ސY> HXdh8IP:l-I};;;Ν;]ofgk"-`BeAa~IwgOiF]#*}t|3ơ '햕DC`ff&ԞkׯvYNӡ!sgm[~LK~ܲ؉*xA9/hϟ?eYѣ !1i<-?,veIkǎ8;;5=60konaӦLvt733J=~2 6m\7lݶc8\};Wšvzr{I?R)6TZZ:OΞޭؠA¸1:ueKѣFReeiID"177(Bii)}طGVoݶcGs?[7*MUTW5@ jGAg*--_e{AތnлjTJKK?yjH N`ٷ+'OY[1߭YC[.\ wqq6ai?ԏ0UZ"LiFBBj<=5j4Jbf݆gG'I v^KK Vyqrerg7|y?y\wN8XOHQ*&QoZ)ׯ\l>SDd2E"Plm]T\DS5jp?x_._zIpp;jD{!!?8{ ҿ_&6TH+ra:Х_ffp9.Ǐ4pd2$ִ >}v%iq&TV:ɝ[-Z̜1kWW.r5b1gD>>EEm;~޲˯Qk y<ނ8}T {{;?_߶:9^6nqs=c<:ho]v .x7i׮ݿ ؆ztXbii؈˧X,P@&{md rΝJ%,у;#-**Fs[~.+='@p[mߺmukwZQP& Z }|Ju s~vZvׯY~*Ջ:clmfcc}`nK}dїh3'hwW@KC D->ޝCϟ`Db>}zF.|T* Z[Y<~U'JjF& RRS2KC xwt64lڔWwkAҏ?{DqBhϾ=՚m;~xwoU4DV\-I+4/_^fXE>NKl\Kao-[w?y9*agΆN?b%v?-]R-?suq3gLrڢ%N8%RIYjգ{7ݷƌRZmK// :h4lþ=p\ow.Vե ֏0i5u]h`6lVq9MrՑC@ԧ?bUQaEQZ<}nE(;;G`طWU+_߃$Gruq_vGG?_v|:ϷQ߮ðN;?{R0gΘ޽WozkG?-ZtX>O>ޝ $u.]p4n>b䈺,\0oym 7y{|-6ԷI7wX||ZjiiqE<=t)agLkm oPp ;6mXi:8&*}q(5u&Gg;7A<م>j4$IhI$IRhhH9[FWCr. -o(h~pԘLdU *@ ER\c[hr5}Ƭ6Q @ Jixo=o#5a2["HD*Wkȟf *u@ $m[HMa*.QhF،3ed/r#aHfP!!/#zGTjMB3d|'>~'/Ba-o}8arL?P )Rc-H.)*..&IWal1@ jKDdTchf8Ief}=}j*$I E5ähjVyY& @ u@d,d4z]#L"!DOVvF5vc8㕭7ng}< -((1cƓ'Ol+&Nد_#F|0==}qqqu}Ν:tP*-ɂkԖeYI4G D=adaa5uB`2yO)ekj;]񦆫g}y<>`XqQ˅y0i'wD>1gO=%Nݧoѯj┏ݶF6tJ/բ 6qI>KȈKh4w-"J#L"hԨQo#GDSNuuu=sLff_`` l۶-11CF0qcǎٳg'LӦM <S~~~p.́䐷@ M;v꒒\'%U7Uͽɣ{@&%yee` qO 5%C.p> ӅBs Vi/ÔzHRBVLsq}lie=911=-YrV㕘wWVs}UrϳJ}\U0"uf+'K ǪZ9}0 .В?s͚5JrK.gXZVPx}ٳ  u+Vcǎ#GbVߪUֺ-<ڵ3UQ w'xPc[0)~ ggD ]rHQ$l IBVZb9ղ_ (ժv%E^ L[1Jq.TaN^$J%9Ef:+‚\Rs1^_l6 VWY>jhUrBclbLb7![[T0yyy999d~I'NlѢ~ٹ[naaaÆ {5޽{`ii_XXBK3g///j*>x@9sTl[nF>(Ur6v}msFSemHO-NAwP %:3X,Fp* 2ѽYiֶ&Ź9g3 . ן[xצEVxx}N:e'ER'%HڽB^FҡQ $Z:: AܗByVcd㯒c[X9R6VN0Tieeui} FL̫-C?qtt8pܹsf]vet%Jn􄩍mxWh =$G8nai-).lݦNо͘+ &Oߐ#jr3 &E`0pack߭G߰GZM^nV>u͈~gggd2=<\?R)`X /WPI-Z&%>jY>X&d2W76:+>O$qg2Yt88$-F<Y `SDѤdr77ٳggϞݸqcZabނ/h֨UʻF?wu5mg>J%V*L V{ҙFHJ|~Yl %EON%h2?/>HmݦcvaWC֭GPUq>xpL0<';s/?'iHMIюPfqOFE؊+O,YdϞ=ymh6H$E4ߌr3 }K T*Ν>hP_6_sq54j(}|`_®_ 3m Oxl۽Gߓ\z\J+FO/%9>{w_4!%E*>O"Äwd( $ȍ%'%J$$kׯ_QF D #IKM?p;=]$ 9999w=Z4\JG "V#jf:T@4qF~zpȘCw[7 4?@T\ ;a:&%q.\S\TddF`C QO$&$dHc[t_%v@ &Ho)%%wPp빭ZSF!z~*,,(e˖˖.nݺxuM< @ wmBs-_|nw7c"o݈4qcǧl^0$Y$eӟR] IDAT(Sr%$'_RPiDaqNH"#L@ B-?yүzWY+n;({gϞ@QQєi3?Yn˖vX̐ƍꖶ5`9L%R% $E`g /Z I¯c."Zq%^hdj1iǏ5kcǿYmt5h4b82ʏ?mݸi_{vwN;;'g!ݺw;+O8`_VS?aR5% ͐P$vVv~\Rf 9R޽a!䰅$*IO||N^^]X(@ ZD>@/+ʦE > ۷\v1p ѽ -7`DB}UQau CL*!E iϓ2ҥ6FRP5nǴrpJ˕CV$+Z[@ fM-"L΅m\!'Bb de2())L\޹S'Sn,,,ZD" -,-)0. ej$Ib08`$IjZ c0Z]iަ:(J}L&{iiiÆ {MZȮ]fB &$d3U~ilN8?..~pHy(F+|~T(]]]teSRRjP(h߾]& /]ܳG4CXh1j[6VWa 800 zZU&$IWW4͢E-}f>_t]EWwWTտ*hEġG4F ΅@]|pJr/?_vݻ 9soȇ@FV) ( 073?;-7#%;-҂&^%^w0`a^01`aPA!CxxxxzzN<411O? NLLrI8,,ۻ&t&&& H$mڴIKK ՘IlUt]EWwY[[8}j@~C8q\$|ٯVX<6[}..r dVk?>}ߞUZBIM},0Ua80qП]QL6-00$IN>o?~nnn@@m+wbĉǎ=z4={v„ U5Qݻ;t[[A ۀs[r-_f5qKA\l<] }{wWUISca# ;i'[fW?z000`cK?„1.6z 4K҈?p3gNXXh4#F` &BCCǍWU@T EA}2bbn4!&~0āOXGt17Flv/^EEE C7 _,5{{xxT@ 2}qG?i\o&,DֶV6b7a}Շf6ś 6=#LUammMD"OmlljYK&Mt3gΌ?&0 -+--cx@&˗T $9o?nl6&=[a€Rv*Ban AرcȑH1c\zɓƍ XjtAj E @ DE W!7>`UH+Aj͞={̙EQT߾}WZU~NQFݻw,-- ]\\j/^800eΜ9snݜºukWM/~L*,$y$IQ7^&\fWUK?k%-etrr:w\U9\]]u1uk׮]>U2@ 51TRHo>Vɕ*a*O+S0HxٳgL؆ YbdK闖ֹs5x5С׿kW pՑ^zjժe˖Çΰ !ԚmU*K:eɒ%۾}ycb,M3/;KzLx}x ֏U_CHq۶mOHH1cFpppJJJU B}a2g_F˴~QF5!5iEWUt]}gi$&&:;;o޼s ѦMCU_[xxnMܑbҥ7nOG9u 6T02S ӊ2%9|YI\V*V&IȡC}|+Vk9LI&>x(;=UT2h ZM³ I/i5#+G )S9L=:~ŋ'O _|񅫫3g233aܹ[n=zt`RH!J0U z~Wܿ1ѸTUύ(֝JT#L" j5vq̋%2 1c+/Dj|35>@ DQs Z&lٴ`AMp/^Fj01p\l)+EQ8aɖ$I h9؜$I}:@ B{Kě֓eSj4oI~nM:SMGd1 8A R5@ cT41}o@ f,7#IA,nE ,+xئ54g%„@ Dӧbdo&T&a 'T8DdTRYLhKe 0f1rFKq,s&}#10 Dʡ  xP}̈́2Ĵ8wTt'wq,)鹗=ۉ'w(5=oߩ]'w~_Dp.M3/j$ G-$Ma uBȢ.8Sv^''1x~kpkjbfw|Y7@oDZ P&D0sׂEK/YX<@.+9rЂK ^C%۴Pˎ:Ticŗ/5\TyP )RH{.h4r-Byt;T*ՐX #$]Ѣ9@4l+rhH4UmI%Gdq^fȢZJՒ$)W)zIIjB[0RJjjT)W\ׯ_֭[lپ}uULP^ĺ%IrSh@ >9WMa  '൚G,|};7#]V,. $+!NXB3.n!Pq7JЌ岫 ={ǻw)))Gh4+V$iM)Yhi!@4]* Be,fRl>/+҃w S3 &^%'GdeK=mZ-lܩ0+PP`8Z9:\eٲe=-{tt4~1ɓ'vСR3gQFi>C\;v0`%KF aaaK.}azzٳ0 ޽Ν;sssu&&&z{{d2ݦᮮFڀ@ CDJT11*9F,!ⳟ$|aNAI?IMH+&q1MZXFEFM/?{7{w{U*E V콋&1 `/$j/1#1Q !HP8:كg̬pqqq```\\bIBPɖXbΜ9ׯ_d L:… tndd)S 44'+++##b[ڎ=pP yx۽UqvU/yy$ѫyU6{<g &@M逐~bD?OWNfUI!$Gy|}]VVVX,}}}_GL& FKyy9 :tHGGGӃ`ʔ)7oH$W\x"0y慆)  Xg*Sxߞ]ܜT2D7>HT>(Aa/fea[ut؆b~|MYy9`چUHyvmiiYr$I? p8 @9w AБk-,,rrrX,N7AQW"e{蘩5S8I0L$$0\,$KED$pla\&$!H0EDD̟?_SёdtϐMuuY^xKo6mZDDDΝ'O Ax<:f*--555e0}|bGATniZS}? E?$Wt PMEvVl55D8>r-K&Q,ݻw?qȐ!xbZkjjpڵcFDD(sR.]q1La͞0aƍ_x ܿxx8A3f 鮮gΜ+dt\LˑeC(A^ AYI*^[($q1 #IR[ݙd?N 8X 'k}Ut5Cwܩr 55'ZJWW*Pϟobb2mڴ-[r;uꤸBׯ-Ztݻw޾}FU^^D.((7o^ZZEQ?pֺu~7[[y-[L vUyJ/_ p~耩UVպw5Uq@Oކbjjeb`emiL'ڪh kowqq##Fo.uyTv++Z[[GEEw۷oK,Kc˗/nݺZAO"*Yr|ѕgzpFNIEjZ@ERlD,s+M-b0"QJ^|{mF`yAT]BPq %>aHlnBs e2YBltv^֠b^?WRZffRRLeڵǎ 7iAI%Q 0EN>01b ⹱#)%@AVfx$IvܹsΝ A>KhnyeEmϻ &'ˑJdFB(HXUYnhdO '2^>fdIc:87Oz l5.YYYk,OIT~QeEiiki;9Z޺۷$A,u5F9Ņy>t5յ;z j_B=}z_sӇwߪI_Ok耒JLӯKK016ruq,)-x8ki;40KzAK(4{XL.IQ`0L&ն6#I`LIT,ւ&AfCPD%9~p*e0,KMMb &Io$Y nMFߗ#\r;Nn{i SJHÚҷoWVVF+}׸feeyFPQYYY1JHk@cAKhVvoHn]SVj̉CgNob{.efjXOo2 LuMej?~"3;vgGٳC[^Zc&LW o59zZH,}w`KOWSnj͟ tAro֮[f~$9I$IiF4ƚ0 SfUKGs k:ؘOjjyZk0缽qP8a~N0HPc ګ3(Ä lMΘ6u)=j섐aC_Jς%Wr ǽKJK9#]v)Xի4zՊ*CDUU zՊ#B &m;c=[q/]fld4bx%+;w`7Mkxb=HM2I>@ڍcG+s"Vݵ}[B\H$%ƺΦ*;[7o_ȩNעc,9"!dWÓBAYYAv5zSP(ͨSx 4PǏ89t`-Ç >'d {(3j$ 4bv(XZZXcboJR3fb | @EEeVvA0rNn'6&V4cطTcKZk pMZ~a 8OғdռgXLA Wr]]]]]][?7=ms`<Ä l^BacXzv## `- WU5} Bݭb=rn=?eoognf`o[&ἫGm}KtzCu&%%h1LZo32**es8Oo/ pLa*];Ƞ6 V^ aBiF/624сHyy1`&]8gog'7X0aKQ\ǎQ~LIRuu6TPlpZc\-Bzw 6؁YZO;3GISS5 <}t>r/^rmllfeeuԩ͛7:uJŋtիZCC.rutt 88u%77y(׼1LY5X;+_-56Afk0P~}a cC 1^0h`Sg@*.]27/O'DGHHuuQXmL-t9F 15PvR1VkaU S^yO?EϹ| COO?=dbG4fZhhOVVVFFZni̛79%%СC6mR(SNp2eJ}ѣtߘWiJI61F(~E%@4g/om-W.(,Bğ֬_J;V++K/On==?yj`ᮥemmUX50㐾۵ݦ! IDAT7̬.5OA WF<Jwq +"#J |pҙ8v}¤!dkϣr0.\BCC_*444\nΝ% ֭D"aX^^^JEaaa׮]544MLLTq 9EV^> /ٽ=y_#|K윜Ȩ%%%۶l4qqGTܫtۖM'ΒӡFw!hV}m+ڥ/?oaKOwE1aR|M$ƑiVI貲bDgXŇϞ&tuuE,`bbRVVFcl6 :1 N<==]haaTߡ[UkazQo3$I.Xd]B~&j֬ )Aq2}};o^zaؾ[O8#K=Kv䈐M[5ж;W- H:0ׯӯ݈ٴq}{7c0{v'꼡VM-OSv3(R&$T$HEDL*J1A<\JKKM֌WiӦEDDty`PEOS=KN>&_xwzQw gUPPXZ$N=w0l1tؑ$)&*1Kc L4[hyێ3g}g^{#Q_dgm,S ܏fT80LuZqׯ$"L L4oo]]݁߿?<< C3(c„ 7n|Eddd}611q<==̙3l6qXrzTc} w*w92j߁" y,(VSq8%{K9KѶ!4I+099:6~\o m;X1(X:tܫAn9ϳl̝mv ك;#WWWmm͛77\777y˫v {ꥭmؽڇ_fM>}ílll|}}mllIŸfenU^QUGXaa/_9sf;550g 9dN..cORf==aCF?ps#K+9K Hk@=LJVS_dbj%%y; 9eEӦƠ(֝Cˇk;vn`6мG;9:߳kǞ];tR­)Vްn͆ukt 5d𠗩tz AP0 %@CFkD\YY  " J* rߘH$0ܹsΝ݊8ACQT R|׊wd2٫GWN'p0JKrH'II"}7E(vV~w#1mqH(dR]m&>/.-)!Iŀ@!~{J Pm`b2w3:XhUUUacm9ξ\"pjVf~\ǁn#4"*Zfifdnb@QEQ d2 =mg+-Ԁ Ä lD+ګ0Ԇ!4[}Ьlog'Hݺvi&&;J˟ŋtp UՎ^jG %TQ߬]zͺ"%I/Sa~ޑ_cS>n_[decۼ}Q H)y 1mS +;{ !Æzǽ~#q2r–zWZ1~X_2u- /g=vB]C][K뇽yפxkTLiii׀$*uM-uu "(hAm?N߰=۳k0!4P ؜wπ*--n: ncc}ԉoK;v97M6yWsϝf݆I e[x72`9;>?H" 8~r ;1NK{РA?N_r IFܺzP*zyy ڻQ*0gci\]P H)s qC{l(Ç5[Q.EPP[(;z |p9G۫4544~?yzIC2xjNR E%I"p sC9QV?SU2x곔ff(kHl.BAHL9\+bOtq׎m~>=߆IAORԖ8r;%bAQdNZZZ>\(" $`)_@hWIq1/pٓ" &~m[(fdYXogܞ?"^ٵGϘXii}3OoGQ$QZZ2f܄N]u~y6GK.<4"={wܵǏ[ԠZ\䶗.{0 Þ0xI7cF$iaa޿oPt ÆF$Ӧ2xt$jm8Afk%TOOoifΒoߺ9|aR^$I76+;[__۷}8~&_|>/ vn?)?|zQp5W$A:ADyNu3Ycuk6[CCgkhhp{egٵcϮt:)ǩ,JC($&^ ͛7ݽw\;wx=zPkpamIay謆{Z./? ta!!臫`& |=]\UZZ!Ed2>CQTvvvdee+ߏd?;?ɏ[ZCAtHJ 2bHJJOMQxE%VֶcF&F2L&I4?ѽ(ޒ#\Zy_/q-ɉIab0_2iўbqgg N:aT*u/{5MNtoGQV99v1,?/O$Y=俆5kW2}IA?7|V\zQء$InٴqaRw/_NuVv6PŭgNaokaBAGQTrQʃbJDP2 JH %m(%2 '0o K${>fgϟ}cgcO vVFF,&SMG/A$ctg挩3gLqP)E -oܹmm鷷oݠ7:^Kq_]]ߏVbgk+?[÷o W,! MB T!1"J f )3bX %*XS( ޽`ϰo߾}oDh")d2I$pԒIQf08Ν0aT"񲴰dL&S&$p xIh{8Un (L@V@ &"PI@$HԤ"B.@1``4}y_*ALRMMM.H"I:lVz#É^H{6~HOllba2Se^3icHK}hڕ+~n:z(\w{H(o/Sg 2fixR>5odeg[;7 'NDf`0ncF/Kؽ6ۿ;?9}w`K²d2|p Cg/2 Pߨb0FGwV\\||\||\7oݼsf䕫]Rd䕫W]{V۷LUxr9oKJ".=}oP?K + SGfOc\ށ} L, 8}\EL>vC T{Nb>56m޲CY"!J{~9w9\ L,ϛqK8qח&z݆|zaɤB|9j~/]Qeeg7M-0̵gN*Tl& p fpYCGSϔߗ[PLs;9g~}YAwt))++5IoY.]AA䃶uێ ѣ}=]zwfΘu*6!1߾YٽK\ފx2c#Cߊd }ٳflܼ+*-{*a^bMxἍNvd2)KOA&{hҨfk)5$ɢҊ?|r?%9a`'IRm͹  :>As[m Iۼ|HH3bxEAQQ$&%תkwmߖK?|5[6mLMIGq݆pgO\·H?XR z$YVY}޽O<{;s?uuVTt ! ȇcXzzzM+@CCvbX,NOpw/]PҷYك99Æ )' bv(XZZ_XE>.AE7bbR_&?I&prٲyojy?#! Hah`xe%@Nt;ᎍ x'Р[׮FF*]/s8lC__F>akhhAͼXLDn=\_1R$?zT ݛ7(P__zAOnݯ\FtL@o:={߽w?07{뫸LIR(7jiia.aPQQ!/lldt1{w޻"¯)ց/忻q={WS=*[`EmdgJL A^b{kϜ=tbg=K%ҫn ++KbbnL&v=.]7ߊ" >y HҥW8AH$V?[\AAaYIqz(+t0oޒKuB=L 'ja|eO^zzrȅg\\'/?g=->5no~ۧ@333Ɲ۷,Y!ݺtDۺ94^Mlm,<=xi,j?招 MZoq:=#ݺ٩v*0QEARSScX>jo*r=zP \@ h=#GLIIQ 'hQcG뻽.^{ן}i'GGzM2xd:dB:1f#G0/^huXW/w~;Z*,}ۺR s/^eiihѳVeAӦM8qb~ttt*++b1 )Y^($I;;Z8u|Q.E(<_AaA$9y㿟7b<ϟs8Sr\q 'CrԕU07}+F%N~0lX$60ɥɏLi_'Zj3g]co0$)322uaÈ:Zz_?ޔT,Y$9ȡT*oFShhOVVVFFZn64`ŊsIOO_~=G?~FFƆ f̘˗/ʺye[x\A}1UEKv7!.\o-5p֪Dߍ0L&@IOg2e tҸiVduuV+ɺt"ax"0y慆a6zhe\[tt4??<|!7nСpڵx jqAȔ =2t50x{[61+OӳrrfZ|}8NZҷb[pĤ._{"""v- #'f555d@ee1ceBؒ" ґ)}WR) r.> A?#}S0chݻw@(71A<޻VKKKWSmYf>P"&^L0GWWw'СCcƌiF=rR.]q1Laɓ',Xp#Gl۶M"}-9. f>M@>HD"Ng_9ciص~~~#w9W^;6o<y:K*ɔ;v'OH.X[nw8p۷O8?jii:u ;g$Nrw  H[**,h&  0IRL*iaV:\^=BF\\\j亸WbZqM&;;;:B>>Ϟ=۷/ܸqcݺu/_9撬7 v_*)8~ Ilg{¿+}r |Ǐ111NNNF P(T,Ou  HG}?r *,,,,,rbhhkW  mJ=Ljjj:::VVVt裩kW  mGٕ)b455 ͕aQ^V# degY5eҲ;܉[6t#G+n9G.mamFj= jg1 555 mmmmmm 555|y%  *a޻ޝԧlWYK?ZH0lӖ*]L:|ğ[qa՞3c3e AA>t3MMY=ܽYnPPP8a4w/_o lN]/ի4(:#?ϋըgUU>}#G٧Rѣ? 67//cGJy~}}o+ՔmmLkPmLK[W62l*{(q\"B~BD"q\q t9l:]ZZ0/OgOgD#»N  ]qi?HZ|uhhjbba.%GX,VVVffq1LMM3g40$AAO:d0ÆϿtd2zaؼ(^i`ߎ[Q.EPP[ȍ;zRztL,aڔ+YpBw; NooZCjƴEu.aq\ Џuqq޽~:jԨ'N>}8+S-Ҁ/E(~XdFDw}$6[]]*y<Go722*6 BxUUg͡k{^UUb=rn=?ffhZP@Tg)"(O \ <7`iJ>TD/T\\, 9Рl6Ntԩ  e^\r;fnGF&k!AUUtT^^nbl D"---@FF#ή ]_vϮ{vI 7[a::s:A(Slߞ]7J߁[H80+zڂ<᜔"r&MJIIʢ$''O4lԨQNNN]t9{,p\;;ŋx.]*rHNNvwwwuuuuu7~wޝ:urss{4|\%  __3y҄nȧ0T"DB_U]Uɫ((+)+)*)*(*{_G ҷ@]W((tK8wQË;ԩSӧO3FOOovvvYYY7o\lY~~>=zᤥ)=lŊsIOO_~%+Ο??##cÆ 3fAOm;Fg==n Zk׮cV}G~ ISLIIIQٳgSN]_uppptt4`6zt3DGG7Ç'Nq=y5 |껗߾~:b06 i=5KKƬ?E+WHJJz S^u1+訨$$$=C7or7SD4"tRuu={K.]$rH$_}UNNby6X,V~Tx.]8vL&0L__ɓpaÆ1:z(\^l,K۽zoq?z10Pɟ\BBB߾J^z?.ڛ)*#00/UTT̙3ŋ$IN:u\.G JKKzȑ#QScǎG#)`ѢE.\pppؽ{wXX۷CCCʴ~W__߆ۨ}#߈ܻw{i}?HA#I{~9w9\Do ǹs疮ZcI;I$I?{l޹'LL2tng78lkuc^;pzݴ]ԀJFFF.]R"ZX,VRRN!)өt޽{A '$wLkL{&xޛ߯ol9;;'gz8YޡA =~ Ե{2`(  qƐ!C[1`Nms3gefj pgX,ń  Bko,)i`ULAb@`eeݿDX\ 奣  1S  -ab| FV&#K쬬!_^V>G;ߒcX111 ,I0ВOjcaiYYQ!-+++,ft>ReޣKyyRr޽z9tojfޭ{P <]]$I`0䧏D]>btiIÇiP;ߒаTS@Zߗ#k/&GQI^iFCC)nH$tZ]]\~tʪvN%Eotљ*3_pJKJ@ҀޒWWA~kT@E$% H[z|cG~mt hkI$ <]SCSqcH$/ihdT~ MMK-Y뽫GSWYI m'RCn`+żEV6 A^DH5*+LLʹnZ]UIWWc`h0"[SKNhhjX\]]-|vvDDNvVS4ɻ0?ьֳoϮIgA) (j"؛;v}WVVNQTή7mޭ+dfeyFO-Di^m_0{z2̴W/ܔd[;?}xʳd]u'ȸΩm99.\u55:wV[^VFoڭ{.])|<000)z[u(?N83]}کJ6~ޭgv_|#m~XӼ!ʋ]dgO@dԕa#F߼@?!DIΏOJFkss N!GIOɦsyׯFyo%$U+~)(733wp,++}a<~feo O#w/_f'?}hW/_t=o?/Cj%'QuJϘ> D$y.sAc1 [̖'ڠ. iTm[7Irý;xGo>&&{վE:Ojs'vګ^67]ߏ^vxR5cx{?zێ4&ӧN]sT 'vɏ5xЀH"33ۗ_Y Y~+K tӣ"/1° קסKJJ-Zp̹v:ea/:~/O:+#OIM:xƐC/X廽?#׶CFYY?)6~od~- WK'W0L DT@1`z?D&!)R~,?yzذ!$I*ng/ԧ2 _$I~9o +))1tſ/߰i eee7nᦙ]v=Uw:v (tKiHyE߉qyEEQ@QTk_}-d?'GԔztYNNv>}%IګmruܒvHR&R}=S@qyJ BD'`10Q,'A[LIq8짏[\x_)xH7,KWW.idhXV^Nb#-m-+8;ٽϯN 0!{䕫3OovFAt`0b_녿ۼlǦ"tA>ŅQ!`R~@Q=T}nΗQ<Ś:eґc'n{5O'/<O__JLL뤋i/Oӿd:4w[RWFFo\ռ]]}zytC <٩=ۊ 24JG7c{tF.\˰X,'"<կoСYJ ~9ۈaޝ5qq@KmxТ(XZ\.jV Z-U<zUҪ]UA+*Yȑd1B #7̛D'ϼyGҖ.ےL֤ YJX @]_fϋjw}۹sgZ~%V]]\fL>cbcdn!@c;S;l!=veä )_T*KKiS 1sN!YO;z׎+9ii3>}W_ZٳfeWHcg.]z{L*53rYa²T?pf gmV?'Sݞ&hݗ&&/O[C ![ǿ1W&^獲oeIg]Tj9qcŲuwٶ%NU^^ADk\Zů:I&3keaa"-B<$aZ| ˆ@9ra0-YhS ]Ͱd0~ll~æ̙kΎݒwegnCsgN&y˿ٲ+abޟ6C{y^dW..Nq_|~瞔b]x|b@ R*r^~eQY5|2_ۙGNn#&"\޶Yg|Żow$x}A9QKs&艃G?KuLϧ:y`cZ#w`Q Ӧm-l:8;= \L ! [Og_nν),`ڹ˞`"rqrlʜ&6XQN8K+IDAT2Q#z_˺To>J%q{_)7^MO#NM=:wEk󈖈(!,fԱ=ܼudǞWa,Ȧ][mN˿=D|=̤R%bcCxtsk?kn.;~0)tҜH$Wb1cӮ8wy<7+B|X^AIi6V%egx(~2\P=O/=劥+ yR_pf y2qNNN\}OИXT2~ײ#K=yO>D!ƚ2^_Ֆ&/0z oK~鮽K37|条z>222~Ʌ6ro*HD\kFf~Aטw&Φ][uWo"ʪνy.D=Qz{WUɕJΣ q+ TQQ)(4gʔJe{DTZZZUU%|+1q ;/_y5}z/>s~wG{\5KzX^>i,B1h/DD*~P"ݷ,;_fcb̩aO{<|qԬ NnmiO}PRZVVU~vmZ[C:w rӲEs`JV}V-6{P۟ok䰷N1 #?qrȷ<չKw̤2Yņj}_k;=a*++9s+8N?.\0pnݺuUϣhw G/N׿FSԂq6VWww] UBv^6h, WEs\ܺm"9LR)@9+'?yCGWAfXL]q՚NNNAAABo.we/^Գ%"+VPexwob9L q3%J333333o޼4eaI333\B,7irMcQR|^ ab4&GM&M&MQVV%+:;;wܹsr垞vvv۷o׳aÆݹsG\\\ o߾s]\\\]]'LPZZeool2///;;$1Ճ7g@b"*.t&RP( ݝG i6)sB+Z[AA9sΜ9sʕ\.tڵk {́:lܸX1$$O>׮]H$}mŋk֬1 i_1,oė5nܸ7 0) |d2ss󄄄,H4qD"ͭ9QZ.{xxQ^^^6mN:%p0DTRRw^"!!!SNUT^^^qM!WfJ%[)-Y߉ٙɠJ+>8/66VWO++'NvuʕvvvD$sM,WĆ1#G|ߗH$쩍Maa!?"ݙKw=+FhL5;9LD*322XfSFF 01'}{K. 9v옐HD&&&'N׳ڵkq\qq1 lmm(rxy;nn;{֮_Iף&iI|%{ufbsƯ^ڭ[7~*ٳg,Xߚlڴ^$Lmڴ={vYkd2Ւ}Jiƍvnoo߷o_{{V8|Mju@@ rrr1}whǎϾkȠ /]0@11w^Z!! ?zM%977JM-Zh+X,^jժU4񛻹i6cT{Ӭ/QJJ>"M5Djjr+- 9!DOtv# [D/8z"=0=0kizunغ*#@sƢ: $Nyu\:?DZLNnI`I$=x^kQVUUX,6e2"SN ***Ν;nbb"Hl`*m_U2s7kkĜ?sW>|P`5Qg0I$4#pww 23r`R;3aJk}S~ ^Kfny8C1dI"*:?-Xlbbbeeecccaa!(͆\Ϲ#hjd,[[k?څfeʊ'΀ amժUUUq򏺈D"Dbfffaaʊ1Saݖ4OiTԳ50`Z}0dI,ZZZ9LjZHb&FQ,KD i D[\oݮ}z]5M ?څfO+-.7;`ub1 mT-HYIek|Y{/v]OC&M [0A}ܻ6v05ELO~^w[Ր&Zwt=TTTR>#ooo T*d+g5 sK[Y۵97ZOGg0qwq#FhVE"k [n1cƮ]lll0@h9ٚQ\1dIT>\.#JVH$""ѣGZZZaau_s˻g\Lqwۙݳq <{coUgKoV+**RRRǎ3^*H***DMvv#U l-]iw"C4ȷjuT\;b+H%iìM'M?i~zYpϰhʼ{B0`t8C/N{zD|vx ;tt{0M&: `&: `N)&'X؝=uBc,ZJLմFK ь0 ?8BP;ZʩT*B-hT0@ +Z0!-häR!-h&&hFKD!-h&d-aP£%-SDKuxhEtLc 9udtbLޔHjuuHdfPVцe1}H#( I2Ljs#A"R#bF`뤠0s׶es2͚SUNU|(k۲Z3-e\@%?Po=1JF"gx3#Hyw` Eh2hMt+Q4Y|!J$IJEx8GqqD*b"Hq8I/pdd1d`1R@|鳈oZ9&22O$s#*bđ π$""qS/$<Q^+-$Zr(n%YR~E""Gq*"D"8I8IJn #2t$[)U:GEX>i*r3<:ꏓ{{Ƴ?0_O7sԹdygĘnhס#"b*5"+}jP"xWqT$L%M>11w)crV$IiUBh2DDlrswgHD *U,)ktN+g=999YT~9*ΤjQ3;/6wOl!ī9yDvhs:EnzgA%v>9*pסV8C=88NQ%Ӵ|hbG$14%Ib*x^Qw~g|, EQ #" `AJ4q"dӬsiJyE5gײˊSPR|ە7sLxvD7t|˒^w^n#al I_yöDD<0%/APcJ>IQ@ogUu6=TM T \P,U5fY<baX(fY<b:tiuO6TZ(iC9+ &~P "Ϊv&̌@Tǎ7?SjW.]櫹*O<\pHgGLo~e4Z:W.]e7W}aA1듏\/((PTw/hᗥ_|u$5klԩS:cO׻o={vKhܤyJJGZƍ Pj4OMzBc$KU?GW5j`4'>qc $"G!+**:y⤟ρoeT[ӗ;"~;nh5D&D4z#H.j_} jqC|Eh6a?33O7jⳙG6lle^TLl.]&TiEDn~19ˍ>|(}VmZ ۰a]O$O?k~_ᑱ8$qǎd II9rmݲUGnj:st} k6:_Pm*9dLdKYǝs5C~u!!'j+'_xIb׽٧OxM߳c矾$ILjܨё{G|iHvg_c>~߫zׯִS{ɫV$i=w[wb6m=tLL)yͷqvqݚl,.Ł/hTn5_h揮dq]e $IT{.7n$IҨ#$Ijۦ`|h؃~zzcC$O_-ڲ#}%s*t>0M5_>$i-bvNζ;~ZD>ĸ1㟞g7gI;15gqw;CjƤ;RO峹)I8̇G#"˜j $#Fq_%Vnn$y NJfK(zsW'-9kYs7kײefƍoܸ!܈oƍLbZQd/gԱ3wr 2TvOd˹~dzEb5jh~655Ͳ +3yyyz>;'\ ''g3$-ɓz9c,:*rEa?;ooYWLooo"Jlj[:f":˱XO_' Ko,IRͼP#$t}zZ7N),*8W_~|aJ. XKL8nʤG?QQ M&Sf͌F?,3EEEOьO,M~M]n]̛䉯¯8-:lu0S$zW]WZZMکu⃂FGEjˏKߙֳ/+IҰ &_ $IV_t)6hEK"~~O<>C L{M ~ࡕ$9]ppƍhZ왟SL*_ɼ9^z嵈XXB|䉯{qڍ9}SSSaÆSUu0h4N4쳰e˖B~.^h3gm;.\(3gBBB>𠠠%&Θ1I&Z9p̛Dc92!88~>}zxxxݺu|7uе'''[|Wƍwԩ7x_zv̘1:tHMM=} SN% &|'G9tUݻ޽mo>"ھ}{ϞoS`syM6M&w}7p \tӰaC_v7%%eܹo6O2eϞ='N6mZRRRyb(xbIII3gO?ݬY#%f2??,ׯ0auydEEE&)44TE {yzzkD$yZnz[ly0!!aqqqDh"VM&SAAAzvڰ0" 0LN""_hmwlo}&&&㸻`53ś#7mtڵ۶m ,8a„֭[wyz,hѢ7o޼e˖uYf=S111m۶-wwΝ;QΝ>,{ؐ~p׬YɓbbbZli+W䝽{ f͚j8qGm`sdPb΂ה'{]e18KIIݻ7HX#df\ŪOfM'y'D 8pDԾ}{DNGʹiƍ7c ___BO],s1'"\sX 2 x,@>i[IָqܹsT1jP UUdiii}*1X @y\Z{d:ng@@ٰrV};vV/-u@qpeXfd>lnݲ >YZ*JOV0 V}R> @Gu>ltxc)5 ,@>iyV}*DuVO*}6qpk5k'5Y马E\a(P6_SV}y/" E,^V#V}*krrpY|X՚>Ul''-JO\a(PXªOe"G2/ {`#V}P,\<8 x,@Tvlwl~ЇbW}8nܸqwnuwKW2 }'aaaNۺuky!D|fUǶXUv-2]v9;˹T޽7o,޽}˖-Ý;wuE=epxڷovZabbJd^d)>99'04y޽{ߵ7h 22|S0ؓ5*:hɟ>|*ʯ:l0S{*ԑY.]._|y"ڼy>WKNNݻ]yggϞ}Ἴȑ#WitW+V޽;0֬YS/nV\RNnUC XªOp$baX(fUn3*cuv YOJp|μ66脖}A&FJTϾfƣ`UOhHmEW 8m AƐ r/_:/ q w5 8f^>!ϟsҠ5k>>~<;oD԰Q^}=}BFzRTXp.>{_GĽ:yhuG=ղpnY{˺ce[|0ktqrQ_;6No2\РaSJxڿ/iDԩ|}|Υ&"7}R!1nԤűD}BjF5j 6h$';ˌI/ iФFƵ|y%"h(&hEQ4DoªNH$"R4ׯP{U׵%/?!+֥iDtRZ] .?kYh0 T/>h4 /(DTP%Ysxj_R*iP9d5n…;R|AA^vvf-y6ܼ\:Lh0ssi۴""A{(I<ϫTje+]~s>^hUn]{ smY۳GF?}#yG0"ڱsWPݺqqnjIYh4N~}:2zS1 |g(HK\@az/˽۲e븱-_$?LNN٣ӧ#bbsnцC$* 7?s>O>1v7o_%7?=᯿h4o>e&,bmҊMj:]HC!TJ~h1IFDR ˼oy\a:ursK9yA._"IRm=zt}G{wm3|ŗ?|}:||ՉS<窕L|⥯h4Gj5o5m{Ɣx}kjW3XtgNT j:w)yKn^NEuJ޺5;'#ݺ$H%8ڧW/I D$IJOOOMK߷$I!$i 'IRPP]߸܎Zqv 3u$0xR 5Rx"$'@{Qnf)kn]l q\|\֭}۴ns-"&IRfVFhԒ$yyz$IYFH@%т Q~^~DD܎^:iYsfΚӼYO>SǎR*cם=})sѽۂ4i8!.1t֍1f`0ڌ7AӻƢ"Fc>HD~+OlԨ,iTltT% /c8뎧 9Z|YӶM¢Ukw$^Pغ w"IZoÆ ֭ IWݰq$I?yx$<Νd88lȼ|Jq\mP]Ix}+_M7]6nܶMq;iKND3>|W'~ {JyWgio=Kѱ$ {(FGEj7jԾcVjug~UR_\M%S$J慖LY\@r1&L~DD&aK٣C*)ߗ㸿[==ݗ,Zhn_>ze}##mg$*/)^DHDz,\J{t}z|tȵoWJ4bUzo2 x L|}_y{{Z>F#p5IG]!C8||S:wz|%°ytf/]vldzjZZLl\fMd"LzYӦwܕ(O / 5#/$HJ\aEEE{ݿg{:{~SˌFw-ِLV۽cѽk;ITΒP9,'HڽCCl߼8==#777< 0yMs_\KxF8gsssۄGW nXPP@D5ivn߁DtG3jD8-ݬNtK_z}zO}}|sOOKD11ї/_|f7nL;w>DȈZY$IжMr FcL^PW)Op5L񾾾D9XOO.јթS9vmzϾ WTj8$nef %qfB|23M={>}AH}///+ݬ?;1k}g'^ :2iU>cb11fsrr4N#@lV;i?HZjLV{^^^yd%{9ܹ _ҥCC{cʤSVa?__Q7noؠA^^͛;D7n ;w%rGGE.Y4ҊUݻu<̳/|^7Mn޼Y*xqNF1??rss===2HDԸ1 s9JDI*ѭk-XHD(.fQ[ull"j٢oYQRD~0>?:""8$IY/2L&SEQ\OFh4N``ݺu7''Ͽ&v5eI??Ib00;lܴG~aE<4bpvDljDt+M8B5n%rY~Cãڷj1tΦsvhf+͉}W!o?DQҪ5 I޸I r1h45ьO?=aݚ$Dih4N}k1:{p%z^|_k[>ܻKnj^n$I<_ÿ2\ ߉hGll":VQw Cƍ?2MXTDL/Zj;{]_؝ 8nAk)5":}L"cb;w9xb6GdeeE^tIwwkGDǍ7 {[taۄE ӹD9EFߵǡGteelj}^ymҀAC~=1kxTН{?H*/;;;Ѿ{YЯmcXVVVƍ5}167BBO9zLt21vz[g~|Tc `a\]cfM9Wb6G`9=!뗿_;;fbӻ^o9n㟞u<`ʡ}{oM7yCv>yҚ2izzzkW`eko>G+N;v(ʓ[T*7o!>{s6b׫׭kMHQ vmۦg^T`l1}v5Eq9Sy!ܺf1rffܿll߱ OnN-nɥ˗3u$*c\ mkx:\t٪ \WV~(޼y|zzz``o7Gu߯\t23jNeq'E9G@ޯPJ ̹nU!#`bq㆟u%}y ^^^??7n^_|>͚NcmR#wFjz0XYsEQn۩R8Y)yxxDEFZ2\n}]}јsrs<=o54OMMa;^ק5w*lu-;;`0zxx05i@έt6X+V[-?C??_Q(ƍ"Zd`żJ++Oe3ϮIZ1É'{* j*{ͩ}UK/>'?8nU?׭d`>?iff&ѵ_"bbߞ_/XibBۄ8x^v*z_ִ;n߾cݚ$??_29t\@O2)2"I1wz_̚I%Q~b\Nq߯o-~! 'hX[gPXPurhrsq1o\ F W]KF Q/ DԤy{3>$ uv$w= 섁 b0(d@f{ 8C}%X Kxaعgnr-;H*?5Hu+S^Vq(I,^Q$Q2ΎڙLe#XBWQ2MgGQ켸1%xEDd/nF#`8ŋX0`_/2tvkW0ppmɾA'S}HXh~JNף׮YQTש[S';u~voKmj߭)9_ݓAwvը e0|.^$&M B) C)IDAT@j ek=?/I4%)^,@ix"zWDOJJ9s&fϟ?p-@>QDRnPLJp%RƮ^|F(PJ[Qc^LIENDB`PK':c6-Pictures/10000000000000630000002F91781176.pngPNG  IHDRc/xIDATxZY(]K"{1qaV )Y"[2qwa\( RJI B2ɒ9}o,ό=s;E" |112rG )ZpLтcS-8hFxxPػl566Y_]] )2irre@kk@ Y,cؘMeeeޘA(2FEF#FwQ1Eڧ~CiƧ8py>eZPFƦrgiii[[[ҍ̫k{{{hh2%&&&"H__(WǗǦBvvvHHK}L hnn.XOOOM|N7 BBB&,G X^^><< VWWK+::,d&&8ёx3P|OLL#"":;;ཨ(<<-XHhoo^a66}ww󶶶fq///KKK:A. 122SSST-11,ب)ccc&(#]PP\]]sDG'NNN,,,uttbbbYBnnnh|}}}zzP3 O|Q$''#Έ4E!2 (4+^;O2҇/cURR)-hՕ𑼼<;;;:FA&tFFF777, Q@賵)[ʋ\|axq u bppNy,Ddd7$ήl O'ypppvvk>ɀA'OM#[4$=??B\\\TTTff&ZȘ2˔J-2)))8ara2Ғ 8Brʂʘ$/u100 2BKK |:,,C:6ٙyD5'''b(dxq9*\K^'0==-#K#k'بn{VEFcrT9FSPh/hldcJ xA-i)`,6|>讴*S}/ Q[knWZXL3JSt^.h1E )Z wx3YIENDB`PK':!DD-Pictures/100000000000008900000030F833F6CF.pngPNG  IHDR0?FPLTE矝ܥ222&&&000YYY"""###www!!!kkkeee>>> ֫BBBԤIII===rrr___777'''ZZZj,tIME  .)^9tEXtSoftwareXPaint 2.7.8.1=bMIDATX[S@x"St@Q;x*i; 0v׻;BDDq\ڞpe{ DLK6?(tXr`+UUJlg&PۍfK H%]I\C>$=cb8"v, ?ǩRp__7ww}ǧ|UJwc+$G3%Y왱dltZ:$&p<|qhZIENDB`PK':{W??-Pictures/100000000000014700000137C92DA7D3.pngPNG  IHDRG7 tIME ,9=#tEXtSoftwareXPaint 2.7.8.1=bM IDATxy\TUǿ BF" BᒩkfO˯z7\}4r Es)E$R}`fqzΰ8|޳~ι;s^QFMILLO t}}Z)ÇdUh|0 ߟ 0uTDX=qāmmm{}O>._^ -Z:u#+V&j͛7 KRD"h4vvv4䥗^"ѣMz?(Ç'dff^: `ܹ+W??ŋ<800𫯾"FL9''>AAAΝ;{yyhbر(dBFY|*t;+ @RFI3fL&S*#F ח[T>}N:UQQAi׮j߾}EEűcƍVFYBSƮ]Çţtپ}k;w^~2:uϧiY(ؼysfffDDKKKg͚%H*tK%@WPVVp711eY//!C={600{.]Ә@Srh^ѣGZ񎎎'N]`W#F8|AjjÛ¢"8y$rEggg(r<ؾ}{BQ(]O0ATҐprryfJ\.'Dϝ;w۶m;~= *4+"-..qㆷw``_\~=555//OcM%^`âWq]~;77\]]ܹ#L:zDнMHHHHH`Y111wvqq1o -U@fţtݢsDO#""nܸ޾}ҵkdҵk+J(?r]&˟zL[uN`T%\tiȐ!r666Çx0 4n֍RhӦ0gBHIIϟ4i0D"vhhȑ#Vqcbbru(=qF`` ҿ'77W$Jw*JK\\' KJJ7neYvرǎGzٳJg[0k,J_MT*ռyմ6Ǐ?~ڵk !f?~[lYTTtA988]~~~llBOOOΝ;㸘QFm۶[.=ztС+VԺ8p`xx7F! ɓ'sf͚[JrFvرhѢC:ẗ́ɓ'ԩSn 𫆿;v,q~!C~Dz2OOO(a.\O:^?~YY7|S.3d3^^^'/L߿EL;r۷osGO $$񑑑ZpZrrR,((7~!!!ɓYtwLZ}ZHYBٳg_K,^iZnݽ{*+++**4U+y|7RSS+***h(o}JJOO_zm- AAAAAAf@ttNjL|…#yV[,_S(GJ4꣏>qFeeÇ?S!\"Q"o۷JeRR>zHRedd|g!ߕ/-# Eg^z3gBBBᵶ^ -|_o-[6@ALҕ | w_֭ X#V=z}􉊊 ){WzF G0ڗ&]ݏ9}>ʤ~ɓ''M514s75RALksCC%顸|IV}ܹ f>߄a_AF?v5%7;[zwҥY,ASm^+p?Zo+<\ vvP*33ܸ~폫W߻4p@77~'Z{շOg; y:'JjCKѺN -v PT۷o:)EYYY>XiwRvjժC[{ӔS9&99yC_YɹܥM0L]9PXTd?E_ sh9jU歝vE LFj ƖeY_2?/o_;{v޼yݻwt]L&ajzxa@aXFh4jjFDՈ8e` p*A""aaì"0 !j`aZ ˀ0 j`*q^F"+aQ*`@ *iu@4`؋7(Z^{&9柏sU-C#@_i5nv[oM·e`Z" ^0pꂚ3SjaaYRY\RZVe|Hee% f)ʖZY܌_;j`Ԅ `/a 0*5 2QAME0PbMu2iX@T0Luv[lYz8XHTr! 0CՏJՠ&^5:[fhh%qûG7a]*n쎭Z]8]i9P|W-+p)V1ՕAɚ`Ѻc`YJGh:+!tjKe8PRRlXa^cq aY`eU+H#aXBWiL끪pz#/|Zð c^7)Uc\ ?tnh`-M[{@]ݵ k= Usu ZW h?CeYty.J@Z }BhWm9"e 2G+5 ! ˲ P#1+^CeaZ5J:FRR}sd0y21Zzk K0<2vjZ# ۻm˹HXjyjT_/Vʪ? KatJRCFRv2RV)Si4#`+a%}uԜTl'ckFHiLQ D Pz,ݡŇ8T-ʼnL :h[mPvJ3=ՇʪnjZ88Da}>~UWVV^xamm/޵J,>ȯLH! ؖ66ta\V9{VT`ж\JY[#x2Ld#c\Tk@2-de wNTs,$-;P.Wӝvv+vB[_^=%]WVT^:X5[u!XՆMχ~-Ѽ2aĉa;V1Lv۳~ r&@iy9VD%*іupƵ=ct,L&`+XO2GѫUZ^]iԸp3/|q@@uÇN=ҹsg/ϟS x!$OOEÇ<QB/K˼\z#͓z':;U=mS ^[z_pʮݺ͝SK{ך~nshkW歝 =j ˰OjZv/ !_=kv+|{T_(LD#H3akiΝXjCP(;w 2#:mo#Rgd<~\ _(M"AR _(MAR _(<$&&6Xhbm A'+rEPI#O] Bi\d2ٯ'O^76-{Ο9A8Ai(T*?2Bi\XYh{K{)]tՃ?mݽۭWM[0xg޻x4cn^ޫSz{}i[,$tdf=>lRo}|fΙ[RR"ׄSݽ |q|nB]qZ^Uvvvv)63/ZdsSJUV}ԓݻz)eRL&alll$ _{}Z?p"lmm @"89 En^_xqIMUJ'''>\o%dPZZjr;|s5҅vb x02 CWKJ . ž=;;<,v.hZQm:88TV***lmmrERZhQRRҲcRݷRi˗sߺx~@ [uN`^MJE._:+j&Ncz9_ӶPQQ΂32Co@|Fmm_C&0 GG|}"ReRZQ*zU%%_jR ~ ҤL2ёnjꝷ2t]=L/U+nܼ׿ g6϶o`1ɗ?E Vd!/XLw!q{.[+|1S''O?λon$&%˽c~}X?1qA={Nmij Dݻ/ '3B.F͞NC Xx Z5"sxāV Z5XhbmU#V Z5X A BAk} U؆.Pts/yR@_(bmVY5@A} V B1 %C}77X5N1 .  Ԥ{ 1.:q6ZIwBЭ[娗C-I26Ъ@Fk\tۻk׮}IJJœ&MԩSΝ/^"fvB??322r֬Y4|ɒ%ׯ_??`VH}Z /pmcǎ3 ckk;o޼m۶U&ҬA_(C&+tѣtۣGtBûtr-ID=&=>w6Fxu;2_nooo"f}ԅ3g΄ڵgϞRj5---S MT*jt E_ꫯٳg4m۶m۶?7ze>H}ԅ3f 'O6mZ`!RkO>ѣe˖ѐSN~G3gԩ˲'O8qyu"͖D\Q;:tʥEMAtP@_(bmA j6Ъ@Fk]p*:<,*|^m綮m/- 9uU[HVmeYs[-#ͤ@h X A ܹsA} U؆.Pts/yR@_(bm/6Q6Ъ@_(bmA j6Ъ@FkA*+. !<.\H1<AjMsuhh1cX 6*AN՗/_wզM H=jϝ;V VÇ>|V VѪJyfeeV VBFFƈ#83V7*%l ƭ 4O=|kvsht'[E3¸U'%%7ƣ>tphs itb>^7jh؍MPPЌ38`ܪ†?:ŜFcn!δS4+'--eװjD"H4:,>>1 pgnNsh%pW^ySSS333y3jvBHs͡DU>}4!Y8*.,,Db !bxW5*^zzΝkW;էƌL tLݲIK?0afr+M ZyHxIK?JE>DZyu63 U7)ƨ9jcДUԭg/~BRyV]`N;v[mG7;wݹk7-JJJAsxį]<{ k^Lƃ!ӽWߩgiTU?aD-}3nׯ&|QKe7ٰn sxoz([._s>}_Mzw]NVmVL9S"Lw؉ӧBڵ{jAO T#ib&Fٽ{J5P(;[XMjDa,!=3O#x?xIͽv_$MU>s_o!0 3}_sB2Ryڵ*lIDATٳg8TQQQaVV 1ɮne)a&wBBֆ&ɤR沱aYnsU0%C{y;~" )**;jE5K$VZ4 "77BR G U*^^^O?4۰aÜ9sRRR_b^։ #ԜrV(Y>AZ]d"Ys>߯ |1ҢEr6'7lZh ;'MgmAnZX/rɍ7X###W^iӦ~:*^zleE[{~F^QQV=th4bwT*Jզ϶?vhJGG!}hFـJƍGȑ#fg6^ ח7&_ݯ_K/oٲ;w"##;6bĈN:7l̒fީTOSZR{v\H.F͞NCXHHH wdP((`¹*0w?7/?8111rڵkJ2((Ȍ-RBzz˓srr`֭˖-+**JII1Tpj*h9Jy G]h~ʢ\\\>'jJ4ZZu"'V,4U3jU3:kƨ/!cC-щ?/[E3l0F61hu--(Zq4,A*=z4}|… yq 3f p&W Hݩq_}{YYYYYYmڴijQF5BF+5z!Z5X _#jxFhb%ddd18jyRHHHHHH0~.--m54ƭ:)) R"""[uqqqXXXhB>~jXD"H$J u5rssaթ҄ HP5~i___~7ZbTYuaaabby  [(bmU#V Z5XhbmP?LT^vm4N*FGGgddTTTU$ @J'9r$44TTzyy=4nÆ s̉JII ~my"b"R'Oћ6mjyR`y ƍsss#ziggw3CÇ'''3BAj AAAr< 77w2 "R;?8111rڵkJ2((Ȍ-Ҡ3f8p ==m999ue˖[* &('=ztѢE4+++rqq̫AaLL 8:ujL=Ԏ;مp٨i1 Z5XhbmU#V FU=BypBR!RkjCCCnj/\U!Rwj|wڴiԢx_ kV VkCjxFhb%~ЪJI&Ň򤐐`\]ZZji([uRRRqqqHA>EDDⰰ&Є H}հjD"HtS70A۷_y77Vn.M4UsOJATYuaaabby  [(bmU#aUk4FՁ H}ZVq\AZVj`8s5PVVT*]6{l'J322***\ B‘#GBCCJO?M6l0gΜ!!fR q8ZO?ɓ41222::zӦM0hXsHE$8ྚ0n8777>gϞvvvGrZ(O&&F.;99]vMTM-A14cƌ-_<999''nݺlٲ|^ BWWׂG.Zƽ{eeeQQQ... WEI- 1ʘ_Kޟ:9q R_~iU^|cAj0 a";  >YoN=  =BypBRMǎͧ MP.{ +cʕZ[v*g \. U>|x4ڇ9p"C Zqkw5UK$~*Ç+WdGP&H{_nJ8n$6 r aļ|{ݬ6m4Teuf۶mFZjեKaRnݺTh9єh4 .m>SFʕ+[cywN> \pɕa(@𤤤򼼼;w:;;@XXŋ o߮5V dyjrڵYYY \nݺ5c vAxo1ܹsJʕ+ݻw7E&}1ܵkmo/T"އz,DЅU߀VmccyfazaD"h4vvv4䥗^"CvBHXX˲iiiǏ6l؝;wѱ|ٲe|Ν;^JhoL24 CMi( Z=sLKO4{{C?NP?˲[ dҥ ܺu=::ĉ[lנ~=zYQ.^H7222hFq\7w.H.]DwϞ=Gչ7Dy5k6mwܹsiiGxxxVk>Dϟ-FVM/=znoo8qD__ a]C.YZl %%%@?)Ӌ#gMQJ%ݠ7ND\& GGG(..EEE|Tz(˖-صkL6￯xS??χgE|`X \ƭZ<~;77 quu={B뒥 N_mV\#MuVh7 !.PM/_5c'CzܹsQ/&LТE7J```^bbb~&DX [5+` oRRR3 H@G:-,wOO˗/͞=[PL:U\# ~zyyy= C0dHTׯ_h4&0ix,KwZ`CRSSZM֝Pm {P,D̖lْ>4hgggP(Ӆs8.&&&00pԨQ۶m%%%G:t+233Y"""~ƍ$u;vIT*q¼z g}W^MyFAH]"s"2D ...;v4zEfb#88ĉӧO_x1!СCF*M<Ã릏M6mZnn2ڇՉ !`BFym!3GFFj^KNNV*qqq-$$$==NOrG>}AeeOQYH]"V-"Cɔk׮UTTh=4Bϫ\Bh=moWW׍7޾}[RBrrr*4Txԗ_~ihL蓒ϟ{VסC>DX \5ԩCM˲?s^^ތ3ڴiӲevڙ[T3B*BB(--}|1LL2"qpCvڵ B})i,pu!LWB߻ LNN[ '''^z5| L&֭69D/ħ'ѪiJ]&\dM2AAyi,ue̙)))>w $%%i}7n߾T*[jG!H3¢.333,,LolDD}[WqG}O?i3GFEYԩShggw_߳gݖH$7|#NKĒaC4^\\\ii;#,_LKK+))ꫯ Ӽ{ޱcGQQQqq hTDD}ݻZ 2cTT-뭷~+W! {߾}tW߿_kݻwLyĂC4_~Νǭ[nǎEc޽;nܸiӦiק|ɐ!CBCC.] 3g8n͚5 ?~EEūj4;;Yf9''SxeѿB}:u*qZ6m4D#H`낈 j =z'xzz FFF\7oNKK _|.l/>Lx՛Kݛ2`Voܸ AAAΝ;{yyhbرaٳgk4d % @JKKD~C֌wvwwweh;wիM6Vs^zieT!]3L ܹW\G!ZkyrssYmnF'֐qP|=^~-[>BH׮]ix׮]߿ϻ.8;;k4-mb9<^&uD?_}6D7DJJJ^^KbM]Ux-JŻ>}j &|gyyyIIIƍX;vcǴ͛ČHf̘qt77˗'''֭[-[VTT;5ʢE\>}>@SBq[[wYqJBoӋDpiӦuЁ7r A, h33=k֬{oٲEAW_}())9{ P..>[("պ%CJߩS'BH߾}  Hbkk+hXz51 ff̙W\iVZ w"    ֈ^"^cNS*1{xx\RZP?-sÇY}Xg!2Ġ7N]vz?H$~*Ç+WsMP8*26D"Mf՞ 8ДF;z䶵}Be7._,lVVVVV%,NڶmۨQVZuҥ}nذAT[)ZNo4%… z[=`O?\o5wy')) RZAA \FD,E OJJ*//۹s']bv򂂂۷kC.Y^uZ-ڵk*4& {cĈΝS*W\_>aD` kO~A;[ V+ KB̙#|!pvv.++~SP8p~j&W_}eA4zv֪###9۸qc``1cK2dɒy <888ի|".YRRR'xӳnJG^nRho\z5,,,888--̙3Fe43f_5F={/3Θ1~H71M V>ҳgϦ^lYFFpg@]A4Ъmllrss7o,LcDhxA\BXMKK;~aܹ#8]nRho K|MQ\& 4Z Z߄'o6UtE. e-%FKX U^^^ "66VVO>NP?˲[ dҥ ܺu=::ĉB_HzwR7Fx"Ƞejr޽D"t={,U͛k֬ٴiw}s]4Z.j_уb!2s5U Gi;::N8w/2䒅:]())[ᔞ^ݤMQx I"0B-u ,[c׮]0mڴMa?C~~>Biyݩ'Feܪh.uM quu={BIHH wdG4~N_mV\!&IBCaqlzB.hOGp/0a$00W^111@-YZ^AFsjjWZ g@"Ph44dȑzrr|r^^ٳ p^nRPooD2ZM̯Qׯk4~]²xuZ7,888xzz,XpСTaVu'kۇB a*"e-[0 G* t|ܹs9 5jԶmۼryIIѣGbŊLa߸q#))Fݼysǎ0i$Jq\||0^YիWB^uQuP(Rܡ &Kee;|||<==> :>q/^L9tPFFQJ8nhMunu"Bd2X#G޾}8B#$$񑑑Z-yרc8zN''O,"%22RPGh>\.*4& Ej"Mӏh=4Bϫ\Bh=moWW׍7޾}[RBrrr*4Txԗ_~ihL蓒ϟ{VסC>DX \5ԩCM˲?s^^ތ3ڴiӲevڙ[T3B*BB(--5HuP2eBpe;,[[۵k7+! 0] }:00099YkӫW/dݺucن E"Tשh4%q׮]kϛZ DbU, ^"V Z5XhbmU#V Z5XhbmU#V ZU/5(IENDB`PK':ecE-Pictures/100000000000030D00000169886D88BD.pngPNG  IHDR iQyStIME wtEXtSoftwareXPaint 2.7.8.1=bM IDATxw|\ŵϔ{ժKdY{o1Z$䑗Fz/A^KwӍ޻j-3JZJcg5{gΙ{{\h%H$D"H@$H$D2(tLzuH$D"yPgּ;?G:vn*.v{qxp. BH10}%ST2Le~O5h.'!Du4OZؙ(!A9G8 3#[Le*ST2}o3i|/Hz,Գ֞9^#ɲ tDw8 ؅~V #7;JVvsktﺝ(ST2LN9}wuwp݊P;!RWnF~?oM!qܾ!xvff(W=} fgeut$V%S2-ŜLeR:ܱ~8 ywAU5@S݋ikt}>:'3x.X!q'h|ɘU5t`s.U%HF c#B0-$D:2 > G SGX@0$zzOWU3?!'8xHZzr' V?}S39l۱ys ]Է9ۭ44%'Vc9H$#dEBc9`(T:\E0Gc(<۷;-O$M!a_2DE>(8g8+r0ƒ/>d̉hҸCEQ<`b`tuM>ؼ1G)Ä$93f? :a<9u&~ eJ9M1ƹWD"L !d:CTQ A0faYHѠF[ 0 @( D ak! $} ,~:оR$9$mhꄲc&B\13lN(w,~[D@idr`!#ۮ*@0p Un̲c51_/$sB$H#*G!L"@. f"1F@@`  Db aD , `{} Bԉ8 )D2<3' ߻&S~R; $ pF@k-d9 "( $" wH5ra@1^a`0``0Qyr LeAJ7=rl=Ν6|c}x@>=>ߠ͌t !G"Bio|Ҩ{޸| 1K_XeK91n%;]SaۍDszJ4 L2鈤q!P0}GrxV@a@ܲG;,?7*U6Q>z7"UBgvn0fbqnh}ϞO'[D"Y, &L*o`2* mğVk`@79QL#p+D%eapPB\DLc;vq.@YL0F0F ۥw*(]" c}~80mg0Jı~` a*+Z2g 1C$n &7>ɦdk1v LcBwHAsAL{g]e*Z\8[FTh֔n2@r(ĥKUBQC*Ɩbq(v~]!ǁ,]*q; c T4 /S~~AXIZ] rd8 Q$uYWfH-x ǭѨ9ƃ Q%T%StdR R芚,.TǸTRSC [Sܚ2 6h  N9rU 突L@mL?xt0hmfEVo1Ρ*L|U$2~!D0أ(BOH%HePukW:;#mBJ)>@UUs񴳳sA3nO=t{~%#welUX8{ E n۞(/ĖڭsɢE}ή.EQ.^}3 GyNʪ/bV[r !\.g8NGH$$=?)33cn4M]5M: `@{{{VVֈKIR;*3k̇g4痿kdd\d̘ŋ sW,_eA,*G6l8wΜ1ckjjw|*mTncZV$q\PDD"H$1xp p\rE<"o&:OEEXAK/G eEѴEݮ˖BXqTT>F)ӧOG:er^[ B7\|~Z lݠ>=,7olcOhŋ?0o7g#G }R)и>7~HH$dhPcm廭DTVUduu H$D2m#D"H$~71D"H Yvwi5ԜaCkD$wd*傶kh&C3ChXR2̉ D"H$C+m$D"HC4MID"H$C $D"HvuD"H$c?)3Gf@۵}{y|?;ѮwW;ȮH!+% ]8υ26(yߑ{p%]p[r.\$W^zaYN+/_%M%D"$D>㕗^XuPx>p"$D"H$H;I"H$dp> nF3X28F}̝ 'Bőn&ICOܟ7|n~^ѿMtG}OBDCL!bW17?kZZZ Bc4@`Y~OӴa֡SU)P`zIz}}.pV_p]{>Ɨ?wNz6n}ĉSBPfQ$"SL^by6m>rXJE#.7%wI2*v!v4Lu&Mʦ--[Κz[2|c lTQ#/()UkێusN ??{VEXzRs_|~˖hljyՇg\1c‘o&j@&#V~޵\~HV0V4omWWW G}-oƆ'Oϙ5v ],)\!H !0`hmiIj a1U! fqJ1b̅O؅AO—RUcl&c̾G4r1Ɯs8q-Ҷxy/dgg1ӲAܑ6\=v-Ժ~LshRBι9!1fq΅c@"F&I D֎R ĖN1feO3γF\ɟ3*!|4+o|ԫPx)RͿy[nbI7je/kwF0Bq]_p`5/(q8CHGT7;C[ZiĒeld0[ZZLL˕j7JO-.t>=1dO?0~*BhDDTy҈4h3 ',$;ЙQl[iY ]Y;3.KUbUuY3O>ffּwtyQDccǔ秳*b@]1Ɛ 3&@so[±8sE%%@ptƀ x0 !%+%0c.+(D"=[t{v=Ҝ..̚:~BwwLč;&mqin**dE"BpUU5 P 471RJcǎ,.*<<̔(.yFD\J tI]Bk']Y)V|_|ȓ' @`uW32q$RaտQ33f?|~V1߱~շeQK~qe|c@c@`B0Hq=Աeo666wA=*Bm?P{rׇT5Ʋ 7^RʸFWX~AM`wG-4~PD8.YǟW;=""*v=q6b|N+ wuuf['ayg㉉ nQr̦j5"X<$t,fwkniq-ßw:~g}qNpA0c !eQJ,r:5ƀpq&(AB@-JZeL*У3JNJt: !e\.4mbahfcs29Ygkwn #ӕLዳ!0(!a;NƘae7.US>N6XS[{G>l===;vUV6.LUUS-q+ B1кc#ۺ ]z/>JaǏN8%oeC߹ SKpX&8zO.^VotvkQ&Ln ʧoWQUCgR&˥ȈmCS:9cLUj\A)eY1,*`!kf&\UT_m0uvvηvB==gfge[b%3"Vޑ̑i뇢Yajd[|fF шvMZ֮I/D:]ϗY2~2:M;j*jQEh\٬Mh4*lk=y7gFJB1Bv[e!!Lr8wΪ:T0HOBur'kQ0 (04f{_ıydDϜ?3aUU4MSU533ĉ&M=zHͅpΞ{;?6`ٹXSl'`PO\0N(-,(IEЁ) @HZp{/gl/' /7st#՝O^!8/,,8zXww~PݔPι@ j IDAT=GZD|>tE+}ұcSr !%!=LbJP=@U@p U( A B0h*U؟ IS^JW ƽ#p:-t]X !dGޤ{LrG__wι`FwݶR|.9s&|)Sح3MpXr)GBm01G,!UUMӌdp$ToFSL##GD\b%MM͓&NHȴ(׮[wG>vJ#%Bv#pI},`c͚'[[C3 'Ǝ-M=P)q$vLaԋ \wZ5{6ԆGiXz9'`sf~Ք" F~?##Cu;v2>ZpuwFi?ޮm[r2Kfud@BB1(ɨkNNr8p8lY̡is;\4UWWysffqr~h{d]E#tB2uXF}ݷ17v겥JE` b "P #=xy9nutn=wnfa1.Rhsenq;0 qPJUU d@,ga9ǜ&WH۟Xߴy3<˗www=j8K$w'-䵷Ӧ|2,y6j ~ O^!X4M+VFc6ltE+P0mki.Q\33|myG(JzެѡN܃;ݡZr-,[~RX,bXsx@(l nhqȜ\`,Dn~n4$g›F#BtuuZzK!F*Iֽgn;zqٲ=}ٳ*>Rd2FAq>+^)ɦKL F!YYY7|ݺ/K|no7%aT^KWlcMg7{䇷vGf}sq[*",~LժHuбش3SbqT]ȪIc/?>@0yn ˗-aMS#ȳϭITs7jL 2L쬬$3ґbI&>k8dBb -8)3Yj*1 =fU7>pt+F{wavO)\Tb NGHDEU(!" FBPhN%#~׼-=cGg?EmN () $j?k(9YQQ6߯e99" ɞg4;nZ٪*Ov;zzz D;vN2agΜIN܂K.o19 o:uO9k'ٺ&gL=kIj2^T͊1aeZBB-B1FcQcz[[[MM-tΚ9^r9 ۟DR+lOR혤/(Ac  !NqB8[-ۡ%{G/#{rܶl7ROgc'\y0ټoxg=@^ k Yvfdۛ $=?H浝/p+Rj9=߱kv20ƌWw湚[e}Mj_˱~;vSa4$%A v$u񖕍=jTGGGgWg$e`O HEeg篼Gvkn.O+nJ 2o&LNqu`Q@@(*VH*t40C=a;;;9zUh0}L\n;8Jp UA8Gw ؠl=3")АiB`1F @a FLTLJ{^,15(l8c`{Ae7C07'XLP;SΘX{ۡ)I}/fD(vGzWXg3zL)LQ oZtB(Fʙ\Cmݚ"bw^uG'ߢDsf[KETnGn|.7j |PN|$?g&OMm5W_e <`m^ʎ׽aPU9gFUv>7@F4D "'?,3x$vfϼr ~ ߟ;v|}ьj(!X4 W2/爄ÌAL7*v8.eM۪V%#Q+2SK(D̽l]% QD ޣH ł=ᮞ iN\ЊZXCDp"@A!ÔB;sm2؊e/xe뢱.rl8IܮƦ&1>mCs@mmݾ&4s.Ng]}}f @Q>iv{G ސ=z+kgu7V]4uF>7DQ Q=@riڱ,viU/i EQ-fEѦ]`ƴi2l``(%i"dJ11 p:eq!Lt8U! @7,M%b È 0 Bi0BI.}I#@ejYBz;Pnq;0EP!МrO6*Ml`-zִ_=z1 "=V[s#u>εNvTmG,K4.8 NZW;Ї}޴ݾ$g*Bl;#F4,(Ԫ;؎O'R2nfeY`OJEm-eʫ3V˱'~?~M~+UA-W5wfϼ.@NA 1sÆOȘ[c#@d1aV0WTQ7#WM­u|r+)EfEÑ'S7LLot{޺W4///է4' "#Eh[1",n-qdus.\NE H`@QB0 KS)g NW~,;%Iiߗc.ӾPJJ(Ƙb(&Yo9I3Gy 2 AT5h8Yrt,bwp.rS Oy0vT oLT9ܾ㐶D ;"3ߛp?tJ0+0&Y>m 0TI͋G"Ƀχ/Zƞ14CP[{GSSsSSSGgG(cٳ^8t 2rs򳳳^ѻ2U3/ɘJ#qej2ӭؙf7l=ۊ/g8kDu2@(I-**z=i!vWt8~wL;s{. ˊzճR9]SX-L\΃'6}#|c26[WOᬫ߶si9yɿcRysrsΜpYյ'O~BEq=551]:e2mIgC(Ngh4wߖcwEKC{{&LS4ϼF%\PaaNQ`@;$ tݤTn_ Ի+y6lܤԩS23mG؎Y(Ȏހ#BKAp9R0UJ 0ƈ R;@IFJJ%iiIۧ%#1@ 3+T,\^:n2@xYÕ}š-)\me"NۭCB%Vq5UCmoݞ`ΣR70lUz2+{f @s[n:p)w|sȱk ._6s7.ZJ!BƢojq lݖ$.X;Sp0Ji~v-{>ɺz{?%0!BGvvvLڞ{\}UW\G3( J2So'ٷ]{ځ0#2D,fvcͱi aȷ5]G/7U7FwCqܣJΝ033o M׽R`1{)`.8 a ?F U@~`ݚΆU ˊ|>o|x;txug>uoN-vLTz_/((ϏFG1cq[mkjj8Fq\BيN4bXUp:Ssuvm߱ '[vdZvXݨ$&G}=2ŷdOTly?\L %A h._Yj:EkN'#tX7k?[}Oxz>o dJJǏ/#m$%i@0q A<;6X$8 B`@ P `⊂!4?祝ⓢ( `̲/x@7ҡ1JD!, gq-pkϜLa[fD$_A|y0w)JRzlc=-p"ωڐI|9׷ ]sW|p#ONJ{Dzwdmܴ_U3cK xT}k^};?wGA~'^h &v|[fkFH|Rbgƻ(~GmI`@;3;P!juD 8/}sH$,ӈň+Z|_+o#7''/`UQOƄ JJJ>9fW&\.{ So{RMoK-},-31++37BwɘJQ}ӦOw߾tjB1=rr{UU.9qr/_U-b-MQRuY1fOOPxѤIs0^X ᒅa/= u/ZxiʞB B`À`~ h& #UQy<]ҌtnRxm'19{v .vkw---цaRJ32,i7tݟ񆦦E a9!LbfLx?~baGZކɇkhQ|/?YZ:vE+2,xӖ\)W]y˺7n_zJ |u %,x8O⼒ {<˕KKxbTETT3u UQƍ+H)>`1t IDAT=#(m{T]v5A^Q4SXڻ:?#-/A}Yg, $qkI3֟ѠX4,U]n1 "X˂T՞={n n_5CU{-T!s+yǺjc 2@F823wסiIJ) EJ^>8XP 51h鳳2GA=6oyjLIc]}o!5Ǭ@L^P\&.tK}>#FΝ3ǟ(..4Dc=Z;vҖB)"tBIk2 K~eY*y5u}@ =TlZVکVZ]h( VŁexƄ LO>wy%'{.NN8f]cm[IZ-r?/Skm͎"7ROq/?j揉{+ ]ܺR"iT9 jz7>O?fȫ߸f1i4L\Wr]\ @@.1x0YYC݅p)>2}_ !ͬJ]QARNda=^TCa8Lbڧv=8lm6h=QpPw&S{;+Babҥx >!(pŇs?(,*6: bffy6bwtpPkթvlD6 %:$1dVl$2V8aP e`aFWI ^lfjb``d2[؍QH L&]y^w7[@b5=lky}J` &coi<2gnAI_=64wM ҃tc#~Ee%$J`_0IJ3 M[Teq:iak=G@`nYJv#z+Mb } s߼uo_E}3y%A 3j wREUwՖ!o;;lF ^BO=ftܼ*aT*P(nn}@ 3u29GFhR4//O&5˅ů__{՜4,xFMA( KDb1T8֜c{쥚s|A55 &ST*%iHoo?~> ŀ p9Sͼ杰АƗc0tGG scMSd2jjE6vv,f6"nߏ~u:Ԍ镪98:)$5˘DRIB.}5~PZU?zu~{\}[f!s%9Z])3AG{1pޣǏmrض<\0He{\;e#gvRI8@@ ξ蟿\7*뤐zzz-NAA`Hڷ!{`Ո%),K?wOc8oK >߈b~o#Ҩ063 DaŤR1dҨTH$T׼xQhuq373Fn3trԀݝHT*b.Fhlf@K~%/u4$$TZT"ОUܳk3 E`l2ax%29`L?} U 0M+)}X"7'g9'TIfiiD"604`2 :eGFqH$335eZQ\ ^y#v&l@mcML&B*FQ*%ٝjNQ19PP)4h Nvh41F,MIHo9-Xb99⟼zzs$С{fodp§iŬg驏00Ojq#-[ʮ FWx{naۢ{kNՑh֞DR,,DEWr{ό}MY`nf2_JeӌXbw/'>FNd2R.$,3>!D kE @gb¼' sg5ZكEBet:PBmhoVG?Wðm@8:X\0C-8xry2yB~E^oH> xI<+0`4gX\F0ZVpƳWdK= ,{9Yx<}=ܪ>ynnQQ54I$R[`l+>M*++3eՉ1 ].5!a/#XkH\ Zo**JWKg0 ;zCе}o +0*ȕn AxsIMBa=AP)4 B.tѨKǚR%3'S2+-@I tz=MqW(pj)I/H /8g]-~zZ[U܇+ /]N2lD{tҝf#whP0.[C},,u԰<}(7w:wR}-͍ [ca!]ae; p2634g2,fb14Ntr.Ys{RW0 Q]Bi}}rgVm7c;uEr{YSFmg5c 0lml._NH$8 SSSQ`n%ɂW7PiEŕ+!gTQodp̫nSۻtJ /ǀo12oA _\qOhfyϞiv AD -SN,K.ӨTDlb;tfs "L~#٭`k9.@WͬoǮ5w!H(ohDFӣQi2=\q\+a (Jd3{̞J*\5*oYfsI#:Ng\]=;5[ +}ph-){w1D"j.4 k S4@ DWI@ $6|sgڴ;l6@t @ S33+kԔbffm>* = @t=" &[Q5ԉ.@ S;Z@ N5TdO888?yC$A .Ǩ#r:DDƃjG@  4!Au_xs@Y@ $@ Az@ D-(4ǎ Ryߏ= $#/]r9A~VvvpXDu߁ߙH?@'G0Djee~[>vd}O5{1cz#HHpv岥z@Vvv@PXQ3eɼIS 9ةvuݍi!?=i`XȕTRO }=ԫLL42lWkԞN[8w+I[W;w>k+zo ݧvF\LH\ggΞ3>i{;;V-qBJ0wB$TSRߙ:99e+ɩCCͭ^~t.{/e IݽEڽΑ,+/:w@c@ԘUUBAyy^vĠd:?`ɞ>~^g?fێ1'kOO#"# W\E.^實XJb媫G Df_.'$x{I6o٪,-||?x:jm$a#||BondkB]z={߲uo@!idegn}_`H3Zе0eQcƷ٭m'aOO _XXWS= SSBT}xuk$] KZewSf.['~|eAA'GVC9dp$y>^o^U*f݆*,,LL|6\uMͻ3;rJʚիF7s"@wGFf2JKT&ג/M8 ߨ`Nv󟫟}ќ5>ؕ\No쫵__8柫K>x]O2iℵcZе0 %%%~mQb.''=~ӣo䔫w V,/#Mfg5d0Lzb{3yHHpK!|rrsK@uuuJչ 2s T]rժ5~nS'j,jl׬^E&*2@ @Ee%Fxcr2M訑vj1͡歴QQ#`.%7;&>KJKdX tg d`An7zQo57sѦCk\bmeERSR {UVUŪk : bʪ)fR<=+?I.۰qG{Ee%J50x!eםRۮ3@dzUJ3`#Y )IQ EEE2D t:éU9U t9R(}}{ht:0 q_[n۲uC _555dSaA9wt~MO40{z@P`M LaaRD"a2edL&Je \Yؘ?{Vը F0~C\U%$qYY/\Ѩ5i'AuS2+VB@'L\BC_d2H' yObv8jE͡ǟ4~N&DO 0RS@>^a!5= ðܼndN`̧O|ժmܰ_E*3ׯjǟ Օ|f3 16XZZx{u-e]w.&l{2o?_şf޽zx{zC# Rه5Y or]G D\/7C't60/|ZQshpHoq[]#xyz r՚-o_? 8HeKkaT3ЦC0VQR+A  =vⓌtiٻwo ot+qNт i!Xz+I:lyjO8(hqDge8[U|Q;wУtpt'!+QqbO&,+=kS 2"m7NWuǎw46{J7'!TbJ]X2(`ƥMV&lk3 ڔm͢rkDױcֲ;=wAIQ^"'!@"5_-K~@W-@PV&=UfvJߩ]E xNk%Z5?y9q/dRBt3h5R)Γ,_Ύͭz,gT-PB Fsz+.-]MIh? z~Ks;TTuѣOvIC?x+3 zk!^wֿ|Q ޸7ftyhm|pm6ɔi3/_IlY7~T)*?{HGK6lQ/ˌ c:WRC{QF g6 ~i٩rC͝$C\[T*Q9?X,Is?8w5dއ{YwO{ o2a ϳ+i! C0wk'*KnݼDz/o/o˴?J$%B 9XNqn/**-jŵ@f-6p8O' [=VZVfgg;nj{'|-o2:j$N?u6onsBb_vZ7%$8h]1 _'N:9:u Y9';AYP`k֝;P(FE\rs,|0c0TJ^3g O>]ܛC}[*iP%hq0nDWCpzݿxwVDC'hƋmY#=m[ IDATMUR? 0XTbafx-=խIZhA2!J-[m>0]{>s33~tiW|}7Kjjj}O~GG;~]˗-Rz=_ŒML[=Kv'yyz,_TJg7lt6n}-~0x6d˾$^uIdDݻ}A8YO[P*YO8鈮@k&$])I.] IS] ) W OСN'i)L$8APL8uJ&(F\.7p1GG Ubҥ'N''ѣF«dgk=iH$ھ'+KIƓ|" Aʒi{{ƉD|G_wp8}54~lܹ~>CG޻ϙWݻw={?xB!]޽׵&z҇L8fz }e]Pwy7ěIk඲')  EBB/aT*U(RT#뚊PPً<2b3cQY*8FP[)nZhW4^+OѨⅿ651Rodl iBZ̥w_2a=UTɎrye?,+/{qD)Fγgd~UUU^dȈO7j]jQ?={rr PVi{J.ho8kM mbO"[ YL;6=8~oT*"h_ק:,誼$2CCi/AIfe\Ŝ 9zt\*ɻ"}zR7ĴL)yj򁆭AjŎyH}% E,8^V^ek!ologO| 02喕¢BM Mc.}j9 ٓԪkVdOBޞDD~S~+7:x4qiEYEQAƩ+ct:J9 ðό}/iK ^Xͻ܊㌳/rEWvEuu'{Ds5ǝlٺϷ/vc5rDcaC޽z[{I$Srd233&'U5rvpD_'N:gHHP^ۿń?֊rsQޱn7^DUU&z{6B֦@t?(n~~hg/WPMh`=\y}y&NՇNo|ZLFl333)ɓS?|Ageg[٩ oVԙsbBзzx4ÇP̈r֥=)''we *{yIURPX*SUfrϟƞt ̚5KGS  AAA׮]spps玖RuZ8d̙ .ܿ… 瓟_,&b?p0z!# Qi ;ulOzQZ52WBc^ě;gm6 \NȤDuN*jT-3666&&VP49hjL>jn ˳}EC 1qҤ?־p, EEE2D t:éyjʴT*jE"OU*:FP(Y0]^^&'O6N9>r8nٺm=6|W34mO"Uޕ%/] 且HI M5uz@9EV M{ϛ7!TBhhd"HOOO(x\պ|vP(jjj8A99mxz=u欪O?!-8uoGC>^Je[`ނk洉]mI + ] 30^f,}C̵di(N&SL:ɩI)qߵkoܸ/HrBسgT*d 5>hZHuD L=~t6EYl霹ٿ?8wcNg1 ;y̤_v~}K$>hM~>޻3/]~rB,|W M]mYAaE<Ȼ9f͢ϖhS~7!̥/$$6'5+VPM3-]DvUeJҨ4L&KĹO_TI=)r#FL:iK=$h7AOJ}g Ϟ>jM#IAUOd8xK8x?RӓtލJ~/*xSS,R \&%+Eu%ZTsgbmJ=zĩuuGttddd$~{QL 2B*VE`m0a >Ą`plgK3K{PT6d:PZT?}\\\ c#ֶ}v۳@ 066fȘ@ v.bwtiO t:\k uuu{:u*Fc;011at:n yGۓ4k,T'HRJe0...,`4@ n΃ŋ쎖c{ ad`$B #ncFR) Ґ! YޞԖZVx14US%j \" mbOB  uZN2 - 2w;ZD{9fMR?w/-nh<%:?yPUo;LX4j\ZֲWlw:۝@B ]F4!z!UC&zEMGt?J}ǒ%K@*޽{ҤI  ϟ?`;w]gMMMd_fN%7ҐT5HhR-kA7T(D7@Q`dddh2Js8ZrYf?~?~ڵ=zDFF&&&zҵk/]DI桡jJRːd/*zRk@InPZC^FСxZCS6צzA077wُ=0~*..4hPTTTzz/hѢlܸӧǎ+**oNe/_|ELL $Q^aÆ;wFFFΝ;OJJz/011122233M,@||{'Fl<>>~֬YFFFgI#Siiロ`0V\^YYokk۬Ե@$X> mgyڈ+7wH^Z4}ุ8g̘lٲ mݺ533Ν;ӧO߹s'^dzP(LKK6lj#}] 왝]bbM;VPP`iih"Z۲e˘1c/^̜;w7|3a„̏?ɓ>>>wvsskEyI:2G ϟ1E3a~hn;7F jPzЛ8QHRWWW͛wҥcǎB3g,X ɢb8O><<>>$$7 I8ڶxUuyӦM3fHKKkG]:#o]Em 7YFyA!:?I999T*А<`0X,It:`d2N1 ~6>/|2ŋȄ[[[___*ݍzP(T d`fflbԨQ>>>͸S]&FN$[SL̴3330t\2IZ.\=/DBfܚ 8Ь4 W2%됙ԛ{#+J򰤤Drx<Ǐf>}:44L<899ʕ+aaavʕH*G*6>2L*f@ u~]?i龾YYYOqښ gϪI&&&qqqKfYXX?~7eaÆڵ bٳsrrt\.k T?M.8 kRgP(4C6+ȄP(lr(;-..600HII!Wt#k9,LwCRUBٳgΜ9NNNA 8p:e2l֬Y555r%..N ð8WBCC@vn^z͛7Ϟ=j̙JڦMfΜxttB󳶶>{ί{Ç8iܷo_uuu͒JH ^y5>bDGG+C:;;[JEP'=v!:g,wϝDuVSi]Jٶ}sqk2#%VVVO|鯿ZR-\֒ &w|>?!!AaСC;"d0|𼼼۷o+ nܸD:*?qDfffVVֺuJu9%)i\s[޿sۏm|IW2AAAwwwo݋9|کFֻUWWRJJ̙35jZŇ B@x}??fqw dh%ބ@u%>v9Ŧ>bĈ9s]ڵkgΜUj9sE ۡijjD53#k[Fjyp?m~%d[d&Jj۞ Z-ڻk_G pymw!]ؓ Je-MG3m> 6YvvH)Cws뢳i{qB*y-*M]]-HGԅ\lɣt~ַy=PS#}ekTWхЍBP(e@y?!+;;8,"[P`[P'i߁ߙf_b+BX\GPX,X\W=ĩg :,0qT*T`0bM8iۡxD ȕKCLn,'8RT[_-VdU_iS=b+]/]5f<8ϫ@twأ)35TGOucC>|AJ<)KGb@ԘUUBAyyJevo_߀CnG :Rj]W\v)08†$R{g2֦nII/rB>}o6߰qY`يVo^?q,+ >^o^U*f?[túW.D"efm*]O2iℵc rƘ|~As-JSҲ~}&/s㵽*(oՂF@ùh\U'M}_3O3^J8;hșٟxz8[eTڇT uuwoΌt 9)tqj"\>o,0wϯ mr] 'rHTZZ{#n?zH.#&ěkA}b֯7qD6SOoL6v(2]RZJx1c`aaxRL[C:%ꁽB̜>y b֯%떗Wdeg eמڜ:9? tH>ix5iIjŲ%,k' 9dpd7tI* 8DP]]~L7ΓO;?`ؽz7fxR2}pˮw(U+VVw -@7$%IuMn{Ι3'55UYr"K>}6tMh 5dZݩ2m AW]Ng2PQYIR ^eƫk% ]o?t}}}ׯFrozRq8޽w?(4,|i5HCBtE

U=pBC~P(ʳcc[ Zaةg Eo/UckDT:.W(bqRݼ6!zX,f0螞5h'~ RݬwSc^o~s[mֻH01cos3f4RqLxbmZ`0222>|5bĈ{WN;33p;K^2c;Lxao 6xҧ_@F6ǝ;@?@}=?S=qú}ajj֦w~!ejm2aGbxE >6zhȑ{htˠʊat777PجnBŽ{ ''ͭ@* cʕљ JOOW()))?bqdffWIOO +--3go*CRRfc $_ެ)Aj:vZ;*Ky򪒕Vi+7z$Ç{zyu /ь!N Z4ufgK2o5% !r6s ɩmbO 5Vc=ZiR:xQx<lkkG@qqqPPPRRݻI#e ;\o߾Ç|̙3?~| Jt/=A+(F &dD udH.3Ν_ouVtXYYLJdR RRRxʟd@t-4Eke]GItM , сڊ-n $_NRkkk F"LP i r+f͚111 B9qF2 Ztԧ}Gf=:[W+z7rꭡB6mڡC:4m4r*@@ѦMvu ӦM۶mǏO<# d`@ *ړzokf̘IRϝ;G 6l׮]k׮ ,/Tt\^Wض-#..o߾ HrBسgT*d:@9 x)).hA6OJ@* 4NNNVVVdٴi̙3pT󳶶矕ϟ?1b&GyZ y$w &&&sݻ}LLL|||DDĮ]Zu}ACb7.Tm$Re{8qB5IzJ*wJ;ePXJJH5ڈ2`H۶m۶m{.>eeF ͢+)9F}36'E +2C+FněBqf6:-h9霱[J:lkΒϺIu"ݘ6ǝ wΝ-@;3msPmx܈N5ƞVW;wWJL/@ $!zэa FYZZ޻wݝTH%޽{NNNHOB ѱYFPL&ˍ^jգGTzzz~'dHsl o,hx׉TҢz=ItcOhzzz`̘1rqrMLLhV`@ mR7QmKB\Ѡ't>@ ͠HIB @jaeًF,I$M;OHB0e{("'"hZGjZkn8p " 7{\Bazޯ9=7y@ u%ms@ɟ@ $>x@" @I8+JT*bT*U*핆h@\JzUnE 9]=nXVQ]ZWVR()+IrJ Lvq88)pxBd bƍp8,qgPt3nQP>nD8?;.6&>.VYwwOPmnݸq}P~2W 0V'!IQ2O0,..kLQ(rJdflxqAAp8L&SϮ:v(k*=6--mz\{O@ 9'woߪk ǓR\ en,6/ rD"\.tr28;88/P{ӡ Y# 5b} DE+! F^Fv1T\d'2CB{nȐ!...-[22E GҶm#GP3E!"IF6v0z7R a8r^&$f"Ɉ:iԩݺuKNN~5 ''y۶mT^:o޼tcN7ϟ?^5wQ #}G(m~aA4Gh4r8ݧBh۶-VTSNNꫯN:gR9rH=.=zN_x1::###}}}J1X4h\Ѡ E>O#Q}3? ð+W[HpWtlXXزevJLLޒ`|&??7hMR(**5jXiUݛWrj\9$} APD `޽k׮dsYlQNW)S5Vu.Ϩj >,k+zs#kh1٨O }C=ǭMNNֳ]B4b%x`|t:P_/N(-wtwqq\.W@b8v*Օ nooQzY=7)4Æ #ŋɂՙ3gtWԷxR &r]PQ#sՇ0"Y`0LMMMLLI 0IVVV\@j[o|&q7Z}Qe#Q}`0 #JKD%%y BryFߍ`oÆRSSɚf͚M8㙚~ !_ O͉N$))^{t\޾]6 lljș:eu("T-MrJJooߤgL|U}zn܄&%EsH9`0ƍ׷o|Hax$CA?p`(].Y|Te1&ˋ.Xۜ8a؏TfMHR*Xl}Jԕ5 ' ߸\\.'?SSStR@z 5Iύf A$A/&M=v$0dNȜ;aReӆܼ,\][W*ko|6j&9%_vۑAcɞO?FѴ]UʛJ\r{ǧ+VX;w.FF}U?8\{0z">Z-?BU*UHU*UC Htof}t:=tjpԕ@ظpʵ!S@(}-:Zс#\ueԨ 5;(,,JNI8Z%T䪶+QWHbՏW*ϩ)mOBOҽqj%'H*'4ֆ(JΛ$JD"p8eee<9X[Y:q:6EU0ftЙs\[kЍ*J\njjZXX`!N3aCUdYXXuD\./))X,ʕ+1 ZW3=}W]  յ_!Q#ܯa{0h4ڹ u?p0 ޽SiTan޺}.BgڡE+V\ Y. V5O0L,ݺuk޼y֭[j ) '54 Zцm6?l[KK`0._8O;~~}[Y 88}xxx OL(7 F||W.kG!!S.wԬچڃII$ 6׽[^s:  &@gt2MS""D]tH'L4ojv޽۷+UgϞ3f ><>>^ ))cǎ2XxgH*5%:m5 Gum P1qI*hKMMe!!Ut;(oO`hj)T|YRLfW_p[dɌ3IT@v(w9?hGhuV-_j2cyvb IDATOq\.D"(+0c&0g{k 0 JF}LiZ.W\o^zڵ۱cGAttt`[H$fffT4H=,HR33׏ہߺaAgKLq>6vT}q~v<mMWGuswkG3jpGhrrGidg Wo1$:njj&NqߗY^PpssѺgO&=x`~@QQѨQTLbX,R5JKKn|>U_k@ =BէIT^LL8MPPЀT*X,.,,x捫5k;ft dz&&Ga0tVKrTP B&SuPn=@=Ȅ@Or2UD'%a0G p\\xYYY^^6mZjri4|p8 !!! `0.]"kݻvZL6gΜe>Y8d2U*T*FD 899]x100ĉTn 1@ U=Bէrt:bjM}#spY" jooOȚM68>qD'''pNͻw޼yݻwS)cbb4cǎYfO&M*u;`\P< @ #=Hbt:NSɐrl6d9ǫB%Μ9^Jf0w!ˣG& )(a^:Qmذar6Xx>c@ z"t&@$2>H'kЏ!2=BSRzUS[wfIc@ z"17#+6{?B-lZQ+jz>'Oz˫{7[yPPX8nݻyS$b B ~͡7:ITZRKnV r#5D%5YTx+œT+*+aU*Jh4s'{92' ˾K0Z cEP&#W0:D*r8l\T)ҩL"ŸQB@fv֮+J,_lرZj_}۬y@TJ6ӧǕ˯]1j67ibS5?='̣7㣃Zhp$@2}rrlll?~A׮:v`#0HTXhC+~Z[{2\/[ah'Z`h]!VzZ`&Եx3Nmuׯ#wn^# )`^KKu C&: É~;moݦYqq񫗯;w4a0*:ϡ 1W^ML۶ض]GVm'N˗dSjj*0X WH?një]:u:|o[YY V?Stk=Co@ 18C@ieXbǵ-p.KvN#mERPss8f:v`TLq:T'vq$0 ;to~9yy%Ok@%߫׮;޻pfN;W&xk Q*/aZhu@ DL>[D) XAW3-h@*ݺszRɿćo@'>pʸwOi9}sLJLN"m]==t'w=q1rGFFjٵɷyyƴj۾CgG86pp@qqInionkvwѣr 4"T?sVԊZQO ".;蛃/qmșCO_zg.Cie.*0WWG^=&۱㥷G(((y8c \Ztp9קB-W;o!TcL?NۨzSs)bi3^>{&9٣wIAN~~KԤĦM^x)&6nxS&uSLlukIc0|~38 ߅whbтyIR]sǧqZ~3_yCyI,sIp?w)WrLP?q6cu̬>}݊e]Ίjߟ2 5P>nQo5j|܍ ZDL$2 Q&I4.RT2!bGLY1(K4ǷIo f gM<)##Fȷ88At: #&<#ySi&Ǐ~4fXLޥN`tMAŃDl N@*>`oO0pi  _^Eq4hO8噞׭Hff/]|嘩)wףǎ J|ʭKg^.64cW;R='fn))C q|҄Ǐ${yvv}F^˛!Lmf¿4q𠁃 ,P /@Khb M"$2@&3K0UJQ:`xvnjM>U֣8&&&& R8N%y)Io*GpAL̏:ɜonQVj*.'ߒ䔮޽ ɍ,zӣ[_euMm=,7se|Sm3,\J@guW@ ]>X  s۷]M6wnbLMY8 llK...;q29K"u&pq?wz훷n'/qV4? @  #01A pL Ui< >Vս^IAp Q0X,&|"* Tw"$٧OF p7kV-L# [MA[O]V*+ʃ{_?j =} bێg̚}qR)9NHdQ"hƬo/ѽۋD?A9o niʕuW<0iIxs|9tD#blM'2ŷPHB|p(MYQS'r&Tt9OiwvfF ρkol[AAA[Z|Y۶m]ruVnץHyلYOM'X FY- T`IRQ35 pUUTed^8B;;[Em: p.dL>J rR@Ak{Eq62&6neu|ai4&{r;e,T*k˖JJR.3Ç]yb?jx۱C{\q۷8.#prT链}SRz|֭ܽ]=|h+} ] XXR]q9w)p,-ȑ勿_p^P0D )A D]qzy ҹpidK;4DΚ_:8 x|.ӵ+~]_ty&\tz^];wd@Vl!e~jBdryΝΟ׶iSrxΝebmۼ q޽J<>rn>dԫעG9_ ww"N[޽\ֱCWO'Ou.^aӘсUݽd\K$A6 tڶ1 hױ˱/GS._ڇ@ fV.'E n۱巍i¤R)lܰ_~mO+CΙE"\hZuN'$G=YsՄ֩8g>y0~|G%nɱA۲~JDqFsw7Y*LTo :jm۶rZ=!!F={|f#煡w@,. [>[7GDwD-ۤ&%ZXXP?vμw+&8&`ȠY3g=v|LNIk_LۖO7kw<ouYY~_,jgܭ"߯/]!迮gE7ozސ*R*q~q>yKIQ3 u6::u(93#% ȕ{?\r-) |}{_]TY b7/aXHz9*Wq1q8F̛ׯ "I1R{tTJ Ϯ9qjݚf'asYxդ-߽yAhَ*"R"*#9@TK>_R[Z~oɷqs[HQ tL&ܼL %%C :%.kJ A5JT*J\"ä7IeM6&ӤEW}V)/J$kռ]_ gڷm}計3';6HIOIW}-ZkѲn/?hQ+jEux;t8zȨ^=+:D$͚=g_=sǝ=JD"R X[Y:q~;j: C$}JƄ\E޵\xiϟumR:%%>kkwٛͻtoǶ aWyvv˗}/˗,a*>OyIq1CIdJX4qN3\s~R-–ĄwV4z;F@fH@ÆQs/*c][rƮ9eNNӧK.vƨvlܤEVVwo?L:?j08 th"9%NF vxY$UcPzJkfmjj)4(/@cwA&@gG9\ąn:s8UL6_GܼFR^'9%p]0Dr߄力D*ʽ ;[g0 31axw I1d#EQ痑qvơQD?"I am?zqAFhѼ $u_u}6C3JեR|ojjZU Mӈ- /!Dlߺ˯mzZT]SeY G$:ZK'}*3ڣT233oG还/-vwwoR >UK䨜1okWjסfC Dy6tİuE=sI$]u%)=E҉'ƎKWWgdn7xF.BD˿!s3Sk@ S^Q's~رc?^VVֳgOٙ/]*|*|sD~˗e2aƺL\"gfgk@hi=|gfddxzz94@ uOBuImnӶmۄN:!l5ܜ4l&xk9a8o٭oҲO> EFF1=z{~3Aƍ]vŋ?22WS4 w @ H\lL|\n.Ɖ'3&&&N5mz͙su3X%[?Q(+Hp*= ɉ'6l 1  Lx@ tϲ:%" IDATNsW" 08ؑ#$J U6//knҥBp}.װ-Oڛ?+ [P\\lggϥrJնm[ ۧP(J%h'OGDDݻvZL6gΜe˖ӿ@;!F%z]U))g}7/'|nfOgSި`*$yCITTn̘1 ~]ݻwo"Iʼ̂QIXT*2R!T*eQB CT2YLף{sOp ]PRR ǭebUc9ubUYܾ]M0{rz5# :CJO0-_I=p~?TUkh$kþy OPHĄJ:tXbŬYr9ñm<" Z֍k@J AɷJj n߹{ /S=站 CVprZęS ӻ6&MMM#D9U#4aK/ǎgFF>hߨ/&MI?A&?"{-D 4]5DidTPp8+++>ߨD _K "&P(ݼ}ݻ^>"b2ɵE I ʪL&.+drp(AD֥z?vvv]:wr틐iգ䑎\92QL,H$}칈wJ$RM2tSO6> IPRNs\ 8SS#27hca: ,-1 +))%RAA5(JDpxӞl`P0o.NDf9wdn]_ PF˱LLkߨL> ,UGsL&ǫr'p#@  sss>޳d 74`0hsƏu?peS@@j#2B.̬{/ߦCѕORgӖme@CG@1UX[YTXқdז.'Nn\._:hak*]3ϤZ`IS x}ְ=z@͛5?='̣7㣃kA$#GvU4㉉?.++%%%7n8SnJH &!DٙJ ^(;vB飮9RBغMC0~ζ_#\CC)$m=-/Νp.yYkO [>f+*I'qk%(0"66{ҤI p} =@ GԀ ~Q?\^>:n@'QPA0Y/LqrrHKKtf%I5/ eQ+jEu@%7}x׌Ţ觵Fٸ~Ex]gh[34=W}zf4E,s5ƌ}A-TJbbb|||.]ԪU+_;ͪvU nX^@48b>n:RԮo蘟T4X{ ǭ$cp@A-[`LM'vDfɂJ"B]\*Z@ z[Y@aNyzOގcV$@f3,%s?`׮b… Ν M|sp/7ձcGJT*SRRZn ڵ={̘QOU~f,!DCTzZ4s̷"+UE{eo)OR7OҀ D"ѢEܵ }-<<|PO[4H4bD&$%%u111QKR*K,1X'4}utz%SQz`4m>RV(iLR]'y{)٤ZT#EaARLw O8U*Y?hРg϶iӆ}d.C@ǎ2eJqq1`ͩ۷o_333.zyyO6-!!Ju?#G&$$\~ݰ"#sj ٩@=\dZaD )[kcē>@@dd<oĉ{^ggG@ݩœd2YlaasΌ OOG nݺ/RtwINNV?R 0͛>uVHHH^^ҥK333mmm#""Ν;e##2I@&ٱc'E D}VEM{AͦJD Fńx:Z3RT*}ЩS7omp᭓q7x~g `oo9mڴ={L:UR?~ ^}wޔ)S߿_߹st:f>|^-С=郯R9rF D-#S3^2}& JDw7YO*[rkծCEF')lI$ ㏴4;B N=ztnO211QuH0}SS'0|. #YM˗gebXm6"QFbOOO`Xfffz@ OJD]A~!gV?T273"J/!f&+a*ڵkӦMook׮>NUK`cc>>ݻup<Df6_\]><< vm޵kҥ <((hԩ޽?W@ zuK}#TߠԒl2D"**+/--*~þ|d<(JRnjj@/_L̔J%) " `޽ fΜ*Νs;v̞=[,3LJ%Jw۶mիmv߾}áCJREЫh\ֺmmh$ #Y Ep)!Ro44d_4F,f 4*ׇ-[VBT;G,>/=a_|ZyΝ{SNm޼bOnѸi(iښGgWss3a#޷zxY48{BH|QOAӦ ;ppA}6V(UMfyF]1bĈ@X,… .\#멂>n̙36m;wJR$%0eʔ)SE-Z,۷o߾]>h8@ H2hKwqJ ƌd+\,p]ܣ_%ݲkiI鵫Q"Q) 6O IN.4-M҃w Iwoo'' RܿaMM͖iP%C?8D{\Fnk@r d'" D"QQQ=]Qa!)L$***~ܬNsJ' ][}3ZԶ}bqٓպu;ohzKҸG# 62/7{]Enֻhf243@ j$03c2@&|KljjZXPPQ+x ڵ lL''ܜoS333wܒI.._2HR@^n.( Ya7C׻'D ۷ol=T*}Q6mLLL5@(|\t}z|bfjj^cfjFOdfOŰ34 eiiB'8} &asrff=;nzƓ ߮]*5hӦͰax: 0>߲}J+ZJbx\.W.cVi`0LMM9IQmG_zikkڪux\ls]յ[~}Mmb=?C&OINfؘX^]@WdxY|=ygjēt:477''N""a |P2oH|޾A7Kϗ{>KU*՝[7ܺQT*oݸm{}<L&̌嚛*ܜ嚙1*l^g.`ԊZQkݶ6󲨲e>޽=8nrm>dDQ)(7h||8/]͙Ixxzkߑ R %d L}JvVVxFz>n=w#x>n@ H]$@ḷؘG3ɣ0f>r),,|:g @ jdVᨚ'~e"a{٭ବ,t@NF|lݸj9uJ\N[4L/_D: @ u7ֵ#ҶMJe?EX8񤬬ׯZ>NpЃ#)67|eϼًb???}D +a*a~JXP=ѹE]{Q99^_ַRɂ|=IP~/M򻧋Mn>Â4˅=z^"TamիWצMVZuaݺuoiii]t1bh Ԑp'ijKe ˼X!jjmTf9AoٹJYha8p̙3O8ѣGHII R*VlpN%*@ '50J¥*axg>fn͵Jew063dYv% bFsM]<"%`+)+W$Znݺu먨(='13{s~~#\\\ڶm{hѢERR;vbI$ؼy9s?@ rߒJͪ/h.Cׇ;c;?gȷCh5YIJ~k&pZVC̼l8 /'"d޹̭͊cIc[2zSbyYo‰WYZZ7tPJ.KrNN`^Z|ܹsY;88$''_zu޼y}wܼyÇp-R}\ֺmmLלk,]=uÊ/[=Qq@!8$>ߌ#ȏ;-~5QP6Ϝc &=ޝ5q!g ăKEHUZ9XzoIEVU[ZlqE۵E(*-*XT!pd\ ~7o7o3~x}`_.R {aKDƶ |OO>}P9r|T:77w…PQQ1;rȂ iѹttܹy>}JwmKK; п? A\ٻGHT,^e;(VY98zr\B"~Hdt~Ugo[KVKq;w:緓N#~}uo SXh8(vj#z)W} _ޓҟn1phϨ«% {7mXFV' 64';s1Ĉ Fl BXOJ׆X^mﱒCw %IR(:88_~ >>>TSSSYVVVRRRcc# >N$M0ZҤIE"ihh|PRRJGo!:8J8II듶m|š}ٱpW YjǛud-.\Nٱũ,z& ޏGwďѓ~Gt v9eذ̖?ח?ڵc[e5Fn}\--@_R1[޻1oޔҲgti0ķ}xޙ6DOzc#rFq zLIJTi}| i{8w$̭LyJQs{e?v6+IDATKIRlm:>TW+*/U0Ũt "ϸշF4o+ )4Q6{6YwJPH/Oɍ|\hljz[[kpf)xⱊ,`n{*@1n.Y7Ş9o lLr 1GђXTTTWSs(xdHKy䐾ǏԻwSjk300077͛7o믿֯_omm RZ]]}#G8qŋif;٥o޸q#9k,RI/JAQ!: $[^yB֛w{'_y{ݧ)-Zb7}UTrV=_w1b򸱗._-bax:=2i\[k%7f ۄł_׭yQqI=eBe t#"2:$CQ8tw`ě#9v;ڴ`It,~[ڻ{޵9I~flnnޗ \Z !PTѡ3M>nU|{ߛݯmj~O? ~~'FYb?7vq3OV|wBG=s'bº>lɘcSM͘ḈO5'?J z9/5͠)cCMC38DڲquQuw^C9qunӎ:=..nЙ+W.)/AF޷6JM~0z=myBH ̩a# }Bu}k=7;m칱t;mPN <vZ}Rߝ6Mw˙޾k?mPB V>$I/>mf!Psc1RHBˢ$}~SWj(`d>UDȴi5|0}DIGs%kuJl0IF,BAXX:oW o~N+}6m>~zH$ 4h 5KKK(Jz>>> ϶yR'NOq#:24Kob͂^23##.~r`mbnš>ZtܩoK'ۛV{H*ՔJyd>ugm 3>c67;3_%*RHd5SRbixRСC ,_|||J7|3r={zH$I#V:Bup= I|5Iƞ 1TtMfn':f`:c#MTΗy7 maIl6\$uazDvvvꛬYf>>>bbbb :: o>fBpΜ9W^555]nݴiJKKGw3f@nnܹs&NHoxiiihh^wy7 ̚t!2A-V6)rz bJgac^Jj J%}KN#m9s,Nn!'lJ 4I$I*J[[ۺ:8I"\|9""I\|yttҥKٳtk׮1-[ j;;+Wdee\-ZuI&%$$Лklzذa۶iE?&PI^gB O 1qNHꪟ}+Y,ա҅`ˊ /}+6F5^:l8zݦ'DO&P*MeegFΉHX[_8i aTdcc[WWׯ_?6l=RW@@@ETG9~8899=:77w$IFEEwMM ֖Rɓo߮q\>~x} }45S}P'RB毮-Ă'qx걅JXXU|R[aZP֠8b]ߤ_P0sV&<IMmQ[[rK P.&L`ll `bbbbb,D"155577q4HV6qmMI:w>2$:A=z>>utp~*9vԇ%)u57#o2VI| {Um? SLLL84fk=uBGWeV3?rǷۘϾ519S[ǩ/{۟6bD"edi' U[$5QDfAaaaQWyT f͚CBBJW_}7e˖"www///*v۶m[x=@#HzR:0PY+w;TInΙgy"d,# }QSSSSSStaa!'fwwwK$###kb }6޾~)INZfF!zӔb*0F_U (2 &vXLIQYl}5vpP(r\.d2 QdfdFlB=kLIv>.hαoDWUHP<ۣvq-AHۺ%/`PԺ%gNA!^䡶$B<O㒮!BaB!I!BaB!I!BOpziB!Zpzqw#I!B$OqB! 0NB!bI8> !BJDO"$Bu]A}$IB!E$BuMڂ$z|'!B+$HB!O"? !B]X$B!4O$Buq8> !BH3? !BH3? !BH+%x !BC<4:E$IoE=7IENDB`PK':>YZ -Pictures/100000000000030B0000016A53980135.pngPNG  IHDR jQ;tIME ;tEXtSoftwareXPaint 2.7.8.1=bM IDATxw|) ˲ER{sl'9ɥ84''f_bٖ%٪VdbemӀ W+v33 s@ )HBC@ 49e@ xP{߹ղ b(߅!uJ"E(B_=kmWv4듗V/ IՉ1# \(߅č  r|,`p(P"E9J>|;HR`BzdL ,N\t|3=έ*Lh.b pr+ů/i \n)?4~IiL)0$4$bP0uʨN%LJMLF@MF8Lh@E-K!,[12AL,9v㺌1F`q:1GaTB3-cwF_F{ MM5q(bX{jX?:Σ*HZp>b5I)IRi9WrH!q+>Sf@ӆգE4ޙzrê[>*BB Q-`vYJy✪ R[GB68BgnZ@0r ^HdL0rd3a]6D5 ˤԡ!0ƀp*CAc ";1{O82֏|L3gJ;F>cbX:`Ri^1@'=%${E˴{H.'%5:GYǀ10d%BpbB Pi)J^PCI]LzV;NUvs>:f  ];@°,KYr g9U<ѥ}_"|ǓڼgOQ;3x)r{Ϙ6=]]zK2[1ɳ PX~YA0fCPECq&e)c[8v96ڼ&1 }D|-P" -jG4R!ة*NUzK%BP ў(@ \$L `+@ =ou@ Fwd}U ĸ"@0aCC@ &aC@ ! !]_ ! @ "J\׿ֶwe6:e+􌸦b$_`"ojV]tEigۮ]?$? cRyOnjV\Vcdc^$/y~q5 `6$Ƙ,;m1lyd6ӹQsa~?nZL)ŷnyW,Y4kmv׶m`Ϟc_w-z}wA |Rޘ$f~~q0@  k %+GD#_tUb˱.XrW>6l Iʽֵe[{o¥+-[;>D-\oǍ78g5o?{gwrekfc^+2o~w%W+}t[fxmwn߱vdctƜ| ~s,ihh'7<]\6%<7UCCY?VdʵOz;gG1Fddo{%%{wm};mkoOOX37|wKE~˟˲cE|߾`5SgɒOqoyw~˶O~tOv!z{{=S_;‹/#s%--۶+cmv]:Gz=[^~~xO~v7a+W.߳wclǮ]g޷cl׬ZE㌈J)v(y;`?iyy*Jo fά1 X͜YۗuIƔ{pTUlmu׾tlKm[<T9/[mh4z5W^L)}Kݘ?f9W\g>طooeo˗&#~o`o*صW.9-M 41)uihlL?0 > ̙q?c,eYQƘ!e2VB~~%$I@Q1?):Yd G32t>~{{ϽS.]8k׬~m붒bW,_mWSSL)ݘ?f9W._~dY^b7o+).q] Tز$9ƘaƢ(@ dJ!}oeeRai'$T~eYp@___nnKIS 3޼a>/ޱ5Y֮yO)yu\s?4!VZ6kL| K/J'?f9WXŋ = rJ';'D@ u4e.@CcӺ7Տ_  mP@ a k 7Nso`^3󍭉܉:Z~KJr~_ηC @ ښb@ I `$I `$@p@ Fu#aCzؿ{ǂ%+RowēF-?) vhj |R+x_Ft!r@ twu=/r[/ I 3O͛?x}BI/#4$@/Ƴ>qD9b?$@  I `$Y6= l[[f8q˶htavvvz<"him b I)e%6Ֆ]ΝM=SJ!10f_`QUuomm(I^nI%ى=ҒQ3jwAvw.'M\havl{ĉ7,SFI2kukd)׎(x=By7ax5$4:w#w4 NZhHU^6!<L__/,ΙqmG6C`eY({Nm^V;E1B˗Neca36}Z(:|I ե&Ax0`(H7o˖& ~%c,IRwOW,NnmmDcM̧FSG{牓Οt:S޾E 蚆E0aRBgݐX,Ʃ5斖ko(0MSI0ơPh/ts_s``@Qaefd(pĉ[7g!m?u_$(#Di^@cY,Gr3x8xB$cQJÄ0J1!eYRX4^҄C- q3!sG2j 6:7,)((-BM[\ac=s ϺG\3[3݅Nc뭉D"S i˫Gg]ƓgǶ#^0B,)JI匪WܱkS;+6 YkF_0FSw{O0L]^^0X2,vw%v8L1Sn/-+%sۯJA 0QJRssn6fzaa0Naw}N4aRG)r[[{IIq̟wԩ^>%Omx7Lc.3Y5eryaa6LӌDcR1F@0Jă)gz__?o".9N$޳d%.'%ZeYڛ,˲,b1Kisy]Y ܹ0,+Ν5uZ(`|*LZ\:߯j,?TQC׉$)K,/@Wgfe lqcUlNnWf'.}&vːt57&2ѫ7H@x_~#~nAQ$$MPXٶqc.{=,^0Bc?{*&bC}Ä`xp_瓧$ۮq{.!ec׌E˛㛤5,!q}w+Jils$I5CP{{G<_vEU񄢪xb 4rܕwrʸ'8MM^s5mᠦD<_~eS82\QJi</**TW7025$4 LOh ˴}Ul^px~q\ u]$fs6ݲ,]MT%&9ͨq7{Go}]jzGf6L'kqF^TD"1Wf!n4/9d-M&! 酧OFed stǦMY0?~g)-ˈvNETGکIeKL@V8ϻj h,匧6/\i=6PaK$I!d:ȦaՒaaDbE ȺG`t߱'^9BY`ċ)K'wiټ4m0fsX<Ȳ$KڴyˌbrqZ\UhhhL$ʊ@ar&HCB󙠳&`px|U+WtuwןGp89g׶nTCbnljjmkדTO~BJhJ/YeSuuS2Id1V%4MS<&\#EuPhPn `UUeŲLD-˒$1jY*RnwsH\u嚅\GD"73YQt͒$ #p11jgSY1GՎRjYU;62$I,4Mi܅,cL4UU à*24 8ݝ~ʖIG` !\~?///+7YQsrs ]qj wN׳ooCʪ7T8x<g;Yw;nFB1B.t;BB! H6r/o˘EoCb~MyaB,*=j>;}JAϝNxT]ʪ޾`0iaEUUU%''ĉՓ&L{cl߾K,;06D"!.OqLH ?1100(Jm@ v0ƻM$Ueeabq#((-..:V[ ˙>+MӌbKҺK=Sdd q#BaD a!xr|b֙40$OeAFO C#aMp:D!4BKSs:Jsg刺{߿p T1R;>NU=K.D2 IDATq3sL^;0l6iN8BcLQnLeYe!X,S)vFEfJ2d-n3Z򸳳ztZGVh4K/]{Ns7@kCFC`0@ql6<t]0J;2\FrB F^iƽ#4ѨiN_ݮ3xtgk׷ѭ9k 5d?!HZa.*t|]ijH݆ FiTF$I涶?xѢ%??嬮!( DƦ&I)͛6-3[ hHaMn4x&.<4_xeec/3+jh j]UT0􄞈H ^8wk>;mB%< !|ޝp#$I%76<@gҤI$%a2 hTY9.xo^^%Bp(e9ޞ^]J].455?=bl\'Ovuu2"FSuuӧNdZM)ݽgOoo=s'>4Kl64Ɵ\E>#0 X^MDܞ4,beYnvRd [11bthRR׍xR]XDHJ#GdR3 $2\UJ¨iV}_FSBo}cv{g^OO? 85߻{cK[0(jOvkj#77[o嵛һn˹WP-ĸyB%E\K䋭;ʜnjlGFs[EO(Wں߶& 2cq]*#)YؐxoώҨȌq+WMttYHLZ[1WKhOo~Z4 OYz3j*Ã`UUbOlH- ŗ^*M((_3bDc&+hE0޶'mC%^ NeDiO0 r]Ӎ^MVYXXt:BbΝfΜ ϙ3.; n׌_zssh K.ᯰmmmO .䲲,βq4ý)ir_UkqG:`xpX푣܂1 h6$I&(}/@{)eT0”ReZD$]q31D$C*9*u/q+ϙ[yh0 <#]|E]Jm9q/d~pXɝUsw=.2tH{$K+x x  LZO{m-"E6=?yw^_(PWS>1llHɹ#3b\,OOlx +iZ6o 9N~(B|Գ=q7e2#;!LRVM0]|6kI(` ]o7u\i]2L#t=yIS?|^{@-m=}(P\P cUB5J^@( (cbq 4t `ٕ̆4[;-˱rv鹲1Rj*[UVM{NɫZz{rssdFZ#9Ht8L3tCӵԪx}>"Iٹ+T|!,)QZ4MsRImdyQW 18mHClg~M9!+ӴF7X{bF- Z+튫xIMDqUBf0w!d]Rc2qu:Y>I0#.P*6$U[5>!fGb)ZWݥ>kBˍ0>г|憀ںȜ6޾#//sz4C1ƍMMsfϲ6ݑoiiപUU) nҸ} "'^_sS,K`<3,)&}~MT zQJM ̿$#q$;;ٳS&0™bB,J%"1F)0X䄦aMlWgZ5ILRdR*aL"D>KL,|߁ !1c4MEULӔ%/wgRTEtCeL cha+U|L6f1lC ,6WT4e,tx:[';<گ3aiRF`Hn4u(t_@[#y.C: )I~$g"nH哊rlu!鶌dlCBg,C,L pj—{ cE}ddR_=~"?nXlԢIZnژ$3DG^~?(ӑz`6$ޱ&.t ?+Kt ƾ(*tf&i=rpףE+ZG M7,˰y&B{ 2}A%(.{VD"cLfdu~-  \Krd4&t PZUPS`ߵ%U駞*)sPn;ڝŦڊ 8UWTX(fKNV8U_?TTL`$Lj8&zzz{Zڽ^hjnӦ566:UrWO+8.(Jh{K/=s24H$頝֒\x1x+/{f㳋.$ 2M˲MnO2̛@@%/7#HdJ)wNj _ϛ4p}:/Mr$10&@-2cHIPFd`s#!럽d}:i2Mg7L/d(LP˄aS2-oy0a-l?&/h} k%I"WjHRc^ڑ>|jLqMt!yd$3I..ꝝ]>H/[|iP #wvvuvv#Ѩ.Ts7<#GN+ n61##~DG^Tί$M='yiX,AK*慂=w[[`(LӈF?YZZvG BU 5#\6w8{.æ*c4catLBܨбK_ ^x9uҥJ}^ormk|(UTIw~ p5̨o^BdYv:]- M5s o.E gMM-c;}P8Ŀbb‚$J4#^ӱ#SϠq%f&0"`Yq]a-j6kܜP(;d7 K aGw3n)1I%]ԹՐhFw0xqALejd{acB-_v;_o K'QD1F1eoBN2s8(&5 %z\w]uxKw_U228S;%w'S돡&xwҟz=ݟn̕$1dO6l;ҡy\;B^=xي]x>t.HkkL͖(w~|ݵ^uf~.DG^T?6~C4 56:K$`8ԕ=c2b3*{I#޶=C0*6Yp4nZxYN?$TE ԗsͽLfF%LH9P@S\Kփ/*+-xɕh;oi|WfTWxgO cΝ5b흝]KaA0!9]pj21ܜ`gfb[[ۊ&BeZn`_o_WWWE1sƌή{Λ;4OrFl$nnd:vYQ$BŞ^˴P&{:P.kUiH=\C@$,Z#FTM(y4TH fyA2CLP$] EŒ164WT&˄lv͑e9BebLey~iͼp`4nLx<ezk\_hk㾞1Hz>÷2T$I8%]:no7}P]:q٥/P9)~eI?uh4ɟ.!e #0a+2_+UAs_Ο}OofƆk%EίOEǏL^B]&)1M~xw^?$ u]I!nDL}ekO<EL SPO+O?t$MƊ,I:~~Y"vDJE9ֶ,ZQL9Kpu{~?[gycO,=궶_x\8=77'/B.gtȱ9gL޷nZYQcl"͑Xn w^Vdr*M~CJϟkfm^ءp[HY$]7$I UvJIDE'(%D,cL$3ɝ1L #qe#R_uT"K_cGQ0fj$IaHAt )w?x,ZBۮ[g=cC}} @JI~k,ߵLQVe|ލR*20ϮO@as:{aeWfěDB{7<0 tQn`4 A!>yƣWC#t#΄d04oIF`ߤ qo@c&u :N= 48\+f{՚R˙\ F$*5rxNz`Įб+2%yn@ґfNoMOcûV1ƾ{%K"^:ܵl^EA T$Ireͭ2bӖW׿rޞE;;/[F3!L$4xpʊ)v? B$lHx+WUYt:*+NqS ;cǎⱙ3fd9n3MI}4 n;\NEETEH㬨z%K䘖rnNȧNյ}>E+++TX=VܒW$]7{BgX&@NN /abR[{'?aoo|}L$o4XBrs=~,zգᑙ+JK_~eX"jRrKK&<(?i>)S*7^>gƿDT0M7tSe L0zUkf͜ԓWYQ|y Û6otpImdyQW_ IH0PPv@3eŔphzeadQ2-ټm<d7VMVzӓ#Pd9fvUcM'Ο7{VY^^vaMj~咙ehT׵_oUUnkLmi%ve:6d9ןs0VUUIV%QïG.oYFAamnnF *+r8D*++ >ZtaA 3H*FC bӧјiYS(eYknimmm C|iY3 //CoħxZ[[ UeҤIgf `)ephS;}\̘Q3UXm3 MH-Cn"F \OJS\OʒE ,:S'ƨE0dD,#ukל>B*dA0@P@00Wk,ݻvvvJ؉ (t0L85Pz>|;{{{q.(),--h1Y(I$NԔDӈ]X]dӣn$om/k^yHGu@P(1#d2HyZg}lƄbu*}ӯrODcr#u/:{mP|(pf b cf?JkH$D'0401+Ϙfh`:8()-%BM Ô<"ۿV>$hJ>zvi1HObp9FNL,M[~ffڻ7*Od`0~&P5hiiҕ|>D"1J N*)Q)2/*prr,MT۵3435m+-ӦitzכjSq*Ba2J %m*B2p}s˸\6[ܤbKLN*ptu%=H$ k׮IIDl@R_gJpR 2^9İߑp\ |ՔJt" &&0 tu DW3J$aE T*p**c$2ۉX: L"S|</:2h@0,)djF!kRaP4p @KCUKCMA6` C^І) _؆dRGEFAuu޾%+<SYͰmc[W[؇_=r@MM/!}ݶVa]TR"P >d޶^"ASGr%Ϙ}Y3̪ pU I2oxD !(ܬw/;-%m,heiFO~kb4 I`:v8Y"/˵zhk1h28MTI\B8)啕 ?|*)qJ9&0ʢiS-諨ȵe!H;2fF.w2&FfШTHTXT[XX3*$Jikmejb\T\LR{ L&yrPfih3L5MMԬ,KU] Lm--L,"YYٟ>%4&~w cHdȓn=gH7ҩ66jkk7%tRlqj v_>܋~]}&mkf 64e-yTUJ$: L`2ښ4cCCI`(3Le&dX,&ٔvhHIIx@"T-͵uUkxDTLeer)T[$fk=bjl6m dq$>S^n/262fU |}=z#=~[$gج,?uzn۷UW9\Na]t%S$ fSiT:sT:,fz4'CAAB.(( wsMKCǐtkXsۛ;b;MoKQ /6'If'ߦ:KZ!mI}蹞*Ӫ`0L&1 JѨ4-+| 5B"L@(8Bf()07fjbs.\$kW$:&5161eXtזPPXPIDl)㧚ih>}O KMi+շ3׮O$j,6:ҳ ,Kb<:gSH)[?H`D"*"UxHL|Ӕ2>H׽ӤĞ'9>V;ƛxeIi)1E+"鵭5k֯9_s-y4t GZ#[/5MmMQZ**ʊ NQq1Jt:Pit:BѨT*Mtޠ1$ d EB$l]r˅B!Fn"O0s1%U@_WFSS#)9J#Y? hYh}Ou^4T(ۭWa?:Mp"C#2LTPY 1  ~Qz{OEdr}>]]_rE B*:^ hM44S *$!KRRO !"'}s>ٳNj&~6 u[x+q@ Z+CB yH`gl&D Q;#D㡫ghdk¿@]=ƫ@|@ Z~Ql #BzAsۀ@ тURBFrf@ ZHD+tn|M@  !肩(~@ ~P@ B!!@Ȃ<$@ Yes=s!@ ZݳsېM-^8fHOJNMXV?JtIlڰC &ȑɕ5\@ ĝ?ښx۶˗,d7w/ʹct5SioRo{*<$/c^%%'uk^>:Hwc÷w̫I66lrյ{ll\=܍&%'wppcђAC7ڣm" !u暙㐕<.6FGscE~V"\lO._ YtEFFۈ###w+N=׻q9uFcW/xB!YqIw#nܼULЂF\_j%UQ7CxCoB@ w~>>{E߫ڏE1|ƿ*wm0mFĠq/>?okrsGs kׇݾὅ̻u;KL<9"pMhr7 .W/]h\( !1 WW{?~`ɭ^~!,((LJN#ɟ? F斆u|Yйs7w+\]h!poSL&O~Bضe銕+׬۹us !$\W \Z׬ZI$$nD@ &JliVAaq|ꕴZ宭˘A`@?;5aС]n^0 Ʊ'3z[`>aק˘WumnBQ}ZwꈷgT}#CCG Ž۽44lm555RN)NSRR55 ai)Nc0#x̸  ʸ\NU+Y$m3xܐ (Zşf~AwRPze+VJj`ͪ=B BSCC,ihKyy:DFpʤVڊKi4* d[Q4 H$aD+W ٱk]{,-7_CшTTTtu(Vщ4RԳCLݻ{w?7oVSQQ|>_II *++ "@H $ZCΘH$I5.R9z o7??_[K B©T  #3@BGgيIB buv~ѣ$ۡa^^JB!UVV.))aUVJJJ!aX8'u6ɱ={Npʪku?6ꂿء=ǿq{w00q<,N!ikiWB]==p|DSg͙JDb1ǫ;w <Ͽ]x_oڰnBy*Q@(eKYٳ卛΅\ D"]znuur.Xkc]8=wF 1N˘Qcy<Nsp'H Wаp'umnϭ.;D"yzzu؁tw떐,SύXWWWW"ܰn9{!^-YClcn.nZZ&Nv:?RRVɱk;wn#{vnʱk..U-a_{:9vX~cMϩrw,rwUo/?n}.NG DϞKVӗ/,VScgffv .Xkwmu]egW̜rahr7gh.T@+q'H޿nTb\|R/;OSrA]4zn&\0 k=ߛ- ˗.\TYo޼S3U-$}RJIbR߈TO:5P. Gx7bXGu!UE'I\>$22Y p 0LL))X,n:s[9?V] IDAT8:ZUU5c8ᢥ`dhx7".]rp@LMGr@dp"Y=JIDS:mff:"pݵD ;ueߩc"5޸yc^nnvoS&Gl0L,8;/cw޼yۺucծ=M_YY6H/)K\V~n sR.!!jEX,ʗ4PUhj.ᠦeE"ΫwlMjp%됨T srr\]\./H[[p& ꒴X,Vkg׉H|iiMIhM$U#e~A~Σ\|!v6DZCCWc[\]\]V5H?kYVW~8Kl̒.h$xOW!!j**g&c:?e[>|u/TWgڪ+WO),Ra~XQQQiog+$nFf&NMK=]]RzQptd20,@j0KMM-3S#$ rUU"YBDHX*ZvFZRL!!~hvK~rοYFhI)y&5Lی9ۈf:[^|J*w9o]{\?xD" 8^M沺meMML^y{7"2}bڔܕXj-VCn/_._IO?}朧 8w~!eeԴ*f$O,XI¶t%ed rrG8D"WVVVVVD"W?Z[INBBX,yIII~7P˄&c>bѨbS@ԃ}9v6򥋣WM/\uoYY[7oԩCe}5̛;b-ZVUUkmG((,cbWrgw/%V1FgZYZݰ}2~Xy^,qKU~eeJ:DDťۨAq<)9fZZO*?z ;~}uun<|P͈ꨵ VX,=ztyyyVV322X,ɔX~ a&&&_VTK&qJbnAnfJU(I6?4̶e)-'WQo_vkHӃgLH}5u7H Xkmsf͜3k$jURb^b2wdhhx1䬴I򘍐O 1I*Ȕm߹;kǎ{ ߸5h[L3 GݑrPr_(ܯ 3;vh~Q VH$*//2e̙3f?}4..ٳ$D"FEEܹD"h4i:r̘1 &&&OZqpph۶m۶m*zx777kkk{{gϞ@^^-,,lllN> ߜ$0ﰑ3?IQe<܍yp2 vsIhB*`)"3V2.֬۰jR=~}F ܾcDa< =B_P0jls7 #{prvsyjА%k VXֱC{ HAٷwwy۷K..#"+;:;yu9`!aV^^'()(̙3#GM˻q.>z̙3c2|zz|~aa 7ob6~%Kgggڵ+!!Ν;w„ 3g>~Μ9&&&W\IOOwrrIr`*Hd|M.7+tIaiPhPh5hT=ej60!fiIʯKS!f>^5RZZ;?ӻgiP^_[ךU%jK022<}hffOnf:a/_6eO{?}t_f}^lKX|#~< ,{ :/?^ u;HF١QiwF  9%0rǟR@Pq)o߼)fg-/f%@ \ wJJJ"##/^d2yʔ)AAABpРA\Pbᔫkjj*>}4"" ҧOyfdd$zzzֵ]^9` ^^0chELnJWz~eeeNNN lU @8`ru/kZw93+'$&I_ֻl+ESCC,ihKyy:DFp~+*.3nB2.SqI1F%2,3p k>kwr%ź_Ȏ]wciaqZWʒF2Q$U[ZspI늖X,.**"\z#dܸqݻw hjj RUUU---CCC%e1gyA9FD)!qȑ++l+buv~ѣ$ۡa^^DZ(r\ee咒6[UŐ3&&III@ p8, ϟP;]~Cz ?ۧ䲴W/]pq۟;9v>v@ ܵg1W4ѭyǐ-dL(5 ;~.S pjCUUU__;vXB,ٳ' H"F,>|X B555WWǏO6֭[>}?xڵky<^ppŋk+)՗j 0jWjeKM{;k]΅\ y%HW^9bаNߝsĩ̙=ظKB~8݈^pN$x<3,Y3Z[usuqc8lXQqD"X,>yP( o޾זc0 μx##Q-zt=d[t}bm\cWW~>Y_>]mv^|& DϞKV*/qm[jjnb#׬Z1=xcn 2޽sd2@ѮSsOvqrT>={ H$Rn^!񐴵~8޵KFD z邹رmsg{lQԣ &^TZZ:rnݺ}?fá7 M}s󜪦ViA~rOW\0`@]Mo]lߴOo_y4o뤇ﹹ{d]rLW11w%tjjE(%xΝkVk2*\jHJNvsJoҭ\@<̚Pm$`vjccc/\rwrnaeDn9In%.}nfp2scՋG4-CB 1k)(zϲk@?SS>?<5::|7$\߷EEEE@ D e̫cG˻Q:6pޥk׮uww0{{(///}%KRSS }@ Z8xѼ(&L~ω˰0 ===YٽqoBL(oB6}ѥ ǽz:WvF2]dCN޶S;1!1I$q8X+++ccc0 :Di4ܷoH$<$@|F%Eihw_3! 05799`ie3xxйJ SR P(426#<$n'={T?dJw!ŬCDp첲2:N uVVmD ď̚ޒUU~54pԈk*OJһvyHW/3DkXZ٩Eݎ}-g+} ##HL70n/> w/-l%)_5M߳c Z (q?J*715+EwO?b`T+OE~{;dx˄/+--Sj-(f I؃@ DSS'T5I~}g|8D=[w1Y)Qwok*+|ީ{3nU"ONNWm90)1޷w}aTU%E&n[Z٪T8F&^<.?*F~aB?}|kDէS,{)_o_4Nh-WZ۶,Td<$ 0???ikuՏ4YbRt٬v@rww=zi$رcWqo߿Ҥ6@ B2weWo^=526~ 8^}yL5fɔD"g p'-,//c2@$fX|{<)!NW 5%`|GY]]>} LfrR<}xն]Bᔤ$Ze}kn,\Yk׮]t)u1)m6T=lLKmK?~C=Ǐ?" 4a\ˮ@5qɓl6{ܸq&&&W\IOOwrrlww]v%$$t!..N&Ν;a„3g;vl̙>|iӦ7.$$dرs̩]C D pd \"5 S$98>yI";98'%\~阙*SO=|t&CDG|x#ޏ{pę$)>mIIDL8yNdem_",bbjːt7̛;[mP7rHٳ'{z 666666EEE@Dܶm۾}RQQ d2jv[#-3/E(ysB 2p8%W.}|`3'eHƇxkO=Ο9ލ=<}/2oԬ=1V~~~nAsM5y$kss2kҥXvZhӦͣG%:ǓICIIvDDD߿pKJJTUUqOLLׯZپiM]zzcjװ>qWK1II_$؈Ç PzquV߾}I$R"RRVOsV BN>FMQu>~a,K+{j/sK 9y%9Ey9yY{HuիWsܹuS`蹋/_ﰲ244lӦ!ټy۷ottt̤\\\s72tss;vVLRFg h!0@([ F( qX,b۷{oܞ7/θ>f (C<ƀ@ 76I,s8.]#7^yyy.RQQPԡѣO:%g1 ДQdT-q^xavm 9OᳫDNM+P"8NFFXYY+}`t%%%:NڷoH$=$4ˆ@ ?M65gGԱ#ܼu{7]111n9TXXeeet:H$h4 ifZP IDATǣƐ֯ߴ|b=}z?{|=?w3g%Bl\˫"ގ.wI :𯝝mAA4PnW^pӇ޷o߮]nݺqիW/ϟ?Wx 14Zf<_rQn"nܸr޾{SZث}}ܕYrͨDϞdY tBP[[;:Na W624xaHșe+Vfdf6ލ|j-<0##hL&SCC@CC:atek(6hYQinЯߠ[6$ph4jbR_/Ϯn cUUY߼ *m{KKNݽu=B]'̲1 }}}}}}Ãf~ƍcf7X, fώi :dpRrzBzz9I$R.N6obXvFD>kf~a:'\v>PܵW6dА%/?K"*[cמC*1TnJ'h]Hܠ~+ysgϛU.NpV虳^X@VVbB@(DvFaa]קS-/^|hvQ'}jFZ깓GZH!1p< pѓό=V<55;^:=xiɲFFOrss]]ܰra~fM}/XqW&\33'l۱væ5WgÆ޹0p0ϛzwtutnݺ<$nPzzq"&ސIP>Bpμ?ʸbD@ 002(?eff:a8wϞF˗.8rjlvffX$>r\,xn `llÌ!m~_uPϝ<2sBelOHLښD"|cc۶0z:Q:0i Dia# _30 5": Cܼ#^|xzz܍t*<<~ ANxHIɽ|`@~NigqbO`2Tiղ%  Ʊ'G˯w/?%Ѳ*Аp%N̠ pͿ6opDnnnY nX_my7Hǽ3$jǎ.hnnڗi+ڭ4p'8y2c4zt71m;&:GU* …L0^h Zcӡ}~}ms_k֤Q4 H$NP(DZ'TT\O>?kμY,?X~}$ZZ&awkrI"^aN-PPQi"UiՋ1x<:`3chck%rC%yu|:NtK+.l #$EϘ!uBЭۡ¨uhoaNg2IIIӻגE Cj|[fnҗ~l+c}ӯOeJXjŇظv;yjiiܳs[v]EYyтҹn\<{L]yI3һyxfgPޖ5< }'GGNxY٪ffn]]XfUo5 hڈ&mispq!,umi NQ!okv랟"hͺ o޾/䬴<))WvFD(I|IIwtD)˧;/ny7"MmASzq5afڗZQLmD A:*Q+%vfьlߴF$6q'H r8IHEPF gYs;88}2uK0̾SG3SӮݕt%%Ǝ! M!dcHoߞ4iҥKҥK>>>=277RĤNNGSRP(\`!abL$խt(4*&F9DӋ]`.!3*^rHpwѮLҾ$&F_5+֭Y!Jc 7ţC DdcH/޴i@@@Ç7nܸo_щ%K ޳f:~xvv-[ƌyyy'N|N_bŨQ5믿jkk!iOcǎ!C,X@&СC:tsC!BAs["l7@4/M3TPP@P#NTaƍ{{BxH044 666ǎOHH CٳGAc/5p#01 Bnj?wHs@ FiƐ455E"QAAD#}Y4AIGeeeNNNP::`0@]]]7DZLHT#c7*cFC ' if_tIzZڵk^^g8{6:J" "Dck415-QI3vĨ0VЈAP5z! >bymijjzy@\F{d2Dת@IdY`mkm~L$lnފQAM}Yf+((N:o߾6 ޳gڵk%ɼyꫦz9::3&1Il6[.bmm6+yM*HDz rjr1cܻw^y;zj@ {azi,//Օ^/ͥ(JM-Ix<ӳI8qu͇GGG'''Ϟ=tҤI A䤤[֯Yd*>$űsj7A$srr߿E?s8MMMUB sRr"{{{I\nǏ?>))iʕ.]RsFUr$\ﵱSsܦļ|./^XY,LOOWE.A l ߿4i$NKK[`̐@ .ͻ?r$**jƌW\8p;뢥iX0#0/a*HmmJH(@tZTFtttv=i$EHDHMҗT^ mUTL&>/JU @ NH[;nܸqƽq4"!GyHhz|HaD5@ ]wCBA] T7G=>$BTV9z%Ǟ={U c&JmՔ4aө )obI퉎~j)z|H4A tBϜϟ;::Ν;WueZɓ#F5Փ>X@ D=RRR;Z:iBjժdK&-$e>+W@^^. 6899իo߾wޥ+7oiiiyСf:)ÊCBBBaaaQQѰaÜ]\\&Olmm7meiiyAg@ Ntw6kcF  :5ܧt}AsKkp~ASMoU낂v. +i!=z.:}Hrq---qPnAu8khh4ZQQlٲ?ɓ'+W+Wwo֭~ό&N"f]MOzM{;ۯGeݸrVƐ!_TOYr3eWҺ A-O$2Xt^>ov' )`gg&}Hr|Ν#F4^KKK[[{׮]111111yyy'{zzO 8U^ c֬YkxZ@(^t>ɀ(f:tu]A|H|_A_um?شz='N0)PP<,<3<(2Y.lho𝁾>˯G\2~dM uu!zztу}咼g0 ݸۊ1c?O|7/_'zrjrz?_ NNNtmE5ˆ!"$$dÆ Mӻ|7luVKKFO0V8X.Xb̙<d*5655ݘ͏rw`xG+h .kHBtC4X-\|^UW-zrˊ$?yT+3p܅Kwgz2=?}ܔVpؿcCesTlB>$O* ;;Gtevv6]ܔ *F2,9>?qL&۸qclls~gXӦM۹sg3abbBDMM m$UTT8 AG{hEmwއ~9At"2nt .>$UN*V-RTҗMtERЁO>ussS_߾}{ժU}ݻwodzzz6%\qXux v1zt}?$@ : G YEm{eS6(m``tо}*۷K^zx]Z0zrSRRnkk`kk[RRBnݺw;wp\777UVa.@%gZώw8$ Z=U6#nݺue:#ضm۶m۔5z8•+V>899)6?V{^A{ZS6""۷o޽|Ynݺa|bњ" E!aV[[۪$R0 )2_R>hϞ=_?{etuud2ِ!C7}V@W(P6qҴU4bݻw{bL*tCN\.߸q $$/>aܹsgd!!n ݻOMey;!1;wfff>v=bbb455U[پ~L3޿zqy<+]0Es9uNKWh~~~*b虼I68.****++|\.o1_"`XzzzfffFFFoFgf5C"UyŸ33n U,PSY!23SwАICu֨Q.\QPPУGEԧOԼse!Krr9rǧy#B}wJ|HLGGG*Ѣap8w': iii&L8z8.Y,Bici=!ڀz ե(RB$UftE.ӧO'NDט?~LgE z"Cb0A>-[(#Snܸq޽b\SĻBo:!!ԩxō7˗/_N\vb͚53gtqqa0SN?~|@ h+6LJDQTYY٥K9U*$?s S19x@4O\gH{qfcNn> O4W:= 4<ų/?<-%U$۷YAAz'طA.]nOEQzߜp/رcBj@ LP 64x%K'ީh%IhRU I ״h(<6y*5ƾ}mml.^ozMڗ ˳e2D*DbktGfffeeH$RenHK@ zN4FZ:{-^| |Μ=G 8\~O@7qJ_PȉammPHȀ3).^ W) +x L_,8.Kj"? @t1Z qzQEEE`Oɺw &fwP[[p+GƯv=,_okku֩į/)y,ghď+2ۥ;?n(U&hɲ֭~bCBM*ZZښU+ki͹R_H?zLJDٳk߾ttt~dzgUWWD"\Q(ݐCj>e׊xbkEWGMc IDAT\.߷Ш!%ˇ |>?-=ٳ`Lv%(N21~f\xyF\,XYY^zUYqcF]xI* G*q9sǫ/(28F oj MP{kV OF!ZqP4h=z[[;ܻwC8_*w5N; W^'OTE7ԙdW˘*-dT*Zj7D9H>+W6j$' \ L&r *j'n߾`0<<nݮ>$U(**6lɓV6СC //OKKˣϋٳgHH](,,l8J^^M,--c7CXDDey@C ? h-ۿBuuu. bמãat |}`pdāT*]¢"e9l[Nƨ1oIN3jdbjbbogwe8u:^BrSvCPf:45jTӇD\.vrr++v;99xPD MMM%I2..n۶mkX9o޼f4!!!v\){ p2##$&&.]td5g@>b@Dԡ:ZD[ebf! :ZDWm[|ȷ_EQ!˖,zUZfq{`ͪ9 "Ir1vv>$kk+?_ޞ>UXK`ݚU##6|_.^qԻEYrm]!! g@HH} zmmÆ nM9kExk׮|666L&f`444RmSqH zjRR0YfƮ]aeL&ٳ'5#IrڴiU^^@lqH H`bf1i +ɩEû[YY=ta /\0_qiddx0s)ȴ>ḼF'5d㇯Bϝ,z65'?H>c2ieeeޮC+V9sfjj l6>0':ȇ?DץsBss_w"qqotќڭ߲6TLHܱcWuAƸzٟTUz{<p\n jjjhK̬XiӦܹ|@3LmE- @N ]Cl޸^__uyOh4AZ6Tp=r䷺:)'&8~ԩ^A]PPG<}b1zzz[nڱcѣlQTjj'rZCѭl6[.bEm=-@t!6KW_aajN36H0 Cqmm d #88@zN{Κ5R5pUV5ZYRR"I.;::&$$ҥKCCCf͚E MNN )))*^: *W(mPONm:c$A:~;SRR\XX\VV)%u266P(r'似gϞ޽4ZY.ZI999/:;>?yݺueeewޝ9s@ &^UUDC|Q+jEilPDSqYEM2 @u% m]]ggnTT4a}d߁̞='000*J.[֯Ϟ7cfFڍ!yIeefn' @4ON#Gxt"=rDWh~~6CH~~>glUUU8NQ$Ef} srWTVV^|^ 5𥁁{ذijj1&97b DBoz'NpqqqHR\WWܢ?bzaâY,GCCC SyAfB}c h|PW>$&;vh?ss;w={^^ p"DC h3xCbX>>>ǎwEQ$II\.HuuuB MM'OXXǏ |HfBы:j!q8SSS#HPSPE$X,H8`:::o?@ z"!l]]]---3o'3p\>|PI'>q7v4]|i3E]/N{@Jq);9r0{hQkd8.?zp%ss3ho+CԠ8$h3C*,*b2qGTlfXl60 `2ϩ9  S!Y'!EKEX"0ȈAYݎ>EH1L&`06 @ L^FFAFRUUInT@Ո($KBAVV-_h#lqΝofȑ\.=zݺuiii@*Ѽ<sUFB//Vik׮zX⧣uA .F^~ukC_w2R֥ dbp\_rŋ9.^n4&]򄄄/Ν{gΞ=˗/555D.7/GCC# bcc[T%K KMe⧣uA .Fk_;m/o@lɢ]Bbr /ĄKPV^ajjף6lؐqS,Vke8HHHx-[f͚c```hh;}ǻwﮮVœðq=zvsssssp]yy;;;C5yyyZZZ+QSSӳgϐPXXXTT4l0gggɓ'<[[M6yyyYZZ,&-j!QuL2FB盘}ӧOӕsٺukffPF9!!v\>O3G@j ux1*]UGW:9nEt(,}pkU1%"(AIo&b &Pu ;z$ND]\PXKfE^s&[/?uH {G;k+#cc&y-Ԧ>uNNNX,RY+V$%%9;;ikk72=55U!6//[ğ:m˩] ~(/+;zPGkLhEGkxtœj9W(}e_ D@ĘPB1C, ]I 0y/xKT~?}fIHKGIa `$I GcFlq6Ǐi|(}ܭ,LFYZSzD"d"*#A@&rpWxZ$..n֭?ӼyR\.ٳ'A{d89::3&11Q ar\,+ zzz[n'bǎGnpBAyYYJv"ΖEnjDF)\@֊@ &"L(D@$$TDHo *ZP0֧)Txr%f]1H Y,ɢ" `egR;B&'Ny3n@66@l=zq\(+7HRHT\\loo* cͫV633zݿ={FFF?8w\oooKFS΍TXXװlkk`kk[RRBnݺw;wp\777UV HI>=˥$A?gJI>V`E$IIEQ"IS) (eEK {S')y=è,E|ćYF pΎ6֪G8$ #|͛7Ϗ^z˥crsqzcUUUty۷o> 111/_ˋ/'D97{Lfzz:]V 99)ݸ\nKlDC^o0ysDtQ._~檪*\g2 ?7v dێm?3RۉG,:%eiᑭة5# |,"/]Ji:)ؗT)P\u x1a'^`flhg>hp&rEv=(tuuiTyaK.df=ieiiafTsSy/Ɍ\l>dEdW^eggϘ1hjjVcރZ?a.ȥ+WH9;j&; ~#ܽᤥgҟn[g W^F 9[$$I{羔@@崗 *=,<n*oXoI'`kkB^,V԰0 ʊ7q@*ף cǭXQ$ɒʇ=zJ,;Dn@5!1 MM?wǎsNEER<;;͛z?~fxK|ÿ amC\A^**z o ((--aw-Zuk_(9KWߍ55L&S___ĤWZZZnO?(FZP(|7yXx!#`Dp+x|Xh‡/^ VVaa^my: :ѹ f?̼IwAыbL&SSShСuuu"q`G__POO!!7YwoeYn)nh?lmmnehB۩mA #CC\^]]cd&pEe]vz #-Ȱw^F55t7]+| 6L!vL&";2gbw{'nڴya!-4j!ѰX,---CCC+++ggg.r 6XOYZUo|HEee&?z:oˡާʕ_D 7 !3nʷdT*Vkr lblxʹ7Ӳܟb#Klw @Q86L䤉(GK+*='~4^'gΘNQT~/_SUUU,`Hd$EQFZ" IDATHKEa6#. Fa3oᗞz{ܵC\gðТ/==AyϞדu}innv  ݳݚU fbbjoggmm:Y Æ: } Uy:9r**<^-^!!UTSSS3aT|PEQ[SSElŢkhh0 LXiؓnNeP$(A7קu(W.cc*^SsA2f1FINnæSIgm[6o۲.;;9QC?~IϝCF1jD aJ##C)d2RQ.)736eY)_VWj_ԁl X,fP??++֚GMZ9_g!:q͉=5ٰ?='(d2DYYUE422$M455ir.BBtn"]iZ0iШ!c=w[]bUFB1̚9p¸Qo#YWP;CDo@"[EaaK2\Jo8㸩݅ Scuuuu˯@Į 1Ԩ .p8۶|Y 4X]2.rמ[ŎMcu;!5Ý;wOjժRr=Qm+EQkW~/0_Z,7,(ML~QCrG}hɲaw},/?~WK7332fxnk/KW+wr+]kWyDpjC( \N-3p]vw//,F; z}ˊ  _Iܡ^0^Yѡq7W!D>MCB jC"bڵ555o\xw]4@TS3!aI||<ݏn`sD %j!򚚚@Da p>hѢWJ"5jeO}zEEٽ{‡4qD33m۶빗=z^YY EEE|Inn.a˯zڵӧO!CF5gΜfϖkFE$Ϟ7cfFڍ!:$Vfjf% ۳YH# O:7}}zoV5 M +bS01R~ffuuu}mmm^*|xĉe˖… O>]\\jkkgM6-11qʔ)-aݺu|>~kt"r|111elllhhhjj*Iqqq˗/:tyX?S՟$A1n'Ct!~D Bϩ-H^֟3/+K( 3G|dbbh6cXӒaشiӳ{#55ի`ccq1cܾ}ʕ+0vءCҝO>}ĉׯ˼)z eeeiiiPWWwդ$`0f͊ݶmۮ]bccrD":fݿVYκDnjh-Dw'-맸T ߿ߟǛao/7GezeddpX,V>MLL211ifl6`H.P]]=zh ~~~555l6[[[ ̙30<\$WX1sTd2 >қ>twwW!`na3:Zv':fEGk@ 5y`ɊmYFR>$Hj^ cTVUYKkjHp-0vto<===??3ߌu֑#>jjjzy'''EMmmL&zzzE={( 222M}s6*bM6mΝVSSCIfffX,DRo5hs 359H;":Z<"$ '=|XU Ia5Y R$1HOc0 {yﯭZZZL&cb֮];uԞ={R/l޼yʔ)Ս޳gڵk%ɼy+GG|ggϞ7o^jj*rqqٻwoڨTOOOӋܺuk||>su|PaWr{\@ ƧNpssyrޅ .\PYlS$''+lڴIQ޽{*sA UP 0d1 ?p&:`@ cskO~MVQY~?p7CܓOf6tx#6H@߰%),} Z5a0""`;=zji{4V=[4lio=nʭĮ:$I8rH&Mp4rc'MQ%`hbLu裏,..c0(`,bbC,]=zSS@tޫCK_Зz4Ïy_P0rÆ>ys%~ ð}~ش"bȰ|'Or44K}1ne9Ay6YCCsɢ/FDVՋ晨NHm>ߣWƍ+PXT(9sbظOUGx T{Ogߞ]{ٴbGÇ?̩`0RRRRRRTTW[[bD$8`劊 ߮O?xI͝fw>Q[[p+vۻ|EzU1$(0PYm.ܾ睿>C[HΏ52 v_.Iã}'M#G/]VE5|PV?h5ȱbji[^aOf2%%%%%%մ- FFFRZ#!} B_|3K1=vڧsdEQ*2b}pSI`eezA 9 ƍ~fTyE.&|xm!=HIǏЋQ}"ლ2ibw Xh>=CbXFFFrں(j@  B .k55L&@766fitttB!N6dP$TU ,4D"ܽwdD8}&y˶" v}Pul~m dX,CB DBGj7Ȉ :H251E"zz`blx^qo~AA2?7ԙdW˘.u8#h'~g2`sD܈/am&@o:'jˆak --fA 3> _wA=0 ;/\~;Rt/ Yl9A F~#LrʘQ]\I'MI=Gbdrܕ%#88lbl,y ěT;0U!BP j%"L*㲆 mj!!^cۖ_,DQThH%^j%Arm^X*~μH7v׷ϱxx667deeIdqav++F ͍ecc;M!z=|9vPEwEKUewr{xG$77ð_~,<<|ذaógϒJKK7oc8^}1RfDqq1'Ą *zM<d*n1556f0MMMzamWen@ D"8bx +[L:idS   A/@sS [3Lґɀ6$Y]]ph===???څ`֭TSSCWVTT5?6nFA ΐkEjAme]uyM+^yqeiG綜S!5ѱ&).k]ve(| /vwh%XXX5:ڵk/_~ (޼y^dd֭[ ;v=Il\.:JsEvlktHTi'O2_- 2miӇD 35};㙃5T*[Xpvoޟi3ܽ;?++7a=ՖS,=$AIA!~z֊mKa9رc WhΝ;_YYaƍx֬Y999E 8p۶m%%%򼽽Araa#CFSP&j*J95v(/yގ9OP<`۫6A@q7ڙ(QQQQQQ mllk\.me\#LDL&3==]!VQѭa2. PSO/VtP(j޸&xy\r­|_cF),'&aX[fБL&+ (à ?֟A(R+bcM!6}`Be4%0*++jhhT ŏ=gNm۵oV勬̎\ڷc")O@iI @(H,4uQ^6U>5`"Ie!@Srڛi7n8>_AB胙8y]܅$I  쮬iK5yIPQ^.i[EUMM-#411ʺ߀XӇ { ;v"Iа3Iŋ:ښ<33^1;upr){$1I-rp5cPf0g۶mqqq/^fffRejjڮ];o[>}|=B!B<}bjjfP(*!>LiQaHo.ܜW/잙abbjm>/O7F1.GlZvV3i b54}@jSf5xsN;z#$Pb.ZR@PXXh```bbCG!Z׮$?~mnnqL#/OxL! ׮ܸvE&_,_rY;wc(wTnpl6tС[n:t000r\s=_,R,m,/Ox?)uᩥ@,slMmT;\S!qkmkjKvBtt?E4IS*++|!';[CkjS޹l5?tnEyʛ[ndB">n|lnnT3k0ICLf0A+[HIDATMooѡ&!B5fիec첔Q6 $aS:B!k껋*eS!uIEaBpС>K*CRˏ.W3k"c,!1I"!ZRvBJ~n'Y V[:W~ #,Afv$sep )55UMMֶwމt`ǎ2B}d0I!B yvϝ1ҵЯe#liފ0'I 3u!\.ɟ94M9u!<]4`gř{4"ūLQIiٔEjԐms8 |җLԴ.]V egdOIJ敹~;~_?`[Y 7Z2nuBOiWCMl**K_ˌԦ_L*53-~8x>$8 ̙̪*e  JNN S_AAfb022.rbG XSSuG!Zǐ~Y['}x-W/ɢ]n_?CWL0]ѠoܵUK֯Xs`صw]0ҚM>M#ѓ'h.niܻf,ݽ/G\P_O7foB\bgkx3z_+E=wA.u_;SF&䜽{dȳ`>^K=x ~lS115 ~s8΄ /`ގ{ԴK6mH,**b"Phll\8Neeett#jQ,"^ ?row~Zlݱҕ[=ݳa}گg݇G.;rw8yhn>g ̙op݄-4;uxz)1( ~8AcG~;unԦM4Ǚİ?eQ4v$uvE0i0_USJ] ]a]ӻEQ,-M[+=mGI/zě2duѪ5j"##ysJߙ3g\]]Ȉ O:::o!!!$Inݺu IYf8qb̘1 uG9tPX߯ҳryv߲݅}ߟ9δYKΜ2xk}{ugd_ hkc(9ESU%Y,8&d0ѣ_n c=!f$u4IUcH 5Ix$QTzptoܬx$H$jCB!͎CO>wK.̤}o܎nn]/GO1%+-͙IKzqciVL7jLwS' }=J$nGMMmwf^:?/ 9CƎ:wꍘ%L uIn}=kki.[2}ZknT3$&p6 k''B I>yJpu4xIkB,{UȼU!3Y,s}vo[{mn:Zwl~Ţ+I61miJ6:۩Uה`,讚jʤKsȧ?<| |jƐ{jzHugi4ϟ#IQf|>%TB! |UVd(ҁYPqKWWk, s$i s,>L~"q$5s=_,R,mRTI31v(/{TP0jYS{?0G$t#I 3 wyn4g6BI҅n;0{2w d?ʣiًkuGIAJ4B!%ձjjfjniD;&O*I !jT!ZZ% BvRzSwhUuTRi5uBUK~򤩻>47е^pDdYҸk&OG2 !jq<<pDD<< NVF𰟗h޵b׌ .U!P>tHB|\bB|Sw}K:QHxج )!>{U^R;wz4"ͷO|3}$g]ؿw q1 SΎ,"׍nU=don-O2mώ`i0trU ! &efƏ07]cekGSfsӯ'Nrέt֭]3qױotecP!DŽGd]LS07K= 8ѰI )H JL _T/B/F98u~a"SSRm6nӻ]x_jni~P#'OJ{|{#G OMI3u(_FzNH6wpvqڽݻwi?#"ϟѻKՠz8yLA]l[x͟E  q1?-^MQ3ظ~͝W$>c'~5jKK["$_ۚXͫ|fGO{lw鄢|J*xl;E{Ş=S56` EQ.:DQ#`BPh<8txu2EQ"rB=]݋0M>y9woo -#1J`ffųsQiNOa^leLΕKȕCV.k˜')zod9}2} (.Wy@:]@!UۛadfhRs6Zu_Uɬ55%t'&de>+RL4UTãB*pARRXN {!Th+TQQ֯_Jh !PR~ǴDz3:08laÇ51Z.G5DE ~()t1s8"ózB2%hWuy_UN; сG?vZ<.)!7οƌk;s޿eUh]5TQ^xxzaBM#epn^}@!>Ccr!BR _5uB!B!daB!$ #$B!Y!!Bod!!BI\!!B1ѩ#`B!GB!txB!d#BN>IH _@k3v o0s1Q3rft”Ib=գΓL+IENDB`PK':-Pictures/10000000000000420000001D83373369.pngPNG  IHDRB-JIDATxWKHQ! CA`PX bA0ڄ 1E⃨hEe(BzlD)sZ_83gfsf(1 H$iI4$ItH.K(Ʋj$8t^E%www#ggg%%%qWXXxwwJKK/..~uuusssffC'''===Nr5 H$h4IdO> MOO㰗l6[(jii6 uuu۔}>@ qMM dgg)}٦&Jl;;;Ad2===UTTyT*Jwzhd@G<22R^^:>tRTTƹ<766vuu ϣ%B:Z򙙙|>7P\\DCVV&zC@zz:0J2\hX,Tj ( `4Dz#ᨱdiil65+`\e/Р|/P?pv- Z ߏE# a ..?R???Ѣx%q(jp hzSٱ8|/++C}}}777(e2ё*$277%r0{1JED4Ž='pUUUX4ynqJeS\m$c})$ :IҠo5^5IENDB`PK': content.xml]͒v)`Cikny4${Qʷ 44CR}n$,y?I@2njHNwӐ;Q3fMlǿ{QM__}cǢCYGn1?P}QCw'iaP%h*w#vƶ }H}f8T3滏j $rxpӋ$a1NiKg]  q7#qVՠ.xЍF֣QIcoDCe֐%n k eC4^e۲}=M`o⟷ozsaVY(/Sgeb\l7\Љhknmln8μ"A;-4|d_lYcn߾ygMG捝#9"kWi4`a1fn0-3lhu1B;#4P33IsuFd2?}h`Grrfa( $sì]B od4cbѺM-_~#>Hʋ@ۻ7bnMO[y;[<̻k2ko N^i CcӠi/4 1v]w0X2Py{: G|DS O!~$o&+F:]H8GUdJ"]X͕P܅$7kK=&]Kƈv0r(rWcDZO4r96hS1$׹cQ_c#gOQ K{wzw_w⺦}~1t&W#\(°6,-}fYe~8uPr /Fb1mSx*.bJ5:g.+f&gcԱRia10? .!-bf؈);a%t I9ۙ2i0+%M\/6xcW4ڙ͍3gf^)sJx.wNCqӥInmfڙۛg?Z;swf~z$ ][׶;?>n]sq*?=WzOHquFcr8\Zakl3.$7qX j7BIzwBcd"db'=' !kZ3&?kxL$fHxR;.}q<)R37B0_iꉛGhrYA7<",J'&q>v/Ma=5y55w8V  Qx쀅d>C;7}eqNZwn ߏ'݊]j-.)#/vȨSX/"Bw[8%+\`9mN:Aufԡ]/;S%CnW!}ҟHU!}W!}ҟ6 髐IC^u6:yFWg l`UMr={LNqT GBŜcX/?#&gվ"rO5x+53>@UNXSpU ױ@ɝoEuWC o ^$w9)ˉoMXXf%\0QwäHi!8IW[^c"E#!GF{4? '!! _+ft_7/o^}1)* 5>a5ꍨ^"04%0"_3v>fFDqFBշBMw"E-Ԋ}Ȳq wY$d# f=V]3Kvk R(!OM |WY#P2=ą]abMĀg1 Y% }BJ1g:\$tp&t?J`ۯ6 iȴq[ Af>\ΚvkLGbiCM3 P@ :`>XqmO؍RkV5cvI|++|mkJ$=bg3*,@hA{ܡcˈ0l%OK6`ok(+",r(YuB rY:k{=(Yr -B_(,,@1ԔP-P<4Y$Etv< FFmрlXZ7 ԍa1+yewE }>~ )LPGC >FyXqvB0+}JȯJ3+Ap0AHi#;F&E 1]LjB6:>OBF҂(\B6k/T(. dE-Y,#;l1f6 hr mX*`Unc>ѮҤ^^H.@IQ^̈́ C-V^:D~ZvG 9p7 ˬǑg .IQ2?z8ׯ*'.=a22NUJ6qI&[&]k֓R3j%)) -aTDt$ae."ER?C[!7M3/B pT7o\dO1pͦc$ESC휞\Z,V*FR6J!P1I Hն6-e-h+ bt?sҢgÖBp- Wt - S~vɼG`4=74ҥi3eX=ˎs^ /Gm?s8HmćZKJ![R-!h" KQQ!*8,}Ajg`T D=M7[0/"9D@jzcM(l0;2(HNaÔCm[ϥ'Z. 8^G׋e0XW1HCb+цlyI?2Yd.!ĭD!Xf캡UzMswJ{or`^ۻn=M"]2ҥ$5lyL\ ǢBd!54tcT>by wM Y(ϒwXdc[TRIPѣ84r0J$^":LNLNDɾ^$a1N(dQk4ٱ-Wvͻ~h^ Z=ѤT)_= ıԟ 11X9 #unK5oFo;{ Xu5u5zVm=4Sr0vqU{-Wdo0 X~:  X:feo蚹fl\P"RH8ܒ/+gqWHq5'7 oa燅m)¾eqN7ް3{ainoհ J'hcwy4A!n)J ư3Y">ҥyJMNSjaqH,JQY{ TwN{/PB =wjx}y9ha0fK;~ Ӊga(:>SE/ Ps *\lOt7\P,}v# E|s<= &q1s<\w8弇qܸ\L`ZlB Z+7A\g~ٿNҌ1^::F4wn(vh'nLZ6\RYq91a r=w+C0O)NbP`cإHh/>u &Z#Oҕ.8uL;MH% ʮ؃`$;M8^* =ZK7.'Ȍ6{Wk]iv{~ɐ^)n"].o#:+!pc-4SD0FQb=BlHU暵7] )=n,6>;hy쵗^풒<5~;-f3KNM{PKgiPK': styles.xmlM۸_ahdY팛mn{Hv Zmn$R )=RhYeCs||$CvT*&sTdo_?+| ~zwbf)]f" u1j\--9$_ ZrRPR;4a6 ԚTb=% OIJ`S|-TE$u8yZ(\M?==E(6xe%s) SQ<#[PMꇸJ*VTN6 ̫j̀i-c .޻̧-1@m,b,=1U*Y9yۧB4"MPnXGEKQicqQ 0B0u7=!R7(NH֤jn8Hhd"̄I~fukwt-IJÌzf@(R ] f'?PN%0)DF%?A)N!@+ S43T dQp5I73^?j\-gJGiqIh(u;d83&U^sFrֿRBvJ`TT[}9XRгx!=t͔$)p+$ QQB gmgzhMrEAI$1cAJ 2*,*-q+I J˵`G0\zug &fNGӢT'j7n*E j"0hYA;[ b_A8)Y TdK_k .~ze<":ʿ?5r, ):9=8;Lhf=I)ָ")0Xn)7,I=4ڠkv01ʊ [\MSa C9 s%س͚BPQb]4oFpo_+ptcP҂019C*+ Y̹/l9+WBbn`A=(I0_*8b+,Bijz6K}x3"`X8D)PMs~?Syy=+_#|ߓ+ԺT "JliJhgqRMS)|OR}(&:͞r9Lй2}n\9j_7{xܻ-YNG'Ę{E\bm ۳7OfTM 03p 4d0pQIjqox` Qr+^%|.cbN8+*m`jw4~s{6[0+gQjHʤ͚s+=.a0*h٪Dβ=˜!1jm7om/Ϣk…uOBXb,> 7{AJ 3u~8cE%˂ܝqX o<Hjgu) !?1B)5!݀Z'ćQE j1R7z&RDÛHMM>ԧ7/^[lt^j]Ta]MU_5+BhݧV\#S]t 0Lp7}xgC ~{HAjnTvgIku c<&#;>/?oGx$~!]PKl'8,PK':I''meta.xml OpenOffice.org/3.0$Linux OpenOffice.org_project/300m7$Build-93542008-12-27T21:45:312009-01-07T17:54:0272PT05H24M45SPK':Thumbnails/thumbnail.pngAPNG  IHDRnIDATxyMulS\嚮ydȘ 2SIxd_)TORB!Rrr2}|9a^g뻆Z0MSѹsoe}=!h֬Ypaٺu<ҤIUkN:vh]Vfj~WҳgOٷo9sFbcc?ym1U0^}~ -[HBB̛7ONʅbr%x;v.]ZΞ=+ݻwO>Dve/^\6l :t͛7˜9sv2h sҼys)Rfn"@3HJJ٩S'ѣe˖5sm033p|FU' kfبv5DŽ2?dDJBj %6g6fɒEbɉeȑҷW7Rp!=b 9Kf}"s,c5_L+5jՖ߬vmիWd]Rb/̖0F& 1R=Er$._KOH޼S#GIavM+i9r][ٽgTBfxQwޥ>٥c[lT`6)f̘?[[2ͤG&i l'͛GΞ>4zQ~/Yk ?%*6 gO.H+/!Q7nܐ(0gl>SofP$-.K⋕GfHGwߖ9w+ /Ǔ&NǮej @\/}$KuQn{~L5d˖ϟ)}dϞ]`Xzu^zҵK'P+27ryp`I`%.]*ŊJ),ڒ(P@r)׿a,(g~G._~Dƍ;L2ɱctͫ֩SG9"u y駟={ӧ^Y"99Y=*>C q+o|y'dܸqҷo_9tdΜYYZZn-K, +~TVM7F1@_1a駟vmUg= V?UJ;g_Ԅ4a>G1\#I?w|<A/D`{3 J%{^ý,)^opL:Eٟ$JWm;OK r|JX40b P%6MpΜYzk7{LnGDgWΜ~aͨqimB0bwձbZ^2_^d>WGzPUKjM5[X$7Uˤνf0 gD5_.[TM1W5wN3dH{3$@6%ҩrrT2n7W=w:<]=⋴ce,zݐ=cdqZAj֬-: "֭0QX룑\˖-3,9rFdڴi2|pRJeMbrʥ+CZhQ% j?V\´k׮f*RZ9V.C9^F6F$5jԐuIBӧs='/lڴI_5O<)׮]+WJ @A nБ. bEkb 8qĉ`9s+T 'O5JZІ Wgby{OysO=孅=ArΝt˶ͯ,z:q{f'1f߹ @uw^dСϟ?vӘlٲ8t١͠ t>>Yp$n|f΍~sgG2͢[ >˗,BEJpR0cܡ?=:!"^Bw +ƾt`ܕe.]4C` ]ʰ*W|`2k,\`'p/V!0@)#3fn!87|#-<4i ס+// q[/VMiy_;ztYo\hR}j:RBy;{_9?3"^ԟzl>\Oٹ}>u9 =SƷH|̛@Zj"Wt]JR`I@LtA *l_cZ;pCzmz}yHٺqʕK `Q[qs/}#Fp0a>=b-Zv9.]f9ۺ;vٳgրӺRJaMRdGm=#e Od[dIEkz~:Z^~PT5U̅ "~28wuW{H^ _ !\N0(R>HL$ȑ#˥L2Z8HX8֚dfnA`Dg۶m@ɬ۷ (Ho~GZOvB.i?vTs#6՟-ۻ%o΃Q6+p%=ŇW(>WK%s^ &<9I[5R;-d[nY4z| )))zj/Z.J rwV5n{XL˲DbԸx'_ʆԛ;6)L:v{s/ 1DK}/gC>2GjNٸY0fU˹+O7ӌ8wnMGJ)Wy)rOQAOZrRhټ˝hAG7!Ҡ<';|0w;4'@F\=̛ 4D̫V& SOL6W8u 8PRY~Ƶ)q`DD_ok²o^Ey%@D |fmV{x(Ž@C /!<ʕ-SZ72]Re&qpͭڰ|*Iɸqf}ͻ~Kh.?[C٪U+ߧ[T&əZѴy+Yj7C4{~SxR##"ϒ-\vM_|}p'=8#H3<~`;bĈC\ CC6lQ{HW?Bei{'QF-yEmڴь!y|*0IW~Iop 'ǬoܹsDL \y"gHI+P҉B"e.hÊP13f0?c:ѿ QaD^|wUHp0Exg8R3ǯ{C(Dϔ[p.s-׆0(Qw#衇 `D#,6Cq֞\2z駟&a$)O cr|nj20`4yv8&G3‘0(,8[fժUzCbaҠiӦH)ҋ^U'?{l<L,zn!cc_oZyϛ7ϴ|ÇJkU1D€a * L}Rw`hUxf"$3Oz~%:1c{P[/A#cǎ0 jY ӥKS 4Ck{&C-,CLKMYJ,=б0x.|5dZfj§Q{{@/h|ު#W׮R&Dg eV`0T/C|`,4dȐC2+l G˃S9~xɜ1}vq+}dn PY8L(o,I""D 9aa%L KTp! 9(3W@8Ν6\ SNQfǴ6%*D[bA)qIݏoi$)=2}L֜&.`uZYwyKeMLb/$3g4xuWJ=}zѧ8ʡ^6܄)B8rЕ0ij[fwwt/&b?j~wgfz^p"w3D\ƌ0$H*NT 4k74l)'C ; - 3E?t+*!2RQMF9`dL2塵 & bqԩGۧ/16!:uѢEz7n!XcmL2a[ei愀9 #arrrPe )eXY{:RkZ_ BuaHah$9)e$WL+g8tܮ$VJaal_q?, 昡SUfC}P$u3Lo{X%_|ɍg˞@/#Xfa=믿N 9ÌdheA<-ul(H"^|RqIDǒ9R%ő5q-[xbD:7T`kYv Q./ԍ0cй׷њr-t|? ]NT35o8L 걏 \IiڻM=qA6fQȆg_!URPeH # M/ٚF=iӦfx+d[QW \T[Ϟ=]l0gaҦMW^^FCOnذ>; 8Ǩ' &}p8ԏ!CCKIP ,xēS@6(Cz؃f 2_Jg2I@RkЕQL2Ĵ >_{50 ahl!KIhK!N XTt,PP#&j}7 ӧO8\Yĺ֋8|֋8n*zGH"@tEN57K| &&&"Iw Tǃ#8!rĄuK*+`&كo &ZJ_+%-W ;(%\}r0ƚ! #zn!1$Hꉰqܭ*r~B@Z|"~ CzpíA+ chj&8I a~7"D >n؂ !4pD>1 ?o '|7ED4*Mu>!CE [hƮ`@G4j!VE-IL 䨇'Orİs 3\MLc>J愞FDt"P63Kf Րjʫڷoi=cG mԩ,sJ Jwъ R~5sF#x62H࣏>ҹ{jf()D;XϬe]>rdppO-X֞ce4`{B4n& #lsOd=}V0o.z'GCƀL D9bp߿Լyi4K$u-#!P[KO=^c#z?~T'5kZ˂= i7RCA g3RTݸqc3$T3dY%XԉHf!ŋA5*L JB3!H !y&p&]nx,r7$giv|-C1\܀캥+ :m|8b>)2E;h"&zt }M%@cC}4y"چERK\]JIa2Im0dw{%ʷ:#&%SH0P7YS ͻUW@>\pw=mhE!!ԞUBPJ5 +0舁3i/o\BF~nЀbL󵖆ќB'F/*!JwTK9έL4?1Y^HumJG)#) lG>BCL9'n'GgchȝcJ0[LE˫~d &S6Y^c/d 43NڽXP $퓗-+{7PK_ZPK':META-INF/manifest.xmlr #*Ӊˌ#i޾fvN>9GSi'㻞3;ƫȒ~Z5=*>WfffǂH&cN*cUƢ|'JP?=i4 YMf`w]at\Z8mkVe|Y*ѪQ^%-qJ&U;& QZnyR):PWn;9kDщ[dHUGtML\ QO&RQ RIwj}Hjcl~4J7=~.BA^0_pBCX56g ς"+e` DZC8ĺ~|? >z ,¬Et*a D9f^~(Js{t@o#z{i!>F f`zn,0?@xZe#]+ա UaWї7ݼrj ԹpXy9]\_NOPK@ s PK':^2 ''mimetypePK':MConfigurations2/statusbar/PK':'Configurations2/accelerator/current.xmlPK':Configurations2/floater/PK':Configurations2/popupmenu/PK':JConfigurations2/progressbar/PK':Configurations2/menubar/PK':Configurations2/toolbar/PK':Configurations2/images/Bitmaps/PK':--Pictures/100000000000030E0000016989F88827.pngPK':eZGG-5Pictures/100000000000007B00000023B3D486EB.pngPK':|-Pictures/100000000000031E0000019100DA39E0.pngPK':1)-Pictures/10000000000003100000016C2FCFEA52.pngPK':us!AA-Pictures/10000000000001F6000001809928CBE5.pngPK':c6-sPictures/10000000000000630000002F91781176.pngPK':!DD-Pictures/100000000000008900000030F833F6CF.pngPK':{W??-`Pictures/100000000000014700000137C92DA7D3.pngPK':ecE-/Pictures/100000000000030D00000169886D88BD.pngPK':>YZ -$Pictures/100000000000030B0000016A53980135.pngPK':,C:-Pictures/100000000000008D0000002419842777.pngPK':- Pictures/10000000000000420000001D83373369.pngPK':gi $content.xmlPK':l'8, ;styles.xmlPK':I''+Dmeta.xmlPK':aFAxHThumbnails/thumbnail.pngPK':_Z fsettings.xmlPK':@ s QkMETA-INF/manifest.xmlPK2mqtoctave-0.10.1/widgetserver/doc/doc_api/automata.odg0000755000175000017500000002460311511434230021604 0ustar lucaslucasPKMb6.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKMb6Configurations2/statusbar/PKMb6'Configurations2/accelerator/current.xmlPKPKMb6Configurations2/floater/PKMb6Configurations2/popupmenu/PKMb6Configurations2/progressbar/PKMb6Configurations2/menubar/PKMb6Configurations2/toolbar/PKMb6Configurations2/images/Bitmaps/PKMb6 content.xmlZn6+ ]A=BANWvnDx~_dHaR"Vэ]+{xxr>qih)_"Db`rãB1+ne'Y=2Y޻t[H ܛ \W::eVj}UZ9־.NrvWh9*_hA RQOa44! 8'qF@[)e lC}E( trznb"x)É!ζyB)jM,q3fACTb-\J=BK-^Hqf '> p8s\ѮE8+w_yd$:P>*e/,t^S)Q=\׫N?'U!3òV>iNH3z?^r``H! ,>)b q֏97JYM}$~<}"4I &sLFt0ӳ< ~D-- : O$}'>}sM`kPN:%rX.r3Eb2 }x}2/-F/i@IetEN3tx7POeʴȧJ/;}uh˝v ӀKVjW]MK^g B{)I ?'X|vg| ]T5ݠ} S=sΓ]O빘ݔ=z-@0Z#=% ku[Vt_điWC51Z`q@ W"%NL;q<,vrXNgX+D@!;d29m\Ou|+ YNN+~ΐcNp垞4ӥ0QK~K_c)C( =in Se S3rdGJ ΐiDGA1Q=-x<+ D>HyXxmP}1f^1, 3gtwsA`Vi*aQ@Ռ鱬d[-35H,Iid܂5 YGA-FxD ei2Y9z-vvq سZI5U֦T۩2=-:7j3+٬=nw%{5^ON} sA#nVF|CU{Zt+>cK.?Ԙ8f˿PKͯ+K/PKMb6 styles.xml\r6)87$'j9Km JH@'(2ȶa2X`WԺ<#,Yȳ-,$jaΥ+E$ydbKqfr5sa<3lgsYRinJPW] ߉RGV¦vѦLMU˨1'`qٱ⎒^ ]wٌ6+ןfV\s2n)c'eM<^b$ެg ʸ S_u9X#;Δp3T&aPnĺc~/TW%ePҦ>c2U*Ů{՟ A 'sC<8( T 4]p ^lG^ZF*.NW2@@"_Yn[k<dm5x('xDL[TJY/(>NNhg /l.)$[ĉܑ2pOSh%3EXr6$D,JJ[߹dZjgLxޒ_[mHHKm~ %O9+%!F){K~SD[HcwߵՁXe WgL$D0JBA4 b>ۑ rzm lݰRM>?e+ z6`MP6PZyPQ*Kg "0R9A/cɄIHHh\(T{ !M5 dme.]z/L:RUqR(l|TeN)fJ:l;Y<,ʆ&f/ɔ:wM/^X?dΌsxQpBtʼnIP*&% !4~MODdG!4y9>/4O_ ӳ"2 +Q'XT]T4iU=QUby lq"JGSNQD"˅4`)3Ś|v}’~^Y:4Lj5p'n)|޹vL4&Sm^;v@,'nVnG;DT 8]#Lf|(u)Q[0^#ĆH-ځ)Wߧ9;/oҌc4U7@N)8@S/DŽ$#*9!##[eŹ\>OzU~Knb'{ h>l>w]%%+i$>26[-@rFH ZfI%A)7CNd(dr}IAN[C(PKBϩ_EPKMb6Kjjmeta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680m5$Build-90732007-03-02T10:36:252007-03-02T10:45:39es-ES2PT3M0SPKMb6Thumbnails/thumbnail.pnguVy4ۉ5&$E4X)}Z"!5I]ZmxiOA)a4bմKkAmSjTҪj9g|{sϹ{=_EE-ǂ ߑb::-](;7J~<6yZ֗jRhkS\!؟vʳ{ߞ%@w5M)|/3-j0ꟷTFߧͽOЪO77Kx#k8Xr05剠ۢNt]zZQQ6벨EX{% g'L- ]T)Dj(lJ6\HTZ\3#9.Nۊrv@ k=?lUjoy0"2XO7wc{ζ ͇_+|IYCF蚨@TD{Wƫ~O;ft2;#ܓESɽAhnSoz:n1)QQ2oHH\%]r$f|^ ]j ~uQq}}8:~F{Oz_)[;y_/L*mihTz}[ڻ9I|9j'_r6C)Whۄf<{D&5&사ISҲ'3Qӕ"po[hwK%''?-y26DC,k{ӿmDߗW`t _b*vՓP|u!5o;> GNd=,%cdپtAv`cXǬZFpGR.~1|aE|q?8c%ŧܥ=4.W: i( .<.sn]Z(od&' 4񜿹|X ǕǍ V!:E&dq+,UmX+$/Ujc>>dOUvX 1ިTԼ,3hT@Zވgcypzz[)W3}/ {emj;4LxʣE~t?7y۴.uӒ@?*I8ʻ <=,XT-xz+j#3R}_`/z]mEBk3gdg:~MVCEH A<&C}mIńu߳Ƞ^[89ӑ">x:/^ ㈒r&wg. 1]Όl!-}~F&,YHDC!~!^.gez?UpFH_kϻA\pm֤+e^79„k+;\Z*E:/CrF^zALܾ{ƈ !u3"pMDD)ncng )de\kr!_spXp C.{+#H u &LBFNw Y-R T0 ~Qrh@o, ;وH¿mDIO0h&SgQL{ Cn`)oM{ 5|=Aأ8֖܍js̕h@|/U) 2W&KOH~i\AcQ2/p`("&!Qs<O%eQ|nˌS[< R0EW͓:k!\NIjK@lا"uY S?gׂ]%t@HWvQJW t#n<ԋ-AKRL%Q/k0OJU O˞ )K㓂+D;R'ᔬBeW]ρ 3ʹ jx}+?c-!Me>7'Sh7:ILtFYsq\rvCqmscQ3S7uq0Ձ_UP'BIh|[z\rPcf5p9Z G=fi2 *(QNJB)QVT7R5;>BF y^ZAGs*+ әdTJxw&D&tqzȲ`tt28BnZ؈a0LNC A,tJKՇ)hՁ{ ќd{n^ϼdI;GUhlskIOH=#%KZy&Ap6m|t9|дBhGjdwM}605RiϏ'u7jNQML^o\}1I?M^s/ߺMָ7l͙W}1;5o׍YWt 7kl9c.ݟ(1F~}e]6ffhtZݎZxZju3*v ԯl*PKS#PKMb6META-INF/manifest.xmlKj0@=VU1q-&fW6X; HFi[S0Oͣ)k7vc^aaӠNZu`ZVzEdZ>T yb`yʝ뛣V4cՊą0$c.mʛwS<&Bϒ8b<(sT)i]EX|H!_Tʝz18{oIjN7IQׂpqr՛5\AkagMv@|6s-,2O\څ'.?PKANPKMb6.++mimetypePKMb6QConfigurations2/statusbar/PKMb6'Configurations2/accelerator/current.xmlPKMb6Configurations2/floater/PKMb6Configurations2/popupmenu/PKMb6NConfigurations2/progressbar/PKMb6Configurations2/menubar/PKMb6Configurations2/toolbar/PKMb6Configurations2/images/Bitmaps/PKMb6ͯ+K/ 1content.xmlPKMb6Bϩ_E styles.xmlPKMb6Kjjmeta.xmlPKMb6hThumbnails/thumbnail.pngPKMb6S# %settings.xmlPKMb6AN#META-INF/manifest.xmlPK%qtoctave-0.10.1/widgetserver/doc/tutorial/bookmark.png0000755000175000017500000000265611511434230022062 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<@IDATxb?9W/2P-W`p_9 D < LҢ 1SDrbRٽ@Z Eq@ @R;QyPOnI!Q>:X 7/ Hu@@/d ] ̦ DjcP ̗9"c!wIY,ÿ Hu@7Вh(gDIV+pv7 \z _J' 0|̜@0 A)  @ B l< yE5&C KQ0gMek2Xݏ|<*/@az 6 (Ƞ[,~#H܆ @K@ŘW0xٜ2 Hs \+g^n]##!@l8=[ ?G~ OaFõa/OaL|& `H8[3 óg^ y!0' + o?0c('|_b:7\bft ,nCZ|ĂLlZçbfU0f:'p4u@tgcV| # @5?qr o,y 6վ|`' A!T20I߾CByZ4_?bHy %!;5!rE1#/7`п ׁb .0:]TDARp4Z] *^~G`_(?Grg|^fҰN(`q#Rrd`34iPQ7+#}Cjbb`@p=67C-IENDB`qtoctave-0.10.1/widgetserver/doc/tutorial/english-widgetserver_tutorial.odt0000755000175000017500000035530011511434230026340 0ustar lucaslucasPKINw6^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKINw6Configurations2/statusbar/PKINw6'Configurations2/accelerator/current.xmlPKPKINw6Configurations2/floater/PKINw6Configurations2/popupmenu/PKINw6Configurations2/progressbar/PKINw6Configurations2/menubar/PKINw6Configurations2/toolbar/PKINw6Configurations2/images/Bitmaps/PKINw6u4/-Pictures/100000000000012C0000004C7BCE8785.pngPNG  IHDR,LXIDATx pGǿ!O܆HdS'dGRޯ*yؖ]ۂ1d.&ԆR)lKquRI k[Yl$ bTlEM_<%XSů>5 $`ؖm1Nulcۏq!C&/pD@/k7lh& F4Bk͆1̃AUB:"h l(zgdLnkXS=z$$I^v C BB}!(d6Slv~7dWK-ohj苳X6Xl&-d y~f3;6]FR$|)N*4Z8p1Hd A2S@8,~]iq]V;n{W `}y#[68hfDܯeZahi[?C<㨄$.ssRd$/5vJg^bL8q&K60 Jߐ Vi3ܝden B#|i:3}ɦﺐz#KS\t/[AvM49>d8*ep&@]M m& [o"=D`Ȧ H{ lӺ&`sv ̿)a#݇QL}πmK^bՕѪu s9ev:FioÎzu4r.NiۊW̧YˊDk]]_xZ-2x=V$^N=xքHalXmLXI}aFP0wh(aC{: .}drkn_ cɃC\p r]d:=e8PDށ䖾N 45B$s_m]`dDy4}=rO"G:7~h}++BJ1+w[ "/n(-m?uyسXb p(! J`s弻e pLkBKɮvE,tvWxη' |Ys7#sLkmni #\$^k΁U*.Kx*YG50LCii R%p'(ahj%RRr;£&!'=B! zܾ5s d^jZ}Y[ꕫ 0۴Y&6ηvJe$/7npqLeˠ'LC&g$x;nmR1^!-܍9j)5eDySV@Zk1I9 #ްHEusmoOSw0[wPK^ν7X׹ح-wD:vbo^/_o +i`-g#:GE1 kBHuWnb&V#+a\5(s+BHfj7;>QHq&@"܆)!J5^ϕ|XrSBVVdej%UUz*룑;}E#_}r+rڴ؄Lsj^h{YG&0KiЊŢ, rV,.9İZdƘ6uҀ"=/u7\M3vN#d Ƥ,{)erԋMϚpl&*a 4^+5!پ z[5`*՚09CJLSgGg3x2"~m4sLX&2"Qa4L6"G:1@|wzgsg`42L+KCh2ڹc'?7@~l@J~aJB0Y"sv=3DdUFT@G%p.G̩{N"y($"I$=k1;=ոɔP}\gB&?5OGiT3)^!L&jBUj=zEѳ!&k²Pd IS!0jF쐎\'ΐAf۲V:ЬGz|]Heb> Dϻ 2?dAz)sfWrI[(81q$U lك﯄֓I&WBN-fzI p<қ`?h#&]5Vn"Fڣ5=@/Fּ9}Ț5L{PyM `{ ZH"=md76ilZ"եHJ Α'#T<xN/5?y$ٳ,>IgC$$ڽ0k(m xzw>O[Yp@q6}('zքWjLVwDQkBWB\jr">bܕ kBgXC䌽Ƶ;k苗ׄ) HDH?߲Tɼ#;khS޽@~}pnYeRO*MMt&+%kO&r('Qڹ߰91~d:W" YZ>1kSOG;Q#w=D 5V̞HgH^'ukDKl ^7-q~7cbG0=wGǰbNÚڳۈ23TPr-EZ}FlPm<'Kf4[*}3̆ ]>6wkP<3KQx Z0(j$epYCxmՄΑOcw5ckU=1v:|wJ8>JX^ 6mKwf5л)=|80~/./ѫQښ02GcfR%k#㏃2bJȘrOM8f2%ddL122L SL)&SBF)!#cɔ1dJȘb2%ddL1Ǯ^wBf6m3X Rl7Ft㶦A-WU i>Z2w:ӇKnWJHwTe4XU32-Q (QFa}lJ22&eSBFq&@?&#Ǎ3۶Y﷥<՛1pƚjRɵGd2Ct x웫^pV-mo>yzScUoMy$p8\{虰q4**h-=~t9 -۲&}M:=9bo]x՛UUjo;wn:WW- OEYFNzk:anӖ885Ey/h!+U '?G?"~\pd!ז<䯋Ny{[z}u}?dMݿ}럫T~D>^6D y?Dr\~g@'n^NWCKYv-h]E˟X{O]_4fy0/s$J8q'0G!uKj3ש3gI+~,~x-3ʊCPOr8J-!:Bb [.T7ڪlg)kUׅ̽_tRU riK"C :o%-xB@"_ ?l*ҞUKBVSy)۴քd9WG$ d1@5ʦWH+C2dzfZC6>+_GP&n=n>H=զJ8n![ eYsr zC&֞3Si1JȚ=Z#&UfHԉ=zlQNHxQ{/1#hM(םnJyGcF'U[|tЭHۇi쯹@_6~7}^7RICg%7j3&cDՄ\Z\uҝ&$s5" A%y36idž&ˠOa'i)|&E3^^qALþWW%5 ?I < g!{g^ ;ko]"6hIMWBd¾;ʮW|\qPUBb7lY[{x,YhJX,q_T`R,ʕԔUO7n5`[<ք JsE;UU.X/PkB}Gۺ_~9憗e㉪ y&`zF}`ڲrAt30؇>_~qVܱ%{6忪(uj[ N~&n85R`=qdbz룑"a#&&$ Yzp##F<OTMƇ7z5f6ք8cFFN5X!ljL`M#=HFF!X"lA; lfS;&&T08D9Iܱ0B-nbqߣ,*oӭF3xf6zІ4}ƺ;fUW-bmǁ{xW[x3îT2I )tFYHݐ-p%A$ېXXE>O$/i?2.q|#Q'y-y>C:n Ú{}?^-O8)(mO|k>NZ.z-o~v/ƧKKWl閕2c.>.{8Ŀ^Mg.<&s. ~ԥ8{ԥ8̻ŵPb\4ܑy_}TꞯQC8gJũEJ73Bߜj'}T BB1ZRʜuu-AߩTṿ՚Wm#)*gP ^#8cWe=w|zAh-x1m0N;>4 y/yM(87ߎK#[Tns9o:Ӿ>Mwh{3!ץ欎|;g.d@)AG>Zkgt7tmo~Þ|?I.;|?Yրq?n Xor[|w '4mSQ$χ8l5 w}+u۲H]i|&(;,jFA6vK6ȥ\PQkBY[?3iwhTIą.cl܎]({lB7Pv>p zRO3 шE47Qʆ | BAχ.m`gx|0;B?'w@٨ZFbU׉fr78ʜbHGAGP5-A=zF;\72zm+|7 ࢪ:PC)~Ha*8.Nڇvՠ3)Lh;Kֺ#z^M„ mVPjHU>u3t}MƆo%4g.Tь~&h;;hot?gCmǘT`4wuQfðmMrM r7>3>4NR&Mp8XXmx}*3aL84i\9eƸLsE6[ 7l_!ۃtn7cй(KZ+ #}y6zq`>}'Q8K{x&֬mN2#8^~ni›C4N/hOۉp3z+!AnEܓ? cnv. ^9ƽ(F@aXa3m&d8W95`\@v玽=6Q! t$/*us@OH$Gnw} ,m_GIiEmc7# Z˘"S˸.޷| 5G5W;c7ݡ3e{?&5Ӝ?G2D.c=Lذ{QLk5>SzMlp`W}S*3=i ijI]n&&P?³st kךƣ>m)Ϲ$/$]9Ja,h *08ףvMM>9j]>>C]!/Zh2acü4E:v_}blϻ~=Tas/ڈK6ǣGg0V,線s$-^?I^Y srٺ'+"<S1NOC4lp3.P-Zbw ༙=^;{p7? Xa*[?R|2^vh:&`AU0pVt~Qɞ87p~9YPoٛ0u)_#Avre S(ʞ X3ocE1T`܏ j@]+eg/ʌQkN'tQhtbߦ=v k `ܲ9jl~(7_F[V afۚ;m Pα6%䲙o/J]?HMco eud4Zn?؍%)Xߜko!wz/ 9(BOo]ͤ Uӏ&/U/cvL0 .ڊmJe`IzfӶ+W ۚrux2 /'CCY|0ɔa )jS! egG7^Crl:Ù"mSIBTea UDʽ":ʚ-&JO߭&tmL!I NoL!ǩ`7 !2%NQ$ !*:!Dœ@'xOIBT< tB'NQ$ !*:!Dœ@'xeFv=z+?h$~*~m )@5BQ=YDƒ^lt 0@f (27nk_I1 Eo|D}M9%decu'F #Ӆa1vǀlQe8w }ԡZr=P;O;۩N:_ɟwN:_K9@܊yפY4m^kҴ}ވtOCZ I`iLK/ o -"7JRցeԏNv˜@yݼ;FHطg_H 464^MxKemPxǂdQJqC Ke@@C >*\Pƥ r%kLwƈG^a1Mw{\~̱y&X=܏֚߾4__nHf?Kc*v%}()%`&':cŹAxKCR4?M'8v@K0+\0h-dҶo:g[m Y{艣A4Mjo,J9aBܚ{طw_Մ#e@$ZQ"p)ALo$h eO͵A?^GO j)v; }BT1tIDz P/l{tІ0ݯ=\W!Y=`Pj[mu% !VʝE! !H_d%7J"nRx(g z[}9V>E;=Dn_"nQJQhP̶mk gTyFИUpOr!Ce_|ŔkZ;z, άa⧲җWTZkzУ7Cu$w(?*L﻽$>Kὸ#mZN󏚉+]8':T5\wN]=butӒ˾rE}/ =u`>-2aR|hVeXjңBT< tB'NQ$ !*:!Dœ@'xOIBT< tB'NQ$ !*:!Dœ@LcC7v5i$ȣE@[Þwz8|0m|AA{i#4$-#cqbw0M3gCdy!ezG|$6mbo_sBr!n)tg3881pzcGsτzQL;4uXңBT< tB'NQ$ !*:!Dœ@'xO[#Ƀ&MmQ:Nt,u3*^(mnƬH[ _KTvOsK݌B۲ t2tBT<- B@ztB'=k̃ -BL"=,J0&zG@3]sU]-Dt Kk?m|9 %d[ڏ3-t>V?x=x9V}6rd|O o _6%'~ `Vۻ:?ңj2طEn5ԂK>;mZjhmo~8| RKӞ%TnvLpK>'CNj+B tHH&I @d,V>jFOMb43 sng&~>]Pƪ28'J?\O]m>1Q?ewM'XUM;iRt&?Մ>ɋ׫c9*|ΰC&R6炳{|I[Lvjz1IK'x Տv p(GAY?rɷ pWljg͚5]u>G['W*u-oQÇ`y;؊I8d}w`V)G,ĸZ{8gb:CkC]\'iuU%.}7F}ʹ<ڂ7Ѹ8YE1ЇhzINPOm<}u:I\ply`{E^9u]jpcwvj*IOfO.H³RI+υ>1"a8@PVy]3ٌc;|WtɃr"NTMc0.@XA]} } . 3v5q.ARCO@1uwo%@'*[1[a0vǘoCU@9B OK'LztBT;>bfvu x6S.y]#[#\1q6AF֬lQًa#lqg̷NXsnv&k wmiTei[$ЉʧL =1/o׻XCA=GulzďWOyd 2t+C@Aa|*\7 7BvxxG m$&2W tb۽46yɨx΋F﻽$>Kὸ#mZN󏚧 N7i&?>*@2t+N `.fj\]\秃\}07.Z|Q0Cm9 {(G>+:2d4*ĿYqԆ\J⼶/}yٝ7ˋʰ!-X@&=:!Dœ@'xOIBT<**N(m/\P,HR7a$Љ#vd2tBT*!DPvԡB=F!u| V7K!Du=g0IENDB`PKINw6_  -Pictures/10000201000000F600000097BFCCF6BA.pngPNG  IHDR&7IDATxhgw4K ,QhJdKKJaWZ֦-44ɵv&鲍rgn+l:.]uR 1!28b z-K$j*GόG3;{1떙 N{ֶEBe#Ǿ7}wu>7ֺIB2 cIdasn*.k!\eM*.-df[] 9b`N|AsӶqt^G ^rX*6**hJ|}Mm#A։?nsp+_M!o`_rXepQ^_ 3=6ƫ ICwE/agBX Q#렾=61DZ̕ ٯD:j$IeCh͑w{:# kێN}G=b9h\MY1\H%-GzX75g;EMP2bh5F 8 {2e >8g.Z83?ޢ|Y vIjZdGqNt8;ċ뫵Lꙷ.3z''05Hx C_F-"Y~nlOt<ƚTh%W.Qe#O'we{t>:=\ K>58Oq"#8s|MrQGS +w kA=tI8J]?}[{B5Z7ty8GSZ16i0#p]?2 mRI Jqbw T/:EhîE՗xbg=-_(Ղ;ԧyT\GCabA|;66Ấah8"}=C *5K7cO|5XqBg)LѶ`,=qb9b`=I5~7ݢ 7-rYmV^C 7:_kDrn='QS]T;O苓ΏM\>Rݎ[E{@sH쁾"Ψ`b([@#sBřC#8Dhui ;`x:Bѩ k*C}l|>6'‚]iՏZ@aZK6!-HiĢ09pVy瘸RQS#YCarzsxZF?!}&c?k~pa`+:Z棹g楿t{C5iX -c,xݦ%`aerؑS; w$wcB ץiP7D :s3jw/ϿTZԮoFz~}~'^zkAn)% 5ۤ КB3Mnn0I<66"}E}񧓆 PsU`m',z62WMr9`yx'qx_]O > =nii 5Pͱmq=]"3jqiؤM(c8AuɎZ&4clxo7щwfr,fFߠKۉn/]H9BfhN܆-z w#Nݕ۾cFkPv-iYuJt1K&L;WcY`P#?lA&̀].3ӀFk bSǝ뗠TtCf&.}lLK䒦zv8'8:uj:9Mk"me h`P*>!Jf!Uކ9|oʶbY&v9(ec3WmM:=528GКZW6xmJ9zZ}'e@}M$(9:ja+=Ш%Kqay`aNvjzΣJZ *v&vKr(hFi633SQ0JTץ5Imn rn50PkNo]jhluyIv.gZסne) Z6M霻FvlJ6 C`$U?|pޫm$pB}tZstVeE׫*U][=B^j[Zy綨:ŚuS沊#YУhJ-xX浊avPL[l.ݹO2`M{2P jLdVl) ÿTUz}5x:ؚ6=]ė27vaLBfV.k^=@Q½sŅ[` Cl!|H-I! >$‡$B[` Cl!|H-I! >$‡$B[` Cl!|H-I! >$‡$B[` Cl!|H-yce苡nƺ/FdwdQ&Mkݔug<nƆ u{j# n@5 ׺U$ط=o} +k0[` Xd>Ϯy[>Atwxim+ѿkέ? (z;߄{lQoxӶ91u]a6Fξ3vZjR]->Nqك)CKۤ 8Iѹw?c7/Gs$:;hg+X N`e||ǟLL<ٰ<@4ʙOHX#5&ű} uue2_eWj+9Ŋl$mۜ.u3 ?{gBaNwh|twܵ<G:8@bo׼m3o'Ⱥ{ =Ɏ{煣P̕ C ZG|LO[QBx@|qrWsц#h'w};&:u [[ǟ'1ZB'kֳzV-=Qx D5)N/r X1񟶣";$‡$B[` Cl!|H-I! >$‡$B[` Cl!|H-I! >$‡$B[` Cl!|H-I꿶 FMB,23 !֟rZC;o?Z7Do҇~LJ]U7rIENDB`PKINw63//-Pictures/100002010000010A0000005EA501A0A3.pngPNG  IHDR ^ۣZIDATxhuw-|4-8`(tO=?L>`[<6?ڴރXK$wO|3Sv, Ha¥<3 cIwd33|w3u-XBqb㝍Hu-7?kW[٧DZw:$!Dqt8w0!D7+t2!mGwM{*FB-MWL._З|7m{' ulq -#urm/Z]^#Ɓ9dr#<,M}, |nA Un _񻽽6FK99>&E`E{4LL!A68 tD{-fH6Gjt@oޝڻlBo?5 $!a{'_h<w솸D{bѫ6XCP H)i0+̓_dnAN9zhp )^\HNgcGjhw~]?Ǵ}|5Sgm\$\_I~ݞ:1|mFl q연O{%͐bC`5{6HAO V;Q"L{yӽfϗV䰖gm\ɽ@V t[(Tg_źP[M5>W<8BW?I5,ei1QGn >w)NPò=4@ w ޸c>E#Oi .|_5^F5]'>=1z`[x~VBqٍ8 > W>ny"0[>G_;x]7ܶ=_<+xZo2.~E#*52L64H[ Eaꬮzt_keuč&zfJcͺie*+wcY||S|M7J{ >ٴf9{|{4CW pS kg>Z)0]ÏLzþ^RFk}⯆WӣZέ G<(?y. o5Q=_J#ϻ1Eˀ{9`aGHBw*ցC4cbԩbnH4W*&3UK_dC 8I)X,SٯI̽ߵf2x0}^90w1 φF{3,R8_F^e~x ,0q)ػ%C+Ejdq8+>/3_# 1{0_}~=JnZ/Уs9?ڧ]Ar6zyucFM|j3MKtk;߬z"Qn>ꤻUB0w\b(M_8vvϪ%*f={)|2\i*|5Փ ELRX|;Ul/ca᫠KɆq=) !ܣ-_^?޳b82Mިm]qх$k}J tKogC-m럂źG#uţ`kug5M{b>yuvx+fk7JݺaCtkP]^ް&uwa%⨵?^GPܣ[8WZ6&L ?y\AUoaEy"wgfeߨX'`4d4Jߵ6٧m|<{|2IL濱K9ؽ쫓X*V^ᕍDsaەŢi| ?x *c9&eq*\2=geT7?Jzr*iwsx%wc83PItOמ^>^Y{-\76Be3S?Zj2wɪv8›8aڀYWA`%!pP bFdnӾѽ)ܥkspWþPfxGm 1KwjܮtU@@3UtOꎷWU 6Y^%߭w5 F?Q%nØFœhmRF*nmz-f;w`Wrb QWۮ6*Qݖj|j*sh!Vnc/jE+VK v6!aksPNk1驇cpFcZ\O~qJA`7ݦjx}5?ÏE^(OG]y T^_uu|7k4:1]v("rAU-Ǎ> #y I8Xt(|@Bk8JiCP8.|?p] ])N JG7R&tl-۶ʡTx_GJaMT^]](26 ~[U;2~O"pvlgBD)~uzK] !:Wb WB!BI " !D$)BHR(P!"IBDB!$BI " !D$)BHR(P!"IBDB!$BI " !D;qkEto![ώ"QwzWBltB^$&6OB}gΎ BDB!t sI\h諣>0hK E*bɪM^ou("!D3wBqtu(|_`5> ;1ihI%S}6״M;[h}ugap?Dz7vq691NU7~j̃,baqc|) `!\RBtRao|rW^b~ani s7':4  M}2Er &ޟ`a&/N A)» xHm,9L\q]'Nr[QNh8z(aVw _8ɺv0 F~9BbOb>aX_},0z5:Dn;Od%]CN^<2@r:Z(Ν9G srYvVOl{Mo,׵3Sd"ުtD 3ak <=7"!?Y;^f8>:3ab_w;$$~W((_E*'FTU[j=mk&L8^贮xhgǁpR⥋<;Ry(ʯsͱxmqHL3,Β'-o;39mL:]贎(64'QΜ>C|OϿ#U pCR)̽&IMm6y.=qFoTLé3(|bjy+9 iO>=NqzKm&>/ʛ„!̑Sy|^~%eC=P!"IBDB!W=2 BI1vPDWp]!Ou!,w"!ΐ9 !D$)BHR(P!"IBDB!$BI " !D$)BHR(P!"IBDB!$BI " !D$)BHR(P!"IBDne+BRqjR.Jq!خ[nanu:!DwrH IENDB`PKINw6'n-Pictures/10000000000000D800000064B46B1BD4.pngPNG  IHDRdkJiPIDATxtUMZ)"$;P$h s-.)}Ҧu]Pi{6ic)낲!CW$fkt&mR 3כ;w~73ߝk 6i2M 5^AXE)ER&ct`(sq:Q%?+?qJ߯T|A1{k C~}6'veߠDZ \((C \e$Ze2ˇp<_oq|otd\˹S f@9<' x;ʈ+`dbwAɒFN㕏uFAGBaE5C䈽_ı8T@e26V\q^ΖNjdh:|϶_~+Y@MlN|,ŸUHe֥''nrp}Yׅne/ݫ[ #5vQ⒮mW&0UI@bQ®Fd&'JbI1y9/j۰@劄\bې &w= WHhnMжf戗ڢ8xϭ=j5'؋=e5f:< jF!kp;)frMFAO/VYGWeCs)yvel1 OHޚ<})(Ѓ 4/Izp%5oը_ 3?㖐 >QMVcF5..G7:ɡr2 D#qĸDӭfy@oCQ #Q QQ_9FD>l;~ ,WTp&N9ȹ(zPW3 )ͬ,nĭggY(Cb(<w"gj֖Xs]'12pW32ikg,oa4Dh"Fϣ$"DBB$I P>12dP),C;nC4QX{ Fy{{1[Z]Z 3aOikV\9g}w?)=-p2N9;QkN/B_)K}ם1#ޖ̬\6zpG0_w?=∈8\;b=&k:N}ÝM=L?VSSC(`M:\ mD?Z]^qhBGX`W2fYfÙ7^m֖m EzQ /k(kkgƵܧ+ynvu3Y7m}ynu R /b=_6XmȫCP ` ?D0wA\{Da:]9ã旃Σ'LĹ!a{OX oSOm@^q klr=徻~s5sr$4Y;|q7%/$$R6$20O5}E\ƵC@F.WFb;)h2͚o6Ҧ[yׇՓsN.-2rWGCmFtq fݧ\]~ fzo6O02+Vq{>w@#E.Oۜ-&|4fx 4eE fk8(i7ᢎBQ_"h;@A J5!y5yfnC3 hY "msW (fZڐzpv}K@Ͼ'ņ8wx]?W s_0HP?2Eix?sss}(M(PmxꨈytD8 ]3+%l-tz~y)?G,/GGaۘݻԆIHSǪ|^Km?Pv->͚EcTIzٞurDI%DDcdHz)%"J*QRIR%"J* ((T"PB%"J* ((T"PB%"J* ((T"PB%"J* /NZ”dݔWdydG9<:B"7~{LiG(>%$s0^_3g2#4 sytDD5<F躅aʲjy /y7$x ݂IIkƻ+-{+Vv5P~~nߞ}~uEP{YkZ`bt:Fmۡ=k ; IzfoCV}U p'Xl({Vumk316666='mw[5g3ZeswUn,,cׯhl(/ڶsu䕒4ܗ'9vGC7>;t) m jsnSf~rukSř/єl:r],1fC^~nn{?GmMwV~RЕ՗-ZkY,N8#Vs1Vο}\|%tWic&̥KfedN[;,-_ ,U~J0O7g服Xlᇿ9 *233sIfueuGLk͏ǜR7a\&GG-u677(g?,$mlv bu\|ihp ѣ ]KDS6R˅s:#Ȳ5K^zzAl'XBbB!g??B1jj~!^l;;-!DmpmMM܆d=GW <_{}nQnyeee)u#162G$kmCe "r3]ZVvD Bd]M3YvV0Q;QS`[xjr^Zmo0ZzN{:aӣTߪ&'Neeҋ5Kb0;ޡ_Y̢>O~pr?{Q_{1ϞǮ`%^&8wzz5(uRְ?Q Yg6ܧx=-C ׿:m_u|9=9b[X/>e[϶M6,v1N2WK*:S9Krr2rnɪ%%*Yur6}`'c;\\G;#$bֲu%Gᱮsԕ^ɂtA#`rB!GcCBHĴ4(.9C:iWMo7ZA{4G UP{PD6fz^h'E,jG>x^P+mX= ]#`0p}#dnËM؉hk{Lvˎ-tNAO, IiO%$M}$"6|԰8is99{y9b4.}bi¬D==DT %"c_cxhHg> D98a{͋o!C2̝g?G9?ͽU}+5hXb{БRx}Kts|z+`kƈcϞ9^s=c"_(qV"-6_87dG ˺Fa|\-e_cQU+ݛ 7`m)S<'=[f'g 箜o66wC3,BǺ1qd:g]z*~D{˗y1#2 ]` Y)Z.<=um0( |߯z!cȡ`'bn=ExvVCum4'JڭXb}O>^#G:$jjζegd[2-`Snn}$q=MZ1x1SN65gg4R&ՄQ狰!!xz|A!2L2u/{zP~vͳd}Uish }hF{+MG|j`"fHpo3f={-Hr|'^Ţpð$2n|U6I> L&7󥇶$<Cw4㿌q u@\ skkbX/ID?_hI {fZ}&"3ra!#s1A&PNP>2Ңs0<tA>ۇ9ڶs[r,ηYTHU[UrkCE@P"NԐ^)z}ӷWngf2^o۵[l58r'rPp>(i ,WKs3֖V|]О^mIMq:s»@H{?Si>ߏgɒbcQş+*^ XH3)(`9Z[6łp?OPwTfᩎSNDDEmu-^uMe ctJzChKz(( JDT*QRQDDIE%JDT*QRQDDIE%JDT*QRQDDIE%JDT*QRQDDIE!ORIJDT4ODq͍ubSRIQ~-m6F>:_1fIENDB`PKINw6ȼ55-Pictures/100002010000017400000113FB861806.pngPNG  IHDRt& IDATxh/,rrxmip*kXNz4RcZ-SY)9nȩ}M"[WĕrhuʷZzbi|1 ͒B??k_`,<33/OADD>#. nĥS0gl$""Z 3B|f +IkCDD vvV|H2$i[*#C ;#T f&`Gs ~lq& ޽v-eG1~I(U__>Omq[Aךqcx>6 Ѳsm@Xqmb]!,Y4:1cH<, "ny&hvBfAPn:շwL\*vv;TK'7ɷt@ZH;6;c8"u\yU'`!2k#؝ XRۘߊ"SOIhH t 8}N ng[8vP,sXgx=ιw,t|E._NnΩG혞.Y|pHm`湯Qj2ulŒNB/1 ;N=䭯aoI0?2r@@I '$ AG,7ݖBYp\r_cç"*i,ϒhxbડ.T}Qඊ짧B$S8xkۣݽ{:c`'-<C7Q|n1zZDl.cu℄GoN>g,4%uH0?·,5ZO_@-sFqsq m( _i&s60= ?Ø^G7#A&S>WouKHQ 7~#S@kίܨC 4FkǜLLEalLM>(3!y&nKR'*BA]ӖAv ?0tP_n@rCJ02?ﬣx_]ޓ`$1L˃sتAT򠁱/Wb| .zg^`{M8U : W-H^=c)޷cھk97y[;~dq#C (hqV:.jZh}~#C&42eے7QXad}Xs &bbwh (w L2|Y\9wȶXUTvKfPJ"-̜=&(rq3x59XxW>I&{jK~= XfseBxlgHBhNXѬb,ðR(?o;8Pv4 2' @2dB'PI; 4e_Qzߤ_Jjc}ٷso!C {$3kk^`NpnDZ0 0?6 O  !9 ]AHRF&!6oܱөe9 ]κ6Rjm@m[;ZpuN=l;hۡ2BI S_ FZHv>*cߖq4fOV{z2/giG#6l.",cd!X~ hޯ j&""VwcvEq'/^qHjhXxs HbGvm[z84p1[.OhmT2hG}[Fmhx ;j1q}9 ~ ~`/d*'{f5t,| n].T+[͸9}O蔭K_"HbJd;ug#<ȭ= 5@-=9 ̤ $7o^hx;|}" vvLwCx~H^1~32e w000 :$ş({:0`'m9Pidc+S-(6Re; !tܣܷBAmrSȐb ;+J,ˆ!v4Ai؉HY{&!m2Kk̿-rXi4 n,Kh[ɣ870 j9/YсR+{*k_sgmo,y>w̨3 .+=l18Ɉ@T:O .hDxf Hڰm$\'k}9[q/%'d*umՙ]?9hXRvY[<@,-_^xᑲۊVHNʨOR_Vr ))ygcOD\f6)4€G@( R^fֿ\2I&,;K'nLCT{}vT#A@ 5. "\ +"+XV{}yTu@RkB]Dyl>o܀nGmcDDtAgt;+r/fpx4+6t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"rIAVN>MDM uκ`{SDDUm`>bzo*e}DD.ND DD.lٲe@DU%6u@vj%X{} "r #?zm j浩3t""J>4 I-wS4 $!`7Tv(8?C$};Q4}N#Ͱ>Rlقh4qSY4|v^z{p( Z 3nh~h}-_oeYrɞ!r3Gî AٝXN*' 5o1 },a wm`юAS=Wif|i/ ,rûYɬ߃{7xqWVN*L'C Y'7>܈S/~={l_\!Fxzd-k_v:۶m[2|IZB9l+8ҥHG 79wőaKu;5l3a@_g DT))JD DD.ND DD.ND DD.ND DD.ND DD.b1b"6>˥"7#o gr}#JZkJ"܌@W4f€^!~(;0}sڙq^gP&*N؈Ƣ+h^jej!Op&l1c_JR+iAq gѤ3epNXMR3ضs2 sBfkYXw̮BTJ<Gt6 ^"+3a"Ct+b@2w:NGfjzv)Y6 蕖̸ +^2f (^_KeB D4X[܌@Su rYȀ,3"n@*P YgJt2RJXQ0y{g!ߊvTc0+&r+Ye3m;j|x<գIghqNEm;wf,Q;HWIGT.BATUUq=~HB{U Y@ĝʌhx@sbh4~ aiWl穓(3N"g烰؝CYe%蒀*th, ]/ZHHaT)JZȢ: ({=NwVV=Ț@/h[yAν(8NΨE_ mrUw,8 2lۆptމ²,LLLi:?,/.3x4dmÌ΍Mn\xDvLg0 Jh,zX N?Z#AדzzX)p#g.Rw)5 FҀVQ.ٱ 顂vF<Z+-ޜn<])ƬEV )p/=%'P. ""M{N&RhȲ FK/~u7 J%CJcƀ4եVb8}. (>B'Pl.'ܦX2Cjnfr $kTr]Ypo0=|GnD%%_q}ea mv|P0Wo\c@V\Wzʿ6wpҊ_rx+r^?㨽jŀ^I@߭H;Ʈ]a&~;*~iw@aA,C{[;v}n.up|P{-^ڐ]$ZKչ= Qd%'GnFpGpW +(w>Ӊg:م3?95MZbD(6l^vPϗ,z7RJX; RvnZbq)==vl ;ᜨZfnp0++ClOhJHo|Jԉj2>ôȽ{^w״^YS]Wҿ/"8Q _ŷ.屖_Հ}v xŷ.6}>ݲqEuN?}><'nMJAtuwaҘ'l3=rvc~ׇTG6\*؍(p8ґupn_DUN52^B׳]+S/d'7]vaAt>}jƇFߜ& l۶m}'l vH|攻y=[rWF+:c&Ja:K0:K0:K0:K0:K0&I=>˥283!$+i,cTmE3ǀ^!~(;`&L3δqj]yBWbqfR܉V҂U v o=1kN8j3b1 \ ^%M}XI 8Sqh5oMC*p9 !7Ę1ST =~H%͏7E7Bfnlۆk,FA<R-{eY0fyo$R7LߟLfQ 5]rY+\!jQ@<[l @UGU.S^D N0f h5quN4}2 I;k䕊۶!yJKD^![q蚪A4N߶^#!rc괜bƌ#i@sF+ϡD€^Y#O2-ܨx`osʤֿW,jt=U< zXVlJZoTf_\e{p"K0:K0:K0-.1F7\~ \\%Љ\%Љ\.7Y6Q6 |m|8~[FYeG풫|Vuf6ZoE6ߝ xrWPUcUeD3_>χ֖TBde6SÀΌ[섍oBxW+h|8LX wb塼u+M/Cױ.@b1cv[ u0ҌG*l۷qû81\PFR"<\-a@_gn,o<_#>{> ߏ9 {')VV?Pyt? 8YѱQmt(֑ #h;܆mUm~ξzG: 2W`ξz`R{-}о0Lbo$} !pW <߃k?> cƹL _ Ø1?tè1X?M!bp`BΩ?Mafvm_o[#oq Z0섍myKVqm -\*@߭7 ;lF@@VEQhuڪ͑ #hy+;pyt{9g:ݔB,{{ ~=qMp`aN"tWd'9+RIN5&+LSnt}4 jN]X0ɶm\tH: nRj m/;5reoF*9X }'“fLrΌC/9w^;i|JIf2rX+j8},EJ(<`q_1rݞƇ1|ax QY{^w״^Y*TU!y _I&P{/"7"܈i{:SdaånHe#gL'C YFztl_Dӝk$'SsU=IDDiR)W( =ћrj.""`@'"r t""`@'"r t""`@'"r [\O5~t5ĀD".""`@'"r t""`@'"r t""`@U]9rVp5X_XzkؗrfJ*aOc^BkKk9/g+jfRt;qnBC'bgIpܫ*۸sj3M?/@ ɬiNiӅt>P! ; }~:K{mS055} rϙƮ]a&~;_KX|v:9/b۶m݄7q?^4 H}8W4Nc󘘘VZoya33~&Zξzbtlv{Yt.x+b<[!=,kZ 1(zz{$D;:ޜKPb?^6 )wF(:FAB!ϣD/uJM& 1Xy&7ȱg~nj BCqmFFH"5yjƌ~\7#}w.i 7ԟE180!βSvjʯ :t`Ҩ̶m'p4~͏5-gWۆRǽmS݋N}dٙ`{VA;t@Qf_zn*_N;2myѪ-0WI';?Ǚgp{'`2O-8oga1`6Hk2,YYLhԹsVetaDќz}r}mX~.yF>ڝo;Bq3`Ι1fuȴn&m6|' UNt>Ӊx<.nZbk-Fq@#%3f h;"k]iZ2cրβeX,5M+{Wچmkw))\軝c`Q~X{VvTH! @ÍPj :[F1J(>Ĭp;^r%_|"/f 4U铧6&۸+R7øEnG~dr9w96mkw)v†"ue0 ܚYQRXz Vr^I5szCsԲTE.3·+8S˿{P{-ۏ;9ރg0 :)m@qcp`-Բ/mc6 \oua'kd 4Ƈ`>(م {eVX-D_c!D̅gZ3&2k˯īQ4RG4 i~5 tMnB~GD./xϛ Sxw$z9H:;--zeafھ^lN}:/DF!-6}xLsLR`[к׃OKQKN(Q^! U[sonDsd,#3z{߻Nƈ\(s+5}ݢ[xYu:6 vsјRſ3ߎuegiQfC˷SÞfl vBal2?_完kBT#Ϲy7u~r6CXؘP] #97nҷ**`N~ՉsE/*]*GH]W!W]c0un gMkhա*b ]*gjq={kL_cYٙ4M0 2 @>BW!rQ%}K.#77Tk)ނ{߳[\f{k χJ-"xm&sjc 6ZJccu)L~u8 @%Dzum>`}8Kh`b6#]Oh0^ŵ:Nɯ,N&2PZOcv{/5T04y  v)M:MxqmsX1,{m%i_=ڃs(@'bOlJIP˞$n ѶO̙՛Cdvy}L `/1U9)윹P.?(n?[4J}^Ҍ_f9E{] GLͷɪOuInAnشnbߌ;~aU>ƞIͷ^]kZ=߫x{d 5H\U@?x5 bG~'q+ũ/|xET;>6,!_4J[xƎKz)Zs~9/z}i GvU͇ek(9 RI[υڭ׽xm*jV&!6[s1.nܽcZN'R0_TE̕צ!gcۀ}e w7/^^h<>=fj~іX~kCfWjj]RBM7KԵrMbLKAQz_mPr%)!6l VDUV^us-=*4-g!Ľ)W(JoPUV-t\qoڷd{K,Pش7Bd 0@mO- !D1Q"B$@! P!pHT!B$@! P!pHT!B$@¡ _L$q5K?/.&7 \x& !岑P΅gxإF%|,/* Q~e:'v)FHW_]`G%Lsou ȕ5qc=?N2^x!pHT!BJ;]9@=-ATIix]VDywԗ)tMσ2zz3!u5E ڤw095IV&^Mx}[O d28A+}w$CI)E}<Ɖ~N z8I|~8ձ4NKDGͫW,FWxNO1~oI߫TVCtwFjcGH3]Zl{PZZzQZj4?`0ٱmǃ1ǁ@3cA@FƠwю5c~aAǟ?VI6A%@û .NZ =ݰ6[-Z?H>4Fӝ4552Ϯ> {tzoލ殼ߗ ԕ$MS+A; o%_{z?qG$DtO~JlcWC$msJ3 b8 s ?͏ߓzcw ˮ0odnd|aR r5JvBOf*m6/{3RVr{Ʀ.A#ڞj#r.KXZ#\7{tEu)h#EGxtq!RWo}^j\}K]Ggav=Z듮zg?oTԔ[`X9PTAwzI9 .( :j]]s1|x 3$`[=Ac(p%>QU>qcT&fzO"E4z0232i܍eU{Qfg-v4'~O,'Ӵi~p r/'ՠTUz_֌5c$J_oEaWRDEh+2{G4F`eΘ(^׮][u+l+PagM(P}b6ca2fl&/L9{ֿ܌C66:Dsk;Bznpq6@Osn:[Zy"Dx^47ywGΞ瞧祾Mѩ {G›VFl>p36MMMνn km鯕5/<)zvag{ίڙY|HGe뗬ۏQ#k??Aѱn^THT?*VSJ٘0"TN$!&BЖXBHl92BJ65oeg{Pl~;LeJǂDU)pb>A2 "J'CyZ&QY?*O !sBB8T:u2/P@Ga]:uh53~vUմu:t]=pU '"@=< 1@rRu,Bט_? Jl'70gQFCT]1ځY\a=_-\a=0o\jWeq=>n7"<*Ft }-/w)5>Fv<@0:Xtvtlߑg9K$t~st% $@khvzo+7AEulOQÚ O۶l+wAbHUӮ,˒>֡3kљrVg)/{ubN򛾉Wz۷owoO}vzz{]VUHDF)xo ̋cgn?^~ߖHU*6O2xreT%ݻw]>X_U1BJ$*I !CBB8$*maL&]ZcAG8H4779d8HzL_Nc7ǵkh?x,P:mJ.{oO: /ǿO"}:_OUueg=}04zlށ%>r\*Z纹qA69P˲yvKZ}: ln4I}"}5hFGa>Aڴ~`mO0^՜vxP_A {+ @Bd2m<ߞ~~!'6z.\*J2~nr7)""e+;b7oKV ]pjj̍ ;dmc6.Q71ȽDu](=z(_5ϓ$?Ono?ɸH²,Ό_r1""=%ן,0ÿƺma4yk.K8)#cA^RU`R Fs&9ykcw ۶?|D(C<B6N{5ڔ =rtZڷ1ڠ *6}o>Hծ7RI !CBB8$*I !Cwnٿ]٦IRMZeK~$ؒr$~oEQC 9^pvDGx<[̜#aTU$/l9į @+N*wi FO>.w6FObYL^seĿ:DIt mj'پ};MSo$.%<9Xj6N0yaM8q:{"UЭ>L^M2EݨKN^Xl?@l:iĦcd -,@hb̭ mu1;( #o0 |.f/1o/]=n+==J-JAe"2PFߥ39aر(OΜUjSTFOεCO'd/o<9(s[D͎@b$@! P!pHT!B$@! P!pHT!Ёzޙ(I1Bqx sjC@qBT@>aNmTNBj$sBB8$*I !CBB8$*I !CBB8Tx*ݟe*E!*Rx+:BԊn5b=޽[B~CoIENDB`PKINw6v@pp-Pictures/10000201000000E4000000625BEC7CBB.pngPNG  IHDRb@H7IDATxhg?9x_ASbBdB[*7]"gV4B8lZ$]q׸-&BIN^܃޹pvat`*CŽ0/ dKd+(~>Ҽ3Lf6ݽ{+6!Bq3CB1h}= f6m >y7ܭvI6.0GH:# HS4 8Vo@mr ab۳D:#3.Б\~wrt3U-l<NȋvZؠ~,*0B*lU2E|Mrw0 2GIӏn>, ½Bn{ˎfz43ĢjRn {[ьY&?ܢ3耬N\y"lLB+Ƿ,LPL8)dH>elBhaU}ozdoׁKN+ͤ 53sUThq<27~Z{=Mn{,5 1&rGUNr8Ư fnzN3q^::c(zs];4֏"~Rm"/bI<}v[ Ec$J뷗1`o]F޵{+R{ 9V. M_ @psFu;eaGC[/k xas4tcyMXK)zUco??,ꜻ/4V\oz:T;-8ĵc]º~UܗYFuD,?O`CtKl~m Ө\h"Z5u{ӛȻs}-P-mA3(5!06ھ1PhLyJ$N2Ʋw. S1H4_Ըw sãs (}{WOnxңV?U綡*U^G)ŧh .ތ_Lmi^if mXrI魼ˉ cNUů峬-I>ױBׯs:]Vf.eA.q_`s{Gdb߮+ 0:0~avd,gHtmW.鬃갡1o:ͲV2 LVء a3Qh[}vȻ㤾)?ǩ(Yvnm[3yl$, sEE_2[@ Ei S\ރ6G蠋ъ~n :do+znJ&S:Qw2Xm,dK30u*RuOm$JԷT.HǞ93F?t Np-yXXB֑*C,آiZqweۜPZנ7Pw-&~Ķv;1Kb f;}tn=\lQr?5Jgn Ihf^8!Gxd[em?Wy witH(1g1!Nlz WIWco|&JnrxuN[:C;WQs~D"8Fl^4) {f. 02Km[B ZuvP,>`rSTJJWW4(YLawƜek.э3˾r vH1v"֐*Lxw=zDž5,;e9r wCQI9?!|61v+_qz&}KOURw۶tKͫqEI]Aѷ]*ʪUDʌؑ##=K2л-\DkK{ ܛ#/nP/. gd1EwaPuͥf yT8/<.9FfrAڲ!:nnxnx7 &)?ͮO@g y814|?VjT;К;tTýW&U=Lq27DVO't8CY.h-宬(:)ms;c}?39T.O\4*E5zGnTNzle-dC f_lW[Q 2俬6E55)w#K_o]$3WfO-[ \D-{>O' Eח\)kW+l;vWQ ʵ{/J?I]fZ~e3}3Ƨ]||T2}0ri@䘻]D{{Mk&ue϶;I]Jq썓P4fpWG]}ԥQV-rp|Iײ%dH17p!zhK&vZvُ駿O̿W^퐟,_DRj+!1/C6;glYphYA|zJ)2tvt䝲N>Gbz˯?YpWGϼyyy<@H$뎝i/Ξ=#D"ɣE{vbI~3yk]H$9l+NzvoA:D"D^n]O?$8 Ѭ7R Zr*7LjnJuͤ=Ig1SCD68i,̕$ -*ev~ҮFϮI=zK)R\.iXq.*ЂTتwr8; zG50!T>)f}ͶDrPޢ-(h1!~9NZhDC-7oclL10ѕ;3k1ǷwhMP {!tz/$,ܬKUaOp/Aϖ$ia׵'Z:}-u k] -$ nı-VW)W&!tP8qnpiFx č \8Tc۩s/-}]JyV%[<ӦKz.9gf g.nH9`J1o:įu+U?v :YlKRA0~a:uJ6;Uu|ej[}s/ ν$W" Ւ(hֱIYY[,bs=hV65d=Qnc) ,;Sp@6;i38 uq * 1  q!A{'LLV|B'ߵ׭SwnBQ8=ߏ+6nS vƼUGQ^@_q2~4Je;PBQ; ~ѷ0S.&=Ж<%j'[c1pHsYq_U*UYB`gT:# JHA ՞Zn肎--бY&Ƚ4 LE,aiл̈́삽H ̛ 73þ'l7)3ͩ7+ag.Iiw5x)΅InQ{lNqŭRZʶD e櫓18M׋/'V f7g_{/[Ty{edOcd'qTc2h^X|Ud(kw꺂c'a4Gp\?L2Y_XEq6S4_E Y TüAn@ߠ3^mO?BHAvL)tn]lr/0v; N*NZ% B+(b%Y\ #־2BuSSXe>! wntDYWEQn]׼0m~+QE< %tB*P8[t5AtoǹnN#_3G6y?sAɧ7~j([RrSj!Bj_F$)gWױ玊EZ@.{qp7Cў Bż7JZ9V9 ^TeC$!ySAkfaey?(.=[ r~܏\y|UCp06 Fm'U鉖mj.[EB o2 swc[o 'sGB%;-ԉp{u{庵/,$pv%f [;bbb$?Fw%qu .١,Wm7^|-#h \xbqPOӹM#3^|mxBi-bS/ȓmvwji\xٖyԻMl2`2bUɚŝ]oWq3s )(ZBQjnž^mS8q\mNB5:Ptt{8s] (tN8E6I0P36QTnPE_}n[0]4+\nS>Qr W,P⃟DeA%}G T" 0RIHD`@%#*)P$HJ$F T" 0+,&>+J$tD7/%zBęH$VDif%"]@s{I.+2LT" 0RIHD`@%#phjjºWۏijj߱Ycfu=_O<_2 u05=V5 $#wE-FKkͶm^5/D"AuZz=@4j ^ּ;rd/-0|+i];l-I#4551uݏFhbcUm&#ZBz{j>bv8}=HSSҌ4I&TR>vjMt4M3{!Z>H#ٻ/_֊~y,ޟ=Ҏq^lՈM0e^.-'N낺Eݻwk*=kkk;^tG|yw~xm؋Ǽ熼莨;1OݠzHwKK8ono{=#S?^xoOwڼҫTK U}S3cglx/e/5ށo(KcE;/x@ͱ(l}_˗-juiq2t[ԥ^ik;\7=_vg?Gb <=P3cg׻ݿ'O,C! 4з*a>ڼҿ=y׶ρ'b4n/X 黿]ZVJΧy5g3E&OCtlP׭:R>$}M՘eh;w_6o:% },*xN.ltukjUw%ɺ"{lWx~4tWzh*]~/->y-ɩNJYL^+'HJ-C!B61{c' fwee)K[zS_{]u{cѻUU1:K*ե)I\N[oӿpeGqgggI\N?p8 Y(GJY <=ohkk#q9+?}sDgGzI|`q;8OC+}&8rglj<!9)ژiҷoűYǕf\q|xt MӸ mnk]X_E]Ju(^œN6)]K>lݻh,sG׬+j ~傢S̕>@[[ۚSl@~4m{}lݑ^ah"y=$ADIpNJ)OL0'qR Y}º4hQFAFG sl4c=mt.H<ndR'6Ix&{qӘo#\7 ;q {4G,i@GFU@ًG9ӀhrNz 6$`Y?Z'$ 2L?5;3mm1Uhq[6PwDH}  6OT(h ʑޠ#4.qIv,* `#6 Fb'@C]3A%}օ켤틭G "4Ζ+V@nvBl` + (:(xJ1ْ)Р4HBO$ . cr{YyT@HqP#p)6pWU `/=:d6!T"~wݧ`΄((r뽄/g^E\U%h1q/ ޝ]Q9C(#Uu1HdT^BѴF@ 4v _y)x#ѭy1g#!'*4"E\LC֭:X)Pg!( n['_* ߆]Fz u=BkJ.p$xH6n*F@3Gҥi4ĬlE m̘?ɠ.Z,|lAFlwRJa6 G7 J f:f (XI0Ò{c N&fКp e" h pȀt}{>?uvwhTPp|DE^6{g~wJF ?w :[ 0~p ں'r4m[qȂtVE* qĖyDh ;bڈ?ؒE 6w!V=>XgO½eN R 5صw #_m4dW" 0RIHD`@%#*)P$HJ$F T" 0RIHD`@%#*)P$HJ$F T" 0RIY+O:t_*H$&­Z^#eEnV/rHhY.+~iXtb'$Ie5D`@%#*)P$HJ$F T" 0RIHD`@%S ,X&WWFpC߿xrZ S!#####G/LγZF& a! ӃNesz  ͇ kRs]N$33Zݴ:R80c1c# x%%Va08hh^ B1fsnvc1c# ")ra2^U^KNR#PJa0}y)r囼X߿ J8d *5kudOAKa>cleXNgsqE mj>5LӑKͫ[J>Dm;U_Í:%XV7od8(݉Uq-dc,x,+k,Cۇ԰X5؞|YG|r5=OK#a'W׾i錒S4\K\I>ؙ7k ܅ޤ$BY7_e^yS Z rɴVRybT[p)ZN2r/`YV7؎vv\aq`/4X:w!\`Tv&dBf2Ӓ~<).Fjܾ?GX`Uán@wLC 9 0X 8[WQhʡ1Lx0JIs,,!󝰝f/^&6iuvQ ;%m=e )HD($Ѷ BQI ϧ.cYWaC&ƶ[̞S`0 2gaX6ڜlM"Z"cV nLc>՗38 ofؤ 7]֚OT jɩ3(5O踡kq*ȐLف.c/2k~}p>+œ aApYaoǫXE_ygVý@ jK9-pԗuw+5MjXBAcg}pbm6Z_﨩~A}d$%S$ vpе踌s3-k"OWFrڔ?ؖp>mI4dnm \,z-j3? E c,xp5|5e,sߜ}+aKMMӜFI?O&lUBul~#  Kzw-$r\0xxP5%y!} ?L$Ƥ S"S}s\0x@oYG1V<<2}12G@  ;<(4(/e@6#pT23ǎԐ3O{9бۄRR*%{nS9gj~נNMadddIUÇdt-<H3ohL 1W˸EgO_Ejvܱt岭8np47oj9ڢP*VYiyB ka xDsp϶5ڌI4-g,U8Ww53twl?ZxPZIHbUb߸^p8)q7|sDհ\DZet?{@|<+z3jX 7.4!iէCO=D \wnyDjSfeĬIRӼӂ=ᾄ`L:ܥt|QUsp6r􆑑d&XQW" eRݤSNoRш-='?uh_@bOcq<+9b#@\ψv!z} >@M| 7|0{vi#E p1ho8BխӻK7n'q.sq󖾥.2bzRKrkfaQ#~IwV/ # ^/@ **SsZM5Eo8DOth61@b@7i>Y0j0>}:$޿_ F+z;K@ ӎ޶Dُwr6+pȑgmywS2ї$88o7hS{?+hzŵ[ Os@ &Q 7LzzmsIZ56|iE5llxPsI̍LL碧LvCzvti^T [w M M ####G)^ ;.8jkQcŞ.۳sO=B%Q^{˩t)z} ted5RoJ3<~08\&# UNJ#T0e|OI U"c1c,vհ-+AdqiUE7_kW nġ>O;W+amV\:3yf ɧAPw^I 'mY`W U c۪$MP ʵ_* NbH96{ PáO׼YQ;jX8["}Ԑ]1N'5GC+fjv~Av"XjAk?nNCXdl݈qUDG!###GQs#ydTc _0222U+5|zm0A?G7|397z%qc5ivz]gac/E|&jPO7 ~d/Q{=<dt[6n1Q;\ڎ ^DHb&ȮׄyD'|{=~ cEL\õwr ̧Ѫ)CdhdraǩK1z#ernDE/)ߩīuƪ? rj:,-?ܓI,j3<=fkRiws,yO̭jI|V"Obh{%t^,Ͽ*[/ U3wvTz>hɵCA*q7j\-},iN7LƋFFox ?jQ հI.jmf[ߠ~Hׁ45̵wYboO|\ߚbkyn  Pl)]LCbQp>??B_ rX'Y_`CKB{9<9O?|{u˗-gvb3߷ȒfDy}SLNG7ԮB<P}@S[[]Y\a^AoZf r}ZHF2kfg-EF4wM73y1z#dhc!ὶqSPB[&ޒlq:b{ױӖU^V߅gA1gʹ1W4s4xT@O(1N^|O?Y;_l/ߢϟz~P Y<ް;F4zã#}ԢP0G=v̈Vl<{pSc[WsTYjv~%g/P#\H) ^~EFhg &>v(G&1^~TJ¾EF4 #}1ZFox ?jQo& >bTHQm̵mp?f߇Pà@ZAӃAGAx^Uw֚u~k[yA֥UN԰:]pw4|7579XOyZxNN>R_\F)gdd15q0 2 ?jQ\#>)MXOT76\a1&g'2_Ap} bLpP?>e媛T)R.[cwsrUVoWT7oa .mV#ƜEO7L>c.҂u(hGEkʿԠ}wGlsYi>Tϝ<;WsZY7]`2,n:6BFF&&w1Nu.7ySNisQ$[GO'K2N&de6ngx(Ԇ Xq|`4L-hWTcc;ް;Fc w7nYI Gq kӺuTpq5ddd`rBa5\~xat VRSRbYii|L[Mn.%mo߸ecUzy{~GghZ4+ 1[DQ$O7,c1c,혨 {]jJu<ް<):6D ]rW/6XP[j%12Ƙe${PSsS3~ [9L.cYzm?ZVWl,uo8G 9*O7V]^37 Wlm0sf}] D pr _&޹۴D@fjoCo%c K[˙gOYLY^absoX"c1X1S e<0ٗclvnvU\\Dji= =MъKA LHf:E{E5|N=#+wo8G 9* 2Meoff= $qdhMZ&Ľ֨43B )WTPsʣM6C3Ib~Ŷg"ap0c%[}H?C?jcH&>U?E{bwTlPp:VY hwa*0'kNxW$rZwa9$k |ֺ_ 6Ptx;A a W#~###K]<7|z 7L<`8rT)WpӒaHȒeuτ0sDDcL#*9-{n<022dgXT0R{]v=X2us𥓔9hadddG=w-\7|џ{&Eyx~6ן甯$dCYvwZķ&޽cabyJa>Qyü>࣎}ʴ!_.OkGL %)kJLDt1֦qꢴ$$ͫ-{иaNӧ5~x$dƦF팂s9~*NrSz-+ci̶|.g68Kby"##_%)y85Ƃ7<34Sعƪ#u.* tt2yݚXEwcbrHo쩄{׋4^W%5)igpr05Dr` ʵȘDTAV%9$ I%^廴[;]z"-ҸdXaRr^fkTl)XVZnd\i)bm幤M-lJ9O>y/us{-V4yyj{N.Ҏ?u#09V֘e4iZib-VŐfP}%^;gkgYh^XVt5zaYgͫھSݤUYΦCǚxuRiws,y̭jI|V6uIs^%^_bn *WyθsQ =ͳ 65L`K9s$edd raIwoKyq eDx(n8ӕs0)uU9T U7RZ}zy'7j[=v $ #jGvY}n:iϫ>AtmIiO{zޒ<7v@?j] zQYP'e6rĹ{-Uc ]cncN4Х*wUb5Z:ZWJ{@xSI R !'m=@Z:jR4- dKמzj;9 J66vY]Ń^TX} -/SKX*r - fάO3{{D /8*'w6-3?-{0ЦTUjoͤIO/edÜ}u5i^U1+ֶv icZf AM%|]>:Ϛ+vm}\Rq32Z^ S<"@:+v69-%dF.WS 5d]1Vq`>[ ) nȂ)ԓY Ibָ~p2FZFF"0ްȨQ g]-u>񿭰ǟ|f]bVǓ;*xHsBu0$At?yu?: 7ЃBVMN3\j/rgPs(kxxccs;贬tm <$@;O\hSRP D*jMZõycae%yO]7=qް;F{`ӷwmJn%i>A+~ `\qKJ^8M*-q'rDz>l-< Ю~诐!Z<0ȧSIAezC a6 pam~ ܘ{Âw)C&}*ED1;ϙ)BT A1hnӄENsG`C19?9?ԁw[_Y.`KYO,mlT .Z_?kH%wA;ZK6+y4LN/! W?*1<0gӣ];p]rWJ5OR,?Xt/kY3QްNЮa#u;>` Z1ʾ>Ifc}k_ ]! :OROyZxq#eܬُ-u,v&hY ~jOQ0@@]DCj~jBx'[-ՕfNA^+a-@~ad:NB0Vg5O#9pA\Ed<*S|Rǖ|wɺ֑^oZ j8 2ʙ#k rz}?_:K~c;߼VoxvKv :LO~+ZZ>GUt<\ŵjbOjWT76)M]ko[.\^"C/#ӧ7/ϼifʢl]Q xyZjX]n$5:-Q 52DVN7L)N}vD 䎀WUpt=P_xϭ LYwke z pFijutjm,J-nhmXw28fgM:$`ӶkPtmF q6RwӡK sg>'5χRRgr>vFe;tfsG# =8wj׷sĘ5kqC-55iM\O \ ohcze`?o j=C:yCuEOOklpt3ѯ?ʴw¾7́3ƥVj˩*Om#MT$K?7jmz1g>22M/Q2P%obPqݱKp@]*HX? Рa91K6&jxa wo_!_, GFFF,; R51i}]791K5&v}R+.o1-5X#Go7sY8'Fscf91K6xz"a}~[+'o-9*b7^+6 ~ް91cIտ6e] :Nx#]la8ojh=󑑑'I@9Sԑ!!0C,T:L粞1A p #O* hPDFFFGcNfR0y_C 2EAL.:apď22uèW N픒NŭN_;16@5|<7T 5W)i4^/8Y&-w;`\:aN37h-/o\022D0*07L5B-@ ,Z^a`N "ᗃ9s9p1\/νN/]c0UYrO qg8D-{t< y! wbx -ڇҔdss.UW yO;O+mV\ JNZVE5L͜a^N?W,{Ys`X.,9*o#O!O}o`.I^>osk-֔~ -n0Vך6*ED1{ &!/ S:#zJ=<4Gd&c)#;c]7#,e&V^mQ=) 4IA7l|ޭo(5̃< Mϑ^QS ̯w-ˠXUMSm/n.2={ 攁^;Üfvcg50@:hKJ[l-6##~D1jX~Z|B .FoyxFo1@oaq@oyY?C[+R` Sď22a5tjg@ 􆑑# #17Ύ Fha}5 #HϪ{Rȧ7=F"l6I&Foro)XjK #Xt@цm􆑑K \ c6/RV ####G>\}" HY zc ϼmnc5s{q )aa]TEAwTX[Lk-V} 7<@RV ####G bxBtek**ZE!e5 #33?gLg@L0`oXŽ|Bva[TUvJgmin/YƼuqno'kun{[ iHk9bXd [EqF?p]ASˬY[ˏ::b}s-zQ{6~Ь:"e5 #G' 5`%ǒtcR熌<<o8).ȲeYb[G> 4/Y* mVG} ɸکBR@U+G V)f_*r;p]AS៵t_X4b=LIUIފ<S/_/$`KY FD! -yz $B) y9wk ˞XC; I 2{\U2]7z{U6)T>nXϓ(%zOneWr+RV #G) TA?Iy-$17dqAiɾ,%5ڷj銗j7:? oK':.l{*/5lOtviHY zÈpUrs7µ q;GZad{*4 YR!2x1Hհ.aD)Ö{#,RV ####G HY zUGZadddbGZuQ #DaFo9)a@oה;2l}n|6 )a@o9:y]Z?vxcA[>IN+L|3=CػײXսoG 5Hհ.aDTc| ϢlioqHx$0qB- Eײy; HY 7YYZ毡.LG~R>~JEk_Xg\FtX3qS㻍-׬XC-Ŗ=}Zg&)e/ %M^QqʊJ仓g[_ڭO[{ \kϾmTt%dK2} 6K M [gUrZluuz?~UTU|`͎&ךUE֢²;75[tV{{+}2luzh +wU_/~=Gq%uZԑ=lns}sncYU` ]107Nx@ZGŮsHF$.U8r \h~\k522 ]=ռ}d(Y33$k+\G1b<5Ef?@١2d8Ͻ31?3;ݽ ymo'{OܚRX7rm!m[[{9/isuI݌ b.Qŏ-}3mu۽j/ɜ>y|Nf,kO ~㜬w WeٟeueKV,o ΰ#\u^^5Y¦TڔajF1b HY zɤ,YDqb̒p:Qi)Z-&Mv_OԔDk4W#אn-?8Bq0\bH%^l uvay Bo\:+k' lQ,ĞW`Hiwd)(CQysGrlLͬxbE von !FRkiNSi ;u!$Siy<0Uq"tzW3b$ HY 7"fZԦR8G֬ZC>ZfћE"y6Gv!yqmC{ܢ!Z~.j >Iyry/YB"|5|ܦ ,=z쀎*F01{XЧY ^=Ƥof {gg'~"!lo=cҾW;NjN|y7w432yuZwԯ9YgSTGڻ J1 W\WG&^JP't~9v.Lo#Fq xffO'yᗆ]]l* 0{JU"'!bZlXmMʟVۿ/t}aAa@zK9^A}_ӿVZ1jET}@TA0q0L2PKAB@7 6l6fu~QGGolQ$r^ײƐKMPN ss7Icu\zҘst9uj|z:\t:;F1b HY zɤ,\pk,k-԰/IZn)ؒl_oӞM܆O0>WT7H5>7n$?\?3m>*v,sYIQI|T,\?GodG?|{OMizMWK:_p5Ͽ}ڝc)-,5{DW"|Tr[Eb son]ҤI$5%Inoi[Bl0 ݮG8$3?P HY FD!}|l`-:afc;;5)Z@T͎ngLJ aN$Dr}U6EkuI\zsKf|l41!cEF\qb}wGf>ХD -tne28ЦZ*FAmwKoנ#<[ @oxEjadd1ɘs kG(}Z0[xe_GZadd)1z>>*OfFoxEjXX0@D)a􆑑q" HY z HY F (7<"e50222rt1z#.RVÀ0@D)a@o9)aa]TEGXFFFF.FoxEjF 7<"e5 ####G7<"e5,j@ 0z(9/&~tKEk򮥟L?rv3S=zR'V mO(!7 Wi6Vy϶=_Y[XXX'Qz鏤=;"C2~ڬijUMW 3גNNN6m\Rt/X*{>}ڽ[J[oܾqsf̼Ltj?$O>|L. ')a􆑯IMEcE{C{mC-!\i'Ѷsy]EeueKV,tѽt6-K~nV ۉ{3BϤ^VkViKw/tq:҉fƔj*;Tk8o8qPtOئlcفoԓ*ڎ9{)47rm!_+jx0z#.RVÀ0"!&}u{H ёwwޞ hh R W,$/(4{.9Tj,Vkk}]> 3%lNYPlrۑ6.cll\l#3IRǪSWtd˟Y~d@oxEjF~KP z~• )~KTix5ܴsfŽ/z{Nuwt$&s#z x)8/DMSO ĉ6ЗS-feqZYc A5|3z#-RVºQ'jPj,]|iIgJ)qڡ뿛],ŖO5*k*(/>i$xnwHiI&װxu:6jl'` \@L$10zF[)) Zx*d!Z6kj^5}ښڵԷS^hM3nL C_;>up_pMC&v!wlCMbb͊5007/OA':?|aiji U]9}*PcT=7<"e5 #9O]kU7Yƒ%EEVP8'I#7xGndWbxfSKs$Μ33W]zRV,e\é'RXzzZV+wQÃybʷt[HoL ՏjxRi􆑣^g)qmXq{X]x񰵄g{#-IZZlkNB`6fYgp={csYOzcGZuQ #DaFo9)a@o@ H07]Hհ.a$޹7qql88m0 mW4Аpp&WL_hYl4K(o$ MrŖI[& m6g%~m cP*re7L ##rjj1O F ph rxn;WGl]3N@ЫS#EnX^n1\5u BrjծqA G0rѯ//I"71ZvÄ0b$p%nJݥ_ǷV #EnvZ7WD7c:|5Ȏvxph Sp'&b$@Kaӈa%̒?9gHdVItE'ӡȥ u=%orCGnx)7Milk`)eԮhu_LJ n%"5W 4vG:|e6ֈFCQNFwm&FF9B@:Aռ(F #71Zv4ܰYm?)~zex(Ecz:aM5t:Nv70gX.~QIZ%WJ{Wߜ~Kzoc憉F 17 LU$Q~7u@yD rÑe7L ۝bnXH6:6y # MnW0%̠ZOѤ k -aya۱RvN6}]rOUe[{:t;;vJ뒧۲3p,>y x3?xn8u`p}rt+fJ퉮Ы'm/7c}k(aV~&{T>gCo|Uѥ)yi>Fx50s2G{i6f󘂿2?;Ι{k]'KWkZ_\g%ܖ0xn8u`8_yT'+_qgƏ2ƮM'8yֿCj5F]W'Gi$}$sEnXSh k󉃸aVS%^^4RVe+ +YQ(U^ٲ5˚Z]פ[k[՚\ҳ^3?7:fPIic+ k+r<ærcݱD~Q"ŨMxq5QpG˿RA;d%|EBQFpzw'OS%9$̵dq k -apxmC ˣ1Jt;4gicӘL;}t_Ӗݚuhׁ)&+幙f#>Vvv;^Ǡ5.'7Lo}t|mAn7%Rs@3=1HS[# :aMe7,/;amP7LJn8mmj7fV־ӣ@↣\V1|@)ljgNvWc])7Nv}I,ڄad"nnӢJN4˯Uv>8ug݉OHfx;-b1ܰвp7|%(ȅ WXȔ5TnO5py7ߟϦO%Ywϓt7K{ldS417hn81nt[̃ټyI6=s#eq6Άv#9Yѫ70 $;8CUMi=%kyS7oi5I1i#Zh+rÚBnF(7\VZVreK cX8;Әϳe-[Lvԯ}bUL@.lQ1e ۼc3G5O,2JWnh+-Ú%7co噧*$eJس1vÇ'̭ [gd[2(8<;7W|#V(aMe7,/{J{I^ySha憓<3M#`iwŒX} k -aU7lyOĎRM=o0We G[S;կg' ѹ"7)I { { ^3?BnXzX9ԨE P7ZväM"/ݰ7(,}<7~=c\-aR+7l~oX/ϴP9c%) wB 4t X3!7)ZvܰsEOp4C6z8ARBn8R9ᆡzT6>O *FKM]|G(!7!Zvp=M(Gc rCGna^Uv04:ˤ/*re7L #tpaЏ Bn8R aNU z&!sY5)#jlHѲF1ē$v4pH6;ﻳirHNIj\]^h n82솑Uny G`⬉Nzc˃MGiWae7L #tܰWM̯@/W{:t;;vJ Mnae7L CuA7l)};f2М֕/yT^^qYg-]YȒ,MVj@nXh #NMlC/SvXQ:m,%qJkV8J097Zf^[Yr4Pre70Tae DY)dg>l7J.)-:с.V(@nF47=e뷩,YYsx}{%tho x~DMrÑe7L Cul|OҬՖnJo \S쬱۞lq(WjɦLk=h #W nI{ʎYߙqÖ8o2yk]sϚ? X71iJۼc3ۖf^s *Gc !7!Zv C񩩓g\h/ONIiS6EV=xҨ̣z5<ܰѲ&: 'yLM$/% nXh rPjp|:$%&.QFy˼ae7,/ 7cܰn :c*Gc !7!Zv C0;Vޅ2#^fnaݣe7L #t8=?ZvÄ0Taz(2/qQc Gݰ,0Bs Dh #DnaN՞m~*{QZp_!;} VWR6 ) #DnaNࢥɑC_*X}> G0!7i)OZpKѭ^I56A G0!7 թ~%Q}jݰ,0B!aI~ 5L zXCѲFnWXu/ջLX}"71ZvÄ0B;2Mxk;-YFZakPZB@$Џ Bn8R aNK_H>/}IƸh ~D}QTyjm& U۫2fh<3EpD"7)Zvp=F {D( 1$;2I-uD-kq%o%d/g2us*󛔣جKklwS0mB磹DM/AS=ӫ#drWA~階X^*K^d{L)xu4ԀܰѲ&:}pe{HKKڃ_`I4hALO6r5ɎsZ(.Z ܟ'߽d׋/Ҁ'熇~DMrÑe7L CuN%^^O}}{*%e498M50VN  ^QQRy8zOD7X(tTƝ^ܰѲF17̋&!Sv3:,"?݀OV/'>X_Q5J.'"J(:r7_Z w*Gc !7!Zv CVFL7tG% ){Ki g90ަGD3+xK[x+ -aBn`ܭش/a<ё? $O+M\r_[)q`Z[qIezyy:Mi}QOae7L CuI csZHڹqr7˞O)ðe,dǒ$yMM^Yzp],PJnw::4 -aBnS a򈗙En8Rez %71x-a䆡zU M&DAE/g?ZvÄ0Bs^CR3#jl-aBnSUܰD~ 1QF9*eN#8F-ayYaÚbfwY /SOPQFyd 6سj!7!Zv Cut։7oBQR[R,ʝԴ6:ZvÄ0BaIv-?v$#EnBP})rÑe7,/ 7@ : Bn8B솑BP})re7L #-aBn B Gݰ,0@(ѲFn B G0!7@  { *]hjj rP(+Xr[Z wӅ>ؖnFn@ CH+Vq CP("7@ j0 B)r@ CP("7@ j0 B)r@ CP("7@ j0 B)r@ CP("7@ j3#P( Ag-)z@sîVqqL?V BQq" ic}plF V.Xùa<^PMsٹF@0@U 070JanXab( W:*W*Rz8ݞ1H0,tӤO:Xf >VFA @87ծ-醍1 W+ m\%: Wb:{ۑG|T~̱99݋.wa7:)}^9S;]]`wgm,h˰WKוnߵd:4L KT\=/zi7s|٫5k!ʋOLa}mLts 3=&TrL 87SB?q^sîk-=^_˫:).״)Cޘg;UWz?)FXZ(vG57Ls2}d#^uȦXmUfzf5uçite- oaݰW>Ϟkw;[鬟OD]ټgka3͓&V& A~21MKKcX(]UOrtE= ^qQ%$ٌdvwjw3r#N{SfYo2+&+<~w?pn 1&N=9Dʙ.Z~jqswSy鹋rwu'_J:YÒhi$ZUykƂuˣ)StV~~Փi)$I ?lTGurxzccgƵb.s@a`t00:en 7 rj 7E&4ْhњ\z 挶߷ͫf=u_-Xhyn֖|I8#!>lї˾7;z+ghV "tN,&@ 6ԗw'c3lݴ՞c#덻~kޒyV+uJ?v{K*JsgV:*˟-WV0NqbQ`r9XyW&l*i̝9;p=/mK^bs<(\THSǮr*[_ZUӱǫ38ޑνNel 6l߾=E`-3jw\:UA@ qno|lu|'ݝLvmkv_ʆNuV{FꌣKs%3g\|b_b[s&oڱ_Pk ɋ>tI5<(?ؖnknmgͼE\㗍'YfXjo}_yv7}փo6sp3yTYsfhCѾ**j]] fC=Q4ϕ*rꆏwo#bs[MreˋZmN avE1sWr.nz[hӥ+Kwll2p; : oX-.a׎]Oݽ8kquJΆ´K}|<5ϸ hJ(Qڗ_b>wmzΐR&B+ 3ا>wsKxy[NS)&[+ϓfK8| 687,4;+ce-+Z_TbF2S>G_N0OESoH&¬BB#Y厞&Y3Rlm &?)g>-q{y+JVz5ܻ+жtWXct$I6ݓlg[;N<{; Fǹ+V liY%edђ'd熵rVVƼ{}rkW5^odS̉tE5ȫZwu߿jmlz_qےYKٹ'lܰ.Y6(ϔnM/*+WWW)q9WW6l8ٱ%pxæ6-^o=D?Ygkb_E.E]]M՗mj{o|K-) xWtqxW{ח^Og]2m篝T@qnxM|n0o1&: Jx2cO6 =sãa?zzYF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ܰ5r-F P( -j:7lKMWiBPQ[R,pn->@ t CP(~n@  sP( ƭj"7@ D|rP( ϸ Ny+(2(-ݦ >5lN( BG?y|bDKJagϜ|Q_4[gO mBec_fG!EP:ݜ+@n mgڊ+&CTU_Z mBQĬ.-tת)-kX)r"ܞh+ >Xi`\`o{LsÊ")+' mBcwG#d0Mzyް<ek ]M ' mBcIbK<lj@ի õ I{Vh+(SyMUI wG]ɦI;n(jϱJ3mՠ8mJ T thslʔ^ {Na0a]y6"5kocۚuˬ%238|ʭ _}mVֶܼt5c,6*QU{v [dܚjP۶%[;c#{O4V=_8aޘüJG%uz>؂`kLJu\Ml!F^\XQEn[ƴ4ٖ^”U[b[d#t]rUs,6j*qRf@c8bVP jkW8/{?|rms;[vJͪ6u붖B[r~m.BBc z.񚱡>Qk .ݳs&>2e5+~dN|V'soXwl4ZRQ$xj!oNH^|qIф %O9wTb?Y^V{~q[f~e'JUc ی7^h.y/5-QaYjt!IOTўcVT w U7ZĬTI=(1-mN{sgMqIvd{Mt%/xgO kװx˞lza`_Kہm6ۮ/)}j=(;pUyɞ٫,W[<(:Lyc$=`6ܰ7Bp p&(.{hj,&{~_d^?inksǭ5ere>r;|ᄚ0+OȘ*SiCK^ufcͺu3L^|kВЫ֞ؼhyyjV߅z #PۋCUʉM-wlQ mK^CE$&kuDEch DkV9<<+c鳄Dyk秏(3;Erٔ!*(;m^?u6N1>2w(X,ϳgSi+Žv`i4;py,oUVv`7{0+$7~IocuQI49͜a78w]el-L\y˔G}.2}9q=LʯMmuݕ٫8*V>YOH5ͷކa*;\:QdP5Tdd']>ԯrxmՠNvg[^sɳO|4es<XNi^}М2)=dA._6oM?z\ށ{-l7>(;\:f0_VrMxsó9svئl _q9vd߽2GY@K{غÛȖ~ڲۙ\{SKӄoLSJYxGo>mq''d+;wVu:O}xuFw[HvSmy6u[Acy[EuDJo{^ya/%}rYI[<۪5Oo7vֆc\TN7S)lemhU#cDlNU>?l/眧qsfM[{woj}gtZ9n^dN7rÑDaॄߙ$[_lv޿_~aθakmi&- ?q<橭k̖ǭ:<>:ś3aaG#sTo=U9f϶W=_T7X s?rt}R3wҫIxg<\~cKC\tSpyז*W빬l]ɓ;,9z*mlZxUi+u|ޘo?*I±ݗŝWڗ'QPx\TVRJ$͖Pm::Ϸ \1Qo _GmB1TvTa}_ۙ ihO),\Zܰ/lWŞC[Ph U//c[sk?/(YV{ m2(Ǿq ne@VP(4*zްȉ@{J'dLT{/O2 m2(ǰ|sdzT JUǵmBGV=]=r]A+N{uvwD'L=]nPUNK m2(Ǹ̎*"9{>ai`5+7lM6JS(==}lOV(rlpzuOi[F6CaA[ `d9`8L>Dդܰm Pnx@vür*)0DB+ػ]Yun}#?+.j’}u갚y9Ԯv)zhoގSR?< :)=r#@dp)4R.$pc-l;m/$ԮF)|K䎝;69Oη])Έa<SgsViX)gW|MvQ,ȅicf]]GO1ܰ7~A_:5$J4RGsվꪦeLS:78gnX'(NJ4kOǙծq8J׽fd"!inX_f/7,Q=\ ?I.%p JbH s; +đ(/lѨvU(DJ)Cy.SwnX (B|5e_3r28s6;Ul۳gu菋n4 ;JeAkה+ 9` [Xc˾-.zTJiڴgӝfkվ*{~Rgu"s&j|^7(s#6V Mj򋃪{h sbekՒnqsn0gܬ.-"ZZ59s)r@P+i`\`o0)iR|4'_4A K$'ri\S Kܠ{JZ\GOM9;'zՖaJ3=c܌QJV^>S[|YTn!MpS'a"Cq]=] {?X iև6 9f2Ha6aqk|EkP\oVtE͖NKHSFrÉl:S[9]ǹa+>%mp5|[M#S'*h3[Yʂ>p5rÝA%^3K|we67, {AKݡeyXjűUan`#$l)2͆g^߷7+ J0vDJzОܰ|],\ ggf={VpYi Dr̼+㸆_7/D:i'JVUrڜtۺj?BnzoX+_ys攤i#đmg6.}h 7^~cZ ~uEKݥnxCrbr8# B{= J: 2lC>x s ٿaDpju] Quy5v=:T :^|,7 hgUH>i8 DP7wNs6Ո ڧk>R𳂞m_V!MRe^μڢ۵TlpTߗ--} <0k_5VWg/=7_3Idp)fD0:?k_%FUNp}m_8B>?ڛ3?4ծ\g?z>oX=_eSF󆇃m{XO:gL3L[`q5Gj@eJ!?#\oﵳ 6m:z(+XȒ2 V3/7,+΋~1/K+TbMǚIp$Qrr(Jb0f.r%zU G +}^LHJOܰ\D!uJpuo߽?=(ki,7<{]l@bOi*L}-bO_gȕoϟyիV{#E5B. Ȕ|Eܕln?zyHi0p>}`OA˲gGv!Q=y_&}ٸ1ؒb;ErM[<9w6jBP(T:wII2'<ǹ D|u BR3O$E7@ t CP(~n@  sP( ƭj"7@ D|rP( #Z 7 BPj0@ EݰE.$( BTeݰrͿ,JM<(2(`}")xho Bо-7@ bD*0 B+0@ 0 B)0@ 0 B)0@ 0 B)0@ 0 BinW{t@ D<0 Bi7,JΖo3CP( a.'Ĝ!5xIENDB`PKINw6ƹ-Pictures/10000201000000F50000007AC21FF7FF.pngPNG  IHDRzgWhIDATxhg?Y𖑡KXCp8-%,}MD,. e'ڦB>(u`oΞ@d2r3Hj؍+4 cnI03BK7:o kG#C(b/ʕxmdZ`{hy4NdL ?^x%>);\-V$BXM\!Sc ft{ ^lh,./ׅb%V~@váWw\K+\J1oOf̒$XSp" 7 1ctmn6Nv'#RrCۋܔ@K/~):Pڿڧ6H]2s"r ?>OSVdk)eo~|ţBn*|'BG"ђ|c]h_ٜc䊝I2t6$6 Nhpߥi 7>p݆4pě+>o|r) ._o%ACE瘯npo5?%C~{.]δ58K +])%'t~.|}&ԡc˹6bl`*F/鄶)ӓ}tڧ!Ӱު3<;%5=;Pr軝 +^字<B,Z?v%ch*V,FCk-hzc^; 5-!\u \:!DOCA!װ..-س#YCNxC+ OЄҏ=?bC4pf,% Ӏ 7eӱ'ߦ(n%‡loؽx}Q~u>wp$v1;#y8}+ξ #Ls ~4DfMo86 > 6)|ZyXN1{E,AOr/}z: Z✤ǽ}t_44镯5\B3ʴ:Xˉ"lia1|5w_z1V̇5;Na4nq՘3#K+?epW;=?)GGmΡfɩE--Ohh؎Kۋ#„C2eԭ{L6 h%6 \Xۍ~a#0ed49+H˼[pH'NNJ0 Ϝqq(h N40 #!˽ qQ>@R"…?qY A/‚g 3}qF$' HPQ㯌2q3p-r lye C:q zPQĕ$BȴwBMk+B%q&i-,5@k"~W8qqAdߖhuM"wՕLۈ.~ہ L[t2*\gw B?46L9yDug,sT{\s fBGLA˥|Qfvʏh7} 4\ttTI%]E?͸5 X6 Wmв5>?'%2Yh ώ{gu_=#2'YpCf?}&SGf-oHLQ6g3Y:R|uOdnm53`;Y?̽`t| ,cȤdg;m] L@|gڂ]ӒsHϠJwӘC$ǺGRY<W@l"2#W%' a:hyB/mTO^ *iy[UTD~?mWf ߸\̇5z_l$*,8]ٸvc"|GUжuvȴĞ08OO: kt6dz;sY/C?S^R^LC>]ʿBu =Y'GAfvZHL rsWDJ JIIZvہuDXwgߊs`]OmzE ߌ$; |0~[cD6.W^JcBsm1f}FI|'ϟ U ejSoAs.-; Fo8\Tmݯ!zӡNR29жSKaavn `n1jaYឋy{hLaS'2BkCFhsqzjEù3T%u!wC'5D\Hh5~k87b2^xqb5&>>izvkR2 hz0k߱z~x/x~=>NEʖŧ<=tۉ00,(GkJހaGCd|v=ſ"(Ho\B^MӴsFGPM8ZMۦufX--ZFM0]4a7aOa(zͧ130-IIMބ+-D||Zv`e^Bo˄b Q<`F}2mWӃRGɷ%EJ BJGvf֡vmh"u!4ݶඛVzazNg5̶fl5w,gigVMl*q?h\`k/8L%R(%_xj~` ?˿GwP`iZqgԭ"mEhhb]zWc,rv79yބ&DٽBqnfJ_TJ>& /Bt{3pfߕ0uB"Vvb"t4 E }NX*ԫ^2+HUڛEbS(+[|QKQo(y. b]DPTJ EDPTJ EDPTJ EDPTJ EDPTJ EDPTJ E]1Lƶw \iz`YE=( CD(Q+*|"MBV{{KYF֥0ڣA;kBQqKQþNvE8֝w#h!]!v(ûŞO:F-M*ҩFVFԳg_"| b B$k; ;"e/gOe5?nMX8w5I,DлC-zñ?5Q8Kb}S=u(Ac4i DhC? Dϵ'Lc~܁x~V#] H tɟNt2,YN/#$=g]aݶ8y$F`>7}p˞עΣ:x%j>?֣c0APunW9S8SNamH)iܔ?RJvEM>'EwF?VFDX^VF-,@5El;@Ckfb/!hȇ# ;0 D]m7ǫw2D 1Mo=vZtb{>!ch82-+KnKo_*Z֟nw[ [ ݻ7Aźg]⮅Lv'hAKXON`r} r.zj9}{=BQXU(e.oBQ>FY1( .j!ɔBV,ûDToZP̋Z_VD dX1˞" *D}JԊoPV( %jPV( %jXf7ٸq#{[qϫ غu+7nzz~ԣ(Vu+j s5 ;a΃a{y×|gw'BQ.Zԇ z+L"gF-j.v#Yvn97n˫NtIl&% &?̛Pa]l01L"xg cg߶ =rⅼf 9XOOSH=[W3@ grz>׳~e䉓Dҿ^y[=bws۶ `ݱRи#}xyΖj?g \%T(º̼M?㋶=ȫPT>5_}U%f:g,>vwLq5O"@$#bvb Q}ؗlw؛N οvW{Mw̫>/95PXum(eE}[?y록Cw!G.UVXIV(PV( %jPV( %jPV( %jPV( %jPV( %jPV(uZ@PgE}&\0YB`V]A 7~OLP[[K߶?_VW#- p}x]~O‹/zBM5XVViJ%&!vBmym&வJ 0/Q>D6|pRfm I!~QȫIބ9Τ~K)yW_{u6r=S-8""hhOX qdZ|ia)*)3g<؉`.چBTVӭ1hJLi7\1.aTJ8C&P() ?\ݍ@@qKw|B~}:Fb2Ƕ^(.dc[[:BV~' $,Nl]߇֟n1g<:fV.H'̒FV_BƟLXMV剮;o>\MnOt/j_b)NBߌs-!c]|r qrI!BX;'_O`KM-A?Cvy bnVңvOܮP(=BQe(Q+UBQe(Q+UBQe,wxW/X]vAQ,C;Cv ZoPV( %jPV( %j`+ bQ#o֬ b};ri)C<@z֎(z31 ґnIENDB`PKINw6 layout-cachecd`d(```d``Q1`bcqxc3B0F2x dPKsTR0lPKINw6 content.xml=r6r Tŕ:ù_miHGϖڣra8Ę5<K*$? r.xF\!4@c;wOj-Y#5r'k=/lflXݤS;Z Qgw8M㉏4h7Tq\ٟO> Meuu2HKHh* g}FMV2OP?~M32QPڙpF`G^ `F5hKs<8}M*W-s2zܡVؔdr,^ssMIaL>e `fݳc8~m9'L?K^=RG"qU5Sۃ,T!}՗#u4V= /nCk;|OCYpE/Mb{t a wJi-N}|2  P 3A:.F=k<13ww>]: ,n5:9`j[sH))5[}0,{fYtt1=Q*<8|fЭr vj+8X/yr|cV6HrA:-W?QJ \:eYHYxlOWjmL}=™ĢCm61{-̌MfE3|+ jAE=UUr)g-z,ca'Bӕ6ٖyX,eXCh<6͎ {3ogB# ;|2]@f3Q{֟axQô(wcyB!d6mk 3?b"]#:.oخG}xoi1&'vl?Ca7mҍ#jBˡsVKjZbzRMﬡX<+'spR7:MP 6cvȹI`LUzLLVC"fq r*u ~!{bJΖO،{HDe*A:V+kᨸ%N )-2P]*';,?:NgB/`Ju^ {1Z0Ͽ:ưu< R_|=9<~BAL)V=hu&Cqp+,HYCzmݗjS_t]灐qƐ' v'$eavm@ީ gRm;):Gr}2-s sad\upyWbX[k:g#)$Y6%e7+ ]"OVܻ}C,A+Ե5a_P\{iǗ`F,HnH]ֲ!ԅv'*jE-Z St0Ra nj<`v*g`/mw(^&LPd7R>R)g | Y&+V=Ͻ G"{u^B)RBëgt.wpet#|)AYmݣT"x SF>W?烳`3æ +BF&q2g¦+ a~Ը{ũ nrAnBMQ$Tjd 3f 4ҵR~?Vx F _u/H< ڊ0Y[6M2HPn׽kPI%F%j?&r…56,F 782aP̽JN=p`g5[ͷ`]5[oo;/`D!rgV$f{mN"HXaFɚ,RsQe9yS]-" *V*Ȣa/ S=>G"O56Jyÿ>Yx50Yl%"6AlX%={D]LSxrV&!C2e:Kr5.=˥mDi1b.͓`l-pIiQ#FD)z.﹏evJ_F0PЗAONz~H3P$Vz?rGh'oZں1FVAJN˩w-†=)~H2/1{u^݃W=xu~f Eπg[`ʣ۩Ck7=nJYGK|O]0Ejρ]nD%&=YVU/%,V7Jszj'͉~WzW9ۖ"O\}ع3YXgHUۓOHdG=){ jd~U'/VmySVtTOAsP  E̛||eAR[^/c~2~CZy[Nڜ5^7;fK̛36˼1z(=!ZJ'PK.cV%ʓuIɽ'pr&T"%T"1[:GQtksIvO}O8 +8rbN©Ͱ@c哸HV6 u3:"^7 tC2޽K!#Տ/u,l^a|ۥgUJJh6{Q's=>4,β>^80=SBe띭Qkib$8NwoulU˞]h>d+đHzh|!`𰇅CƩJ oXהS Q8N0*#=+9QC$c 洁C'dDUYxeKC9+KPF>iiH8)E?ψE7BPm:f]#VQ&r6rn8ʷ$-=9'.45^[] ,ҟMbxhj]9@tJ(#B%˵Ә%=vDlFQZ8ѐ#\hP)B$iT۪)1V#hQ ." )̝@a@h%MW+24 'bWR6e TzUmA#x ߚi HFPk)m`IXXYIp𹡉 `FRVjɎ'˳dHf-Н1(J(Y>eٌT⏌(5g!4N !zTnN7aͰu:\;ۆk&9X^ }x:MB֍(lkA;8lmE,-+Aݢb7TqŸ [P!PR2p8lVZ<lVdݰixɜ'a:!K4eŒ2;O!1<<(/,T_>^8$07,/ڊ !o:pNԗy"lm1JRy9Es6*xߥ{T1^xIlа"JP) N7ߌp[j* }0@]!(KwRtN:-E![A\ߵSI+cnFpxuW*xq]*YN|rY8:%}ګ- aQu BNg'@c_ZQa7!ܑ7QzlW=XCe jU ZDnE:^:DSeWU50쾃еiT?ӈVw0P_x01оT1qQH{Έ`aKd>ל!ՅB˔,NZ0= 8q$8:c;ߛ}N͋[ys{T-қmNX^'Vdy o3X/{dcBdLQ@>[s%lXӭPuYIz WXeƘËd5}_}lsEa~?8)gLP&4JrXY,Ee9]CU5 > deGF 1Nwvi$/&1^e+L,ms@1Il./rҲ? O`UmN8A : fh}Tf> Cr92Tԯ{hc #Ѣ쥯v l Zf|sHʉ!m.- Z<<<>RNzST7w*ӝ|rTp nӖɦՆWsqZDkQ+JKYA=Q\=χ$?Z?^c[{ˬ-*Q'Ztgæ6Ljs ;@li'I`o`h>!W~NV4G3;TG&`A@S 8 Wo`e=ÊzgXS KA6Wۙl2 Ml+ +|ه_BhoAVn?ƙߡV3(:]F*3. t)͢TF׮uYb*}\"Td߻PK[Hv 8PKINw6fT))meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680m5$Build-90732007-03-05T10:44:292007-03-23T10:50:15es-ES159PT4H27M23SPKINw6Thumbnails/thumbnail.pnguiT҉z1-+)$iJsas_&͋BM.ǩ:jjZ9k.u4@"\C/w朹>99yr=Q.NhpKST иOJ1"~VD}Ey]S8Q)T ~:v5RśfIMӚ;G}CHY݅4rT2uUjrO' 5L*oL(^xU-WyfE9F-:9dVâ7Бr-Q洑`#3rw?Mj' !c{2r>#l/>#^mTm ]KaӶV uAfdr.%OecO:lTBa@X%UU^28{ͦ&2o #,j%ZX'%ohW/Q4Eqӹ"ZhqTLlhx _Df1qo;Is1Clۖu 6Z.y(h)=;VD/%)ܾ Ve7@mŘKIG&sKQ1?H?pοNlXym)P Wf.Bν 3. [Uo] =[.Z]9X%`8ƕ1eYi%I9R W^8xv[6%0~\i*<dn.CniƓMlfj2ȎY͎q3p\_ox^O#'|8uNez5`%PCLS2zu[Uxqo ϲO Sa:Y= ,y7z"q O.-BLBv!um6e {-V*p3kL&"/XEh3!HX|:,#>q29Iޜ6Ӽ">~i+n|v%# VH=H…WNmٴ%e!ԭhĦݰyn=|Lp#Y=zxdz-hHu*0R>UB}WǻL,y$C: GZ&S'MK{쏟$TBFE=i,Yk!Uڂw y"Z^S~?IM07$E )psF9r޿PKcPKINw6 settings.xmlY]s:}"w 1̽o^@7#}W2d0Ԡ'[ڕVgٕo,q JsA0rz<:_781FYT4CC M 2%4  50x?O˗`fLڨVմZ *"98ggE5?8Y-Ch8߼Y9*@bcszlv+[Ԃy64X1˔piu~S6.LLafylfk>>foYzx g8@L ) cDLM2(^5vY06_IXZ2۱*FCE>X64-ʟ.>*ouW\~* ;(ΪvfA[h &k&f,,Ƞ*6[@QD:<|^ҽxij?3m"Kab#FX,tpt˘XM *ǖ2cɾK?Dd 79[4fX< P_,̏lM%*p m K" Vژ vsCI v|; TmY :6%^(&b r* ƫꮯo`ihq2dGksE$7(<ߙU?s@hʸ%|TLDp h]؂qrJGdK;Ri*O3; pC ?󫄞l >:&p>^?y3dd2_i >ޡ|+x#6ϊX:v%F;LE[\7{>id 鞴aU8Qxdq?F-2BJy j XړV=WIl o @Sihh*mKk~wTfۭ([PA/G7 uJu/(^3 Hola mundo qtoctave-0.10.1/widgetserver/doc/tutorial/ej_sombrero.m0000755000175000017500000000616611511434230022233 0ustar lucaslucas#!/usr/bin/octave %out=stdout; %in=stdin; %Replace popen2 function. function [in, out, pid] = popen2 (command, args) in = -1; out = -1; pid = -1; if (nargin == 1 || nargin == 2) if (nargin == 1) args = ""; endif if (ischar (command)) [stdin_pipe, stdin_status] = pipe (); [stdout_pipe, stdout_status] = pipe (); if (stdin_status == 0 && stdout_status == 0) pid = fork (); if (pid == 0) ## In the child. fclose (nth (stdin_pipe, 2)); fclose (nth (stdout_pipe, 1)); dup2 (nth (stdin_pipe, 1), stdin); fclose (nth (stdin_pipe, 1)); dup2 (nth (stdout_pipe, 2), stdout); fclose (nth (stdout_pipe, 2)); if (exec (command, args) < 0) error ("popen2: unable to start process `%s'", command); exit (0); endif elseif (pid) ## In the parent. fclose (nth (stdin_pipe, 1)); fclose (nth (stdout_pipe, 2)); %if (fcntl (nth (stdout_pipe, 1), F_SETFL, O_NONBLOCK) < 0) % error ("popen2: error setting file mode"); %else in = nth (stdin_pipe, 2); out = nth (stdout_pipe, 1); %endif elseif (pid < 0) error ("popen2: fork failed -- unable to create child process"); endif else error ("popen2: pipe creation failed"); endif else error ("popen2: file name must be a string"); endif else usage ("[in, out, pid] = popen2 (command, args)"); endif endfunction [out,in,pid]=popen2("widgetserver"); if(pid<0) printf("Error widgetserver couldn't be executed\n"); exit(1); end fprintf(out, "\n"); fprintf(out, " \n"); fprintf(out, "

\n"); fprintf(out, " \n"); fprintf(out, " Number of grids\n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, "

\n"); fprintf(out, " \n"); fprintf(out, " Draws sombrero function\n"); fprintf(out, " \n"); fprintf(out, "

\n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " Ok\n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " Cancel\n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, "

\n"); fprintf(out, "\n"); fflush(out); %Event loop while( isstr ( line=fgets(in) ) ) %printf("Line: %s",line); if( ( length(line)>=15 && strcmp(substr(line,1,16),'*clicked: cancel') ) || ( length(line)>=13 && strcmp(substr(line,1,13),'*close: frame') ) ) fprintf(out, "\n"); fflush(out); break; end; %printf("Enviando peticin\n"); fprintf(out, "\n"); fprintf(out, " \n"); fprintf(out, "\n"); fflush(out); line=fgets(in); w0=fgets(in); %printf("Line:%s w0:%s\n",line,w0); sombrero(eval(w0)); end fclose(in); fclose(out); %printf( "Fin del programa\n"); qtoctave-0.10.1/widgetserver/doc/tutorial/ej1.ws0000755000175000017500000000015411511434230020570 0ustar lucaslucas Hola mundo qtoctave-0.10.1/widgetserver/doc/tutorial/ej.ws0000755000175000017500000000345311511434230020514 0ustar lucaslucas Hola mundo. Adios mundo.

l1 b3. b4. l2 Esto es un ejemplo en varias lneas l3 usadon html
b5. b6
Hola mundo.

Hola mundo
Esto es un ejemplo. Columna 1 Columna 2 Columna 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Adios
Esto es un ejemplo. qtoctave-0.10.1/widgetserver/doc/tutorial/ej3.ws0000755000175000017500000000021111511434230020564 0ustar lucaslucas Un original mensaje S, admite HTML!! qtoctave-0.10.1/widgetserver/doc/tutorial/ej6.ws0000755000175000017500000000067311511434230020603 0ustar lucaslucas qtoctave-0.10.1/widgetserver/doc/tutorial/widgetserver_octave_spanish.html0000755000175000017500000001201311511434230026221 0ustar lucaslucas

Ejemplo de uso del Widgetserver desde Octave.

Las comunicaciones con el Widgetserver se realizarn usando el comando de octave popen2. El problema es que la implementacin de este comando falla. La implementacin correcta de este comando sera:
function [in, out, pid] = popen2 (command, args)

  in = -1;
  out = -1;
  pid = -1;

  if (nargin == 1 || nargin == 2)

    if (nargin == 1)
      args = "";
    endif

    if (ischar (command))

      [stdin_pipe, stdin_status] = pipe ();
      [stdout_pipe, stdout_status] = pipe ();

      if (stdin_status == 0 && stdout_status == 0)

        pid = fork ();

        if (pid == 0)

	  ## In the child.

          fclose (nth (stdin_pipe, 2));
          fclose (nth (stdout_pipe, 1));

          dup2 (nth (stdin_pipe, 1), stdin);
          fclose (nth (stdin_pipe, 1));

          dup2 (nth (stdout_pipe, 2), stdout);
          fclose (nth (stdout_pipe, 2));

          if (exec (command, args) < 0)
            error ("popen2: unable to start process `%s'", command);
            exit (0);
          endif

        elseif (pid)

	  ## In the parent.

          fclose (nth (stdin_pipe, 1));
          fclose (nth (stdout_pipe, 2));

          %if (fcntl (nth (stdout_pipe, 1), F_SETFL, O_NONBLOCK) < 0)
          %  error ("popen2: error setting file mode");
          %else
            in = nth (stdin_pipe, 2);
            out = nth (stdout_pipe, 1);
          %endif

        elseif (pid < 0)
          error ("popen2: fork failed -- unable to create child process");
        endif
      else
        error ("popen2: pipe creation failed");
      endif
    else
      error ("popen2: file name must be a string");
    endif
  else
    usage ("[in, out, pid] = popen2 (command, args)");
  endif

endfunction

Se puede incluir dentro de los programas de Octave, pues Octave permite redefinir las funciones.

Para comunicarse con Octave se seguirn los siguientes pasos:
1. Se abrirn las comunicaciones con el Widgetserver usando popen2.
2. Se le mandarn las instrucciones necesarias para construir la ventana.
3. Se escucharn los eventos con fgets.

Ejemplo comentado.

El siguiente ejemplo abre una ventana que pide el argumento de la funcin sombrero:
[out,in,pid]=popen2("widgetserver");
if(pid<0)
	printf("Error widgetserver couldn't be executed\n");
	exit(1);
end
Lo que se ha hecho es abrir las comunicaciones con el Widgetserver. En el caso de que el programa widgetserver no se encuentre, se muestra un mensaje de error. En el caso de que no funcione correctamente, se puede usar la implementacin de popen2 mostrada anteriormente.
fprintf(out, "<window:frame>\n");
fprintf(out, "	<title:Sombrero/>\n");
fprintf(out, "	<p>\n");
fprintf(out, "	<label:l1>\n");
fprintf(out, "	 	Number of grids\n");
fprintf(out, "	</label>\n");
fprintf(out, "	<lineedit:w0>\n");
fprintf(out, "		<text: 20/>\n");
fprintf(out, "	</lineedit>\n");
fprintf(out, "	</p>\n");
fprintf(out, "	<html:ht1>\n");
fprintf(out, "		Draws sombrero function\n");
fprintf(out, "	</html>\n");
fprintf(out, "	<p>\n");
fprintf(out, "	<button:ok>\n");
fprintf(out, "		<listen: clicked/>\n");
fprintf(out, "		<text>\n");
fprintf(out, "	 		Ok\n");
fprintf(out, "		</text>\n");
fprintf(out, "	</button>\n");
fprintf(out, "	<button:cancel>\n");
fprintf(out, "		<listen: clicked/>\n");
fprintf(out, "		<text>\n");
fprintf(out, "	 		Cancel\n");
fprintf(out, "		</text>\n");
fprintf(out, "	</button>\n");
fprintf(out, "	</p>\n");
fprintf(out, "</window>\n");

fflush(out);

Se enva la ventana que se tiene que mostrar. El fflush(out) es importante para poder enviar los datos..Es mucho ms cmodo escribir la ventana en un fichero y enviarla despus leyendo el fichero.

%Event loop
while( isstr ( line=fgets(in) ) )
	% Se procesan los eventos para cerrar la ventana
	if(
		( length(line)>=15 && strcmp(substr(line,1,16),'*clicked: cancel') )
		||
		( length(line)>=13 && strcmp(substr(line,1,13),'*close: frame') )
	  )
		fprintf(out, "<quit/>\n");
		fflush(out);
		break;
	end;
	
	% Se debe haber hecho click sobre el botn de Ok.
	
	% Se lee la lnea de texto.
	fprintf(out, "<lineedit:w0>\n");
	fprintf(out, "	<getText/>\n");
	fprintf(out, "</lineedit>\n");
	fflush(out);
	
	line=fgets(in);
	w0=fgets(in);

	%Se dibuja el sombrero
	sombrero(eval(w0));

end

Este era el bucle de eventos, se van leyendo, lnea a lnea los datos que enva el Widgetserver y se procesan.
Las funciones strcmp, substr y length se usan para comparar las cadenas. La funcin strcmp compara dos cadenas e indica si son iguales. length sirve para indicar la longitud de un array (una cadena). substr sirve para extraer una parte de una cadena.

fclose(in);
fclose(out);

% Fin del programa

En el fichero ej_sombrero.m se puede encontrar el ejemplo anterior. qtoctave-0.10.1/widgetserver/doc/tutorial/ej9.ws0000755000175000017500000000016411511434230020601 0ustar lucaslucas

qtoctave-0.10.1/widgetserver/doc/tutorial/ej8.ws0000755000175000017500000000041111511434230020573 0ustar lucaslucas

Botn 1 Botn 2 Botn 3

qtoctave-0.10.1/widgetserver/doc/tutorial/ej4.ws0000755000175000017500000000022611511434230020573 0ustar lucaslucas Hola mundo qtoctave-0.10.1/widgetserver/doc/tutorial/widgetserver_tutorial.pdf0000755000175000017500000236537311511434230024711 0ustar lucaslucas%PDF-1.4 %äüöß 2 0 obj <> stream x\[6~?}c=4ih!- ʶ$3dSJJnsoFn4mDc:S^]|CoFm6> e{d;<~qtaJql̸~7i$h, "OÃӇO)MJi<RF@@ngmX}!*bEH:K8o;Ll(-,\W A%_ [[!1$U8KXьC x.Ix^IK7>-I %yZ ćR4!m;YgUmʹ 4Arل7Tׁ̈́CiH:1PM&#:!/"v%e5\0<~dDF?H$>g>AB&I4:0mn[{CXbl&5&h`J^ 5^S!]0]q`'s'ޝ+(H1Gm$\^NC첅wZDVFT+pE/CE[8ZkXШKcQ2AfVW9N3rDԠ=[y@u=^bAp`,emQ Clh!-'lRXSǟXa<n0ܢkEƐ6?^ SAHdm:nq#ɣN~//oU뉂$U8]zHG>گI\cz( ŌH"%AGC gQ1II+._2*p 9$RY7 =* Lя"FF)TH Sm'0SH*Ѧp927_YHWWK[,7ڈU:+BL~$9vsPQ#:?Bnssw0x5_l't^Z#{!ڎ^[hfk[~=kywNi zwya_AM,ah:Yy+bDtA`zb:c}~Xv.ĴFDAzsm ԓ1$R[ѳj)vB8P~яh3_^x~QgU =hW>0oy˞b+٩ ߣUԳ7N#hx ƚtJǁ#=v +I JwڤdlL)YpN*9+Cs F}Ye1uf=/U$e#co Y#c{aC}ݭһ&~g8 *HzY/u+dlّ;ᾖ,4_:\; g*:B-e^$\ǘ΀ pUmϕ5xݯ~xF )!Snt8TI` zn,v7.j5 tD4nEG(aumؼ`[HAi2(Djq?_?&1 0K#WDŽ{W}F4 R}{+&rAKuܱQؙEH7?jBm)0{`gM+Ybu](/B%q-?d\ZLiXYgꅋ\~[dI|c"6K8ek:O]$EmlnC; 6s?]AR DǿA:6Ͳ%U4 p,o,3\1]p RՀ\$T쭸`0䚃ʔI7nHkܸfO6w\sGMS6x.RisRؖ#E__YӘ#No3W%92یNF*i v=`D ` BuwK韽'cw*Z&,Q&By˓̶ .\'Id>k0U€bG~Q5nR(wh~IC,]qM.J2}H}ZJqF2Gŧ4-U܂EUU.DfVkv{ (\p8OϹѢ\W ]?XWveZQjdJ8:<-&M2(1 Sbt%- с:sUVxt?adyC$rj'0 KAA73wk߮Ac;e_l.R']Dsz֥{]R4)Zn-z%Eukbehr7rYDϭ=@-/BL0?o$|{U%.ܵ ]w$i "߰ʄlB}879L\>]pMZ"CU|h@ endstream endobj 3 0 obj 2763 endobj 25 0 obj <> stream x흽nJlmVmR,.`UrJNC H`H+6n  5+Sx  PMQLVI*8ph4gsy.jJ颋68L8IԋOO jvzn̵D<4<";IJBFt[Uiw\ { jbzًT$Jdjqܻu{txVAw\GǥL 羌/er<a΍y(1/Xx 7Q?5a3 */m?ԥ VL=N?[Miw`}>.F\K`>|UA^.tp.U e,;3W(c*C?EY>:hk}s[uoƘQl|aSVҷ玳3\'[]#.!hwfre0So?W_Otl]0r?U
3wF_dX@`zN:߹a1?ҟۭ@sa"WcZ/6kk[UߛA nx^v{^:?)h_h:wz(}41r4?s|:c;#]QsjfuP<(({iA[.;e4q]Un\+ǯh٘Äygo(ۅ~9dad Nňn Tl|烛{8c`'C <HNIh]٪P"74r4c& lm,cuz#g\+ujWP|D6B-$XSϢR5\IŬdF \95O WY }\L1|DTh;'tn~̇('a*B[>mb0vlJ~jZu>C1:X魲_E쮥j;P2ڿ!MiUm(r d<*({~sfnw+:L}q`3PsU7|v3|;%%,y_I_%|< ?W_g+H~H$_EDɬXl H|c_I7& .IvI:H$KA"]tHlDb$$% .IvS:1O˼7&liJ~Ne$"X97:0u)H,2L#[ "=tb!(!RDb[ H:Ȼk}!FE {5IT>$WHƳi]ٱ1DEkay4>cM} sYFߎ0cn(6Cby .ZY<10A #9;Is:n"b=m%R|w”u`;.=_.<}o35aY_MFUg+tqv^{tP{O^qjljo&l}9 K:`;e.g> JG""|{M04Muak:U@WpZ&Fw`qn4d+8 sY6)5D b1#Ft0ۼ`0F^sG<#Wڽ/}q5?TupH;][kn;Rˡvan;K{kMo#u#x&Cue^*WP"z(1*-^N[3cqgi;EQu0 A[S)4ھ*kjVʡݹb%5`W:1G>ɗw}pu'Ci#;]ڈAΰ!i+_mHzCLupH:] m΂&ZZR1X<+IzA?v$ŷs\o{9c0$|x>`]RD:ns<<\>,W/8q4\ ]uy}}JԦA1;1E۬>[yPqHn}V;N9h(;$"3t0A"|$QȻ&li7AD3;dwnT!W^"Xm0䝊$la,J:H$Eo7/so P&[~x{;&;6kl KDb$$% .IvI:H$KA"]tHlDb$$% . HlU:H$c2H$6wtEW~ endstream endobj 40 0 obj 3079 endobj 42 0 obj <> stream x]K6ׯ9mCh   _JmRW1j-Q$)OW6Y47gtZ?~j<}/?_ykonOƞ9x0h5_*{f"[+ּt?z|.ѭFѵq9hwm+*i?Ê^d nBD%9F? 0C7\񂣦tRi ǀ K"YG#=/ ,A#P71L"|Q:>Y4W/5V)l ϐL0냎6]aWO.%d$ʰ^w+%}H@EWe.LV%ukjH0 #_`ܓepbC~u_cZRnJ c݂ yW~pTs42#JQm8Ǹa] J~B=BW$/qr^Ȍ x{8.(dym?4@4oH5OxH,[oU<B> uLwCgnkHS#F;xzDS+YEdʒM셟kTڜ,O L.Av+Pcv-}@eJ$cF3MB[+f;D(%\ s% q+ZAj(t.i[E?}خ2h|B+zzУԄ+Zi,--NUQ}:6H_7(^^t@mH[rboStLk$W L)qP8HHZ!Q5 &~s^7;.TPd3OS]: c%m 4pEQ'O~ X&SP"r1xiG\r34nju+cVt0P&&v~ȣPWkX LF%0E%|'8S/5B8d_fw4&/6 \!W7@꼊rR-$,8U.,((ݢz!^ [cI-)r9q22y7y zk5וgl#.]q5'BU/NH誎n 1gj&чDUۢRt~2?? 5>|';Q”~ɔZN̴ LLWsS!m*5x-L俟}X/K-5Ľs(W3FOAy[$55Y,(:o)C3YxjD(HiH{oRb{Yl!,v:$3>2pW%Џz|=xwpqǼ5gqw0.1H#(\֠iCޓ0`C]UJ\69s͞tSkڳ|;pm ӹ B I-8߸2X8QݔU_eꊺhʗnEK{kګ v*|F;jQLxOmѱ>) ɝdv+D+O"~֒(J<2!u+\|bƛ,Va}r"8?4MBi޽Gba"wlJzqjyC-opSֵ+X̊ z0,-GdztFqkPW.N}rGnKN#fm !39k| H./6]+O+.ϗσ&P c,zw\E$g=;?ZV I P oڠ|92o߄~GwD؆!lk&"aYfpZLBͦLc3L( -l:iN$RчdB?1O?H^'KZNͺ&Q±;BygAѝ:*5:4qO[GWC\7AՇik|uoo:~mp` endstream endobj 43 0 obj 2941 endobj 76 0 obj <> stream x[m7 b>Ý_1͇BmZHK=/54{ wcٖG#h>|nD#dc}Mko|h~zzz{wjě7oO烅q_^64Ͽ6Oֽi?H>'fx\~p3i?A21="Hst?Ck('X:χǬ!IkDT#!c!/Wj\RR,U8{`ڥu9%*JqBNTy4DwTR8I"͗o8J(hR*'Eˢ a)j[.}\IB_T ?V[)ş"oM^ѡ] :y| ؞Jk(-[$ Xi {+0hTmaAH1" gʅ6 .D&WJTٮ ܇yd9ADŽeC@~;r喔 ^fcగQq^bxcXsz."bz1HZ&۫YUS$5RDli9XXle2uIx ǤTބfs]7-F&BI9@tr"A@a aGyVO**[BÇs2J*[OY.* `[Ju1bE 5w<:aܒK娲!o$ N1(:Qq>"ߟ̆!KrIa}]z"pݘH#WhkrmiJs t!EJ! ]qX,_l[c3@ m@׏'HeC*"@%/E_מS|h&["U ȜCbhا۬|RE"VPdZeWJBA;.R7F5^4^5&"c}?7^Zӛ?:<]sILl'4\c(-8@Ӄ츉ٕbȵZ]λV5Aʔ+V# #+}kWc9ǂe3*%] qWT!ڦw+t+ݘ3V%U/# yLa~DfhkܲBm%7Mk9^DI5!:  G!i7Iɯ`eUK1uñHV?]Ӳlo_+ls>GG¤P(Cvol͊*y"9(ϨPFL0'~j,-Za *7!Ojj#sN2S emˆojV++νCJn i\nni+ͭĆ_V| gpWJ6HhQm5P1b٨"49T|0AOkl.}yT,N0mଏ&ޮtE].װ?]wngbp/vdii }'Jvۺ5;Gc4l iZ]ٶJ C$4H[1gv 5)qJ;R'*P|٘l!ӮͳWʉ8xl.} p7.n>fZ>F@iU|m%q?>b| Š<)F([Y%S)HU$g_z.[g뛹4n+w縜.suN_RΧ]-wrRȇQAGvv[H`RK4 H+ҍӝ!egw&+ ㍡o*4iUTD%koo t endstream endobj 77 0 obj 1913 endobj 97 0 obj <> stream x흽nHǝlI0"{ffFm`'0z)7 |Bi) 0~ܿXT֗mY#5j6_WKþ=9c{G8Id5WCT7Lkga=G!|+([x4= {כa8`Bt&֠f$OT:Va5/ϞM.(κO4,?ցrO/.u_UΟ͙!޹S',Mh N<_W><|Ҭvo"ZZ WuZ~py%ᔣNYd{}/8JYx7vfqB43 5P8< ',%?lf ma^@J Kב_>PҼ'*;a;;ܺ"?xL?#ka?amk>>.j9{j;yB&CÌHIRxl?Z}AnKu٪6"邇X8 @yprv4l:C`H:z`m|F4w Vsa 〖N:s},qT/\W ݺnjsP ]gc?֕5;]Âc'$C"aX5o&>Lsw)7)wvj=.ߓwΆ$?;rg{(c]uFìF~ g~A]a9U_\2*k ˸ 6v 4(lS-hORp=gs Ep8wnxu004 0%N?g];5g'?0~\&^鬅ygNiS=pl? .KjLA o{SN浗?vZr{zs3p IŇHwUC@!N݃wČ)lAK8[+j(mMm[.=48[6ϛ(Eyn⾿nLJOQIa#}|4x9:Nwc<'X@4XGݬwx"`لWSܳ~~+Q Gv>߻ s/&0  ; ӻ+# @zMsEΛF󗴧dV.EZeKVsyHy tA'x3!#(x G5L?y2,2h|7ೃLj r _qyF|>7-IPKvzaTwm`ST}4lџ|c=s>W:x8Zvi083}<2ڄ3 (s֤4咈gҤg.wa/*87gIX۩Zw`A{ƦÕ[9<>\Aw8QڻOa:ʏmߗ55, MOEkt-<ܹxQ5Qk:J;y(*N] EE ETt#ſ݈ EuPᡨ*<A:PTCQTx( EuPᡨ*<A:PTZ/)CV˫]>~ ]]U9]T;R:8ЁZ&?5c<ʁV*l#NS!a>m'_O>eXɷW ͶyH9 ~Fe7SF$W]CI4왅E(0P3jja9v;E֥5EE5z.f x p0 ?02(o$}LC K|pQ5UĴ{hІTm%(ж~Ʃ_#*O旷mF*U|G "MeZx .$PaP P]k42!X#Tqin|XT1_?zQ]_fDDȀYO] PhQr=vEs2P<7Z92;Ci^,͹hpJ].!Xn f[+Y/7"7ި{y WcֿU<,JE ?Ԡ%[}"yiB> Z~E=eWx'{[oZ,Ǻ[wv Ux( EuPᡨ*<A:PTCQTx( EuPᡨ*<A:<d~mۣRj[Ga~;7(wFu=]k,FyNiqZF/v*z_ 9:>fkFy,-w]?6ą}e.ՔVY˄?E_&-_oFYw(<\p-\nZ&M"IhF^LMUn>( -d)c{¦#tV-ᗭR|c7@M?=~ZG[4h˵xUe^- 69޷b)&oCړ}?Ï^s+yXt v]< e0 @}ĩ*=5x^VR8{xzٟyYN!xHc`w{7u=<|yd | eGT̏IS-a6%AYs#4f Y>_/OŇ 䬃s<Cx&b}{Kf ȶM.X2:wG V!SshF_Py QŐBܸ^!GXe)n&x i^ `^lv~F-nA-fuiZ/Q}.Vͼ@Uo>ò<,jY/F7=rR^M~tk[6<Ъ E? EuPᡨ*<A:PTCQTx( EuPᡨ*<A:PTCQTx(.⡨uEE7(*ݓC=߃ endstream endobj 119 0 obj 3934 endobj 121 0 obj <> stream xZ_kF O>lxG ג@ׯlh$Rh4槟4V߻F5j6<n~cwñQwwnL_v`h"ЌOM_[sB=*G;v<;=v::} =$`УC=(rFQW-c|S6ݐu'U4i殞8Bkj{)r!v@XGgv}"ffi!u*wB}u(au1rz* 5gkfY!KqeCra-D6}җy6}Ճ%4rUGh C0W`43Ʈz{X.]f2 eaRJ zόxS1~ ݪ@.6= Pi #R@wZny3m~ġ5E#RMVwj^_OQ8\_8R3Cg aW8\d 6]VwX0lM$/Vg#&[kd(CZҴۅGODٺ<-\,A2 dr\B/] 05)  e:gn6_ev[*GHϱ=cMx㚗O \q)v|7?‹Zo !SD/+&~zJI,xQ^ҼiA3EMяYJ5jT&_R"l5E Izn+ O>G[8e(PviVBl+!\j]6a>3BkL}7l-L>3BRZ` endstream endobj 122 0 obj 1578 endobj 155 0 obj <> stream x1h;7txooC `lC2! d(&C PHb:! w(CA2h o 蝫+˲d9Wvl6ϟ^ѹjI=>]X{3rх5ŕ*ŵИKX=p:ʪ{ MSO2i7BՎ7v~'֮bݘt;=e?0ȧl;|:bRqkLN{}`r,h(7ˢw>Va_{ߏFOlٱJk;R.7`&ɯd4^A ?탥Hk*:rnu6EL^,wY%CnXՂ C=V%R"bRN 9;o.5MGBY>Y1ެzpʩ!oѓ]X\Q'j_\VBm,6-+WLؗ۝p]hrJձPNX>ʜ$YY1َ±%oP}fj컂Uy7y&w>yV;䅃RV +hWw1̚iOCإٔcN 'rm3xtm_M_sF\2|Փ@YO棘}$ׇV&rz3 5Vei/*8op컜^jC=Pb^Wmwz- >H<_"ǓH_=)HSpxe!Gm>я(3&?m0|fG*?$KІ*O2yՆٻ F 1̙ՄD߀D}Öl *$ I +Xi8^ȫ}7H}M-˅UlNC5|6ݳ T GnH8hڧ&x$'FJU]%\][MU}Ki3oR'f=Rz5b[fa5u}gba_xٗJ]Q p 땉UH5<“=>PmZ:%:5kכzhqK6twP>H~~q"ֿڮla" 8Ur ?y'bbx1$,]R>Li^m$7uɛ72tN1|fwIw>(X@nB?:f\W﯆6 a\=|⌿Ҫ4,š8 ~$ׁmEk?x_'{ ~Q7HRAp(+&f.Gfν&_Yrc(!ʡrc6*_Un QVsG]YAc/>o$k 3Cy ɑUC\0G;ɫl}b%o踗ڱ`" YE"dŋU/BVQYE"dŋU/BVQYE"dŋU/BVQYE"dŋU/BVQYE"dŋU/ƍ1<6]cX *]vW emU"۲lw K0 Y}ECV3QC/f ɪ{vo~V1,k Y`X6vY]~ZEXŰjEY'Tz"=kcEJ2$O?3 :8:ˆN{iS?aX6!K%Fh[ z /GeOZ@ +C$kcBjڻ+\U^=u?!kNF#z-Y^ ,g~-m*>\aӆnwf5$'bENw[~Q&-BX֟tIb $ , $Lbq~7uf\:f=#G6PGWd`Q>dZXzpHNj7mjź᫱IdVQdf`y`m:z'lYBɱEIkbmcuE j>aMwFUQ<9tHg@vȪVwJMU텅Q[du ż#9yXAIeٰ EhMiø(0|42U{.xCVAFհ0+) ·Lլaa ¨~RY~?@,ZXwawe!(^xE*!(^xE*!(^xE*!(^xE*!(^xE*-g.}2FQV.T(ht %y endstream endobj 172 0 obj 2964 endobj 173 0 obj <> stream x 0 ð'ŤFhj}⋜ ~ endstream endobj 174 0 obj 61 endobj 176 0 obj <> stream xX͊#7)tR o&{X@ Y]f SݭngN{f̴Twb{gB {4wd^1w'c?e~}x9=<6K0Κ?pBy{w~=ΟP'BG)I%!zY 8/߂VGC -о3|9 +R31V uXf:oWiGbM q x 3$|F &1l~0>'Vj>:3vGPTmPuƹI/ E7q;"Q݂yAs :o+ԙB By͆PF9WmzhhjZBۡz߹*0n@X_Gem,Kk6RH;7WpNsP%B_>2PgRoW:4\*U޴*]9єמ̋,fHСe\ c}oo#sag\Ȭ!&l[1+$-;-*J$YsB@MZVH\w;'1 ^#y{⦄{ԦFlpP04vb4A#@lD=ʬP2 OI\KBcj6t!ccwG=%)q 'WQ΋`6 c~m:+݆h(L =l^s;(bm郭zT SQΒbB]+)hBv47#I U .d7L(EbS *W*^Y(fͶrŐ86b }'Xe5@߈6(Ԑ;t!Z*VVCUIRXkˊlZ^]R[OHWQ\x*U5HͯMte\F^TsهC > stream x]?ho Aox7TС 1x0ƒxC bD`2Сw(C]L2ܡw蠡7h!~^Kg>>"{Ϲ=WgX{A0?/|Crpi FTc0ux SMh&Ko+zĩnu[VgmՈQV6;R&OQ"Q6 ^Bkun?{RAU[nAs umg&HWۻ9x?ЪBInt[$ K6 >W̠ԧʪs!%#~Iƾl}sNMmSY&ۛ[[ڀ4VU(d2 m7E'G6᏿SW%*"Gv/<;q߮&7D8'8oP$( LV6E6 ~ufC+iR7%n?Y7rn4J%ziڽcq/QG2g#:I\`saNGu8ʘT(Um:Zζ3Q^^I#gbi'tVy(Xyx];={%x6;q³f6bfK}u{m?B z1|&dAJQOw?NNd.d0'У?uT8ݖgr jH\k]UYTb[{7Mrv(o ;fxåVamRΈA(<2Ȗ6w/zޡt?u◘is];t⡪yx!lx Ӄ֎HMѭwp7]"ۮ,B3Bo}v誾g4;(KEK*H'g -H&zҠ=P61Y3_5׶>>5;mBmd}e :I¦u8"}ㄎ}3K_>[R^('׷yl#0 xlQ 7JȂL6q>RGMm- <ɞ{tysM,X؋7PG"͑F6\ZTS)uWtR-JSLn2JRՁ¦>Js&}iy~f{"1˃xp/V.Q[åyl\ny)}fSA!J{x,FmRAQ 6!9HXQRC}XqmiygKq'dCJЦPc1uL%گ1L)/QNio"Ғ^[;(nCżX;`uDaȼkWm:P|)AJXyÚT,iQklT!jf;xd#;yFq;#QmOD%Oª/»kաt ÓVG`iDP-wۜhg> {PVRb[DYz'mOQqu̲iZ=U43}aJؓ-..Q3t\u@Pu Pu Pu Pu Pu Pu Pu Pu Pu PpG갾ݏ#\") WP\.7]K#OxcQ*B2Xk}e|[w&0 cXvuPQo>'}o%g\Pps@w 7PdǏI; 9謯UdzozP&;?M[q>ѣG#ey OUEQ_>_Džִn XYq4ϬQ endstream endobj 225 0 obj 3052 endobj 226 0 obj <> stream xA07@HcKW! endstream endobj 227 0 obj 59 endobj 186 0 obj <> stream x=hZq|//}愕>A8eKhy&. :Ku.ʄѝ1uZ/\ޮ=h/'<^S*e'$@*~cطbn5^S/0N]a6W!yٷ=镃\|(OkG=YltkfRN@5݌OrDWK 'B!v£Ş2sPz@ C*'˷JX0j-s CUpI6Xj}MtGϟ1;9s7 Cv-ROgQ\,Ker(̮i Ú űS)vk^oצ5^3T~Rx+: Iicۍ[egJ~;9s'Sv>}GML6OT^>NSgJ*/;Á; GxU+jk<!'G%4,\,+DC[YN[Rזp |>S g\+nJ6'[,=χ7ƒ=U7m8u2U"H`M#~'@|ߙ7k ֮L4g7N2H o?fé{v:^б9Swsf+>C^۷Wv~׾h]z}^u<(yp+w/]gR^Z'wv=o,0Jxkkyk['NT-֮uî" ;?d'wPyp;c/H%6bu*|섯|سIyi罄Z]k]t |'R+VS !¹1bɳeFj:qb9x=yvި}5g[?@@Jd:ofhcX{gp(Pk!rqC]Ӊy>ߟ ?/܇@Wo">@xBEiNQÏ2}v}(m i"7.!y%d-k~ ELЊy5 :VL)9, \QwD_9ߩ)IppuoE57膢!rAxB÷QM5QyDB"z+ʹ5r%# > stream x 08[[uj۞]( endstream endobj 230 0 obj 73 endobj 232 0 obj <> stream xZۊF}Ws侷l}X@> , l ~Z}. d<`ɪ[:]*=1x'Sע3n~>iY&KH`!+jZqV_]N%hT1'c/ΤyƯXMIгZpߕpFqd+'X;OQ(G9KxQ.ЉQ38嶶 rޥ­7+p4\mSHUh R3i3awxȱd^[2 i!9#E EV% F5\ uzR$i)]_,bBÅ 2* Ml(sN}bdJ;C.*~Tep}ycPWg] 1eϟg`=1]7-D/J ʉ)^ҝ'~* gǿ/,C)+覼ئry4L,EpSNTIP*}! o J'' 6%$UVJ2l@?R&5ĴSP?%K *cJ•CN[20l@u@DjQ6["HKP h?脖t;GI^c%*L)=9EKi)i)%-W4edDPTamJH4֒z 5}U2+ _Z >miK"xW-Y' endstream endobj 233 0 obj 1476 endobj 250 0 obj <> stream x=hI]\ WB[8C\\X‚"E)WW&+"E@)\lb["5ZW$+!Ȼݙg>V~FZ GP#\ERzO( re```%RŘPnwvOk_:y^~A79ӷg C( jE{avPԋ'ƽ~QYD_'T> >#n!#1K9TՓuK ~~4s Q˘&Ȱ7ę5h?7ƗKe:6tc'xVٮnqߪ6}+%Ja}q [¾v?~IU9 H}I}Q ?苜rS2p4A%Yic[N2-Tn]aʻ^=cS^Wg-M`eT M2n%?WnײUI%Z_W >JGS)[*'gA]ӈn&e26Qw{rʃ>|C'zlBys8@k72dX_v$7E,`3ePnt^ݭV HK;RT*f<`9. L;LZh[: /9ٹ 5)-pjq$,;g?6uKuɱ㙱G̓͝RPp-^wR%Tzn9*۵5CIvu^5cLR]~Qq?Lsfp_нA_3-`ض[oڮ-/~>>e2H[~$ ^ȐJTtb/c󹓔DZ K-Z)2Erw =!N[׶vY.D= N7x&ntN8==|ovq[ǹwIS=dϷI-i;YR~vNs*GI1%!DdXr^}:!`4v9d IjH2['jK'Gfqkkꉗ3@GG`lGy>[PCQGHtJY0]'}5M1-3WM쨧9ER&C7u%mͽҡ?R}.ZŸ߷eLpG\xaHh3e^7 cXBCN2?p@o=iw:]_7sx0 %jPW~yr^.vyWfnQx)ވhL;Ko|?8maw# ^j2IdW*;Pz#D޼uutb.i98BsP긑c7ʱr:Z'ǕcUq?Oo/O3;K\#canc& ; j=LUEaC[-brh;rD/t !$_B B B B B B B B B B B B B B B B B B j>c``Ux "b=000pspeD4_PBH---Kڢ@H>-KBVvϛ\ i>j67Ĥ[pRxTyBW[Y t[wjei:|rωlni=imnnb/RG/O8޺R++Am[>76>qNP(To~AFeR?kfUCamz}1>B&?}84!/OuPCy8eօ0?'-|Ɓ.RǞ?S$dUCvqc >[PyQuƃ(aL݈u[ހ7Rܢz®h%) - X$(ۻJ:zjlp'`X-k?߅EggW)nbpT_tg%=ߒU BV1QzeyN8$:-@h~TOw a|o[drß8&1O[0`AEX`TEϥ0U[$K7=|, Y-YEJ"-deX~NAPغF죢,nAR8#vqp=?98HS[p=@nY*2-KBVe[@? Y߹[p\BHޠf- t B -t !&[-sAM[rwz]?x[2ClyYjN_=PoU٫TIdq ]0Sɤ[閍6ZO[7zu:|bsωmWB߯cf="u i VL* 2gjuqY4:VpJl0YBP_D, E٫'-__n[P̚$C;S9E½nLyGw9QNIbw:yNq Q:/:.!Ӡt^N9>hpZ z& t˲.} F0#M5܂P-jB83tKnMg!d[o!t B -t !&[BL@-n[1Bbn!t B -y{ƢsAH>-ep>8p08~fo<=67?@u(/t 8_к2n! eޞbyBzIC ^4E|RŻqgQ;.2_,Cʋ[vv7  )o(6>#_et2 Ft dI_܂J#?#틨CEn%;dkKn%XBJaŸبZ+*1nb벧ql1%A}3ť[Lη wd_}w;/,#l E9^HP9 C@7nBF22Py͔=|t9o+Ui8$9G2yźrשب ƌwse n-)KƤV!3֐$4X--]t ɗy}*n16} ܔ,dY}o-?'JY2f}pR2dg^AU|zeo%ceBKkIA8#gbw\挽2#>'s#$}Nݲs4rs }槐zT t?Q(? !yA,-$t B -t !&[BL@-n[1Bbn!t B - _C95Dn[f]C`n 3Bm ߦr![}\ewG at t9k]q2:G9擬FIj%3n"!HWDTc}HS51NV;'!soHJ[泆[vZuM EsVy{;Lct 3Bg sdQq3~gtG Ԑy!xF薹!rפfBEƶ&](%B0HR[溆g9cSd&vy%^Oq>dZ9$5Dݲ5DMCh$ yZ4bah 3fn-5A\$tӃ'cJbh ij@oI:Ql$ZȭnYUTm/nY[YI-t !&[BL@-n[1Bbn!t B -Kqcn%*;?oټ[LRCkvP~47 }דG͍ to :z;[/)XB8v#a:/:((-m;_xMi<3D݂t[N_XTy[̹z5.Ba7LpeĤW  x Ay H$߬[ J%=HmB' Ӎs Z.4ĥz/_aM^ ń[{j5KmBޛ^t W_7VׇCCJZeKZQA>wwń[tH7]n4%pRx#JH&X$KALtWP(AȘn uDmxt|.o%%}l|}+4h|085B"Y٩4lH|FV-C-({2G%P>lE;}y:{..:W^|aBԽ'6N'$薹[Qfwe#0Ȁ#}8某\[E[vE3[RN-qq?!@ui{lTpC-jRř*6!Kb--'R.Ǐ~]"s^?'ωq?!@]n]{%InYo YI-t !&[BL@-n[1Bb%>5ݒB͡[BL@-n[1Bbn!tbݲVe>#ĥ[ _SZam}}BC\Wv*OÔ[w\W-> By%_+^AA5)q77.,8Y7MغG^Yڲhbm2BZ썰, wi㧍gI] QFA [Hz'Dz!H* YHA qS dFiَFm2BoبUvC-65 o-K,}c)66Z,_-B% me:tJxhm`PPܸb=ElS%a g5TrLvur^ h(-8JQtKD$v9qk= R٭貔-MUFsωПw-CBA]݋C4ԏ}Aiч-+Iu7$%LA DKj2B}mF96|H[JOFmq-+L=;.j_tZYO-# 5E> Эn ƼxEPe݋qQәoA؉ӗp:K(ejV|KRRK9EZnHJ*ꖤo dUs)8YxǗ1閅E@_#nĮ-' N&%v~ Ί[2~&%{%i9ؓb "';0@-q,Z/!,[/cJE],TҒV=s<+kɐ׻vSNϷWXKod -̇IS$6m[ŞTMmnʗ1PnIeѺ,w| -|ћ[[Piz[ѓѵB%-i3ť`i =W%vǁzhtwL='d>HS$6}ؤ~NtxEܺ1Pܘ(6NE%>'z[nKQ-sn!t B -t !&[BL@-n[1E```7f]V[!B1B1B1B1B1B1B1B1B1B1B1A[<0000\?x&q ÍC-WXF!fž endstream endobj 275 0 obj 8766 endobj 276 0 obj <> stream xA 0.aUYr`p endstream endobj 277 0 obj 136 endobj 279 0 obj <> stream xZKk$7ϯscc{fb0d7K`COJև0HR=?=U @QVs|I "qsI%-wj{Ɏ 'mALW[LN|./+8=OٚJjcS},,Iτ9+H g-5qhKɲRHvKyĦnh+t}k乨DFˉԶfYR7-BfaRUFv?&-BbmqI"XxrqW&[2WT4gTE&S T^""LeIOٰVEqg_|)McLaث |V,l"H*'ȏeMlgW$'%9>{diy_pv5⚥d.J܁W-vs?+;l5cَIl:e DB)7?*ʕT¡- Jﹻ|5`Z_'W0*9Aϥ{I\FkԽ 't^BA¶N$># ݚVF^\|BYW߁pƞ3088XʬeD," #Y:L K|gz )fhU'y<'(<^(\:'8)DNb`){<-4A ۢN75t<8,U=4c[:ZcNTb%|/\VӸaIحŕLD endstream endobj 280 0 obj 1815 endobj 305 0 obj <> stream x=h\3t:x^7С 1xƒ1xC jL`2!w(C]PL:! uȠ:hȢ>:,KOlIssSTHsVL)N&7惰?7d#aO!ɛl!'~` ľN&gZ((B 佬9mVʕq^:ׯN}b2y̡O=@ϿcO=QT]գ:j)*ӒɛEa#.zc+檉*/65aOK&oo;+`>_?LR2ۮׄҩ^e=ђy|X+L{3'ՎjIl"]7]ʟ0j;SSu kL歅G[{zf36 (/jYN7#uI)1I^7QPj*e:O8AoCչSP`3]!K|h}!^-`*i!BVhq)' 9; ~샀䎘A}u)sW1C^o:!E-}dH71`e Mg6?sCXޏa̼XK?8Y3^]UhW¸:BryIf,{Nc];a ~߅l7W%y`| PجHUPc8_X?&رh6-*/T^ S' bUsjy`wjOy*JRԾO o!$TI1͸;55o c\{ =.NjӼd%^{Fy{7ljضX' }PiPr\ İƀm}V/ 12҉F޿&xjN<}gtTD}>O-+|\@dtEceJ'};spf]N>\$䅝zr<s&Dy8cnz)}ךjfTqfe~%>{kov4)іgs/zXKaH7xumm|O [<ֻ?5fU6+x*m5>h=`AΣ <謊ڠN>uZD;.uPqwf.j֢;vdޓn*A.+7AK,0F/g.J~Up{ o75O@:$țl Cǧ~`?y> v2yuίc-;L^Cd{,eM'H'\ejygg[ri3͕x<\ m_rtТXbcՃ*tɻ[[ԍ?w-R[x %jy#ǎOpmxs*.*KkUw2~' >ʝʯ%黔|zf\ۦ뢠'o_V6rHAhraUH]v\KLlbVTA8 XƐܙs\0eƆ\7]!むaedѭ!yIeױݻ¡Sbҏ>.=6j'u hɞ}#@qؘ=boFA;}[x|$K*i1BֵVUm!cy߽b+J`Z.w>wv:# 1˰KlmWk8@`q^,-NGpriש\1]'[A. :;~ =q΋"}6&Tn7\ejG55 *[B7k_\=|c\3*r4|a2ȼOC'"sF:᲻*jE d2-h.W=1V=ĭ!WaL#坧_V,ݱE*E5ñ/ []KS(bŞpE'?rx5 'Ly ]Nߪt8~݆)>$}]IS\E/ r~2Dj'l?ɤ *VW)lGuaԲPMum8FEstwĆBvHeli)i~pSzyWS<چ'Ȧ\-uܩ)va߃ )Wex SV1=86LZuʻ$a )Wex SVk$O¾YѠ\QVN LuJ3M$RtDHQxok%_&mU*Ouی`N^v(Ъ:Ր=W+KQk7GohzwPUg_$6bcm# ;z(ΧQ@ ~D'(4OSYX*=7ӻh奄:e7aVw8Atݛ\^̊tj~UBhqxߏF YP!4 󎍍 _c&4'L<6z_߉uc.'uskǵ:s빎ͷM 3iPG `pN"#Dw):"Ix'#Dw):Z?9sƬv:^A>%qO?|gpΧ]EZ; jLk;|nӿLHu/xZ|#k5# zN޻_7;=a>|Px0 =V<:ջ/OZ<r? y 3(e1;UnNmmbYJkIB;Vyhr%V,-xj&/;#»SXO~GPqn& oH?5{}k{{;<_BaKBƬ)B g*Dcd0,MwS[=iI WhɗI*јϣ^t׏tuXHx'#Dw):"Ix'#Dz{wLRR;g[XL)Or^߻] »u5.D%_&+^o D&{a/g~[mQ%[_TB1'E9X[#>En:,T,;( $n7)jk'#Ms7a>O>kWIc ;Fv~G13A^_)=R/&Eh<cwsI8稭w-dC ;c)?؝۰> stream x @%K0VsN^ > endstream endobj 323 0 obj 79 endobj 287 0 obj <> stream x=H#ǧ)na)nqxo- `)Ha€ ",- B,XB[LOa3d2d1ɬAy>oΜ.Bdd0^g9Y(L+âL5FF s[>EsJ{ ugmQ[|V*[z9|ovX~:ͥIxzp3]lҺmu;*X~^lҙ[qaOz㴑Δcyrݖl̬mC3 *,?+[7o|`Rmn7g6TE[JR,U7fZJ\H׹CmgyBW+O<[F/UǾ\l|1s{wgeqb~݁@jůmAot*L%aF,fD e]Ύm-OLh]z?Eb5Q$]@ -GY߾rbYIIUjX)Tp>6* En]㡴&HH5 ] W(otj6o(gת{S|Κ.|Uۘ%$-ũ}X2k=n{ζp;h6BV/+l& ťSӳXoqqtCUc1rgW~x&: V 쇷MDιK(m9!ő6u ?[Ǯ;y5*Ŀd]\7huKX>|eV,|eZ%V僛AfWS涰Vւ[PFgkMcq50V>[D|5I{Cݏ[Zɭ,=ۢ\)'SYyMVZtz%]+Z%xd YljS~,,hֽȰJlG2gG9zze6e} L^}&˭xܶ <+=5 A8QnnĢ|r9C m2_/DԫfUMdFۉڈB,p޼טqϷp|V;8;;q\!cgVn:v.uxb)[q L', ;ȩr {Fx[ ZAG[nTcGb~Tj5hn7>{qkbޒVd,ė*LO\6kF?Mڸ.Vtb |=4{4ҥ80[a&I۫1QVaF4:@Y(i;l۟۵A+tnOei[׭ӳ~]|3qg_[z(5&PUZ4ߊ~pʺtLGAjh88{"-G2Iʞf(`U?|\ ]gL-:dz=v.#giЦ7ZQ }g.o*S7y5 ֿpqyqU[ rkzNÉ^F?!n̪m/ֳ▌OF6<-j:4ǒp%Q-)"nIaqK [REܒ(F0%Q.dd4@Jh dd辙[ #W [RDܒ(F0%QԤ~i]g4Jet{O3vqqQTgoRx=M_X{p~oܜsO>~3s9?7nι=;=sNf"?D"o &mO{{p¿/ M˽.UU,|R QkDӾ_:W->'3wml ł#{{X(_0~(6 C'OidovJ)۞xn-h ?8ؼn`18 #8n[IKy(3_(C'AE*뎥 mHM/ב`oaAq~f xSQv=FɅ @T[t"7&)qW7EeClo?VF?z|".4RnLKp4!,Vgu*0X`#}U 4L ?[yv2b %~2]8ďۀ R8@p t[w1|pEEg{KUn{q2##; LU< e)Im?_@z,i1?c&q;=_m11uCFO}BSl"yq="A)vb:;1}[q[Ů+P?##6nF/#F͂]ӗsJ׃Gn#GJ7Pq;m-}40ð`gEMU1]_]`;H]|'A;:ENY4+wgn{U/ZD-*LkP)ݭ-)K|'$ViV?[NJ_E7}C,+3bvZD20%Q-)"nIaqK [REܒ(F0%Q-)"nIaqK [REܒ(F0%Q-)hn[*(dd4@>[ ]2 Zh-4+0%Q-)"nIaqK [REܒ(F0%Q蒑ͯzpKF6fbs.%# V` endstream endobj 324 0 obj 4187 endobj 325 0 obj <> stream xA0 7ͪ}(IE^1 endstream endobj 326 0 obj 67 endobj 328 0 obj <> stream xZ͎6 Sì~(&4]`>@-Y뗲d{,g)z('GjJz~N~xcw}LχχhxY=\2Z=%} Xg5;|x:\>7+  Xz{1E´2#U 8Htzfpea^ahq3F=#d 7/+Jj$I^Z v)Nm_^~0 <\ݨx Eɣ2l H+aVe7zt=@}o#m*0`ɹvx[;>iHQUp')898GR4(,BocĘvx ~FKyv\P˛&kV߹m._EEOȽ2ذ}g})ț]Or$c73Z;ћa8x{Oñ>3^O`(>L3G16ŷL;}Ӯ0GiHL3);XIzlwoH%AI~ufS֦Ir :Ht2XCΈ }XJɐ܌@ ,drڌ@YϞ`f/ذ0I 8e5[rmf$g8SEyU6ŧ[k>A OD@Vx"R~r~,f TւfCЉHm6d$9%L8[ah|%3\l :2'8'tMd`#1b)溻$sF#I\xU O7Kh=Vӎ(Tax_*2[SVKN|EP̭y*g6h:٥l i@oűPyU(Q(&bjLI`Z;}0>WXjL'F[Zj^ 7gVC^;-=!%ِZ_k;%U/u<_A. v ܛ -jD cW>M,CΖno\*K[kwq~*n˪7_VYJ8hڼ︥KISXK BIv;h'67ckS1s70ie\Y erbq̶.T7iŤ*b8鴽.%=2 ۬Wlj͛Է ᛜ_sN%e'J+4җ \Oҟ;49hJ ظ{Rٳ endstream endobj 329 0 obj 1596 endobj 371 0 obj <> stream x?H;:wx `AZ`)8HqPB]8Hp A;8dp w9Ic56IዤO9=RH[m>ߣ .,WUo+]2[ Flmfb`|V{²6A"kඵdCZhKvQڞw_cE+* Ln 8}mh[ł_k{ۭlU!_Fn)#128}m'Futr+`x ʦ,,1XYƏ%XlHSe[rKޖw:QvZZ,ojܶXX( eqe\Q-YbշOiRNvAQkO1x{jᶶuy r!{эX>Pg{߀c~ǜ4;(Qy_ւ)(s,W|YrҟH))*s'q5['%?sGA:a;5j&h<;CLpkZՙa]N˟wj;`^>K?r<8+~/fJy bǪΛ0@:\wL\u׸ay=ºUu7>r'g0*NÐ8'\j#/ :\G⺝F1A ~I,/Ozo\~M~[Ϋ;'R?1'l/ [z0;vnAU ; UH6N5^89Jko,s[V=VfͶyc5Wzez-%CW "nkTQ N0kjdٓ׶җسh^'_?ohL,50"a!ĥ]᝷1ZX? a+j=P 7;M5lK}eW,NRASPj \Zj@Qn|8mZ w:TH 9;օ. 1 ƫz]:#MR;K*uN';#@0~Tr~9_ɃpMd+ ص;+an)(pBeѺ$q'lٗoz Z< 8zg[)ҘDfMI#=_%uAۆN|0\bG:ϋZD}F/uVhuA=}[<m Yw\0`;V GPfȪ Ś[l}Of#)vb[Kfv]'˲r\qYj[uxhUz/9hKS7hfJX5޴+{o_ ٵ6T0hҼdT#B}cy1p3R\ۭ0Qef^W ~[3e9ykk/_N2ZVROx7BVfkܪnU-]ͬ= C\3-0@7mpOzjL*V%l̞B^5m->pʟ y[Vi鷕CُfqT0YaFwnjP[uTa7Tť\j4 k;$;sOZ-Gzy2fʴS%[~z*Ga۠@Lm+ ӐKjQ(4ZB: Vi|;lu'W!~No=q %Xi,k ~ Ȳf&yy_u}0JSϭ٥}W(zOڍc_P ܶٹgU|vɒA{ :@:OBxxW嬱?~jԝ Bܵi]sOb7s`UlڵXn@vzNL0kv[ty_?ViYic~^~_oJM':i+F򃿅]ԗFlyGhl8^vQ_ &Vmۏ(m ̦PaLօ<*ڊ1Q 5oc``xc%D$fpaV?h+ h+ h+ h+ h+ h+ h+ h+ h+ h+ h+ h+ _VJΨOLk-vQ*$.|q[Aڊ8Vr6g;bh+m U"sG mMr,ʹ;f+o"Yi޶fWP[AH$s##žI{&ts+RP~Pkx`+x_ oXefo)-N1+mC(y'-#>m{R~<X(B7Cp&C[JDz)ѻ2}(RHMKUL&o]!LQV6+t,半crd~dd*< ^+e vP, UWwh+2m%O]z.%x轨Wwߐ-fR`cP, Rec5a\a+jG2 e@}Rw%In]`kcQsKA3=;6NJy[k:n0-[+o-[=umWOʯoX <4GSW,gg[ { V7.ضv:<{eH. ܶy%AEsٶaڄJ>'l':nؓ²U0ƑmaPx!2/eC[#mEFڊm 9h+5rV$ hk䠭H@A["A[#+*iCRaEmT1FD2@[1wePq$R4Q 2 T>V=až6Q9BQ2Fp+0wﻬ?T-oa2~)<ʭmMX3-gbkFyߴq6Zfmk+0|qH(-8h|45LܶDU>hy бroWl݆*t޴s3_[ݱU>R{I~SBho4߆.ru 1~G}4tPԘz[=-A+B[! EW @[Äٺ@Giz)ѻ2}(RHMKUL&o]A-yaر5\[!*O>H.uS`xmX[Zm'ײz0&rA]VmV3r`D :}afuJ }Hyӷjl>2߯j[a Tlo%#Yi<&[!{2=Oл;Q] r;z\[ ]=RQZsXV q!([xARV73Z|6ahgg@4m f^Z^$U9{nm@&YOʡl=zv2[ǽS/{&>pٳl=RVZ23&L~alV# =o j!:KP>i H0ګ ,AvB=NГ&|ЈLn0j$NBhn&Rێ\munjd%%W/h5L,[mu Ʒmu n#xn0A[֏ ڊ~5L;-A[ײ~GDH@[8A[8A[8A[83gD ڊęq5e|hmE[DiOCT ^HiCYM`A 4 Qւ"qfV>TWCH d޶ȃJzoNc\OX2WHqlgb{x[C[Ookv!"W[{\zsf&7u=v7n07L⚇'f`$l,3ff}O"o-Sz„@&RT7x24?tf G̷?{ s=a*|b<o]ټl\OX`8(W(E>1Cl= ]Y?,C^OvҒIHnV$m5%gfc/ot!H2o%NϐG6L%]+05h+g>jF-MnCY- 9Q"q1mE mE mE mE mE mE 8 VVj b+F,m+lc``9@UJ)w#ҹ endstream endobj 383 0 obj 6089 endobj 384 0 obj <> stream xA @.!Sд eܒqU endstream endobj 385 0 obj 87 endobj 369 0 obj <> stream x/h#~b+&+"~O#>+V(eb*ZXab&FQЉA'bA'd+&"k99i&m׮iwnyiryΟW<֌R*hhq2:lgR48'mq.ACVvl49Ca9-.Z~S7jbrX)t3pth۽R,L,'g,sdn.iWwx+y3Ӻ]Q/T1ϛ~-] 41;vhyҸh.[Zy_p]x}Xa l6!9UMHjh$Sd ۼ?97 $|/) wvW;Tr=EM1Zrqj=^8ލYVJZi^BhO3E xȞ7t>^zA,]Xag^&zH okä1QkJG`m@5׃*Go v=쩻j|d7N GŎvtYS~]xoŰW7@pxOJmr$* Rf~p.Eb(yVOutl`/2@KlΚ܅?ayc1/^ۭ{{wU#΃[NdxKYhܰj`!6Dzrf^Cҹ]2j CpYTC=[| 9",`';`vL5ޱ@]Pu~l nk,3y8nQg7e[v)Ҿ+^U|3-S:pnlwa[,{~ G%K h&6;{M!]lV9=xkg;lf _ 8 G=)Ba5lS6=wyks OoLg`\FyL;ޜh=6.[$mu{)l{u .%򗊺QneY@f.&s`[<*IC!r;Y;'WT[B7}_,yw"'' 1 ds[:el^f%vr,ޕsuD/3-ϾxߏO/.ƻgJF]Р w`&9,x2`'7NIxê*sO=zye~09--=6MvXpNs' +:g[)`fբ`aAe?oA>oY9wYpgx~G oj%|nvjUfҙV+$vsowIQު]ڍ[n ǖ[1|oH[wn x {ay= iwU-3ȽɤNś[dSs暑ߌ}<>Z{Wy 6ov"T,~ś=Mv0c861 X`ۼ7J;%|;խF堢hJr$<ײ<p"d /^Y;Цfxp!n+f(Q/>+ơߵVw'ٹGioF+hw6!\xCɵ@[4c~3J2} [8R6;ހ(ۺf$ vrw]^ijoՔvK|{_$s9j{_?~# 8 Gd{.-hm~$0tv=QY~?^G-(~61F}Z9_3. mvaP,s J$!ـox[_!K@x_D$yk{WbBH{xoI {xFa?.Y8o@XLN7o5!;!)xCf' 8]_>!Hdm狺ooo!"ߞ+9aeʥ"GőxO9Z!W W6mh To78Uz=2o/FBxCZR^6Z-|26fON|ܰIxC9 s7۶4sY}#HLh!\8B#-ȅx#;r!\8B#-ȅx#;r!\8B#-ȅx#;r!hxY~-S&Cm|}oqlJi\sp/^"Brs$O'Lъs•Ig$BdդfBg .i=' !qRxkުDjH@v;kƾ<U@.xLjжJ_3JX!1N;f>9-z}Tȭl~UeM'd9ZЎ|񎙖rk Uޯ -C췟='u(彜}BѲ<7i[Ok~#kLYX{Nl;78 '[- vHNb +<P|KK>SD$P&C^HR2_8ZV}F$4I^X@^t8iKfQ%xҳ1]M( ^X|! 6r!\8B#-ȅx#;r!\8]ƒ 5"S7*BQ1⍊oTxbx;<o4oFC۔R9Z O endstream endobj 386 0 obj 4480 endobj 387 0 obj <> stream x0 7ꢽ#Q+ ymp@c> endstream endobj 388 0 obj 68 endobj 390 0 obj <> stream xZKF 9*C6 2a! y@%?]e;64teI%U}i9ݘmptMk>Cח|L=мڼXۼ޼yҭx/?d#tT-ݝRiENJÅN,z{zvt}jKqAնƠ`5~YdZ_iyVZglgyO.t:B~eȝ9{#/Ywt6X3]bGNNxCpB}0lѻkC{0CЗ+ .:wwr%- an l&>q,f0dJ]]TƊ"h%>PN/z}v\l wg^VRļzk{=eF4Sў=e1k߶% ]txƌssuEGȂ^GAPHV#eJ&FLV1%GfNLƚ$$Z 5/ixXi/ 0>y.4&K ;.&OEÍ2{M5kQ`3 e2D&(üuy5M3k;i;UnwNɼxfVX 贉u<腼7PD;'֖U#[NB;z]X&ݬn6揺iw}qWBSW:P yب.Ic5Fu'㫶ϫ˫ ԭ3 imb VڜcVpiT3w6s7<>k}`! gT㏩#7iՉHl^@( @'ʞCjN )qDݳ%jxRЉ,>g4XN=fpmuWj"xDLCuuL92œH'CfSg7 '.Z& ]Ou68ZԗǎZb>o)~oҒYN0r4˽ݹ.~:Q +/*$'¶ݪ34m:ܮB m:UqGbePǻQ;۝]˨Cێ ~X/CZ@1RW6fu~8Į~o78#ˎK3X'oD j-rix{%V/bkGeE> 䐸әK3/NY:rc} UNx^f:z>7e#}@B<8Ҹ^< Tb[T"s&rgKdg-2>&VtYʚtՊ|K:vu_Βp endstream endobj 391 0 obj 1769 endobj 433 0 obj <> stream xWj1 }sv-ɖlXB?B[(j.v[BҮK>GwG߀9nȥ>o܏f}}y۾k۷ͽ{t&ٰC lߛmO(Rf6Cswl"om;tB5YQ}C?,R!xN=[=qa<,,33xt*NH6Ɓ8‡~CKPx*)8-p86'㓰8&:Ca܉Э~JqɊQ_[^"r[!q8"bWF e4ʚ%ނ@owg;db}Qe@4 `71W5Paa^(UBE[:]BE\I m JȊtnVla -4<Խ5S endstream endobj 434 0 obj 941 endobj 437 0 obj <> stream x읿ZiRJVH E ݎ* -tH2/}&i4 C5Ư험$lo `藝l/d24Fb3Ah4 ) {+5zs$I$z]F;2GC#h\7%٫ -fYH$I2 DbZ}-:ޣ~捯o_nYD][tBc{Ű^7ɳbF|K߉Z6ps?uY΍Y$a>$jQ W40&-^xEwpTUWDzHoGja$I2QL}^0_$ILOI$I< I$I|Wia:NuZX $I$I`t:=.&I$ɸH-Ltz\N-L$IqZNZ$I$"0Nq90I$IEja:Nrja$It:N$I$T [VOK=ډ1طNgeؖi9Jfl }[$Ijad7$;J21طNfN;U'NS $I4EG%1it)?Tha3Niᛢ}av7$I'diawR zᖴ.F0nQKZzo.LS[]уք _â0b<iwa]xfcǞ9 bda<4]Sƭ'y /?ؚٵ5<6\O-L$y[ QׄW Rp ?TQuօ"RpCo>TKV@20R)>{ >2n6 xU{Yjؠ]fաZg}aY Ģb;t:~Z(YE2J>'/&օTVS\nur)-,e!_C S~>Vkj¿Ο1G_uR>$I'θ0s}I͋sz{WEow.kfED:-UVڷڕਧԠ|@ wͮj75ccCSŵ@ /,)~)VUe]NOŠ3_քy!DNLrO~;;+HvQOea{f#;:hWZC~_ yoqouccZk^XV TJ &I:WօS $I:a]wX.LgUsnS $I:T N,YS±v0_$IyZz%W(MP=co+:NT [C}+%͡F$yr;W|];XdpCE&I<T .1sTKwuBVZ&DhW}^RD~n8wꪸ7Dv8օt:=7J20h}yiҿ%lW/_ȣ' 7~6Ƶb,| [ ,E`~pF-L$yI 1'~˯7ڏqk =ێT6MS[kp]vz,e4q]Յ1f̘qcuCkaeoOԅ­WUjWia |"-Lª#k*F L{M$ydr}ia<'HQF\]D[~%+;zެ8>1J-<귪{벮.F$ :mm{-0r?MY+w- uah]و-iFM=$:3a2?X$I 7ʅZx[ /?FR^#Gsq4-hadH 3;_ȣ[ԹKZ؛y% r{cH$SAwcZp ] ЧެcT*V}pD;Wul>e1qT! v4V%Z8u7^Mjaj#pdm#sg#/–9:]ϺSoady `5]Ci#XS*~ik+ߪ*.~. y_ȹrVZS90q;H¶%$Z8",ud]xWByHgȒ!-.25ȍ82=tpc"un#V.*Zx8EWqCb~)E15TmI2ɴG ˔>R F U+غj,,i>PjMtȼ nͅ-_k5mRXfᙫP /XﺥFCG$O-Yޕ.:ooQK_/ias|GmԳxIXYf҇P5W.+ odICz#:j5da'мqcVWkKja|>R]8WZZ p;jiJ {Spe]X[2ޏP [1;N=J-lM²ۓKWy-6ž/5))-e]X~PȩBA $L:{$-ƫɺd]DˆG,)/.gpB;ƌ3Nx|L-lNД/奭 ]nh\E!2vId*-|W{¥O%'ZZFVZJ++o;:/EYʠo? ߂h+NN{ǘ1c '^L7R}:‰pCnSwKUk?jjbU1>c){ypId*h͎X @7`ZCԅ7}@b5 fG& Q]W*@ [K뚮ַ®/pTArDOI)p2;ƌ3NxO~j_,L+5]Sq}֛h+Xyo_Jܵqp-1cƌo<DGCh0ʬض;z'QnJ%W窢e]]89cƌ'9V)Z8l.Ky @£Q/~.[V]i45L6Tֶ5$Ir{I [u5:N?9&"0IxZxugkۿ}tN-LnEja$L0»ua:N?S [Z$ILdb>%irvMF h1~1nۃ ľ$XzAZX~q B [ūoH<_fZx-I-L-LޱWGriGU>LdbiXxuR ߍU4EugyLI-L-Lt.|;h܎ٿmd+=[.UJ"XQTힽ8[q8͚x_s] >˹r|l*[/2wY0G8rw]4~5 K+"uPr}7 y$%]q$-|gꦑUlL,;RpS]U PcYҚY{\J¿:[{lC{vn;o }l4.XO]jFL>mֱVUU\\Tu<4=AeL V"}ZLgtY.oQb-Is^իSe= vzV 2]s0q/ m>ز2w#H떫 =ՋbCԅ7}@b5 J 6>䣞PRZjQm0vvds˺/{`E1 |ltSy?BW bd«dq?:42=W/ dpk> DUT]ZH*nK0υvkc$Hi௣RGYL1a ϋY^) ̛zLj[O v q}m]k׃ڱdWꦩF0ghXĻ-l[.^emՋs!PJ*-XU 1_(-lj;f]l]㴮A:Qo ߻kh`MﺅQI1P{z>PjEpB;4/N/Kfҡbl%tVqOU,~ZX~mw uR]8WSj[Ljh1ȇ!o3fyJJ-|k-˭hTfLnZ_a-¥?S1w0KšZxbF[Ldb)?"-qD|RGkh>@2 I2ɔfG0źpN? &χ-j9$In&0}+g]xm~N-LnMZ]N2I$I|S]xf~ɺ0NߓS [q/ 7,}*asU*8‘?xWR $'R ӷua&DYr<^Q>5],iͬ-G؁'55`+ƥ.Lփd@\C,w 1LjͻR0DrT-ok# +-y^ZAΟNKUpm荖(Tma [ߪzSf'_ $NshnJ- 3o9X0bV~M_O Rp4\w[ߠ(1rT#>DZo t/}k?jjbU1Լϗ5 vz +E cGHL2"U">gvj)AH - d^,vbR >i2-*-l?PQ]W*@ [KczE-=Ys.ξ"eX&Ir#!gJ-O!|ԋ~:.G$J9A:_ ##B0byU!>>+-s;zެ0^ZBrG]Tg]NȽN_rjar+nrS 1 {}ο/ ,UFN߅#+-l&򫐅IxC k*bB ?'RpTk~ICkaU{t“͈qV̲aV-Vw}.:rBcFpT#v| }˾2㸞 t:N-LZvÌ|6շPՅڟ]#})!.ζN vGJ-,G{EG8o $In&+^FefSraf5[Fօtf&ua=+2~$l:^͌wJja$7ua~}.|=ON̾s)XGօtf&u3&0Iɺ0}'t:}S %0 i}Y`=_dNGVJre}w4ƌ^۾jhLKX T+VMkv':&ɽiq3$.O y&`n$yP¥OuZP9_Y[b.ljAogŒ!Ej7%p!wzaY uM^[Q g&V_.s+_k?2+-˩ʔTG|^aI¬ SJ S1zylqύN? #m!Kbqt Fp!ԅ#\Di4ʰ Zx> u7:S]x'63Ko=7I0"-ᢑ,C_pUKeah^,=ZՅI2E QLTJ2$̍$]8Xº$ Ϟ¶U7BX@K~<:-|đ֟}#H kaJQ]a]XuYZo*'Y .LO?3R!z:}׿~vPQ]z31_*pA^?%-3fUOR5i :&ɽ.<˚ӍV$y>һZ0zq6xCS y]Z$NUv}7^}Ki!d-̺0N»0I$/R jI¬ tzu]Z$Iw$kaօt:=]κF-L$I»Z0tzpe~ܢ ɍ{m j$w>LXʞjMj=f_D}o'oYh*h8}]Jj]-ZuazJYYUjىau]Z$ҧRß8:/ܵg4Up}Q 4pwa_RS\ī}WڞU8]U{dg尷|!n_)U~k/Et';ۯ/zV.+QKYty~laq 3pB~w fu6nrתte{+K»Z0:>ЊJ|#!"Ƈ-#3yp=@4Zc}a8Գpda\?SH*-ZWSv+Űu&Ff/|U[>jEH-#j;lFF.ܢ-FeVx>٪g +Zk,r{b|tv=w;;k5U,*9Y^XbκF-L{'0>푃CRpe4f^GqRZ2!t](>aFzjp,\cKבQ٭{6\ǠVJ }F\5$ L#Ţ*5cʚҡyFѷP7֯WK !d-̺0=,)(S)hv v׳O0FקCee JQѼo£(\A[X gyq1{VrH"Ѻ|3Wq4gyԶTGTQC_^`(0ӳ|`;;+pT_|wZbκF-L{纺ytUJ zQB=¡=o*y-Db$ -,,J=+ A# {׍jNa9_^\#| 3TW#bqѕꘌEsCi+م-\V)ֹ OV#w$kaօ)HT%\@$t)+cy:0#CњYHWϹB 0BjJ-N9ũ:i4gpU.}-SןދumW-x:GHp5ZXV?UH |g}K-r^u]Z$΅VP:^WMcP5 | FVȩj e| #DB /M+/1U|boEpt/~.)f۠qt/~DIa5R\sIA/4fk]ܐgfC]SDYTZxg痸.}ciu뵼ĕR|A-%Y .L'БJ Ĝu]Z$gy15#d-̺0(U٨j>ag]xW&I$Ej]-Zua:NO.Q $I"d-̺0NYըI$}ZxWKf]N j$IH-%Y .Lrօw5ja$Ir_ՒYt9»0I$/R jI¬ tzu]Z$Iw$kaօt:=]κF-L]G_zCooYہ<&w$kaօ'jW˼dgA,|T+i,da4u]Z$y-\*?y.yᖾ/-Э\EZzHVtrYV咣O綃EQzOEwô%8p j$yP.ԅîޔBueu *""v$85ڠ~ݾk#8\7չ! Z8h EgAjRZVK,}ٱt$٨N,ӊzn   թρ»Z0- Z";Zgey-4g7[Y$ց1@R$.%[oE:*ժ554.,>,<~h^TYըI\q+- Stuﺅ ݕ  PPh2Z^5Uyy,ԅE\*~v]wn;jYZ!Pwz4){N,e||\t0T<|hpK-|VκF-L$I»Z0t:.g]xW&I$Ej]-Zua:NO.Q $I"d-̺0䛅gAYըI2~\ˈی 1|-w$kaօg}Me=:MκF-L1s>Tp]H]YH-%Y .L? wb$S}Ftu]Z$۬ՄЄhIMIHrwR jI¬ OY[H,BTJg]xW&89̉ WC9|KHrwR jI¬ O'B7\k3َ}vt+u]Z$A@LGX5ѫ~N.!\}xM׳~k~O[/#9Hօ$דZxWK.lM,ѩbb=XI㕿TfF 3ρguVf^#/&1@>O{i7Šw{.3Ώ#cϸ3V:qAo-օw4jy"r~DJ+JI瑩aM\gYvvG?Y Tt4zƫV~SD-%Y ^Yܙja.竅p/YqVW؊xL Yɺ|coXը$#}|+Wn@ IiumqxV^^ R ^3 >@0WCϊZxWK.&AT0#ݟV#q'_?'M}3vxOYNX YӫB-<:|0^}aMC/e'n<YL; [#g-pk兘\lC2^ ΁䰉Сl3hO^ {Cprb{Oeg˥Ѷ =ko('8L߳.(;m-d8UnPtncO60lXY1n0+z{J{&p,ZuH +7/ja?=(nVc>Wj>}wgZxs]sX,a֑YX92&#A0ߢ{tx@?cg]8QvZx.,-\Zq'Noѳ/wyњ_rpk 3-)7F8l GJzL-B BLFǤ|ݐeƟn>I-(KW]X6ZXՅ=0q@osظ`ѳФiu3yZbw,*7-ZSZXthaӃ;KӾgFhW=5vLms.(;m-ªe-a>6 NNM ~{WtYcF̸Zes ϛ‰$kiﵣ>{l\C t22#jawZ*'+UF8͌[kW.3[I 'N[ u͆7, =(◒[jTt챃vfdfz!g<[FjkOl hK!O&3v 6bտ"YtVX辵/UrO6pJ֥ޕb9NjDYo-3gȺX.~|'H7rP,fyRp!ge‡מ,m" }jtV޵WG zf{s_ط.sN53~SA 'NX Kdωd -y0(mc52 ( O‰$kX#-us|笈tB]0<2:uDþLmpyX^v{gdN%Y X!W/Յ0#Z~κpZxaH7IPaG±$R 'ʒ 7QtΊpyd:cja 94uMwqײu0 j KT~]XDG~g̻Jı1{zg]xW&I$Ej]-Zu0N-օw4ja$Ir_Ւc t:κF-L$I»Z0t:.g]xW&I$Ej]-Zuazz]urI/u]Z$N^ <7.w$ktL3zr'>qϼźF-L{'Ni"y~kBj]-ZuazJZ< .Q ha? ZDda43+_zSpCϖ R %Y .LOZ8\ lظɩxp=5uyܛImiYNQ jaU$YxdZ*6f}vO{E'a S ޒYԩ_YVFfpcu0IR ǭKdג=_JJ3o;cݻ~]Ƽ7UVcIy.p-ZuazJ]ʓURb)փkg+ߪA;X\D >"|ߏJN]f]8F-L{gLSoI¬ Sh օSo$w*-Ne2fZ,ZuazJ]iawJ<YNQ i(&ƧS %Y .LOZx`G'њ.z&ɽ3s%{&3f;i$kaօ)uja8,օn$wZ^gZ2f|:I#R jI¬ *cƇU NXѨI$}E-%Y .Lrօw5ja$Ir_Ւ[ tzu]Z$Iw$kaօt:=]κF-L$I»Z0t:.g]xW&C8GV ɃzϓZxWKf]RG g]$Gߟ9»0I8;BIH-R-ZuazJ?KV"O)7ja;0}H-%Y .LOZ__~N$;}0IWfI [j(4R ߒYC-2 g1xc>.'?<Z8d-̺0=.w?u\axše!Zn}||0|b{wc8 M[8}=a]8F-L{7aŬ.Կ^+H&+U^4ol[a{o=s& X0z-zEV\\A(&G{{A tpzҚ0sG0i7ja;C-,O5}ꊛbs (弧=EO_YkUlrMs#L\kf>sS ޒYC-M̊\INsΟ2}HdiYXjachN/_K1©7ja;絰?1mFb}0wWjZX; ۻ.pI#R jI¬ SR ?,M] 3add:~⛌ݫ8¥%(_J_ ^o6T3q Q;y6i7ja;~Y]I2̈fUL:juZX׃kgk _Y<?EFEZ8d-̺0=jaEt+|=#,2l$s z.ͺpڍZ$P O^ gZoO$ p-ZuazJ]iawܩG#0i7ja;Ƈ{ǘ!bj$kaօ)ujahZu0I=@7 c{1p-ZuazJ=]Ipfi7ja;#-Tc{P ݒY͡"KgH`كYըIQ}»Z0t:.g]xW&I$Ej]-Zua:NO.Q $I"d-̺0NYըI$}ZxWKf]N j$IH-%Y .Lr5rv94_I$"~WQmmօt:N˩I$I2..Ltz\N-L$Iqua:Nrja$I t:S $Id\d]NZ$I$"t:N$I$Yt:=.&I$ɸȺ0Nqy5buH$I;+^-b]>I$IuMG"N9*h4F;9l.,ۂFh;Hs4Fb/օi4v-]Y֭`岒{A23v24Fvص]S[2\>P=0F%RZFV|M5/eH7o=!G,Zcy.ka+.kW2^U ~)0W$pq>gޛbNV,-/c8¹Fƛ2wzho6"vh4,uawiEF~q;h48~u])R*Shޙ%w}TfВhZdƭy'8||+EپkG*=o Z= R˺jE_i+gerv=ҿ}\b*G~i;h48vbuj5= P~!vPOjO݅f8ŁigZ1B/ga(啋 d .]V#~q;h48~u]xi$(~Y=dz$Vԅu]6#da-B_b> oZH.; nK--ׅWnchYh4q,uFAUW~oWyaL_ƵLϮ ^uCQA#s̞^K^Ot.//ϲ8R S ^\VIg1zvK-vy56ŏ~Teh4,v-H/TM;i4XKi]͕7;k^/h4-}M0FRZh4,v-̺0FXh4-.] .Lh5օi4Fb¬ h4luaFص04F;[c]Fh,v-̺0FXh4-.] .Lh5օi4Fb¬ h4luaFص04F;[c]Fh,v-̺0FXh4-.] .Lh5օi4Fb¬ h4luaFص04F;[c]Fh,v-̺0FXh4-.] .Lh5օi4Fb¬ h4luaFص04F;[c]Fh,v-b]lS%I$S"`%Y ™z$I))xs.Ltz0I$I'c t:~N-L$Iqua:Nrja$II [[=3f̘1͡9ƮuMG$k$I<%v:ЊQ 4b?cIEn+n+ƌ`o_TH+BnOn+n+$c`R6_|@{t+ Vbuf IG&>UE̸D`'%/,5Kp! Ie":4v-ޮ.LͲәIGf [ m"0:.LͲIG3- ;{ »Յ>3?9˴Y*1ۊL ';g#ZTօg?wqm?xJ%g)3an)og.|*dej׍Lߝ~g#!m/ ӈe[ dw؝߁{s]Ouwgp2YZjly[ dw()Fo wِ'wB4f ܰG})OPgV40=eI؆L Oef&D Vb8w§Bjv*Jt`%:0.e*\VZWp? }aJU}P,B]V9K-*>u^^>"H$޿3/E-rSP 1vNRځUv>jsqWג 7r.lW׼Յw<3pz弾f}z:ul*AW֖TJz1kb|Nݶ*W+ʞֳVjӠ;;p^h_E-,w_絰ocW۷]uЧԑkޖk^I̧~sȤq^ dj qnuO/Korו竾<Ny`Zgo;YY4_w?ݕ;<094r+w8G/kҝN~[aגԏe[ ځb߀ {W;0`u3e=GvZ4F؁*\؁p:i8 طvF߰mO.7¿B>cQ=Z'` J;/8/~)7rrQa)5~5v]ӷTl+YP[Vd) (s;sFwUH #ib.=s^ SDoDZ \Rup3-J u"N~S -P?qk¾'WY3I2H/7lH;q[\uv|0$ۊ$}_ ۾N=rkIOmE~9žKi c5] Vc$'1cƌ?[\#S]8 g;I|3 I2H/_۫3'1cƌT V/Ζj OmE~.< rFi 3 gXY˱p[q[1fq"? ]n2uashnWۊۊ1cƱ晇Tv‚Fh[^bBpk1FhoP {2)nfGt4FB-]m$ j\(M$vQ+u)F.R ;CMJ#"_CHa@ȺCj?ZFg~gMNV]?jW]4#Y|;}1=TSR`s9݂kp D^S#^ }߮[hu㾠mI.=cJ/`{Zn {^)Iהxa#uaq=VdYo' NNOzݞq@p~6ׅmYX**?xHqQ@&ߏ8%^!ya?:PB{p\X#/la]8./ڧZbzY¹ ySⅩ T?U+URQwv!SB/ua ]R?LrsQnݾo_EM Gǩ67q: ׅquȷǍAyYoxoumJ wb. †h7y4 D׉ja06IvDl _`)X3z. [k 8^ip0^j!bxG1/A]K:כ%c &S)*fᤝm$w;d04=QᑯgO=٭ GV_T*Uϫ _].(xvV[|[q{ !VKBX!5?%^xpt32zq+y%^vL"\y'O 'E[֫Ц4' dawExKuy֔*ND=FRe)ԅÕUS4 yaS}mn'k֏V(GsARO@sz=aC ǝ%D<.QU 3{MFs+Wi臖xfGjsX\|eu8Vcuh&(L~azB}Nd8_,<ga?gvxTҙAg^YMoSP281=WLn+<'gǑP>=;F!y~F>fj^`CY5 /Jw4 jj# da& 6ޞFRLvPASuqQ!~_\M]8b\ 6רhNI#77]QtcYϤ?_q,;g68 gI'wٟX>/.q~X3WEܮ+y-շ. q"N_XR~i/[3"*(Jtf/,+PEQ4[:b^8.LAF0(کAamQEQԔR& SFQEQSJ]  L^EQEM)ua 0n׽vۇEQE-a"G,>bmfmïO ((n .((jJAa*((jJAa*((jJAa*((jJAa*((jJWyaEQE_ByaEQE_B8#?QEQ}19Wx endstream endobj 484 0 obj 25202 endobj 486 0 obj <> stream xn; ~ HDJ@(p  tqM_ԤEу"3'C_K%-r Kq_ÿ?=s<?PBO_%{#]\D[Z>xZ#E߄uٕOH T*RUWQJN |tt=F 8ZTj6'yMK:}VB*A``hq6Tu*ڀ%X[% nBkcvJZPۑYHS;?smծXk3V:~bJO njjFgH^!LR77.:x_@1*ŗ1]ܚl ~܆*MY4WVFtJ[|0m}OdNԤN=`~v{=uuJOVFV)-Sɴmu\j1@|Y645`!}r$xuĻK:mJ TTɸxfa  (S%үmi1*446À0pzG([_02Q2G <"#ED0@I4~ endstream endobj 487 0 obj 1015 endobj 553 0 obj <> stream xj1 >%KaYHfg @y ͥ_:-Zvb0|5tr/1>t:^MKDX^a%۾#F۾O6=M*PL:_f.K 0鵄^{(( @C@1>5؄2zpVy TL(^W&h@3{0yҹiNَFeD0tYv6*`Pɦ)o^D3, fR*26( '‰u5!Vr36ٹ)'%itU#$]D!AvJ"mdIfj ߚ>LVcw<$VY [i\Rܫ֖. 1sX׆LW=Be_% * ̘V+r endstream endobj 554 0 obj 447 endobj 582 0 obj <> stream xSKkQI >6aUۅ1"t!BZh0R(ty4YƅniWw⮂;7h74){swF ni }2(%I|bh) 0_y'_#X:FɷGLGג/8(YKNȷ9f5xf&nz8Ct+BD ZJ]d'҉KD%)JϛVj}bM1 ^?7WG?vaB b VY=X#݃6|Z k37v_ endstream endobj 583 0 obj 575 endobj 584 0 obj <> endobj 585 0 obj <> stream x]Ak0s=,Q7eC? & I1k[!Mt=u~`{L0zrKX" 8yRetD%Z7] Nm/_c)Arϳ/fFKix"Buyb%lhBUE($;a%YJzht~ڀ]I=WCܩm endstream endobj 586 0 obj <> endobj 587 0 obj <> stream x|st%_5۶m۶ӱIrtlv:XQǶ{G^s5k=\MY`qwefga S}5wspĬ y@vt\h)ٓ sqqw߱W89[]foW#tprYYik322+OfdeOFhbdR3 dQ*@,.,@WVԥ_\)3oo^FC[{{X*͑U!Ŭd\l\ld@'25? ky9d'lfqtp$4s,o>.f@2Wg7 ;;dJf#0?f O26 sϓ߷ pWW ٿ2$$<|yȘ99ٹwEHB_!2Vw_cjz_ ݿdIof 1Ȃڅ O}1ڒɀ@QKJ"'fgjd4'(ad5J7kiʻH_1 PZX ж@@5?3;ԲY]\ȸ7 Vi{ ފL͜psv+s{l Z ĥƄ1\vȸ õ$w(O CGZ_~V=$"| uJ^ƞIk/;~M3߯aj{.6jg{hQLA#6wbza-i|#:eqDjGͭԿ@buCԷ6Bܮn xa~Zh6~b}`}҃(. =>dn9=,=UknjjNx_ 𦻬zR hYX$\QaM E_;e3gBF^b ܃.+%Y7^tiov\y4(g#׈O&`2.o!+w"ɐߛ]@brٕqyĬƇ|&Z>GoP8.5Fʪ;N$q aGǕtjCᶯ3?ّzujv>9 \#Ж([f#UbB3q !Ns-|=d}̟iry~y܁ƪ84MyINY-S9kiA"Hξ;C/lC^c.)ק:J_>pd[QP@lRoĝڪh2'7y`B}6<LS7V=-A2cMp Bq= ~6KєPjFթ]/j;t*0¦5Y!}8!+|X^ U6~ 姘cl|V7jSpJe/'J]a"lE,YW%鄤^LG5/J&ӧcNɧfƭ{LlEf<s$v$.՜m NV9۹FMfOǚI|VlA}Ӿ_(ȇO/N!/a?)a (\|Sh=Es(u&ARqYY3 <V4OJFlȼ;?I"LZB"0|Djt ԍM)nE?iUjRzQUǠ Fq*֚8U@RrE;^/25)hAssvt =[&( 5MqG144Z vseA?ؽU{!ȳ㵇sFNcx53p732{2, )e#gKrJT-ƒ79 wߜ+ǎ$]0OP˷KBL4m~fvJoV*n e,- (|yzH$]1珓~q^QO.[@V=ǔ8<=3Ȃg}}+ʰ9S1:EyL"s7u.1]RΙ SJIНB} 4rP]F_TJ&e\\4S~Vji3`V 9i[ |M m2I7.ywG"Lf )Slra_=/[}]E?,\:L\9i)l)>h͐%=G䇓NvRrk09>e|ӨvDJ+'_v"dk c;X~1Xl3RT(߮?yX/¿"03 iyYxжU '[gMRxU߬[fq<Ɨ7FuJI&Ҷ\guvb%;Ӟo9Ta"$XzS`/n]ͣQU iʚ1WWt_*yQ] 2ѮtJq($g2gKkaJ<9F=G67DU/S}Vb g"S<;Y`|1jzz#6̚وOXVBS |h_JK ݆z:|+zj_h뻍&xuH=4okTf‹[*TDcRw6F]0} kvCw,S, xwdAi| 7$,l( <$W!ovG%Ÿ >FAH,eLJ߲5̎J&㼕 Ѥ[FM["yeA@%tE|j1KTܫXez[Bں&Euᦽ,B +vsv߇n0 gv/Vm4\//En뜏a© \^w3g9;L-em*X[, u`mDwwiӶuPTm/{!-*.2&fU8{HrSDnrh -JG߸%fnIYP̜fz 6W҃%KW֚5|᫼ҭ#о"ŝ'Lif,$_« YG%9O9,HcoK"? i2w(3B&Nh$*qD8CVWlSURF.,u񴪳XmP*| /bbb{ptF2ZU;6)djc$L>׋>qId͙v-a<)nk"n k1(>ڔ> | bI2~a[¨`/ VR`ya4>0+to_nzAd | S㐧N*lxx}=xĄ=&?!*j[pO /@"3 '7lk}0OG7$ڞwa/dx^M%M 2KfK95*jpcL TZX3 _ꗹc0 gyv)=(exZ*AРg8 |MprMIA%2Of]jLs T3lEO2(&4y$Qi˨xchd Sumctr}жS ",nr{]KRj{jp(Hcϵ{O$ӺSj4=Bj ok+L8!AUɠHQI!0 creD3H\YXCb߭vZe6j&ymgE-^X so”w{ffT; h[vM^閼}F!J 82{"?|?HQ:`~?$G!~]Q4Hc!Gi>73&EjYፑiG?]%b;$oĠt7K):ުEAX3ZS˥:-Xv&pt,ƶ_WlƷ ,8;r ;Af[4 3N}(X9 .som^껊AHuzrSxE7ϩArBDcEQzÖCoSd8.EdO$mj([E_6 :K~%s+ \΅Z%cx5.F%>fԳO8=!RWM Ι̋B V|Y ?ӂ?@45χG]fxWl~egzi!_U2pUlaP+!q+IsoJyC& [6%BaAfkdGd:T,e+IiXȲ/+g@!]Lf~7#ray ձ<b&f-_}}: 馋'ecu]UqƒШ+F2h(D5cAfd$z"l9m7rE֒ }gv R+fr/SOBɁw~K9ޟA'!?Pyֈge^N47wj+~KUBeJl3r1lr7.>*1–=XkD (WЫTѷ(mrX Q M!VA<^̿gaz~s;t&Oyr $8[c0H()<& ƟNV^ b;O0\`KR͚}ngx+ Z{h7hxvW nʜ3(Xі}*e,";yAП̑aݦF@khDL>G Mi|҆KW.*H2n2>u?{Fw!jX4 7sd|-a xIƿq+p9<ݝI>IMTvg!C,j5|>嵪JOoZN^-jӢ SK'l`Zz$dKo|+Tv&SC}*B>r~dԶ>XΖݶCaSΌW.zp2La\j C!5\+972c/|ʊ-+Kn|%;nTS K[nJ ޴Z88t2޼+(Ea*(x-5Хs# ȉ2_B+c‘ H ;IL?lO<<$9-(=|=.-t;ejכ%SKHۋLCQe٦P+ry*'-32 89lE| ne+޻ӬiKAv4Pӟ`CԨUSaink±XhQO )ŪbR ^; I*fCBLUtL $b-wM/g @U?ְMjۢ\p*HwEqB%^Xށri qRRFkMG=׼̻Bю@ cȃFnI(8;n/Mhj"ƯO%jm_⿤}L)dtގNzvYrOQnB1C;!1#9e_~A[u",/aE056>iKgBW6qa^79zk[/Dm-Kh}y^;]pkErO zJY緁frAS P͂T%;PbzQ"9.zuͲ=! 5_5oJ5V7I4%ݪ\EabUgCs:`3ݍF2JIK[LNšc'EOZxCZ9b9 QA. * O3n $FƬF߼%H6=WٝqVI06G f:|,OLb0 b9wēV>lKlХb<` KnzDxXh=A;)))VAYZ}r_lVa5赯49)uZf:I'u 棛gx؂Տa85gamj~A&0 up4܇ @TbWApGy@1pQOFo^vzvA)OZ`Hei`3Y}܂ {)u&E#YH1kg0v(0ˆܱ" # WӬ"0h/:itIwt{LJW Of]Yß ]8U!#$aM}85vI4|e}'*2\n6Zrw3`tgZ0D[WJ8mO.:zE@go;;Tni[v܌QWd}u79KX6Oܠ$ռ;vPR:u!*z6+cEyAƷŏJb*kncbXސhq(a#֘%WږM(NK漁<424DJmlF5h6`[j爗">@Ǻ2g=sP@Yl Fܘn Ru2M Cح#{{&ޖ|{YV+9GaVt!14jJ|he<눙w8y<תvh @6BF|g탸MZ,H֕(=5WB,nnpOOgstB@t yys`Vÿ!&^(rT 3[dOVߥ~83k~u8TA϶R%!, ŷ.\č`,6B( Hqi%-uWRE[Ԟ[榋k7s7XWBԽש9/Qo\P%{śl?{^nizsB׍.&Vv_0k.m?FQ k{!Z1(^ z=oYK1Ѧ&@7&o>8 eА `HX`-}{iǨN 'ȊAv! Gs;2n\'!g IHll% K&L0ܺ=_sĤG(|lZ`*rc:8"R6b&`*m˿&P]nm 6n[>f6|a']WyݼUbF3b*Hy|vP?'BT>E/_J_pf"R0Aob՞:1 Gjd-0|n6N}jgI78Ig:fW}!0T"D~De.ixJ09QOlJ^5)Z}neua'ׁϟےÞ&D/PƁ'iE}5$F=; 㵳HI(~=XOonK${;Av{Z.bu1ٽv#j[uwk=pG6ݎkFBXE3`Sâ os*m: U[̰B'aME S{Q2&Ҩ=o5af_Ifσ #CsW'GK\uuggFl>$ ‹| cp- -DxK"A.qfy{^y2fJ[1Y&ݠ B=k1Âם e[g#- "_D1JXZDpw8'ܩG-y| ;_k ƆQcG傎t|/qI |gi84wTc)"G2}nEMDzPuxۈ:.ՒU]üc"$Q9^8VV:8Ϋa77?7/[εleGm̳{F闤ȱVcE,ԵB3~B>xlu3(.pͿh$ĩ9 0-ܶ/!=@.4/++s psk*#ʜCQH}aX '6ҫU=rO>?vl^ ]Q5e-R*jK# @FsQ+?jPD8韾iZ밴sk$)$:*)7šXf+r6 ʦ0 <,QqdvY/Ac[g*kMC܈xL)p2sŤfTذ' y V()w`G*ËO_NWB&`:ƨ&Pj1\P<{Mu\ m. }:EU ɴ~0Ղ8㘨y.iK}Z82.N $a "c~O#&.{lo5,Md¬e5uP:K<A{Vumݔw gDl "^72`-~Y@/1 ^E,ͣism_r>^;p||􇕿 gL8s5b$yflΒOjӧZ>:R. X !ުfA5yV9j⭐h jb (3Vi4ҁ~ITp  ٛ 2>+{It#7BK2uU1]rַ]뚘v;6a_[ *8<c- *oR׭);FOj(3E]3WSK(gg!ópmi&~>/@cWDc-ۤQf%pɄdڦ:<] l(Pie|)G蕝)["₮ҷY'ߪ.;i6^ip2ġ<ԓgW Z6Zw)-<8H=Uw0RMJAJFS$QD! P!zFrq ƀt54UEꍔvg̓OmH֝0k~nMե;$2'иX7HS` ;< Ҋ ^!%Jn~PbyAWp >'IՇ(DxH$fۮ{^ hG1y>JxKuiDbI?a~W$@ۿФ2f-h 9[,<o9mnBbA!l쮑 f 7hm{0  . ET#'Э,.jNR_u&_[+g|A8UW@'ΕIb~߸5F@NOrj>$P\a鋎:Zq,.-G,A:ʧؒ`xƼ.+V%HfߢUUM @2и;IjHRI-7~ݏڒ=xmYV Iݝ]WR`'>Xp/S[I <0]tЧYavPyB-+>G\_\+P\pbA&VfGϗ_C TE\At Tr^[U%bB\c&Jр ĆN-ú5@tۼܜx:D/hR]"1 0p}7Є-S5{5"t)a@}v@0,RУH%Fa1Z,YT1+H{:w`$P%"Z}TsQ6Q?y 0! wq~5- t;dZM$C: g+b{L5VSv9x1Q81PۊZz&T.# ۙ%6 vmuLggg%+ #&nmyjpTw5!K=,P@9)z##UF:raDŎY1a()-SO !ލ u,q͒O{!F:tX+wr>ҒȊ7B1[gfOx`aEGHX{Ok#Jbk<2#T6q/dv[TVK J$a@%t1UU $Fߐ"D&?Qn ш`nXM3|`wX-Z#!(cR q=$ >CƚWePM/̙--X5\pP+?OO (a6)Hn\DqoxvD%Nfk߃7ŶX/7R:O@lPxqdED$^20ys=%\ff;je Ǖff_}A_ C"0f>3z-|WB*"d *URʚ"-Up 2QƛU3!X%/`>S$+m#TOsKza~hE]_w9OJ+C"%JxKfc[Ϛ\X1sp /K:KP`eFMd/g0cͣ3vb2$tvO7 xbz8 x>ְ*&y[}6_s e0PM& !qO=HQeCŊν/#vl1D#ru:Aʍ +Y8÷)\7^QDv?%Y3٠&v7>ţh^9Q{*ޕR,bDO k']2Sv>67vfnf>GrUt\BqEtt%r\1)RҦ(Y{MZ=>O>*b"̘PkDR%~Tƕh"7ʡ;ނbwp$KI&*8_ w%' :^OX8D :_OOFʲr]>08džnD#:i9rK,cP,?o6%;PD\M b\v^hn5y)FG/NYsnݰ=8:Tۻ#!t fWvcs\r7Bm03eKȃ%B(䳳6bRU[ 's\,\z\앢:ʇ\Xe8+)߲CŀԁQRt N;Y(Eka4AX,E}6He4q;{%,щ ᳑a bP\S!o |\jjYRNm}ob)A,RVU) Q6qj!wl)lZ`CƉ S)S7v# _b.z}#΄RѺEXi3eD-nɴjC-ݿ?HXoi{?Zf1]!߆5K*.4b$%:L~qEˠ;/$](19d3b-uZ{!Ok4G%6X9֤9__l/5yԏv@ x<[ ]?u;K \#qe p]6os0@k)(ci!E*'q g$J(b*? U7Lj\i~df4w᷹niŃ9MA)NfOp !csvrC,bQ$eX[?Pk,5kplmZSL+F+Y2,°~ 0r\fS(0@04(~7Q?Q; 0\-e_ms ~(E Γo-y: .|k"%]u:Q`^K!%sy*b~h{F_Jh R-:1i!zDVrI#h}8 L5zP1c><VsH\jALeU>衾ꈝE/~j4f$GbŞФ݆u8ml6zV#Xq <+81ڽJZs32ءy 1]F WqmO ~][ rGҍT 'qF!24NlF@<9g}XWbĈ@?&$`If '-TY/M9ljKjsG$STu9)8ϊ9Kn6L 2P:\v6Z*}U߾ atTf k}:M$APY덢H{nz0ɈÇ mXSͩ.X/QRv{UwͯaFn^JM_N`J>?tuB?~N vO.+x+KaƂ? j$(e-cLXM?ɦ(敚}>:Cy7z\WpO/6b׽G'la]mFMLGđO=wEd;୻QW6I]Kz[@l4sl1XCԭŔru-Lw>DŽPE?zoqk/ " C8|Y50G(@L@ .&4+ qN; >LZy+ 53[lZz1hm("MPir3p/(Hj"9q +zA%va 9VVj\l-jFe;i)bbڪUIⷵGس{4@tVki17S-\p~'g?7.hz$,/5Mоu&A(0fO&Ԣ?Vo7ƃk.E>(`:9U-DrXKz?@=mp0Jk-Lpo'%3,'ɕ$xL8!&ncu' 9ٳasEIeIeJPZDih[XwO 49%/FCQˆ#:xhy$u],@4i;$>R3XG>ZTTEڰF/{Udt.'pgYen?(wy׳}"ɭu9mG ȿ9릦+K@nK㖽ݨ9߇/gE'ڈXe^%}$7-"%x"Lh t1* WqgR%j)}|?ʼGm%E3RoykvZu> (H^gld{aF_1cb2rtdqLqy 10lhʟl3deYD$0fK] o5٬-_KME\{SEV[<9\_V)X;{|)d7ٽHY|^E_e9 怂C Ђ젻6 LXDMT#p|\Jq(f GHhy0R*gSޯˍh>4 ŏ{~{ړAC$Tkxڈ>f,}<wN {K[df~rm/3g BiQD׼K+A/+`d\o< r.-<mbAc$Yz9^Xś ByiN'}O(g!g#վZఆذ@Pȓ|3- E8WX[0߰aނt=;0 2Edj׶ M">5Sir-䑻\ELU+3ohnfph7c[b{Yv J$ď) 5~|}. Z 7UwSj'0鞍Յ̙j`SĜW¬c]:Odlgʽa_?i4chjg*K&،73uKo< {`G|y.GZ&З8'9h[/fݐ{;7aǹŲ߆ʼ/yp4zk ŚIdcsB b^ri=Y~W5&iyq%X7xtՑ=ߋqOu_l,"*6e/a d@{c=I kt{*L_ )[PB~K5 Pc |,?=e/MP[$p]k4I1mS=q矧؝/iol Dm@F.mF5-94N 8nDOʖbH4:<m7)oD?×RXΓ` zF*k@v :AuܩJߡV6Z;dh^1PUP{PB.ڐdtaS_gl(c'f]?y9EĖÕMo+J(F&\&јap0@?hsb"HW2 m KfUzBpx7LdU߭a46Qy%?.(-p_- ?QnΤǔ;m+hB:,ށ޺_QU<,5Q>i< l7Ip bw<ެn`X>\GG|9vv3T&O5+ĮeKLLIm_0'Kڞl#mOYAr 4X v,R$ɲhT|X&VR/U|Z!tqژkY㤕2y8B8tyq `]O,p vc6[fy}/[2}x ޤhzWn UIǙ&uڛ #2{NI- )@sq!xg`ff\yVš᪸N)ʄ7JSx&^ _P//8"-TiwsK^6Xpͨ 3["]`8G]:YyN[ m7UgxO+&FFI,P> 5Vˉ}'~a4Hʉ};m 4 `putL8zmNxTnJϵovUo0}eYU4~Nق<4%5[M"{~ oQ IRE CQ(_e_v5Ӹ =iTFkKIV? |ŦkwWctf|B>'QE^5Xzo hTd}y u}j2}gB=XdD>˾1bC m9貽%4 8ټߘ6:vUTu-n&lmkT|~؆/UNU,ʤL85gm}0t3L/T)KFD+N+1_HG2EZ`2IҼe{w\Sp21kX <\HWo=4#GsG$ -5yY~wO\^_[_[&qTu fe0Uvg7+"S&ZnYT9v+P0߻Q1LmP5!!`"{ A T)ĪgiT-F:®8rk8苤\؋g| [)SsrWiFHbO:(  =WAc`:DU[ZNsZ-UHC^\)~שD%|lF\>-t'EQ[DaC-+'R02X8k*CC&p%Xj*7k;caSzqX)35U53TKGGʊ Ӊri4C2t戝r>Q= 4XRe;)5V) SwLw5Z+iTU!Ȣ%<[L k U6kؑI5at0|-WCn74 n4ڎB*P/GN|1˞n s/"){*ɔg}.#6 V󁏽L~I 7?vưq\$R89xiW3!AgHIҽ5{ki=#RAh MdCF|aah,ZH_E!őM;f+BL6;-O6~."†>J&ZlQM +iXXiM;`p@2:'0$"1*kyvlWYUÔ.2BsfQn“</L2Vwץe/r`F6txNLO#/mϺbr|[(-K`y :ŇQ$xll8]L ]@rQrF9Ye;=&yh3rLg/(Ht\KQ|I:hX];F2Yɛ"{j I}HN2•<@y^}F4˾Ae?lU_~j`,y_"@_j2#Kx'[ٜM)ڑZ@-AyV6';KnbpxLɳaGJf'UܚA`)d|iͦ3Rh_ETO+q<\%K,Rxs:{>=k ENT>N{-đ`P{rt- O[GݏɛSpob0-n4KOq?pvc>|Y 5(G(N.:98@w>0]򫳌 LsO^C\{z44jSN^n ֲ~ILYĴqHv6[4ua =mGn ¶ψ)֤EѻSea'*Ҟ~V=RZOV9I F8^E84|n؀c({BGMb_(gŒUw6*nx*S\;eFw=HpM~h< UZo'J4WP [滲52&8È&?5ez$ӯUV%D'>3.F(rye\3@~! ua'@->&U\[i*^kMtQzb;Ds)䫓YZLш#>qg7ⅎʻo*{gYVp.KϢZM>SVK^rb+Ġ}H=V%b6Ҳ&EA9j[C,5ا㣓n'Klq `-^K{D^4_=`Qg4 f1(H>Y7UHPk\W;yGv mc>!OR⺡M uiM%2^0g_lIB_l!r8GȵU[Eďq!Jv̐{q%Cƒ(l_jiZMjv"yOYH[ qU[InP *r,T^cIb.8yV4\~+E|z`IEh @WpJxIc{qFPTOt<vO SW iPfQb=/WDӥ ־]⊝aӠڌr dm>h[F#3}{#ѻxmX 'ۨۋCa08 Jota}M?qe tk._7NÞdܙON<~dQM^NRМQa$'Kom/ۤB=Knؐ_7qR[1+ckרv,Ra#.t0/ ";;;PR(%\-=)![f`~%]ctdj>]ҷ \Y?UP.?6aTQ淌z݌3"0PRLD0,7-%/y+㪰5G%y9OKњPqlDΈ:ʭmKP|ᩱ8fگ<4g͇ -t 3J:5DԺ] ۶B86jM׎G3; $ c]ypk$Q/QKm͟~ yeUIP•<0?D@X5qî̂_v\y*oy1uOuB\&t edh+vS`aWb'0k1golRPBB}o4 kezh 2? }yu0TP.͔Ƞ}(Wj!hBYe{kEÈ n&Z?kI"\GRߥIufDX{HSȣ)ML)N[;k( 7Jޤ(L<>lc+jzat\lGUAAԠ(v Z8_W葂"ݎDqNޱzTf3F7JGwؚޫ"r`X8_LTn-XuʬlH1KcD`ߤOK-Zx'5^;.ykn-I@b-g_f>"?\}TY#q55ҌmWMܨ(YKl!Qߣ3|h˟M~}x:@AS8JeU+EKh?c";vBu3{mC?AGe$ ׊q0%,֓p.H <@ >F-wu3+u@RI7-sX;x*Y#ԖbbsXJ 1 OB A ?IDvxDl0IcEHH?=EkTu@vϟ&YNqu.d C>cQn3=eX},H{H0).[0M ϊ&On*zH nej_@IW}},T;y7'* )loCbV Z-xu$z^nxE$ߘm~Jn-zv^N˒_rpY-;6L9~.|~4P@]*© En,go=;\g)@,<`n/޳^$CD^-eF"8r0W ??UjN:5=+测>ܓvx)+1`#mb}87a>C 7fDKݎoJ%\:CP]$A,rt1EԼ%rG"5lPڣyVYx YT9j0^2Vx۟Wajz"VB*:j5 9\m.Lu^ }_ߜvHc"NuE.$S/\QVYiMzbMR2N&50 !PY k@6(F>tǣu~w)=) *CZw6ICUؠ{t"]4c96Ꟍ}x6LSAIvb.Κ muWH%lE~t~#Fy7.MT:}mĽsAZh̓?PY;IOVצޛp'XbGH&nl@T'D}cݜaDT|8b/[c&aϪ%YMӘ)) |YT?M_LoMuq?UE (L E+hw_iyanx8L,5xj]t\O© L1jM:tJf,AsYYC7[1fIiqa 5$<+ ķa-v_ɎwhA9W\{K&gL m>FVGc8YNd'K%K^$Rv@~${P/$ (MzĐs?dlr &m Ep ڹ(P'nP{9Z%؝/-\47X?&T_Ț yRΞO W$>LF `DS <)Q`Ƒ@kg?l58ί{PEL1LJ0h - $hhJf^PG^+Uؙw8fCdkAR:&"y?\'c;5~cbs|zܹBv GѫMV a f;qe=ԕaN-K|/<;u΁tNtc4$إа ,9yQ~sQ @Z ?r+ͩJ/ŗ(= 6ywLH; C7I$=CY$ >#! T|mqDe]ת/ nN2R&7yDsf Pܭi4q2}xnMXG刀4`3pV T-w ^Vkl|K8E}"_' /-R8>cWS1vnxmVDpJڙMT'&pGxE%GiD十pmmˈ}ODL i$WmԀ:1:}  F"y =U#MK@,HL釧AQ/rWZUoL-V Iw_kz@pjߍAF:÷Enl˞ɪ3H2E;Udob1?l?y96~6Etd)uԨo#oSz:/?{M{ xA~{`XeSw&dhXdj`f @) WJ&9~rLOR` B߭d"j"Ng?b"-Z:94E{M`A fB8} vkHɸC!MoTeNŒ׹MH2X)WEdD^xd _̠'FQ6%4̠KlnR,=J@zzUu%ǥbe Nё$_&'N,oܞ $坡l!4İ(Fqc=vZ,sJ`{ӥKa+Ʌ u^~fHEQ|Z5~ru'm^0Sica'\7̠7̦h ) y >֢),wuQ!1̭C'\NKEg0J֕6L!YmIS-z5k3>$#!3߮R4] Y ͙Z?[ٟ#{"G0Qhæ"^caI{yq*)K:'037o6 m@3xXz:k7/^6"~^{2Ndžk=W&T=أ㸮",N!)[Kmظ[Ӕ ѭ7ޢ 肸 e#H!yZ||,(PEyXQaSmJ=b8N)\}}\Ei9*%8[1xӊ)V\ !3gc /Gʣ+gцEumB Y]e.J_-S^j=mc?MT1ansh`Y _c4-s\gX:Q "VO;' ;,^\ňtq<7Qm²j09-HҍP&]LB]KYhXW|mF(UA}ےVb0z˟q8v&g)ML8B|$c ք]4G7d5+r_SS$Z<i>A=y"I.aYpY^ʉ{+1Ft\{H(doPu57iK!&=wu}b*I"Oڑ0:!<yl#'Q$42~H}BKw t^Tp z1QodzB$'U)6!|X b8mw?ǣm>q7kUIn~B!5Aocv lC:詚Ev|FO%Z> ޯ_I͂L5Znf 2kt6L!% {a}gzLc4=RZc;FhcvӦ.Gڙm|*q}6Ml. &>GFg1r5ta0 Qxmĩ[Z!Y\D>um۸QJO !># AY @.7=5%0tPٓSm~SA,w\^=rtox&*syid7'I##`1\UimXoe1Sy5ΠR~P^,}p%zzB7Y:|W.:0fs΁ \GFnxK5~JQuX޻ "G/nq0*>B!kN8;HLβ%u*"U]JTfKɢ͆IFh(k]հy6WO\P}|K)xM_4#Me*R/U߲8ן8l=TӘ>X _wdzz|9H H+w"P{Gz}/#`‹syt-i"؎JN;Ik\,%UƋlLgX1rbChAjKъf ]Yz('`ti:C(cqlxFYQG'{hɔb> .xQ$IYIp3n[1|av*3Kg|ǣ-5"CKst/dX g%<ah,İO$ߏ XQ.xH5if:4$'Z>7*1 iRP3)$Zf:'@֗ -R< \^M*`O0lql]L.fĄ шr1ԑ9' Ȅ䉞E髯Jg 䨲7j-˦N`~;9ɂ3/#!s$zrh5-qgε{R{R_Ş,k{iI@k ;k} SΨZ}6oS}BzlTWIar<ң,#bL&=nCInߗxt鍏Fu{b:g]>va(bj cssMY \o۾Q8֧9[r.7& $1q.(\r{Ygq#)*##F,R51KXd". " Xo&mU*B-?$X,F&/=Dc M xK:kaIC3IY<T%Vi>E٨<݁K;# 2t-"}FcA@8Zz1==LYqyEcRVaK.,9@B)0rH~&Pi+>-6&;e; U9*nVM֣ÿbWO/||>\PPQ6xwv2 'o5`A4Yxf7 KŻnfW4(O`%@e 8%ثsa!r5i|:iDT W9a C eꁿ xf\ NXv4u-w[\H"PWyq:s9@ j `qhЉocvyĴ LهD`fZWƚO!-g2X`-7i 򒞜Wќ9z:8}ݽ'iЉ 2D O21 OO`c=7{mezurj iIFI|O/@5koHa5ډ$я{TrW.>vdy}?+1yccAB1ޜ%^tXeeDWQu!}V͊1i(')&]*l5@tBiBkMEv8ru9fs eǒ-'pLVѸaQ$ù8(?ZWp[?8pI73L4Ozs}fmL'"~gJ=k?(u() JbMYBu`h:a[|>pEƋApNrhأo]sv@xB*1?<ּ(k8;ȹOK;+M F軀-ВNtm܋hOBn۲Sf,P*-ژ^p EF.O1:ip^RYZh4e$Zz:@U7I̥=bZqeDTA;3\zCCI(]zf GX5ڝq_}7e\Q5Zy>c,HLx_$MDih[89%B<:(rCXn:=9Ǣ*\q"c73z7XIHLS6Oר;̶4q:pOAN{O wceĉVk@ԽҙJf+=  Ͻ +FpAt!z֦ޓ%|RɈ`Gkk1R%iH1"ۤ~' 8| cEd\Zʗ냽j+R^)n|v`Vnj+u\HIxVOFjUBsa_?zsnzq |(䴖.~^t? .{<wō' h~־Vr{O/ѵe:݌ERAb]ӠuPj ªKwteYyjYHﷸp\_ؙe޶'+!ٮU4,V>vOoBfOIӞLj_SC5U=MklMA590{XTPcN:24J #ywR͍ 9+3pr=:>hluAef?%XxΎ)Gtc!'wi5/ ?(p^dЈO!>Mbv>,H}keUt(B ( =JэU;MW vlh\#aD~`9R]% ΅2F`/u k4w՛6pt46I~0KN_Hڭ] ОĊ܌?;q?E0_\j6)_z>} OY30ܛP5*5 8i ]d1`=`"zث7`CrۄgU\2IY^P`24$~zZvҮ dH0ra7Tϒ&SF!錚ԾzΦQN'LDb3&/w*u&oly>[9F&i] c >pR&dk?1V aXd5 K498FD`}bPf;1Io奆T D4 (,p97XW8y)B/V-]eOOt& oD^˩6)%,Ű'BA E;\L>JyvnѿH`ieAp0[b'&w{YĦDD`8j{m&ddXlnyq ֺnZoe]Е@"-Vנvr+ L%Amtuo5̩Q72u3of&5*ͷp劐9c'܅Z'/dݚr%]ȹ\ۺ1"^>9F}^q:K%+]Nix:@qW Z-vZbM^C9Q*dzR#R9GOiG/0#iS4KHYMGs䇏hAc6p`;5uNF6 7h},El5Q«Nzy)ݞVl #8Kރ;Nt~XScT)4GGʅpos],̓%~-gw']4<~ t[.$[} 'gI*&tBaHwxkb+ Q_~lqnXf!"}Y/~u*w'tojM|h" JWCC}>BNaNny9Qձ. o̿:rǖliBn Wc9$hdOY/rTGgӨ^Z |X+,{E'$;iN`Ax<~Ć}*dO'iBc$xPqJX3"Iv%=3$U ;^NyQEF3?IH<57^Z~2 sa/U~cLDاf>{pb\0}WbeSL@'dmF@Ӯع5Z!!p=]N7zR0To!F4 crB1 '@bݤR#Ƈ< Ԛ{t x_lW2,_e {)="Յunc1h|K,y@͆*@ a0mk4uc >lJ1+ 1]6fDu iHi !}vcS#|;9.pĐ8j+AĉɹDɧI-^Yblebpa_ [n2L5&7 +Յa .QvF k84F˂;R7%foZu<1bL0q,1UOѷ߽( 5eSyxlQ,8npW8n8>`F?}l| 웑kuҏ`n&iD>_Yg{a4g9E}#RKw|_rDB 0e([E/gHV0/J3%X {O)ɳ<htf <ۙO l?P&m)x dz;cQߟM`DǥT pxuT{ R{1LL(F}pΔ&nM8% X!E&7Hl&L< FknΨR&`ϡU\{V{+_X\L\> Ř% 1w+^׃]$syT w [@5F] ZFj>2#C/}^IcFY Kȧ4/Q͚!7!ia`!P ydLVg?D߉]CnVkf2~@! nVhEomNnüdJV!@wˉΟ6~* SBhBjf>-z($]MzA:%w=kkT\tc8Q^~="fHrßI9}`[B,G;ޥK{7}QG3 -^D -j>:8&\VO9#N%9~iYԔaX$8bj\L 3LH.0l' }̮ǹb)fhʉmso, J%\6''K…V+\[c-C5RdZuRZs{T3#BKgT]F! !FlrfR[H<Ѽ"[='|٠sNݓ[kulbBkg[PyD./OK|\;f!f B ?%>kuI&a=`yHZ{pIeR| ~z3aR09+b1KK=~ 9)T.f JdM>Pv}VsLl?ǶZ%iZA)#,+[O=(f=.iRQǨ\*sF̌MX]AT'#:i]f#ա{VAF0.w=J^v+wQ3 ”Dh$Nj/>"(3))M0B` JnR۪;D>܋qL-sJH5*m9W oLnd}lI\Ls.KҶyQc#yJǁ^)]HP yKqe-p+=z.T+r;?ʉ3c.'0x)Ў8(rh@CgMe|hzXCm9ݻi‘Hи >Hn!꣍bCfW[|os`|"NJÐ[bQB#MձF~J9 D 3[?#~frnrwW.mݧ~՟Rݏt4_{}㏄YYֽYիTk>("VP'j\m+U$zTxNgmdChӮ"=>cA/C =}&zʘܥBIK5=? #JtC}Y^Qr,|ƱXp d:7*ky삯ʎnS+# {ZS}hM,B-K1҂n>mh蘆emo+0g9mcDj?Hj#Hd3598HYQ,ok^eu2(^:<.ƎfIYa>_g6`Ӗ;EN`|iB .^)2+ $v-Ϣey5(拕ҟ#IQ#ʊex!$mRWŪJoSp{'ډ-)>wkZñ~l,k()DAfάy-{ %6aQ4 6rwB R,]qu{p "P1Ԡtb7]PoqHD0WB^e5V_:C"yTHV3NS TݍԶz;MA!H6'!Y7IiG8+)O^ص,?)W|o"w^(cώk`Uqihו[4>N[nH*d^2`?DIf%$w5lbN @1r7 z8X^z bՕDoI,od(;`viS>@gFAT <8v&`W6i:]għPr1ld4wR1WFMR~Ŝɝ]S67:5omZX('Hn./H:Kah㯛Ve\K41t-ILG8Aѓ~{BS1]J3=C`0XOxٜH!VѵovzFlz+U| ft)S{{H6[FOHNswf09\`i SHH3:qC(Bp,j4 ry-9')[%s`^YV)Z>&ྗ=lɏΕq%z#[+~/nXcF\#4lɝaO|x 0O>NjEM#px`F%ۣ ;H:*cSZ%<m- @C@Y)q#Cc}X0#"R 55tUtF#իlU:ɻNZ<ǚ캲'a8b-]7\hDOP–ėo~З#Bפ`=3fbDAk9S$R6 Ljԧ?ppdQ1 'c EhῺ8] ta!tjvI㒖 b@UdKwdEDG ?;3.C|1?H~Ӥ9&99 B4rNGfnm RA~e8pBHI8dgf.hn$9ɡf  ΐ2u%LH6Z+JE6. 1X#&+ A,LP4'_0o 8+,Q{@3oeQ>Ln'BS@.Rv⏺KjI']b&͟uKѓ$IʚsH3}< 0xT1R H>$llio#x~%t`eD p9Z8HKҍu$JHUV֭.0gyQof\a4:*+J:om54pLy* [V;a S: +![f`8aO`a3 GENF |-a}Dn.P՟ "Fح"e 9KLAzYS>d7ed\^$~7l-% ٪ua8 >u-LWgx+wD:} nr@ 93^n3Fo=-q0|PQ YJhArumE=ʕ_C$~BYc:"wpEjDNG1- C:PMpm.y(ͯAө$;0a :Zn"2KF9qܜc=4o6Y aǍ! E.,!x. }ٱ rb#@p$ǖr_*8\迱L YMݳ8X`pl[kxQ3l}>1yBHRDݚ=p|-Ќ%2KN Z Oa-8}% <>(0//|ٴڤ?p OJT՛ת!9W .#[hJޡqjuduz˰ʧxԧ)ʚ./69C4)1L 8_\h4DF'޲`jr7 r4Fh5 u9ؾ^[Uz-mgI 6w biZo'gߠKd]f$V,f'V!ykkrhQ|_qS3﬘bwsM#L/pjor(t' T|h48^ m3!՚R;D'O+O5B-ڔX/>"Jt%aE@a=$v" lOXXDtLj qIxFrHB _۔KNE۪`5l)퍝UW4xmax4GxwDo"8G[~irTN09ZHZ+}0Pd344Ͷ^o1;#1$Vmn %(~(UH)Z L|s^ bCx-.p&"ёoqv {lhyJyy$ rlNrsFTî| PefjIS =KQ14ީPʔȤ_HwiyoUXVÄd(6r?CY\7FHWnMHXY[>(qI-\*^nl#e%Tkc.x7 4as~MW onu 6mt#)_V%]qFGBԗDQ=tJ֟:X[qX;EMDz#^.K2/0STчDfMw(0Pq2[eِylh4yHc]E86˰lm7S mu=TVrSXٸG!Pwt-p׍,>ųu38@tI4Y!Q{Kp¹g.UVBK#l3BL9T}٧Dy1e GW-3m.8!Ǭ"TcQ*1T;TSV@wG+@ò="UPuӻgF=pYV=I(wnܳ}z+-=t)Ep1r}R&cߩ튵CcDc=M(E'82\+ەyԥy M]q=,P&Ye+C[O<|Pn1sű)Yy̲ܬnРgęT:#N# cprJV5DTvf&zTXT#"}0Vϵc3aDW7dIA/$}qB=|M>/f)^shQ`mZ6!U& aĪl.Tț K2:['*ݦ''C*74} -<. 8G}f5([ˌ9;ep@q5tvM`3 q赩-U٨z|z|tbe2XcS$_n-/\PeH&Ks21_@j) }5mv9䠷d3M2_g$,N=lm(nHef#qNi꒾aCgU%s嶰dM>N}cΗĠ&Xxq+hՋJ_"!r!,r_@'`E=2|'旔~޿;w'ӧ?>=`O&YMo앲4֟ &@IW"5]t^OI@6dZEl]"t Yr#=W[CC]>]jȀK {޸7|ScPӈIl-|WR@6)x VnܫD~KԃV< 0ţ¾ytn0nxVPBD?kɞbm?Nzg[%$0\Ә;B)W-9% +R9G:!mhDjݟMxtQqx(e&5S){VٸmSO Â7t^:!Z7W>BmyuDBJiwq9RG!Q3MKIdG"V f zV;kj/F>T:moNMd$ߔ$τ*0-`iv}WSΌp.mSUaڧBΨԤmF4NMҳ 3yɠ ,IZ :=-2?#6b[ΚT34s0Ub^:{/.:r+!pl([2paLk/)`>qى)z?0f/N$iŵ̸ s&arSq 1w^M&ǰV,0Y6gYWu5`jc t$'t[-5m];L=7/B`z*LgnVw ,/畨Jxj) ](LЏszm4e>[ܝM_v}"QevE?Zӳ>[W+Vt%ʝpN-9ioTFT|( M,N#+Xe)CkZ4FȒ Jhj:y}w<}Q{ W$լ<:_ʡ x3ԀE &6dc 2F-`OE%y\m+87Cvb)r)ICR<*ߥR68O1nu ("EqAP)2zAYT=A;V#߇.A7%APuSxb1z[{x1UM NnxQj⳹$/%`'LsRZD=<$}BƘ_G+zO5nGIQ(];)oNܐTx42;L`iuR0f20#c}EDЖqÒtfdO"".Sm{c`H I>ݥ~8] ?u>VHȈ^G,A>YvZaO {0G17>="2 |\'-b5$^4(8$2IapTMP^1Ji}!=K ]r| qn2~Z&3`-$On-5`R$[a*'#B`#V|-R=G `JpOUء.ִ .Vf@A=.NLaksh!|؏v榞׭ 'ʲH w>)P`du_qcy6H&1PIx?.zV[=Td.p ]KWQ 4i}TGrGO )c/Z\_h6޵Qs]-Q_30$Kuл6 "hpeȂ(;Ci-'We?6l.& `1x)gIi(mwp =y/ȁ GXNOHoEB RuU,$amܰȪzwztìgXyB$(󔀛CţGv83D 88lwjhf)=`Y8;-A3Bo*68:ObԆڭQs,z,5k#4)DS5I+sg=mEDBTR'EO 1Bꚣl6ƨ1v۔Ź% >^,d/&W+LbT(Tcg;;5P pg[l[Һׇ2<&<;+En $Jf+D k"*q]86dm3Ob|JȬ vQ .YhQVazD#J1 4A Z$d۷4$rݬ_s)WR 'T :nCzeQeъ\z'Uf<7[K &xn//XDZ8[ny˕@|*}Fui ג,t~ۅ:;m~ivVHs?E3I۞~DgX3"Y֗]bR>(/OHPBYIT-J͇` QLA ƃUտ z091b d-`|CYeI|+L?U^">dhW_$~smV&:teT/[ 9m1 5Rݢ {"-%VjbiP<74'tgi^BH/C=ڤMc?v*A.Y>+WC(yg'dQ#6rbVPt+M4޾S^+1>/cq|lׂ},9lv뭹'=7FR evr_8hJêi7v<1t[zщ&Ӝh#)c 9Sv&Hsg,/dNJ)Fc[]̭1(moX(㫸[OM r{tOnbv2n(=9~Ӗ{6 ŨkF^3k~|WGa$ ꚳZ/O&ʕ_!v\8DU[?]/EnBbbu `4浳_9mc%^zYR8L~Z%p-2w>:DWvA*<-8Lx[$L,X(2*TPlfBu|Y/?[YpԪ; "=wp93 ASХkˠuª!@lYq5S8P@4G%VRK1c-,vxD-tp 5?+7_q 嵄bX\{_ I<rzUo} pFj7vV x*BW[ D{s*\8+NYeՃL5seܶgz ښt4*sƿAc':fѮq U7y5ceBj"ϰo˵YZ2-렬V; My2uPMxYAԑYcKϴZwlfG=6ijC}`##xu>Bɀ'N,Rؖþ;V],+k?~WS_4Js"j7%Noz]qV0Zx~[o4@3]O! ȯ "al3ƨӎf+ft3[Mɱ֚d' _Cw`c_fiޒ7Qeh4jcw ?KxHo8 `E;!5kj, J+]/s9X2p/vAzw.~ɧ@>,h^kPN5%Q%4\Iκ K1}"mh4L6eO/xOdoki!GWٴUWp|^L%AS'- -!`^^+g!`)2S.HlP՞Pcn@vyd7%Nn9FÖLI*TW.&c!NƿBSS"+ۛm'j]-yÛ HStZ=!$uk2e ʓ}M`[pJЂ|:^d!MwN5HЫH>C*S<#[\~sb,))ߑ&:BW:jzҪ]B'Da6Yn‚PGt['Fqj}@J̌>)ZF_J9 WL֚@: W+lnDm`n>[P Z4㑁MQ_jN$ŅSskک9k-0g?"W2j^Ge!У!:G^o\#NImlB(R>hf0k>zМ ^ϋ5v籹 D1ݡssK jӋv;7Sn[ r`!EIXuxС +b9 ,)vI'6:ľ]BpMЁ ;xQ&61z|;âO' "#8 48X|օ \Z pA(˖0^\Ny(ߕߤ,gLf|JJ`,6; QY5YE JBg1 {Xf> 괴w $#GO`zFپdD Yu>Y\l|`WLcځEZN~]DnmI\/4a+zk(rpS~4ᥧs'ϱݣh-a}QӬtpuiLg-f%D[n1ϒ/՘S}mD Q[.8 -'$5%ǺT"#>v Zx :g{Xr@}ķx l^4_m|bK"T\_Eہ ȱH * i ^z:071,5rSRQM .S˹ou`Lzrx^ ^P1mQAle \$#J@QFhndHVE`Z0p_7toж=ؒtU/a2]M!AgW/>-_v^j:8l?LL?bv†5- !U!k]w )%%,"z ${:bWgxx8;I»f 3ۜBaynu:r5p dzCޏ y_uNyGٵĂR݄dTĆq~e2βϢ*5ס@mOҼ8$kN8\r;LiEH(/,z5N\R0V0W9{Ya'Kş=si\mVC+p "|f\f-z5G)ohzlarf6]Iʲ|_l‹ _6 *y[@ $:@+`9lAܬAZYν~dR#9B S .+k3nc:28KU};)$N`k5̏䎪ju'QIj@ ٮPp//euLgLbj|[%4tH'{.p)lxƊSjzgjͲ3[w@!wd"  od:4a]!Sீ gXD-h" JlOS)@5) [4ԉ$Uۋ=_n"kOӈq@_!BC:WuL|Jxǡ*?}?BZv!f㷯o3.{ *"J EN!pPvOylGZYM7- X,bO4ꌈ%,0hoUD_)aC&uȿl-6${PCA-HSyBkwޅ$, f:mF~k#VCUv ޗ9bXvwn8&W6Vt@- xa/!gj]TCT[i~y`ZKt;J%!`4}6vIAlQZtCؠ1 ,߆mnD<6wT2A6vdNnGf40'k~z$ysc"ۆ~XXɿ~B1*|ʶʾis@XQfV$ RͱhmZ'QeEσ$Yp؉&#=~1›A Io/%2 aA5N}WZ͎ >2<(d}WqcO4.8Hn=ҚPI ubmj^۫'- RWQ0ש(.AG=Gd'ed]0, Vjm 9, ?rUh&kJϨ;uKb[S$/NN,B@ޅqA'^'T볒[Z7 /Bmʕ J*Dn-{C r,tp%l]0++PyG 5ǯQS|Mn(]L&y5P[RY_ T-/I,=̼.0mm\x.:0Vr??*.~nqdJCR}_L#LQW)[Teo9(|~mLP2U*htq)%+wi}Bg7zi}j̠qR1bN8xLrWwv J ŢyWqbd;Pםo\ݱO BJI Tɜ )?2'w(Q+7yI/LIU]G?\93Y]vL؁GUS mOqł'+R 'aO!Ֆ투^ܫ濾w'wrK:,ayrjPJFlh6er]+"{r2x}F!7)q֬Mng8DC7 }2-@Z rq%: k:ZROu5\D]W%//FB=sv0X2ܰ+ʼn<` faq/ͺ'?CbPdjР952Lj=Es:O؍˜+"[ZC-?ªq&pn mMo)_̎)r nݿ< ^;IB఑n/-&K RV;_xyPy!SbZ:t*nD]O7.uQ ;&hy 4keA.nաخ/"DMMOf$F{;3yJD :}lB "K5=KC誴ś"=)1TH T^(DPhI}lbxp({,/1"Pr$Tm3cMpMo`r?&ô +ҐjT~@\;qڶ\]*HpVxUQ{0kHɳiz%]ѵ"L߾=">~ fiake/"AM3w qmoO0Pr9(LAN#YsBp%MS": (O I?(gOn0?E4G|è"ˆd.,)K0 iGrPK &DV{pQ#uI}V!fb2~uB4ĀEa[tDŽ2!;^T6M!s=iAF<' ~V2\U)FvCØvCt!I PfxIb zӅ9k݊!5Fo-^ID.DLmD!T!`SN w"s%!y5]D[UNfu1HQLreAB>/p]Z3{X18cU C_5ϬU^8935ɚbprD/2$6wIt h"{׽Ƀ)`s:60ԊM4t6'$~𔫍QKȒ_}$ V?^|)3~?Cx sA֮܁Cy;SG#uNA70iE|=}y4 ݆Va/ȌFeʉAN ]D䧰~z$?DǢeNat@6rX Ll"6$R;W%tE3;oރ:J-+M.MA_i!OhE= ZEEܻ3@QC"My$ӂzGZT:÷T&>Wf  uS|Ys)sG"(eqKg@z\} j!o|f]5P,z-|QBjWlϴAR9(&o Ό[)gzB$9~*Y؞N0Փf#WԻUF[e+4 =]kgQ .A-nީK}#߃vSٷ{l,޳@8 d[]/ɜŦI+(Y&Y9:$BPۆ)=+|҉2u(xan&7 g5#oP^DyP~wL_LqJY4›c,0ŨMvx,qЃOӒdcuHrc .R֯{۴792.Aأj~ eLNvى29L=; Mn,FhRMzn;>nz!C^ݏpjô`o8^NcQ24B}x潣-֛<:?>>-*e8,k _;@K v"|6:{Ӿ,[%=#g"OhzծKY* 7n{5Y_q1^O¸EF%Ty}FEGDIfc3MT-KdmM$&=a)lf;'a^f̣[Y(?2+|R-iL&)R-_n>^44# )m5/*1Hz#il"7˭m]ykYXԀƝr]X K&uyA/$le mMЪc.CNINCXc|<)JRs0b -#N4%id|}V(gr6"UIHr\NBĻʓ!/‰.bt#1{VS @k9=˄a-WB|X٤w+ssދzw}D+\7ΌHPRf9HJs"ߦi 6*%MG]œ -/؄s^R]del Ӑd8LrlQ8̍hWJ%yOhm`1;a=yYʇHL%% PrOptn{?03bR kV$Οu1,9xoVH碡ޥa.%{ڒha#? W+h兩Ś*4f+lMej۴zUDZlyfQwe?\+SP/#Go}rc6Q.,9˖T7Ņζr%o2:@ݙXH.}!"] C.IDv#Gt˙-H5e4BeoU,+5w^v0ވ h,`@{SGE4&Pm WB̓'e׌i Mͧ&w'L@=@2\ PHFi  $:dT@S<"# C9*ʚܖ"<^|`3I}ޤ`S%߶% 嫸.'5 (eī{D7e7^ :'E|K,V w#TӛAn&O%24@tYj9L8IF1 ::UjYN[Ć-srF=X}#Z}嶳x^%6u>6=(l؄;-ėI?\ctt&k\wPD3鵚% =sɝ莥MoqGMNUvTc>yVID5ۻ w"nzsxMXRG(=w1 ۬AWdP6c@ jw[,jz&{rhc=X9>pf^˪M*XE(n>ύ. m;J,4c&kvS^iJJ1#EVF F5ќPx! h3Cauâ6QB֪=^g%@O"4jh[\w)íb e^m͖6v KIlj6 'xU<_?5Z v|^1dj7$. kf.ٹm|q!j!ޟ+  vkM}sN6Ӻ'31ú20x0aဇ=s˂^솧\fpH] --OH`^:)}2Tλ¨sKoӤkvTAnW:r{*<u|:*m]1z t-B ?>f3 ۂm {' Ρ;W& a0jGRV^*ġxOtU9\ ]@xA6h sP7SA7qX 2|X09E/Yc[Yn输2#٣sDs6'Ή*U^Y;qP9}O6/gJVyg}=P eti^Ԁs̆c+4AZa_Y_J!ZG*'ae]ڬGAS}QwIG hRrI^%gJOvdpIR;~dk;Cw=-'hfb'zvڎ7Pm-RrϱA'ނ~(D )3jݍ`,\IN5r:0 st#Hd ~O6A&K$R!/6K6g_?()wİeyҙW ~-#{ Zi%']J]bW3> 3Ի`)zbfUʿZ7G/I,K =YHhfv9K ߾G9ْXihQe[-EQe} s?3W|!׎rA>{t2'VE9X`UF~w<|[]nu1ܟkyWϲ &5S.tPv4(Ax}#cVc~53-&w6ms{JL3b֮VT ʩ|z5c&[{6n!XFu͎40"`3y}ӉMcc*:~*&oR V@<"~5N˳8Cvoހ2'Wy$I M2tbAV:^mG<酯C^}{#l+1UUVdR;-X\M~IJ7|_`Z$`M_k(ȓh@F/ ڧVI0)fઇsi|ۏFI/`u4tA^*Tٙb0#_3R@ 2:i2oؑ׀gτV@$oPvL;ixKw K" hraK3C >.C2e^i'Z[!#q֝ vt_,FIOi_1GiD_Wʙò`dE’{{Ss6 | Fс~aɂ4{ɛ>oΎ^"A`FV\5beOLnoX S zJh\S9֌Ab5fCr)L 2X#3+ƺC4&X5Y9IU RmW'cR s6UήI/5svqg1\,XDǬd#&(# x<Ԗܕ]S?ݨWk]}3. ժ3[DAk fT:{Nٵ6(^.!DO*{ns9~6`y_iI瑐ܣ6~z>/$ȁʸ|{M3R`Z/w`uK4t14bHjfI\0v9C]PwŎ$NU|xx4kAp;4DԾRH"<RJ*K@*EQ%[gV YԅLT﷭ŝXF,4(&5Qa-P:+|7U)*֭XӬW2MQI$?f#Cy>K5*bPK^XiU)Y|R?N 5}~X*@"V>X5HZˍK_'I!c09GX oTeqY!i ÊJ3FOy8Ljp!xflj2ٿhYS8]i,H9'g6oww5%-^չ&VvހRTՈ\!ۚ.D {-`+, ͱ5I$cB6s0zw=HN+U|JjG]ΈhO*?jfk>! Hc2Xkډ( @3B.uҜgQQc Y;LPG(2j"xP_;.X7wF5BpT1F6POϚϼ||3|xzci#2ӼitA򲺘'0"ڋi1FAvpsoq Vp%OWPF]zWa`hk(8)o?d⸂ p[0){ X YiRIQAsO=Ok ITRYfyjR gihJP.)K ")oY5t-*Y`Sli7DzX컛f *f_Vn@r_qPvۓS* T1VjIjlGnC3etr:c t*'^]<;.5 N ˦U^B$cx:?ucݠ<2N{74Z(_~Xoi@'X~u]y'TldEd!Ƒ:y㠬D=+a5707͗5P 4R to{H'r*p׷݊KKFlLj}qq!O_`ystP el0HD9xFzƈ5Z*} x]wF“La3Qv  F2S=28# +MZ,A;v[mAL4'.WΪoryAunԞlٸ;liʅIo11k!ßqZu6B7f߅@:!D&nKH'jKK)]S"!6ZRYf0dbT# kmdIq*l7k"lESyM!sw2" D:">_}h<æ}8 T%MTV0gRK7rUϿ+W-+ڄހ?v^9T9W1LHtdMwܩ=$VV}EۨU{}ҸNLJݾ"ЩIp+IP a?}#<8k8o(ɩ*fPT a[JAtSX(*ixG5KQՙ3EWڟ+K0 5`s o8Űpz]m\Ht`S8ٜ04NDF7V{-7SFU|\&bu_?qzSuθ{^?#C .?󻼗C2A}rq#k#5͛)4>Z޹Ӎc8j⚰T-6Zɭ ?AԿӐ <߶YH$zWHMa/FS+u 4^ZY ` JH3b$p.3+KݵEGl %kRJ~ eM{[MM汽IU+0@S^8NJi?@lMebWrwyHZ)E뀸fރsĹ [}dM !?:5xaInVp!P2UG7 S=1d˃ݸ^1?,Y.7z`ڿzv*ҊRlfŤ4%<<܁qrH.]~F9ʶml$yغ !kV)"ݐc`&o@x !\U*ɏ-[b"pyn|0MziA&@raK6/ooX!сMm%\JQ(y&RPU`vpݺ!hKEq Թ(e ,  #K/؄6̔ɭ!ɀl`@dl~+tma֩dfjLڕhR|GxUur9CpԝG{/-͇fhF@CO10>sJRS3dd@oNl6ރ}[j$L+tǑaM/ӅI8:H -JybF+7B &@ 8Y?kγ$qz/s_K_9&ggWG1p"V $2\ _3l >XܕZDg*>bo(9c3;C>!#q;8*Co%7n=Z3JIb+$b \toTNN|̔A Xx)x-,%ijg(4KJ<6QYjBGapDD]CndΒXmEc%K2u쳇/4A8>\< Ƅo@B0;z%S%Lw};FuQF_wh[O96B.1)?#һԷD#-l%@Nf,.|'G-9F‰"@{?8:|C7~k$7'[ձ? f2'h)AU'yOՑw&O@T F̸~ifU2DoY1!`Ks{b3Ke+{wVxfLMDvF<<*9ߐITOz\6xτt ]dZ# ~b& ] Q‘Az&>b9Lz\€W"CpQY*q-ݑ$ ʂ<}NdU?j1$v$`i~C4[«|K=(>&bϬ>t|DL~,bZ`C{nj;Q(bmr4M2*~M.j%JbT'h5\\lV2uF.0ԙ4cUO;Dj޼XŃ8Vf~ \^\ó_ȑ&on}k%#qTI7е\SXyu%ME!XNMYX͐I yMiOYY*r^=Lboo Pͯq Ov!]ƎwyCNaP) \,3htrVznPZFO.&"| P\x|8[H>V8gI=P"ҷKF@:nG0ԫl'U b]N)}˩[_:6HDZWl')PTԛ;g9]%[|Ӄ9A0>kOON_]K.ɅkŮƔ>HOtm(7sS8U|ҙC;S*3 |6`Аp=jDt/+S3bFi녝0(@+Y-iW?Mxt*9@N~pQX1FI vkVɂcXERT&蟥a,񶘄T/(+BOcס׸B|~Mtζ,~UNW=*2-RrcJHU˶Bw_70fIZL>5Cu=1]^dRw5-<1ܹAH+p5aPy 8K5]l,@ۣ.))V`&K81*1^8YC,w;߽D]Z?$E_ٰbNVknҦu ) !mULq]rf.q]M\GL[lmL u`itMǩ^ ΗpeLgCgc6SߴO2o3Z\!#U^"[LMq!WJs!:5Akϓiچwb FU* `R5U ϽLVx2ΐwꞆckHvKΓ>gYzjwWHt *.e4ChyAW\znU*7lJ_3nTg<3-Ssz|$‹Rh9N;=s~vbY],ɮz`yi/9cj{P8-'tk$:,w ǤR?M, ބ!NLk!lll͓U(c^v9ڥuz ~taAQozkf9k[#s|9w7ISe ãOݕanΆ 1a-bQdXLy+a_sa5qɁT~j:5߰ ^nd6`#X/-[Pb39O{Oų^AX=ɡB>n`]$ ;" " pϐK1#I {Ԩ˱_F_]Sn!1*-c_FLiq5jQF3Olug u O]RK<:A3{$A]c"JH"p#$ZQW뒳v7Oe/7=U 6h1ד&`rGiOz3Nj7Y],eIޜ .GJچ(CRo95p2E~V..Ov`` b? 겒>ތ X6m:D /F_.̼H׊c,:fSwH;]_{dKQT3Jl@b\ٯ (}8ȸAiTiȜhnMoɿ˕b\J#Knq>37<\~&P!vW8N䵖ȅB}fD:n*seOjrU,8 |ӏn:G2iH^z ø}9rN䡕,[IBI)ݛk:6;zqwҝ{J:kLZ_ NJ?RgOJXֵ|,wna 'tRt#0 fvO Eb؎yF+- mbQ GkM׆H% - fڞ&T0[[ƔxJmrʤΛT5;s*R,3!BNJteIoS=-K +"?uFMqy/~;S sVX Qa]v4u]I%򾝨ꨁ-D mB)zRK阘^m-xʀљq21J[{W!^fgy kr Oal`yPRiJ o2t aeVHJwhpW=b.V| !fC6K Y4DaQr7&UN!g־*Kg/YF6?C穰WånJ"TعЊA`r {'Lo"8"߂zW?zɕ Xĕ~T=W1WJ8~ルͦ,oW/UҌdno &t $oj|SLEr̮KP_̋겶 ֵY Vviگ,p\EuHUz-qnM5kJ=ZZP0ƤԎz0egÓt- %PcXWhR5Y׳mƏ~=$W2\R}MW0ؗ]FS̓<&\(Xٍ6Av}*mJA5FM@lY;q ΂FsͫP{/6툾]w6"$˰džzY]/p*v%'X~Ns7XQuٝz \b :70*!nXc--Z>VCzQdIf%'q:+SVaBGX};H )ća@/|o0aqwJcawE>>]5ʴv YD/dVN=|qdDB6¥<Қ@Z[e7Á]5Ol7{>L uIPwji(1KN׷p0n Ӟ^J"9&. #Z%* uWY *`7Q8Tg<ǪkO=,y=RS/<<-+rc(k2=TJolWZLKΐ;7NЯJ. ۟GDQ;gz"[ؕP_1r|[_ShӮҿ)YRlc{M|,wpHU^, T{T"7\ , jwu5.s1\MbVE7:̝=n1',#HF5.%c&Ѱ ugHҶiGO\Ǣn-MnAK[[#yӄaLyIN`ĻDEf> {Wy;1R.k$ >s/u%U1~H NRaݐ"8v$| ^ʐĴk0Ye_9: n^[1u#QX'KLC?4R cmRaD/+J3t?bvu/5nS{"&A"JZ=1ТiEʕx1dߑѸגqAlYQmN{2b佰╇OIs˻3Uv(R ôsDp| !Y[>hO."f`$|/ގ{+7"|w˶`U+N-74VYهTdwKlw{B}uS Ք5H %j 8r7ǙwP>.+dP|R?Yb'8I(AFAlI!DMARu jSc|K` e8Q;6s%icc_}Pܭަ&vf!0M^YeH.t&y+᫘YUHztEfyÇ`C\<\ Cs}fK&BN_ǧ= =m>a Gg:jŹJ? ?F0Y [W\_=ʩӀ:Wke@sOGɠu=慮 AÉDxi2H0~fA!OQBxF@QACyϛ:$> -9tLhNDD'_@׬\AѨ_F e-fk&*q #?9@ xiZX@A}܁$9+ p܅@ 3o*y,0[EGC)=yd#ǀ-SϢ{y%6@q!dQs2F[u=B&\?`U@9YڢM4ڌ7IAcj5Mrgkm搲@}7th0pCP[p7q1giؽ>,M|ƬgM7ѫ3.$Ȓ^kDUijE/d 0TSk'LY͉]X E]$ဋ`{Vl=Pݯt}0m|vtYL+pB]Hlb%@LD7#1 Qݐ!MWנO̡C|'˪G=a6"枅/¢,{c<ϗ*/h5f˥iN o̍BlMzLL%>mhW tֆn`8h~Z#; -m^fAcɮC_~ZP;<a,~u,NFjvk^EYsDJ YN4`y#9oOMtEUohuYCh ۴K{;xxhKz[$ocTRލ(c7F,;z8g,XV*N]{fuzMcxqq)ȱ/fcU"xxshP($3ٺ]AmN|E A_\o_CF).ޝlJo8iRȅSzO[k M"~O7-E8 j mfCn%ӌ@Ńcur?i U/^׆~NauUnƊ~Q2"Y*4p:<'h͆h 92`/ݞӖbÃk{jf &@2UTOJ-NnhepS]j񦩇~[rHQkJ5R U=%e۽ P꯷TZBHhmT6LBhG*3_wp6]̀Ua_vCJޙ ,H;Ar`*~HmBө0 jE_$3x^=|#EUT jљgL+H}*WyCZL?,,U.V-=4O# |Vw-](D(_}L䖋qrjA:R&ymI_ȓoQK?GsשNyMbS)ZҨM) sN1M0Sʲ? uN.&ϒn7d 4f ,ɀ*k0 +{cσwNGZ:Z(b0NmR }®gz%Z\9 h]t?mXI& 0 g~x(or~n]vl!xDj/5mnXnQZ<]\4X)<6iܡS0Ȓ !a;g,.}Cn$Y5~`>hUW4X0RqI1K;ۭ |{ti&0 g3*{IUɜ<~1gM!uA][UPKw3W U%ȉ] 2ѡەy7G\$< <_lxso'_!]So Do :wd] $fw엪~J;Y0[Ī* <܋\#Ơ ~WS4NO`(hs*p[OgȖ`\$zU װ>q7w- N#S\ӛ+X)(0sw,.7-9tcB.? U:JcXnGT͚QKԗ3l2]U!Qdy׊tm̙zEzW´}!""rAsEJE2ۄi$ m.#P=6L br.ךP TdIpr)hOLQa-ݥR6젔Mɣ~פ̺龝R1i)G}E H!p-Xty/jLck_1#W>/FV+Xx9ٯ5Těh.wZ$Gٔx>ZB{4$5$ZjqsKuhHԄakķt }D`֓%vʅ> FLB1ODI0mD"-Zc'ޗ~}j#RlTP/yoћfˣnS- Ģ|{VEs +ijfbUH2%b>TR\[7. 8I-U3 ̔NIxVQ>Pb6FIkihL xMT04R OaL-F^ת(O[gZ)ՠ\ e y-v,p]-Iq hZ% e$# =?L ;H?hy1lGFC`o-{EiW{n؈g֜ e<œ3!y< М,!lH vOdI%5Mڦ5A$^lLڡ =⧨=?n^V}8TBӼX)]PJ"_YC?yF5:3*u,MZ6 p }@/4Δg2l1ƞDIdU1.GL`COk]B۟STkg]ћO ;bce'kbO#F4DIhHA4m^pVpC[TAKHΗ$mv Jw0 2:T][B ^j7|NMN'v0hL=j gL>KzU>چ!Sa!Q8N~KoJ $K}[.'3W;w|< H0LU&<5[0!R}sxk6l-eDX,7˝*c)xg>g^'{آ Qq༞(G}ٞmf:\d0&m$iѫ x$a1"۹U4ǹ-FoI5(6Ct.rM؍m(Օ}>֡<4Ӈ6Mm՘] J ?]88g{?󸻐GڋТӏ^j;|} .g~V+Dw֌Or`/цijtgkFy i{:Rj'7MbR ѿ+5!yvŒA~<vM !v$ЅoxE\9J}\! F VjCnbBEne76&ӱ|W5UsV;. "ײ=>Xx^_Uc8MSb.z襨EElf'_;_.9FdsTͩU`Bս_fg7(wNLf M-YWL+"wnvάI!B(A+deCSs nO">\8aJ>g3r:̻&!&l˘}Mȱ߁vUyr]jx-}&\JGeLj 7U[ i%Is1f$ٚ4J$BaySA?9b?vd8O}=),8e}EHI(3 UߝNK Y&iM5 1phC܉GKٯJӐ&49!b[ k%[|EJsO: WibI ݒ %xL%4ؔgT,~/ᙨRZI !@vNZ`YO*7\]R@r:q֬ -/ /pG) BF|P˻S~L^7YHR&)b{-Zދx |3iq~FP+8p#cc 3E2w@JþD(GD[՘!қsg@Fk.=p2̑\a(,#F:.AM ]}Er6J`PZg]lѻ< .?~JڗJjheN[o 7PmV'j1{;!G,̢vtxrߙgXOE6B( *: 诣 8Y8}d`9O@Bz7q1vCjXQ0:9#!z:QӋ>.W+MF>_([~|0W;L: ȟnJ4De|H>[?R sG)Yr cD#kFy&"|yskYÍ6w4_:X}32>nLD;R΃5O& f61reSp2X|1U-)>|̳mh1Sֶ׍Cj 륰{G-D"X9PD=*k7)-ydl~WUKxo^`72C"CNax6b9!2;$<F˛b2%} G n͛Wܺ1Qj=:=, <np;NܷI}}W _}?W[ͭ&M3_S A$F1]zT v*Kϒ$NS'R8}J!6eg8 w]_8"22\ClJFH|> Ĝ77w r_Te;PA!iЈJD6}?DS36Yewd)+2 _sB_7M:ݙ  XiI3 d#6I+8F/rXv3oC. %uMY)ZZO ~-;!Qiw_UT/}]yf~2]sns7VEiKC@("N/F5(z!gah;]M8>{Gf: SF0Йϫ9Y/Dž%o{Xu *LLGGj{NzCfк]lq5͋5{ID `,z&[[h+rQc~78;;HS w0GU u\Q?yπz2/fϽ$6L wh-c#$y3RY/`&Ō³;JT+\hsCEDa! Q(61u i'6HZgYxV̸Ę26ricj.5sW  ]P4>xu.N0X!YNsU(4vGrzKi :+ll( ȴώ:ÐҏZwwpt2 >1bYTA ֻY%0*tHl YR= <+}e}{S/+HuGZ^[s/Wt1$o*UŅP3bw2@-jFmZ{~T,(?=+3-7{fR_ŝu2:4Ll`i[ap" Q;wjM YAK@BzN=oxz$7j g]r\ :DaŤm:0%!9펔jvnw _ VS;0QUW6_ݯQ=`/T7+1`#Q>pC ɖujVtW?¨~q70fш։7t{U^1ά*о l:`$,c 9|MIsau_ q~_S]LV#ʱqZeȄt?dC'ĵ!N'ccbMTti'|=!pm*K[&#+dq"ڙ&!ح")1h`vJ +MxСR)nG]}׷Or`v7 p2O,`@'^tbqZBrY. 9nGk1Q!P~᮰X~Q8 h`f&-ϩs2m-h͎fWYy1~ߥ vZ9h01?zSICdUV4"S[zҁspX B5j DL/(ҰR:zYTo'1$pf(r;ROB⟂n(@|gπB7BƮd>, D4~8+C9ཛWz;mXhusU2@[h%mHnRk0}F ;'DPpGu[c~xb68M5ሙk0nq,([s ':ۭ_6-ѤGs ĦޮTȇPV,wG!ie4iHd/<Ӽ' ygل;3kw!u6%u͵ʦzaFe #4:Sd:@ZEwg&~6̕3U+uVL.)8P!tΑ άqӅעR~-mMc*`IvSrvD?_)ks&7xﱨLd[G\#kcDJ] oAOG"dMA>WV_nfW9KQ2+pl3p~*+Ftߐ,+mą6WO$26MγWD܈葜NT)Xu/eE ׳jv>ذ3 hk8"AxAI>fRJT5l-T륩4(µyy FawST@;qE$Cq 1QCNq\Jd؈8d nF樮8O ,Εg栃ޠK'8;Pdnё`tPjcwץnL Q:Ir%j0NtPN?+/8ev+e0VfO0*^v2#Vj0|#rfObe]p *.C)9j=ʎsylu1DIީ/P؀<њq}p%DFG1=g}bV2n "E7U51 TK ] v4ŝa*ZH`Y8 c10zT dF /6)WWLSS)ZU +ᬛkRO>Ԓb{fQE<=mI5í> ƨ{@MI9x6tlhBy~65lePk!a)gC-+./(oeK1}[^;ڀ;F`~1( JAh0v?:gi`EƩoS g1-LwFGN X'*kZl +|$8K*;o+O8c\NE~{ %ex~Q&G>ٗazɣrZ/`)=PyQd3<&O0dMHa x Q5a彪,v>._- .\ 5~ڴgN;̥-+ZsќIN[:r )*{!ĢaQwul (>ʾH̭HHw+}ښ3%vj ?Ckqm_N+o]n TotEհ&)WUى$fKy+uM!:TmDCeWkoj?# ۯm|PGzTגnz`%NH9)t<MXN7n"ηv8$tl@:Ҽi cP5|&>Bw`?0)ֶYז]sG1loKݲƎB]n#<z}EI }z38t%M VaI5" IƝ/Ąʡq#G}h/۞i:ʂ;p {@tlY: ї2_ݍ'DLxKoyG {{eG~ڇ}@m'l H1A#뷀i$od;Iޏ ܄/|vx,OS,m(#un$;s@*uj[`(UDd }ʢ^jA(vyWׇ_>PXi4Oɏ7':9_/2,= J?c3?}}؟l_ś`aB*x΄(2NS#J +QEQP5Cb2Aaz觲q7;?-yaPҨJX-헢4A) =l|1LDAhY ǡYx3ilKPDBH9/ifd$hR˔:s@d(zM>;0@eF鲽!a?З$s.K8{3߂{q[Yև8@Rݝ:Hӄ!iPRaA my#Q"xo] ul.G =^'D]4yTyVВ7;{޳*{&W B5w89F"7O=kHR\,Nh37N+KvsZʠ 5N>B-tVATg}!T ";'$~Sp5/U_uOz~O)/z49yޥ+VRGmW&T6=eZh8E! \:RKgM] c+5^G/ėƄF?E*LS]_̰Y{x!dl"!P1 ӯ /uzLPK^Bxyylϡ3H%!t iQx=ٹ *ntLqWCj}œ_nSC0;#!\>7fG6 | I+%PD"%w_l0t%ZKF*=oT.تs"&ӖW5P=_ cxjIʭ^=t0P]&``WGט~idI1=@m& 3qT// ?:!.wVW n?Z W<0OSTz'mtwֹhHz(0 OeVj Q,ꁰfmSUTjĚhy8eXqQ˴ɃcIR,: ga54_:{\jtd{ɦL!n<@޲b 47!'0P1Sw|uFo5|I 󆑕 jxzAn&VxVQ{SI >Չ m4o9yzYH<; K*K1L.jH\]}F_."ǜ `_"hE}2F JSVY ~6H kZI(Q3ea0tcu]A.rhi8Z'L,<ӁxS O$P]#n,sOAuQ!w Uizn_~+E> (]yc͔PpW[T[g>JlB1S`16s a@Jo`?bj,(L"x0CmeoDO'i¶!UD"2qpCI ncmkv M$|MY-vy8_*;a|NcEeYv9"7IEb= [a2gY[Ԏ3F|GT[to_łlgtӑF؎kXO"W2Rj,%-q`L3g- )6iw~MkdeٲvM7Q,y 0+g$?}(ht`)olJa0}vp l G7=/0m@F b;7 ᾨ ?ٽFcb{Kw8p[SǙ GBA@}LPYaNߌqb$jcl"WK~FE!"HI蝛 IpUiWAg> op M.a ʿt>rׯr:h1O0sYVƌAʚwRCӬAg{s{%ZbO{Bp@~+ }9OØ' ñ=cK}#"eN^|αXn,98 \lYFb-uRDl}cJR.)IJ=qQ㫳1.#j_l~_m.Z@%^g/e@)w⢤HG44 l0tm^P Vgq;kYܨBݚ g8ljfNXWȻbл2$`ӓX*IN6xeA=8N^=‡Y mi~{8ԑLZYLӻN+ xZ(m:llf$VIiAMBS=|W=8;*> VE+%j\N#3U4px|EwYW-aoL공:Fu1.&Ttk_/N&4㢫As7r&/J{0A@fjJЉFuəAELv v9WPtE peӢ2{GYV)23vpEthlBL$^?^&n ^߱ lz",I]|5Vn@iXH"cm8֍\$g4XtÒǝB4?\j!$7h\v[D6 Yn|xG8boPJ,úӊI>kX6M|iE1,ya?<9M͓ؗל~OΊK!zHGOэz冩eb;uЩ"i5N(ݒH%ygmpqÄС}9< a/Xls0z!3q^ ]ڬȚ[~V$Z?IrC;ǸnWV`#A7Yx#x68sFjgo}!6N`y>.K?ڗI?\qJ L>ڽΠ`4r"M'TOȺ k*00r!~3(Lf\BRA)S$ de2z 11G'W^tAa~tD}gg}_Xx禹/2Gi+,)-?z2ȼu'b%WBbHE I ᛼J?~ yD4[aR`:1Msh u=%z[Xs3X}zU] kPa^vl#~a=r$Vȴ7DžG72SX%۸`wV@ o;DahQ1ra=.Ïn4pO(CC,^Lgb+'C|$x%}4l74?RK'"雖+HJ+ 7&vp.9Ͻ3JdSB=+. d,ȇx۰| SȬ v kNV[& E{)&9K'|K)`J<愈}Tud? s5W)(1K~W{xZHx#MLq6p0@layph)=ϷbܲMmU~X6afոUGpץ/a:uLI0;kPoP] 7(1 _s; %n '^"̑o5=AO.>I˹7j{PςW5NybN&\<{5$[D|}ǸO"ԄX[ 6T[5v [x:r~M.e˂U_XTc ~qG(9:q(. ?Y BM~KRû$jVfYϊ;S_| |3İ.\5. 1JJ Z3{oa`+ żeL=^mQy6UV/>|~k]SY:6mZ ʒF Vk-7 (]5LxjH ~M@[sb,%3Z3e5- .FsIpX`uRԕ<ǃ@T(T0a B?A[BނK3>.ew*u3P6crcZaKgg9|^W B.˝]{EQ[(~QZ7Kny1m3]ۊQ(Ļ5H,=逼L~ANg>B=D*iܬ$ND0 .PDViU(4E9eEjqC&K3/';;X>ެ6-:>}2ܫFQ&JHŽ*,#lvt@Ighi/ ޴*WaTᬟx%x*:IkvJ|PIX\Ƙo٥6\ڂA6hjG9 kD]n¦ gq up=U =-3sNLFsԐF09RLB_4l}\Q<RU-i\uN'Ϸ'W*39.uZ ONgkuq!*]VoJ\o'}%`pwszbKOMըr0ũ#褱Q`rC?YOt \Y@팴!FaSR| /Jvj5<*=OYn.> }5*Š;YQBK9YPWmҝ`u8R^{|"y/vu-xxL mN)h,<EhpaȝGӸf̗ 3<44 B_d"kgwU0DvY{䗐dhh70Vl 8R&7zg ͅeob /nbȱ?ΥZPtk-V!xN[fƔOV ~^4tirhUo?rxqip4Oj+;ƷH͌OZ%;EPYF/~D͡ 6-22 tpsa^=|qn POPrjeXӸK=-$`{IC^iĤ˿%$'A#oW0/O+b7@낅{.C|ߗ "P!<,5wSpkJ5 Э䃷0\pW "9խ57~R}7 Cˢrf*(Nz8jjBמ0@+rR#ʂz_BbavVu,6%GO.w;l`HgqAfd>'Qf~hEy~[,ޫvO[5tZ:d/^$p#z^}M&ajeՃ3.4- )# Q!bz iv$ d1 ==>0Ύ%U?wB\Mܶ[OH߽܊- Y~`;MGEPhHZTȥ`.+"~rpĬBΫ4(k{Q[v/:5'Ɋ4dYnrZ3;v@`! [>i JZ,ǙRCGMi<,_}Όȃ+6.,=QڤXOR?(ZܬR*s 5;ѯWc4hVQNEu^%,<??;[g!|Qgo`z\푠P[1I56FX]}D|Ɯ- ?#L:|xpOy- ¦;,ȇy#H(.=IxX{ ".Q,YnPK'xIdz*_[h^\4sIQ Tf=XkhǖMڝ(ϻ6l=-#tV:Oaj΀&Kk P?>Zfe @]N!L]fj('&dx"BoCxoq 1U46Ŗ۽Mr"d=id2)ܞ;iOA_a7P8G`,!&oF`Ángo0.FJĦ +t/{G|WsE6QQWzC:j^s3nKj+_?@aת; ο\ҢCjƚ*16"z7ѹb D?{ݫΦխ FHoPaAn:ޠşc[l(MZVZ* :k%K(K!?\9鿰%8 *g6,{aX`aflL'frZ1nQt|ay=.yGP/X[{1<\_zpd/dC~Aϗxw=FehI&%fKB21g %6nG<:<0Hg̍E ,l;Qw0T;pI–46n{"D5ar3c_/ /lzk1rӣݎ8Q;ŵm]S)!wDΞw(~7ҫjpY?Ϸ*5BnX#&ANq5ضc)d{&Eau]ձ0"YFu ޛI=ҐBS}h&̮ǰٌ ].wSkH'cl.ђ26)EaA,5d9︼)~|͝Vkxlf'xXp=It2+m;*2Ae#.#X0PA c5[,;Uu>u =C>e9߲h\d! moRF?DVcS=,4:ݪS 4;RΔ QOׁG'5nr~NN٦B+O-VUyg@:[b+Zޥ梱txg.&*iKD$ok|Xx<RQ5_C9̞T}28Bts>E:ĊqAqyVmsTk?@h.G ϸMYMC^%B?DOB^@%|pA{4b0]Sc.O8~j`b'vRST%^@'IUs, Lsjj&VTi}]>g ~_[AUH|wE&^22[j;:H/&.PxVdD~}dtcW%'M9SF}z Vq GY+Ó .mLz-I+bY$Z4gTK1ΜgmT{y[%c9y=U^iĿ>Uo+w#7IÙ&/fk@Q&MmWslem(v<_L9.{ t7<)8Al&A{}|#ȗa|yR1 kp);Q=\7ʭx+r_%q'c|_ԇBnK:f(;>! AaUk%&(\ӆV,?1큭`8_r,[4B5~86)~q?rО<@isG07 B}Bж1gT{?ߤ{x:b^Rۮ w>Z6?siD w艀{۾sל8^B?$XFu"{v\ Hk\VΟ\3%[[ǼŽ-X#)ea@ǀUVQQg4}R=L <^PCEB(zwp0'P4 Ga>;3Q~߄R If@0Yʣy6G|T7rd}(As BX~-jNV6_:88 __WSZw/HU/5Qy!&w[DSXI,}Gqf |UtztKBeT !\EڿԪ=ƦCPl{2V:0'tU-*%0FցGw\_gqfbbjzߔ*gj=E6#L̷iZ|+B mam#ʤnebH# ;f1,w}"z ^fI}ܚl$,ءi>/EXD7"hE=sJ'T*;\lVUetu%3!{) P} ib%̍Ga>呭c%uhqIZw3{ze܈tx-LClҷO17U]:#m$f|z"L_z>:mLL^"@ 컆 (h tBDꌠs2?Mr-tIE{LJ~O _ꓽ:="kF TÙiTe_<*/&1H;i,Ҙg/=Ƀϒd™e@>AA}hhi,fq&te)vj9'CgKĎraK)޺᠅(Vfmdʢ9Q-δR1g*1mTxiD^BL~6dO[q7AGw .!EhI2 b&B蚧U o*ty]r*WxPY_"ǽBo ItKhmC-P;u *.)\k,;X~XVlH=p 8.&pF"$̨2*MFBxSD~P^\9TY_S 4@P@#Pͭd-4Ri;u!F9_w=BN{An#ۏmw8i^(4fph&%kW4mc6[XJH$} # MAG pXK^DKbMmUI89>rW/OBk4ݫo*p[ X;n[VKR,^M}3 LO1Xnus)$TV%D6ځ'6v=$qÒ^,FX^$=|xHd!FxܦYuHA5֓]:*S*j1oXESI0[!u<YF :m4Y79: ^3 ?ߢ'blP5NZoڏC,PtZ+v(lv2!o[3™3lG*u&|2(8^Y9hTf2g8.jl*nG k @jOCKʝ(*kL+{ щ[|膼" E(z3B+'Yp,w #W-Ӕ@Vp6WG;}i@%M޼J9#] ٪M#T x.Z  7S G^ n.Q,HR)LPy. ݓgtҔ^6,I?Qkv1|, ^|ԟj>;[e7AEn@mE'`N)|FJ &kg;XkyN/g8ZSxx䎊4׋gf<$, СsŁ|. ya}ݪ_>OXAo,o۬{Kh)qru/a#Нzw92 v6SuiQW$<̋][EG\Rd:?}lf_q{ ?B(3z5 GĶߖV4S^K>qƦS{iu۸թNP2[u 34zDuM/-!r:閗%}`!/_ﳞWVtFXR;a3qPGTP2@H#BT,V88V=,Fgоoeo8!p?8  @+Yhԙ- gۗ<'p@QU±F4c5Br J<&蛔)#>?^]< ;|:`"yg@ wc%Ex uq>5򤺨$eϴjƺrꇋnt\Śű,9@sODQ!vvJX0LFNA% ̈́֩sۂn,*LԮ\F,a"0}߮W'OFNc? %fORoԂ+G؟D$_gqJ dW^ͅ5yVb=,P*HJV뷞xFSԁWHJG[)S 8<\ HnY)c .Mz%{m2I.sc=sߵB~>XzMz.ikb*W5㯜[iXF#5M/V{1̾k+gn^sv y :(*/JlU]MyS9 (bG%yUrrD)@nAGCw=dF qU8UM F42^P&S-,蝙܀XʵT|9 5{cAUKG~g#9o265" NfO S[JRCb3XXYj^aNZ{8{8j0RInd]\nU;`5uoaj +{O܉v McڰɬvA5؜yjU|G%cn:\aUr#LX@ZsGZ/NKɒp<4w+21f̓2DX&w}^g2>hkxENa&˃OIE5Aq !!{"!}V cludd7eT}H!` U$W8Q"̺xb7;WyU;d6oW~C2C(ڭ|>6A @`#~Ƴt_T19FYq0>luIʚn%hzi '|fھfr~BHkk=s+"N%9RGTT}S'AېwN wv͸14 OlZ(8G 6gZ09:55( HާڌqF;}Hm!nrA(RuA'?NM}=mIEb9 cbWHF>|gŚ%,/RF.rIɔ"tPve]*sc~)R%f$弢TOpV_|]kDŽu3 ^s'ɖWoO\Jzp5íYW榻 WeBϨT]=Q _)w0oLi<1-2_5U"Tog1M?ۯt.JR䃀P!YsG[ǥKmb$Yn +W+BnZ6W42sDetL(õ>oCߋMKṠp3@%bdG4{EgM˴eӾLljhe9O>xz{Dlw1DAdW\@Z/wˠ}Dݟ g%s캐+q%5'j7 9W.&k/ [Ow"3~dTKTI '-C_/ʓ4n/j8m^'&"O5F5|&S6rvZ v l*_d##r܅OMi*W5z+(^;͍a4ii2 wz+<Y۬ګR8ʯ{[{*3?khy׆>&MQ \. V]}* EZJS~o ]ihh1;įcp :yĖg^%M:0-vοkW(4\Vt-jXcI{Ś;q]P|#O)¶ bʲteB9+Ɣ|)6L5*,%.W$Bm0oA؇o`,F# 9zVy+y= a(qImmí12G|+Q{s{GMG3:>`WmDK:: 2vq D3~yr{G_}\^0\0bW+;wݟ/ˏW̓FRJvŃI(vn4: vò^rۿ)*4ɶٴm9NaN\-" 1ks"% I.,H'9W $uKa<($${51 6cC]_A7F5 ?<"ڠc=Iyf~wݤbɱ~&5b~p#[׭yfË=crNH)?nΞx qvX<7^mizz. CN)UI<Y\ $F`s[Oyw4_SNJex RL*^Y%~PrS^ɵkܖнk3"\UvQERA&Jx6Y՞ςEd5Meǘ,`(~}}}P#Ўџl1Tb: ݦ?1kjyjNIOO DZ0(M@Z! vn=LVZ_I:M*eQOqں0TPr՜M}ga(ĬB,:`);6'hAL:Y GK],>K(8!!HG =0>ܰ2qJ3G;:I,l ˓_|ݻ?C{3|47GW u7 k[?4kp(P9ZUGn_;fPF |M&z`(}^8YG1BE^,^w)TFhRPRGV$=7"$]/iwv0 0(f#a +&ӭ1ꎄ=!`$e5RS_;y=fP _Tk5eԆrC+`V|[ GֺBh$W ^=AYgif0 {ҬeVݷBwrg ?J|eѷGNnV,fG:"3#}*$q^TPNic@lz,  XDLv%\K=JeF]v(=xX'[,V $I y)KyܜlW0/ y4I(g1Oy}``, yqV4xǨŴT7^uAJ81c)-;M&@RF#d}5}.zb3 ;®S].9]N˕,,>^VtT1GB}UqRv%:lܯ/&q۪)v=twf+< }U^ُK&ܜf>u3V\ɚK;fٔK,qm4`pyd1wI t_7hZjnSIa#DrO*_ΊQj8Q #8- ~a̤iX=6m e{Zki:g"j5ǂSXSKdCfHh&Cޤ, . ׊c5[>B}Tw{ώ"ֵ|Wk_oKq{֫ꈷʬNwTV!P_|̜b='wg:|$״oz"4PlNj΂`-[,BŜs 򰀡2Rvoc숸/PbAK a 3Dk̾e}˨;)*bog:kdŢX+'y>Rw%vQC$۴0mIw`-]+~eo{s8AR͏$c8bFN.}<ZQezn Z sPWE>:C V%0+֪1*ߥ-^5spZ!"_ x.K `ky/lO KNNOD5- gf@Wreˣ":=ߌ5n_fka@?4RdjwHw:2 ܯ MqIy%f<و(Wx"R"x[IMV!kYWIPj2$> CL="ѨYVɔ =be#oC4"K?ĽI$^E1؆Ϭ:Vʯqo"xbq wWoбb %`3UoYx9_O]>ZL)%F88W %_T:f7f׷z_iUfX (.V-H9[xKGǹT1 # *W]S/r{~4VXI {s+h~0yX&~>, *4{).(:Ld%VK̒&c}1=N*?EoVuբ *넞F{\? ֚JSIGI}s{A&Y:yV j |P܋u d1hbMr|P2Of{Ik?J_G $j@ۆij/2I_V$̙óS)UYL{|x⩄)HSSXނeb-+9ط /3Uۭ?*F-؅=\MIVfTh3Kc܋iB_`=C0rHT8uySQmH0MH\噯hU9Z\$d"w+w}k U7 egn}LV\}.3 9p>WNU``Iq3۶,vZ"E_4,28@ɤušjD =NS~!ѥ_M jy$ r!<K |mXQ+HbJUzuHe[ًㅏ< d$m)[#&eEKTNDj1pHJrHRd~3/{HƖi7A ~cB=7hm!5 KUYUf  Sei!F6şR %rbI#~$̾Hed9W@HQ>mWw^1ړxGh8Wàq%> Ub f+99> h o!%+zQaXo4Bq‹ߗr l*voT?̇H#x342ns3oѶ gjvj#(7sr;_m=U2y&R J2<#F"] 5Zr$Gd#,ӱСǀj]*#>o"SǖA*S]6 M#~ѠAg\kxY7A0oy3? $x 9("ƎY38BOx=G!Lx^x؀8- vMnACw~ Q s Jg*HNR+}Zjillӵn2$X\5eA-h O',~X I 8L DIS>18n.Hq,t,0QE3zqe4E-HWc*;C\ jw^Q]}9*|3RA'b,"|VӎQs%m4լBF2БOQ8bԽ:G ~ZXDBEzFN9Rw,,%|?mnNn;QSSPjR2LyޠrW7s:9˴veo].>DWafKJ,sL+KQ!,j5:d[~Y\<;(|/}>^lOSv1,əSb{ DZty€S#_{d S:92K#.B:BceߴN(ᥢ:T96HN Qy|:Ì@s>xC{06*v_ V.< FZ`rb6 _˫.n|zD.,)3Ģ\||^xqxE1PSoN=^T/SS/MjG6֘A 7PǍ'h.jj{ooئHQڊo4D@_g!:pÜ0Ou.$ZL$7-VWJIޝ$9Ey*} aa-=}``A?0CSzq}Ǿ_+Ru2&`aB18ܣ_ hjoͧlFt&#,^оy6+N?*j_'֫A{ʵQXHQMfo D0&v[X 3CVhHbP[ЉUk*j6>ܼ#F\:Mk 3:IgEƠWmlcZ5 zٔh83԰b9%,?c9r~3Z8N!N"DݭN)ވd># rqSϦ#\`O(ũ47& mC2loJCUߎ'੣ (Psރ驞2hGR7QR5Sb m#Me1elKu{N+W7"n(%>8m,5eXX;>R ix-f&54?=Ԙ4am|]fۼ!k؂nJiY'*:N dM]LhPq 74`1ٲrгå`m*N⵼ Q%W+YkAEv5Ps3t#Ц7Kcp_{rRZWig!Jʘj{õu˒l߭jKχDTذJ)9Uaz\Lv"<6&$MWLB8mh|>aT#jx˳Ėas<Ut2❙l}F_ǯC$[1< YnWM\jkJ+~'ODogȼGP"wUhY=#W 㘨/eԨh*lCV`,FK:Lϩ;!vﲚ܄AnjOImI,4[Fcs·o9SXblhBse YWtl7H$K4<>?"Ї{BhY+Cz yM|q;R0lg@J2dfmD#yXژ+rE _@J85e"x݉(bCNNЊa=id^ys~ CY8̌Cֿ2BX5U; +_ˣ#Y"b}$=gS"iP|bu:$vi'ϟOr, ޲3Wjet %i*zߡn9 R%Kb÷EDsNrzc5U(g "].hWYS C\k6Tivs2+cuj4WdPonZ!>PjR7T`Ϡ|*O&&`u͔WߨL>_q|UudG=$(+L ZpѨ+ˬˡ)cxF2=Ɠ3풳2tofׂ.6h?TIFr ̘@}E~af˯Jȑz?tE~jD_:ymf΁>dnpVyb `tMP8>_/XzjC3hfj\*oʩajk?;Tn"[iNj9gV6 2sP+~f`gS𝱖QهfZ_D bM&n &YIqϷȭdmNWT =Y/g @IsiT˧; W$, p¬ƓU4u61Kbtu-;‹q a 2Y6|-9>2xĢ!i@t܊F ׻+-?J>8BC+{PzGpp(9OUںgck/,sN7e 8K}jD4pgy{֛OBYjmIfo20^"pk tF=K.pδR)KX{$8#5Zi=Uܔ`ov} rLؼ%Rq (K˸v, ˤi1Ƥe̳ϐGtrS4|Dl4GjRt 3h[>bG;cBʖXc0ܤ%R'sb-݇*?ԓ~݄=lk5N/= ٫ \oX!%B@͝5R 4{ڮrR%jC?cx6FnSs'rBO}9D-@*dY>%2c( G>PKVA 3|--ZF& :\KGvԍE6EOh@I/3*BVlz2rf*#](u/du `H,D_=g u2O]4&8-? ӑyC+]?Zqs Rb%>3٨޵I|6׌nڄRh/ 3I5_}zu̜ !a8+#N@:; HW9ƽ6 ,&(U?j DuD1zJJTH)udKdao..ֺSu\ԭȹk_iLz( ,=ؕ.,:4;eبYH#QtF=}guH='z=/C 'ӁوIzfR{1FUv Wmp;ƽ!:=޺eDJA:H $d@IwpzaaȇbYrB--?OЭ_-3:ʑVcN=PYʴI t֦ALdLTB=NW^1*V`Vn#Mƕ{gcVId|uR:IdХf =F\F7OT 2 YhT8St_-v03Yt!V(D0~|Dq1¢e6Ќ@Gbm04>*@Λh>۠.4JM5&h*1~8|L$>}@@0CT490{jw/^c['#|7*^|VȐX8d=&4+d0)/=Eľ r=KHn[. _7q PXQ,z|Q$>)!eOrk ͹Er#g{;={1BXe Jߢ󓧨!:a~ɗ^u-,Beca9l"!HIE[T3/se|޶RJ^de2`*gW_-9icjZs <(hYvC*Re@_`c^5:i 1V@Y]|bd8GǐpVG#A|5OݾSFuخ<]>=:Tm%ʼ#=,c $ع(/8UVw'ӋU*M8pۋGUҰ7+l˔cNOz( A9n0lhc^j;U;?S<[ݳ gSd>ǴykN5/Wݥ-ˡG{򧁬e/.]B`G:>^ʷ/™o)9Eg,ukB x۫R(1wck$.";`1(@]GЋŃg$_pl1&ӵDu 3+i 21aV,6ۧA8 $%vGeIdMb} r"%!Ӯ:P 8UA_JjԿS 4cg=laj>7ٽr G}Kj[[ނ@, C #o5љoS+~-G!u`7ǔKm'OvO,.[H] TeMI}1咔](u`+-If̓i+o?\bu#-=T`4N  GJMTmptΛ`EA5&C ic˂(i·1' 9 sjkV !d:4Yг~:%U&D@>a 5hr"EyojlΨ1a\1>8a!y蒺RMüi]C60X&4nL2yawx`q$T.8, k+5I!`0ۓcxXCA_N?ԞQ|PI^wU_lw(,>S,µUs&4@Z!b¥;1\OhN(( /BNZ N;Q [-iqKlVV}S+LKD622JpR m=O;~OnF!_؎E) Kx+(OY d.Q)2+FlaoR3]ޑ#I0~Uؐx?9(*Zxlu#UH#֭OlQvƱT_1|4bUt)zP+6w2~/|D-GjYrNd:;ax]l@D\zct_.ٜ63B (ix sfZ~q,,ڠs F7z}~?!G_e|X r?CG0ϗ\[3j۰Qc8ɜŪeҺF{鳋:<[x}d_2m8T3hÁr(wZvIpOrhL;t̫SvLgl6@*iܲA^Rq8M0Oo,qM kMss Ts&#Qs)cqΠckφFdrxxJ@'JYv-j2u4S*»&iSYJAE}!IExLu6[Nl &gvc6Ern֦x9>0ߋq>=l|V8LQ¦@K@.CPocH_Qh7F'R|ÔR:}_ %BlP[{f.!pxo+??5`؏ DFHĖ]N|XNW]F)ۄ6=&o+, JT$S)n Tρ\xo#PGXk9si\' T3(ܛ!aY ߭Z4.xriқÁ!anrzsډ&1cPM9^N%B$wP4P1h6`L?־S5Wbl SFgPlEjW;h7cKV|s?EDs2Y]FgV##pǨzc \ N]8~~ώF `;(c+)2XݙqA+s_Վ|ʀp Ȓ/X#&h(3 9`+c- }I±Ɩ+sHDUDi5HV`1dیƉF>R&S>LJ T:?wi׉׻ܻL^mh@W\6żM/I0Yљ~D1H-3wHkL(Nc坱o= \{~/iÉlJ/b-esJvL^82/oY P$Cc}6anB}K BjCс5=z~^}3{5%PodTTk99 $G Hx0y4O!)Ttf6xjV[a)u<&4}Q3 [vXBv;`PVA! zc 4'%̽Bk Hs%ǁ9z &$J(ˠ C+uroKv% ',5iw=FkA֣=FhhPq,OƢF>:%$T:M#>*uc,;YZ%Ol5\jc]eoֺQaoN u=s졳MdՃ'H@hy'tW~.mÊy止 8]%Ɋ[2pM< eq5WMjtk^?5g$0vorޏ4 o8 `S:Zβ18Z9Ơ$gb ܺ8D;l}*ڇ9R7eaPqYX^㭀Yє^$I;uGoflYBemkYʹv-kl;rLARw&䮳.oW+0J:i]0>crar DikS S?EFr챠0^ȗ2I2:M}aKx}E\UY.l]WA-/J(|~*iFsJ[\D b4ґd_)}64>UuC1SJP!z,?kւ¶F&I5HG f%&t3r1 9N\@֌ CLM z'?74 < NA=P;mr !a"iI0HgCIք/ˆwdj̺ëIIa N_ A%2! n٨B QQF˼dTV-o"CwfIgO TRs⻈\$.`}hGdwIR;m(7ϓ> (5uUnWaF+Hճr\mF}Ŀ RNO(\.kĆNKW)O({'Z9gU6ҷ-7eRګњ!ŗ&l[&SM~ŷx,&iq#aub%(T Jwĵϑܶ n=UocjM6Ԓ:D䘇.C{A)&<z~F.!٦W:uxdA0T~&  >?FJ'YmJՓ TNVAB>WNSS1VAQz݁ߋ 5J5d:N]_nnc|;<آRvxQb>`/p zy2CE^(<]BϷbHA_CB7$9󯩂O 1孹A=?lϡij9H5*'/HYE[#\ ҂";-p2~>C/q+ǽwگj oR|C  q;-Iy¼ހOnc Hw\C-K6D1VX傆i h'YsCho׬ έu2Z1:zW@D[p#Jwb:߀iN VQЌ'OE'ռ㍯p[ȟVvQƲӞ?x5t'6{)dp}7f#`(UڂJdvTT|Z:@[B,! :_;rHnY/ՒrK SF-SI$ishgBd*\_O@77/WMnVuKu!@Ja jy9pQ񺞹}''dn HBHO!!y>` Q$.³A^CK6Ht*wG}*flȊۓr+۽Rf~혝WR655TyLqDW`=b&²r?vkS*W6q81. 2%_y<,E+VP:'18ЙXD]ƒS6<嚬cgOM9fa(/bѶ.#+'*1 SQ%[Y]X4i=mϦ#2Wo8corvrjMZ4l#rP By}xGĿ[wǟ>gu^{+JVݬٔ .] .ѻp;; >T(JEo!vK;?`%l gw Ce,0:W)`V -&zyG+45rG5J <:~MȘDY2羅P̿ϯӲE].0HC,-h~%!1;84()욝D(%Q)9/1$$Rks\m"7)PTL_P5k&MK]YR@ >=o)$p`\ Eg[`wB=XHJ(k-4E|j~d^u3 0gt@.\+ :fֻpEi7ԍ8iʤcdĘE.$Ҕ3K$%3y *t66Y0`; ?M@eStrC[?PiMgm AWAj^J2p z mիK7~MBVqhlgt%ZD?t T/ wo?u}c|*6:-yRuN4Wţ)ܓ 0R9ŋ&|֫ҥW̝ @$x+"kxB'O1p P2g PآmU75Ҝ=_B_ݗ@hRW?ݖw|qhHA[fZlP8K^+@T @ڭRZuR'$-Ԟ; 7TbrRdCwu_w9)Gu1zidevXߠY&̋'؈^}" 6W 38S* A[p]~$⿞/*fύtDS.TS% YTSFS uo~n;N7NHJ/<6TVmJ śzZt oleHK0Z2L1p|gc sַ]ka7SI+d> pP>NfGǵN_Pߧ6XHg4J\vLuG.˟@—XآNSH6:Cn/01p1ObW4acPiqk<3971wbF0sѤ}mo,:22N.mUW=l0shYHR)" ػߛN*t 5L!(M1ޮz nӸL,O0D;.ªYt "5N )b YU;kpe=!0HS6?b;Tdu>8_?=ѹK*.;`Zb se%%Jgr>w3mNNmO UB[ڃ0 M0\ *`!зȘ8uc<.x`l}~xkE0cqKIYɂ cSL4VȧD~\>#x`9Q4'۲gG8}2/Ȃ*A;SČu6Tgӌ!E#;3Jh!ǘ+TĦLP:zI[_&g՘/q?};yZRxpW=yRijػzHD4pf?} FXݿZutu%JaFf'L BK q¾._-5]^g "⺅&h!u"m2.SepߟCKd%eiC˕~%*ItZS7k?e8.;<ʚC ?r >oAcbڈ$jK׹0Ϟha| PNC%ݩ=5WZ}r$ `\ " >:YzPh]ы>4Ƶk_z)J)c"bYHi[]Vr `29Co$鏰r12`CUvLU dԼ7)۸ӝY(uvcDHYۣdZݰ_ݏ1sF0]}[4w`ED>)S\3ի`if41CԦXcVBLs9Sb!ɖ8Y #˲m鰽,|ݑmey{)}Ԭ0 YB#BxC QO&Lz_œf!nְ0fSnTqQFFvȨ?HiVa4MhZPGhM؉yAU.ƍ02$ @iLǣVt'9 MA-Y }7 7߷]Ǯux5 4Vk-CgNCL,V-Ew/w(猊T'K>>11KIcG_Bz<ɮ`s|w1儳e^کi{e=&,@0bn׫q.K*ϯ`.k0>ȕCgP'sp͐ E}~Kfj<^'!ub\*e >#*~1t'9~[s@A]G9w+Si/k7ۆ)c OY9vI@AmQ"U7,WC@J (e+iN:([Ɲ;ٓx!6Ҕx)T0LMFHiJY!9;;,[~=oحPt姏;T&r((b'NeB6 4RQ7NQٱOO,<ԩh]-L #y';GIzƎdSw~e%O:ϝ]C[1 qc zoWwmթ!NdNGtgsٲJkH.d+w[]Z 0]{(X0ڠ 8׀,qNHqE2?kݦqnRli_1{xGԫ:/:)*noF5Z8 88}{P,-.YJԵ|R M"ke!6OWyJD.M++^lJ %+{RzZ,M6EVnm-wuSKtI&ng,,i_Xy.PMWҭ%!6:9 Bsسj6-@7DR ^:+yk%YKJqP|R"sWiގKt$f?3orb3QQ!@P5>ǣ1:n`(A`On5E` S Z\# V%|Bw@D(hAU%M;@zdM_^Bʁ&r]yȂ%+cJy%ɠSJ~e%:h8XAC'Xf3E!:WZԗu&<:jC]nMI\<;mkSۮaZtYdpq1>~zӿa-ˆB7D3E59)'B0- J$4R0!aXȼyzm|cG6]g^0 om, 9F HDxc3R\eg/j‚|Y*iIib{Bw>]ڲ&>ŧ݈F Uߊ]|q+hd$ť=Y0?ZxUM0Yg;, B1~`88SQ05g2>H=xTčÀB}tp(‘džzRqr"gTM3)5jbf[wy'bJ*f8"5U TLHvw`DZpgfycsA7٩ k_j#!!NUQ>ѫržg^ݛ"o hƪ&po pz*`*Z.{+K-߬=p]B@\ә8MϏBt;#n,XE֩L:5ܔa(2kY//~E ;fBo+ ȇ 4WRt!, ;yoRf||Vkk0L;-^Ñz%)g}Yj>PLt18ۘYap|mzB:M*|s Tj̇=P6CwP鯎ho*̵mL~HU(t;dm:%"f"P„Sp9n)\/f4OR첨O0̇EOXg)=S%1$!U|s/i=ĽTyIpex0:b(qedo z0VPF݃o*N@Zϴ&D6n]9,Zυ -=M@Z(Ch[xgDre2'z/'n-bUғXn>"~CkoEp5) R4RL}tvtBԦS*.<8masSfT lK&E1W9e2aS ,Mo;$O|eWgrw:N{3"L-'Gow{d`Bm n |g$;HԸ ElhʭAVk I>j4+G $ćW?)_/Hir2pZ(YDm2f7RékWk8f*ÍX}jG=se\q''MCZgٴWoܗӎ6 H đxloP|2ɽ?9wQ1g|=5# uixlqt/kH缿ӲKZQ0Yg'p)\')sE /`^LfZ+v*!FA^q$MH@Pl^4ɤX "5}DM\2bg䣛?pIt16oe;2PF׉Jk*zEe&GhٖfZ? 㦕eKp Z`b˪ ߘff$4nw}F[@ ]Fү'lѓ#FYT`5yte'͏{&ԾMmޝÝ!ǟR g X7gO.$/9ۙjn~w 4X`Y/mɄ<(/Sz/QZ-m.ϮSV/,Gxh\lU ; ݶg ax^Kڿ-YT.13|inGUG~1!UFg(E17 ِUI @n ±~$js\_~X}v5+[ku/+9֕iI-PZhQ#о DڙY:Pey̍GrPo\!4haioQ.7hdE !i-lQ^$ʳa4{"["M_%LKr*bzygeua Wz|R@#3N :yТh]4%Tj%Y|"1w8[ЛO= (2!V{0A~}ᔳI /Bk?_R endstream endobj 588 0 obj 143671 endobj 589 0 obj <> endobj 590 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 591 0 obj <> endobj 592 0 obj <> endobj 593 0 obj <> stream x]Mj0 >`'`(3Ȣ?4[("-ta'$/%acѓjpަCN& nN- i|Ͻ9 Gz|N.n 'Jh <3,Թuzȟcus4ЈQJCsi{7|8ztpl]srg OCܨ-o endstream endobj 594 0 obj <> endobj 595 0 obj <> stream x|x$-;cv2m۶mgm۶m7==OU{ލU$r4FƢ6N4 skgG[k}[)cSg_Dw 9;;uR2s8,F&NV#==8:pLl m m̍m z@ @JAEE_ acGsSc+[K$flc7i"鄨񿲥gg99q? Ells'Voutk'-ml]m$MB rin  b)P8__v'H.=ӆ(#جQ 3K{2CՐ7?Ǽ^ՆnOR9ï$6PW Q3P*[<etSX'٘S'j.1dhJ""r3:.+ )vD#0v;|S{dPusϪ%C؋W#w9=Qm* 3.;"E"2`ܰENk+du1CI#G ܑ+D>U^HCzaNg]AWCω==0oxOy D/>ia_g mk1qݵeh O'!\۪ ro.q4 o4o+vSIsB*4ZtK('m菂;+=;AX}ZƒY't\n֍SY858nr* -̝SX}iFRDUxyzCG yLǸOux` 2 Q[{,w뜋'CϯQ=n: T+='$\H[ Yܺ|i 6W+%˥Bʉg{AAȗeRW1TA]9JVA3Ht&RByw!Ø@߸ ? >|8bku[PF)!dב2TE*}VN8:-uI TxD }퀟<"bwVV ȋf)FJ&ژye0En wLEh1ߨ* ѰS{N ɫR8lb:ƜrpR_U2*.|Yumm6z!vu {'4 h,?S;;^}pN$)ATbyDiٺRL7{u\3Й: *=@w7[Ҋ48|$*YOS8_ 8^<]1e@i3z (v%ؑ&BQ[3o,O#\}"đ^b,h#;f*0na(Yb+hqUJթB80X ݟ% cwZ\Zc%W\.y ؄NoS  `̀ݙgԊPj~|K+4V@R[4m 79\|J&ݘ6񼝯{je 4B}T>w*?Wl(80ǚ-Zw Kqq'O#SZ >ΪMw刲o%&LF:pn'1~aW 9Dhsa2.Sx|I?"NJ9mƗ8" ʅU\ 6OѨyF;HK+=fHx\J@^*"~*8[3һMTk6fFWa]P/9nI+@5 M~h39lb|`{ɻ $5yU藯`wކDekhXjNCzI:*甎&z@R$ ?oI>v">J9$>J@0:TnbQjs*ͫ({t@!$k+^& J)Yf~&F.+eJ\1A.*[ 2z|\:ץj>(R/9xXmí'$# q}SV;bd1nC[7 A!%t]/i ipP^$p֥~ GE"M;53b=>yC-i\,/y.Re/Jhh&x/N|#M>.Ǜ4+rDW:9v~ hTM/š)0{9g=,AȷWjLd6mw tۖ} kezHabmK0z ґ4#,Ĥє «{f '% r#V\, >) eAy9~QnqiE6NaJA'~} qȢ'K!<6Pml?70hȝio 7P 7t8ണ9|8L!P6XQu07R)bW)MkWdҔG,ODi'-};`&iհc7'6ɫ&"@)9:x jNBa=j\F6[Kfp>Ͼ6Pa> b067qs_<;)T-weݢ\~T!ɕK ^&u*fY.@d xmX)S{TmiaQ`@*ǐէKj_1@DsC,Eq'i}ɒga"ܩ_ !4I1Ժڴ))dG2s/^mCWھ莐_9db:))ӝ-\__Ղ M~LGq];} JEE,bWq q1{X;`6̃EǰU 9.YC֖ A.P;6×Ĕ^ b?!9-u+Q27)9*Y1M@y0un5Bդg3\s뇜ɣb=muQ}$kn (?8٦"ąF %RbAJP?)O*2ɶu#YAgDN~?GVz v. xtUWY2,<+sz3]"!^e.'+( Ĩf\2@e`I{lyiYaЌ70,Q-n.MFQ1)Izĸ5F"%{Qhn鯔h+.)oew6XEk}ms#5PvF  TK{s l2yh243yyv2VvX>/)YwE,wRy7!sm9ꡤ)u~_s!A>h U j@AJ!11)դ?k;71u6~bNtNYy=鳿tP9\ M'%5a[V]][`{)Z;༰~?mktۄva!2i 8+ꝭ"H;% q"kE%jR$3iu{gן,#Y]TQ5_Iz=Fb7 I p"Lų$#쮿ѥҷp k#@8s]q*EK9>ogSx-3ia1z!8ETuKz G6~rΧBIR{20~OȞJD5A:fK^NT_b?^sʌrX( bQ*NPgBf؉RP MlhL,n։hAؙo3Xc;fXhp'?娜GIWu:mY8~OqT7G7g*N(p1(Iz1GvkةH3;s)9A q?E|tϔ/E ڸ[.k83-8&:T0KZű湶QChBDSc,, i ɒ$UI61vs!<E;-1b[JT;KSC]*>uLIM]yj!*}y ZgZYI1o] 2h+s|uȟm^[kZ@v ^8GQL0lJ>i/J$*^=[LR%n&hm rpzwtwuSB Y^a)#l_M{)?~=&Iw,?6h6WڮfIq @ܫʯ>o w)]Z ̇~iEvPWU?Č'Y?Uqx>(A{^3="E_/5Gè0a(mLh ! Tm*o6mHr-=ҕc8Ќ_j |8YraYv:Kަ#KeOBW󨟻R pE/`MՇF8jrVMAxty~[Hȍ5\eQ띲6M6Ch  *n,#CTy*thFrR"iM RMlb^H'}@WZuvxf j[azh43VVLïz+cM$u+v%uO(>< 0Ea|8zPZ\ڮaqGe^;`x;|?-yx];tmFͺ+Y޹x!O+ I4k"ͧtV?//L;_ܖч*QUSlT>j1G)V-Sd$Ml1ܣAZ=Fd%?QGc=sK`L5%㍄{Rһ{dv M ґcH1 aG wG>;EM~ƻMy,|e XB~W(T{_SNTD~W3w"md) `Vuq8%6es0 zve'3y!-2^}($xLחhbs@~=YBg͖~k5vGxOΛelIhL_VH`y:nQ(sX}#JCn<ʏH%d2] ω_V+y gף1K ՙ&l K9fG$!ަP FLi| ,Q-+,osYTσa%$F n?:h\UN]Fˁ5]/հcޛ@J$p|vSGJ;[TV {}15k5SW/24)wCan _R{/g:ln4ZM#v;̊zGC'`C 2QF dxI/@:!IAg8JVL;W7%mhikXnV#)8͞"aBwĊ P7k4їnP&t!lөy?C{o>172m0FְuI':|ދDuuX>P =? fR7 Dd$Q2Y(=`˝6U=.#Z hJ8\@➮OKim8*S;}gf!&}cY"n[̾>ԟߝ w4_cG#g>rv?ovx (w̼v3=d`>mmz Yg$?:-$b ɱy x0|@OhENp8}3T'pP4+ ԏL4^cJSe_Q-?ٿ3 ARlC<$om ,'J1tܱE"ʳ|(-YgejKi22h=;?)BI*^hFg;+zKåК,ׅV*̋iYjhSx?AXJ .ߐƣTFK]^&3cÂ+ȥ,\d+lq"̑FThG[&遤" G^w5}p nh QsӣwXͨ:Q@u/|qDJ޵<LQHg"CCf^"5xʞ \suIegQb r8&c3$ ̮ooJϪvCaK*N«t~ 0ޘ2y 7]S0{JpG9ot)˦)oVKM *ɜ~; nB39@72yi& D,s4:=?Ou2T}Pd:`<6- ˌi@e9QQd7x0?KIQ.V.}1ϋz SZ-*il1۩SԒ {E\*0[i3jb'8\ISH#c2u1SʮiwY) #Ϸ ɳFI|c B4S)5Ŀ 8``bg .g{:=̗Lf-n29h'-2z_ո!+ =:Z~3)[\b />~Z GKx_AROiu}恽Jm_fpLgL eǦ:̔ģPע_0˷51un$Q;q>mǕZj{2 drHf[sW:xEzAӑ7,?5GԌFN; !<VOg;t&e9d-ѓMo SJُKoiFW/ՙyhl<*JߢˀPepF>T7~d0f\0M;A£)"q$ ȓo͛0p̲>^&rr˵uH!5WoRLqp8 z2̔nNxEeXv$z:(}gR""Բ 3zJ0_poek04ȣԸTf_Л߈ۧߋYk kJ ꯇCP l;Fħb$_,]ױeVqC l[OhjU`%_1xb= /d^̴TjECgSrq)U/9d.v.ܲcZ`MVO0/I?F7!Z o-_suDŻ+@1}EkE6 1 ndU_3\#\ҞD9qozC\m;tڹ`1zXeǛw#&$ƟP)h(x|E2(sYQ(#&uBu }C?fJ1s Rs(Lg &o9v aa%}Š3ϸQS { |V#03|Xjs،ek8fH! wQueÝGy1W~l-}1R`z [Q_9[rah B^;ή%+/ܵz%" =Kz5[-#>y/ 9)guGGWfp xw&&Ưsm0$Wk=&Η |V}Q%˪4c@4-}P$"u[6B3bt{7]Gܩ ڈs^[:Xsm%JU1+z$Ć9 +Z'`fU)g/&@નGd'*3r" _4w݃ %CpP[',яcIJ{ƛ!`B1HCj*T:Rƿ9o rHw#Er1tD㞸Vu83LLȲ5N&CbXOba-O3yҗ}B_]A).>S*n4{ovN8`#.X>D3%ޙ=m۴M_)L0i`Ot}^bLۑŋbҞTpbeIG]Ckv/Уdy|oڞaQ& ̓c㞯֞W 3XQta\q88\'4#M B(bXb-`dzރ E4ՈhGl2I |\~p[ Uv vgz~Z-9 .G*!'IslYAw!SnRHt ÎNDƈD8CKy疇{lSE?>(S (Bg@msrKuh/B4F%P)LUgzK4 ;ݹ XC.mSgmOX+QW'ugKq~a]lQjkLA].;o|,Vm"u5 Hp3oAokzYJ-B~Z䥎mw&ˌ ;Ucl ֝n!Ǔs׾W\U}P*\r4EB y_3`q%.wScisD5Nz?BzD2ZQInFukl9m:FZ I''V:G9=ƦIϫ(e_϶Px˕Q5{rbm* HHv菜s闫-Uʜ6r}+QDXk+@WWH&M))os`oWr_O_⠣qpsV$f ܇v]rbj Q[Ouw|Cjܰ44Eې.zo*L7XO*gs$"&ޅlG5>۬t;."^$> 3N<>JCIMh^8L09m?4E s͇V$Wi m륨aT>M0˟j4k=Q2|oezV)a|TT[$,1FyK\lK 챀SnY*|ʕj]x{!-N8LfޓYsrqDH)Q}ͳm-Z &* y&l)rJDtnc3zΩ4 '`-mb[S՟5np4fݘk k,)nȰYZa#PIm;EyC *OV*KOfTpM$=bϝŝ1t8eP?O$Pz쟷yBbɓuq)P'VyWl?<' [Pd<"N  ;,DaA/zhH`1m;4.19A[wZ$lD<iZp"p!)Q9 һI]0zǥ+#wźz)&֣~#$PYTtlW`R#yJP\@vt@_1dǫv/F #{~27F'ez4@G.Cy=•9UL2$ : MO2#b-7674#ްe;u3TK yREV]pS-u2RjVʕ%Q~ 3Cd@ ~*Gi-wI{z13jv鍳ݟ>mIm*d*z*̞oL:ف40KcNyҡOU2y^I+dzy^;âxvLq݋wɼ:!V kSk Jkrl1Gҟg>U6N>s{ܡs]pQ'+;-3 8c!/`2*U[azRX$حXm{-8׃Ka@QrqۏEmSTgH0U\-Ďz0El _A-CD*II }y̖V5|x=8*$I ,^m;Oy'I,3o`%ưr ЕMTiEN] GMԍx*  j+zʵÑ]BWw!9aELqԽti+7H 7.Baap\ZZdC6Zfz+PCwgо1cE LamZw8!DG(ad=pRQ&V:֠Wdǜ)yL^є%]Vfڽ QOgw<0 , M\+TE:.bю2}z*&[BCatj3L[Tm>g a6Tw@H*cz,vdl0!Ѵ􊄡c,CX}x)C*Ґgv2n(h 8zXU4r+tf>#.f2Tuݻ C2rol+0U  ghw5Z+ L-`3*wg(ܩѣUc g > AѴi4Unm1q,y5b) v]?(fgT O?1G"Ic2N{M@4n<!M[}`s 31& ^G]ua<*vNtTsC";0),7}#PH*%)2$)޼ū:*98yXh1Cr%ݫ̳O3,[tʉFeDzn [wŢ,ڰyQ)G^ܔݧ`ǴuZ}=8Uif5SSe6XAޡZTZu\+pILSm^Z]$̿ m==N ͧ,մ*JJ0H[)P_ZhugҊ癔çq<&˨ܴacA1Rm(v;0 (fa RIMw[~YPQlUB`5"]縵9m9"1^$e,gQs} MH !>PS>ΚىIһ= fېX;=߸o4 cgŘ07nės޵HS4́Qovݞv! S׺طof2`l ~Nڣ@jXkNgA1%7v͜6~ZXay*'KAfFL",hamzHz%iX>I}.;ф2K%-爠f/d_`ۘ~wDU06T<GNR'B:2o2T`:,}u|'a]W$hڧt5W2ȀJ L9P}4+se'ZBSMm[l@$=bb̾T5?6#5I"8bKܲxQ+|.iahwm?sZ}Ҷ @ C$dYTT:ȸ(GT)|7z5m ނKt4:,El|lFwb++暭[+WgnHe+#t=X-/}7JM7b'!"c Qq`p|ts;px! }@x,s3KuɶhhI;3kkF,4"p@5†S?L[xbxU[x o{aM0˟[D,:voJ <ضbY 0 ijP,iU'8eb7^(AT}n19oN!f)pK\Iyg{ԓBU#09L'&WgF$ӡJ8@w42 $pҚykjN0o7~3;p.'⏠s s+#N|zQ̀'9^p.}zJR LyOňӆt}. kzAe;r^@Gg}QuTfy &xfǹ ?I˜sR5$ ss(?ޞ N HهAaoRMFsv1^cèB#!>= U@~e?Q[/fQM/٠G\l}!U_Hk)+4$AZn%([/ ގK2:\C!h79혰5əsWQҭOLl0WjP]_z:r7MB+Ē$ t|M8,ɎC}V qxlz~چX4SO 6W2s9#)>i|VPIFKĖ쎢x< b}F<άmß¼jH>v"~v?:S5eusFie/_NC3~+wKZ諊sb>HCԼ$B0*:dxd *ŅQ̗fK0(mr'UnUmz`D ɍ@$6Hlfk zq#3WDmTnPp>_ʿ#sg(NsWj՚x71Ov4'&Cۓ$97J4.utel,<K]Ylo8+w[^#G~E:viŗvҜCzǺWPF#LA~Ya{:G0rffRXly!}3\,[ziқ+"32~] d 'C ǢkIvoLitEǟeIl|>bSpBa*"Aтc @# N 4n4ڈT-ϑ<774=W.+P+7cM :պ^K>5n}k{J9|tWW{mor%,|"s| oIs\,@'b,G47 K'?#{>4RyWO GU3zF[|u,f+/V% * Wٳ_\kC~,3{1AQ_5eΠY`^=Nxƹ4L6g3K2V8@@G8Wћڣ#=#3`zAeMv`8P%[rNv$)$9"aţ)se^Խ2xRA{p%LJe= qqjMtw>[*{!D\c+iRG:_ p#Wp "( ,ĸoo:kּeyo ūI] 22(Uq/K r>g 36N9ϖmqr"*KڡKTvҳM |K{~B$CUUv)k. u!z7\L8)]:L, ޶2e!"dBI p <^BMBϣEr߆7 B)$KL ^\.gJ?|EG)뙳@j~Js^ ~~DӘD2~vȳ" a)Xݴ fSSY{(޼nt5 auNb̀_֘!Cn#}, Gú=30 !yX,ooWC"׬ΊAXAz|ln\p5V=iXjI!46fM 8?MHl vEĄ9K )d;u ^n9._SI~*>2p0q# ܎99P8^; JiR)=h@H B pn{џnQDEVU)+)F-._j@ ZsAo., 5=Dg&RJ3B?؛T"^vƗV^y[ГP߂},G^܃3Da7OXʡMa}j_s%e CWa˖,N.6 #!0ުbk9GSƬ|(Yu3smcy#b%TKX L J J RU+&j !gđT[jcŽа[nVAkG\+Mrf|Ͼ|:,8V8@gu%mI2E&ٶsWkACޢ[FF ByM`vʮ.C'B\Dqdc}0k_#x9S'({dn1}~(B g\dk4EU}|ƔIz*1xhkD2{&#ך3pAc(0$iű {s,+C_Ґ%gzozܲ@'\^M[jq/_7{ub^I .VsXv~]vz Wq>:ZocE째6^ƆB<Ӡ"E>70mՏ,0+]Rn{IEu#D Nh6_j 7L=K)YhΧ2jFmt#?&xR,5x͌hHRq%z>b.3;F> g#eL|Qi~9g3q6X}fk*w]K.7s}Cu}Ecuu9H'êğ: /,%Vk.,lH[ pC909h;-;13r$U& ";tٛΛzg<઼rmKx`EMo4O{ٞyM4=t:k' DhuJƤ w&+# 9 s+yt$ vmq8If W'Jۙ]3a)W? mHvʱmcwRe…/wP3sM TÜ#+uk:KԨ ȩt) &NkG M$EWwlCM9yۮFKRN)!F;iд jNJ:#=RE%+ڝ̛(uϔ@;#xcIҦG~~l~ V{0oLˤXҌgNĖNRmӱ16b!#\iĻin$)b 뺯72iw"Fn#)ԱAt }۫!If[=wzTl#hQTP[g]Z-]Z5r)?;[6+ J mf$ڱ- YhԪc8 y$ؼ6{o\GGL(56 )-JzL$ZQ_Pu"P>Yc\2O4--5؛XGgd7Ms%ˮIv%|MDȢf$-8a^s?d9ˇD%A v9Ee<̱Q7n^HJN uJjL%uNyzN c42dhΚ'ۂn]Y0iR4:@hBLrXBuCN3'ɕG 3U?>tV#EEvn'V0R!<Ζs,_9ޒOy1faUpMIJ/s<_(&&; !@(긕FUX&HYrD!=(]Z썶BwJW; בbPzjcMpsV}82ofJJ|Q]}\4_Q|-#-[SvCIsOf2-cmUI/ &`*p~$,GX- wD %;"^ȺMh@8p(2\r೷Q)z{*dicoF ;}]̀y.Quzq6=BtV94جKsAUvEɴjNlXK$.LUV wVQɅkx=ējMa{ eA:{yeDŨ賀鸰N;O6OOrM=C]aOvE߭U'bԭ^љFI@&1/qAhFaQ@mSu͹^7QAc3T 1d)*Kj+=aG%7f 0Bn'dsIzԋN`kC&G@1@ ;/)4k]*X(Bx|[apI1Wd- a p3ꅡ&ܸiW&&_&/&itVCcIt[ְnJa؈MO&3Tj-٢ "7[11A_Ksvh@o ,˅9vu܉FǴbBq q\x+whQY|QF k^.w}U֌q:Sb4Q.݅VoF}cq`3Lcz ~95.:aW4/ N=-\/L>ؕCww0DбuJ"sۅ:M3IP.$K3f4ʱnmf\,!9o-!DO"u }iYq˾QWn.CR/GN}norf}֪mm;y4— r}mM>SiK".Qw'#%\3BEemㄕ˸W]Oe~Uz lYOpКziv.Icbw[SIs ҿaӄzU,{Aޗ>9~'(!kuUnl'!$y2kmMlY}@e,MnUM-:e8 >X B Y}P ɓK t~rY|OVnHc!7h-$#HVVZdǪߓ0q@W#d/9P6~i9\ )>UlaӴ?Ott+v{\y3rHДUhMIx ( ÒCmP)~,{  ,AK#K¡}A z#l Q#%nD{¯>}Z޾c'7o$W4hQ Tmš7D}_hA9Ue3Uj(q˚d 8`\Nn!yuܶk[1\6l_6¼\Ҹ,[.:#kź2hJ)7Ԝr4?VW./؆2vI>s{.KݸINva%$Cῢmyf$ C Ò\%.7j~؟,"-ԁX#AԽ^'-XAX_k?) Y\׏?ϔG ՔBx%o_`.v{E"j೓eFAP4K&Ƽ\s4M~-RP`LSɃ:\-])c-KgB;Y ?\u(~U_gZNj1ǃV:{vsShZg$0W?yqadt[$ ^~ U ^, Űp}]8xP "뭺% ^%ͭw*tp3ڝЈ'20xJʯseǥ, \IBa#¹i+R NH<`:󄲌Y{;d{zSʬ4m^40a*tn1S@`ƥGq޵8--ҚY&Tt&(k\6 Z~B6i_}1L" E-KUmcϟ,lbvw48Q Kb@!{E@<;+bUr[4"S`:v-bɧl2 51Duo#,yR T1w\rcwH &۹V=s wS^!0f 3!c|k]BHV|g)UjÏMT%#A}f益&^6kkoW{8yRefťg8!c]*F3jјrcY7ʈ%A%wfҵң 5Y0JFFqK|Ox@@US29 B2?[TMoZ<),`lQ2Ej9>wKH*<.*w޹YGu>lSg[= T'ֲ/ؽ6{4~CZS339MfoUҥ|) @/يx Y-&t35Vx]u؋ 2A<m)#;!pjT;"4vFdEwWIb8D)ڃHnV ]qJ%t 0G!m2U!@RTȞ!l3[AE>D @]O2!WI;Vt; '((ۤBɼ'*!g$ÅsQi%u۟9H: a>|ci-6ܒGrlْk]irAOg C^fwWoKG8r=a/cеWꩦ\GyD"L WEEtU8z_1子NNT:Gx_#< PȷK3ùF  /H@=_v< JXnyytEŠUj1n2{N+Q̙!e:3p.L1wE 6TV88e(,p[. ]硳uɇg]r$2mض -/a"]O?T4N=s$]@rd9!ks41cTݬzG&IԒNiچ)"} "X$L2B#1SiΖ֝B*~␫Qh1Yy3́?D xo8^>n3Tμ#.}RP6ZdQ$}YF@dXr#˧y ԑ"ҲI _"sxIC+Xw!jJM m,K>s3U:c UQJ1]$tB D;],G's2vAԊDW3sS0~]\|Pm=T|[,pJz3A@5Ki t@:QWc|(JC嗦ÀNv6VE=Gב8oټ=Y%'?ba?If"3CCnM)!2r1?bqR [][HrhCK֒‚|;R > .w5sj'Ǫ+Bh/b),o{,pJ.pD~PȂ~xAfobȎyuY֞FC=ٙz  y;V7D> \7P k F<(ܴaO*ޙ삐STF,Ģ[)Ro9U4:hг"_Zٵչ،}>JX&=ytuBzyvӄY0&[jjIOɨK;`bBM¯; \U3W7AbΙs8y}A{K oUZu-e<=W7_SEI db1QE,skM2"xIK}JG{A-+aWapAσrk,)nBj p8jChЄ`_f04.ZAg/,y r*.${`0(.ۤ$*FAw%^SD3sPx Ȑ-̺)|ПzS!at&CsEfOTلBOxtcH޲k7='|iSծT.LMV'AZ~bg ^qGНϿIK[琇$makc)/)7aϥlNuKMV6l xYxܬ 127,_SkVF NW( Tۑሪ;s̏96~kZzt[os8buv5XH+4֌ KxlyJW Qд-27=fd9o'cbڧWxuk\fIOtGK?SE%א p:Jua'=Q3K@{b_ ,vEJ-:JybuED_|ԢSu4B<_wL!/<{'}b[s eo+}D$_7@NŇf(#X kQ>V\~wx# 9u\ȪfFL*%:$[hՌ%n-eY\a.R}N}/\f;o1beBs:O`t8\'{u; `?Ո㉯i_דNEVù:8՟A`iɻM/ۏ" .q_So.{ ҁ:h.E7[ ^uCS̑U9=1w:)F[cb?._23;;poLÆv̋ϰR^ zZ=i S.gO\/H; n, zQy^nՃ)E-1V$ [?A"~USKZ rB!)%|P0ڈuMKӐoKA*K\uwZzCFwg3(25Mm4|Sʒ|+JjSO(&aOuYç%ZM(ZrDvHJ޴m"\ !BR3y!Z+s":y&<=.P4Bڽeq-MO( $C.`|Tij<"xnKc Ԏ.zJjU.EwA6}y!1gvu'@#' Ⱦtj)']I8J|oU._4Օ|R4dkdvhAGDTtX*7a9,%8>V;:l4f-/'\LHl{u1G.'J$=k =D_X^SۢIȖV鲏И#Z{5@5UgkEIHoqrd)Lta}Du_܇Ȼ|PŅ͙{5A} ?ECt$ 4}8mO3[LSMUSbgzڕ9 V ףy<135>Nn߻ Rόu\ӶާqACt6rE:w*|LcE>=ᦂ|(Ĉi P+l$ػc3Ne ոZ[qSp3c:Ch[{B&OkSE__,Ww f&ޱ͒Š_Z`sE{HۇT,&: S!l2 Lt䚟C_.ͮ7^nZ# Yk7Ȱ=RDbfk*|2Y0 C ña"3e4I.SHQj!z csgEat]FR f,:vkT!CV)z ߴI`8)MY_Im*R|m|PS8W5g A YŻ9ԺOf]OtFUZО|94$[cJ̡Ytmې%NJG0a7Ch@Hk~ >QfJm`b\ױ9ɗ9 &C1Ίҗ@iE}3B XZ: Q.3VQ[p7+Vi!-vf/Yf"n>ДZ*FWWGuEO+{_UI Ah_H0@@5y_\ɪpbJ8U0`Lk^W^zE4ijfH@x/D0%3ůX} :QI޵eHXg,00uomz7Ju᥮twQ$8MBK+ TpCZs8@yyb7*nrRץ]}e~Q4zP1:tyK=~-\S˗#u [V>N0LX&dI:q>uxok= z◎vDCߨS@]J'] {EP Y=m;w:(H5 _ETEQc5HG8UAޞ czN'}?x91`sܳߵER y62"#ȹRѲ#:#* rT> d̝C\ƍ۴@WUf_d1οZ [s퐅@Ʒ ^!O1uºZZ^@bk e728v]5X40r¾myNJ:儯!@뀋0]%*3p|ASfg`6|H (eWɳ$6>jY$a2XPf/H(P0ISvF777nf'.d+,YǒIb2շɠCya]8| ]"Mm̴{k8R5Wŗ3i}qh5#xb&Gf];Dt^@+^H+&H_tl2|| WYvET {B{>iG?M96n8N}Sט-P@-j4,HwKvU19zcGIN  S4= cB⬴Ũr-y*j~}}ހ]iG jyu~ \l [iչy& J.=uتY6M2 0iU1&@Y&O30% ޶ )I& P@APjӊfȉW<{y^;u*c`1Y/c݋/ c.\}UU)(O.\Wȵ$FI<āOv1f>mTUr4uSe)֧Ǝ ,+A[6:_;@ chLvtSɛTBm;|Y"u9IS"2Shԣ *%``Ф6+ [k{NϢހI1u99,> %&nb" H=֨G4TP*F5r+8cԱHY5,z(t:fKVQA|(Ϳ0󀅉͂4wi!@cRޑ3>);V):'B =4B X!,<ً/ࠐ᷹KֿD! 6Fe)k̏Eo^ͽc`IMbEԽ}Kh[nS跴/k}Jv^BY8%SJzRceJ̦ϠbdBS@< wڻp2Avxl be4K /M*Έ!?Odbfe$*5Ki4h! _gqo~nXZ>+v[*.u!!2G C{ DW(E'1~!nN7Zqn@X^DNޓWԘCR 2|QNf!E}$cv8bUr ms1L_o= ^~NuMa~^i*d=[mOp@z 6Aʱfء2XcR9U޷yL x&W;_fC&-[7b@?iA1rO%Cs0ɥ1HN$pg) sI`= ~1Іɘ&fŝ߬:¹j™F(04?pJZbm vK| _ё_艽<1_-xQNx06Z\ yX&51iFӸ js:x-41tw\ŭoPoCn'kt`Zmr->6lh+*l1t r(J}wh|74ګsBo@j9?9w?D9.[N2k-}{yu];R7SpuXobU%db<[ < zdCo^cu |zGVWpfi}sԩ$g]^@%4c~\?Tp+M:h{Sړ[0+68hn$y%9 wɂz;vRvS5.*K:T 1+냮K_vkΕ⩴ ZJXp5 s&#$0d"<>-U=[|@d ~EPzp1Q,ZT?ŸfN0QmfG#`{߁Gy $֥c Dgs$HX,bWؐ5nj̔!`~?$1UpTxJƋ}G}$rG<.'Иr(GMЮBTԾ'_OU'˖,(.\"DJ(ISVqB? /1f__!$$ ru1&&  rs:R Tl|78e) ,az3P:ߟjX1X98r|y 2%YZ=a{z#:"a7p>ר1rj_6Syp#Xp)RWaD€ҁ2<հ[^*SOI9ZPX g*?J֋LCp;8g`$LRrT)P% :ED-+@l%JdZ1JM8p#Bfi@6OLG* )HĻij9 ҒG0 K 8ew:<VQJ&ubc!c9;'(0~y,vQ]/-9$s'*й(Dԫ<(:+/R0Kjc FcDn܏hW0AAъHf3 <|.|r f2O_G0rOk811'=fيA(V[SY'o>K_,x[֢AfdQTKTydTP2k/u*ef7wxh|pRąuştJpHE)r\7'$H6\Eϻ7q"m}+S , VMHAuשdڇJcQE]ea_Lg*tJ=ZXdy&SYSvg]KcUBEcw̔/2Hh0''jRfù&Xwɸ(zėǖ/+?[{ɸmsz?RYth y.s81i\_ X&459>njfЕYx^XBc41ˬ{%( |N1*LŪW(|Mǐd-&m8z`zUug[$\{'Y=eZOP< GIF{a a[P+mDo^ yIH Ót.1)f?6$Ǻ48F@b=G2;b^͕c*Tm gl1k+-bh)Z,֭t2IM_ s+^ڋ}ebQ Hsb_cwBWDM]z\NNүal K*}>S$Z (n Q觯dHW2FUd29ŒL1"Lj-`b 逖'<⟼dzq,3$gEHw#@c.h'cI}Auմu^N2#(Rc=HWBSy4׫R0/ӝ(&ѯY)װ,. |}q5a#Մ3~(< IIiڀ< à0 g*-N]S( XF̒ݰ6a5 -=QX,b%_.UVC'GonBn>+~a..d9D{UlyuDQW%\w?Sp)Y~($?b!E(H wGβ0/}Z4*KMc`a]]㰦ߛvOh$% RpC<ռ{9#d^j|ߵ ϊq#>z9gIGF+9SE;}U=<?\1-DiFC\ tIq{ (bE_QR~ v3X3^I>5bilxH>1E~ EO` ȫ0P%w|wq=c;5e)}_KeJG"z^ svB wsu99T2Кޅ{=u.r}cM+=2NϢ4Rx3-ؤs4z9fܘy#KLSa =@In"; VJ Cd+ؕE-H].M,Ty=ڼ^w$>(LR+jdJNd3Nct; Dx¨?,^G_ؗIi.4}D?uf78Im¤DL2m\xM֠p_jNb+HzTm Ɵ/BPs7&VtxV` `\8bpzk?]% "pV8c׋ְ͌%B_:wxxrRÓCp)SX~ % 'rcߣLe,=OKdWNr+x#@XȟރeZ OujНfov+pe[[t%^BS$.ў3Q>I @ბQ)MOǔZ xlL#!e_eR;fC #AQ߿P3~<;tnADQaP X֚!=E F;ˊ=[VGͮK}3yO4žt\BgxβH|.E 4pPf.}3>V~+?5Y&qN3<ǒC7[$8(jd{iΥ`UZxHi1/} MwIԽ cQFp՗&ֹ8nd kJ|Cn"UYf5.x}B`ln3p_Q.Iސzɀg_ϝd}IXI(kJ>әڏLϡU B4[I: ^}@ܺX'd:*$$2A0ȟt"CUX5;~'AٲhNn'UWhTྷ'S{U77$^dK)a!v4ŒZ.Fi)b1 Yu+֦w!'e`iRu.4FxMix)}@9_)i=NqnpPLc.jw"o1@d!x)`#者́ fD4~nr9UyV zѠ'>!ߨҶG?˷]cуۄz9y'ӹn9,ea91;(SKIN [U{K aUlp_:Y}EZP6L3Rz{7xFE)ʸ5k2 e4p.o9ݦ>/v K{f®Ql*63mގUr4mSZ07K8ffLwK흆}j-X~vߓhg|oua޿!nkyQc:ua/_2S!,YZXهADr5z9Ⱦ p1rLUa7,9/=;y$L@4"'&C"}赓B-з'ÅҬ* +%U$Vyd]UBt[*\9)8Bw/Y,qCBşl y=[?ĵE?ʜ^QrԄ% &BA"^y9w rܕ^Imr8=l> o~:rE) ]:k㯸Hļ{1ǢQ MDj[[ο_U op "jfؠӭ WJlA]bgdw"rq69L/9w%;=J-b3F\-*AxU!֘QFi/39e[]Cۉͭ!r{WG8۾s0{D`j];d:{mʻ|@k DlevxXi ԙ,3*\FzaL"(f5V:?gX.V/-i%vK/ > RUȣ6MNR)ߟ[;*WNH߸(?t eV۫A'I!o<yI| Z\NW罘|6k94zg*2ᐷY" .>ⴻ9r& :7h:[:K[[)5 {%f5\%Mvȫ`8v""N?p;;z7/1R3sw3)_`ٚ1H5=EV0?+$) hULK(j`d)!N-zk &[qQZ,քؤ@B^xU`UkY/FRrid0a^Mxf O[Wlpqp.9w XowghJzW V ώ8)U Fq;$+φ4KAH@| )E);1 dF:kaix5,?{?#+ښIjOfFw:zίGoqȝ5ǻ v86Vt2 EPeWqtXNi.jɨEU S]̕5wMHv'C1J7mSW.o1^G# \+U7ʧR>ǦRM29t;b8z+Nm0v= )=3HnwRU5IL#7;KI< DE5isV{lgH(%_ts>vxuFaV{!m@EX]H&$#@uW)1f|R[L:W/1hJW$ qsZCԧhmKDuxِ1wgO\ӆ’7Tڮsƻꤷf[qO|DZ\QDxnDT Ts;#d8!4e|JyeFن1N?UyOkKw)ND0+yM; kSՑEDUZ;ܮFeWy MDH3RCnIeq5? 5u^22kjvfa٠93mg}}j NfopN-`qWM12U9SA2f2OD )>yԣfe7NM)w^;l(n)-B2>|GJ[N*1 ,'ŧ;7تޚ8`^d*/r5 ٵFLowaX iVqAԡ'h)ی`x$ C,8_Od)Tq!"(2r*Y̢9f3BU@.5e|R*r#Wec^6]PS}#JVs?R R>UV ´B]:Kz|8vRc@yZ{1P?H*w8̨Ѽn4|hf٘ 9\DˆJ|CPĿǼzSD|-8b( ?E'cp.R*TA*No΋.%d"4ǫHe+\2aϦz:Mh0j6{}$[@d-ZЏbE#B0uHd\_jL46pjZo|k[p@K9fGECrzeOJ/LOƲLUdriǸ>4h\T|S# D]k6(~7T!Wu%ziv[X;qCi{r&n6-o|"*\@f?j'i:­JҜmA Zx7 SL-uJ'p1^(Nv]/RoTF,`wXeOnnͲjg, eD2욵5Ƶ!8ԗAT}VRff6d;IgOV_<{"R#m)wA?x zrbe8m$6{"JWNqq&:0"{5ec&X3>ݎudP(űs霳`9)Gz x`0ue7l=޲d }>ƯLFu$7)-ؒ(_ ַѲb|vW kR<5~8X7>_E@N88aG6*cHv-ٻxvpR,Dٳxu B%hm$]uﻈBY.3`,Qh /L%%q&tۍRlyCQ Y|Zj ϨVY-Nj,;܄W$TY6UͶJt\I߷m#`\ U?n/l&g;NӦD-bI6)& p~_h^˟aeL[ ®)C8Kh ^ dB/4Ǹ_Rdq=N|j<&efZ㾣 x+ =ԅ.)Y]»{}&\6JI AlfU,&'IyZ {Yu>k?͑L3&pс=Pԓ4Eg̑FS$e E=|P0SFAIj= 4%gYeeW15?gW.|E" }' vmٙe V,oٮf6r?fr_x{ h~ g6fVۑ~ U,Ö-<mf =uN@Q;|ܸgCl@@B)/q>CzX5 ¼H! S7q#Rm@ l Yr/c1y#%#“EX[ә߭jROH9D#b:\n$/ m[aPsN*'yz ]v]Gv6sA:Tʺ};zQ=ycQ-^F#h@ ȿU~X9Y9{Axgu Fiv1 Gj=ѲԎlo:c c^zLydL]JޠCP,⬦3b36 b> MYV}]$_R|1PX<8y&eYP^%<(bp,O'+3͖6n^;h1(RNQ/GzHr͘ǯ3ۄGFPYT`~d(mK8!PzwWV_iԅU$ڎv+|0 1Eiom-(h:1}ֻ@hn *4q1H"Q,M˨rl8 |DfnmB$_:Jq1.I<2 EQ[OǡAkEՀKVd(cGkkuKHj0+0'TUv~zk)F=VE Klw`w5:S?<ͅwz'<`Ο<3/[@"P"&Ɇy既gW(o PY<@5,_8,53|p uUu>aTVP,k|.eiHgɴ0':4t_=B~Y*Ԍu?iސ <Ȁ<{{$m?t4ҌM0J0XY8˂Y8H9tkYq!9T{ka^E4@lh3ӎF ~ "՗FٲT*Q+ueBٝY3m,{W;%X%1 LDqs;uUr/Lh  trYG!<}(2zoFXpbz^'i8LGxhE(ƽSJť ~ GP3!S},6&YvQ:jt5!`b]{;*[cQY%Yz>4lISD|N'Qq_UL@I%lڎTu(X,K߾aO2ԍFdYad Iogg `pN{kW(EY^=]DQ,Ϛnj|{<2%\&}@Jp~=!a8BK/Ey#nT'B |YFX7]]dTGҠE,JLϡϭR,ζ,t/z'9s5PNafi蹊UvQĝtkyk²Iv':h q,R*e#3n^:GEιOl5'ItL}FnJn!:q|'&>xIoqΐ=D JC.C~@.mR[c'j!BHwpj40`3⹗) zbDpcV(Jʶ?MNTntY *qwg Yyj3`=OcRSXڃ w2KIb#Ui_١ӣ:ui}#xtȊ^y`4VhvqN%}mhp̚/bdRgXpA962w+z޶IźSs$K i FR|H03|i %A{+HxaY7$CM,|WN^t"b:g"74^maij|66ZG<a;x|[?/B\KL -8\F7Bf`cW#Rgc\Հ%ѹFd ҙߍt_EM8a$ϬdhUQs+A?S*?ZW C?)mOz~e6*46ވ~͠tS3|l̺ϣn <ڛҥngܙLQEˣȒPQ>p9-,)S7MTkJg"WM W73WxW37Myݾq2zI t:;FoS 2<쓴HdV0i%ɧ9FIKhhC[κl)W4>r{v t~Lp ~| %_5hiT[NRR0JkI˔ZP zŌ]y$~2d}F'\,`NozX,uM$[aG7E@4]TNcA^D.Mg%94fϳQi^`yp./*"Н,zKqUOԺHah F qYe -am%G"maxe_ːk1 -L')ppzgzU=փeSAB\KjH@o '[ 7KՆy.V`ֶ-+Q;h~E5&]X~Ln}M~E2 /#|SfbiK#]!d>%K)!|fbqAҠOuXz< ly\ҡJ:%7CPďnqeKW -nڄ HDsž~`W] !>rԀ67H֕31 CxuiP N`қ~\)g-g~5X0-8I pe)v(us&>a  ¶7T5:7UK~鲳a,DG^}ӹG9/bYgzSero@OBg5*?0Ծ>ГH}"rWT҂ J9 àrOwc& ` &5uo$[G` lY{Al "7ddg YI<"^) Dls,Z%c\_t\\I3l𷚊Y 4kMhLNj.aĽ E} 8>N j`nT?]EE}Qfq-jouvNlӳdX @z1rUs\[b[Bt)VX;%§x^Azz?IDh,bQ8U2垼C {}ʈ_PΟ8n4;o璙egWNf╢h&ez퉿)-A\GGb ]a#x'9!l *NDiyV\*iYkx1u0lKj˽qYZ"SF׏umcSL~\#g[?aB}wWIQUPU=95?gqB/XQK~ق1 ˴'~ t_ϒZ#޶D#_y>L'-PJ > l?BAjH0&.2U(Α in)6?_B rry$df5үm憜5]A[ 0&ᤞF.^y DwzJ9Is!LZC#7vmMl~늎d&쉻|jm8Z ^_S\Ĩ ү&]5b罼p>.Rv2&/ĉYǚiP?DȲui V(V?\t&Uոy.&kWڏlCxc] ;U<*K`2h *cSQ'[ľ@"&Y;jz<1(Ȩx}z7n0]>dAaMK9d8ZUؑ`Y:ܶ_hmeQ*nwk2 ЃBՐ#sУ:,cy~1"LmU?LdgtEjHt LoTd&~sJ)ws7vizz]o9p-$u]?$"->bfOA{ʠf5ûHRtZFB>+ӈn0VtkVdTȕ33aГmH.3/Qa_0klg{¥\ƭGT'|k4F)!dAG꣢=?#;;Rn8!02c=@?kDV>- 9ba|Sƙ QͫeWYw̓pR!EK*N[1E*Αîi#$v_ik%x DBR/ -s:9=}DlJSRW qU?iQxtݢ+ibiP)9Qd{pfw#GO/48Y90RŶ!NeRXOYF0ĝP{$Y"Gsw(V@ٹ:@ .&Ԇ쟃 S -v$$߈NfTGQZ%~c]d<6!%LBEV %p#(}g Mt$#3, 938`O6r*@)yKKV4]z)Ҏi2ӄɼx3k;X q.auf(2 c>}FI:$u$fB8Q,WG.DG<࿤)?4/;dE:{xl^!NƗPpRf}>\*1ͼx?Qg[cKk`O~CI+(˱MJ !@헥}]NNcBͰEf=L_8)V( TΟ zadx`z6YWDA~(Z U0|g sl%gWD:Th=ֿo>~qlIXǟxDX )5uQ曧xKXR8`v@.v0#TOv76V8G*+Jh8Z~B!!v(m\>6Pai#7Ov$6cήR֖Xxqnp}# A3)qz 6<-qquOa:DP1ʍ>H(5 :UGGLT]2#01Qtک>oBEKEUƘTB]M6/65[\MIX+DUVYM5}ǘG5?8odv$,KoGPSpPKRRu0]oV3^e$k뭨zn =MHZ݈7+M|K DRCr4+WXbu\ӓ$HV0d3' {ʱ/ A3B4qkvczz``kfa/[KHlL=a;xPs9WMhn@(8ZZ< vré O[BnQc?`k⾍w![2xP>RfvX#QxLف)lY uDN2MKDboႾYGH4#2̚¶t8CxmSF΋W$RRԞΡc C.[6ҹ9V g0%ESI\folK cz. O\qr_穆e0_֐`g8+g[%tIgJ'݌W:t ARzP?|]_c#=046O7hӾd-lȮ3v+1emuk6Gy034K)!Q/5^Au20Rmv3b b5~7 - ~2Ԣߓj"hWYLZ̀&2" ǀvu'k*/?C91c胛cvЪBbNZV{et{44" ^æyٲ 9.%ptvSF9GqP:I0=E,PskUm$Kg$\ൂL!ѽf-~W~6+_ %3aTrM[T< -~n;Sd"wVj-XԠHeQB#>a٘Yl/WX"S:o-b ,cڐr*MNy^z#!˗WY>{bUWg#"! >dX3Rnz~^Ϳ_`]oߵ7HΏ>ŕR73YE.1f>"=Vc^1P[؃}!"gdϚ6] Pw>͈_FϨ<@aހ)>P]^?x\&AunpK剧 )lKhN?'rn0T:6OLh5dXp+U|7_MOkѭZctЅE^V!=u" M5^8?6 / n4kgu%%O/^3GQ]R{ 4ޛIATLٻY1J`_;8<G7dvjDO dO1z S]Z Awv[-(hA{Qjo2RD{Q)N79: %Q^FEm8b0s|ƕwR@wHM_‰}2:SڨWFyz$J{8s[A]9 `WsTR`cJ#kYwY?*rTEz.s9l8ME{u@k1zv$I%.w?(% q]%N`}99*Պ@lRݴ%~7blwl wD[193ɭ2F*R#BIAU㔹$tbwFՅ`hn_+2W^!7#Rᖫ!ƒƽYKh)-7MPTfO͗r~z!{^OwE_0f"ϊ+b{,OPD0vŻi0K m #2u_Hv)ą.wd/T-FoHX\"U}^GٳX4MEp`1vتi nEox8XNmA=X8}L|*G) ZO:61e=EbGCUwmz79Mvr!iDUWu=:pJ(_**kJ4Fa(2a= qSWJ4MIܰՕt@eRkL.CgB'D$<60"YK#I Lg>.Euŧ*tÐ ;#=5FTuDEopNavFp`_uzBRdx|lD.65CL'gmzmp 2os,CNsg쇍oH4W*pR k?.xj*ZOɻQqG>. ίPI0y%/'OmUtR>&yI$DiuKJEaҒuX(L_ =࿺c7IP56n ^=CZ_'DgSt]{!=oGX4c2t@Vi~,@6^=T 'a}k\D'l KHK_ J>6QJ!. iAŅ{j`u$gkꟖ'`Tpb-V"<+{{-_bWK,k>p^ 8'amc#QB⍃(8~QA"&q(6 V5#9G1Qz&%2߉mhSԑVbi?mb?ւXs"ǖ}㎑Pİ+e\h{F>6n|Ƀ{af;jע6ɐ^U|)g`O:嘼v?jōB)Աo{.)`Ļ `KCKGC~1W[Sp] AE+:{@a3dza-F"h4;Ǥ>hqs3<OD+$"(Ѿ{a\D9@nh,c楨 Fb4<1U˔z(݉O{3d+ +X>]Ds{`X&ңz* yߦגb`=* U J՜a`ϭj<ԧ+uBVQSqYY{ ;0_ ͠?( ҍ>?u>y`CD:,|?|99}p\56b A0Hud@ݿz1Hx'M.4O8)EQZ.A`΃ߣ/7x[%Y*|/Ћ/ƏUҕrb{ 1.rЗyH14N &}Y8FvZ8yA8ωw+FBR _\BX c7JWNj dHv!z' Kbw9}dɳV N=3nWT>!p:^AL~|Pl -uV抰3RGQUX}.z;qn=xNM*pVRp=p ʩ . z Ƀs>a>d7F҈ /JTDLDY# L7ն`mcxgv8A$$8/5蓭wt\%.H /.,z+֝;mUpH@lW>O]DnƼ^[H-vAFoj51d(E#ze4 R \凓pf*5$x-Dd#gD>~GD;̴un8@x%*j>!ġ[زv}쿊󲊟$J%F*+S~f}EufE3 6N80?"?ˁ[dV^pNj4M%"SM=lTZP fF-ʪqWȀ.s=fx~2xS<bA[FqYB6vq{74Ϙ?t~|mHT\Uh1N\7˞Gyhp/jk䤲2. Vt;NyE,Ƒ=!ӻ:6_BWp@[gs/a:MFYG8$ 3IF|S'k ҝ1)V =ĘD_S(rOGsgNWL< 3F0>JŰ#DnID2n`80T ՠz\/X>-:~e*,mʗgusّ[l]r4mm~pfvp[4WpO 9$=顣Ŕ"Q}2`ײrf,EHDׂ~MrP=/|MEG*r0$4D:@BxCp0_+ hJ落/,Rk:4`[W;lz2ge iKk4f+xf}'-RM>eڼ;lM\$Ո5vIa;vyr]Im oߘ[ FS u4~a4 C rd-D-U5Ȕۖli& psYaHScox(~ pn="N;pΎ/iS'gy6^; &vI`g+T k^sS$ӵ%O2۰ NpI$Zmβb f[?͜㽈zmFS3D,d,u͆ YE]jyU(``9O֎#s@jp.KhܾϵTz_DHNSD) 'Ĺb^'FU8g]#ȳ4UV؂f:#Jr%{i4Fen7]VyAST\' (u#5 I. @O;"0I gbT =Jrޢ9Ô{'ŤspVJԤdJ u3q4@/GR}=6sO%d"[ބ| IFYg b8wԯK|^m.ݦm*Q Hk`i#zs{󦁀O KlHoY`X]o%x)ɜ쇙p)j%w6qĠs_5wJI8`ъ>Y7)Ƞ~n~聜Ԏh8dž^A}nTfյ]z%T4k]# ΣkO$ۃ^|,WtW? E~|b'Gg߈-#ԪZVc,/TڨO Cτ%k U uY ia'^Q˴z`8JBHH+va\x$fl8.d;o}AB`"u9g|GwZ R٢cUBd»!b +ig/cG ]GŒqK=BIfqh:.j"߽ɿU1r?xGkUFQͨԅs;XfF @ٸ#"`ڀu.dZe@󿣤ffcُMAJF_0 \BG+^r\⛺;\` =~C6jhETY6O~LJ%Gu > Ge[a<î&ZVϩXk]UIkn_Q!f7~ˆcx7Y~FL9lSMlcaNxǬKŵq?1&޶R4W#1L` z+kbX'zQ+qzYCu{iM>,%ݙAS'A0x$p||Dq x\pk#Ѫ 3 >Si#~)f`X[U(|8 f#NuBO ϻ4ziݾRtc՟v/3Ed zO# 8 /M'&(`pUjlQr;J^kMٹn0sfC0yT}AB$1[XlTfƩ]wZv",KСk=B֔,G ]ci~'^TұfGqOe]SӖ\ύKE;NttNr$Zye6Q=b@?X84Xlj>*7J Y.r0ŚZKmh>By$+.!ן.*'W kܦMg2BF105% t䨰{'Rm-f.9,i&pD;d: T3I&qud3p G>}Two+ɰ)uv7>нh™Q|f$DR`+ʣi f /Vot \{`s%{<(eI^:y{#28rw}L ބHW pb*I Ou>x| SxNU~"j"Eo U10AAAJhi)Z.^39'Yo6ȏAN'c1'G~^E2pTd6Ԩ@%)r0g}LjBqFLE{xkI~kȋMn(@n2QbUJ>8 ҠeN6Qx'YZz&Xu+etTHqLFF pw; -УOD:7!TDBvKwq:g2,N+9N¶-cgTY<Z:6_} BںK 0mjVn "黬ǚyzR߰(>sP;jSbԶ"*t2 J`iRwpۈª_phF=^vm*6qǒF<̄e /،qj~_5lK6Ⱦz1?;A+,9?Ms Jfl,#}L"L?RY;2PiӔ;.76JJ+. E{NS'#pxܝNg"`+n 5W-6[UKa"OުVתG AQPh`^ ry{bQ}=r>tDaHgDC{c fpV2QL:4%L8 TvzNj xA?4V֬Ox+·\k`I]`%^nEtBYYE/(B~)UPOwdGm>PG|o1rE]][G1J!PF*>#2KdyP aqu(E}ab=RXԬUl< -,OTwJMeYvH,KWsu' 6W]p0UQ8* /;9ycnUEmBt |e&LXO'IKHZK G<ЦoOe|4))w*D"tc[H;074i/;IйQXvq.btQ0$l]I&1UYCOGu 9EK衖g6v[s%o4K9@,iqy|X'&m2/^=~"6Py븙zX@t1AlG9O!]@ ^8QǥTh؝(_yӴnhm|ORC0Z 2qj,xse?ฒ(ecG|x{ OրHi̯p; $ $ pO@7[ksNƅ^p8c/cQWpVÁRPD W Sڻ@5;^4'-7݁$Nˎ?>ΎP{0y4j۷za͖y`MXP ei\ ,X#cS)i8Z7P̛uxT@w3L~Gbuշǡ]B2j5dr&=sĄdBUKԫ~zuMjo'Q9^.Z%yZ(OO&v%5F=+*&K}o1 vkh9yeEN![VGdEV' JsN7Csfaa ECL JD 4]0|^rgGO9WKP)}H|V˙"UHM$@CVk[ly8XKol*1@k6htiGh]ncIMt; H1ѫ`>֌9KZmf$Q_dh'EHXy6 -F$~CǖsÃAK,n胻[ 'b rA;bN7סKLdcu0irhQ ]-lތzmn]I3ڲMΥ%s[L*P-G'y~4}Ҫ^BT/ \ZG%fOC !&M&|)ڇq XnJ G-:;tʼ |g1CWȭnP}p,],W)5´lU]`^(WK=yol+rץU V4- nXqkn Arh蜏S^idl_8NMdYg)C5869+P;qͨp3F ڎ#~Tu# ٞ~|J࿸ߐ]a~/;ٸ˕(Ɵ+DTx?S^]Ӷ5JJciT]8/wrF͈ O#4sYM3B{i_ L^cPPʚ9@b\ڴԣnDQʄLh r|ZVz·-P-7QLu!9MN/KNȩ q)T ܟ)C4570H?nNApPzf*^X -vSUMƢvNhIbuBX_IsXk ./PzeN߻0Ogp}&"2TwJ(QIA" CYH~kxT쑷jAA+̂j2/jT* ʽIr٤^{xctZ5~2IޏOgԾgXOճ @݀ݿx/!<U|Zw@y$ԡ$)}8gܖ{& @)]z9YhwCL>"sD𩖛d4D;Pρ m)aͣk4w4{u k-U -?%8D1W(Fġ_3顧ZZ'uf?)Ax?}]fg[xQ#]2 s(jG ḩ* Hlz%Wd] Na`HES O% +7ᑉ3,eKtNXRG(Py=qA9bчѯIMOEfj OK7iht`6yj:I^,VI?Ԝd׳rrA`١MKU?Olgexz҂j Bh+ x@òJ6"_rVul ȒJPocpRV`pjҖ ۶!kˀBm7r[W`3v|PбIR"Q޽K;d,ITֆzh3d1nyȗ.r R]b[a <8)-w0Wh Q3 =)!>qE;ܔvM7Tu@k9#ʲXJA;{|~Q){ [ ݰvFmgMkA4y V`F7`$*~݆8LT4$xݐAIPZ>D|ztw-yJz2:X?`oX'65ϖVΒ(e)}6u?S3 +7Wk{0`1V)E\̈.c zV$g)QW].wI #mVu-I1K&1?(;)E7R7 ?*c&4< &w\\d'8֤SJPh so]q9ic&VDQj J--I NPIjs,ړ>T$'ؽMRw9KGbCqܤ0IKVݹZ at ǀMsmg\h"fm%f/6Nю/K28GPsi)& /| |H$oW E]|E3 L-?7j&sa:ZuP`1 e4Є:Df@wSV5eށvFd"_aY90\Rl@kк E-TȏaÖe2qϢru`&UuLڄY|z9zuDNweXkJО\H3&ʁ2=J+7B^Rن?ݣ^pk="5Jp@H,֧8`#ÎSw8mgZ~WkpT .bnOT@Bk 3.LŦٌƘe &ʰt]^||wVƮ?9f@:j#Vqm KRKQE/dz& jxwCl%/R*tr]6 g\֮e^KThaQ{:xzz4)G$HnDwx `M]"P?([x5&H4ذt pZ4l;*qXr0NX? y9xo{ n=L =^/s/~6T)]y>\t) *qŴCXМ!K62&;#"Uj@38tfe_\P7`߀?R0MH>r?V4Kɕ"Nj=dV֠W2p&5̮ x3kW?)cF>> @ #31X/Z(Wɞ"Ycj#uu۲h&4 Psu%>+9+P8;IޖP:8д gg#Du#V(p5!1֪eN.z¶bll2)SHPpŀM{ vvW2=g5d7;@U uڰWdyG@8`H5*SeL{  K&-odc:pi@ ig{fB58Q  co5_~ KYF#U2k\n 5^}DqFB_ĺlgfa>|!<rTHe` 4PyRAD'5ح``鬫 a8X)$o\'j9#d(%'O{Y|-4UP1z~[*>UL/Зe.ϙ? 櫾w3@̷yXwk۟imF*yhk9`ڄlcjX9Q 9 I7ix+AB{EW[7 -?^B uO[( h EBʹjt(MRYm遡U&hClG Fq>M/&p}a$>z8i/8GWձmM V=B"$VTG Q- G$GFx-x-*U4Z4!a|,1YkptΜ^eM c-ړu>vI.Y3TkH{Uy_IeG/3t#j=T8P2}[YNNյ'qƁיCfF+xwO^uMK$/ 6X M>/9shvIZ2>ˊ_&~0|Rmȃl'_Q: [vhAE5cIL*m!"m;e@}T=ξ &p6TI !1⁄G!L;6E^NwMݽ RrDQdxϹc %Pjӽ!_I3*[ 59FlFs*q>osՆ\i;%ukht!TN LVqx3ݸحĹ(-sxdM o(nqdM-7s5+|ɦ誦dsG|:Dk|CarT"\_w]2/f'/Dw"ɸpM4̕շE$lpvX{װ58蒴ݜm:Ri+2iز(}>nο2Jq9pZ"kZː5]5H1 QN@;/Q;nR>[R*h!΋`fL51jM[өʊON,+B~pxU 2M̸S8Rqͮ6~XN֟37nGݍTU@0ſE(f9:pRť{ޱmnK( %tTbN7YKh.CZnjdJqew>C&X8 HL8~#oj ؛dcUz[_VFS(/.yA@(Qmfxf6i_ ,th0s/CNFN6ĵ䷍stztk*ݝV΃ k+v F:Y%DDZk.!iJhbXOW|T/9.ѭ F@&ś8 .'b$e[4+]gQÐV&JL1dػպ5i{&t`8 1F@4XUl~J<9쳻QiŽ^s [X_ B-ݔ2pRRU]'{1?W1јlPk݄p.\VA6G+=~t_wҥ =2p yGOo40axH]6ryI6fy -0 k eI;ZA_ڈP%R`o\sVQvEslW fh K57r 1=)-LŌOf |7oۿ^4ZH8O>9Hf.'5VSVdq`.i亘5&PI ʳ6ՌVC>-2^8ЀӺ}ɞ^>0DlZ mΣ@ӋuÛ|-`A* bȩ捓o'awT_?xTObpKbO#Iu- wFف1`fƅHDdP6i4!lAR|e?a.!z3t$v%iKlns};"j)";Sez9: '{sO)Sg3||B]ۻ8=KPuH=o[ %Nȓ9'$̸yEʞMu%GUBr$C68NFP 0HbvO]Tkn.k"م[1+rEU9ӼtUd]x$kH$r<տͶ Ji-2=ACg/ݷGHhHӜn*8f~騥~M{F+u fQjM.[fZ6 ^ABQKG\Huh֎P\A46v(fw-!o.HԸN7u- e">mv,ևiOξ:e7@2^7ݱAsIqx%`Z#z wɏ^);"6zkgpDhèHD`6UG(1|HT>iXl9AC IYXFV.1$7h,@V^OA JO8,oT/Nu_5{̜%1^V$dfV> NipjuBb'3E[*l Q1G]B0bE]}fXsNJ_y*O h+56<@Oq(Yr2{{Õ?-hĿ@CG Ρ{lx_r8n) iJC|[K»9EQ5W0lz8i'Q;ޏ݁Ya"jf]ߖhw)G\d=p5nCڧX״">]4@A4dh-vΖ8H[J' %r,c*҃dҧ̇C[=/i]_&,g1Y,w۾tD4qڀP/S0%S0AHUMPHk6I(5IxS Np}&fiTts{y.'IQWz[lhm ) f)ѣ<)F-z($A7BkޡZw[۾uWH9}0`4C: MG.ځ4{=19"=g}ጆP}Q ߂>!9Lk1V^4 !u@W f0ݥ.p[e45@frnflH} ]Ḱ ѷ%\ecld׵ILRw|57ƤooyCrsiE͸ ިK-@ic"ȸv'ZMȉ! ;;M z(+D +1oI> /BpiPx'Pٮ` Ga!ĮSG D>!`W`F`VХDd/nڒ$=*L}ʳ_*1eB[#g4Cb_4_,zV癵=-ؿE'E;&|]#^/mvffGB!|J.=<uRBOfn@nM+x qz z-C>-And+( +'bMP{P<Dk$ƇKKdAyj7^59֕ sSh屦҄{ IonQ'ݧLuL[ez8A'1$)aE; ͪ;8#7j9?ĒD"oo|ܲ.⬅'FZNn׃`ڷ[A)^X Fza'"S9C.kABY^ a6 zEHx̀Gc\C[eX) 'l.3 k f3kH1,7.s9 X6Q&l)b}u[Φ8"-I.{&oO(W7Xתum~Y?7Ãzr#p- 30)u _g`dx3 ?5~Iޅq:a7DeΜWy e^rG 飬X ӽ pH_GB/k_` B]OS82Zm(dZE6 x e*ɶ nκK)՝ Z9UM=d^Ôe;LFg9m֝}fhL|xH oߧ* 3%G`-w/@eKZ{*-ZK:hOGq̯+~9E0=0&f['<& #1 gGyN@&U?Nt`B.;vvT=5C"Rr^KVŀhSrlC]^\! pAO*xfЭ:L@.tqOyfx0;to_*.Yxz,Ev{KI5r@ `W͈r<뙰% 65b&77*+6.zD!аEr @&測xFw-(/!,ͪ>=!47c ƛa w.+\Sјt-? ssE'F*>+}h}H#BAd}C Mqqh%%- J D2FfD̃Svz3XOwaw].]qt:DIݟDR bZIDH:РTP9j%l&AoCeϻ$(7A; LeVϺC/{)sp6~$/2$.ڶǬ,UA:!'5BG|ǜa#1]Ú@eݨ]BH"b-$r-siNN<'y/FLQvH;D~4W9KGwt-fe:+Kٱ;6m]gaU=|ad͍3%!C-b9nlcd4ꤠlR՛[4 ; (L$TJbbMϿjK2C`̌@LJ̠'/\}@IP6->QZ9ūl>&ɃӲ":G&T\ݘbhi+jeɞ̡ QFbU4k?W;m5ٲgS%is4?o\=A*V+F\r)BEM~1)7s6 0!=]Ok(}}3a2o}EAO6ȲIڛ-~|LǏXfz̓sa/L~!1~-HP4AWKk'8#t'] $фxZ=])z94K@֌g{+X@)4DJ|:>T/,NhЍGj(I[51kczSDMU"ރAq[_A֘)fSոP5ۃ)=ch+PYgWcg s.|@6*s%| vĎrޭBܡ8FSss1ٞ,odjn#q^dᅖϊ QWQCP'e~P}.~f .m97>^"ӆV3=r&Cw2u{&[s=2-x ^{zy𐖊8_7)#iFD tpW[Q9}uZJJmEÅ'Av&,uOi 2 @( RH]*1|xb.j)G!`[nwDD޴[0z+zSZ+R5ubatl!s-_xi0K&|#KEtzEO:T v~ |i!C$!&DIGmf$Tu2MfHۀ#xOdQDGStKZsP]9/,$,8ՊMzAe{N)Gn̷ƛ1xi1GG#l\Kf]F Gtn(tc`2[p/Hضʓ@h[&!Vsd"Of U?br ,o*g_%Gi`-P2ݔ#aOIK^廈ͼa8^f+3j]Dher[%v7Ѝ':L9ż=TkhFUVMsܡvI=;_F*Q{J+8?p@~Z/u;0*|0jâa*]YsZ?D;_x1es<ӑ֜һX+Z^*ci57MO]gl {vqsȺh \hz7`Ŗ=T22F@2f|4VѐډtH2<K/zW|L^R_Tu#ց 0CB޾ W ˋ.T^b_O  /{Xܪ*Nφ 9PF)33"aurrl%/* Z$'Ԥ@1n Lؘ1Ua^[<jfz]nِC^EJ38ރ[gQ)Mv>OB/]ٰvk :mL`<=Ȣu/QC2XL:O/4؅eĿ >mh!^LXNɍPǽe¶-)9b- @XDR|_qt5(W鈦5ݳ:wKN- ND^&q>qp B9[+%y:40_T*Cu40{Jf[z|pS8{qv 1 4&#?FMYաl"EටyN~-Ab Kk'hlR/]N-Rr6$rSM'?:Op7IR_UmXrSj9QhCH~C7.2pi87 ^"=Xy;Y pXiBq ֢\?8[9[cԷW UKuaKf&\W\ЮmOZ{x H_˻ZK@fGvE\ה,8&Df#o:oWɯ%f=[sfYmw(T--D^lx#C5w~V!ۗ~ϑ,M S SЬ;JH32EXڤΙ] **X%]#%t!l+?QZ`.1_C ju>ɁjExj.w8obp|@y#ޏT%] go.@k^K-Tu /g.+Uw]D[2)_J S!ڈ[{y٦3p \ܡӵ[WH[? 5 9oKu2.TeHw*F2:BGD>E 17\_P/G}{CXK!%1WvB1ߺs砓/rTi5'Kq! F.\D˩]_R~Ԕ>-xߒlA_;h$* N!U^3y/?p^wN#V[+*Os"Rz+VO2\W}_1቏үysr'r 1rq".cЙ -3gq%߾r`[ncDž%ʅʄdĊ "BA 7P7ƲEzXq m3#bp%]lg+G!;s9,"ai,1;T) *E-W-pvlv86m{9 BKrc8q2ڎi`X)9܆+HقF:L%w5TNY4EkAfek ;E) x3F#Da_zʎ0 3ߟZ"Z_C`>5< 5i>&/BLl ];x%+?"k-tj:dg"p4l;RU.e# Bax;Xz ISmDs %m"&4=(WQ^D l$]FC @qAfWP硙zwKfcvc5 u$fQI:e;9‡0Qr: R[l3蕞@\ e$:hT? tt0,z(5rF Y@T%% lxAn^X`NovgE{zv;=]]g8k-l6HJ5x6p>:L5~{qsp[6kZ=Dr`(`ӴG8M7hL)1:** PChnWo\KRd=iƈKWoidhRN} \W#D'qaߏ0y@n ?#fy{;Uff &KR+n4IȢ6P*2b-$u2ML4`raY:2,5!vP'C/2_}_pV@mP;H=[cq5ɳH[9H̾גR ٘ȸg4;o[!Ȳ8p6GIjayܦҷ֦aL82I!4*ٖenb2 $HD! Bv9=r)9U,a[Eҥ1r5"׉O{BHB}I_ {^* 85VQ1ȭq}α׉֩zjM-^ c)$81 ԑCx֍|lJqdD@ksm,A=zIVIOPM cZ»[ ]S6+ 7,&М 뛂n(Qy4duݴm&5[6MW0^KfcΨxLii`.TyI:]hYx*7n`$&"o3ȼ_U6 9W͎ \i{̛&m\+_.?/.X^?jzpz҆mnknr_|Hסԥ}̊r4j}vz|'$:FPCtӕ4anl^X n;?&(})(W)92|-#7r&EקW`1ձlْtB5{D Γ3Z yzEDngnhK.t1&ÂBqy7q\UX6xoja… DuCP?2k/X N19Ru)̀ҡPe*wMA!TIsfO kvV%ţ*T*j1}iz*h״(ò.#K(?0/+8X fEԉH=󷳔AyQ! _M4r.<1bE l ޙ?f 6{#97>VIg>ݮ" F\<ƉE+'GXq\pThdDpOxez؈ %"}[L7Nש6髠JƁEoU>h;pgW90ЍL  j[yP` 0B0n|1,ki0u': SN|EdJ'nVSVӐM y `ŝ߯*utH E #$b j Ҥh둊?3cY$_Hx.PZQN[j6*N-t߄m(aVEHm wX7kϽhFӻVuM½sgG| m!}e-jit`'ڢڛlHd0RZ8 x)gȨʪYTõ_g !IښVw{hp(8&p =Zj6A0d6K~%gAL C):4FFqCX.TA=5f&n&y\AwyJ|EW ߲AAnQϏ*4 /lf$Tn1d*Fc9(4ؓZX$i2ӎl+ʷ E;f Mi!$m#-CoyOnRJ[N9+llsVWg;Cظ 73Y^ 1Jɺ³T5=8QapU7ӏᡘғD% FYRe5 VUa Rdu6*wF#]2ωT=nj#yʛ'R:-t4uch/-S/OC=D638qՖYt( fK/0#_1`$)H8uBvxNBeB II>eMB$Kenf:G*;`E͒+4 Omjo6X@ru( Ⱥcz7VM֡[o vB|]gxq ߒ MX%W~VW|rdcB] Xj-T`.N -e]zB u!*Oݐs4w@QU{K;011Bz P _OWVqM D>ËcV/=^g}d ǟtD,iU_;"/hۺ}TO ghnƋޙ/eߎ"62l.@`a.&wbW:DqاI$ M^)BMrC' Qخ)U}Ō{Ni; UQĆXʴ+SqV>qmб MSbIUqR3.ŀvd'WbjHU Z ߷rA#%OrY0OR!Yĝ5p4Ke{+CL0`ۗejrvybkuCCs8(4T!1{G^jiBR "\c ;AJ쬟;SAގ %wVG iVgU50ӂ6Tܗm¾"RDRb_]7>dܘb~ow' ҆Q+}I4mU6|k1M+^Fjb=BSenB*X`!eI2A`V I$o[znzMɌ8ĩٞ*صA SI)VAz'ޅB?W;EÛjbQa!ERК&6Db@wu}&M&E23|E  IXo<,7vl葼 ٬TyԵ"E4bzA]g\^ѥ C]0XIM{|${l.29Wu?(hTY-!nl^\̪iMLɨ{WSS-}XZx:S &Irh-&u٩SA@y.$҄B1q:8b.ԏ λ/ jKle7@} Q݁I'{?X l[?V ,[)5Gc zTEdN>H nGsI}yhHn-}^pRYFق1(3Q|橕)"Q E#xp}M - 2&eV|Ų^Ie$?ɪ%.u59]OtQ5uZr>[2B6xvJ׶}mJ&wU5Ϙo\wf')pY>OYZ )X6O .2lp)T# MfƐr<E$ w,f+G|:V}~'T v zZHg9yc2%JEQ[SS`]ʮ"`Mv"dX]d5_x]E+ 'Jў:(qIq`7Dñon[# J6)`^$;C5iJx]L(_W,Zdyj.&ox1b8s<^ x:yt0>,UŶ[A8s>IMfMOŚX,}QQn߁9VjX 2$An|ևQ*N[ J3Ƶ0ފ=߮[oQEE[8H#$*fpG"X4pZ%g̽sΧiuJ vFgr^ߏ]CJPI.m fuO\Q^!YIIe~PO*Rr'qT?]㰕{ M< B"\/[@R%렼7p9)FqOn%~A@#(Qqy eɱYRP/\p`NCM5g[Z@]OE?ETJcI&6cm98 {28+kԲR d3EVAvRs/wkR CuEu rBUf:֑-PNg9x9)ѱƺҷفlpRQ7^e2-|a 뺃X;_aHZh&yK8u9Y;-fnCAYh1w~6H/Af!V1z3 b(EMLQh nQk0Z\xj 㙜Է7& G c/:)r$3, tlu>ꩀ>Mm?Q5 Uf!}"ua4YzzdiJ՛'CR@[w5 i~iXEJ0@DSNp׏?kt<^]!oMڲ#'a_KVin'$tݖJz%i?"1lA'"9L셈k+2QnIӕDLd8F4Fn5zd_Ci7ӹB}ŌLhHaW73u •;ZCajmv#SoGgS[{! ݜ$=4C96q/GIYYAܗJ 5kx'*=eib[:Rѻ]'G"λ6BiO]3+9f1M)Jp_ѻЎ&L|xS<㇦8C*W$PWu q.pVbm5wԢ@v|ӄ,f!9<̲^cm{[őw%VeD20¨49.U4͝b9mTwMyu;g\ w!v3J{ޤSVq쥽m E]7 ~ێPX2:'?hRY=!FH -bEIB2K-U^Eոį_']5Z#BϦnoPb E|B&9$-k]V6XcЄ _>s{b57?q)vot]*:} $Ah :nZ+ZÃ0a]^ឺIsZ/ (Zs~P`o>rtԙumJTē\=>U`OBNk$Ph2鋪L2-ʫwr/'Qz#{ZdZw Hu雥i > _?Q˰" r ~qE V]7{Kky1AYyo 7Z9;0Lzw%Cn^NZތDJMY&h%\4Ok O3M^uV"L҉[ {BW0}k?@Nxbrw/uߖs bLt}2B@Kt!1ʴm-IG0;R4tZ?4拕1"SAEw><;wle 0 vPl~9H$8ΏxCN`0;S-U2(o{~g3uhL\F޷z݆Xl<ي5FL4Zo.x;94πrDBjKv 蔶Cau !"I[\,X}G@Q $ӵrád]kڒ Y&c-54-q b(1=;~!ڵA̜x1E7g;^#AU?~(; [՗_5sFu7n9LErr/-زxWy1}%p룷 12 +vJ$[mNCf==h st@KgV_EVhT`" 5*BWd`^[!ޣ~FJpwآ$tc׈x9?[?ۓ(pc9lhx}Ubјan_#|Ңm3yq!+*ߟ9D'Ћ2=EI/J'#Z(!Zԗ!}dWL7ߤo*UjԃGBmUaj-/.Krls;, IPA sU%\w+Ӵ_ 8Mg[ ř?+6{$:E\~R6P#&P.W1Ŭ!GV9P}]@[uTc+*?\xO^K3Htsc02EG)r0?s-IjxiAI2D9ў`t=剖zVCڬĨLeP<*\#| ,ݞ8U%v Goț yxƹ'^)TЗFmf{T3uR2֩Angݬpj=z%-و}klfnV|]ϳkY(O$gقFHА yjN)ryL݁F\]: Rl3$\'1r@O)Qve,E:_o`75(%lpD3w<^9"zŬP7V4ʅ6o)#:O]/7`k8H3vNWxɭ<!X:Wl}^[Hv2lhhq;?=E}6n3ԛrH,2^/{dg8A'KcJiqw(?>߬qQVQ(/z C]ZpϲEaxh'A#Q =ĔXg{Z@M_9Msp3{.mW >o:[FzoGEg:̿2amp0>yùEԤ ;яTbZ͊WIn2:<)|W=h~JZq ndb-S4g[sw(TΏ 'ʉ'ׄ`nBP4"=X&.ЩA]ǧZZC 2CgFm492/cf?`z^^gAޛp7iN;f̒25u =`ڪlwbר/խ?Oy '+\U29!B_0 !71-o8O\85|zJJn@+̰)b Mo'-H%L*UՁ/8@\ S6f['Fxg8B,4_0K N:L/ R.6hV:x9‘Epb_lLib0)RAhwrYKw 0rC4.vJiKÑ_N=㯕tnIUJH R6 ^~e(j( ffŀP?E`lwBO' ,IJ2@3y w%/ЯD#czjtMݰӗ֌ DfɃI2^ƚf)`TO\L;:kذmf(x`?*(sQ&/;yLA\lrW[ oc'L:PӕCpZᾆG)5VЕEףٞaM.MѫՈgk{O94A9sٚ%F咮n"Ẽ*y;Ŵw[119]O:o0pVIRb6/8[\"@MxzD #Ҕ+-ǻ8 Yzй/y/ <6GTqTf>+< 6M) r VOˁ w_њJ7v,yL4\1v,n\qš,foH2R0<`A8Hm2vVgun O 3vLn3>-(CX#`K1=OYޘMa{!W@Zk>M ,l5#v >\d(xrH ?rEPrxQ1IɪQɰa }l(k.8(erɳDOLMg2>M|D{1!>d{u" ShZW2@#&w빛R7mXAjwB:[Tp8d/LPzbK%`w3@qr:ۘe Nڟ(XksKAe{2]ɹ]rNseuVZE9iц[GP:mF׷ Ǿ:!}uc:tau&Rq|ggSfbt a0IU)spXy9h$&eHfa$lNKU Yyڐ(cf3ŭ_>:hs ev;( ﵻo<Gۡ &x*˘wa Nj;#CmۡޮhT>nB19w2x\w꽠nL6RE>2OHm6b 2jGƜM?w(mNɈY`W3ғfbx a?4I'hofWT{!>f+.Ȧǃ+}Ϭ"??s -9T}ډС/OůS3>L t  +g"5~S'ڙLMӮ4 P7552ޛjﳆBopIȟd^S`(6h48u/oCPx1;օYl쒽5ď7},z !(S_ӡ6 A q=BU<~0YPz9x`!G̰S Poarrξ Ht[e1 )WX1N$*DGWSGR+ QBj)p)}ٟ 5 eGb >k&39mnPڒW +`.NC(Bc^g:Rc|"GHb/|\KSY(ŭH n@G\lb\&$vaLJJaS:Js-đrW"6O/ S˨:#@L6:Ѧڮ=K$g_9ܐ^4Wqnen+g8Z" +vA -R'48V`dR+ U:kCnX!a7u+3Ӈ4&.h8Pl. 2 4va)ir| o+s;\k9[sڀHh81[Y WNET< >S.Q !; ຠs)7Ƥ 9L%Q}' :|sAcԫa _hj k7[]8 Wv@rM9E4![J4i\ϸ:tP@OYJ|Zˣ*]DWbUp;gfD{>ZJJ$+}eVpia9Fq ٍ鎮n9Q.2Ǩ&Tɩr:#0/sۛ av'C5ZN[# <h#NoDɵm޿ɫ n`jFs|s'|+uWH'YP TH`GifQ2ܔt&9ue/xN%H7xWZ.*pUOqF٬+P {0xƍ-ʠy- i:S"BX۵W@rg'2KZ3hα& y\nAR}c=6 `T?=#2ɸ8tvǓ/qSfϞ;'iFȕiDj@'z/,$xU EZ6 wf)Lr8Y9mKBX9IbA)9o4 +*J}Sd ïWiE1YΑaV&G  *kp. „֝yq0A_Kp*μwL(Ҕ+?Xp -lIsBk!#3l3Bn(9}1a+U2kB]f( :z)gUɛ &ܪG- 2EךAS&bBOwq5cGuTC,jzQd~!yuIPɯ Cy{(:5L-}PUɓl귑GA}Jx&(9tDb|=Jbrbb.uΤʛ076'k 񛎄CtK縢_QwVۦLhr 7 -|`f5h& HDTzt=PWdr3"Q p:yj{$Z~b}C'@:Ljoc8.f0[fW8I5H8͐_صw1 Y)Ptֆfё+_U$)^w4/k1P4ye ]bS{ c3'CrIJr[R t\omx׿tNwJ:"Iy ~m[f7b:g|<AR6@OUTثLZʣ TrМ)M[IHFLKmOTRK nvhw(\\R~{)b^Px&^ _v#wWIaZ)gvP3Ө\dI7Чq 3,\Xr͉H!= v=4UsڈӢM1LrU`ͩ~Q@Q.4`sCע#i'{ڔOcy*a`%_Oy[a,p~}73jR!=[&}whI5Dy4럪FZZuXCoAw̚s $gKO^^[ޞ*p n`lW! QÑ8K d;w)cphCI/]R-:M%ݫ-}ީQ s` NwGS\ڮ;o"ۯV10ݟ}8+~4+Ĵ?yQ;Ћ ̏~%&v' iY$h0L?GaPe>=6!9s<%$T_sgm`B#@5_@e B>i;!v9zl(A9\,\[%FMi@䋡{Da˒GshdŮǞc]gl D$̒)?Zwh$N`53qdnLps j1 [n s,"/4Ο$glՒܭu"ՉV)fͫr<ٗ#h^73P SdwvsWKr־.͏@yֻ &j\g"e:s8ۙ-}eE>z1ĽIt+xC&]fC`9ZEӢP |4Ii&םQײBF0Qsu[IZF>nMEϛI#d>LAU&;"!NWǑؔ}ٲ. ZrF $Mg7RRwFV;PH1Npc*TuF|ԉtGYM Y.c4NcMgmΛH3T}b3ct֨?M{yl. ɜu3lzi9)M%)h~2fTk3oD#(׾!b4hn9b|.T.IB@L%,\Esŭzȹ=b^7)|43Mq.b Cd!m3A\aG~HTUOqR%28^Up3dR(O~Ub6?oڴP 39*B)^ibQ AlR9bīX+F)R$cc"d7:sjBd9x'TyVF=?͒ʩ5B Z næ$r=׈=mAV[2q& ZzT[Mӫ7}e\xLڦUx& }!o?yDlG9>x.Ųj͠n_2 %wЍsQ%MS}U! Ocx:GV;:T9jj"m΂|gܿf F1Ö*#˵r77j8ry 5웖gd_lIo8 +LK6_JhGk#Ӱ](d`HGj#ǯd6}D$ҩpdu=<džt<"oc)bX7~JA\b8Ē.Z$["\ z["nJ$T* ++' BG#ĶZdE!4 cH"7xWkns,XxX8X.įF`g2}xή.{-2ۤϸ)8Uk.RȀBj 3֒\y`U ;+MCTHwLSǹi˜^ZչI3pʙnDElŽJh1V^f3lBo/ɇ9s8z#]^X|z)+K3 O>$Wt=S]51jW^Mr#y@ ;6{nڇп%dsAPQd" us:v *$0QAptTi&]I%pC?l9~pJ(_m:)3LEs9IDp[g}Ţ 0{[B]DoZvH{7/P(q=hRO^ȖPCP g }B-b c=z s![mwi1D-RNo~ KG`8)fryz?ݱiU!N- izk˂jYa+ZjJ,`u>H O?.g .\JMޢehȺiDFMddp[AFtoO,|f+a0hFQP oϲiʊA–J1֏ "W f1͗N=ܷKTE!iCi̥fGh*{ 2Uz{_IN5^4{K$m-4w OO[ɰ0XFfcNAfqDi5бcK}WB.4#ӟ0>\P2>񷀌\}vЊo7^|<B)3JO$wW9?+x zaA: Id D/Y 3R1xv?i˘LتapKWtˏ |+6//'7j:LcpՑlj39p™gUmfalr$΀a˫h+*s#*)V`v)bhj,rsKؓxޘƷ,IS`RT~] +A G˱lT+ l&4^)s^;RһY+̛ _)>\p#ڗ@5bLt=>ՑC=86)c!5XWY|u=-*$^BK@'?"yxbBU$? eಝe@ຳ0U3 lKS]\!-LMc 'kѿoOGIJ!,N& qH+m( ^,Wǯ4-\>ń4] V,ta~,} aqn5"lTccb+&ccY?|Փ)b"Ct\ :̈́wsS&w!v캹՞MZ(t-}*A=caMÐݕOȭ |ٳ SYlEdnZeYQa9o1=YU/mxKO(U{jfzICӫVdP_ykABti,]ڇ @7Ng\C"{.7${G(iִv)>1lGwIo\D>/x7rS qT5<@yσ9k=Kd0"fqP)cP 6K8KbwTsXgVQ'[c?ةRhQw  lB6LأW:7 &'Ѵp&FV/cf[TZA_> :?^Cܼ@yWbx /Jn}Z*\i~i r$`?!.Dq7l}IEK'0&e9T7,oV<0 lrg;9fu@0k* -“|wePu"(79uT_x0 J䜥{?:%Kht]/n$@ALlwR;33Hx1,B0H["!pFEhAn.};ĜNq$3)xO-qNƢMWC X&lr2QE-]12R 0v,7Tì'QufZTgAݰyTkF8I@C0RO-bD0ʵuQ؉]xغ,LU<ͬꇗ"2CFYp*3xFZ )S Z޷oii}ϖlTnl%ɴ}`qQJCq{/|*"h i ~/Nc1]AYML"@SxhLQ!B_,n!iVe6Lz%2ZC"pX.yMs ĚWDKC41~@,(C4ܮE?7@}Myϯ612exUBf{/63}e0ZP>ʐECA^!6";|i*Bo-Rعs._( 쫢iy>BbӇ3Ҭ腎rZMkF}Q a# @~#62 |h h5C0BmQF%qQb8IEhUs6Y :sUtCG#BħZ&q*R[X@Ss(S<}0ڒ!Q[ ]#+&= ]s v!4? ߿YRSi/k=)tڷ:M`trs' ᇬ(Fh˰wKWgX%vES)PKaCJnXavN6F?J4Fԑ6*sP_(e_oπMm7}P,cJF_C\IP#Y i<(F+Cx J`f~,zco*}AG/c< ?^O ?a>]Q">Yѵg+*R# @$$Q{/Sp!,Jׅcu {8ܜrbIZ:?X2eXf~oB~PWJ%9pOvWhj):͛%ѾD45zRnW3l)"QXoyew /QlF$]bUԙ+Ch]+^- ;` v+u䦐ȘUbwܲ/k-K B([Zc;8Y{p3 Aˋ,_>İ/B|rޗnnJ\u G8g{&ܥRKx272Z7%sߠMuhWB˽GD|uy<*_c -p W0"*!&HyNb)FZ+uOZOsSM͑!)smz9sFQD;-V4&ޛAkq$05^PcJ#`׬C%GOFPnAx[JilW`\;^\ef*Q DC An'hOW ru )CEg$}e;w)"TC?ÛԻTq4vsΉWOb\NnbKPRvַj0Yzy%8J1+1 :;_G 'ahjz7|_o&ڽ ʃs |Ӝ+̐YEZM;cʰgሺuセқc0ios[0+3>#()E~w`I&l¬-{z/g8SME@)@ -\f|ha5q۸ '膄 чOoސED$Cd) YI'&c E~{2BE&R∹6,;Mr6—gL]al}>rUsoD`Eyi CʂZ69ŹHKРM~k>SRCNHgSm|;0v@W"};f!YXQ6V)o|Dꊼt=^ڶ.>i+: t q`bg=L#x_ }ѡzgT5j v%6y6;⡪yrOj X;"?qFl0ȁ<>DA,-C6t\̲zJT!yοRnon.| A[l"e YqP 1b!'zaQ_6N?K$^H)Ko-&E_7nix8TZGPC ?ϫݍkc)>3Ϡ!`]I7I%PRZNi?NxףyZ7 >sV=Ce}@Ke(+.YN](*co^gb#XAjQ/2wc/WS,5 1w$6t@C`ꇭML5 ʻ <)@rE:/ՀHe=sEL[E{bJQδ?#`Uwy"w@7NhgPzV['m@2u|oGA <學JQDS-Ӏa1ݑ%a|^/<8t1f.T9M{yoQ|p K| ?]]Lup1O|UZ G2|ꂴE?s OSL0\hJA"22x# - Us`te_l#{$̀VG$1M"%?ͪ9~5CR_9U׻LxȖHP74NYĵե5H*̖PEjjD Vs`[fv4[5w7yxJ|\Q)J.ձ.ו)KzClUhq5{Ǻr a/e+ee:|>בf"rk|XʼnLtCS~SC Qc׿W${0[qͱچ_8; ii Qu37hv ݯHEE˃E~ְe(Ύ,m4H~7ݪ1yRu3%B @utgtH;˸Vv O]I>NwralďѤC?'11ƫHGNͦp>kV0(OԁK=OWf3ϣ ;ŭQ+3>0g~ TtRc8#W#o.7Kߒ eQ/L N {q0}?3O~[#aS2zClZj+;S=]×X# #9:9i`s1?ĺ&O;S܀љxnCA} ]xzԹ _ew;[ 9!j pr[9UU^6TƣbihmM{bM4~ֿbJ &pA81HgS}mbim@>TN8!…!#vq0XGW~GBV|hvX@҆gmvuZKU|h.3 O2q+|nӜz=MyCOL&|q=_3)/'9{dM*t饌ewy&6`)$R'ui4z3֙YT_4I[Jt}m Ni=$9sơG[I g΍@6KiڏeLLࢍj|n Y[̑DOJka!ٖɔLLMG~CvL^ 9ΕKpLwZc)0xS>#q/4C%M.XQz$9"4ógG#װ H~W;Vͤ(dw6h{Ugr^ř~/*?{kyZle?hɇMnٌaߥ7FdR; 4/U@6jc#۹XuXˈ&qQ\RZPjM/,>E(|3ZQw͞yy'?b72ٍ;%"ٰхUց;`*HԁrZj,j j R{1z7u넼"W 7bh$e^t h6ʄ)u@E=L̊(,3=QfS?P[ӌQ&07fgL=%[S%cc͙*ywcWn2t/oR2ZHB}X/fA9a}_ '`N٭דM ߑ)KfO#uT5O\f90SVcA=9!h=Ͱ 8oʋw8=DR2&v9VR_i7ܾƖO<5F;%lT{(߸}U ndn*{dpNY!REמe}x2Ib=w{: tF<~O-{dB[.~Xް7@eP=ijRlzW}ItV*^N[ `&8ɈԹV2jNu_Ǘk_;+aUU(<'UrΗꐺr)E"eU2hszOuiXt3OzWh3d nn襉:."dr:%fNQ1G y񐇯_F_T%4{Q+="済drgnXz?v&p/ B҉TȧCckj|R;J3$,X$Yd~@]’SO^i)ܾx|t}~ E;'-/x^7㙪 J@|z=:ֲ0Iʹv\k @XӞB%εWeIzn=/ukZ+%F˩K%1}o"z9S$,A%mdjy6m-L%8]6ۑ_ͦ۝&h8"U}M@g9⒊Q={B1JWr aVM>&MDjihq "I^Ϝ1ɸvb\v(Zk Sr,hsN|Ң+Wg%[U de-=LP{w&Sk^qm,"R:_!j`~8 na-,`wt{XcY܍+jۃh:hB=2H2qK@1td6Q7f(3gճB[qJl֨xmѵqAgCzwrcM dVKP{Pkv e;a`}.Xe-Q#͊9rsmNtFZ%"T(m,WBEyKrZjG-cpF+>ں:2 ڏ=e+BcS U"g BX~a\ֻi󥩀diges끸bY#F* w>fi^y`ŴQph^K\677L׈,-sH~IJu䷗9ϗI*W UޞjXm|ǐcdG1얳.N۳̾zc P<|e1)ʓ hr Kw Emp~0z5 PfΨCԉB4gzZzIE#e&BX#66:0\zF'3 t$u/P"8JCJq![[XM$#&T:6MF['Etj:2ѓ)ZשD4qFƍ'sI,I:Aw0a $jk,8Mqҿ 0Ub\]Sej';G|J g[1L ܰ+ ć"fQEbL7"y8\XoNǓTȯ Q!mXslZ_moSk*r#һ sJrKuaG{h& P+}JdN ~ͮ\OBc&UX}4 vzƈzUً$$I*"ݐR8LF oZU׏2tZ z+  |ΆWbo dGgpfVj+OJTb('+8FfL4MBqxS6 C\7YRLhq#.KVTK8֊&+&0[E͝љ-ݣo1/q BGMKHH$Ehgd߸<ǓKpL;# w$D$ǔL Sbw'΁;M[X!.b8+ASQmaլ1ˈ&Ⱦbin@3#;Fj Hq"yTT^܎X;/@c-H2 LħWd[€;k ^,Uh9|0Y¬_V#$|8!EAKw7ڣb+5y?د20o6h1P`_z}nu#>N5W]RZ^AM(GzV9)}GXF ] ϐ.޻toVT H1A1o6+P$w#,y,RH2󽺬Vuò)N*,+BD[W mPpQ9[fIlplRKkc%\gI[h^[x TnvKtw)L`'2L@li>XZ?bQ|$r;\X?+0Jwa{x#J @R2 3d2\ 0Q+Miه(كDko@lS奣惌꩕2" 䦔Ǡ~ ׶84PN 0#i L{Ee5{١?NyCY! F".ΥW.10{GD9Dkya((@6!{|ypkH15Ch\B a3d+B%~٘L;_\٬0U2z~&mk,Pm.8ia׏[ŏ?Bw7@F]#qˈZYk[2gE0$khʦؒ*{ݷ\ȔXJ!!/ҿ#o)?T '/$ $ܹ $^3h]>ڒ aZ: M 3(LTd%I f?Il(/%R2A'Ҵ^*t&1Pb) 8ZR2I1{,34ZXCBϫ[7^x|I[nL#[d [r3GS( k}+_<H2#u l EVR],z\N\2GuJ`Ocf-]44f6MVڷJUDz++ "M^Md:W@ DE\p]Ћ/l7,_`O:RtgaaY?@vښ2iZJ#׭^uo90VZ+ ^y \Pv^&UAaD+OX,Zqsʵ2b۫+ίIkɢOl>x+&g@qJPwC7uHhfObMI,5>!ǰL"]qRE=LxP'pA#5'M< uc75 -jHE5̪ ks XD^I<*?A1p<`GIl/VTD#ڄ%KVo\BJg0DbxcfM4iu ,R[G`VL!ZjW:3V0T3`~)t0%",hadۓVcVgp]{QW;6!oukͩŒ}3[;rG0t>jO*jMڪWBu[)WMr/t^Z>]ez)62ht)"b{e]oTznoNzRjPt2 Lpb?Ry.j|/sڞo^^ufj: p s(u}8i@YD3n>LbshB'R^pKE܌ 3E,I>*'!4'K^&{K1:Qynǭt^MLE~{O3nz`>Kri0u%kc=,x}LRZOn[{MJ qhObAV'O魘.瘬<5\bJ=NA!U6^M^$Wf*wˎhKGe;;:&T_q =Γ=yA}4VZ(*qPpnjz64Vx#!=}g/E mB^ʠnu.y8JEN  m:G &-Φ^ge *~7a@ml`U,_vT( o@S0`k5I5h8xgi>z1[PtctkK0tfl;rl>FuM]ooÝ HRD$:tQMƁ .#O ed/ n,4 kP7!Ř`7Sfs/*7nD3/ 0'Eү֬- ݩ6.ᷠd[5e|ccLqhRfFZ@Kz;r5U}!Ĉ ȷSh,$<;-Do08bxRon V{CIcb<Pvn!+"*kU$w S$+Ge$XTH7K"D!$Ciq??BrO5ѐ<( Pu9AHrv^~c|wmQj̸~aӉ׸vc pYʦ%ֿFF2؞WFC0JkW'bO&J=cUqO/J^YD=رq'fg.G6y8DB_;k/|+]"Tw/4}sԶ͹7)ukg gRyլ%{Bc&25tCЊJV؛ײ=_ݪ_P^Xxi0 oQ{NF8d'Em 7+/`z*芮%t%fdEzݡAz=-u%iH_ ֎ U1An J#B1 i G U v!@ـdH *AbVE|SWZoqԶfOj4y:0'o*iv_rY;ts$iZu'P6칄 \8i< ?i6c#ffj 56?s"!~8VǏcJZ[MqW'9X0@i elQ#+p]cϲ871M=szN[ڇ"e ӡךa .ý"Iͯ[4x,k "豶߹ykGHD;JQnA}+VFF>}&*h#''x`S.06IdI^!odW],*>r sVr^KĜ|ddrVC?d.Gȇ x^ct%M:ôtNʠ=䅙/%UwH6U(Mvc8 At0?~.Wň )݊FǷc3=Ni+Kgܘ ^olm29,|SN(/y;4kNlS>k_nOj^ea!w3R]^=r8s y֪ϰZV$CZˍ.1Bܿ)_%!#Rs>x~*v$+: !+ x悜\W0#LhG<~H,V9xd~:/Pʉ)/ InK~^ f0n5ҷ!$#5e*TX.f_1Y$.if엦O?B6JKq!_gZ<7Fòft?[|N9f|N&f&4dq!+M}]r 3׭?1 /~eSn#Iq'wS \C_{Y֦ 4.N2֝ fFY~͌¾ x>n`ok ]HϢcIi)g'7aOwe[B\ӟڞ)O~#LmN$(O]YhD[#e>ݩ{mð~~[8]]j ouT)gˌba};FLqS@@Hi .t۞Ѝ]-^*rl"/@xMWe+jx$T`P"Sk!w8k+C4tm%3|kay(¢dɜ`vűn/_ ,kğ{o29%a 3Fɣx9>g0$/19 Qn01^GxlwK*aKeooy_Ȥ5_fʨغ ;#MƮ+o 2QeMfǫ^Mũ8)Q7\>{SX9 ֚_V‚KV*IjkV!C,eG/S9dh:U5 tlZrHD}Tr=b;~GOޜjU-yL kU 8PQ0Y"o }f*Y=uTC1 _G0*ݺLd<2\,j]Xۃzb K;+9`1$CJ8ůj%U75FH}]at1/x,#$s8Q/ɴ a7|rUjxZG.$ .u./a~9?9aG!pV)I n1"+dI\>[Uy,YyPqEtPX^ŀjz }Yp5 9 +s<;=?A>("~yp)%VWF )׻E vdK`ΔvڹlAyjo +I-Z=')Wd!qLgJ1c}F<@i#MMTQXˆSdRoRcsO+'F!fy"wъ=]la<AW'\zF?thQFB[2(I0W:fo:^Ґ'^67F$A@(.v~dp*$eFGvT6+%21asI5/RSqHJ߬ 4\S13cp6l#6җ%yh^) \[Ԓԕ=/2Y5S)iq;Ofi5oqq3ҐUUAhB5v.kgEO}۔1D~0!w8*MzЩYK^mG;=i|?8_E#:pT,Coorsl-R:\mnzÏoPP =.WT$%=ൊF}txlJzm`nYcɷ[c =! TuzLuIo9r99rfe73L~}Z-i㉯rzCӣxɪ~vǀ8uo$ƐD$6EӵՖ*EcGw@nR5Z*8Gیngg|,L{7,e[1NoF-/6z:VU>ַ`x}W;-~l.&a=u8Dr9Zdgw%p=4~-]Rn 7xB6m܂9 9tjPXw숰wҰ+T\k=k>;>Ok2 s1c0>sv7U`G{:dKЯ&x̉[Nqr'尕^BU"̏ð.LC XgJN|=,9 p{–9.)"Dg؋` ,LාQx$\j-}J k0A%gldk 樊n2>6._ `O:$vk'{\8wca5'douI MϦx+^8]B0d+W)7ܹ:PL}ot[X.|JL5>˥ejI@7bQ>h LG/261ۗжC&VeJ'ױ7r y{\:$<&$MbN4@uD#=&h {(_N-xt M)ɤY2ݱ=cǬPpub*w ց۵27gdfNdWrmtN-_i{";:>`jpCsۖA|JW~q4گ80>{mv尽P`c} 8u1ȋ6K蚌hx/ޫP< ";Jk+ Գ@}ihh>%4!2G0y7^=N0dВѼͿn38bϫGwd&,|zwva?Sz>X x +T!ﵡR*i}gJैI^h*芗=43j>伣k({暣0B}`aݸZsJIzzP o;#d ]CN1vQ=j h3Q^kSDW :۬TPVU n%ڲ9ף^,D)D0KXa`ɍ%=8ߚ#(5L8\~T)&O覷ӿufsGxuX l).aV&.s=`. 8ReNgFYE탼+54T lԐՀ~7tgZ,pr/Z+/y׊%3GXymz*0'vD}gOzW> $0Kxu@Ƞ[Oࠫl~ȟ=-l,zlg~vy)5tƅy )4rJg /+;ζ_oԄޢx1X-)z}'mi!j YAjƥML$>dP/ jߡvtlz<1_7YGy4ߋS0#F Fh﵂eG0PT:DN-8hX۱ι#;-uCg㘵]+ ܖ=oqY"f)xOUʥD{(SiS1r0\*k{Α%)qB~^'Hڠ9`[bbL}KGv3Cg[~Sa1MCyp;綞D . ܈ PG@]H8F[hp6ndyN~qk#v^9趮;#gjxlWl;}}"'~1?(ϲ+G'~ú=C.i 8[Rj5~>cӼaFEjQ}[,Y}Qlm_K[X uCc)/[}|agQLѷL~#{|JA9#d%k-2GAWXUJ]ؿbLo}XǛK'`#N +Lp),zEzx8ATƊw[K ^UM0KsHN@}qEYg/z*+: ~WT\@@5]ʾ w`r9uG2I)( +Q+xHlY.| ul\Rؿ=Q S7n%ic}Nқ\v+5 ĪSJz穼\#[ ԣ'|5*n65 q*wu[㫙gi%r_O:0n% BnqGjo  @\UI7qVR̺31Iȃ=*O~gډ?_&".,HNa4sa ?$IU;un!0&ӃȢ̍葓Uj~㴒gx7[R0u9 `tV=9bU@NR0wF@,+[4Y LWtKɞ"FCo/w\%=f ufR>\7ً9>:$ɪH&++\rVI5h8{!zTvaF ^_bOIKQZլi5$BɶpGպ5rW&5&B)x\1mm9xՆxZ2ʣǑ*F1X6j!lϭ{$l_"|?ֹd둣h/>1}&(7syPvDn&y2Cmԃܲ-2gi/Ġ$D^U#b!Bg@#/P+ʖ@}(pF\'P(Օ\~ $&`6z:Doe Fږ/33-@+s N~+F*T+x|.MM؍#ȋJB?TC{.Xb6bk=;("]gM<aNsʯ4-+ -v+ (w|c-:qb? ] {5^hp9+ǡNFvN/wցN94- 7l&U>|btNBId\| ܀XVVi#B_0MuYo oa}<|~uSBE0I;q?TȰjM趯?]>|c,HPߏZqڳS }gAkpֶ KӨxkLYuS7 T)n<=e~F\6Dzp@*6ɛHq~8oTN)o[b;Q$qPNrc7Lmj@#9RSuA5$ۏwV$Kpe_*{ +7==:ٜM\\zf.gyzKqk\>ڸS39Fdv;7n픁 zzt1~X4-EӀۥyHS 7Lϲf?>98vP_ [-Wm7> jXDkD~آ @Q/CNB>ìjLڴ7gCgj\je{͟l4|j]8ܧ5d?\`P2O[._34{ u]hÏ1]4V#\Tr#8a,a-PU c?Z6Ljd6)r>rdmOɅ\Stfse=^]v kpA0?08EnCȍU y@cJĶяWiG,(6Ҕ~HڅF2{ϱŝ5p*N+5lj9pE!(gƫ p &H5);.X5/0\gd%27C%Jc`J_= rŞr h9!Ӕ=ҔT؆b@@(m S`]C--y͆bKUd/sxU]bv-FplZ4FCI6M3lޮ}4g*h__& 娭?rB VHigH|U1Y=V ݛ)Ia բc<؞`$8,~{DfT r")xO\tO T\c|@hhBٵ*1;K6S%ɒ|pK`ۆzL vqн笜!/>VHW+<5;utD䲎'H%N&}P 3 ꍍa0;eEόGQw;- vx"Ԡ2+7gYVb12->f9Wh}n!t\Im4Aw1 ?3ԡEgɎ@騎ʤo_EꯆV^g~0` C<b | 3U[ּ MV߷S^zT\@z,*vM4Y8X 2O >{C랃ezH9ΐ[_i vE\TC%zsK j}tv W]{҈"ÎWL<Λ[!qLtdUgR*=pݦxȻUV">ֽ^v,+hZL;lڜ)ot!${QuZLabwah뾼̺dZYĉ3T#hb>R4fng9Ÿ.bx;-KOVң1+*J<=# S~^/ش1̠<$5|Jvp 1R8:Z:"ѧ] c(AQfjiWg(k2iCx$CcM-mnD #uCSiAT1N@kxhb3XS/W"uTr4䆧 T* 4 Z@Jyh75rPlc5z#BK8mlU$7jpIqZ=Y30 ?k蹘'mR,FU\;B3Nyj{j w@0'h>l)A2X@]+08IP;?/N)x8/鳁$w(̤4So0L9,ÏYp`<{KU$WL5;~ &Ѽ9KsҢG}inkf(sBgQ Eޘw.$ c~+c_0x" %h8ƘSXRT3G#_)OB^hj:5"3lD14vfF͛‡vٹܽw;N70K&گYܼ88~QtPQL<B_b1/uT԰wzkimje3(uˋ_wz(8<ܕ(9*8&ѫφM41ں7ltSvc꺄j ݱ?"ͼ黎TyvI  b#q^<5;QosM⧢`SQY,w,ʙ?Qƥ I|MlEuDQ`V9;fJQO)7.c߾`Ə8m|VWQgoahcypr+MO)-`LY7#9xDFOuZ6RcPmY7Lp֭>SfR5+hkrx,fsċY "%*Eqeֽv8>NuvGZѠɉO0yAwiH.W6;*|gTEUTۛ)%y~-?uOtzUI;aY"lT֋Q W!$Pb{AwٌN^ISٷ?4M3p,OGAz7pc9uӢ2! 8DVM.Jk We:msb~' k}E>_*`7~` _arY?|s=Y,9Q -:HtE `d#I&ckdY,n4Tb9H_AQArc_0ZɊa"k̻K\ش#v^;7kDǕ@0\{+!>6  QdD:8xl]i}Hil*gbkJ43.Փ*uMFwgSa-t_ΆQ"'@pR~d2]#fAZxш{l fpf͐6Lǒ1u6CL@~,YeW֛PL۠}ؘ] `ɨp(Nx]*a7/ &Qiz lXylUpgfK"e :Ɍ?;]a| DgT!!?(r :s]pJ_-kLVmR90F1ɇ2~`[p t6 8FAM}6i]#۶"+r!Zc\yfrFIKm z,f.y(7֓H$>JСg@ԢU*"n,A|x]+q\Xa8U6`Ui.kC.|!71Q"XQr3 ~\ЍRg, wQc0OyMlGUAAōbҐMsm'qH~Bv#e[ oħI=6^Vzؼ. %5مBB}3r6)>qΘ;!AZR}IQh ܏!.>DmW3䏬ZzѲ{ ULp^t؀ɤoU*s),uP抪3@l`G'\yD-&(U螔d[e<}Ċ)) ЇXVLDOwM0@셀<%y-FI n( xfr$|gTNQ: юj_B0+@)TT~J/QuS 4Eq-M?.Ez}TJF qt\f'U(op=t~M `OE  ՂS1I^ 2\[GI0A#Y(w;[CV9̥_v9,3 ysGpս~|QlVv٨3#3|Fo%,B8&aԊ'Zhcg fPH܌TPٰ|e=!Ҁ\a$M3lq!dӁ9 ?NXx=zQHAm*fqEt/<}îFh`}4[XyEZq)ge P9#bх0x%ǁ07-HktWa. Oʭz opmC\y lGX?1ght\6Oѿ>sJWYXqtsz\ ʝ%+7e`i%#"j*gOJRG5"Xhm娄,S2,=z VSblj8d_6l\1>~K??Ki=B4M$s2X+8,`nىQ0%}|- #ݨay+$|?sxci"#|۸OaI+{BEb1KɘųU<29=A6 3ͪ@8?:PuDhϧ0@SFz=azXxq[S+0c *TC[[F {HꙊm1V!l\ƥ)V2`r9w r(Mty\e1Q;dDݑ94ۚHmq@1**>9o)n>Y^ KCWߐ3 ht$^2\ 6Lu]}O %1Ͷ<QLfOʟ2=Iı^6׀.4B-ަJ6l=?dG2F4`Mߙi)}F6rpC 9b nQ+- I )sf8Ocon摍녎b(Ήr7WMѼzm]S`2^`ϯ䦓_- fJƀB.=1Lfc[.[U6X9q{2pR:0SI9+&HW¼c|V_#ʭ #Jm&+N^Jt._7gD[]6}ok#]%>uB_z'ԟ'VSrdΣm1+}jVEǢ÷ɇN/5{H& F|YMxk8/AoQ&*`YrkQ5`z 6LC']f\1J11?j% Z5gO},)h[`:nHR+gMa+sKwesx{\H_a`%ϱ(|Y`BjKڻ9FcA{8V5xYm*QJ HYf1ƿB. J10[`UB4C"bT1P \?c|s169bn*&sYB 9pvbeɝJܽ* u*,;rUL^vݿ;Z1(>tM q2[q(Oζ9@O2P|OH ߦ^ci:Bܳ^V/"4T%%UgDU:%Mow}烼,ƳφUKu}Ք9Od3YtØ 3  I RZ24ۤHP r3C8AڗWC&Ƣ;l} DZz B7B?]mwn dJ 6z#lғ?-n" F1'0+`z<tHl,wbP̃g+yLwEsHetsY@cKrAT(B_C& LlH'ʑNاԿmA$6iU!1/ܗ4I"ÇY:_]սOD(NwS?*w+uqPЦ,ɭm!+|H%q8X^Y".-7Y0V~ua-oZmegTҍz\gi/jѨ,D@UWY2W,8;HvrN=f t+{4kDof˦SLډ:,* r30X-f Yo⧳O^d8|aܴd 7ݞzr[3~AAɎ"h|UgDo:E_jtfi]o_"w1t,rPe=.|ohd}D$ VFmL|[parz|0Uoo19pvX'S ;[nﺸPH^`ЈǼh_KUϘhkZ!RQV 0kDT7 ]G%ȚqV3LTbsS EOŶ/|,_dxql#1J鐑iC Ug\R/n;[AYN_'B:1cȦt)o*wU _LamID_9h1S4ψɍź,.@'[N{dk뿎r~D_@dݡ5JN򊤋wKOv^aP|;_*)V.}T%Y324IY8=xw{V)u&;m%׻4~MnB‡_va&,@:V`|;=p'"H^*+Q|)r7\k4J- %=K YI['(W)aѾ#@>$ `LN yR=`cr[-/ \e(j4GN5)굀 !<ʫ9|ޖ6"U&\t'e{vY"7<1_p:}.kV_<`aYx_S`"综fNï W8 +,1)vmG*n,n?91,H* j2G` g:!mP_[(w[FdSE <;"x[X@;UL&.ޝU^FV9\FrdX(*dHP"% GoN%մsT:!ad! a3/V:_N+wkWA3!Nã;aF"z "B40ʿ ḿ`f\ɻopS>b0a86M!uAu⥐g=6UG\򶤛Y/>W:mr71 ǛBKYwf];ъ'3+h{FKyUi2.| 4~—eA :~83@ .rUz7W#$%ΤPZ:T:x;1T&MxLl{Am-\Zre]S,Z%Hl, P+ftKB \ ;^~fuR~tĈ:$.&Q}fE>PG!iJƒa6o-_$zհt|ڸV-V( I!C?qAXIi^om`$O.c ,@ T &nbo29: TF2 ݃g[ӓ،AOuY|UN>|?&U}J M&{0`YcZX˪Ɋ-~=+ l+K`Y#} Ri}ȖAMOm5zq86Z@Z*zc%l*4pˉRqWp—J*5+Y@򅠽`<6:wT׫\ŞnPD]qIMDZ hBnmz-V^+nj@zHSh~0! Ex4Pèg_cugͮ QYӞjue£o?!D ]31ѪB'W"jGn`jla5jj0yuHCWf)bniL'o+ BYUOb!X)T|",YP~#&ֳoPTK1mh#3dךNeCo¥bȗz_WE 1fBGBt]" IU噋1uvP%Zm\x^MaE?6 ~Ɣ W2aR`Fq14>E{z3MdW]Z_}'r1Mu7ܳ-a4`ל~?[CGsf,\{!LUr'>W3m:0',.;\B'&BOQ9 ֬/B]G/J*g<A[Q"T~U?! wH2MfP5+ 1o\HtQ*JdE= E7\ס@ath|]AFU~@z)YMKAhOS,Ǒ+<+P?E`e+^K<9IࣽŲ g\y-wXȬU)w*.hl=@1+Ez6"TK 1/ژ9Id{] ` 47jotkjoVAdrLqQԫ@y3kxo5ƍee}Kݍiy*? 'Æb]{3##ˁjGnңnlx,Ǭd`ujSf3(;UgJ:þb<2A1;PmmT5CI;$ 8 7|LL˨u"5SҦ3,dԑ8)i4R5.(B_5V7P*WX+1YjFϐ@8׻DhVՕ9C:פ=SԎ?VI]=qjP5dC%%%^3ޢ OfoGz>y@w=SiM >SK2ko mDEvݭaɾ6gLT^3 İ3u0,;?sNϼ%&?)xV"z~՞F*` ^QhT;Q8{8 s-6&PCCMx43x jeH߉d#†iHU7~.nau}gd& iR(؃W> %TQ[QnBhvIC%PMĀmб(M@OsLa;!=r[d^lWǕムΪg ሶU~|L>Y |gAd\|c3jwP3UrcjYR-qىI(U=5?ԯ C*ޡ;i9;8no2daXD2Cw>–4B~LDfAþ(>FUh2#3FYO!4ɼPg}I_o?nOp44d,?'xzp-̚h|>yMeNGϳ#$ԣ Dn*gC8Nn>'*GќE=7‘ofG9'gRTY9cI S#1]өy_8 MHwfԚ;tBfؔjH?Y V "ӊ{M1B/~^V3kv,BuOsSAg"p}ByBlvv/_ Fe/ 9T?/Q1$0T 5ӸG6;jZ+$+>#L[0y0oYn ~V1ᠴqd;z+z꧇LqhQ|-.`E,ޒzW/He^?ɃoghE3JכxeoǶ!Ï:@EprmzILXKd}. pnۯrp޹Cjj}Q;q+j`J#ۖY9jmZJbu&Y4=lLD^g-'۱83wH_J@!̞ WXio:t](p,<b ^r#*E%8u˩ o^Sp-<\;BPj'G׭M+xKSFv \ Uo n*' 6`kؾ }RCl҈4 oLJKHd럷9]O4|d,-jpCҜۯ<9M,i5qFb$X=1|b>r~N)qJJN#Gs%ӕȮ'@*l6`Ac{?y[biIRAԍ*O6NcY*A dr.̻-iqr16 :L`~6qH淕=W1tlj!!-t_iu3p>:<23ӵUXGB=|\Vsdp/$zlQ:d{g׏Hxr  .{L $K+W*j _}^Fw.LϘ/]D2L9)ga = ֗<(Nݯ_F5"QQp`MfM-3K+QD >TyDZ/[0TM7RGo~:L}.gYzIbYϔAT y UBB76"װ.᫐17= jzik*"YH+8_ `^lS"o:َqNѝ<!vgTFg1}Z? 7qbmƿٗ} րhyY`y+g;.TY$~Iz' *Gٙb`j E? ސ]dm@ e#Xm7S3޵BJFHH$ ,6HP#׋cN+4l^g?gp]t"bۆ{mpyrv]*)'%s}Oz ßJ88y  _񻻵lGq*gю=6k:ngZbC,EšVQT%2pIR'B} ~\Уx!Wxe8}Ӛ,V@a@ ;7Hb-PY_zYPFUO-%52.m9X`RԍWFzG`orrUEr|5ϷnE:}H`sI2fGV~4G5꾾fV%Ӯam[16=lƼ#Yr^񼈃ЅiWrNLP[G)0Hu~)6Ov(t"M)_h 𙇪~fPO0H5B7$,GNbgRBRIױi"BQ,Q)9L] j*IT|S;J0apJ}Vu+* Z]/T%87]mfSPVj]{_"@l*hDaT'fC'T^ב=wgSk3F`I㋊nsJQJZ{7m,&K< endstream endobj 596 0 obj 146154 endobj 597 0 obj <> endobj 598 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 599 0 obj <> endobj 600 0 obj <> endobj 601 0 obj <> stream x]Mk 9n& AXvȡ40:IFŘC}H[Ayyߙq襻vF1K'mHU2Q,oK3mBbn ~Yo} 6>.}չ/`sP8:O=iv;:lhoqUFVD/̄aCӶQr1S]c#WיSSᬹ-k~}cZO@_juɕ7yp endstream endobj 602 0 obj <> endobj 603 0 obj <> stream x|t%m5N:رm۶۶AǶ;V۶m'~?5Z\f1j+ 9%]x Vv&n.*v r*@ 7iWc[_\%EƮVbƮ,n;<sgk1S7;Ll t#@@IMKKfnnn"1=; y66=$- tuuad?9=Е/}q{3QS+f 4;[ٛkl37GFu{+'7 w `cb`@OSKy9267qtpۺ́/p>.@ `fe 0ZXwaƮV]&&&f?}f^`loW'@`fff{bϖ% 񯨒efW tv[?F Rup2ZzLL]i`ah0634m6 +[+GG?fdIKQ+ +=௪9?;5ߪtMߴS?0{Sa{ [ ?V.V@3%+WS[?u{3=PߑeLLoP`77LM̬-ol_`S7gO_&[ks<@O)`(mNRS%= { m]c ]j]l(h*0OLj̲ 4b;y4|.#kړ׀X0yٜ~Oj/&@'mC;㇍ f xQ#?! EtvTR(,R>WTnMOWE 'aiwc ЙhK6 |4ZM%n`LjaYl60pyljۡ_ ީvְ29OkR*Uo*1mT"ϕr7't"3KG}FնsdX|'z%,g^ӮQqv Ӆx!ڃeGP cӓFo^O.2m* xT-h| G_tv̘֝ꌫo()D`.M %wйnശz8m ,iHdTmc&✵< Uoւ;a5zDLfL 1-̱p*FIX +dQ1ļb4Vٙ7s~zm !`ݕ4}#p^Sv0 I̮,<ʼPo\eg@ѰB8S}ȶR945V&{ 1|Vz]ԉE΂R ;Lw(i"vJ'\Ha+x B{7pRm:?xx y'8.?w_!$sUH!Tq XM#IZ@sgګhR١q{uK ?DnܱUSullk)л*Eǰs~i\TƙnptϲLhCű&x1HB@dYVGl'70~t,aRE2a}5kMƹyeb)efCS1L78o !cuDaeOxXNۇ+ C9jX g)x>Rvr87t>6X?OT^lr?s͆Ĩ> eqȇ_,j.sm۝v>U ai?/)ˎH ,0YK479u*yNCnX"H5 ޤk aƇ <ބ߽p?f`O* \okvsr="e{^HIPk"1QjDQI;Nѱ|~`s&I6ɻfU`[t>CQ!@jCY}n{%}BN]EAelj 1Ν O3CX"z5[]z׾oQR<]u$*kuMHr95XA`ą2DSqy \ j+[ĸHsrO@h0"g(TS-nIظ !wl&; KӫYExҋ]x`b^Mw82v_{% 1B؀RqH`LC. [1@k>kl$O  'hϼsRUW4yϞ#P4< $GKxMxt4 +Yfr[w5r*xOA y3Ӱσ xkjLeeyq.¡"Q1ئE)IE{Jʼn'Ooׂn0 q4$9\O?Ԩp^=1y%K)鯮BWo-+luV3`d475@iX#[W!fQI k<όjMW$h+ڻB,E/I2mx<z`(̷$v`gqȷ!D.T3gCɋ%LEyrQdtbPo[n¸)f=Pc. L-LGk ;'`^1mu5pBVۇUGAB24'H eSEf B+ !1BWT<%CUz"FM"98c/X㮽 j ޻W[(x3, ޢ'pp}q2{w0d\?:_Ǜ.$sQ)nd |Ea`E"(9[?`!/ܐ#kٵ^m5WEciȕ u;rA;'W컼z?x[~M{O,aپ u(u$?> S7S DkYN<9(eC4BYW@:sNhߙx~zRɏA~h,X9A&bzɯ]˳qJ%r,*z)*a+Lqqݫ]Cqŭ9 4Fbϣ1"nT>p"4z?aYSWJ~2uF?EAv Ŧ }o'LW kyG:z;@R瑭<cHҕڊI6$WWF1@j2ەWyq1uaS];|أg#HF>O䄰GPxk5)V -_Hx<#ߜNF;cT44\G3h4]1LB$R glj\rX] A(Zpmc`?Ίu+R.짟S2?QT_ )m\zt4WRB2(66ߩHy5P8COUEBtI̖XZyGߍ ;S X=O]r!qrkK.C`,XКY7\2$NXr1I?:mJ& 6Cxw(M C Hu((؀p dC lv d5ݤߵ8F?6X*XS4 %}-vEC#bHNI`-xy Nn9eqIDS`d!ZS0C"ڄX7j$Y. lnu{A.ʱ26dN,~gR .a*p0.۸R'њuY:|_y3Ql216Jx[X 7-()fMGkql8J+jV$UP9@mgב6S{KS ayR mJR ?R5Yxw)<[ͨܐ!bk[_OkU g|2v{l< Op? F,@d$B&6de(%/xQ|Sy`,}JҶo62Vc:^aG5&ҨODCH"%{¦_%Q$oh:JbƘd&ƣђ P^Ω.3G;U6uGhث=)\9DEk<'2Kf&L]>25'!mjpmgb\6yLoPÕx|gƨDs'Χ]Wldp>C:FPy?Yx!sH@,4sU^!K˻=,]]Q}`DL D _R7(kF'jz`DZjoĺ"E:ۈq-$-Hhp12<$^8q+6:WjlTN z6$ 狪QIa'h~;HPm:G nE9_ƕB;pnx!s^)S> ];Ρ Ydʈ@PC/Sflˮ=2 c^͉qt^#菹 riq3NsTMd=[~GY[(N>A KeK#s&ľ$;W PL{[ 2iMi;j Cj:<m^^kw.UjIݥ'*'\ !FEyyܸz@<{Ӎz.*He#`skAx w"TJEx:DDR(|4#SCy% q2H4r85仃[pG[uپ>+dX  1 #:AYj, R@l0w 񳗻QYqpF$nڐ.y#fj9\=oI韔TI'PNĢHU7$=i>cX;M,yoSH͖5-IϿA;xLdgh~_ٵ9y^.5Nmi;"bEVk+R7&^DTJEh B..Ôĭ0~AtлPW5HOݞm/eb!xN#.녰sd!sMA-u|Z:Uh2l_fg ,n^#/-V%@=P#Va䙾nޞ.bi23nlN0=4CCڦСN? ϳ(X#b2bN$uL+]exÒ;N ru*g wwC"l#Sؑdn{˻{].d26g_<ÕMFInыD؉_ZЂ_U(̰%r?2LWXzZ쒺#O 璄Y̺;AT욎o6S{SaJy`X\U߰b?r-9jxJg(.`梡tAK-2HFL_,Q8gKmfdOf"Ui]2xRo|.B XD vpǥsL?D|DN/by.3D:h0՗8uJwІ*O]KWZ o.=U>{hF4y|gEq l:vમ(ږ7bAhޤw؂G>( :/ϞOIBHEߍ.o++E)sJ2Һݹ5:lEZNu3;9o>`@LFDoMv]" BKzt%YW[ Ԁ x?Rf'H.𩤌Z"ZƈUWM؄}"M}"4%]KkOnq+KsG]bqviJ6թ[&@}&ƃp$q~E-"*sH]"K.CP\4%P?]G3hʰb6w ؋*SjUQb|&h+Є:A1ܜs7=TxcW%+]Qq"Gz=W=WrxcO_5$ߛ8AmnWVʒ:|hѡ -1fvy끈XG4DӗgI#/%Ľ9Ұ|TZtop6qW{u[;ÇM .6Yɖ ̺"-G"ITRW.ɅY,$@xsƜbY2@4Wz>hy0,3SQy0(7pk &RX L@{<'Q͊chhl %hQ(5c<|b)r!϶3jZO4* |6d WNuF\ى߮cHMN+7 ]Q|b5~N΍tLk6^B[ӿP,_IBU/k!<|cJް$#V֑"-|TwM}/\8{o1'B\F?Qָ1MxFe׾vo\Qȭ[^2Ljȧ|Fa > k 96KWS߯6i.\0nl~wd*uffbN,hg a%#RddmMKS"ޣz|f`" 0Зg$3e_C`{ldZ8X5lvݫcKzd]gVM/AĶ{)ӹ{@n {8JϏX̢BIMy3X_ݵT戄q./&'a2p|v×p26;RʔB蘰ZƶVコ0uW7)Qڛ>/nŲn .8_``q[8]\E䑿Zq z3ڕ<\ocwlkJj e09"wSe1gyD/b5iCi>P;KSp+v|v &H n?ZLk$:Ǣ5aͺC)Q3稻Y:Mo_Xk3'K}5yGíiYXb۸irRNӷb :9`a@}(G<ST9|74B&)dCsKok07Z9-70WKh\gI90=""7q9)Reo(U1V߮I_ϽxS6L뇴\ke[/$<'}\&jHP(pg`Qv4Ry8[$1:w>["meE_-}WKxpk6>< T*]qR[ ӑ\ FͯQg {4 r>ك3~CtCW/΁"P D\s ~݀} l:i&t1TX;S3'(?Oc/ǹ0Zm H4w p]B#6뽙.Ӧ [9foyCzQ~R}vJ\7c-YvƗG)s3zl)|'AbõbF03!8;ݩ<.pD*rG0}g@pRoK)>~ t,Β_8-f :(041))|RO?3 ht~ J%_?`5F]t7 $cEaq'2Sx>R3Ggj?R!u=GqWI;Ж{}BOW @i-+zI[b$["4ȃF[c`;ԧ5zoӠJofx4Il:9Ws h7я+W;U$_^Jw-: |?`n"P{{<{2$ȖŽDWI`sUC}]˼ .Lx-`PeW(}6B|ݭ˜ءS'Kz+~(k@7Qhyw% K6DLs/c/^OipZZƠ;nF}:OTM5*$+/BOqz:NIONkD}hfD}jt1bEz38<,n*T1j湀5XwPa-%YMx&$㪊z$rڪuO,;Cz{&u~>M8K-'v&t?2jq2LQ~,$nLzih"Ŀ&:&ޏ#T}?6UՔ{Rv ђ2ఛp.? VM4J2*7@Pen: t 9{6'8w/mJrEĚ`ʷiBL$h 8{E,OnHDGރ>f\~ йR9iZ6X"}u:q \Ě&{ H,g@>|\3l]O&P|mbŸ:y*X )wA.a=U1oOl:L6+Ϧn䫍+)񸁘쾼 G{=3GT-=:(vVrD#"eZK1rv\;@-CԈ!.eSqܥs78nxKvoQzRUNI{;A'>YPE G:wFtkSMWnwTS~BP/̿,(>"!) O EwF>@RFxڡtĿR^B#y&bِI~\ vbSFI `yCif~H@[߷G az-q{7HU]ӎ=ϋQ*JhE^T 8mOeI k^^ڥ ˰Or/'ey:JRpeҒٰ9w^j,\ -[F% $j>^ t³}y ߗ`ҳ0M+K!coVr## ;je86friճӸ|\ĭ*+rXaӞ3,T|#W%Sp>\r ryM/?a]'hWm٘';;f2B6ݎ0b=]Ġ %Qw 8W:tUf_^B&|W0aw0hܹUB*A42BM桜0>ɗϷsovFJ>Q)UOhwbaO62tݡjx|~ygy[ S ѵ\$SҊRWgۉnٝuf*woS.e[Ii>ۭ&0*0Vl.mG@ÐFh2iu~c #Jt,XT %V x pυ;w}2*x+:柃n )l:L'‰)܉m.P/\R>}<ť&e'j ҝF%+3T >m@;t:ZӒF jerI9 ?]eMԨXKpy~ycT(۫ *?lhjqt*hBm4m_٢囡fNoC hZn౛0&{0r+ $n3  O?JJRգva#.g:' LXD@ٟt12\j~e{U5I.NǗ)]^kA6$I}daCX-ċ^!va(S-򻢧šoY3W"b+RCbtgH-ZLSX>b {r^YO¶JJ4- ~KXFY7SJ-#D:b8Qc`1KpѮC0D/|kOg*Y)eYogB}$W_YHx:{=n)=>9^!)G".ȃ6>g֪{4_@MFޞ̥}LXE-!Kn6-1O"C$gh?ONx1i_arcˠ;Vlb ;-KC~nN?oj3E%l-PEFQqDX,$̬-aװXmZ]E 0r3sYoXF, ĘVI;<7DAB3txZJOưaNzɽ5t cS4qW+-\r8 0 k/ '/'O\dxC5OSf`f3տO(T/y4]՚GBz8!ܣ7:'Zn$0l$<t:`ͭ ˃_¾wR]='ϣVgס_Bgl:u%@C~rP|%B aѝٞ2M!FQ2=f`WE!a*Ac{Ca'x]"i]cԳ'>11VI C`,{>_`hNFԖJB>&Pj}m8kVH۽c]=IӓT>m٤N2K,.z+2\I_:Fj ~܏pKTNhF>#oŨ"ufRjH+ DV+ 'n 4%`|-g>^:g0=[>3Q669iƫW > ;ѧ4hr 9*,Z?%r`xpoKo6 F%[x i|yA11QYҲjOݱ淞@é(sU=W>p}XF<4OpC" eƏ9/u>eE/+(٪%`s͔gӑ>+@!y|Qbe}SWpW' duĀu!5סHx:&菋,u1|\A\3Owdt!JKCC".ޔekVj҂hbŖiZ(3%%MbfG. 7oh'SsVb0ԤXG,/{#rF($oy@O^e)g$tTc~T%D+2"XIm&晷(%Oh`v'7Rfp&cP&haCeieOLd~vY `e* BD̡kDQxY;/V9D  Uckڎ 9#yҬ#Y椥3dv1ǔrճL%2H+XLqz`9!+.d`4gOH<.fJ,խ}La,y?kևh8֣7&ImKa%= vvᗢSUgHUNP#3 v0d7V> ay瞏Ȗ$*orëw'bgknCI `Uwa_OrH ]TeJ{8"'TÑrt(s{1سfj!/XyEe3p},:ZPdYIp&/{^&y1KG1~(j,j+A`5lX!fbSv{ݿ{ I 9aW-U7}grOފ鈛&78=~zeR ]kDZ4 be6B07r gFR;LHK X^H<@?9 d#DXl& lYC#w7"YډQ|ZMrPrFuȃjP6Оeܫ<{v~ޅEp Whpᄬm{$Ҧ-p@9X4R8hͦ(i0E&ֶBK=o+Nc@U7L*:)=_7 QEE$`Ƹo:uBS`T/̑Q\m9NA%'B `jLF#X([EVЍ2\ZyS%uh7Qԅ|\ENaYOgYN=\rIGQv-90x԰ B07?:>ЎHaRKB0HaZXwud-#h>FO0&{PُsŒcSyqjLȋEM6f(5p q8}QQ/a]M2S: 7y`N;-Ze^r9HBRut>43]2س0DtKv^m`WTa>˕ML(77P_(Dw€,,aVf2/GRoF AϴߢQ7z55Nn佶mjB U)0mc<?JI!ǨeFWu7B.aTCc2F>*UՃ/reUt8-}mx w)|_Ar7Ex^1R~˱LOk vZ2AI`k ""t:P{M5KOk1pFgvL:]p}ӭu%ڐIР%;ODHt|<зŵ2{^4V.pC* Dd@&6&Cί74* t?(tҍjzѿKh(Lyԕ ` 0??şNI)Y5ՇHV%ІD"~# AV 7D3.$4CD|C9ՖTWEGt5`X:[pr\SA q5`0ڴܙt${ӳ^; 8`N]"h G.Xb gBHQQ##bBtZsٜԒkX{@ ={vH_dT oj6[RWF=4 &ގ\yҴiy 89kDx.J!٠u^WC_oUl0 s'<Qm:mci1_.=lLHuJ(S؁G +q:Vd?{ 3ڊg#!+øPl9ŷ8)hvcwEž{q7~O!Q̛;.}r> >}&?_!C|[omzD*c`h~M/@:{yưj|4UW|FxXND",g7@ܘb d ֜~TڵğM\IXǥ+{Pf.P3^}/̖fٰm`"[V wėXR~n2Ew#VKbaԏ' F@< RSy_3| ZZ*UQ\bdm9ޭ,XJ"r'NHfP6E&JMz>{Ŷ*@z ER{'F5iڵ.Zfπ/@y8hKՓpW.'i@0ݶζ?7j@27 8EPsFFNIxnٕ4$ϝ?҅.e8V; hk WgQ(*ɦ}LnMJia}kHsҷzD-cLBmH4 XdŪynQ GH€]lBAת[D^th^ZZWMT˿)5v8޴6n+ UCt Kmg.>]23xa&Jg` -Hrs&c2r S*rRr=av*HJQOraI֥c^C/"/,JTNn5.Bxsf61]e[TqB gkxxLǣQ@"4A/c١;t#3F>(CN#\E.2 NV$c}LZIpn@5paºTـA*N`f@\ JpPeP^NOO\%un7&6M5Jwhj\w=9kh&%5Յkts5)XO_'GR)% >̒)pr@^*Ѻ;K|ua\UأB<&7)pQrfGQ@E|0eFe4.ސ$xqOFa og V.[Q+}i$Ickg0%qwtZ!S3_)OYz/ȾԎ~%^B@ȡs"} `MdXD1VDxJ@i>OK3V"J |MG:e#dܕ?2f-lPm \*ZoLrؗxJ~+ޭ_ǒ)n x0g%sIvdf0tPV3瘚D (mv|(GEۖ?0j{" A3mcfebKyBgp\ baP&*׋?tyWz*DCߧdy%4 懏N8M.J),F]%YމF6_NB=\M]}1J?g m_r}5kl>`!:w?95-2):yj$;Jʞ+;Ѥ0/A*w`FIV:s%|UNA\^6$8ˤq/U`oR{b ħ?Xۭn\7w t] ^7F/e54f6E|ç.F/z%D,$+ !*dFnA\R3N6Q`9Bl:UCYm |imRϒ]c H.| n̢+JFX D'f(KW09WSQ:k/ARˏVT!fEBCDŽiu % &QĆv(ǹ:cZ[ <EjɶnsCAY`v}pb:ڟgH%2'ҠL.ds} 6^KM+ߖ go|3[{u3DCذC5sҽJeRO;K 4#PN+ /gA-Mllf+$Bָ~aj(.tJBpQ:m@eʯݒnptʧrߦi>]Ӏ1"Si/eh"ɧ2-8>ɓ z[3ȶw}6k\L_1'- & {kzƄ`dvP?II$3NA <t`0u@tۭo+`7qZX#} )9@]%vXLc dc}Z@gũeEwFkLiRlF@C6VMp@9T)3^eqy(^,3R9ɣ1@Wh>i-Azܝ!4x6&47bĠ5Z\䅝rZQv- z`9R_lS,l-ǥڱ`[/ғ>?shA-_պr,X D4bErX7CS^^tsu5DYkvP?5ŭ90"F(7!:^s%{YyZtFǚF m?uȨ*wdk%9#؄"|pNաzu %NBJva|6^plkCL̚5@Pfn?X-yQI#}.?琢i"yY! 46KIG #K&10 R($9f˝' Ɖl [rIʊFo514Ѿ2PꥎYƁ1ui,"ǟRl cF6S‡$52!Ѩ^Q<ꫢakpխ񇻼/3@RDڷ%ZZ/!ձ =m]JW#/QPWl\%V4_j[?̺k[ Ie JX:8t/cখtȊ<0lUg{_`_^'.L5Y5[΁m 8t PHcf4RPhpWbr57/W;R iƝdw1DlS1d<bFmӹB=u(ۈKsa^-^)o\}9뙰"Xny\ zOmweu&]uUX)QLk CJQ}o]U2نL{M]wL[b/~>Xh_6)^,>w;fy^Fcyk;WRdžЧ{#7[S{<ڙK()|`ѩ{3+#!#y<9v Pc ٜhW BeljQ*=afftMv?o}LS[SsGA\iP[ vc`}$.롿\?\Z.B|@]巣ȎjC݂B ޺oe*UBY\kfF-jU"6w]V$r\֝tkYYuʒFu:JBSh+.tRw:ߐWyviQ_F7f8[.*[9[?`~gهs&łC4Ws+A;YV9zTF(Z]EH]]!TiÖ6Ҏ8Ar6^ؽYgbC^t ߰x_JU+8VdIpI @(ǮWqUWqUeΕNrHr4%wɊFIu@1s0s:0K(P| Mmje1_^u#{1p\+KNj k$+vX,"_jzޚQ.y鄭5/ ԴZ*wAAfg?5<򨠒xQLdUrrYDLma,8H1~Ĭ+V9Ec1WBs~MXI7!ظSDqu&b~qKG*55^ Yy(0m$ne英!ҫTC@viR~qPRMD۱=f~Xh۫߄ڗ+=9 W1Pc"}XD<8 3' DH9{Ya"`KnuJ2nRD[b؁C^-Jc}d\|܊&5@ӭ(Z0+VEOSqhև1Zd֤q[Nl&Ww3D H~1q-%ehbk(Q#<4+~vӔK 9U3 W\BrC>6*LC/fNc\x+ MMLӄ." I4P-=#XXj;@ Suː >dA#\_Qg WƳ'ŭa4ڃEa!7|Tf&Ȁ'^K؞v`%oV 9ʺ$Ff HQjy{C]?QEm)P2m ,!F޷7"E("κT=|9v/?RݺO*Xw EG䯩O7Ym@gZՈ ҡ>cр ݰ-}%!iخSJ:LA"Z\j ChAdOA,CR,ЙS>2qa6X 4S!H1! t@YV2r5 >43$믈}3A2i2P'W5W`08ҡmHpX_dX %<Ε}>/pm">) :NWX[D(.X:Aг$rd VFXh橏s2|vIެ荡_C8Ni~}λ<&;hD@.y|oj.5[P xvD;w^ɭ6{U,dHh;<oD 0Ǘ,S;\_XBpBSbG s0Jw:Ω|Ň-ɴYQsOm KdX!Ȫ)E_ZL CO6baذi}]|rsc%ٵֵi~(vFu&'iv)`0Lsĥe=ʧcVl[lV=L*tȷuB$8@(gjhd159Ge<,I L|{VЁBZ!b-l잢(*YI:aY?ӄpl͇ MWʀzq]]? ^.C̈TEA1 p!bЃۯ`lN+ #4s23D TԱ:#\yq̡}]"IP~8I,XF\Ǣ0J }^I?!C(˹>$ c$աN:ب9ۀa>v)ku}F#/(Q+"h 2 puL%fᡉDMz76iyV}rV.vqﱄ28eWVQUa»|괺5ZYW1?}G+M޼ԏ!!/h Ԍ[!3LsHY/ÞS,0բkR*S >t*QSC>NE oNh{\5GPY, ˣ!/*yVf]@7Uү9S*DV5ٿp&QY5KYg+ZjTw$ *UPM/ka9+/LCZ2cSP.eK'ٱGBZJJ2< b4mߜ{9*mGw7InY(`f*PviM5| 1#j~l]Խc9&e{=Ju~ ă:Q+KsQQX>/"IA8ؘ|s0KH,'d/p؟g.G",b!qA]6[.;WWyNz]'{$ܠ+Bx|?$h5DJTKB&ԭ/XsZ:,l' ؉[9H|2O0Lu֒E[E/Z=ڝA'E`V\S/ /㶝Gr^zMgjaL&]i$'ƖVWyuH3Edc={],ܟϘ Eh8af@溰/ -MVc:V~S4v7vs5].qrm4fs_3S2dl7sSm,8+'^O ??tE5@ H3 m#O\ &c|l"O#Kj*3ө xdĕF0:tp$Px5QǤ9JoIT Q^<&Guׅ;Ҹζ+PZMTs)t0sC(Dov"k XINa 025WѼ(VJjMx߽'ɾ If @(#yI Yetgz,z#|V`_e'֔Ww4~暶5ӨEɉFZ'}ֿ_ -%V7$!&x]5s$&_ۓ (!S<<kAp§:]Qx_㡜ZU3[]Miе(ؗP5ER? *#*Ȍ.6p"#6.20PNG$z ,3A׿UF-YxІcP+CUڌ- S.ą a \8k c;uPJ↣)I`QV4{T-˘lO ,[3Qغl>㮌k/ uf!m%UL2{zFDKg^^XcXSY&/wR[jsDgOf&a9Q X ll6T-"d` ND2QNB#^d鼎yJB{^JDrkW-)I_| lѤލtz.]`1Mdjc!kc ,X. $p`%C`FD[1<$T2Ϊ<0(G 0 {>ΠChéOC&Q#> =`P}+}؂پ>~|XDߒb"ihOU)>^Z}ڤ;!R^T]\Xm(]S3?-W -vwf>4V{-L!cU|׉UOI%d#:A]+tpQjfn,+rw"+53ףa'8Cيןt UQdz$t^<>OcU\K[ Nm3.ir2 +ɥ2EZ}LR~gK?m#Cy E=gڜ]'h/b QSC"D6RjH:Et")cvǦ#R8߅TmNvyޚ븲1e @[ܽjTH!Xf]8%}n KfDBK{L1D&s!}eBVKdztt2QW gIZl|dfO|ioO,OҖlAy㩄BX8f+1" [8ɑ1Q-Y %y^N'ԙ]Ueaӹ5v74ODIO &9a7Qw=@nKPqtM= tOC5Iӽl.~cvvP;O0eH[\;vüoyCr4hUf!OB:I]HWmo<)cYgi`xb]IʉCn'f(g4%/gĵzOyi|%?j-qOpI:{zTZ:zЯw`86Z~S;.nZTſ]iO&ےJBY1Pb4< \ܲ;۸D|Tn`WBċ\Y> N#Xr1#لR2,F͊JSDʶZya^\zXYfKT,ƹ);u?7zf|fWvo㆗%n|%e+p!02XSXn-]lml;P,v<ڮvڕo `.,zGM#2I?H҃c,(ޣ(+DռG@Yn.}b} >PMiϠ\+JρɥnFfi۱]}Xc(&jCQ\gn؝ )W9GlW)&1__HrC<-N> `p+B7D7R Ar9R-诒 ,Gǡ)<;TM|DjUNmjխ2mȿV@3L6ppv9bg‡|=wܠ&-)Hv*NdBVw%옇ɹ3v F!< |"?5\Sˠa['7^Ag+ [bt!}К /Y<% Kv4qhO'#]2j:?BiůfKd!SD5|krdڔWY5ZmH!KLu&\?r:)j͵It!8A&EcF)E"ф\=EqVHfՓ B5z5fBUj6qQX|]8\˭\Bۂ\k<1[U'j5Kصp*Ht'|pKFC͵fU⌣xL ?Rf{KX:c/&%U/\=dΑ֖jpIikn0' hxJ"::zM~Q" J.eWQni0ϦbQ2dNp68z%7o( ms '48ŇS $ iO`O}se$'=w>G[(b^mH49,*jD4)>/G(pYkw9C;gEm7W1~e=@ b5۸41s6U2ǟO??002Gp7j8p'}fd>Rq1`(!B"=n`_UDCSD_`޼,AwU4~/8?NvO7tK']mOH/Jk}T&Y@Y0R:2_;X`a3#~Dⰴ ъ2}J vWv2uShg$+oǭX_byِ\ ng̟{^Tih)ل;[STU _%]t-'5-]l7\[g3*{"<ޟ'Z >[C ՚\|CaO׸Cv<h.WFŊ?X)7Kx5t1 5 ,(e&8K5z13ځo@6u'm6E3Ha_@Zh |$U6G(wܱ%~nL KTdou22ok nR=*w&!.m`؄"]%Ϲkma|ق*V"` Ky=}P<\ v`0Phu>GQD꣉.$*A WN!N+ljp=phD$ {҉`E @%Z9eTixy~$4mgIO/ lbMho~^vzA}@YБǎ1CJ4|RE7 +v%?;Oˡ &*rHE&S#E'aWig]߿ɲsQp[攫1/2y&: J6H;"oɗy׭b}m ,A468#E;.~'(2*+O_̦]6bb'Qz]W1mj-`$PBh 쑏 .5a3ASV,GmM~d̩>LQ@ʍ?0d :ԝé6C(lNכy6H1/~EM%J.j~xIϕϭQ) hi?Ӽj$5[be 5{" |B4P N40n| U9/C`5P%B涄ؚ/dJ,@wÌ_ۙӒYrv&+< G>*":#E N,9y5mQZR:mOǷo=iKppXqpAo?RDzK;=5 J8|?Ǖl$XkS_ϫc%:Lf|Y3E[7 琉,E4\Rxن47 huX}fOYD2/mT1NxUnYPR2!8|̆?eYz_K`V5><À<a:3[4KH Gssӡ5Mg5[U!Ơ0]6 'lc<Ȩhz(ԵNqɂo,헱<#TE% %ɳK?wtHxLġue=@ ņ51_ &^X@(Pȑzc$4`i:ϖ{P$b^AR_FA%rHd^p)fEDcc\->…wmxÆ95BĹZjavizX8W$N* bA3/רH5.H 7KjؗLGabE8#r6;'r0)Ã} ]]O )AH(*=:2'kP Q-(B;cH59O(Dsvcqx[L Q^Ee\s}U|7#[랬a n\ئO"틚hTv*Xo o'91*ݥHI 9q0jH2_Idloe DQ hB֙0=>h.xo91\uM\qOm9c}|ayv2LrhEҢ{Ysl[c}e;ge$-]ƍܳ>]lKI~xƶ8#@h=j% `)tk|Zޙ_ On0IwQJ`ٳU8n \8Ixav{'H"T-T|s(|ȏ"ʔFA>d -<3/֠>(=EKh٣9c\h70 rk[^C.z&O xl9z,0TrޖGOî7M$lCޓhNJǙFs 4L{ƶU*nr7 |r4d;aGB1MM]EXi5Kf""-;[V`۵ f_NljVen'kj&m[7=p A%28ӆ,G SjEiWWkV|W~Ύ ʀ)t={ qOԝ߀e`!9}Q!\M1>a.=vєx^V}CgZ~RJ'G.M2M.ElFѭv#sO*OH}D9OYF.C20z" 㥴fGXZP3II8Wz7!7XS0pl8slʂÕ [Kir#N7ȩU^ӮX廓bIoȇhj,jЉj@si=: )ծʶ&%G9ڀ[fU:7ZƷucYU1M_<1ڙp(f0WsVrtbK%E$ ]γE\W-m[n1kն$vC5h 3z{uet mծ4*H$%H$hC#Z2.wNGGEH ASzg3.Jp-:I #,թ|,v1KR_#+a GF@kz;$[ D{Q_/6c;3VHwm;$Z?!Tؽ;J^?#ZK#v y= $"*܊ 2z&a440aP${%']7h`Q >5{[:tUm|&?F a2`@3qP+0Gk8(od4D- dƢ޽Q0jy, KJ;̙vkUX~7"]zjK;иٓH "aȃUbM8Rfn$Fc56y~ȾɱK>^.K-`iKo@P*sIUsX]!?n[N[Y-Bh = ״8!o?$@njO o,eʅG>Uqw)Jxȳu6Wh`*$$GM^옹݀onrOx*`oF:o!)D5/45.qj^:R' 륀p L JT1YwpL;,la:I{L";7:@FJn|9^/O)܎%exZFR޲}ݚz3Za0>KO^aqQejL$ W W)koDo#WُqLƞLHdFz[:!`AI|CF:(a< O)k/YPNQ}UR B) /"4I|,7v*Qjx8$SpMZ?.o'^U>~tno-1aߘ*zXۙ[ZHx3DWMq)ArF%j\ 0S jshġE 0)NS}Q t ]٩}DU"triõB ;j>L?ҕ*e7*<Jv_36ە|Ȋ' z]?r$2xSU.8IIml8^b.:Z'{8^saK!ˑW>nW.tz (IP(rucfz# ೷EU41aJXRxY*yC6NQ~' Іx1ƻ/teg86+,U)%iP1vPmz+rGA7$+QwO.suP$p>#}-;O}GW/|'Om S *+ ID7$lDh10QS1&pja4kKgkTjb:pXMkL[dP%IsKQ%jyjhŁ7pxlbpZLTXm̕UZx[gsq@aZQ͐:eK Ԫtµ:XCjyͥ%-((6Vdx&3ux+L/rgGwjs.&1Wrc/{7/+y_RDlAѽx %,{>a ŒR4)y8ZUj,F+~#F1)|}'wLIzǶNŖSY3Y=Ԡ7aT aOPDpHgzVAZ i LB(QӋF%#|5co0U\dfg2ŸfUdQwR<[roMuur:@WoqIӡMG^ _b/HZZ5 fBZ&{x:V7Ca݃]9?iP/ ]Yo{)y KN}8%%< G\JgP=<^/5 626)+ @ _{3F5]Q/d>67 `?fũXd U{FNv;e%9(jqfO >1 |x^wy5ԉ;G€~\.\y;&nIqsц-d^\%rfh Y|LQhைR:U0oް ;7tJ e(3OVCYvSW40ʙDb:є—`i gn!0<[{qd`& #JYmEET'𪙐k)%VϤ #+1K21)ؑIl MpqiXl _ďu0=CF;!rF~u"CPvJ6yڣR4&)z2 a ?ǛL<ʾ>X PK-?W(stAbU0‘q).?Onw!-D0LEg?BMpGc ߒ y[e]u6dDt*b;GL[,#ׇQR j >[ W}X=:6?TU`1gTU=9p<ܴr]ź'9Ab`6MGT m/㹧-CvBǸ2 Wn@*Ud kP}]kw} <O`|,hv3- TVE$w:+2vF . <\Vu:YEp> 0hYaIa;N_ m0Ϻq%]zȮf;"7fVWWudžkuDnRۅ=w +>|fT@9)Vn%u>hH4=Vk9^ȃ*{`<I]Ȏ6.?wjJs(o5332dߔWϽs4 FߺK=r;Q{ ҤzxѨ(ޭCjr뭿eCp⿊>jsq.F %"S|DAho?gLEd,Fs}1=rJvdAE]([LYkeʘ䡦,b~U  _Ӧ_sn%#~ǎgYUd'v"BjENl@lﶹ5{AQ{ (:5EM{Ω;mZlBRKpoh+O p^7qÌliSkx[x}$3A aD@LŎQ}2צ;Xl>3h<&?s$^I$YVͳ }'Z5R(olT䰡^sCw*̪n]X4沕`cgMp/yĀ0g`Mc'b!dRs@*T5&gB}ݢ4!['xkҋV^#v:q '< #͗fe`LB䮷kq!_dG*Њ9G<|YN:d&{ zcy]+B81B`"|d\N0(^*o4H6~jK~yISFi*H?j4$FB(2|:h3˗D*+d!&2|1P,1Cѱ nYk8\3s2ʚJH課? ˓O "{is-lTY +!)ň "W Yp5Y_lW&*N\Iu>,H.`?_3ֹOΙ!?\"TGp9 V+?vb'w ρtwx73j{O^ōAuo hU{!_ [he Vx(F$28l?"=_էw NOx@tdGjtfvA4)dS;\_9ug! djy`$<,?|0wswsc[ٞ2 (E) ֶPB!1agU h Ұ,͛Յs;i&^3#fIL~Bq/9lFVo٤E$ZF#fܡ0= fG£0Fwr WRj~li;2nɊY;ǭ,Ԏk ]z2LjUgQN(f8/#s4D H~5a I5Q^h2OYB4BtvGg=}(ޝjŷdM?S0p,̳og'YNmDn%0͍/ـm!FrBY1U5dk,E1R[r㠷~:\,5NF4)__#&;L4ֈ+5_Q;j0EC!|Hձkt>rarmvt ߴ?jv^:85AqsŎXIŀ+RST MF?zkdrVζ4?"LVq(ǚb7+* vu1~Q)' KFZ@`n\FKXaZ-Z=6.x)kP2a6*w>r~PPi^wۗoHCM t,y.j4OuAb+ CҡD,8˪mG{Z34s_o]}#u(n8|[^Ub ʅ5[Wm+F09u3G?ocRޜd票 B;6nBcw0}v,tG5?845=m$(]`ˆc@ Rݛp/9}V RU+fjN1&+UUfM2us\* ]?T}٬@.~_kb 3s!y\Ln>/kLdl0DJ(?A/?v+wvs ~tMax%-mrT,TEK׍2"=N-2F̦כeꊭ˟m۫d[\wZݨ_!!Ai,FW~gemfwrG;Ib;s!HњiCEctMlJ{c}C:uVowH6П2&{i;9R<bD3~Js Vp5. O6Et**0Zf`[x%Yɫ m+ e{oA$kļEgҧ$\]9]d`ߴ` 5&BI6aJMDpo+/uT>K$c{||Q',aڙV'A}h:c l۴ÿv4_p mo˳N9bRD^ ?Rӏj2wJDcSq}NhvnۭFz\\ *S}(gb$ m<"&KFy%gX9 #6 C3 A96;V1H`Lb k,+|=[J=P 47)0v#m$ ?;gHI-a,ʸNK $ Z~L\*+D/uꠞ9Y-Fͮ66i'fjT75y[p35`KS& -??rCu<'ϫArZl;J7f;N'w5ݢͶʛHn.{<\`kR) <uX-y&Jƛ\%Kz.ْ:Oݐ-Y[vUcs1)K߫\93& 7^Cױ+ (~޸]J :}HuN׫:<)XreCeytUC~kS-*nKs)%"gSClM &q9M+ҕZq27rgRa{lk w>[6.v\UJ0LQ~ (A W!, nq/iN_Ve:Pd k$/[ V۪Q$ɱ;j锐*w iTktd*_wHV!)H/"lPHOA\Z:Sz0e}#γULN$C:*j7ez3O>A7H}^8v; @{i(Kt<-Q7պ@1f䁩K7VM+Qz^(qy ͑B;!PmH}'>ֵ]TE"]UeCW{²Є&oԽ ["%TZs@X![1!#T=6V-@@K$NQMq} Xu|=6w.H74-MϦpŲ]jl)ƥ=ϭRgrs-}8^ZTX53k/cץsoߚ<IwN[UuN >nX8@(J;+p~A0 ( hBusgzM`rWޡ\cʋ8Xȅ+R7%-=44g~Tsp- eAI *]B4 M)ȓ"c,+\v-KkAML-[D/@j1jȒi<fE8C#,j e@%x&O}5Jo_ծ!؝S0/0*(WlYP'׾I`L8յeFZpϒRje~bUYTrn4P6b)e|7YQxd? kjbKJ3Hi#.{&T"ɓ,e&v{(p'.dŌx@aJJ൪],Y-owO3E\UՁtxXgB94O?h&|m]IF1n^PZhz٘(wDFb~+$ݥpNo,25>F=;gR1ЖE6 t HT>KU+YO/I:%* ;qa B>"t7tަګu jN6d'*U;c-4-/Q,jKtN_^'B4KfRdeO :%ɐBȻ^ ZA*Kf:.k@wsBh;1ɖEyzGD`|괣e%07fYJ  |#/ҮqAH䧸e.ߥ.K&a)E5z9<ϟP6!r{wdXpYYՆ.3x[J9#i"a?e(@fǢ @ISCf>9 > ѩ잟Ưhj̗YzyXM:|kH)G xt Op"M.v2^ W?oZ6'X4S5-*b?g_<(l_O+@}^`0#(9m+n&>Xx t*Q<}r!ʪPCԭ#Vy(IG^rR"֤Y<"sbhC΀{]K!5r_`\LLF"[1)M@驫vLJwaCضe Mgh0ɄoAa!(z?dDt!f<]pWLDcݽ=1W2EO%`ZKd 0젻Pʇ')w E0Z ڕk1 >v.}2m)_^1f\\@fA1{㈕`&WD̍D?x5!/D~;ﶊ&A: 9M3z5JXZ,wK5?]WDg=d6] 7J+V]ci7(O cp^cnXf imvHPK"("Tx*qPOFw&#X$=ir}G  0V6#(>D. !nc7ܑ] mE A.ƹ$hecJLV K(|0m ti[jr(^p!Ym WuT7 ^4_?N v j?[5-hV]<TCa-$(7l_KG٭$5oV4,}"W}plzf/}|PE]pnDޓXPv$FJ̌X:WL]SQ;ٍ Ex<Q%␼ء/ Scs;!pxi%ug$C. Ό6M*K;lMΆ[Q38VHF 80L@=\gv&xv,gLm(!ik6&v=cg}֢s17a>p 9hYT]J~/b/Z?Juڌ:ae)JhB0IfOV+r2 8 Gޡ?@Թ)8(TKx#/R3Uķ=zUU6 ok@I@ ՉPKj4_-򨄌k/!HĂGaTqCtF,&? \rF+^G>5&[b vV[C[3"0|rĵ$Mk/r M}iD( NTYhlOl_و9"kۏUlYioE$6})oU0ML*>\T҉̜uiBrxјB& _1@>}j |lTP94` (\"D`oki#B-u$J\.^cQ,fD夥+M"FK j}Sn P^ZuѷDu?=AJ>fo\s)}]GECYՄ^ aM98 \[ƑڀN~}sY^>P}[ d:sgvcli>}6Iv'MZg}4(0c3(jTú7,3M-tMɴ&|&JO^JRX˾$ pCZy?S.Z9QvtM a-h 5%|7K2mБDom;N|֣gK%Czow N8հIuTS*fQ\Ԅۋ~“i"Y)G#i#N,?ĵΫ+xő iЭ]P)O\$ K[wDɊ ""rCKͽ ]IG 쟠r!oQwrKgW*C H,)H:Ɉ#|dRq.ND8-ٶJ^\ ;J]W8 x/Nlr՞gbMTZ>6ߕY=TyXW-o*2dt҉+3϶166.If @m$LV$ bRW}RI`g2.c5-Ҡ'/ZtQ paQbBBĬ92;GITc& P~rqU+RzF9Y.LSЯ&Z<mC tGءյSBG#66i75QOH{\|8狄îH$'W՟Ӿ3HKѵuqv&VA9F#y;.N@B˖(NH@ql&hiH8Hc&f7J!M Dub:ٴ5+FA: fc8jMװhK5?`sc!Rv8(f&>#G!{6Be$x9C6,ٝZeJE5=hWI-e`Gkˈ?7@S>@˚~|y'2F;Fu3+?j/!FED^ݼ-;V"ek36 #"W9cOb?&=lAQ]6_[SWr[Ƀ:]+|)vtH_(CisjI->Ӻ)բ2aCkDTYDnT/z>'hGMmg"(}Q,kVOo6ӗ kϵ;6fc2m}k?/ꔌ+⚫Fi\E0X&.K&-lka.D0[Hh9]'cwq\lUȇ$>q+ z{#r9s<2`T*˚ &H&>OJp2mĜΌxD $Kt(eJu!E8/N.}X,x,k% lK6+ъG0Á-+ ZxX7 醡N)l í*pquukOe%Z}?]BA G#&C!oyqfIiO֤ > '-VK\OpŁ-Jc h-aŇ*wv$Z; a'E>4T5> '|(1 KqZtik֖7u,E$2)T!ۤ{^f)(yT@O=6NlKg.tSkxV%1 鉤T)Zmޠ#JIp~*bWHy5EbJ# ?[9 /5UZbPЖ^XKL.2fi7t]F.=$q%bYPQ ,BD ϶M Wsz Zɝ-eܠKš+]B-!'"ڎWUE '5CY4lkNR07ɚm66S졫8$᎗CldXň5nggB +vHC.|L!:YhA&}b.NhPCz8{NXM;7z*숫膼S띊ldυp5f"B$;Zn*}ђ,bl :mںDJX)uP&tqG@nl&q8 NM{1ދ!}F jLxYz \c q+)_݅%!Z:9Ey;xHM氦#Qbǜ|5d s|l1C5|Zn;ɞƷG/e"ąaV!qҹ5O4K8Njn} ^+ZVIh)]`4bC6󿻜fq@k ^TwncyevOc2 >GZGܡ0*?OT^I^/;ZE.id}傜ÔL'>_,`y!6=2QZGbgмS㨫/ gζ;h[i %ͤl{ }:د1"iU?/W*O x+dV>Z6Tixe8VSRuMSWB#/\vY EYLX8[-Sh酭̕C]fVkCkoP~wx þ>w_Ve-k:dj)1\+NEO͙xL:w3P ҍSآ ț{qԫd-E/O8dV{Zpri3/;,Ъb,B cW$E"Xr˰ꯦHE%'zmesZx W*4*NAH*Lbbm^KNNuO's; P1 YoFĆAئeҢNCjdo؏r&ͫFH*tQe >|~VyDWJk1sg*=m8AOZ#.4BrAxv 빋^)Ofj-Uo&Պޤ{,D(qcmyo@UϮx*EhtHwxOdTJ4"A,4K_^ND;PaEЈAfZ4&A^@s*{w?fr.⺼튮 ͙0xnbt4BJd%^zZqͱ}$r>n*svy15h#&ZOAIGÎ5i?2ŵV)jWzw$w 0q|-2~5b3R<3w:R\)D$0~.a 3makf}J&E$KVP:n0ozocYmuI6N Ms ļ2K2۝x\'~FLŅfl{_=`ղwrǤ B.ΫJf%β.+x3 >cECOhSʿ:̽ Xx{Ҽ>60l`ac/y ]-^k-գT;edC\n9\Dз =rz=ǕyZ#˥,Fzsb 5 !p*ǟC{0bۨIybaR4ܡdIO4ر,?uw.`y q≽U[o(sub$WXpšG…89me 4쥆W˹wߤ ^JP:uq,AJb.]bpCZnqI<:Zhul82)qnU(Qw8r5._ ,w?&[h7x7]^;6"| s5Nє#;DKJMKص"WCaES (Y)!)$9#bFN׆ݶ>8-peܫn?l7Av$SG5]E M[J'RJ#XNqzv_(ԋF,&Q Czh0мn7\W$q|-C9;YڢnY{,C)-oH}"W^ DyfrbE*LمEQpd@j"hjrjN`%P .gҿ3ǣl.۱3Ž'_8wf5P~ ?-?@_7-`(i.Db ˬ3=+tvP9!]9K6ধYs9|P +S&yNs4\[(+Kx5fBT/莥sNޒJ!'x{k.pv2MƬke >'Sg2;]\ SL+̩?R*C7%],2T9&! kqQՊ{ a0qa`ӑa?vI|4˿JjBr"2)d5Rߝ5ۏ0;eۋqH2Mc0h6tZM "U A@ / Wg0u6ZƌԴO'@\OH}@Vxٰj /wP AnoyA92Y5A"s#E  H_!>C5D;'ZKyPX稈*Eӆ7&V.N&i+H Y/OȠ LSL-)7gH2HTĆ3k-w7*Nˡ|14l'D$?A_\Ed 3r:yx~tYF"aMNcxu3[a*yҌ NsX5\"ՓsS6͊,R;R%}|+c-F/ĈE^KoA)Цq7;Y﫶v[DL@4t>V ql@$Q)qO0.-%vrޒ|XT${@ic`y1O2 S>>B}3jKZ͉Jԥ &޲luMxxdI^#]ʮfQן>ĢA? ⽕VPS ҰMeesa' `C[~e4iB6q7K~<;iE7wx׭ڃj!CРM:}L>*K~Zn2l-6n${rLǢy >[!/tׂa-*NEIs=(C:`73xG@6M&uk"m$߇sأJj [cO%'lvMjiX4s4(쾂 oYSX j[cFQ?'J"G# aw NhsQ6cv9$T-#eݷӫq[]PV&#u/VOD:u2h#4UhHkGRmxOdb1z`%`(Z2#eVUmV|kUߝ17\+K%L9u#kg'`!)(}4Df ұ~"ś2pv)'] R5:LnmC-% v9>'d!(CNd!20Ⓗfͦ GlAV_.&8ƊT$i#l阗YҕYsL`"PkKP̽cq8~^>_)Cڙ %#k* y╿.1P!>B-?܅d13C] "zx>6(:r.̃cirfBL:yF]DqCcʪs+%82؎`((?d]Ώ z3)q6,>i^8yڕ-t#Hu ;Y%cHrF3zP8 0}@BVP2iz몡`X?W 1CRd5}8N8itD@j , }(haw:C"][K))>^YE`}DnZ+9q=vƲe˄77fiuW%Y=+adg/y"[8~+j`g44x4tnqx~2DFK#\vttR\u] 5;[ʦ֭Y!CӀɚ_>3nӋ_y-%\V/{U2 /B0`Yu[3ݼU 4Nf5Z5?>mH= 7uWwt~O&SL =r#y`~NFODE!qVMmN)!  ϑQ3v3߾bN4ԯ}_H*#,5/w3BPlBYl|=+E62O0L/mG7MdM; ؇T8/e.= QP X.q`ь{^{zN;Ne[#|(c :6JŀnҀi\jW-/_9D^=fym+5pXjg;7p-%gGq|pBx:vǴliD/Qy!á妮@)۝Adg:L#h՞MYܑjKS+Glvߒf Q䬊XpoQ=-af̸5CA]Gz/ W!TY[:!15fTg3$^H.QSk#x}WTOQ͟ه 2GX@> 6bL9Oz3Ee1y %i\;cr: 8lWS~ U`&l=,`>&mǪ`ҷ.8~_!}{+Ҏf յ9ߨgtt; ;`;"\/@3M3˚EQ*'2'OGaA,E&q03bՏ鼗+oK6 $V|{z~!,w@@>_wcgvdy Y6{k9RJl/@H%d + eҧla0[Tk|S`{8< `r3 4w%*rjBoTyGJ㨖0(pbԔ ?5(6c^*6د3{Æ ىC 9EVi/_LΡpz>Nfw+2ɫҾAR}@\( r5ATwJ[ʹ|r7ٌkuJ: A&93$)'[#$+wg7|49B:اqԼqLQUT\${sCZOFrXXPIi¢jv@а4>Aqq9e\!N)l4Tflb~=# ҈O_(hJϔjQй7:~'17)Fy\2S@K9:O i?Rm{P{Y1;4u$l%A:*R.xߺ|q qd-ڙt%x&P 8+ "QNymUȇC9n ߝ[ TZu55ȼ/YVJJW0)F0*aDuy1VݡN+E^U4Ry[z[kp{|?Lk_ b_Lғíߜ?)E᧣ <3=ZP#~Y8&- CV`{c9ꆗJjOt|*7֢1w gQb˯Wkng=i.[X >jy@Uc5Rd旨 d"0RYL{_t-t~7 u | h0L4Efk@6SE s 81ZM|F}IC5n٥1nLMuPDyP* TjrGwX3DSIvC׷fR2drb6#&҃xBC {R~9Ys6B#>jqB\[UkTIqߑrw. zs!{Eގ3T8#0qM80Ӥ \+: b<AOy-Ua)>*I`, /vcz;;pR\ՅسhoӔlڤ{Y\O*8)3 .\3ա^SlV^'IyhDELoȦ#9bbH2gw#>Ko/4NөLOyY3c^ʬJogolS14z6V8 %Ŏ@(6]7ט^SQf&n|dh?w#\op|Z N+H2q6 !ls kjr= ۖRTL~nXL8l0(뎊:]Aa_z(?V{@S Sb/ =z`ajZVGlή~ܮ#cZu1D\ura)_Mr5^C4_ޏI~Y,bP;n{њڤb"<#_W >D[m5ڌcS_0lɪ^hJ&c 0DV%-ʺIZfU\٩r0<){[v&34=y+l\y`?H%\Y1y] KwXyDij51]нLI D#v]9 PTNKZYkaͭ pI($7۞)q$Ɛ@Ռ6u1 Sdb Ԓ:m&]XetJXx+YN ,|w9aNKKOMFurJY~82hXtyܿ[یSخ(14" Y;ee^"%o#%4$:!EW} EnL)hߠޕhcTTdHMlo5U֪rj ȅ5Q-@ȣXSջì&T+ wgdSFϦݾK47.JU{#=sc0j] 9Q'{eyj*H=Z ۺ%رJn]ipJOԗXRfL4_@NF?8p,tV8-";B[Wh~)OoWW^H݀F$/J? ˏ_h*]~ %4z6'=l>ljC^۹d^H2d~#jaY,G(e?,\h 6婍eͿ>).(HC4_KLiz^,9̬aCQ չf®% C^]y  @D'jMxsdfTF=(GQ߹;ϸ߾nDAqH &[w24r $6iEutEnUI : xdܴ-m@0gsAdP^? (Cs~5-wxk!x>_l Yq 1$TmfpB$ņ=&td3x)e)qM#I]Gl,8.t$ ju [5u]%* gÏxzݻ(2&]ɌQ*B4Y>6Pba o̓ud}qgUHr6u!7gxF-cr*4j/> +Mz-q#YT*iAxٞrNƥ>HDX7 F 0}h?xQ"qJz5jObB49 ֍$iܱ"*cw=t6@Y_E\⋤DAkVt)YSOzx_lQ^VxnIS ݺ(?hl zx)<+7ZN[rX+xX$xNF?[dr^KD\!~y uXFٞS>[5@ &Pq'y5|eP4CiٕJLP_]T᚛3&@GrBgx]eLxQ~3n0e'bgk(,h\Q3 1(Y}mw|b#EgnddX/"!å9R tW-L=-V`fǪJ4e2y+8_w(7_='eiөV1LA^8nƥlYM@˹o |{k lA6?)G̻2~ΕVm5-ʫ1Q(0iW( zm_E)KpadҒE׶99xD)r4$[p_Yt=l^9B?k0eE\ΒYvV-ճS ھ[6ɱae"J37@'i5TY waӗ|!(caz˂!BUۭ'/wnثUSw-{ZIyd.g""Oű\)7:g&_XP. F[Ϸl/zZ +E_P+Ӈnvm(NoeiL`LYc ?*^@.[,e|(+kR 1lYP^/pERj9 PwH3D{=F?Pg) \QZ ~aG1I|{6S@7ZU!.hHS^M稸F_,'Ԟ}SN-Sd$KHQDSO972<%'%,v_bh{)"q~jsRM^{ QC]5E?h=өԬ֝;WcLa|?T*KHT`A :U'?- $P!j=-͏Mu;vx"t%sJ `K"quiR!ǒoR=nYpm-< ~깎dV \~J}eU6bAI3^A|H#"[VBf[CZ2֕5 !F&` v85I16:±F<R+39lRz ( #(<~/ UZKUE] Sl2o 9d)RP ŗlӑz{j^Q ㆏S*,ȼ5?w<p2s#>e7T:[IH1ä6-m4H9yz!73=I_Yxyia7^?od$O#D5R0prӷopUym9ʓ/C8+.T^(nIMd_‚Ý+]U}-9)Ů+YBy -XR !vd1|hI%|ۍ#c\a@`owVRc5V/,"]4K*ʡg1V@]/JA%A)]~AZr[6ѼF*,sߵxN(w%đf-;O<޽W.:b|*JU"tdkr ć))ie$|J]seù;{[V*k sn&LUY=\L?Sj2yo6Mp@/[ŹJRr Ṙ&ٝdglqKAm?@}'P=B^TUT?7fjN vb}39E 6([ UI_Qخʜ u&Ш1nbyx.T}lq>KGTJr[jul,tkp˦+K'K](SK;m`fu2L` t$dd!1SSsACnwGG` .JP {AIc犺Λ5Bm~ H|XlGӰ#@)$8ϓҖ}LX5Gw#N(~=] [+G^ș9[\t^>$q68@^%s]N>Jȳq@U72daiHi':4}S_(Tc8\urd"5'G~][3yQfxj\<@. ~?n[)H~n^#_c̈nR>誨yS"xxCD[rl,d9-tÐ]pV`B,c(9=5Ժ`}!c!ǩL#t_IL}zΈ{_Hud+m~E\{KT&][#gGy # d<]]ZĠZ1 >*&J /җ?vYNOF rЙ>uw"qэ7 TGςWIV.!Ea(M; N=r{^ל+l?fƥs/iʅvt%69"DfEGaF_{ygY3Ƃc_D[GW?)IM] w\_汹!08G`)BxR|4FBd~zKqC`<;`Ryr򥹸g}WA 5 6Hc]nainƾ$[Е #=7 CmոR7@~ Fk[q uUoZo\;ylɌTe!rÄ;~lk3dp(^>34).K'9ڎ*7 B? C*]@>o%2\06?e!94 L[ܮS[ h_FؼËqpGB(䙞FGl=.؈\]%Ao D9`=Sڞ3^#O@5o@|&mfCͨ>pb}ofNȪohf*k [ت_c<'` Zfڦd8#TG&] iQ?GDH!QkE2GzU\=2ݺpK`h2Cu0s[bV!ؽ5lD>^bQrx*Б<B,'#pY[,AIq&2E1VTl`ty1(a}~si٭s!dwo!CA-QSbF`F(r=^+KAO}}ݿ=x=Xij;4a͋٤aq[7_Y . z+{a'͚oEJ1<rg׭,9qSXV:f@^l&&"bOITv[m&uExK"ə t߇[cfPUc< TQ\fɈt⊲=}mXE P3y`f[I`)$(6S+m0Ǯ}9#mKxTfVf^4BgUjPG ԵV-fMܨ,';.ߨY ջ7^ }wS>[\KEإ QW[{ AiM=>[6k1<2BP)S*PC k&=,6-R 9eD`[*1f-NCU2 &ٓӭdVk8MZo8bYubo5W;45r0=;~p|bY:uO{qR&ٟQfCΠns7aw|t lh7c|̶پa4ݱ=!6 ~K]9aE0Bi!amA$FnpO]kiI?Ӌ,B%Ԕx:W8غ3,d;7Z\ (v*0b ݲL̈N! rL8IVai[%&gmi;L&&pꉡ93в}j:̆=)[!йEf~`GtƹȗKV)9,YVeOΓ0q69%,uȺ򯓬,c#I0|*aai -Y?:FsS?kI,yak2`[ᷓ >Yc%F`zXb+&[6_lc䶄68pV~y?@a2whG 1r)dOge952\Ks[`氵!lԼ`AF0DfwaAU`G~-ˋ1P}artVͅ-P.-I;l]T?`}eα "|(։~Tt;]t%&ہe lj[͵^R d$ A䘅B<XuvS?˯r9<8v% m 7ᰟ`E}63+M^ܰ̂\L&|(n!3|5] pMWE}ʻ?_xPPXΆ%kn`F!OGM遅]QOzHf1_3Ƿç}l!+߅d)T/- r5qŋmc?M5cw>/S MJor~s,ƸHrAF-LU#"&۽au7x5f:* {a< ~)1QeQb70@}a}O">MnғX%f p崫ucfiږKzZoJ&6 y'M\д`8<5{LQ||RMwc5@ G &l s0ֳM '|Sv+g%<~B7?#ҭJ~]# ]Q/P@܄K*'=m>1 GuO $S,׃ɵ9_{U:q-zhhǪG4~F{2wl."T3iQBlƨ΂O6޵:L؎| j [dM]/&bF~nAJ~_7#7:O4ߓ y^bS8nd=/ .9Iy)DVzٟY%bZ:P HϴݺsL;$ >sD mOSK:Ff{ntG| B7IfXϹ\eI;})rE;S6]#Q Z)*F2Ph &|=q b~!gkd*ep9HQwxCS8w2TcE b, s'9E!Oxdjw>2 l}`P H$~r.flv$4#%國f^Ǥ HLlэ=3Sx^}eyT }N hSҧΥԀxz18f % dw81HEZ\+.cyMulVk0(&OU_*AX~znMF=, ;o@]-#+;\S Jv|ՕgS-$D#VgBUKV =Wt~!lBnCffJC_1YV6F_D^". Vg〿|poBU``f@K@!`tŪ*651ҺG#zLKx z }$C`9li=ln$^+MR|V@^E(\E!!Rֲ9ԡ-LHq&a/ #<; ٚ@kϻ PgYSN'%_`2c@儙rQ/dqG, &c^Wc[ߎ{{ٱ.,HB8ʆbw?V+3!@K1v3_K&.leТJ,c lz(wE{ut6hZM|U& +@P{(PX33N]f=m/pX ۃԮ ĄЀ&ØS*> !KK }/6/Ҧ]O81r;(5Soh䭃jjv@ @DK L4L]׀Y Q[8O zE p{Za4c ,|݆y\#& s@ʪ4pc*q"濁~$H/Sh[XqL*u!րeu3[Gl4GM2TSneuea4s Fd j*OmI_&q?D~ԘSe+>AMnK co+gm)(r !}b6S;%0i$>!_+َAU3=6G9Jk*({357M^F` J(< Fü6A@[&S~^wp*w-o 7b上c'fD3}AnP 􍳜Z޼VTO"uB[ l'l~\zVs;G|):ѴA_'7lQ1<(c%͒|M]o>9C_.i]oHrB$2+8%;G:v@I8 \h^NEfmx\]}!ya_4UIϼ0ux 6gꅝFA>t 90$ؤ&83iK;.r,>10 ;`0Pwgq77%!mP;t{܍O 4ҺsUExpׂ)upJb?w}/0ODx6p+Lw`j К`Ϙh'1!H}?>PAoj}Lv ,l9t|En3$T<"_M1xG'=}=Sʱ})B+lf$=uY8EIOk]ra#<`-MVDBk;$`D$ Hts֝Gq= FCdžoH[SLk i"  G:FO"OV %B@ O|HP`LlPy%7D 7C^&k|4_]{4X 9JP'Ӿ&bBoyzsBk(1'Rm<iE^yc쭉ʛz UjY0DЗOGP0D&sݕ<%o G5p"U2d 0 |\ϠқX"L(˼/IlП:ؚ Yi 1wZ>`o66_ Q ].;Uyý`Zej͚pd؀9 H>252 1smOc{ëOS[Xl|`p l)Z dY]fzmW ǝ.V+1hlf&IpwS^snf&2nmO9Yc8rj>VM/ vEo<3>U:kCJHę ,'_3[i_ O4g~tѤlL{,Pq [Pg o3ƅ>FhBK>ҎYo;.ڣ{60wg|6ނ0\w0M^.Ճq7‰"Z;Eȶa9G;ԡ8VE:*WhkηG.Z+o;WemsܧP/z7,J0V/b2yz9cۂ}Orς52L-ថF-dQPtbX 4"gZ#N*͞8tee8Ŷp*.C5zP*~TQ~k~ܠ^6a]'i|ւ PkT)%ء"4 Lűމ&oX1Ϛ_ 1C{t!e i'#:*4{N&~eYƪ^a%=n cn ֱYA_tb_)??:5K?'%/vkEW'W[M=zy-VHK f;dD[iY+#8RmZ^hlZq8[_`rE<*ݡ2:wu1́R٬BX*Oƺv|5ɞ\kr:n*7pؾ䎼(\^fTvP߮IO, AfLtȰ6cהHV;.Z_\ϓ̩Yo+wgY*SJLPv, '/b399Ǟ1BL aS5҇]WL}FdY73HIXj!O@IX- mr S=3Y[ZU+^ao;ePZ r,:G!ghbhE| 8E`t]`򀩦KB)B \{ܿ"Pܟ{"yYɻ{ڵe*6xL=EeZt|C&h@tD+|B?w[C9CΥy:, WWVrUYU0M0bZ%T'zkYD4 j mYTϠʪeEFi1lsHpS|p_ ½8o84.q,6.(+Yk|L' hjI߫Ά?I웘˜";Zc*8Az'?'9àr0Q`q3p}qlLиuDf">$@n IBea4F.Wo;Wi^58=z"0vkϏU;c7ef=-bāHW}'P )jR0i!)+}{mHf)ᰬ? &\4ީZⴻcCJ.%,}G9H}/)R?{!z|R0ycʸs *^.M>PޙQa|<@R{] _A;BE꺌|oX|LQ 92]=@u0^T_Nѕ;9r-߃{'b—l;CO$C.,n#ȒlKK]L%oBؿ`E=(:f ?2G)8dJzF\*%2RYty8/NwWRqV /#c ~YZbQxz4J?AxM)?J좃ʰU}8@As2Vwf {b9ZyP}\̒G{nx+ۦcu̔YUd3RmpH/0 \{8^'$&10(;0n[ |Z:Epugkˣ$Z=O: "b.[(c3@ރbRUoPJRmGm-) 1ʙ_BD?S&K fOwHsUH,{f2/ XL - Xndts*7_7|1С~#w-Ti<?XlɾoB0hj{ o5Ʃ6^)+f_*}ekir4|)Vڣ5/Uf.5L+2q@mW$: 3 AKDPnJ ?I厠e+T3o7πӁA EgOd;`5Re$YD_O$"Qޡk6wZ|=>@$0-R@v#iy* dm@`csD)Uj—.6"<[3ӑ z: @˧#wmb-pIB80W!v^X=Qǿ-6 L8=&>ӋDjʋFǑW-^`$TANEIeOp_YtFg8MX$ m,׉l&*YHcy{\zgB8z _uB r5`ϛ ),iFw? Nl6:J'%YBG}V$PB rIBVN6Lk.%vڰs9[~|0j޾ *μP>p`d=}e6gDp9p47DNp}@PAzl񑱊l6;-)T`|1}f(?+i@%򤉅|p,۬h>gsZ + PN\v8!یs_\ ;"7Be%#V&ojǠDAP]&W$"EPc:@[S6kpjj6B6A0l|KD_lm?,9^q#AʾCKZ^RNmT{11r'qƱq]nЂyB$72 @Zc?xO%shz 3z̥-y%l<>B>ml8f#^Q(/ 3[,Iʁ8Euӱ߀F[S<ޘɸ YzTuIj65N~8qvH&Ӯ%!quJtXRT~B@BM@$x\=w1S3݉Hp ET-KgT_eX@<몵XjdG+6LӇ`9S+RWLѬ${նVEvT Mo 뇻8C{M3߿kPmg[J Bj3P}D=X"20sF+>>ꈁ &xJC; pn9F_un:AS洚o$싿YN_K0Ɔe[M*JRC;掇o #|[N .6L6JO Xщt$eq?7dE짂a˿/Yz#.&>ScKdnkjot,,٩ g,WA.!Dvxj|nz,4~`$"%g *X~<WQF <8m-bb,ʏk&iki-8f(uXJ3]f&+=>0sW@ݷ&.vWrG"ڟޘsc-nwjR`d@Gc$UM1>֘@̫f~@Gpߑj)Ѣ6v.icUBnUA8?[a;OD.z"*MN V>k|H^^utoF͐A>RYfTy|zy{~ œޡj{svL5Sg[>at l W,#]23}-Dĸ1݀'Y-7B8UV!xUy>*g:>fQc2AN, :Aq^%E$`J\3e@Jt;x{.v8Ҋ ֥ %2>e'{^Cl=APL) 6Q?:i]Q'4}T?syΞ dL°lrլ.KDo0Yt2Z1M))&ĪxLH+4hҏJ ?oxnv-"HKL9@8ړ|3 L#GM~TWE(V8~fԎ=aj&* m^Z;6Н . 8|X]Qf3\r\M8"ivgkiQgv=|t1z7MAGQj>5L`r)wQ{22F,MyKzyRVhS{ 1Z6pȹow|{a^qfb5<;sKx;oR˃"Ig _ĆZug"FיuYضXbM5ͼoS5. W)j^si@5&5wLMzYa~N,33*9T次+xó"FT4(Γ lSR٬ԂG]5 1F@#nԤ'Va&ifTަdAq!*%-+)D) ǚϦοx[]mTɈt|tqKPm)䰅^e+V.\ҋ,$Ԇ8JP7>%Z+*3!)XD'mu]?h#pv^JBT -5jw1.[][^<-' a@Goy' >wl^ m$Hêp2bP'%ė;fdzB6\ȱB,tU{YZCO/kf(o8l!ݚ-9K}Tt,T VԜa lX ϐԥl3-qVf=PHO |— iS>~RzxʵiRDgVn3z6vUa=lyq̂rp嫩d$^F6xQ1du`%i)lXȭƪٲzd7ZYq6=Ee/=JMJt^FEH]<8ͤ`ɰM/4UĒvW+\)E H$V(1>guI1o'ߞYGУ)XϲL}/+) "yfGO_fn{iZ aU`M4AY屴m;H,G;8rnTe7+gUWE $>q=r?/I/$tg\H"ʯp_Ddn%`OD)#XqbkAw9L1 y-gE8`Ts WnA7cvmNs& \2M Ŋ ѵ=J]9q\xi ;2 _`dvZ d`Gs6z6c0l +r+&?K-GϓԂ p6%Bδຏ݄VԀ Ȼ@K`tU>V29 Z4i<'Q┿NX/ eCU\AߓܺydgOՔ0&Q31Gaa t _wpLE@CC8nR GyIH_?ठ-c ')z ~ni<@E鷺 |8M`_>Eqdp)JAӕy i 5z%- s0}.G`K"&Ve=VQX16MM)DLùJf-(N?Y5->80BJY;*2SsmVyVk-"#۝ 9*F4 e+Ḋ/-9ͦGQ1ǓuG,V΢2Cc !H3c|e-N:3\7O~!Y-GDũ26ԓj{Eh7xn SBR !9BH%UNe夳4 6dZTF/ Q>o-OƿyN.S v} )Qz!%oV-f 2CrsR4*#:ks,^t 4,߾s<͐> ߣC'[Ƙ{t}]-X[T(cmLF! lC? ݟ>n UVΫ1D+Bn3BMG7 YIW #!2;ξ&i[b&>`}M BuO[@˗B$X>HQ{Ϡb95(ʁjn@&i1|F2EMeTL:L/w%+D c6VВ[{Xc[G2Y[Xq>R/ѸjS_2o&֑֙a,;ttĽm *o./-t ZD՛Ŕc_6閭Υm.xSUL/@gz2;q37xB@Jqf_Z;7srtdvER[C1=x(4R(KnOia29ÛH5 Ƃr9}[rz ļHplHsShz(jَFnH$ȕՌwVWcF|-_!g/ݾjQ>gn}(lQyCrX'G<6tZP.)M`pd4V:䴺%ѠGCrP@f-G ?7Wݕ%-3PLJ_Lml~NȌK:抠U.T08%1.XJZ1WYMͤ?d2r*ޕ܎k ZK 3>;Ma9Khknhx[ShFG eg_f|W.^@Qelo Qo/zʍ 1c3>X= ʪ(:4=uh;qٹkn;nJAe{G*Iю52_%ݧY`/7^ 09:SIwRB*)?-KU/>%ٖ*⇾$y ezqaM0kSe}/WB+P~$ c#ܿe#@dӁc lk$.xTB ucKdǷYAg]Z9)z}zB)b/=4(P3rX %CS4d$ТLmiG#!ek`P٨O[ 0Oys.,[W^:7=EKN4aU%{60dR>q%Jt7*i-H`[rFCn:2M*NIFͪi EDŽeፔ]\#{NA@SAңѿ'u?C8\\&,QC prDC2hP"x-[z"wyֹ$;iṧX%VQ1crBNͫR= nž:Ng](hxj1ym.  "'=ɹv9At3ٲҪ)w?OSb^!cOȼKLJFZu&B};$ ::kO\H9MYz:[4-bN)0sf噮G a䢶/"Ss8wY=Fq”DBgƔgܧa%}tJpeIнgGGW|aaN~y]Hn095r,/bLV4d CJkϳLwpuMFNekyY81XTlal2s޷₼JVft rqo}q;Y[og|R0 N⬊ՃFM\oޝScBrWu2 OjQA5#:㥰;r?/ẅ́_LؾwZ̘2vDK5 aO fhHOŹ U4_W5K|Ȉ ltzG,s6WJ}1?*Ifj|7^_cb}PHKXڬjCh?x}mo;o-6k1!~Wӫ\}R.h[JHD"fG"|H9BYi,]0ȩ;%D4  *&=0٘3Ujkӆ'Nfc>_'41Sy򸆛JZ)], q4Qd)3W~Ko"a7Yp#wap~@e:nһ.:6|ИNZ˸Wh1{kn40zTF PL#A:᫒+ד(}U8Qm9e[́1 ]<[ցirc ׇ.Mu_O@]biL! kNS>v44_,<ͼI <ǚmd}VX6:2i1F;7} u573 }`z&az^tJiή]r4GzփXt2} RClo y!|V&V9ycr7 FQ:YxfLJĞ}l NU:seT()dJl$l8cmhxsxLb?n~ fꯋ+W\l*xS~=>slQ;NrH!9Md<=J_T7ۺa|.9GѰ$?"#Ps,,n)u9'} } ob(g(ʴ^$ql3M4vOڵ¹9p=^cXF|Q$Ȋz5-WM|} 卖5̠K WO# eV!@^ 䈿FK1/{<|C^@AP>ƿsýCSAvܪ"nFggpnmwSWUthH2%t_ DyӨ#x!Y6-LWIDl& ;Uds[^Ŗl\ښԃȟ$#=mjvjֈCs\u'لG0hlry($l2&jm/F2Dd:N@yK&KΙN$@rTZ;Ӣp两(~z1&ٿE!"0tA}ϭ|p/&Hvך"Gn-硒2xҾ5PwF4dvhaEl V.8u#ޜUpVlFмfz7@A?͑x23(|?Mf6y/:1d(m Om>PqL J n>GyCS԰촃( \6znkR8.oH†+&#7`C3+(Wz6+5./,\b/_Q%bX X i@b،ݕ^Y8@/V5ag6Dr/ꮁJRHEX]Qݧ0\APYxKΉ'_-5է6E$eLCC"@ǭ$ݓD <({%ӌMi:d%tqTf$׶" "lN\q ; ssDe Õ8aeBE\Uڟ^߾.VjE&CҼ]]n4'~ܟ%*B)! GF B ϑ +^kԺ9![@sqyh)3 d/6OF(o|}_WW$?a6޸ Zs|ƀ$贬mId!9bFsKct4P6FNW@Ҝб%t_y6WNX_}i&~5d7c`.N~\lz)crD+8q >pɅ+ DDi'AI@ )!r<1~ĬU] 8좮,*O^Jtk0z1CI"r_Eq7WA+/j/$r‚TMX.5=hL-b=߾]nQlIoMg os}ⷔ96=pX4JE3"N|;x7p>IgYvK^yswqBm!ԆLl~hq{0}n@o4gQN*Xg /SMk6pmЌ`;Gc^~(a22>JUVEWygrfjuZjh庾q>7%GN p%ΪR+ieh愡\s ;Č(**:ǝ҅wz)2v/xb-TsGqH9#Co0I73wߏ*iRtgwHV'Y= V[$U_G(̀5lC D J13)*oKHK|\" |k_J2:ĖhWa-K=ly9޹ Gȫ1TPbcSZِSl-,5M%W;H Tv`ݖ i߀b#k*B[踩BKlb)Қ2@M6Y}:<[⩀$v]#\.ӭY8pfRb\?bft&sd3DF'miyT/CX_`fK`mumlq$zn 9 q> mbyE$idkYj%'w Z)1eZc"^dxNtEAR͇Иh d;%â*W pCw=uC02=2@Y M#^D:-;@6˔7C60R,ia@wC*'02&<,ؽ"-~0T ).'DKQ 6JgK+ܕ TҀZ $'&yG_efց~~VF' YdxQoVߨ~Z/"~ qo[#ˑ4bMZ/Iɯ&r gZbWNHˊ,E豹Șy|t@A`#3;J=սI=e ew䜩C)o{錮k#È{lkmG*3QTUߤ$W| II&! kh5%Rvr:0ɢ tuX$X%(T]`]P}߾be܁j7b 5&SRb+Z=tgGH$G74RVQ?o'{i;_,j`l$93'i]^,è׷u/}T˥i1i[u $C# # %RxE:P\h$")zB_4]W{n}iK1! .㈬tmt4ςW3u4<-0$|41cZjW<)(0ơt`.ICu–57ɏ fe.[rd?cEףNo)`ɵA%7e`(9~OPbƒ_"E Z:!ku/I/RV=aawG^1@bmqBf|2]1h2>/:o5|W*h91?Q `Ws01ju٪}64g׿Ho.˾~6&jk\I].+`3N/S  >&L*aCRʰŸVKߧ[kdt6o쐰Lr*msdM7`pG˟"d%m)GCQl7R19p460Ľ/uYWRF ]Uߵ~xyTyMYwB-nOMU?ڝa$dQX}i4d5<r!G7S}%oCH@[QUp| N8(Bծ,I{cd]7 CwlwCwld1Ţ- ]Eqc)wrF$9 #4nӅpek+N2v0w"t"?$I wnꀴ('Ry)bqne689Y"# pr{Y\>䕜*Pb*f- Z&\ÏuA5WBP%/BRԜM?~308zn)r l:, AnJ謜df@>Θ~7:F$#z8"i*hBTUT 4:ssBϴ;ą.0#/ ޻ o  [r%~ Ʊؔy?|MD= g6HEEܨ8$eaCkYG*jF 1&b)!E xEE[aVή @h~ M B JR`ҥBYlF>٤$ rɣp\܀hү?|r'pA}H _MZyuZG:۟1Et)uM7NZuV*Og~%{k sÌ>t?B:l$i_6VQ`XY]Yfzvv~73ZW6b$zTM@3&d`S$&&}F .BbT`Ұw$z^Jrdc.TN;:3'[׻ =PenjDF;gζ2rq۬2$Im]ʃ=L%gJDƒDPdkuL)]sm:hEů>ڵwMoI`n8&bʐDETd uDƶ)z`DۂI02YD^);?WSQ:vɱA=׵@ ѱ87ݒ&Kje Ϩy٩P."' E/z]AP&{gW=S5 &]2p7/Bv?z`qJ#86} R-?hB&e,,)2YuG_JNm?ە]iiw@8:''_69v\: &ct$QfwIij9(_f33΂qē d)R4R^K.w{-Φ#850v 5!+ o>C,l>d.s'suwqH2 '˘4 Hx_ue mk1PK#˶|r?d1W~2GNfټVKu|I9@t2FJpJ3$ܬ9r?&\t~x.)R%0TfwJv:g[ݤ@֮lPHd (a I +ʫڕL8u/njMߙum=&)9]nݩ|+ljX]]+S,.$[Aρd⹤jwCҎ52ދ[I,d4S @{܁NJX=&~,i-*5K.?nL$˂0d7UiW~Bxqlcqo: o}Ps^Vƚs(L7q;T#+6v\R7\ {[Dlx$5* +VpiH* g%:̭"уWFuıޑE!#.H7Wdap xMDLL2P._pAh|l$}iG{m:,U׆oH  Ю%2x=޺*Z=-Pzr0'q!- N14,eӷr嚜awZk|ˠkxu>Xxn A| b@ 3mx:H]g& 2p?qoon4R%@eO#ey+(Qd)]MDw)CF G06p^eo _N/o0/7@gΑȁQ ,f ڄe.bڍy>,GǷjp`;jv^sw w@j-?-E8,d㌶`NlW0vw" 6{H?+C[C>ULb8zj?)hL8O1x $xkQUQhY6 C鋊h[KD{Y/./>'!0BVIz~DKkXZ gw~-sE@Mv'=%ʀ1qX5`Xi gЄ?ITHLkemj3*HWz*$4I9 n})H.Ys.bbD?d RުXq[ )u,KB|pћe/G(")} B(1N1sFf# m)@>ywNy[&J$l @6`1zukFgT 3Ns(JcU]X#A:i8m3e .E*W~a"HGOA𼭶ؒQ/#4jCу\% C t*﷭eӳ'~rk A=`bxaʆ%6\$ E _3` d]Y7Vp _ 6ʵ9IQP⑳Ƹٵ)*m]{=K%<HU%h"Qp8ؤШe)$۷t;Չv"tq@͟s[1SHgI^8T&wVXP=fYxvi , ~Mp-ͪJ y^>߽?;Q0Y;OBij=t6 ;OV-ÿEh}Zrtv{藢B4'&\yzB.1J1'$@*&!g=4B2cs(:|jŜ$QUv Vkiғ~q{rR*z׀ahDE]DR>bfBzݡׅVyEdv5Y%kEhy>9yİRp N%5ۛ ,3jX y*htR9[r(= ͞9;HM% by"ฎD"h {M lZ)3b@$ ZtyFKl^u62- r]i#룽9@;MkmlO:%yWŽ)B1CY9_EFlBڷ+M`r-3 oWNY'^0<']JVa!rC b*g{ 돠ϊ a ؊b>-,8՚]WYrg|ecXV0E51 5IUss- ԜAֲ`>b=l'Ä\Sy$LFέmP jKw( ddWGڃ,n,qǟX|ŏĊ?>m)8ɿZmrd9:ay3bjɄ9Wg$k=τKW<|102 BymfzZp{v@+(bogv|}|\>W+lS=ז*aX;C!J-Ea07I5J8uH/꒒p' A)@|[U83f:mW }Z됥Y~Y&ɨHS/Z_Vw7u| X9ctB߯.|EHvDBq0-I:zJX>DKO@i[٫Q^sDdV&WctBPntC&> UU3bӌwĶ; c' Exsn94wߙwTLaá u{c(C89$H}Z@8"a;pZ D0]k a6l-deԝ xH 6)܋ͽcif:*'阩}4{ +zAl FEQrrհT$Ƈ\p=)ߠѺ [\qB&/ 3p:!B|ŭˠ1E|SM?F'6 ZwpNa8TYێ#3քrنhZ`[4ZO sCx);\ j IL}?8l ,ΜR[C=C0?-?5{B2QI8R$k@*-gΕϔDR'7έ"gUq OqՌe}J"B@^-T1kˮG+*Q˹&o.$ԣk,uI8X /c!q*[$)t-h5k]WvDaBٕDB$j?  t֥-dDCL{NJ{ػyc~r^$s*d(_dDֺ V-V:.$Rz嬉5(!9yQ#?f_)ns99(J+׋ kku;V <~,WzMnҌ AmT,eڦ?4ط3׻s5[![TR9R6&xFWJ K9uVD7a"Odm1Ңڏ8z<!&2ZM( U=~+7b z!96ܝ Fֳ@.7,_j5&iARA9gb9doZ0A0#{YX6ɐ(Dc+hoKaA#WWc1a@F25DMeJa jg֚(ұ-xұ\"hvsFV.{Z['͈6"yXQElP]Rjף C?IՋc4RLO} A&្q+9Xy_ 3filܿ$=-jvb˨<' `IVQ Q'Hm8ʿ.znxIl$qD0Dt*glG#Es:6PBJޡ, =Tb,=cB @8ܪ^w`BɑҦu(]ee|73;V]Nhd6_w|Y?2a<*[gY-=GԺ Mi>}%S_HhS\l rϦIc+ TUβǾhL B5ZF̶T&(ymgO 3QWcv2pEˬOs%z#& ~<ؕ4fz )EVؼ$嗄u`kru_jjDhEæjYI(p?ug<6abm^&6EE5<&}fS/ޞò}A,8?: #Ŏ&WE:s]HAyQ]g>`Z+iLL 5th5ROQSX\ʩiZBIAEf[=#L5+Mxx#cKf.2*PEcpl^Y|Ð:M_6H|WJoF,r]jhץ@B"sht a^]F KeES{ ^K"YIuH@B6NV^jxԇ_oSS6 N98RB"΃g:\IZ:D*&]X37}kgLJrݍ C`7^U, uWBe]@S m kZ9kUV}_L)=sŔuE|XfafdQ@ P8KHe]ք@xsk;z8M8dCZ_=`K?VcBsmddYb 6 FkSu5fX:mQE+F)L5t̆ϔ؛b̫~y\HçOWFySL8N~{wМ crAyteY/j.w[(IdR'p9}4-EcK+ lc3G.P#^rk&DZЮ"fOq-nqv$~i*,C+%Vc瘟wp*F8'gjT{9T>ϼ5AX1s1gwOTÊ"C ʉqqF20_x>ۚ&+, f|gU5 D}7Y>qbG׀Wo8OnvQQ)NJ / =gP=L0 rz 8X×cuyމzUg&>+6뺗*L~V kG D&DK7|#=I j:M.n@Aמqt I4@;'-->+r`@oW UԚ;nx%?#"eZ I/JF0b݆`{?E8^0m$TG[ IG3MpմP_KpiS•弰I9utstK;@.|:{-͑ cJoīrbY-SUW˼GVP#l8hN2DȎ_yb InMWk&ҾpO}$ ]sVЭ~3R3Yn6Raޏ,eqy*Gn&UBayMt7i3ըG:Wla@4CѴŸ723rm2ݴy~pg7f= $9eЂ?pjIcef/B㵸>]OM8. 7SZڡOH_$(FF2@ }}#S{}LSsA%'gĂ1 k;A?WPE!D:!nӑ:W))@ ͻw'D2[ϛCYPQ`q plG|a,J";pCrȐi)¹T6~ tUm '5hmq݈C;_C18pzkrBgj\"c*bsZ9?`sp1NO8M"83ߜ諲K|'7lOXQ0JKfU6?cea}%Vf]6|E&/%#z*5!g> 5: shnmtP@^jRv!HTU"gJЧ Q"77'tS>7f>bvG"(=ݚ9Ue}J}dmh<oPV^KF@F%[8kXzŤ/o /J;ÛnƠ>(e dJkYrg5mk_2]=uVtN *3ڦLrL/|zHhxu3vbsvC#.iXR0L8X.`Nj:j(}IJ3 0[, N3<]@Db,1ևUw(p5^|%:2E1ۊl,)4+iĭ7<]Vp Qz~)bsdPopw|7kIs>< o-{㮽 + ]OYm9ojGp(9CU:3~!@fQ ^\6cQuFnZZԑeDWv|͏=/u(fܡ#N؀&b7?{"+-GcG.Ee+2ϖ5lQ2#m̵#v!쫇}~\>lP 8b8< _ߠk7¬kl0n D3klj痎5 ngt?mE ]^ڞl4Ӹ UxIǂrBѵ-̑ 9لv|fK;,, /cfy qA*q,NF`H!lC/*n8M6NtΔ$"=MhADΉ-svW$\@U֚.f3ȧJ${M?kS#9(- ŇCsY_t|5N0)ѯ)v?\m^R'q_R=s:2u/k!{Y_XehߩCy%fV&;5;(Ν-hPCm۰ 8"K) ]\x}1jj2^|n,٤Tɞ[d8{[|?+wpABF#8M &J(dks_۩/O|.me z" /㗾:Xɧ7h)z ;JVˇ.+R/ǔ)ѓ.[QـG,~ޱW8h zJWFt/s|_*2*ũeu&ojbiR a>ԄV)4W_f|`ɉ^\#>Qi˺8Av52=y-!;91xeI& ~?,t,f$@iq&XnyvYKfBLpo~E}sBZ~9Pc≘('㟁d3 ՊV ;ͫ*;缀9H{וa/d޻6CUg4 +T.*%\VMJ~UjI{He._#:NɌkxn@zS JFqP1mࢊe_%a3NKL7h ͻj% &ݗnWˀ. NڕV1!= 8'msOJk&ɒW_rX9N{ҹ8|l빈"ba ٬B>E1N Z=Ds#%N&?(*vW_ ~dU &@^|pKҁ'>Dre^[l瞾ЛGe]b$SMF9x 2-ّiI!!+".l a8n9=RFXo9(q/PLX#@蚢H}s4x5S]Y^&bkdvl9R.=KI5~ 谽2t6> J[" Nw\45b+"2_ YĦOjut+o{ǥÙg)cQK4’QU5PcuG2s\S=kl\;;†vQ׺#M{06NU³g#"i0@cYq W I baDTV5Ď ZL"6`ir`w\CigxpӃUkSc@)½ Gnޏr3+.|vxZ]-ko.M+c^4caKo3lM,#*a(u zÃ8/)>wޘjF,{ u1! HT24a)v9q7am9`plE 3OkfT,7m?7S<|0 YDCX-+֒171'Q=] ԓA%z6TTs2*tNbcߦ8pyR-ig fG&!$snPÅ%9i`:j4c ٙ(pl^ c+|ɢvMս *VbP}p/l֊&>GΰMY{ENrPf#`&˾,yEW0-]%let8+Y#4uhDG* >-4Q FLl_ΙgHp2è(Q1S_+ཱིt~悊`Gkg2@Q=;j %fYq_&J7rt慫bj[M%ɃՁQ}O;5s ,fg9sm<|EɕƊ~h/%.K6ym>E\$I!σu\mUķWöYZL釱W8H?<\'p[j&!/R檟8WBvlG&?MۂXS8 v Auޜr|c1%,H凛[H%֠7wtDJM2`ɛ’}#-S>ng7A٩)oJ!ֳ_-uZn{i6Gu}p$f RQ^JP 5WIR3{2;fmvˎ0f[|_de2dmG+AfĄZi־/q4HeDf;Y O7WƢ \gi?JghphGޔγ.[n&oF_vٶJB&jD%絅tfyf3N5'QO蔗=ۡ$M{vJq+VFņTޱޖڎ\[^oC`yƝoP[]PVVvr*Di V ?՛B }݊}2f nK.+ʋGWJ }-ĚHDvRW'Dۧy}{~aA' ޓV\8MZȶ9 ZU#)pZXv:&'E$B0kYae󯥾? $rz|Cc-'|LB]-<o- :qcSWV檴.l+=l("켳EUd/&?GaP#ˆ(-!h\! h1uʒr+oeBPDWtԝ}mDDgGGm&L/R,ndMs-9K4Z1S%B/a{M i4JQ=c{ jք t]-QRnIpb)0jRjX.qݢc Q Ona %N9L"7 \auӈ;!G+!#$=DF0|y V1EFd,h ~ WG^:e|"Ml16gVjtf L윯!!;誖X `tGf9w^5RPmr2QYxM] ԱrU4\:29ϓ1IEpJ45 hzHR[9e.ՕmENm$/ng|:όA;X r HM$23G"{+q}աТ%M+jB]o0צzzt[>ob4'KaUOÓ4<ǹVoכj>(%h6sݔp]05=@(+-V7xfz-թMÜž B7+1&ăm1y-?{Ĉ| ׆LDv\ԥ&iEg+! 'ws∘+ ~izW=GL]F\p0|C# |BԈ1/aXBYE@#Օo90oeE[-vm$B9s4$ADA=VSvZ伮n]VٽfYlxfamsW՝7zCGa:}nprt%W{anm(G(QlJ>C0d*3T95ˠK=Xۑrv°xA_{۴[5 "( QJ"yV&9}2JV S\5{Qxޢ'GlV+gb҈[3 &j5s2*_CW]2+ &lTߟKzwz*6x`.< 6J˷{K|PLƇ'iX{ Q*|@kbs>pZa90J7(r xcX"ɀ<<P=5SseiSmd%Yą?l1nVP(oldCuqbiF*{>9{.ѱ̎ Ј~ah9iP>+_PT-)v1/:N.'Bᅁb7hcٝ H0=8;gݣT:& [uOCHЍYxfEٚx;1gR7qm8Qiؒȣ<9}i @XIn,Or_ Ofx4jTSO/OfW 0$rڌJ+2q=86P QTp@.CKn(,Q*-}qIߋsk.rrCW E*6RKC!>k@m8KLs?J@{bӔ%OyIH땫9H+ާ˜֧ôa"IŘJS 5AR~l\=~: lve'θcSiV gҲ\`]֗qg'5=dWvxohÙ=%H4wS:?K"lY[{]1UnaEb.fMF@&a2V+PWS2Eʐb>hWC^44rc[QC:Pu2>psSE]k!yk'ыr!5OQܣ4SʺGߵYm*%w@?t倃l-I&=Ӣ>9MS]\YV:t AހS V% ruFdQ1ENOZu}cos%Xb܌-OpG鸨a|lc۾I{OQh3-xK<(,q=ľbT `-s!F|K.v&V`Ԗp/c#Iy}W~{r0Ev #)ePťӯPŸ:%Fǚ"mTٌ磮khs֐ŗIk)c7-'w" >q GnC6Vz&!p˔ۨF v|GђD\nc}Q:dͺf%:o ;H2|"aldmwFWkazA|ϺHtwG_`'s4;7X\s5nyO`9=268*o nH )XX yWuUPLNj}63 c*_EdVDk4mX&َ\r7\jweG8kuQĶ$VޘeSEgxx`˻כMaW~êvBӒoD+*)jE[@B8|l2`uڼ5O,@%~PM"1,**Dz}oڕs$FnZ#z$wѼ0~qTN*hoٜS)'mdJ8 2}H?]a>='q^ \qEXdWHzTyu9'/a- s£z?ܢĶJNҥqN- Qxcb{/qꋚ4gg0=*eFbÃyHhˆ21,a&wBZ}gx4%56 ofn*@lL}M@Q 躭2ʺ4"MkShE]oim`IΌ/qN~͵ dq :W\Ό _N}- wjI#vՇj`y[mhӑdlucLYyB',ˌyq }_Y&cnB3U]c~ fyzn*E4e-͒j$S2]ԑNy잍+ +Ft=n'@V$0=5cTØo~;Fr,Yu">5qo2s=W1[7c߬@RAubqyk[<nZŒi/p=#3>o[5?0yFK HEafxg3øi9]`9M~ŀW5EEN@ )a~#E7o`×wL(ijT/XwkR:1Iе9GðpeJ~M:Y֬V( 2,R{d +UT/gW0h돯~ߟm /pDrZ^ul i#'4aQmMg5N]1lR{F_X1h@PCpv@}jeA[Ñ=BKw bmÝGԁﶽ1Dd$SI}Db D2yPw6W]r7 sr~uz4A4EyI>iXlߵXB![(<;@_PvB:'OIb=WۜCgD^e/K (L#?6]bg)wʀ!쬪˾M# czybKV"-Z[.mcZQnFXRHZڱi8eB"ZADrޑE\ڲlhZqÙWq$'bߩ~~v9mTɠCxGo^q4vt*S t9A|m9|fx`u*4A !Bט%x6r]I+, 2 c`|c'Ho)}%^d߆"#Gmn rB7)R~ 8WS`'H (0b+į;ŀFGʔ\&e9*0*Ḯ.Xc"V`tTtL(.JR ~B$ZggZ(:@B@oUfc>ocNvkVud,|dT !f4XNYz:TB#GK-qs>1$sGwg$rߕp٭0VP^7;Icڟ&Fug'[(Nip2&-rBF51h.3¦"l\o-!(IVWobdZͶ}B AFX ڝ)G?Ro3{uE; =w岬)LXU$ކlT+#ZpI8q(`6 ]=kcvL.,.\/?.Q{[4h[ek"[ 8;Ni c+L[)("Z~%̾gvi#9֕HhWrE"v?GBip\ٛb̪mMݖE wL>sT^f":hFTIuW Q ںb3u0;Ÿ8u Euu$&!HRV$^iVXȣCmAi(Gx]ZCLz[F`_t(!X5}*;:M# SuXׇ!KH|IjD7]X*nSߌ\\dcijw5+ϣbvљh'Bƻ+[ԙCҭ8noTrah׶Mo9qP_#Ov}@tgd~M1m"s%ut&a_/dR=Da2Ըj~ypQMb^WHz2UaZHXŔ+MʯPDw7Eֱ{#5ǰνt(`D8w <dnH߈7 W2 Tp`%tc:ߨKp}#F޼n.ǜ<+:xٿ%Ӈjl R<d_,Tx%7G,̣]_`/S]]b^Iϖ%k}(ol y޴6scI?HYkK|&}CjɝBI6vH}L&e q AɾxˀM\~GZqҸݟ w|e{ueV_5dD%1(JӀV@ 0Mn50A) ? ŻDB$N6cۚ"hatSC+j~g1BwRK5yu51utC6r{[j_ !>$yfCā,^"Xw9 }5pӑ_DžpMfӥ%VEB/UTA gۗٶL5YySW6;͍!*:7.}ū}wL Yv INNx'N.#ec"hK 6:z?f)LD;Z%_ÔRtHѠ++qBS4b1J Isa( ᯅ6ae3Me0_֚gN(<, `$dM.fZTdv~]]m<?`/D:u' 7|,[EWO6,@,ס~0z{~X{ϝ9Œ^ȸHY]Ҩ/Γ' [/뙶N_Jބy. x5FEԔr CVn963[`q!ɶ !sڍV "-V:D.& 9rV,x- s4`ZmɁ F;qWuO3ы^ ƩpQM+&^\ocx#N2i-i[CܨYov1P3LLbv2eb'W)A @5q]}S4rqvgjo|`#qFg?+ 'so o$F^zI 6۸`VT V@bas4՝@og6)̂ hg=Ɨ<'WxD8w2paZA7`[pB)2q3H6 ^ԂGA GfSw_}TdHu7nyYRAIݍ5ǯ2XD>tcxjةxQ*tE?Ɉ[5cfI6V ϳX¥zq ;7Kk$Yΰ\lfJwpȡ28q=E^!-6F<64D540p^fdF={~#9|7 rZɪ3 mrd71ORV.Ѯ͍L= roIoDTGt';vPt2CO\1@ǃx\x#Yqtl]potCB(s&b`:\YuZ :PXRJAcOp^i99u%ΝUtZӎ(mt{AwLk :#R' 66梈`(HTi{>Zhh6ީh3LZ%uLSE/ K$`kؙŅ&W=nty,@xR~l?I5 " %x 1 1y٩`-0"k :QE׺AFZu*(!L==H`Оy=Yek{7όyOdHB,c9c|ƧZCLGC2SKQ߶bT!<)VCB;]5\ڞ-[⻠b^C#۽S+}ܼ@%CXW"r'vԈPvCyXqbY\ն~:8;? UX}Q[Aꮯ;AܱQj~y} Vmgf"޲q4~RXKt^6`u5.0p2A[E0HMa8RU(>*:Jc5Xu|a6qf Zт(!0bh,_PNh0#!p)Ω3QKZXL,(5jywѼK}TXyӾR?¸f{Ebꂦu,NT(u/P1OŘ[҂'er5jr`uof`G1-̩QB vBmγi!g:NJ™MoĊnGQL Ql5 3 SUy8s`4'`:@?5EgYI_z9juKX^>@9}חO-T/VC 4bg@L:x, Τ!UM[wqJplK׬>ج$[Ԓo,|v牤u%apB׾)v=N.}xI҇XC)" /|قD:JycHX\ffStm06c܏줻 2e03? D+,B?+7W fb !{=!vu/ Mj/HA$!&H-J!HţJmٮޅaǣJkɫj?DIܿLs\P ]X=&]}#9z\+i e ]xݖR"L bN9 @,m‚̔U6d_˻}ۑ,Y{>" Yտ`]Dz8zW1qr Q4 \a؟-z!9wh} R 6TǴCNh x ZtYQ (TJl)(1x򱩼t}mAk"%/{l? u&ԚEolppaF%a[ߣl({Ίr'mDt:zCuWID{|0e' r?>L;̬vWx ¯"+:?arOxIbS–T%OB3Q %Jrd\DjVR.{) ګI2brZ$c*Nlڠɗ%XyDZwqv⢧ޘ$-7gURXfwk!W&ؘU]z2& h ̫> wmUf$Ojj^2ڜx;x-- Uj<ThA:fE+R.\tXH_DZ]l}/0*{*ݢL0$tW=Mslx lqf_dS[Zd-%q<=r%Y[^EUxèփr/&MN \Ějn9E9eX93X{YW`E*L+F!_t0eJYM\!ǿhvMG#PZe~AV cyc d`d ӸzJQK3=ȒiޖyGc3~a푤>&U •omThMCƯރp +nr͂mg3"5HxLv<,[ a@MB"H '$1-7?޵-j+&=h1t4v6%E$v$j:"a ^S4F(v,Q{qG 7V&ɓ,$ NrIU}MiԾ18@ ?Kk]&A8T`!vT}m&g,!ZHTVQi hQ#voz!4aSJZ6s]ԙ޾Bv#Q6J$<[/-: ڞ(&p_@׌]kL+[:;"?N1 $Mw#z>%DL22`ߌ^("N%mqhˠ4K  nlT cShe#Кrw%Ho@qkam =²˽<8T$zo`>r-PFDN ;y'qGD6jb]yMNaޮi ATs)woB.7+x*bZ4OW+F.M jY?R0 ̯870pT$Ati]fD;.tPA J}UD=§ߘO, '-}/j&t\iÉͶB2a5_]2A*4Lxe.[wvNy2d.iA!%[ir>B"*=oPt57ѹ{]+~Էh [O ;÷VVvW9%H57fZɦIEHE$BG[04/ݹnHd;-R B*_eV#d=;U`N*M^6,\̟$M9ajQ2pH9 l:hו>`OU"hAl Sa(W;:ii$&NPM^a9Xnv쿖 NXաYcE?CZxzkѴ2췚)pA"9 ڼէzUm`T\R̺yBf1>v*[9c8_֋XF_9w3˹u["S4^`aa?E;,="k6Y| xj{ X9#.| m88{"xoUA*;Lz Mp-AbOyIpZ8 ů&IvuYM}|a]+8iC7ld1@0;K}$xb|w5"QmuKb-$$jWX*yl}'B6F `+je~ [4%/4H`irZSʭ{]%?+hvјDٜ?r8^5anT?&}4'iMo LL~FMMu;" R4baj.U^ճy _a_Q )cXKCF=Z(').݌S 2DV!q>@L=-Ʉ}/^?Qֱv[=XeV~T mVjf?'94i-Ahn*iW8j U!F~b7̎]A>tț?1?*Q>s7?r[mJ)7INO0|0H 6\Lo;ڊ }|6'ۇcz~K -bF\} 0F92ZT z8_` rAr'*+SH A>!6x0^F?_ꦞG6uz6*cɕcHemv!p֫ļrh67p:<ԯ*ք)-ft;7ܦ tJFj5[Ub$1)8G9P5E_R!%@8[Ĵk[MFU0!u@X-n RqƽwWPY~=!dw¡ !(Js}K%$O;`8cDi%!0 t`3{Uz) ʣP::iЙR.XD &-a ĆVKP: 4(Y%ZH3gN o^uJSa/j'=e5%$ԬFi56"iEY~Pm}%וd zY> .4 xk_6žڶ.}nv< Sxٸbv"L4Nn^ G>𘚄Wx]'c9 e.ݑ|#\Jtݬ Ǫ!pi乞uxo4T"쫵#MHRg_&6r7D!9F̋z2g>ˊdg䱏-.T͏51Da,WAPFʮ1Ѿ ?IkHP Fbi{s58RKѾn?ůC5Jc̳oEW|{6L>n8KMXyyS}k@,À"zE{.$e!ݬnCsiXJk@ O*sEoұ~rTݙHʽy5jK4Aw7˯[E Ȝ.|qDvYJMJE!O>2K:-t& G+jcɇɾzZFA%v^|Xox&l&c+S mQ8(ySrXuL\5Ei>:'·o# 14KO1oFAĮ4D逢&8WH˩[.һ~1kZnV;L>vGX ˙8o%F늞N%h?os}RNy3dfsDz dRqK o˵znגkwjc:6 w =ր1yVw6GZGHAq2 tA}?4sLgv09j[ Dy1uoh͛DiAʱfYr82\ Lm~0 }:zMV武lII%/)``Q> K8ny/5q_FUn6$PcA0,yɟ:DUM-j)ьqcǦޔ7 1hbβg`"]Xy/JVeo=Qix[z\Vs C"YTrx `L KȔSX t'F1ڐKMzFx[8TyڏY(Xë%s揎EXֵ1V]߶13X'=rJIPAj&-3)W_8G hR.[wl c}HMվc)fB"H{Y;2D<ɍj^%xQ^&G=F7^Zro\'orkЀT[ ?0bY6}Ss~=V9-Z%B1T'5ح.TvWNZׇyZC/tqrV46ܝkpdלH YEH֊vicܪGQ#kg}-g9鿒yW/N ;a<;7!ǒ4rМrd&DZ8i] WaU~6FA\ t:r/ oLx I5lS2FS'W츸;X9"]e-ǿ9\sE7ۃdjg/%e~O dȑ5l'%E6 V458t$3=,;)@Lm')W #9<˼7Zꛍ$ݰ_#/!F q7oR.MpN!Z;IlNP&DJprc؍ޮ=OM0Q BK Q]dY vM*Nj!1cu'Վ{@W j%-`P@ $ֻYK6qpdg9 褡ok(cvكk+}>Y@a]'/5k<ꊪ" 8+.ڶs'̂MOP-G#5FLcĿM{rљNU 1+;=gװR8+뀏1O7OYތ@p2 Gh; |uya=;Í/~E4WhA<$C. ZEp-U<1׽Z4ReN_ךJ9@cIKlw&F!7J'7 L&l1,|;nW =N2]@:8~tz]c~ثt|8_磵d޼ܖ?#\}/ç'usΏ]z{uTs|\ ?,Tm|"iGg%JJ/It_ٷx%4"d7 A'JA?&9iUChDKGgL'b?pB@m+"#TbP8V yuq) E+&}rk-&+?RgN._|Μٽd)X X1rUi]2uNqb"Uc]yUe׊R 10.od ]45-,fKe T.`V0f)>Z&$V8b \X~Y6n^`}T#eX`yy36;o'*;9g6n*Κ>i"&r`+Gus!il0k]sR ,Eek*E4U'LUS]ʀsS*Rlb!cA9@(ogbɊ8 n 2/`\_0bL& ~zp1%Do2?_<ɶqSA&̙>x9ϔ_j1mԱS9$O.,-j{:r5Y>KG-:;0ۛM_ pu4)Eb9MW䭞BK2ĠO ;x ;\O_o}a1@1#/yp 5 36&.M,K`Hn4mm\4{1Q?KKG.N~J#\j "l%w1prlC9W-2YPBV1T[,CCU=u-tP,MU'*#]w %Zlof5~^SJnt-FWE-5LQl\3N|sʺC3_!9 Jzz2 d<6$p 9b4۶dz pEۥV?Vid<ѓY FB(a4jR.AAfY ޣvLkQoJl)DYS0|r5dn].yH *%)sd.7-N&ߴXԚGȮ+c}dIbd^V7f9\5=r&Xݣ:LAjt&꼕m/$g|u| PKe縦֕wg#򎸒&GB TYײ~!XϯGQF yFv<&/a Ӆ= |t"H&veEn'SQ ^"Xff%ޅylKÂH鎌9i>(mpfX5an)ԃl 7V僑0R)π}w#O;x[@Ҿ/߂kdo%K, Ys#X{O@rpga @Yi T$>¯'B U`g8{߬kUS90.PG+W*ۖ `kW!9QPNSM)w$ =բO{Weӹ\TO q0X4%WK9XlJn\>:: y2~ 1TS_YX5׋h" I쿋5B"wo%w NNL%Gaģs'[ݜ۵Dhjb{_8 nSt'\XHPNc3S NeMA]'x2VfuˆW=4X ; C % "z4aWLyA*Z퐶O"~4H-kҲۼzrSS*R{RFn/T)j-gwvgF ݽ!P hBheR86X_ZnޱuR*;ӪcV-;(LdM m '\QC\h+;ѝonzH*0pg؏ DVFPܪmTW\z>̈́C^W΀Z>}|8( 1608!ӶeWW'&tYX'ee.DUuƶ|$B5mH0,C51K@|񜀙ʯH53^~_| CP;J$L+-{d V t?i|VP/nz.7 txD"oP]ڽ{*T[i3n eCy| 9t& Ly!UdVD6վϓ;CdB ke,&98}]p[ݤ:Pʕ<|<V3o2^Ъ ?eyNqIk_,f@ CF G} -+$ |Pz_q'y}NznFVDX=O@rmkz=n{C:ZhDjb,?Phd@AiCHC_7q{k:5#,Mv,܎tVLb) m7"݆̾ 1-DHO`5LuL}9unD:BzA9˝h@f-]=N<"ǒۭiGZ&JĸCI4`>,@0wgw-X/W#~5ݞ4_P7JRj~K5:Z$b)ZeEhq1t tm>cc6W皚=G.:Y4y)ٕ PCuZ0Tm<ȷ%hX>$ ?lz{)2yɺb=76$ښck] ) i > 8nMۮHiQ;:6p~.,"Qygey6t fAsOFI _ҤpoCfrm]p/a1ҵL-W5-G=HL}b- 2i:t&j+Tn.-_`mY^ԭK{S@/5ӏ5f}m{+ϋFW{+Qz?~a̢2p+LqbesLTBTHw>c—_v,ă32Sa}GO7 1ehxlc`}uNI7T~40Aۧ3<92y=;>&t/Q!OXS]4EmC Q|{3C8%>a~˦qO9hHfn6GoNLxYt p@IGB&i{YWzf@ l{~ٷȨEǞX*RGu߁,0&=Z3U!`'"H=lҌ␯ٯ8i +~"K}95 Qd2Wߦځ "y[9&H|G%@H#>#eɮ ~g@iuۍAP1v^))^'^Ѕ/GjE~k o* x 4a)҃H4zFGG ?Tu4rr;L;^ Lgswٵ7ˤ֥QZV1w'Z6%'3kU_qƆ2.@oEK:>f&pB.EϐmR%z˳xL:@mke~G?妘e\ҋoZ'F.U7DOOq Qz ݯgt Nom>a?TDx[xݖkWt6s ȓ TRkng#%^ `{mΝRY*,ʠ?\b,6LX[ i?Z$P=,VD_b1ǟ5<= 7:ʪ}oW1GBݟk⌞>Eֽ"4j`T,Gd?RZ&$'88c1JPASu9.i6\OUSh:8>Z-^>zHUZ.X ɀ}k߮EhԖO(kQĶx]Sֹx:6B2sb)ҪO;L{gkF$Ku8P_HAtn0 nyԯI!qu\&l0oC㜫:Ti&!ΘƥEG+|Y'3@z tcJh.+.'XJ`XV?P.w" A" $V|DS!)"=NwjxʝpJqyvbXk wk~")Krx0_s3-&|2ƊOLI ̑C\`=VuNz;%=NFQ̾7HzZxC("պw9pn1Fv|絥'h 9ne/Un:(zsL-#;5jz7w'{Pzw 2bef#_]nTְeZp.&?`.-nIuH1,-tzƑ2F(;hu{=w?Uܛ Вd05'scd?|S/׎A \VN}6N6YTߜUEUZ"{ca%H J-?+EVW5hޯ6-n996Ud#,OYwG~=\hw d؄OӇ0P `>QZ*/QF&sr!;69r+;_ asH{+ `Y ja=WmˁI(x:ш@#h%g{SbC574ࢌ.#l.Tr?n!樉sH6J;ڐrZB[dl8;*ƤBZmc!ˮWHc#[]Y?m+DBZHT:'wy! wcu8& I^5 e}4L.,ŀd.N>(%D6->̵=h@M07ddT.Amk9di#EvͰdXq{/)#>TMLɪQgq"jr65$O l넏ǯq<W 0j/!veCcG+:TQLr%fF_-|/z%k;LeXݔBҘ1@ W;#̻hWct薄w@2[~V,'WT%"%=]f0=1QlZᙗ|>‹ {dfT(E ^˱Wt/﯁9Oh<{!un$p[s]@#v -cI`V?ZOd*?"泄 5RF Gu蒕3ɜᏀxiHU;b&seC Ri#!=B$nj2.$`}30BNk+M9!9Byqӯ3 [% V:t{К$ 4iSVWVv( s?zpfmiAG[yrU}KhH5'qhcQ!Qu 9% H)]xSLoGa3p9X\ Lˠ]53LӎvOꆨ.A8H )u`%*J*1J>> h{7p9ߒ;ӎ dM16$Opu(5%DJF2}@LaK KpSx)hQPW.  > pa\)tӿ0+a~;8 ,]؉"eyG(O0B۴- =a+Aȩ I:mY0E5zlQ/\ kQ9e|8%3>CaO+eRVpY=Zk`: CZЬDΦA;29Q>QG2gc߃,i#"vÑ=D-foNK`ԓrjZm 7B>Q8DO,.tR!|%.()f̈́PJ5C\yTG 捌*~LưeX[juN.C8Dҏ)|}^3aykƾcn+NWXAKk{0/M(n{ KGcg mju;z9#DVS KX+5,gR&w #ou`|ޜ.ߣ\i9d~ߟ] 7 NK K|r&+C)Edª߻ѭޢSQ:etx>U80RDC&w@3,]O6TDcoLYWQHPCտ?} .)L)/0Tܷ͛gR~<ɹz h *pd.+?KMTRn\j^W>S* $Tzû-ƁH i2Gzv+ԽdZ64oֶIER [Rx7;+;GNyZbxnWZQ&b{GSyK泗;0LPEdWF&LCpю\ k&9 Ǫqz)Y+#!KדZMj9'%'o\}}S xh{et5 e,g<#vAZD9 Ku8ր]ʆ1&.bHg3'M^*l~̠P&b ?LoUgYAۧXF|ߎT:_KEF~rm,0ŲCWkF  .w\e +T _z΄OO;眯-[* A1O@g%[vmA|t9q#O󡖟Iv3}nx(3'5CZ{Fʍm/UD`*15еu}KaOZ+^AH[Tyms6Q2ָ-<,RկeZ_;Yhl4+%j(Nm~mOKqC)Ĩ5ߦ0kT-c#VGqRұA|,}% ! @ء*oRc Ӱ)OFV7A%ՙE>[nNTs!SG0V2 hOO0 Fd5c_++_妉t=j9#OE @n(A$Gje$o*[5yO7DcwãdALo($7HJvsLsĈbpE.P47#=p4}Xm$1[sy1,Tj9Q4(;?ލѦ%C @vnD#NY/?`1a0:VݞXF3;N+ߓ71 zXk6Fֲw n_4L?򴔬 (/\YX ">gƞpy (/k0auMX̍:r~S Ao ڻWӢ#ҏ<yގ'GFptJ$d{zupQ+䨆/~<=lP=F֎^ɑϞTQU^T[բ0_`h!we{\Z(=m#`U՜ꌓG:G9m98FQY5 u7a@ph{?w73vkELs.CGt^h~um֐Q{˾z׆ͩoDlA]ou+8Ɂ~E#uW@sӏS]eY/}BWu7'kA!Zݑ DEr}vc-:ᶲ׻sB_kh{+rH>X^*Q &2;4Vjis5y0I~lϒFUG$س !) ԐˣtFU{rH{$UBkSJ#s:2Gd. #DI T,Zㄸ7{խHw;?1֑ ?Y7Bm'UzZ|z$9%Y$HlWK[g#;`Y R7$iD+n6he")Fn^;. ƟI@Hhޓd/W~&m =D#˴P^q9 X͒D cm҃M‡ U1"xgY_~TTkżQA1Q͉ #ӅXS!TaF]!8V2 iBn_I ~w_DE0.6' 6&gmx QP3|S,S >˯R`EL n{WĸE adjX'qO8r~=(pIevX)}u/nE+{6d'z UIY*iW}unkb endstream endobj 604 0 obj 147936 endobj 605 0 obj <> endobj 606 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 607 0 obj <> endobj 608 0 obj <> endobj 609 0 obj <> endobj 610 0 obj << /F1 591 0 R /F2 599 0 R /F3 602 0 R /F4 594 0 R /F5 608 0 R /F6 607 0 R /F7 609 0 R /F8 586 0 R >> endobj 611 0 obj <> endobj 612 0 obj <
> endobj 1 0 obj <>/Contents 2 0 R>> endobj 41 0 obj <>/Contents 42 0 R>> endobj 75 0 obj <>/Contents 76 0 R>> endobj 120 0 obj <>/Contents 121 0 R>> endobj 175 0 obj <>/Contents 176 0 R>> endobj 231 0 obj <>/Contents 232 0 R>> endobj 278 0 obj <>/Contents 279 0 R>> endobj 327 0 obj <>/Contents 328 0 R>> endobj 389 0 obj <>/Contents 390 0 R>> endobj 432 0 obj <>/Contents 433 0 R>> endobj 485 0 obj <>/Contents 486 0 R>> endobj 552 0 obj <>/Contents 553 0 R>> endobj 613 0 obj <> endobj 614 0 obj < /Dest[1 0 R/XYZ 56.7 637.3 0]/Parent 613 0 R/Next 615 0 R>> endobj 615 0 obj < /Dest[41 0 R/XYZ 56.7 698.1 0]/Parent 613 0 R/Prev 614 0 R/Next 616 0 R>> endobj 616 0 obj < /Dest[41 0 R/XYZ 56.7 408.6 0]/Parent 613 0 R/Prev 615 0 R/Next 617 0 R>> endobj 617 0 obj < /Dest[41 0 R/XYZ 56.7 136.4 0]/Parent 613 0 R/Prev 616 0 R/Next 630 0 R>> endobj 618 0 obj < /Dest[75 0 R/XYZ 56.7 785.3 0]/Parent 617 0 R/Next 619 0 R>> endobj 619 0 obj < /Dest[75 0 R/XYZ 56.7 472 0]/Parent 617 0 R/Prev 618 0 R/Next 620 0 R>> endobj 620 0 obj < /Dest[75 0 R/XYZ 56.7 190.3 0]/Parent 617 0 R/Prev 619 0 R/Next 621 0 R>> endobj 621 0 obj < /Dest[120 0 R/XYZ 56.7 377.7 0]/Parent 617 0 R/Prev 620 0 R/Next 622 0 R>> endobj 622 0 obj < /Dest[175 0 R/XYZ 56.7 728.1 0]/Parent 617 0 R/Prev 621 0 R/Next 623 0 R>> endobj 623 0 obj < /Dest[175 0 R/XYZ 56.7 254.4 0]/Parent 617 0 R/Prev 622 0 R/Next 624 0 R>> endobj 624 0 obj < /Dest[231 0 R/XYZ 56.7 608 0]/Parent 617 0 R/Prev 623 0 R/Next 625 0 R>> endobj 625 0 obj < /Dest[278 0 R/XYZ 56.7 750.7 0]/Parent 617 0 R/Prev 624 0 R/Next 626 0 R>> endobj 626 0 obj < /Dest[278 0 R/XYZ 56.7 413.4 0]/Parent 617 0 R/Prev 625 0 R/Next 627 0 R>> endobj 627 0 obj < /Dest[327 0 R/XYZ 56.7 348.1 0]/Parent 617 0 R/Prev 626 0 R/Next 628 0 R>> endobj 628 0 obj < /Dest[389 0 R/XYZ 56.7 441.3 0]/Parent 617 0 R/Prev 627 0 R/Next 629 0 R>> endobj 629 0 obj < /Dest[389 0 R/XYZ 56.7 326 0]/Parent 617 0 R/Prev 628 0 R>> endobj 630 0 obj < /Dest[389 0 R/XYZ 56.7 233.3 0]/Parent 613 0 R/Prev 617 0 R>> endobj 632 0 obj <> endobj 5 0 obj <> endobj 633 0 obj <> endobj 6 0 obj <> endobj 634 0 obj <> endobj 7 0 obj <> endobj 635 0 obj <> endobj 8 0 obj <> endobj 636 0 obj <> endobj 9 0 obj <> endobj 637 0 obj <> endobj 10 0 obj <> endobj 638 0 obj <> endobj 11 0 obj <> endobj 639 0 obj <> endobj 12 0 obj <> endobj 640 0 obj <> endobj 13 0 obj <> endobj 641 0 obj <> endobj 14 0 obj <> endobj 642 0 obj <> endobj 15 0 obj <> endobj 643 0 obj <> endobj 16 0 obj <> endobj 644 0 obj <> endobj 17 0 obj <> endobj 645 0 obj <> endobj 18 0 obj <> endobj 646 0 obj <> endobj 19 0 obj <> endobj 647 0 obj <> endobj 20 0 obj <> endobj 648 0 obj <> endobj 21 0 obj <> endobj 649 0 obj <> endobj 22 0 obj <> endobj 650 0 obj <> endobj 24 0 obj <> endobj 651 0 obj <> endobj 23 0 obj <> endobj 652 0 obj <> endobj 26 0 obj <> endobj 653 0 obj <> endobj 27 0 obj <> endobj 654 0 obj <> endobj 28 0 obj <> endobj 655 0 obj <> endobj 29 0 obj <> endobj 656 0 obj <> endobj 30 0 obj <> endobj 657 0 obj <> endobj 31 0 obj <> endobj 658 0 obj <> endobj 32 0 obj <> endobj 659 0 obj <> endobj 33 0 obj <> endobj 660 0 obj <> endobj 34 0 obj <> endobj 661 0 obj <> endobj 35 0 obj <> endobj 662 0 obj <> endobj 36 0 obj <> endobj 663 0 obj <> endobj 37 0 obj <> endobj 664 0 obj <> endobj 38 0 obj <> endobj 665 0 obj <> endobj 39 0 obj <> endobj 666 0 obj <> endobj 44 0 obj <> endobj 667 0 obj <> endobj 45 0 obj <> endobj 668 0 obj <> endobj 46 0 obj <> endobj 669 0 obj <> endobj 47 0 obj <> endobj 670 0 obj <> endobj 48 0 obj <> endobj 671 0 obj <> endobj 49 0 obj <> endobj 672 0 obj <> endobj 50 0 obj <> endobj 673 0 obj <> endobj 51 0 obj <> endobj 674 0 obj <> endobj 52 0 obj <> endobj 675 0 obj <> endobj 53 0 obj <> endobj 676 0 obj <> endobj 54 0 obj <> endobj 677 0 obj <> endobj 55 0 obj <> endobj 678 0 obj <> endobj 56 0 obj <> endobj 679 0 obj <> endobj 57 0 obj <> endobj 680 0 obj <> endobj 58 0 obj <> endobj 681 0 obj <> endobj 59 0 obj <> endobj 682 0 obj <> endobj 60 0 obj <> endobj 683 0 obj <> endobj 61 0 obj <> endobj 684 0 obj <> endobj 62 0 obj <> endobj 685 0 obj <> endobj 63 0 obj <> endobj 686 0 obj <> endobj 64 0 obj <> endobj 687 0 obj <> endobj 65 0 obj <> endobj 688 0 obj <> endobj 66 0 obj <> endobj 689 0 obj <> endobj 67 0 obj <> endobj 690 0 obj <> endobj 68 0 obj <> endobj 691 0 obj <> endobj 69 0 obj <> endobj 692 0 obj <> endobj 70 0 obj <> endobj 693 0 obj <> endobj 71 0 obj <> endobj 694 0 obj <> endobj 72 0 obj <> endobj 695 0 obj <> endobj 73 0 obj <> endobj 696 0 obj <> endobj 74 0 obj <> endobj 697 0 obj <> endobj 78 0 obj <> endobj 698 0 obj <> endobj 79 0 obj <> endobj 699 0 obj <> endobj 80 0 obj <> endobj 700 0 obj <> endobj 81 0 obj <> endobj 701 0 obj <> endobj 82 0 obj <> endobj 702 0 obj <> endobj 83 0 obj <> endobj 703 0 obj <> endobj 84 0 obj <> endobj 704 0 obj <> endobj 85 0 obj <> endobj 705 0 obj <> endobj 86 0 obj <> endobj 706 0 obj <> endobj 87 0 obj <> endobj 707 0 obj <> endobj 88 0 obj <> endobj 708 0 obj <> endobj 89 0 obj <> endobj 709 0 obj <> endobj 90 0 obj <> endobj 710 0 obj <> endobj 91 0 obj <> endobj 711 0 obj <> endobj 92 0 obj <> endobj 712 0 obj <> endobj 93 0 obj <> endobj 713 0 obj <> endobj 94 0 obj <> endobj 714 0 obj <> endobj 96 0 obj <> endobj 715 0 obj <> endobj 95 0 obj <> endobj 716 0 obj <> endobj 98 0 obj <> endobj 717 0 obj <> endobj 99 0 obj <> endobj 718 0 obj <> endobj 100 0 obj <> endobj 719 0 obj <> endobj 101 0 obj <> endobj 720 0 obj <> endobj 102 0 obj <> endobj 721 0 obj <> endobj 103 0 obj <> endobj 722 0 obj <> endobj 104 0 obj <> endobj 723 0 obj <> endobj 105 0 obj <> endobj 724 0 obj <> endobj 106 0 obj <> endobj 725 0 obj <> endobj 107 0 obj <> endobj 726 0 obj <> endobj 108 0 obj <> endobj 727 0 obj <> endobj 109 0 obj <> endobj 728 0 obj <> endobj 110 0 obj <> endobj 729 0 obj <> endobj 111 0 obj <> endobj 730 0 obj <> endobj 112 0 obj <> endobj 731 0 obj <> endobj 113 0 obj <> endobj 732 0 obj <> endobj 114 0 obj <> endobj 733 0 obj <> endobj 116 0 obj <> endobj 734 0 obj <> endobj 115 0 obj <> endobj 735 0 obj <> endobj 117 0 obj <> endobj 736 0 obj <> endobj 118 0 obj <> endobj 737 0 obj <> endobj 123 0 obj <> endobj 738 0 obj <> endobj 124 0 obj <> endobj 739 0 obj <> endobj 125 0 obj <> endobj 740 0 obj <> endobj 126 0 obj <> endobj 741 0 obj <> endobj 127 0 obj <> endobj 742 0 obj <> endobj 128 0 obj <> endobj 743 0 obj <> endobj 129 0 obj <> endobj 744 0 obj <> endobj 130 0 obj <> endobj 745 0 obj <> endobj 131 0 obj <> endobj 746 0 obj <> endobj 132 0 obj <> endobj 747 0 obj <> endobj 133 0 obj <> endobj 748 0 obj <> endobj 134 0 obj <> endobj 749 0 obj <> endobj 135 0 obj <> endobj 750 0 obj <> endobj 136 0 obj <> endobj 751 0 obj <> endobj 137 0 obj <> endobj 752 0 obj <> endobj 138 0 obj <> endobj 753 0 obj <> endobj 139 0 obj <> endobj 754 0 obj <> endobj 140 0 obj <> endobj 755 0 obj <> endobj 141 0 obj <> endobj 756 0 obj <> endobj 142 0 obj <> endobj 757 0 obj <> endobj 143 0 obj <> endobj 758 0 obj <> endobj 144 0 obj <> endobj 759 0 obj <> endobj 145 0 obj <> endobj 760 0 obj <> endobj 146 0 obj <> endobj 761 0 obj <> endobj 147 0 obj <> endobj 762 0 obj <> endobj 148 0 obj <> endobj 763 0 obj <> endobj 149 0 obj <> endobj 764 0 obj <> endobj 150 0 obj <> endobj 765 0 obj <> endobj 151 0 obj <> endobj 766 0 obj <> endobj 152 0 obj <> endobj 767 0 obj <> endobj 154 0 obj <> endobj 768 0 obj <> endobj 153 0 obj <> endobj 769 0 obj <> endobj 156 0 obj <> endobj 770 0 obj <> endobj 157 0 obj <> endobj 771 0 obj <> endobj 158 0 obj <> endobj 772 0 obj <> endobj 159 0 obj <> endobj 773 0 obj <> endobj 160 0 obj <> endobj 774 0 obj <> endobj 161 0 obj <> endobj 775 0 obj <> endobj 162 0 obj <> endobj 776 0 obj <> endobj 163 0 obj <> endobj 777 0 obj <> endobj 164 0 obj <> endobj 778 0 obj <> endobj 165 0 obj <> endobj 779 0 obj <> endobj 166 0 obj <> endobj 780 0 obj <> endobj 167 0 obj <> endobj 781 0 obj <> endobj 168 0 obj <> endobj 782 0 obj <> endobj 169 0 obj <> endobj 783 0 obj <> endobj 170 0 obj <> endobj 784 0 obj <> endobj 171 0 obj <> endobj 785 0 obj <> endobj 178 0 obj <> endobj 786 0 obj <> endobj 179 0 obj <> endobj 787 0 obj <> endobj 180 0 obj <> endobj 788 0 obj <> endobj 181 0 obj <> endobj 789 0 obj <> endobj 182 0 obj <> endobj 790 0 obj <> endobj 183 0 obj <> endobj 791 0 obj <> endobj 185 0 obj <> endobj 792 0 obj <> endobj 184 0 obj <> endobj 793 0 obj <> endobj 187 0 obj <> endobj 794 0 obj <> endobj 188 0 obj <> endobj 795 0 obj <> endobj 189 0 obj <> endobj 796 0 obj <> endobj 190 0 obj <> endobj 797 0 obj <> endobj 191 0 obj <> endobj 798 0 obj <> endobj 192 0 obj <> endobj 799 0 obj <> endobj 193 0 obj <> endobj 800 0 obj <> endobj 194 0 obj <> endobj 801 0 obj <> endobj 195 0 obj <> endobj 802 0 obj <> endobj 196 0 obj <> endobj 803 0 obj <> endobj 197 0 obj <> endobj 804 0 obj <> endobj 198 0 obj <> endobj 805 0 obj <> endobj 199 0 obj <> endobj 806 0 obj <> endobj 200 0 obj <> endobj 807 0 obj <> endobj 201 0 obj <> endobj 808 0 obj <> endobj 202 0 obj <> endobj 809 0 obj <> endobj 203 0 obj <> endobj 810 0 obj <> endobj 204 0 obj <> endobj 811 0 obj <> endobj 205 0 obj <> endobj 812 0 obj <> endobj 206 0 obj <> endobj 813 0 obj <> endobj 207 0 obj <> endobj 814 0 obj <> endobj 208 0 obj <> endobj 815 0 obj <> endobj 209 0 obj <> endobj 816 0 obj <> endobj 210 0 obj <> endobj 817 0 obj <> endobj 211 0 obj <> endobj 818 0 obj <> endobj 212 0 obj <> endobj 819 0 obj <> endobj 213 0 obj <> endobj 820 0 obj <> endobj 214 0 obj <> endobj 821 0 obj <> endobj 215 0 obj <> endobj 822 0 obj <> endobj 217 0 obj <> endobj 823 0 obj <> endobj 216 0 obj <> endobj 824 0 obj <> endobj 219 0 obj <> endobj 825 0 obj <> endobj 220 0 obj <> endobj 826 0 obj <> endobj 221 0 obj <> endobj 827 0 obj <> endobj 222 0 obj <> endobj 828 0 obj <> endobj 223 0 obj <> endobj 829 0 obj <> endobj 224 0 obj <> endobj 830 0 obj <> endobj 234 0 obj <> endobj 831 0 obj <> endobj 235 0 obj <> endobj 832 0 obj <> endobj 236 0 obj <> endobj 833 0 obj <> endobj 237 0 obj <> endobj 834 0 obj <> endobj 238 0 obj <> endobj 835 0 obj <> endobj 239 0 obj <> endobj 836 0 obj <> endobj 240 0 obj <> endobj 837 0 obj <> endobj 241 0 obj <> endobj 838 0 obj <> endobj 242 0 obj <> endobj 839 0 obj <> endobj 243 0 obj <> endobj 840 0 obj <> endobj 244 0 obj <> endobj 841 0 obj <> endobj 245 0 obj <> endobj 842 0 obj <> endobj 246 0 obj <> endobj 843 0 obj <> endobj 247 0 obj <> endobj 844 0 obj <> endobj 249 0 obj <> endobj 845 0 obj <> endobj 248 0 obj <> endobj 846 0 obj <> endobj 251 0 obj <> endobj 847 0 obj <> endobj 252 0 obj <> endobj 848 0 obj <> endobj 253 0 obj <> endobj 849 0 obj <> endobj 254 0 obj <> endobj 850 0 obj <> endobj 255 0 obj <> endobj 851 0 obj <> endobj 256 0 obj <> endobj 852 0 obj <> endobj 257 0 obj <> endobj 853 0 obj <> endobj 258 0 obj <> endobj 854 0 obj <> endobj 259 0 obj <> endobj 855 0 obj <> endobj 260 0 obj <> endobj 856 0 obj <> endobj 261 0 obj <> endobj 857 0 obj <> endobj 262 0 obj <> endobj 858 0 obj <> endobj 263 0 obj <> endobj 859 0 obj <> endobj 264 0 obj <> endobj 860 0 obj <> endobj 265 0 obj <> endobj 861 0 obj <> endobj 266 0 obj <> endobj 862 0 obj <> endobj 267 0 obj <> endobj 863 0 obj <> endobj 268 0 obj <> endobj 864 0 obj <> endobj 269 0 obj <> endobj 865 0 obj <> endobj 270 0 obj <> endobj 866 0 obj <> endobj 271 0 obj <> endobj 867 0 obj <> endobj 272 0 obj <> endobj 868 0 obj <> endobj 273 0 obj <> endobj 869 0 obj <> endobj 274 0 obj <> endobj 870 0 obj <> endobj 281 0 obj <> endobj 871 0 obj <> endobj 282 0 obj <> endobj 872 0 obj <> endobj 283 0 obj <> endobj 873 0 obj <> endobj 284 0 obj <> endobj 874 0 obj <> endobj 286 0 obj <> endobj 875 0 obj <> endobj 285 0 obj <> endobj 876 0 obj <> endobj 288 0 obj <> endobj 877 0 obj <> endobj 289 0 obj <> endobj 878 0 obj <> endobj 290 0 obj <> endobj 879 0 obj <> endobj 291 0 obj <> endobj 880 0 obj <> endobj 292 0 obj <> endobj 881 0 obj <> endobj 293 0 obj <> endobj 882 0 obj <> endobj 294 0 obj <> endobj 883 0 obj <> endobj 295 0 obj <> endobj 884 0 obj <> endobj 296 0 obj <> endobj 885 0 obj <> endobj 297 0 obj <> endobj 886 0 obj <> endobj 298 0 obj <> endobj 887 0 obj <> endobj 299 0 obj <> endobj 888 0 obj <> endobj 300 0 obj <> endobj 889 0 obj <> endobj 301 0 obj <> endobj 890 0 obj <> endobj 302 0 obj <> endobj 891 0 obj <> endobj 304 0 obj <> endobj 892 0 obj <> endobj 303 0 obj <> endobj 893 0 obj <> endobj 306 0 obj <> endobj 894 0 obj <> endobj 307 0 obj <> endobj 895 0 obj <> endobj 308 0 obj <> endobj 896 0 obj <> endobj 309 0 obj <> endobj 897 0 obj <> endobj 310 0 obj <> endobj 898 0 obj <> endobj 311 0 obj <> endobj 899 0 obj <> endobj 312 0 obj <> endobj 900 0 obj <> endobj 313 0 obj <> endobj 901 0 obj <> endobj 314 0 obj <> endobj 902 0 obj <> endobj 315 0 obj <> endobj 903 0 obj <> endobj 316 0 obj <> endobj 904 0 obj <> endobj 317 0 obj <> endobj 905 0 obj <> endobj 318 0 obj <> endobj 906 0 obj <> endobj 319 0 obj <> endobj 907 0 obj <> endobj 320 0 obj <> endobj 908 0 obj <> endobj 330 0 obj <> endobj 909 0 obj <> endobj 331 0 obj <> endobj 910 0 obj <> endobj 332 0 obj <> endobj 911 0 obj <> endobj 333 0 obj <> endobj 912 0 obj <> endobj 334 0 obj <> endobj 913 0 obj <> endobj 335 0 obj <> endobj 914 0 obj <> endobj 336 0 obj <> endobj 915 0 obj <> endobj 337 0 obj <> endobj 916 0 obj <> endobj 338 0 obj <> endobj 917 0 obj <> endobj 339 0 obj <> endobj 918 0 obj <> endobj 340 0 obj <> endobj 919 0 obj <> endobj 341 0 obj <> endobj 920 0 obj <> endobj 342 0 obj <> endobj 921 0 obj <> endobj 343 0 obj <> endobj 922 0 obj <> endobj 344 0 obj <> endobj 923 0 obj <> endobj 345 0 obj <> endobj 924 0 obj <> endobj 346 0 obj <> endobj 925 0 obj <> endobj 347 0 obj <> endobj 926 0 obj <> endobj 348 0 obj <> endobj 927 0 obj <> endobj 349 0 obj <> endobj 928 0 obj <> endobj 350 0 obj <> endobj 929 0 obj <> endobj 351 0 obj <> endobj 930 0 obj <> endobj 352 0 obj <> endobj 931 0 obj <> endobj 353 0 obj <> endobj 932 0 obj <> endobj 354 0 obj <> endobj 933 0 obj <> endobj 355 0 obj <> endobj 934 0 obj <> endobj 356 0 obj <> endobj 935 0 obj <> endobj 357 0 obj <> endobj 936 0 obj <> endobj 358 0 obj <> endobj 937 0 obj <> endobj 359 0 obj <> endobj 938 0 obj <> endobj 360 0 obj <> endobj 939 0 obj <> endobj 361 0 obj <> endobj 940 0 obj <> endobj 362 0 obj <> endobj 941 0 obj <> endobj 363 0 obj <> endobj 942 0 obj <> endobj 364 0 obj <> endobj 943 0 obj <> endobj 365 0 obj <> endobj 944 0 obj <> endobj 366 0 obj <> endobj 945 0 obj <> endobj 368 0 obj <> endobj 946 0 obj <> endobj 370 0 obj <> endobj 947 0 obj <> endobj 367 0 obj <> endobj 948 0 obj <> endobj 372 0 obj <> endobj 949 0 obj <> endobj 373 0 obj <> endobj 950 0 obj <> endobj 374 0 obj <> endobj 951 0 obj <> endobj 375 0 obj <> endobj 952 0 obj <> endobj 376 0 obj <> endobj 953 0 obj <> endobj 380 0 obj <> endobj 379 0 obj <> endobj 378 0 obj <> endobj 377 0 obj <> endobj 954 0 obj <> endobj 381 0 obj <> endobj 955 0 obj <> endobj 382 0 obj <> endobj 956 0 obj <> endobj 392 0 obj <> endobj 957 0 obj <> endobj 396 0 obj <> endobj 395 0 obj <> endobj 394 0 obj <> endobj 393 0 obj <> endobj 958 0 obj <> endobj 397 0 obj <> endobj 959 0 obj <> endobj 398 0 obj <> endobj 960 0 obj <> endobj 399 0 obj <> endobj 961 0 obj <> endobj 400 0 obj <> endobj 962 0 obj <> endobj 401 0 obj <> endobj 963 0 obj <> endobj 402 0 obj <> endobj 964 0 obj <> endobj 403 0 obj <> endobj 965 0 obj <> endobj 404 0 obj <> endobj 966 0 obj <> endobj 405 0 obj <> endobj 967 0 obj <> endobj 406 0 obj <> endobj 968 0 obj <> endobj 407 0 obj <> endobj 969 0 obj <> endobj 408 0 obj <> endobj 970 0 obj <> endobj 409 0 obj <> endobj 971 0 obj <> endobj 410 0 obj <> endobj 972 0 obj <> endobj 411 0 obj <> endobj 973 0 obj <> endobj 412 0 obj <> endobj 974 0 obj <> endobj 413 0 obj <> endobj 975 0 obj <> endobj 414 0 obj <> endobj 976 0 obj <> endobj 415 0 obj <> endobj 977 0 obj <> endobj 416 0 obj <> endobj 978 0 obj <> endobj 417 0 obj <> endobj 979 0 obj <> endobj 418 0 obj <> endobj 980 0 obj <> endobj 419 0 obj <> endobj 981 0 obj <> endobj 420 0 obj <> endobj 982 0 obj <> endobj 421 0 obj <> endobj 983 0 obj <> endobj 422 0 obj <> endobj 984 0 obj <> endobj 423 0 obj <> endobj 985 0 obj <> endobj 424 0 obj <> endobj 986 0 obj <> endobj 425 0 obj <> endobj 987 0 obj <> endobj 426 0 obj <> endobj 988 0 obj <> endobj 427 0 obj <> endobj 989 0 obj <> endobj 428 0 obj <> endobj 990 0 obj <> endobj 429 0 obj <> endobj 991 0 obj <> endobj 430 0 obj <> endobj 992 0 obj <> endobj 431 0 obj <> endobj 993 0 obj <> endobj 436 0 obj <> endobj 994 0 obj <> endobj 435 0 obj <> endobj 995 0 obj <> endobj 438 0 obj <> endobj 996 0 obj <> endobj 439 0 obj <> endobj 997 0 obj <> endobj 440 0 obj <> endobj 998 0 obj <> endobj 441 0 obj <> endobj 999 0 obj <> endobj 442 0 obj <> endobj 1000 0 obj <> endobj 443 0 obj <> endobj 1001 0 obj <> endobj 444 0 obj <> endobj 1002 0 obj <> endobj 445 0 obj <> endobj 1003 0 obj <> endobj 446 0 obj <> endobj 1004 0 obj <> endobj 447 0 obj <> endobj 1005 0 obj <> endobj 448 0 obj <> endobj 1006 0 obj <> endobj 449 0 obj <> endobj 1007 0 obj <> endobj 450 0 obj <> endobj 1008 0 obj <> endobj 451 0 obj <> endobj 1009 0 obj <> endobj 452 0 obj <> endobj 1010 0 obj <> endobj 453 0 obj <> endobj 1011 0 obj <> endobj 454 0 obj <> endobj 1012 0 obj <> endobj 455 0 obj <> endobj 1013 0 obj <> endobj 456 0 obj <> endobj 1014 0 obj <> endobj 457 0 obj <> endobj 1015 0 obj <> endobj 458 0 obj <> endobj 1016 0 obj <> endobj 459 0 obj <> endobj 1017 0 obj <> endobj 460 0 obj <> endobj 1018 0 obj <> endobj 461 0 obj <> endobj 1019 0 obj <> endobj 462 0 obj <> endobj 1020 0 obj <> endobj 463 0 obj <> endobj 1021 0 obj <> endobj 464 0 obj <> endobj 1022 0 obj <> endobj 465 0 obj <> endobj 1023 0 obj <> endobj 466 0 obj <> endobj 1024 0 obj <> endobj 467 0 obj <> endobj 1025 0 obj <> endobj 468 0 obj <> endobj 1026 0 obj <> endobj 469 0 obj <> endobj 1027 0 obj <> endobj 470 0 obj <> endobj 1028 0 obj <> endobj 471 0 obj <> endobj 1029 0 obj <> endobj 472 0 obj <> endobj 1030 0 obj <> endobj 473 0 obj <> endobj 1031 0 obj <> endobj 474 0 obj <> endobj 1032 0 obj <> endobj 475 0 obj <> endobj 1033 0 obj <> endobj 476 0 obj <> endobj 1034 0 obj <> endobj 477 0 obj <> endobj 1035 0 obj <> endobj 478 0 obj <> endobj 1036 0 obj <> endobj 479 0 obj <> endobj 1037 0 obj <> endobj 480 0 obj <> endobj 1038 0 obj <> endobj 481 0 obj <> endobj 1039 0 obj <> endobj 482 0 obj <> endobj 1040 0 obj <> endobj 483 0 obj <> endobj 1041 0 obj <> endobj 488 0 obj <> endobj 1042 0 obj <> endobj 489 0 obj <> endobj 1043 0 obj <> endobj 490 0 obj <> endobj 1044 0 obj <> endobj 491 0 obj <> endobj 1045 0 obj <> endobj 492 0 obj <> endobj 1046 0 obj <> endobj 493 0 obj <> endobj 1047 0 obj <> endobj 494 0 obj <> endobj 1048 0 obj <> endobj 495 0 obj <> endobj 1049 0 obj <> endobj 496 0 obj <> endobj 1050 0 obj <> endobj 497 0 obj <> endobj 1051 0 obj <> endobj 498 0 obj <> endobj 1052 0 obj <> endobj 499 0 obj <> endobj 1053 0 obj <> endobj 500 0 obj <> endobj 1054 0 obj <> endobj 501 0 obj <> endobj 1055 0 obj <> endobj 502 0 obj <> endobj 1056 0 obj <> endobj 503 0 obj <> endobj 1057 0 obj <> endobj 504 0 obj <> endobj 1058 0 obj <> endobj 505 0 obj <> endobj 1059 0 obj <> endobj 506 0 obj <> endobj 1060 0 obj <> endobj 507 0 obj <> endobj 1061 0 obj <> endobj 508 0 obj <> endobj 1062 0 obj <> endobj 509 0 obj <> endobj 1063 0 obj <> endobj 510 0 obj <> endobj 1064 0 obj <> endobj 511 0 obj <> endobj 1065 0 obj <> endobj 512 0 obj <> endobj 1066 0 obj <> endobj 513 0 obj <> endobj 1067 0 obj <> endobj 514 0 obj <> endobj 1068 0 obj <> endobj 515 0 obj <> endobj 1069 0 obj <> endobj 516 0 obj <> endobj 1070 0 obj <> endobj 517 0 obj <> endobj 1071 0 obj <> endobj 518 0 obj <> endobj 1072 0 obj <> endobj 519 0 obj <> endobj 1073 0 obj <> endobj 520 0 obj <> endobj 1074 0 obj <> endobj 521 0 obj <> endobj 1075 0 obj <> endobj 522 0 obj <> endobj 1076 0 obj <> endobj 523 0 obj <> endobj 1077 0 obj <> endobj 524 0 obj <> endobj 1078 0 obj <> endobj 525 0 obj <> endobj 1079 0 obj <> endobj 526 0 obj <> endobj 1080 0 obj <> endobj 527 0 obj <> endobj 1081 0 obj <> endobj 528 0 obj <> endobj 1082 0 obj <> endobj 529 0 obj <> endobj 1083 0 obj <> endobj 530 0 obj <> endobj 1084 0 obj <> endobj 531 0 obj <> endobj 1085 0 obj <> endobj 532 0 obj <> endobj 1086 0 obj <> endobj 533 0 obj <> endobj 1087 0 obj <> endobj 534 0 obj <> endobj 1088 0 obj <> endobj 535 0 obj <> endobj 1089 0 obj <> endobj 536 0 obj <> endobj 1090 0 obj <> endobj 537 0 obj <> endobj 1091 0 obj <> endobj 538 0 obj <> endobj 1092 0 obj <> endobj 539 0 obj <> endobj 1093 0 obj <> endobj 540 0 obj <> endobj 1094 0 obj <> endobj 541 0 obj <> endobj 1095 0 obj <> endobj 542 0 obj <> endobj 1096 0 obj <> endobj 543 0 obj <> endobj 1097 0 obj <> endobj 544 0 obj <> endobj 1098 0 obj <> endobj 545 0 obj <> endobj 1099 0 obj <> endobj 546 0 obj <> endobj 1100 0 obj <> endobj 547 0 obj <> endobj 1101 0 obj <> endobj 548 0 obj <> endobj 1102 0 obj <> endobj 549 0 obj <> endobj 1103 0 obj <> endobj 550 0 obj <> endobj 1104 0 obj <> endobj 551 0 obj <> endobj 1105 0 obj <> endobj 555 0 obj <> endobj 1106 0 obj <> endobj 556 0 obj <> endobj 1107 0 obj <> endobj 557 0 obj <> endobj 1108 0 obj <> endobj 558 0 obj <> endobj 1109 0 obj <> endobj 559 0 obj <> endobj 1110 0 obj <> endobj 560 0 obj <> endobj 1111 0 obj <> endobj 561 0 obj <> endobj 1112 0 obj <> endobj 562 0 obj <> endobj 1113 0 obj <> endobj 563 0 obj <> endobj 1114 0 obj <> endobj 564 0 obj <> endobj 1115 0 obj <> endobj 565 0 obj <> endobj 1116 0 obj <> endobj 566 0 obj <> endobj 1117 0 obj <> endobj 567 0 obj <> endobj 1118 0 obj <> endobj 568 0 obj <> endobj 1119 0 obj <> endobj 569 0 obj <> endobj 1120 0 obj <> endobj 570 0 obj <> endobj 1121 0 obj <> endobj 571 0 obj <> endobj 1122 0 obj <> endobj 572 0 obj <> endobj 1123 0 obj <> endobj 573 0 obj <> endobj 1124 0 obj <> endobj 574 0 obj <> endobj 1125 0 obj <> endobj 575 0 obj <> endobj 1126 0 obj <> endobj 576 0 obj <> endobj 1127 0 obj <> endobj 577 0 obj <> endobj 1128 0 obj <> endobj 578 0 obj <> endobj 1129 0 obj <> endobj 579 0 obj <> endobj 1130 0 obj <> endobj 580 0 obj <> endobj 4 0 obj <> endobj 631 0 obj <> endobj 1131 0 obj <> endobj 581 0 obj <> endobj 1132 0 obj <> >> endobj 1133 0 obj < /Producer /CreationDate(D:20070323105135+01'00')>> endobj xref 0 1134 0000000000 65535 f 0000542853 00000 n 0000000019 00000 n 0000002853 00000 n 0000618764 00000 n 0000547867 00000 n 0000548013 00000 n 0000548159 00000 n 0000548305 00000 n 0000548452 00000 n 0000548598 00000 n 0000548729 00000 n 0000548860 00000 n 0000548991 00000 n 0000549122 00000 n 0000549253 00000 n 0000549385 00000 n 0000549517 00000 n 0000549649 00000 n 0000549789 00000 n 0000549937 00000 n 0000550085 00000 n 0000550217 00000 n 0000550578 00000 n 0000550406 00000 n 0000002874 00000 n 0000550730 00000 n 0000550878 00000 n 0000551026 00000 n 0000551158 00000 n 0000551290 00000 n 0000551422 00000 n 0000551554 00000 n 0000551686 00000 n 0000551818 00000 n 0000551950 00000 n 0000552082 00000 n 0000552214 00000 n 0000552362 00000 n 0000552494 00000 n 0000006118 00000 n 0000543016 00000 n 0000006140 00000 n 0000009154 00000 n 0000552626 00000 n 0000552758 00000 n 0000552906 00000 n 0000553054 00000 n 0000553202 00000 n 0000553351 00000 n 0000553499 00000 n 0000553647 00000 n 0000553779 00000 n 0000553911 00000 n 0000554043 00000 n 0000554192 00000 n 0000554325 00000 n 0000554458 00000 n 0000554591 00000 n 0000554740 00000 n 0000554889 00000 n 0000555022 00000 n 0000555171 00000 n 0000555321 00000 n 0000555470 00000 n 0000555603 00000 n 0000555736 00000 n 0000555869 00000 n 0000556002 00000 n 0000556135 00000 n 0000556284 00000 n 0000556433 00000 n 0000556582 00000 n 0000556731 00000 n 0000556881 00000 n 0000543181 00000 n 0000009176 00000 n 0000011162 00000 n 0000557014 00000 n 0000557163 00000 n 0000557311 00000 n 0000557443 00000 n 0000557575 00000 n 0000557707 00000 n 0000557855 00000 n 0000557987 00000 n 0000558119 00000 n 0000558251 00000 n 0000558383 00000 n 0000558516 00000 n 0000558649 00000 n 0000558782 00000 n 0000558915 00000 n 0000559048 00000 n 0000559181 00000 n 0000559542 00000 n 0000559369 00000 n 0000011184 00000 n 0000559695 00000 n 0000559845 00000 n 0000559994 00000 n 0000560128 00000 n 0000560262 00000 n 0000560396 00000 n 0000560546 00000 n 0000560696 00000 n 0000560830 00000 n 0000560980 00000 n 0000561114 00000 n 0000561264 00000 n 0000561398 00000 n 0000561548 00000 n 0000561682 00000 n 0000561832 00000 n 0000561983 00000 n 0000562349 00000 n 0000562174 00000 n 0000562504 00000 n 0000562654 00000 n 0000015285 00000 n 0000543346 00000 n 0000015308 00000 n 0000016961 00000 n 0000562788 00000 n 0000562922 00000 n 0000563056 00000 n 0000563206 00000 n 0000563340 00000 n 0000563474 00000 n 0000563608 00000 n 0000563758 00000 n 0000563892 00000 n 0000564026 00000 n 0000564160 00000 n 0000564311 00000 n 0000564446 00000 n 0000564597 00000 n 0000564732 00000 n 0000564883 00000 n 0000565034 00000 n 0000565185 00000 n 0000565320 00000 n 0000565455 00000 n 0000565590 00000 n 0000565725 00000 n 0000565860 00000 n 0000565995 00000 n 0000566130 00000 n 0000566265 00000 n 0000566400 00000 n 0000566535 00000 n 0000566678 00000 n 0000566830 00000 n 0000567197 00000 n 0000567021 00000 n 0000016984 00000 n 0000567353 00000 n 0000567504 00000 n 0000567639 00000 n 0000567774 00000 n 0000567909 00000 n 0000568060 00000 n 0000568195 00000 n 0000568330 00000 n 0000568465 00000 n 0000568600 00000 n 0000568735 00000 n 0000568870 00000 n 0000569005 00000 n 0000569140 00000 n 0000569275 00000 n 0000569410 00000 n 0000020130 00000 n 0000020153 00000 n 0000020398 00000 n 0000543513 00000 n 0000020419 00000 n 0000021742 00000 n 0000569545 00000 n 0000569679 00000 n 0000569813 00000 n 0000569947 00000 n 0000570097 00000 n 0000570248 00000 n 0000570613 00000 n 0000570438 00000 n 0000025286 00000 n 0000570769 00000 n 0000570919 00000 n 0000571053 00000 n 0000571187 00000 n 0000571322 00000 n 0000571473 00000 n 0000571608 00000 n 0000571743 00000 n 0000571878 00000 n 0000572013 00000 n 0000572148 00000 n 0000572283 00000 n 0000572418 00000 n 0000572553 00000 n 0000572688 00000 n 0000572823 00000 n 0000572958 00000 n 0000573093 00000 n 0000573228 00000 n 0000573363 00000 n 0000573498 00000 n 0000573633 00000 n 0000573768 00000 n 0000573903 00000 n 0000574038 00000 n 0000574173 00000 n 0000574308 00000 n 0000574459 00000 n 0000574611 00000 n 0000574978 00000 n 0000574802 00000 n 0000021765 00000 n 0000575134 00000 n 0000575285 00000 n 0000575420 00000 n 0000575555 00000 n 0000575690 00000 n 0000575841 00000 n 0000024999 00000 n 0000025022 00000 n 0000025265 00000 n 0000029237 00000 n 0000029260 00000 n 0000029518 00000 n 0000543680 00000 n 0000029539 00000 n 0000031090 00000 n 0000575976 00000 n 0000576126 00000 n 0000576260 00000 n 0000576410 00000 n 0000576560 00000 n 0000576694 00000 n 0000576828 00000 n 0000576962 00000 n 0000577096 00000 n 0000577230 00000 n 0000577364 00000 n 0000577499 00000 n 0000577650 00000 n 0000577802 00000 n 0000578171 00000 n 0000577995 00000 n 0000031113 00000 n 0000578327 00000 n 0000578478 00000 n 0000578613 00000 n 0000578748 00000 n 0000578883 00000 n 0000579034 00000 n 0000579169 00000 n 0000579304 00000 n 0000579439 00000 n 0000579590 00000 n 0000579725 00000 n 0000579860 00000 n 0000579995 00000 n 0000580146 00000 n 0000580281 00000 n 0000580432 00000 n 0000580583 00000 n 0000580718 00000 n 0000580853 00000 n 0000580988 00000 n 0000581123 00000 n 0000581258 00000 n 0000581393 00000 n 0000581528 00000 n 0000040062 00000 n 0000040085 00000 n 0000040406 00000 n 0000543847 00000 n 0000040428 00000 n 0000042318 00000 n 0000581663 00000 n 0000581797 00000 n 0000581947 00000 n 0000582098 00000 n 0000582463 00000 n 0000582288 00000 n 0000047375 00000 n 0000582619 00000 n 0000582769 00000 n 0000582903 00000 n 0000583037 00000 n 0000583171 00000 n 0000583321 00000 n 0000583472 00000 n 0000583607 00000 n 0000583742 00000 n 0000583877 00000 n 0000584012 00000 n 0000584147 00000 n 0000584282 00000 n 0000584433 00000 n 0000584585 00000 n 0000584954 00000 n 0000584778 00000 n 0000042341 00000 n 0000585110 00000 n 0000585261 00000 n 0000585396 00000 n 0000585531 00000 n 0000585666 00000 n 0000585801 00000 n 0000585952 00000 n 0000586087 00000 n 0000586238 00000 n 0000586373 00000 n 0000586524 00000 n 0000586659 00000 n 0000586810 00000 n 0000586961 00000 n 0000587096 00000 n 0000047067 00000 n 0000047090 00000 n 0000047354 00000 n 0000051745 00000 n 0000051768 00000 n 0000052020 00000 n 0000544014 00000 n 0000052041 00000 n 0000053712 00000 n 0000587231 00000 n 0000587365 00000 n 0000587499 00000 n 0000587649 00000 n 0000587783 00000 n 0000587917 00000 n 0000588051 00000 n 0000588201 00000 n 0000588335 00000 n 0000588469 00000 n 0000588603 00000 n 0000588738 00000 n 0000588873 00000 n 0000589008 00000 n 0000589143 00000 n 0000589278 00000 n 0000589413 00000 n 0000589548 00000 n 0000589683 00000 n 0000589818 00000 n 0000589953 00000 n 0000590088 00000 n 0000590223 00000 n 0000590358 00000 n 0000590493 00000 n 0000590628 00000 n 0000590763 00000 n 0000590898 00000 n 0000591033 00000 n 0000591168 00000 n 0000591303 00000 n 0000591438 00000 n 0000591573 00000 n 0000591708 00000 n 0000591843 00000 n 0000591994 00000 n 0000592146 00000 n 0000592713 00000 n 0000592339 00000 n 0000060323 00000 n 0000592537 00000 n 0000053735 00000 n 0000592880 00000 n 0000593031 00000 n 0000593166 00000 n 0000593301 00000 n 0000593436 00000 n 0000593857 00000 n 0000593775 00000 n 0000593690 00000 n 0000593603 00000 n 0000594020 00000 n 0000594189 00000 n 0000060007 00000 n 0000060030 00000 n 0000060302 00000 n 0000064986 00000 n 0000065009 00000 n 0000065262 00000 n 0000544181 00000 n 0000065283 00000 n 0000067127 00000 n 0000594342 00000 n 0000594761 00000 n 0000594679 00000 n 0000594594 00000 n 0000594508 00000 n 0000594924 00000 n 0000595076 00000 n 0000595228 00000 n 0000595380 00000 n 0000595530 00000 n 0000595680 00000 n 0000595814 00000 n 0000595948 00000 n 0000596082 00000 n 0000596217 00000 n 0000596352 00000 n 0000596487 00000 n 0000596622 00000 n 0000596757 00000 n 0000596892 00000 n 0000597027 00000 n 0000597162 00000 n 0000597297 00000 n 0000597432 00000 n 0000597567 00000 n 0000597702 00000 n 0000597837 00000 n 0000597972 00000 n 0000598123 00000 n 0000598275 00000 n 0000598426 00000 n 0000598561 00000 n 0000598696 00000 n 0000598831 00000 n 0000598982 00000 n 0000599134 00000 n 0000599285 00000 n 0000599420 00000 n 0000599571 00000 n 0000599723 00000 n 0000544348 00000 n 0000067150 00000 n 0000068166 00000 n 0000600073 00000 n 0000599914 00000 n 0000068188 00000 n 0000600229 00000 n 0000600379 00000 n 0000600513 00000 n 0000600647 00000 n 0000600781 00000 n 0000600916 00000 n 0000601052 00000 n 0000601188 00000 n 0000601324 00000 n 0000601460 00000 n 0000601597 00000 n 0000601734 00000 n 0000601871 00000 n 0000602008 00000 n 0000602145 00000 n 0000602282 00000 n 0000602419 00000 n 0000602556 00000 n 0000602693 00000 n 0000602830 00000 n 0000602967 00000 n 0000603104 00000 n 0000603241 00000 n 0000603378 00000 n 0000603515 00000 n 0000603652 00000 n 0000603789 00000 n 0000603926 00000 n 0000604063 00000 n 0000604200 00000 n 0000604337 00000 n 0000604474 00000 n 0000604611 00000 n 0000604748 00000 n 0000604885 00000 n 0000605022 00000 n 0000605159 00000 n 0000605296 00000 n 0000605433 00000 n 0000605570 00000 n 0000605707 00000 n 0000605844 00000 n 0000605981 00000 n 0000606118 00000 n 0000606255 00000 n 0000606392 00000 n 0000093558 00000 n 0000544515 00000 n 0000093582 00000 n 0000094672 00000 n 0000606529 00000 n 0000606665 00000 n 0000606801 00000 n 0000606937 00000 n 0000607073 00000 n 0000607209 00000 n 0000607345 00000 n 0000607481 00000 n 0000607617 00000 n 0000607753 00000 n 0000607889 00000 n 0000608026 00000 n 0000608163 00000 n 0000608300 00000 n 0000608437 00000 n 0000608574 00000 n 0000608711 00000 n 0000608848 00000 n 0000608985 00000 n 0000609122 00000 n 0000609259 00000 n 0000609396 00000 n 0000609533 00000 n 0000609670 00000 n 0000609807 00000 n 0000609944 00000 n 0000610081 00000 n 0000610218 00000 n 0000610355 00000 n 0000610492 00000 n 0000610629 00000 n 0000610766 00000 n 0000610903 00000 n 0000611040 00000 n 0000611177 00000 n 0000611314 00000 n 0000611451 00000 n 0000611588 00000 n 0000611725 00000 n 0000611862 00000 n 0000611999 00000 n 0000612136 00000 n 0000612273 00000 n 0000612410 00000 n 0000612547 00000 n 0000612684 00000 n 0000612821 00000 n 0000612958 00000 n 0000613095 00000 n 0000613232 00000 n 0000613369 00000 n 0000613506 00000 n 0000613643 00000 n 0000613780 00000 n 0000613917 00000 n 0000614054 00000 n 0000614191 00000 n 0000614328 00000 n 0000614465 00000 n 0000614602 00000 n 0000614739 00000 n 0000614876 00000 n 0000615013 00000 n 0000615150 00000 n 0000544683 00000 n 0000094695 00000 n 0000095217 00000 n 0000615287 00000 n 0000615423 00000 n 0000615559 00000 n 0000615695 00000 n 0000615831 00000 n 0000615967 00000 n 0000616103 00000 n 0000616239 00000 n 0000616375 00000 n 0000616511 00000 n 0000616647 00000 n 0000616784 00000 n 0000616921 00000 n 0000617058 00000 n 0000617195 00000 n 0000617332 00000 n 0000617469 00000 n 0000617598 00000 n 0000617735 00000 n 0000617872 00000 n 0000618009 00000 n 0000618138 00000 n 0000618275 00000 n 0000618412 00000 n 0000618549 00000 n 0000618686 00000 n 0000626613 00000 n 0000095239 00000 n 0000095902 00000 n 0000095924 00000 n 0000096117 00000 n 0000096410 00000 n 0000096574 00000 n 0000240360 00000 n 0000240385 00000 n 0000240581 00000 n 0000241527 00000 n 0000242499 00000 n 0000242569 00000 n 0000242866 00000 n 0000243046 00000 n 0000389315 00000 n 0000389340 00000 n 0000389538 00000 n 0000390484 00000 n 0000391454 00000 n 0000391556 00000 n 0000391875 00000 n 0000392073 00000 n 0000540124 00000 n 0000540149 00000 n 0000540352 00000 n 0000541298 00000 n 0000542268 00000 n 0000542359 00000 n 0000542455 00000 n 0000542575 00000 n 0000542759 00000 n 0000544851 00000 n 0000544910 00000 n 0000545075 00000 n 0000545242 00000 n 0000545433 00000 n 0000545645 00000 n 0000545795 00000 n 0000545960 00000 n 0000546127 00000 n 0000546275 00000 n 0000546435 00000 n 0000546611 00000 n 0000546785 00000 n 0000546945 00000 n 0000547105 00000 n 0000547277 00000 n 0000547457 00000 n 0000547626 00000 n 0000622647 00000 n 0000547801 00000 n 0000547947 00000 n 0000548093 00000 n 0000548239 00000 n 0000548386 00000 n 0000548532 00000 n 0000548679 00000 n 0000548810 00000 n 0000548941 00000 n 0000549072 00000 n 0000549203 00000 n 0000549335 00000 n 0000549467 00000 n 0000549599 00000 n 0000549723 00000 n 0000549871 00000 n 0000550019 00000 n 0000550167 00000 n 0000550299 00000 n 0000550494 00000 n 0000550664 00000 n 0000550812 00000 n 0000550960 00000 n 0000551108 00000 n 0000551240 00000 n 0000551372 00000 n 0000551504 00000 n 0000551636 00000 n 0000551768 00000 n 0000551900 00000 n 0000552032 00000 n 0000552164 00000 n 0000552296 00000 n 0000552444 00000 n 0000552576 00000 n 0000552708 00000 n 0000552840 00000 n 0000552988 00000 n 0000553136 00000 n 0000553285 00000 n 0000553433 00000 n 0000553581 00000 n 0000553729 00000 n 0000553861 00000 n 0000553993 00000 n 0000554126 00000 n 0000554275 00000 n 0000554408 00000 n 0000554541 00000 n 0000554674 00000 n 0000554823 00000 n 0000554972 00000 n 0000555105 00000 n 0000555255 00000 n 0000555404 00000 n 0000555553 00000 n 0000555686 00000 n 0000555819 00000 n 0000555952 00000 n 0000556085 00000 n 0000556218 00000 n 0000556367 00000 n 0000556516 00000 n 0000556665 00000 n 0000556815 00000 n 0000556964 00000 n 0000557097 00000 n 0000557245 00000 n 0000557393 00000 n 0000557525 00000 n 0000557657 00000 n 0000557789 00000 n 0000557937 00000 n 0000558069 00000 n 0000558201 00000 n 0000558333 00000 n 0000558466 00000 n 0000558599 00000 n 0000558732 00000 n 0000558865 00000 n 0000558998 00000 n 0000559131 00000 n 0000559264 00000 n 0000559458 00000 n 0000559629 00000 n 0000559779 00000 n 0000559928 00000 n 0000560078 00000 n 0000560212 00000 n 0000560346 00000 n 0000560480 00000 n 0000560630 00000 n 0000560780 00000 n 0000560914 00000 n 0000561064 00000 n 0000561198 00000 n 0000561348 00000 n 0000561482 00000 n 0000561632 00000 n 0000561766 00000 n 0000561917 00000 n 0000562067 00000 n 0000562265 00000 n 0000562438 00000 n 0000562588 00000 n 0000562738 00000 n 0000562872 00000 n 0000563006 00000 n 0000563140 00000 n 0000563290 00000 n 0000563424 00000 n 0000563558 00000 n 0000563692 00000 n 0000563842 00000 n 0000563976 00000 n 0000564110 00000 n 0000564245 00000 n 0000564396 00000 n 0000564531 00000 n 0000564682 00000 n 0000564817 00000 n 0000564968 00000 n 0000565119 00000 n 0000565270 00000 n 0000565405 00000 n 0000565540 00000 n 0000565675 00000 n 0000565810 00000 n 0000565945 00000 n 0000566080 00000 n 0000566215 00000 n 0000566350 00000 n 0000566485 00000 n 0000566612 00000 n 0000566764 00000 n 0000566915 00000 n 0000567113 00000 n 0000567287 00000 n 0000567438 00000 n 0000567589 00000 n 0000567724 00000 n 0000567859 00000 n 0000567994 00000 n 0000568145 00000 n 0000568280 00000 n 0000568415 00000 n 0000568550 00000 n 0000568685 00000 n 0000568820 00000 n 0000568955 00000 n 0000569090 00000 n 0000569225 00000 n 0000569360 00000 n 0000569495 00000 n 0000569629 00000 n 0000569763 00000 n 0000569897 00000 n 0000570031 00000 n 0000570182 00000 n 0000570332 00000 n 0000570529 00000 n 0000570703 00000 n 0000570853 00000 n 0000571003 00000 n 0000571137 00000 n 0000571272 00000 n 0000571407 00000 n 0000571558 00000 n 0000571693 00000 n 0000571828 00000 n 0000571963 00000 n 0000572098 00000 n 0000572233 00000 n 0000572368 00000 n 0000572503 00000 n 0000572638 00000 n 0000572773 00000 n 0000572908 00000 n 0000573043 00000 n 0000573178 00000 n 0000573313 00000 n 0000573448 00000 n 0000573583 00000 n 0000573718 00000 n 0000573853 00000 n 0000573988 00000 n 0000574123 00000 n 0000574258 00000 n 0000574393 00000 n 0000574545 00000 n 0000574696 00000 n 0000574894 00000 n 0000575068 00000 n 0000575219 00000 n 0000575370 00000 n 0000575505 00000 n 0000575640 00000 n 0000575775 00000 n 0000575926 00000 n 0000576060 00000 n 0000576210 00000 n 0000576344 00000 n 0000576494 00000 n 0000576644 00000 n 0000576778 00000 n 0000576912 00000 n 0000577046 00000 n 0000577180 00000 n 0000577314 00000 n 0000577449 00000 n 0000577584 00000 n 0000577736 00000 n 0000577887 00000 n 0000578087 00000 n 0000578261 00000 n 0000578412 00000 n 0000578563 00000 n 0000578698 00000 n 0000578833 00000 n 0000578968 00000 n 0000579119 00000 n 0000579254 00000 n 0000579389 00000 n 0000579524 00000 n 0000579675 00000 n 0000579810 00000 n 0000579945 00000 n 0000580080 00000 n 0000580231 00000 n 0000580366 00000 n 0000580517 00000 n 0000580668 00000 n 0000580803 00000 n 0000580938 00000 n 0000581073 00000 n 0000581208 00000 n 0000581343 00000 n 0000581478 00000 n 0000581613 00000 n 0000581747 00000 n 0000581881 00000 n 0000582032 00000 n 0000582182 00000 n 0000582379 00000 n 0000582553 00000 n 0000582703 00000 n 0000582853 00000 n 0000582987 00000 n 0000583121 00000 n 0000583255 00000 n 0000583406 00000 n 0000583557 00000 n 0000583692 00000 n 0000583827 00000 n 0000583962 00000 n 0000584097 00000 n 0000584232 00000 n 0000584367 00000 n 0000584519 00000 n 0000584670 00000 n 0000584870 00000 n 0000585044 00000 n 0000585195 00000 n 0000585346 00000 n 0000585481 00000 n 0000585616 00000 n 0000585751 00000 n 0000585886 00000 n 0000586037 00000 n 0000586172 00000 n 0000586323 00000 n 0000586458 00000 n 0000586609 00000 n 0000586744 00000 n 0000586895 00000 n 0000587046 00000 n 0000587181 00000 n 0000587315 00000 n 0000587449 00000 n 0000587583 00000 n 0000587733 00000 n 0000587867 00000 n 0000588001 00000 n 0000588135 00000 n 0000588285 00000 n 0000588419 00000 n 0000588553 00000 n 0000588688 00000 n 0000588823 00000 n 0000588958 00000 n 0000589093 00000 n 0000589228 00000 n 0000589363 00000 n 0000589498 00000 n 0000589633 00000 n 0000589768 00000 n 0000589903 00000 n 0000590038 00000 n 0000590173 00000 n 0000590308 00000 n 0000590443 00000 n 0000590578 00000 n 0000590713 00000 n 0000590848 00000 n 0000590983 00000 n 0000591118 00000 n 0000591253 00000 n 0000591388 00000 n 0000591523 00000 n 0000591658 00000 n 0000591793 00000 n 0000591928 00000 n 0000592080 00000 n 0000592231 00000 n 0000592431 00000 n 0000592629 00000 n 0000592814 00000 n 0000592965 00000 n 0000593116 00000 n 0000593251 00000 n 0000593386 00000 n 0000593521 00000 n 0000593936 00000 n 0000594105 00000 n 0000594274 00000 n 0000594426 00000 n 0000594840 00000 n 0000595008 00000 n 0000595160 00000 n 0000595312 00000 n 0000595464 00000 n 0000595614 00000 n 0000595764 00000 n 0000595898 00000 n 0000596032 00000 n 0000596167 00000 n 0000596302 00000 n 0000596437 00000 n 0000596572 00000 n 0000596707 00000 n 0000596842 00000 n 0000596977 00000 n 0000597112 00000 n 0000597247 00000 n 0000597382 00000 n 0000597517 00000 n 0000597652 00000 n 0000597787 00000 n 0000597922 00000 n 0000598057 00000 n 0000598209 00000 n 0000598360 00000 n 0000598511 00000 n 0000598646 00000 n 0000598781 00000 n 0000598916 00000 n 0000599068 00000 n 0000599219 00000 n 0000599370 00000 n 0000599505 00000 n 0000599657 00000 n 0000599808 00000 n 0000600005 00000 n 0000600163 00000 n 0000600313 00000 n 0000600463 00000 n 0000600597 00000 n 0000600731 00000 n 0000600865 00000 n 0000601001 00000 n 0000601137 00000 n 0000601273 00000 n 0000601409 00000 n 0000601546 00000 n 0000601683 00000 n 0000601820 00000 n 0000601957 00000 n 0000602094 00000 n 0000602231 00000 n 0000602368 00000 n 0000602505 00000 n 0000602642 00000 n 0000602779 00000 n 0000602916 00000 n 0000603053 00000 n 0000603190 00000 n 0000603327 00000 n 0000603464 00000 n 0000603601 00000 n 0000603738 00000 n 0000603875 00000 n 0000604012 00000 n 0000604149 00000 n 0000604286 00000 n 0000604423 00000 n 0000604560 00000 n 0000604697 00000 n 0000604834 00000 n 0000604971 00000 n 0000605108 00000 n 0000605245 00000 n 0000605382 00000 n 0000605519 00000 n 0000605656 00000 n 0000605793 00000 n 0000605930 00000 n 0000606067 00000 n 0000606204 00000 n 0000606341 00000 n 0000606478 00000 n 0000606614 00000 n 0000606750 00000 n 0000606886 00000 n 0000607022 00000 n 0000607158 00000 n 0000607294 00000 n 0000607430 00000 n 0000607566 00000 n 0000607702 00000 n 0000607838 00000 n 0000607975 00000 n 0000608112 00000 n 0000608249 00000 n 0000608386 00000 n 0000608523 00000 n 0000608660 00000 n 0000608797 00000 n 0000608934 00000 n 0000609071 00000 n 0000609208 00000 n 0000609345 00000 n 0000609482 00000 n 0000609619 00000 n 0000609756 00000 n 0000609893 00000 n 0000610030 00000 n 0000610167 00000 n 0000610304 00000 n 0000610441 00000 n 0000610578 00000 n 0000610715 00000 n 0000610852 00000 n 0000610989 00000 n 0000611126 00000 n 0000611263 00000 n 0000611400 00000 n 0000611537 00000 n 0000611674 00000 n 0000611811 00000 n 0000611948 00000 n 0000612085 00000 n 0000612222 00000 n 0000612359 00000 n 0000612496 00000 n 0000612633 00000 n 0000612770 00000 n 0000612907 00000 n 0000613044 00000 n 0000613181 00000 n 0000613318 00000 n 0000613455 00000 n 0000613592 00000 n 0000613729 00000 n 0000613866 00000 n 0000614003 00000 n 0000614140 00000 n 0000614277 00000 n 0000614414 00000 n 0000614551 00000 n 0000614688 00000 n 0000614825 00000 n 0000614962 00000 n 0000615099 00000 n 0000615236 00000 n 0000615372 00000 n 0000615508 00000 n 0000615644 00000 n 0000615780 00000 n 0000615916 00000 n 0000616052 00000 n 0000616188 00000 n 0000616324 00000 n 0000616460 00000 n 0000616596 00000 n 0000616733 00000 n 0000616870 00000 n 0000617007 00000 n 0000617144 00000 n 0000617281 00000 n 0000617418 00000 n 0000617547 00000 n 0000617684 00000 n 0000617821 00000 n 0000617958 00000 n 0000618087 00000 n 0000618224 00000 n 0000618361 00000 n 0000618498 00000 n 0000618635 00000 n 0000622723 00000 n 0000626802 00000 n 0000626944 00000 n trailer < <459A76564652DF13DD1660CD2BA2D732> ] >> startxref 627133 %%EOF qtoctave-0.10.1/widgetserver/doc/tutorial/widgetserver_octave_spanish.txt0000755000175000017500000001152111511434230026077 0ustar lucaslucas

Ejemplo de uso del Widgetserver desde Octave.

Las comunicaciones con el Widgetserver se realizarn usando el comando de octave popen2. El problema es que la implementacin de este comando falla. La implementacin correcta de este comando sera:
function [in, out, pid] = popen2 (command, args)

  in = -1;
  out = -1;
  pid = -1;

  if (nargin == 1 || nargin == 2)

    if (nargin == 1)
      args = "";
    endif

    if (ischar (command))

      [stdin_pipe, stdin_status] = pipe ();
      [stdout_pipe, stdout_status] = pipe ();

      if (stdin_status == 0 && stdout_status == 0)

        pid = fork ();

        if (pid == 0)

	  ## In the child.

          fclose (nth (stdin_pipe, 2));
          fclose (nth (stdout_pipe, 1));

          dup2 (nth (stdin_pipe, 1), stdin);
          fclose (nth (stdin_pipe, 1));

          dup2 (nth (stdout_pipe, 2), stdout);
          fclose (nth (stdout_pipe, 2));

          if (exec (command, args) < 0)
            error ("popen2: unable to start process `%s'", command);
            exit (0);
          endif

        elseif (pid)

	  ## In the parent.

          fclose (nth (stdin_pipe, 1));
          fclose (nth (stdout_pipe, 2));

          %if (fcntl (nth (stdout_pipe, 1), F_SETFL, O_NONBLOCK) < 0)
          %  error ("popen2: error setting file mode");
          %else
            in = nth (stdin_pipe, 2);
            out = nth (stdout_pipe, 1);
          %endif

        elseif (pid < 0)
          error ("popen2: fork failed -- unable to create child process");
        endif
      else
        error ("popen2: pipe creation failed");
      endif
    else
      error ("popen2: file name must be a string");
    endif
  else
    usage ("[in, out, pid] = popen2 (command, args)");
  endif

endfunction

Se puede incluir dentro de los programas de Octave, pues Octave permite redefinir las funciones.

Para comunicarse con Octave se seguirn los siguientes pasos:
1. Se abrirn las comunicaciones con el Widgetserver usando popen2.
2. Se le mandarn las instrucciones necesarias para construir la ventana.
3. Se escucharn los eventos con fgets.

Ejemplo comentado.

El siguiente ejemplo abre una ventana que pide el argumento de la funcin sombrero:
[out,in,pid]=popen2("widgetserver");
if(pid<0)
	printf("Error widgetserver couldn't be executed\n");
	exit(1);
end
Lo que se ha hecho es abrir las comunicaciones con el Widgetserver. En el caso de que el programa widgetserver no se encuentre, se muestra un mensaje de error. En el caso de que no funcione correctamente, se puede usar la implementacin de popen2 mostrada anteriormente.
fprintf(out, "\n");
fprintf(out, "	\n");
fprintf(out, "	

\n"); fprintf(out, " \n"); fprintf(out, " Number of grids\n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, "

\n"); fprintf(out, " \n"); fprintf(out, " Draws sombrero function\n"); fprintf(out, " \n"); fprintf(out, "

\n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " Ok\n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, " Cancel\n"); fprintf(out, " \n"); fprintf(out, " \n"); fprintf(out, "

\n"); fprintf(out, "\n"); fflush(out);
Se enva la ventana que se tiene que mostrar. El fflush(out) es importante para poder enviar los datos..Es mucho ms cmodo escribir la ventana en un fichero y enviarla despus leyendo el fichero.

%Event loop
while( isstr ( line=fgets(in) ) )
	% Se procesan los eventos para cerrar la ventana
	if(
		( length(line)>=15 && strcmp(substr(line,1,16),'*clicked: cancel') )
		||
		( length(line)>=13 && strcmp(substr(line,1,13),'*close: frame') )
	  )
		fprintf(out, "\n");
		fflush(out);
		break;
	end;
	
	% Se debe haber hecho click sobre el botn de Ok.
	
	% Se lee la lnea de texto.
	fprintf(out, "\n");
	fprintf(out, "	\n");
	fprintf(out, "\n");
	fflush(out);
	
	line=fgets(in);
	w0=fgets(in);

	%Se dibuja el sombrero
	sombrero(eval(w0));

end

Este era el bucle de eventos, se van leyendo, lnea a lnea los datos que enva el Widgetserver y se procesan.
Las funciones strcmp, substr y length se usan para comparar las cadenas. La funcin strcmp compara dos cadenas e indica si son iguales. length sirve para indicar la longitud de un array (una cadena). substr sirve para extraer una parte de una cadena.

fclose(in);
fclose(out);

% Fin del programa

En el fichero
ej_sombrero.m se puede encontrar el ejemplo anterior. qtoctave-0.10.1/widgetserver/doc/tutorial/ej11.ws0000755000175000017500000000020311511434230020644 0ustar lucaslucas

Hola mundo.

qtoctave-0.10.1/widgetserver/doc/tutorial/borrame.ws0000755000175000017500000000062611511434230021544 0ustar lucaslucas

w0

w

Solve oscillator equation:
		x''+w0x=sin(wt)
		

Ok Cancel

qtoctave-0.10.1/widgetserver/doc/tutorial/widgetserver_tutorial.odt0000755000175000017500000035624711511434230024724 0ustar lucaslucasPKnNw6^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKnNw6Configurations2/statusbar/PKnNw6'Configurations2/accelerator/current.xmlPKPKnNw6Configurations2/floater/PKnNw6Configurations2/popupmenu/PKnNw6Configurations2/progressbar/PKnNw6Configurations2/menubar/PKnNw6Configurations2/toolbar/PKnNw6Configurations2/images/Bitmaps/PKnNw6u4/-Pictures/100000000000012C0000004C7BCE8785.pngPNG  IHDR,LXIDATx pGǿ!O܆HdS'dGRޯ*yؖ]ۂ1d.&ԆR)lKquRI k[Yl$ bTlEM_<%XSů>5 $`ؖm1Nulcۏq!C&/pD@/k7lh& F4Bk͆1̃AUB:"h l(zgdLnkXS=z$$I^v C BB}!(d6Slv~7dWK-ohj苳X6Xl&-d y~f3;6]FR$|)N*4Z8p1Hd A2S@8,~]iq]V;n{W `}y#[68hfDܯeZahi[?C<㨄$.ssRd$/5vJg^bL8q&K60 Jߐ Vi3ܝden B#|i:3}ɦﺐz#KS\t/[AvM49>d8*ep&@]M m& [o"=D`Ȧ H{ lӺ&`sv ̿)a#݇QL}πmK^bՕѪu s9ev:FioÎzu4r.NiۊW̧YˊDk]]_xZ-2x=V$^N=xքHalXmLXI}aFP0wh(aC{: .}drkn_ cɃC\p r]d:=e8PDށ䖾N 45B$s_m]`dDy4}=rO"G:7~h}++BJ1+w[ "/n(-m?uyسXb p(! J`s弻e pLkBKɮvE,tvWxη' |Ys7#sLkmni #\$^k΁U*.Kx*YG50LCii R%p'(ahj%RRr;£&!'=B! zܾ5s d^jZ}Y[ꕫ 0۴Y&6ηvJe$/7npqLeˠ'LC&g$x;nmR1^!-܍9j)5eDySV@Zk1I9 #ްHEusmoOSw0[wPK^ν7X׹ح-wD:vbo^/_o +i`-g#:GE1 kBHuWnb&V#+a\5(s+BHfj7;>QHq&@"܆)!J5^ϕ|XrSBVVdej%UUz*룑;}E#_}r+rڴ؄Lsj^h{YG&0KiЊŢ, rV,.9İZdƘ6uҀ"=/u7\M3vN#d Ƥ,{)erԋMϚpl&*a 4^+5!پ z[5`*՚09CJLSgGg3x2"~m4sLX&2"Qa4L6"G:1@|wzgsg`42L+KCh2ڹc'?7@~l@J~aJB0Y"sv=3DdUFT@G%p.G̩{N"y($"I$=k1;=ոɔP}\gB&?5OGiT3)^!L&jBUj=zEѳ!&k²Pd IS!0jF쐎\'ΐAf۲V:ЬGz|]Heb> Dϻ 2?dAz)sfWrI[(81q$U lك﯄֓I&WBN-fzI p<қ`?h#&]5Vn"Fڣ5=@/Fּ9}Ț5L{PyM `{ ZH"=md76ilZ"եHJ Α'#T<xN/5?y$ٳ,>IgC$$ڽ0k(m xzw>O[Yp@q6}('zքWjLVwDQkBWB\jr">bܕ kBgXC䌽Ƶ;k苗ׄ) HDH?߲Tɼ#;khS޽@~}pnYeRO*MMt&+%kO&r('Qڹ߰91~d:W" YZ>1kSOG;Q#w=D 5V̞HgH^'ukDKl ^7-q~7cbG0=wGǰbNÚڳۈ23TPr-EZ}FlPm<'Kf4[*}3̆ ]>6wkP<3KQx Z0(j$epYCxmՄΑOcw5ckU=1v:|wJ8>JX^ 6mKwf5л)=|80~/./ѫQښ02GcfR%k#㏃2bJȘrOM8f2%ddL122L SL)&SBF)!#cɔ1dJȘb2%ddL1Ǯ^wBf6m3X Rl7Ft㶦A-WU i>Z2w:ӇKnWJHwTe4XU32-Q (QFa}lJ22&eSBFq&@?&#Ǎ3۶Y﷥<՛1pƚjRɵGd2Ct x웫^pV-mo>yzScUoMy$p8\{虰q4**h-=~t9 -۲&}M:=9bo]x՛UUjo;wn:WW- OEYFNzk:anӖ885Ey/h!+U '?G?"~\pd!ז<䯋Ny{[z}u}?dMݿ}럫T~D>^6D y?Dr\~g@'n^NWCKYv-h]E˟X{O]_4fy0/s$J8q'0G!uKj3ש3gI+~,~x-3ʊCPOr8J-!:Bb [.T7ڪlg)kUׅ̽_tRU riK"C :o%-xB@"_ ?l*ҞUKBVSy)۴քd9WG$ d1@5ʦWH+C2dzfZC6>+_GP&n=n>H=զJ8n![ eYsr zC&֞3Si1JȚ=Z#&UfHԉ=zlQNHxQ{/1#hM(םnJyGcF'U[|tЭHۇi쯹@_6~7}^7RICg%7j3&cDՄ\Z\uҝ&$s5" A%y36idž&ˠOa'i)|&E3^^qALþWW%5 ?I < g!{g^ ;ko]"6hIMWBd¾;ʮW|\qPUBb7lY[{x,YhJX,q_T`R,ʕԔUO7n5`[<ք JsE;UU.X/PkB}Gۺ_~9憗e㉪ y&`zF}`ڲrAt30؇>_~qVܱ%{6忪(uj[ N~&n85R`=qdbz룑"a#&&$ Yzp##F<OTMƇ7z5f6ք8cFFN5X!ljL`M#=HFF!X"lA; lfS;&&T08D9Iܱ0B-nbqߣ,*oӭF3xf6zІ4}ƺ;fUW-bmǁ{xW[x3îT2I )tFYHݐ-p%A$ېXXE>O$/i?2.q|#Q'y-y>C:n Ú{}?^-O8)(mO|k>NZ.z-o~v/ƧKKWl閕2c.>.{8Ŀ^Mg.<&s. ~ԥ8{ԥ8̻ŵPb\4ܑy_}TꞯQC8gJũEJ73Bߜj'}T BB1ZRʜuu-AߩTṿ՚Wm#)*gP ^#8cWe=w|zAh-x1m0N;>4 y/yM(87ߎK#[Tns9o:Ӿ>Mwh{3!ץ欎|;g.d@)AG>Zkgt7tmo~Þ|?I.;|?Yրq?n Xor[|w '4mSQ$χ8l5 w}+u۲H]i|&(;,jFA6vK6ȥ\PQkBY[?3iwhTIą.cl܎]({lB7Pv>p zRO3 шE47Qʆ | BAχ.m`gx|0;B?'w@٨ZFbU׉fr78ʜbHGAGP5-A=zF;\72zm+|7 ࢪ:PC)~Ha*8.Nڇvՠ3)Lh;Kֺ#z^M„ mVPjHU>u3t}MƆo%4g.Tь~&h;;hot?gCmǘT`4wuQfðmMrM r7>3>4NR&Mp8XXmx}*3aL84i\9eƸLsE6[ 7l_!ۃtn7cй(KZ+ #}y6zq`>}'Q8K{x&֬mN2#8^~ni›C4N/hOۉp3z+!AnEܓ? cnv. ^9ƽ(F@aXa3m&d8W95`\@v玽=6Q! t$/*us@OH$Gnw} ,m_GIiEmc7# Z˘"S˸.޷| 5G5W;c7ݡ3e{?&5Ӝ?G2D.c=Lذ{QLk5>SzMlp`W}S*3=i ijI]n&&P?³st kךƣ>m)Ϲ$/$]9Ja,h *08ףvMM>9j]>>C]!/Zh2acü4E:v_}blϻ~=Tas/ڈK6ǣGg0V,線s$-^?I^Y srٺ'+"<S1NOC4lp3.P-Zbw ༙=^;{p7? Xa*[?R|2^vh:&`AU0pVt~Qɞ87p~9YPoٛ0u)_#Avre S(ʞ X3ocE1T`܏ j@]+eg/ʌQkN'tQhtbߦ=v k `ܲ9jl~(7_F[V afۚ;m Pα6%䲙o/J]?HMco eud4Zn?؍%)Xߜko!wz/ 9(BOo]ͤ Uӏ&/U/cvL0 .ڊmJe`IzfӶ+W ۚrux2 /'CCY|0ɔa )jS! egG7^Crl:Ù"mSIBTea UDʽ":ʚ-&JO߭&tmL!I NoL!ǩ`7 !2%NQ$ !*:!Dœ@'xOIBT< tB'NQ$ !*:!Dœ@'xeFv=z+?h$~*~m )@5BQ=YDƒ^lt 0@f (27nk_I1 Eo|D}M9%decu'F #Ӆa1vǀlQe8w }ԡZr=P;O;۩N:_ɟwN:_K9@܊yפY4m^kҴ}ވtOCZ I`iLK/ o -"7JRցeԏNv˜@yݼ;FHطg_H 464^MxKemPxǂdQJqC Ke@@C >*\Pƥ r%kLwƈG^a1Mw{\~̱y&X=܏֚߾4__nHf?Kc*v%}()%`&':cŹAxKCR4?M'8v@K0+\0h-dҶo:g[m Y{艣A4Mjo,J9aBܚ{طw_Մ#e@$ZQ"p)ALo$h eO͵A?^GO j)v; }BT1tIDz P/l{tІ0ݯ=\W!Y=`Pj[mu% !VʝE! !H_d%7J"nRx(g z[}9V>E;=Dn_"nQJQhP̶mk gTyFИUpOr!Ce_|ŔkZ;z, άa⧲җWTZkzУ7Cu$w(?*L﻽$>Kὸ#mZN󏚉+]8':T5\wN]=butӒ˾rE}/ =u`>-2aR|hVeXjңBT< tB'NQ$ !*:!Dœ@'xOIBT< tB'NQ$ !*:!Dœ@LcC7v5i$ȣE@[Þwz8|0m|AA{i#4$-#cqbw0M3gCdy!ezG|$6mbo_sBr!n)tg3881pzcGsτzQL;4uXңBT< tB'NQ$ !*:!Dœ@'xO[#Ƀ&MmQ:Nt,u3*^(mnƬH[ _KTvOsK݌B۲ t2tBT<- B@ztB'=k̃ -BL"=,J0&zG@3]sU]-Dt Kk?m|9 %d[ڏ3-t>V?x=x9V}6rd|O o _6%'~ `Vۻ:?ңj2طEn5ԂK>;mZjhmo~8| RKӞ%TnvLpK>'CNj+B tHH&I @d,V>jFOMb43 sng&~>]Pƪ28'J?\O]m>1Q?ewM'XUM;iRt&?Մ>ɋ׫c9*|ΰC&R6炳{|I[Lvjz1IK'x Տv p(GAY?rɷ pWljg͚5]u>G['W*u-oQÇ`y;؊I8d}w`V)G,ĸZ{8gb:CkC]\'iuU%.}7F}ʹ<ڂ7Ѹ8YE1ЇhzINPOm<}u:I\ply`{E^9u]jpcwvj*IOfO.H³RI+υ>1"a8@PVy]3ٌc;|WtɃr"NTMc0.@XA]} } . 3v5q.ARCO@1uwo%@'*[1[a0vǘoCU@9B OK'LztBT;>bfvu x6S.y]#[#\1q6AF֬lQًa#lqg̷NXsnv&k wmiTei[$ЉʧL =1/o׻XCA=GulzďWOyd 2t+C@Aa|*\7 7BvxxG m$&2W tb۽46yɨx΋F﻽$>Kὸ#mZN󏚧 N7i&?>*@2t+N `.fj\]\秃\}07.Z|Q0Cm9 {(G>+:2d4*ĿYqԆ\J⼶/}yٝ7ˋʰ!-X@&=:!Dœ@'xOIBT<**N(m/\P,HR7a$Љ#vd2tBT*!DPvԡB=F!u| V7K!Du=g0IENDB`PKnNw6_  -Pictures/10000201000000F600000097BFCCF6BA.pngPNG  IHDR&7IDATxhgw4K ,QhJdKKJaWZ֦-44ɵv&鲍rgn+l:.]uR 1!28b z-K$j*GόG3;{1떙 N{ֶEBe#Ǿ7}wu>7ֺIB2 cIdasn*.k!\eM*.-df[] 9b`N|AsӶqt^G ^rX*6**hJ|}Mm#A։?nsp+_M!o`_rXepQ^_ 3=6ƫ ICwE/agBX Q#렾=61DZ̕ ٯD:j$IeCh͑w{:# kێN}G=b9h\MY1\H%-GzX75g;EMP2bh5F 8 {2e >8g.Z83?ޢ|Y vIjZdGqNt8;ċ뫵Lꙷ.3z''05Hx C_F-"Y~nlOt<ƚTh%W.Qe#O'we{t>:=\ K>58Oq"#8s|MrQGS +w kA=tI8J]?}[{B5Z7ty8GSZ16i0#p]?2 mRI Jqbw T/:EhîE՗xbg=-_(Ղ;ԧyT\GCabA|;66Ấah8"}=C *5K7cO|5XqBg)LѶ`,=qb9b`=I5~7ݢ 7-rYmV^C 7:_kDrn='QS]T;O苓ΏM\>Rݎ[E{@sH쁾"Ψ`b([@#sBřC#8Dhui ;`x:Bѩ k*C}l|>6'‚]iՏZ@aZK6!-HiĢ09pVy瘸RQS#YCarzsxZF?!}&c?k~pa`+:Z棹g楿t{C5iX -c,xݦ%`aerؑS; w$wcB ץiP7D :s3jw/ϿTZԮoFz~}~'^zkAn)% 5ۤ КB3Mnn0I<66"}E}񧓆 PsU`m',z62WMr9`yx'qx_]O > =nii 5Pͱmq=]"3jqiؤM(c8AuɎZ&4clxo7щwfr,fFߠKۉn/]H9BfhN܆-z w#Nݕ۾cFkPv-iYuJt1K&L;WcY`P#?lA&̀].3ӀFk bSǝ뗠TtCf&.}lLK䒦zv8'8:uj:9Mk"me h`P*>!Jf!Uކ9|oʶbY&v9(ec3WmM:=528GКZW6xmJ9zZ}'e@}M$(9:ja+=Ш%Kqay`aNvjzΣJZ *v&vKr(hFi633SQ0JTץ5Imn rn50PkNo]jhluyIv.gZסne) Z6M霻FvlJ6 C`$U?|pޫm$pB}tZstVeE׫*U][=B^j[Zy綨:ŚuS沊#YУhJ-xX浊avPL[l.ݹO2`M{2P jLdVl) ÿTUz}5x:ؚ6=]ė27vaLBfV.k^=@Q½sŅ[` Cl!|H-I! >$‡$B[` Cl!|H-I! >$‡$B[` Cl!|H-I! >$‡$B[` Cl!|H-yce苡nƺ/FdwdQ&Mkݔug<nƆ u{j# n@5 ׺U$ط=o} +k0[` Xd>Ϯy[>Atwxim+ѿkέ? (z;߄{lQoxӶ91u]a6Fξ3vZjR]->Nqك)CKۤ 8Iѹw?c7/Gs$:;hg+X N`e||ǟLL<ٰ<@4ʙOHX#5&ű} uue2_eWj+9Ŋl$mۜ.u3 ?{gBaNwh|twܵ<G:8@bo׼m3o'Ⱥ{ =Ɏ{煣P̕ C ZG|LO[QBx@|qrWsц#h'w};&:u [[ǟ'1ZB'kֳzV-=Qx D5)N/r X1񟶣";$‡$B[` Cl!|H-I! >$‡$B[` Cl!|H-I! >$‡$B[` Cl!|H-I꿶 FMB,23 !֟rZC;o?Z7Do҇~LJ]U7rIENDB`PKnNw63//-Pictures/100002010000010A0000005EA501A0A3.pngPNG  IHDR ^ۣZIDATxhuw-|4-8`(tO=?L>`[<6?ڴރXK$wO|3Sv, Ha¥<3 cIwd33|w3u-XBqb㝍Hu-7?kW[٧DZw:$!Dqt8w0!D7+t2!mGwM{*FB-MWL._З|7m{' ulq -#urm/Z]^#Ɓ9dr#<,M}, |nA Un _񻽽6FK99>&E`E{4LL!A68 tD{-fH6Gjt@oޝڻlBo?5 $!a{'_h<w솸D{bѫ6XCP H)i0+̓_dnAN9zhp )^\HNgcGjhw~]?Ǵ}|5Sgm\$\_I~ݞ:1|mFl q연O{%͐bC`5{6HAO V;Q"L{yӽfϗV䰖gm\ɽ@V t[(Tg_źP[M5>W<8BW?I5,ei1QGn >w)NPò=4@ w ޸c>E#Oi .|_5^F5]'>=1z`[x~VBqٍ8 > W>ny"0[>G_;x]7ܶ=_<+xZo2.~E#*52L64H[ Eaꬮzt_keuč&zfJcͺie*+wcY||S|M7J{ >ٴf9{|{4CW pS kg>Z)0]ÏLzþ^RFk}⯆WӣZέ G<(?y. o5Q=_J#ϻ1Eˀ{9`aGHBw*ցC4cbԩbnH4W*&3UK_dC 8I)X,SٯI̽ߵf2x0}^90w1 φF{3,R8_F^e~x ,0q)ػ%C+Ejdq8+>/3_# 1{0_}~=JnZ/Уs9?ڧ]Ar6zyucFM|j3MKtk;߬z"Qn>ꤻUB0w\b(M_8vvϪ%*f={)|2\i*|5Փ ELRX|;Ul/ca᫠KɆq=) !ܣ-_^?޳b82Mިm]qх$k}J tKogC-m럂źG#uţ`kug5M{b>yuvx+fk7JݺaCtkP]^ް&uwa%⨵?^GPܣ[8WZ6&L ?y\AUoaEy"wgfeߨX'`4d4Jߵ6٧m|<{|2IL濱K9ؽ쫓X*V^ᕍDsaەŢi| ?x *c9&eq*\2=geT7?Jzr*iwsx%wc83PItOמ^>^Y{-\76Be3S?Zj2wɪv8›8aڀYWA`%!pP bFdnӾѽ)ܥkspWþPfxGm 1KwjܮtU@@3UtOꎷWU 6Y^%߭w5 F?Q%nØFœhmRF*nmz-f;w`Wrb QWۮ6*Qݖj|j*sh!Vnc/jE+VK v6!aksPNk1驇cpFcZ\O~qJA`7ݦjx}5?ÏE^(OG]y T^_uu|7k4:1]v("rAU-Ǎ> #y I8Xt(|@Bk8JiCP8.|?p] ])N JG7R&tl-۶ʡTx_GJaMT^]](26 ~[U;2~O"pvlgBD)~uzK] !:Wb WB!BI " !D$)BHR(P!"IBDB!$BI " !D$)BHR(P!"IBDB!$BI " !D;qkEto![ώ"QwzWBltB^$&6OB}gΎ BDB!t sI\h諣>0hK E*bɪM^ou("!D3wBqtu(|_`5> ;1ihI%S}6״M;[h}ugap?Dz7vq691NU7~j̃,baqc|) `!\RBtRao|rW^b~ani s7':4  M}2Er &ޟ`a&/N A)» xHm,9L\q]'Nr[QNh8z(aVw _8ɺv0 F~9BbOb>aX_},0z5:Dn;Od%]CN^<2@r:Z(Ν9G srYvVOl{Mo,׵3Sd"ުtD 3ak <=7"!?Y;^f8>:3ab_w;$$~W((_E*'FTU[j=mk&L8^贮xhgǁpR⥋<;Ry(ʯsͱxmqHL3,Β'-o;39mL:]贎(64'QΜ>C|OϿ#U pCR)̽&IMm6y.=qFoTLé3(|bjy+9 iO>=NqzKm&>/ʛ„!̑Sy|^~%eC=P!"IBDB!W=2 BI1vPDWp]!Ou!,w"!ΐ9 !D$)BHR(P!"IBDB!$BI " !D$)BHR(P!"IBDB!$BI " !D$)BHR(P!"IBDne+BRqjR.Jq!خ[nanu:!DwrH IENDB`PKnNw6'n-Pictures/10000000000000D800000064B46B1BD4.pngPNG  IHDRdkJiPIDATxtUMZ)"$;P$h s-.)}Ҧu]Pi{6ic)낲!CW$fkt&mR 3כ;w~73ߝk 6i2M 5^AXE)ER&ct`(sq:Q%?+?qJ߯T|A1{k C~}6'veߠDZ \((C \e$Ze2ˇp<_oq|otd\˹S f@9<' x;ʈ+`dbwAɒFN㕏uFAGBaE5C䈽_ı8T@e26V\q^ΖNjdh:|϶_~+Y@MlN|,ŸUHe֥''nrp}Yׅne/ݫ[ #5vQ⒮mW&0UI@bQ®Fd&'JbI1y9/j۰@劄\bې &w= WHhnMжf戗ڢ8xϭ=j5'؋=e5f:< jF!kp;)frMFAO/VYGWeCs)yvel1 OHޚ<})(Ѓ 4/Izp%5oը_ 3?㖐 >QMVcF5..G7:ɡr2 D#qĸDӭfy@oCQ #Q QQ_9FD>l;~ ,WTp&N9ȹ(zPW3 )ͬ,nĭggY(Cb(<w"gj֖Xs]'12pW32ikg,oa4Dh"Fϣ$"DBB$I P>12dP),C;nC4QX{ Fy{{1[Z]Z 3aOikV\9g}w?)=-p2N9;QkN/B_)K}ם1#ޖ̬\6zpG0_w?=∈8\;b=&k:N}ÝM=L?VSSC(`M:\ mD?Z]^qhBGX`W2fYfÙ7^m֖m EzQ /k(kkgƵܧ+ynvu3Y7m}ynu R /b=_6XmȫCP ` ?D0wA\{Da:]9ã旃Σ'LĹ!a{OX oSOm@^q klr=徻~s5sr$4Y;|q7%/$$R6$20O5}E\ƵC@F.WFb;)h2͚o6Ҧ[yׇՓsN.-2rWGCmFtq fݧ\]~ fzo6O02+Vq{>w@#E.Oۜ-&|4fx 4eE fk8(i7ᢎBQ_"h;@A J5!y5yfnC3 hY "msW (fZڐzpv}K@Ͼ'ņ8wx]?W s_0HP?2Eix?sss}(M(PmxꨈytD8 ]3+%l-tz~y)?G,/GGaۘݻԆIHSǪ|^Km?Pv->͚EcTIzٞurDI%DDcdHz)%"J*QRIR%"J* ((T"PB%"J* ((T"PB%"J* ((T"PB%"J* /NZ”dݔWdydG9<:B"7~{LiG(>%$s0^_3g2#4 sytDD5<F躅aʲjy /y7$x ݂IIkƻ+-{+Vv5P~~nߞ}~uEP{YkZ`bt:Fmۡ=k ; IzfoCV}U p'Xl({Vumk316666='mw[5g3ZeswUn,,cׯhl(/ڶsu䕒4ܗ'9vGC7>;t) m jsnSf~rukSř/єl:r],1fC^~nn{?GmMwV~RЕ՗-ZkY,N8#Vs1Vο}\|%tWic&̥KfedN[;,-_ ,U~J0O7g服Xlᇿ9 *233sIfueuGLk͏ǜR7a\&GG-u677(g?,$mlv bu\|ihp ѣ ]KDS6R˅s:#Ȳ5K^zzAl'XBbB!g??B1jj~!^l;;-!DmpmMM܆d=GW <_{}nQnyeee)u#162G$kmCe "r3]ZVvD Bd]M3YvV0Q;QS`[xjr^Zmo0ZzN{:aӣTߪ&'Neeҋ5Kb0;ޡ_Y̢>O~pr?{Q_{1ϞǮ`%^&8wzz5(uRְ?Q Yg6ܧx=-C ׿:m_u|9=9b[X/>e[϶M6,v1N2WK*:S9Krr2rnɪ%%*Yur6}`'c;\\G;#$bֲu%Gᱮsԕ^ɂtA#`rB!GcCBHĴ4(.9C:iWMo7ZA{4G UP{PD6fz^h'E,jG>x^P+mX= ]#`0p}#dnËM؉hk{Lvˎ-tNAO, IiO%$M}$"6|԰8is99{y9b4.}bi¬D==DT %"c_cxhHg> D98a{͋o!C2̝g?G9?ͽU}+5hXb{БRx}Kts|z+`kƈcϞ9^s=c"_(qV"-6_87dG ˺Fa|\-e_cQU+ݛ 7`m)S<'=[f'g 箜o66wC3,BǺ1qd:g]z*~D{˗y1#2 ]` Y)Z.<=um0( |߯z!cȡ`'bn=ExvVCum4'JڭXb}O>^#G:$jjζegd[2-`Snn}$q=MZ1x1SN65gg4R&ՄQ狰!!xz|A!2L2u/{zP~vͳd}Uish }hF{+MG|j`"fHpo3f={-Hr|'^Ţpð$2n|U6I> L&7󥇶$<Cw4㿌q u@\ skkbX/ID?_hI {fZ}&"3ra!#s1A&PNP>2Ңs0<tA>ۇ9ڶs[r,ηYTHU[UrkCE@P"NԐ^)z}ӷWngf2^o۵[l58r'rPp>(i ,WKs3֖V|]О^mIMq:s»@H{?Si>ߏgɒbcQş+*^ XH3)(`9Z[6łp?OPwTfᩎSNDDEmu-^uMe ctJzChKz(( JDT*QRQDDIE%JDT*QRQDDIE%JDT*QRQDDIE%JDT*QRQDDIE!ORIJDT4ODq͍ubSRIQ~-m6F>:_1fIENDB`PKnNw6ȼ55-Pictures/100002010000017400000113FB861806.pngPNG  IHDRt& IDATxh/,rrxmip*kXNz4RcZ-SY)9nȩ}M"[WĕrhuʷZzbi|1 ͒B??k_`,<33/OADD>#. nĥS0gl$""Z 3B|f +IkCDD vvV|H2$i[*#C ;#T f&`Gs ~lq& ޽v-eG1~I(U__>Omq[Aךqcx>6 Ѳsm@Xqmb]!,Y4:1cH<, "ny&hvBfAPn:շwL\*vv;TK'7ɷt@ZH;6;c8"u\yU'`!2k#؝ XRۘߊ"SOIhH t 8}N ng[8vP,sXgx=ιw,t|E._NnΩG혞.Y|pHm`湯Qj2ulŒNB/1 ;N=䭯aoI0?2r@@I '$ AG,7ݖBYp\r_cç"*i,ϒhxbડ.T}Qඊ짧B$S8xkۣݽ{:c`'-<C7Q|n1zZDl.cu℄GoN>g,4%uH0?·,5ZO_@-sFqsq m( _i&s60= ?Ø^G7#A&S>WouKHQ 7~#S@kίܨC 4FkǜLLEalLM>(3!y&nKR'*BA]ӖAv ?0tP_n@rCJ02?ﬣx_]ޓ`$1L˃sتAT򠁱/Wb| .zg^`{M8U : W-H^=c)޷cھk97y[;~dq#C (hqV:.jZh}~#C&42eے7QXad}Xs &bbwh (w L2|Y\9wȶXUTvKfPJ"-̜=&(rq3x59XxW>I&{jK~= XfseBxlgHBhNXѬb,ðR(?o;8Pv4 2' @2dB'PI; 4e_Qzߤ_Jjc}ٷso!C {$3kk^`NpnDZ0 0?6 O  !9 ]AHRF&!6oܱөe9 ]κ6Rjm@m[;ZpuN=l;hۡ2BI S_ FZHv>*cߖq4fOV{z2/giG#6l.",cd!X~ hޯ j&""VwcvEq'/^qHjhXxs HbGvm[z84p1[.OhmT2hG}[Fmhx ;j1q}9 ~ ~`/d*'{f5t,| n].T+[͸9}O蔭K_"HbJd;ug#<ȭ= 5@-=9 ̤ $7o^hx;|}" vvLwCx~H^1~32e w000 :$ş({:0`'m9Pidc+S-(6Re; !tܣܷBAmrSȐb ;+J,ˆ!v4Ai؉HY{&!m2Kk̿-rXi4 n,Kh[ɣ870 j9/YсR+{*k_sgmo,y>w̨3 .+=l18Ɉ@T:O .hDxf Hڰm$\'k}9[q/%'d*umՙ]?9hXRvY[<@,-_^xᑲۊVHNʨOR_Vr ))ygcOD\f6)4€G@( R^fֿ\2I&,;K'nLCT{}vT#A@ 5. "\ +"+XV{}yTu@RkB]Dyl>o܀nGmcDDtAgt;+r/fpx4+6t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"r t""`@'"rIAVN>MDM uκ`{SDDUm`>bzo*e}DD.ND DD.lٲe@DU%6u@vj%X{} "r #?zm j浩3t""J>4 I-wS4 $!`7Tv(8?C$};Q4}N#Ͱ>Rlقh4qSY4|v^z{p( Z 3nh~h}-_oeYrɞ!r3Gî AٝXN*' 5o1 },a wm`юAS=Wif|i/ ,rûYɬ߃{7xqWVN*L'C Y'7>܈S/~={l_\!Fxzd-k_v:۶m[2|IZB9l+8ҥHG 79wőaKu;5l3a@_g DT))JD DD.ND DD.ND DD.ND DD.ND DD.b1b"6>˥"7#o gr}#JZkJ"܌@W4f€^!~(;0}sڙq^gP&*N؈Ƣ+h^jej!Op&l1c_JR+iAq gѤ3epNXMR3ضs2 sBfkYXw̮BTJ<Gt6 ^"+3a"Ct+b@2w:NGfjzv)Y6 蕖̸ +^2f (^_KeB D4X[܌@Su rYȀ,3"n@*P YgJt2RJXQ0y{g!ߊvTc0+&r+Ye3m;j|x<գIghqNEm;wf,Q;HWIGT.BATUUq=~HB{U Y@ĝʌhx@sbh4~ aiWl穓(3N"g烰؝CYe%蒀*th, ]/ZHHaT)JZȢ: ({=NwVV=Ț@/h[yAν(8NΨE_ mrUw,8 2lۆptމ²,LLLi:?,/.3x4dmÌ΍Mn\xDvLg0 Jh,zX N?Z#AדzzX)p#g.Rw)5 FҀVQ.ٱ 顂vF<Z+-ޜn<])ƬEV )p/=%'P. ""M{N&RhȲ FK/~u7 J%CJcƀ4եVb8}. (>B'Pl.'ܦX2Cjnfr $kTr]Ypo0=|GnD%%_q}ea mv|P0Wo\c@V\Wzʿ6wpҊ_rx+r^?㨽jŀ^I@߭H;Ʈ]a&~;*~iw@aA,C{[;v}n.up|P{-^ڐ]$ZKչ= Qd%'GnFpGpW +(w>Ӊg:م3?95MZbD(6l^vPϗ,z7RJX; RvnZbq)==vl ;ᜨZfnp0++ClOhJHo|Jԉj2>ôȽ{^w״^YS]Wҿ/"8Q _ŷ.屖_Հ}v xŷ.6}>ݲqEuN?}><'nMJAtuwaҘ'l3=rvc~ׇTG6\*؍(p8ґupn_DUN52^B׳]+S/d'7]vaAt>}jƇFߜ& l۶m}'l vH|攻y=[rWF+:c&Ja:K0:K0:K0:K0:K0&I=>˥283!$+i,cTmE3ǀ^!~(;`&L3δqj]yBWbqfR܉V҂U v o=1kN8j3b1 \ ^%M}XI 8Sqh5oMC*p9 !7Ę1ST =~H%͏7E7Bfnlۆk,FA<R-{eY0fyo$R7LߟLfQ 5]rY+\!jQ@<[l @UGU.S^D N0f h5quN4}2 I;k䕊۶!yJKD^![q蚪A4N߶^#!rc괜bƌ#i@sF+ϡD€^Y#O2-ܨx`osʤֿW,jt=U< zXVlJZoTf_\e{p"K0:K0:K0-.1F7\~ \\%Љ\%Љ\.7Y6Q6 |m|8~[FYeG풫|Vuf6ZoE6ߝ xrWPUcUeD3_>χ֖TBde6SÀΌ[섍oBxW+h|8LX wb塼u+M/Cױ.@b1cv[ u0ҌG*l۷qû81\PFR"<\-a@_gn,o<_#>{> ߏ9 {')VV?Pyt? 8YѱQmt(֑ #h;܆mUm~ξzG: 2W`ξz`R{-}о0Lbo$} !pW <߃k?> cƹL _ Ø1?tè1X?M!bp`BΩ?Mafvm_o[#oq Z0섍myKVqm -\*@߭7 ;lF@@VEQhuڪ͑ #hy+;pyt{9g:ݔB,{{ ~=qMp`aN"tWd'9+RIN5&+LSnt}4 jN]X0ɶm\tH: nRj m/;5reoF*9X }'“fLrΌC/9w^;i|JIf2rX+j8},EJ(<`q_1rݞƇ1|ax QY{^w״^Y*TU!y _I&P{/"7"܈i{:SdaånHe#gL'C YFztl_Dӝk$'SsU=IDDiR)W( =ћrj.""`@'"r t""`@'"r t""`@'"r [\O5~t5ĀD".""`@'"r t""`@'"r t""`@U]9rVp5X_XzkؗrfJ*aOc^BkKk9/g+jfRt;qnBC'bgIpܫ*۸sj3M?/@ ɬiNiӅt>P! ; }~:K{mS055} rϙƮ]a&~;_KX|v:9/b۶m݄7q?^4 H}8W4Nc󘘘VZoya33~&Zξzbtlv{Yt.x+b<[!=,kZ 1(zz{$D;:ޜKPb?^6 )wF(:FAB!ϣD/uJM& 1Xy&7ȱg~nj BCqmFFH"5yjƌ~\7#}w.i 7ԟE180!βSvjʯ :t`Ҩ̶m'p4~͏5-gWۆRǽmS݋N}dٙ`{VA;t@Qf_zn*_N;2myѪ-0WI';?Ǚgp{'`2O-8oga1`6Hk2,YYLhԹsVetaDќz}r}mX~.yF>ڝo;Bq3`Ι1fuȴn&m6|' UNt>Ӊx<.nZbk-Fq@#%3f h;"k]iZ2cրβeX,5M+{Wچmkw))\軝c`Q~X{VvTH! @ÍPj :[F1J(>Ĭp;^r%_|"/f 4U铧6&۸+R7øEnG~dr9w96mkw)v†"ue0 ܚYQRXz Vr^I5szCsԲTE.3·+8S˿{P{-ۏ;9ރg0 :)m@qcp`-Բ/mc6 \oua'kd 4Ƈ`>(م {eVX-D_c!D̅gZ3&2k˯īQ4RG4 i~5 tMnB~GD./xϛ Sxw$z9H:;--zeafھ^lN}:/DF!-6}xLsLR`[к׃OKQKN(Q^! U[sonDsd,#3z{߻Nƈ\(s+5}ݢ[xYu:6 vsјRſ3ߎuegiQfC˷SÞfl vBal2?_完kBT#Ϲy7u~r6CXؘP] #97nҷ**`N~ՉsE/*]*GH]W!W]c0un gMkhա*b ]*gjq={kL_cYٙ4M0 2 @>BW!rQ%}K.#77Tk)ނ{߳[\f{k χJ-"xm&sjc 6ZJccu)L~u8 @%Dzum>`}8Kh`b6#]Oh0^ŵ:Nɯ,N&2PZOcv{/5T04y  v)M:MxqmsX1,{m%i_=ڃs(@'bOlJIP˞$n ѶO̙՛Cdvy}L `/1U9)윹P.?(n?[4J}^Ҍ_f9E{] GLͷɪOuInAnشnbߌ;~aU>ƞIͷ^]kZ=߫x{d 5H\U@?x5 bG~'q+ũ/|xET;>6,!_4J[xƎKz)Zs~9/z}i GvU͇ek(9 RI[υڭ׽xm*jV&!6[s1.nܽcZN'R0_TE̕צ!gcۀ}e w7/^^h<>=fj~іX~kCfWjj]RBM7KԵrMbLKAQz_mPr%)!6l VDUV^us-=*4-g!Ľ)W(JoPUV-t\qoڷd{K,Pش7Bd 0@mO- !D1Q"B$@! P!pHT!B$@! P!pHT!B$@¡ _L$q5K?/.&7 \x& !岑P΅gxإF%|,/* Q~e:'v)FHW_]`G%Lsou ȕ5qc=?N2^x!pHT!BJ;]9@=-ATIix]VDywԗ)tMσ2zz3!u5E ڤw095IV&^Mx}[O d28A+}w$CI)E}<Ɖ~N z8I|~8ձ4NKDGͫW,FWxNO1~oI߫TVCtwFjcGH3]Zl{PZZzQZj4?`0ٱmǃ1ǁ@3cA@FƠwю5c~aAǟ?VI6A%@û .NZ =ݰ6[-Z?H>4Fӝ4552Ϯ> {tzoލ殼ߗ ԕ$MS+A; o%_{z?qG$DtO~JlcWC$msJ3 b8 s ?͏ߓzcw ˮ0odnd|aR r5JvBOf*m6/{3RVr{Ʀ.A#ڞj#r.KXZ#\7{tEu)h#EGxtq!RWo}^j\}K]Ggav=Z듮zg?oTԔ[`X9PTAwzI9 .( :j]]s1|x 3$`[=Ac(p%>QU>qcT&fzO"E4z0232i܍eU{Qfg-v4'~O,'Ӵi~p r/'ՠTUz_֌5c$J_oEaWRDEh+2{G4F`eΘ(^׮][u+l+PagM(P}b6ca2fl&/L9{ֿ܌C66:Dsk;Bznpq6@Osn:[Zy"Dx^47ywGΞ瞧祾Mѩ {G›VFl>p36MMMνn km鯕5/<)zvag{ίڙY|HGe뗬ۏQ#k??Aѱn^THT?*VSJ٘0"TN$!&BЖXBHl92BJ65oeg{Pl~;LeJǂDU)pb>A2 "J'CyZ&QY?*O !sBB8T:u2/P@Ga]:uh53~vUմu:t]=pU '"@=< 1@rRu,Bט_? Jl'70gQFCT]1ځY\a=_-\a=0o\jWeq=>n7"<*Ft }-/w)5>Fv<@0:Xtvtlߑg9K$t~st% $@khvzo+7AEulOQÚ O۶l+wAbHUӮ,˒>֡3kљrVg)/{ubN򛾉Wz۷owoO}vzz{]VUHDF)xo ̋cgn?^~ߖHU*6O2xreT%ݻw]>X_U1BJ$*I !CBB8$*maL&]ZcAG8H4779d8HzL_Nc7ǵkh?x,P:mJ.{oO: /ǿO"}:_OUueg=}04zlށ%>r\*Z纹qA69P˲yvKZ}: ln4I}"}5hFGa>Aڴ~`mO0^՜vxP_A {+ @Bd2m<ߞ~~!'6z.\*J2~nr7)""e+;b7oKV ]pjj̍ ;dmc6.Q71ȽDu](=z(_5ϓ$?Ono?ɸH²,Ό_r1""=%ן,0ÿƺma4yk.K8)#cA^RU`R Fs&9ykcw ۶?|D(C<B6N{5ڔ =rtZڷ1ڠ *6}o>Hծ7RI !CBB8$*I !Cwnٿ]٦IRMZeK~$ؒr$~oEQC 9^pvDGx<[̜#aTU$/l9į @+N*wi FO>.w6FObYL^seĿ:DIt mj'پ};MSo$.%<9Xj6N0yaM8q:{"UЭ>L^M2EݨKN^Xl?@l:iĦcd -,@hb̭ mu1;( #o0 |.f/1o/]=n+==J-JAe"2PFߥ39aر(OΜUjSTFOεCO'd/o<9(s[D͎@b$@! P!pHT!B$@! P!pHT!Ёzޙ(I1Bqx sjC@qBT@>aNmTNBj$sBB8$*I !CBB8$*I !CBB8Tx*ݟe*E!*Rx+:BԊn5b=޽[B~CoIENDB`PKnNw6v@pp-Pictures/10000201000000E4000000625BEC7CBB.pngPNG  IHDRb@H7IDATxhg?9x_ASbBdB[*7]"gV4B8lZ$]q׸-&BIN^܃޹pvat`*CŽ0/ dKd+(~>Ҽ3Lf6ݽ{+6!Bq3CB1h}= f6m >y7ܭvI6.0GH:# HS4 8Vo@mr ab۳D:#3.Б\~wrt3U-l<NȋvZؠ~,*0B*lU2E|Mrw0 2GIӏn>, ½Bn{ˎfz43ĢjRn {[ьY&?ܢ3耬N\y"lLB+Ƿ,LPL8)dH>elBhaU}ozdoׁKN+ͤ 53sUThq<27~Z{=Mn{,5 1&rGUNr8Ư fnzN3q^::c(zs];4֏"~Rm"/bI<}v[ Ec$J뷗1`o]F޵{+R{ 9V. M_ @psFu;eaGC[/k xas4tcyMXK)zUco??,ꜻ/4V\oz:T;-8ĵc]º~UܗYFuD,?O`CtKl~m Ө\h"Z5u{ӛȻs}-P-mA3(5!06ھ1PhLyJ$N2Ʋw. S1H4_Ըw sãs (}{WOnxңV?U綡*U^G)ŧh .ތ_Lmi^if mXrI魼ˉ cNUů峬-I>ױBׯs:]Vf.eA.q_`s{Gdb߮+ 0:0~avd,gHtmW.鬃갡1o:ͲV2 LVء a3Qh[}vȻ㤾)?ǩ(Yvnm[3yl$, sEE_2[@ Ei S\ރ6G蠋ъ~n :do+znJ&S:Qw2Xm,dK30u*RuOm$JԷT.HǞ93F?t Np-yXXB֑*C,آiZqweۜPZנ7Pw-&~Ķv;1Kb f;}tn=\lQr?5Jgn Ihf^8!Gxd[em?Wy witH(1g1!Nlz WIWco|&JnrxuN[:C;WQs~D"8Fl^4) {f. 02Km[B ZuvP,>`rSTJJWW4(YLawƜek.э3˾r vH1v"֐*Lxw=zDž5,;e9r wCQI9?!|61v+_qz&}KOURw۶tKͫqEI]Aѷ]*ʪUDʌؑ##=K2л-\DkK{ ܛ#/nP/. gd1EwaPuͥf yT8/<.9FfrAڲ!:nnxnx7 &)?ͮO@g y814|?VjT;К;tTýW&U=Lq27DVO't8CY.h-宬(:)ms;c}?39T.O\4*E5zGnTNzle-dC f_lW[Q 2俬6E55)w#K_o]$3WfO-[ \D-{>O' Eח\)kW+l;vWQ ʵ{/J?I]fZ~e3}3Ƨ]||T2}0ri@䘻]D{{Mk&ue϶;I]Jq썓P4fpWG]}ԥQV-rp|Iײ%dH17p!zhK&vZvُ駿O̿W^퐟,_DRj+!1/C6;glYphYA|zJ)2tvt䝲N>Gbz˯?YpWGϼyyy<@H$뎝i/Ξ=#D"ɣE{vbI~3yk]H$9l+NzvoA:D"D^n]O?$8 Ѭ7R Zr*7LjnJuͤ=Ig1SCD68i,̕$ -*ev~ҮFϮI=zK)R\.iXq.*ЂTتwr8; zG50!T>)f}ͶDrPޢ-(h1!~9NZhDC-7oclL10ѕ;3k1ǷwhMP {!tz/$,ܬKUaOp/Aϖ$ia׵'Z:}-u k] -$ nı-VW)W&!tP8qnpiFx č \8Tc۩s/-}]JyV%[<ӦKz.9gf g.nH9`J1o:įu+U?v :YlKRA0~a:uJ6;Uu|ej[}s/ ν$W" Ւ(hֱIYY[,bs=hV65d=Qnc) ,;Sp@6;i38 uq * 1  q!A{'LLV|B'ߵ׭SwnBQ8=ߏ+6nS vƼUGQ^@_q2~4Je;PBQ; ~ѷ0S.&=Ж<%j'[c1pHsYq_U*UYB`gT:# JHA ՞Zn肎--бY&Ƚ4 LE,aiл̈́삽H ̛ 73þ'l7)3ͩ7+ag.Iiw5x)΅InQ{lNqŭRZʶD e櫓18M׋/'V f7g_{/[Ty{edOcd'qTc2h^X|Ud(kw꺂c'a4Gp\?L2Y_XEq6S4_E Y TüAn@ߠ3^mO?BHAvL)tn]lr/0v; N*NZ% B+(b%Y\ #־2BuSSXe>! wntDYWEQn]׼0m~+QE< %tB*P8[t5AtoǹnN#_3G6y?sAɧ7~j([RrSj!Bj_F$)gWױ玊EZ@.{qp7Cў Bż7JZ9V9 ^TeC$!ySAkfaey?(.=[ r~܏\y|UCp06 Fm'U鉖mj.[EB o2 swc[o 'sGB%;-ԉp{u{庵/,$pv%f [;bbb$?Fw%qu .١,Wm7^|-#h \xbqPOӹM#3^|mxBi-bS/ȓmvwji\xٖyԻMl2`2bUɚŝ]oWq3s )(ZBQjnž^mS8q\mNB5:Ptt{8s] (tN8E6I0P36QTnPE_}n[0]4+\nS>Qr W,P⃟DeA%}G T" 0RIHD`@%#*)P$HJ$F T" 0+,&>+J$tD7/%zBęH$VDif%"]@s{I.+2LT" 0RIHD`@%#phjjºWۏijj߱Ycfu=_O<_2 u05=V5 $#wE-FKkͶm^5/D"AuZz=@4j ^ּ;rd/-0|+i];l-I#4551uݏFhbcUm&#ZBz{j>bv8}=HSSҌ4I&TR>vjMt4M3{!Z>H#ٻ/_֊~y,ޟ=Ҏq^lՈM0e^.-'N낺Eݻwk*=kkk;^tG|yw~xm؋Ǽ熼莨;1OݠzHwKK8ono{=#S?^xoOwڼҫTK U}S3cglx/e/5ށo(KcE;/x@ͱ(l}_˗-juiq2t[ԥ^ik;\7=_vg?Gb <=P3cg׻ݿ'O,C! 4з*a>ڼҿ=y׶ρ'b4n/X 黿]ZVJΧy5g3E&OCtlP׭:R>$}M՘eh;w_6o:% },*xN.ltukjUw%ɺ"{lWx~4tWzh*]~/->y-ɩNJYL^+'HJ-C!B61{c' fwee)K[zS_{]u{cѻUU1:K*ե)I\N[oӿpeGqgggI\N?p8 Y(GJY <=ohkk#q9+?}sDgGzI|`q;8OC+}&8rglj<!9)ژiҷoűYǕf\q|xt MӸ mnk]X_E]Ju(^œN6)]K>lݻh,sG׬+j ~傢S̕>@[[ۚSl@~4m{}lݑ^ah"y=$ADIpNJ)OL0'qR Y}º4hQFAFG sl4c=mt.H<ndR'6Ix&{qӘo#\7 ;q {4G,i@GFU@ًG9ӀhrNz 6$`Y?Z'$ 2L?5;3mm1Uhq[6PwDH}  6OT(h ʑޠ#4.qIv,* `#6 Fb'@C]3A%}օ켤틭G "4Ζ+V@nvBl` + (:(xJ1ْ)Р4HBO$ . cr{YyT@HqP#p)6pWU `/=:d6!T"~wݧ`΄((r뽄/g^E\U%h1q/ ޝ]Q9C(#Uu1HdT^BѴF@ 4v _y)x#ѭy1g#!'*4"E\LC֭:X)Pg!( n['_* ߆]Fz u=BkJ.p$xH6n*F@3Gҥi4ĬlE m̘?ɠ.Z,|lAFlwRJa6 G7 J f:f (XI0Ò{c N&fКp e" h pȀt}{>?uvwhTPp|DE^6{g~wJF ?w :[ 0~p ں'r4m[qȂtVE* qĖyDh ;bڈ?ؒE 6w!V=>XgO½eN R 5صw #_m4dW" 0RIHD`@%#*)P$HJ$F T" 0RIHD`@%#*)P$HJ$F T" 0RIY+O:t_*H$&­Z^#eEnV/rHhY.+~iXtb'$Ie5D`@%#*)P$HJ$F T" 0RIHD`@%S ,X&WWFpC߿xrZ S!#####G/LγZF& a! ӃNesz  ͇ kRs]N$33Zݴ:R80c1c# x%%Va08hh^ B1fsnvc1c# ")ra2^U^KNR#PJa0}y)r囼X߿ J8d *5kudOAKa>cleXNgsqE mj>5LӑKͫ[J>Dm;U_Í:%XV7od8(݉Uq-dc,x,+k,Cۇ԰X5؞|YG|r5=OK#a'W׾i錒S4\K\I>ؙ7k ܅ޤ$BY7_e^yS Z rɴVRybT[p)ZN2r/`YV7؎vv\aq`/4X:w!\`Tv&dBf2Ӓ~<).Fjܾ?GX`Uán@wLC 9 0X 8[WQhʡ1Lx0JIs,,!󝰝f/^&6iuvQ ;%m=e )HD($Ѷ BQI ϧ.cYWaC&ƶ[̞S`0 2gaX6ڜlM"Z"cV nLc>՗38 ofؤ 7]֚OT jɩ3(5O踡kq*ȐLف.c/2k~}p>+œ aApYaoǫXE_ygVý@ jK9-pԗuw+5MjXBAcg}pbm6Z_﨩~A}d$%S$ vpе踌s3-k"OWFrڔ?ؖp>mI4dnm \,z-j3? E c,xp5|5e,sߜ}+aKMMӜFI?O&lUBul~#  Kzw-$r\0xxP5%y!} ?L$Ƥ S"S}s\0x@oYG1V<<2}12G@  ;<(4(/e@6#pT23ǎԐ3O{9бۄRR*%{nS9gj~נNMadddIUÇdt-<H3ohL 1W˸EgO_Ejvܱt岭8np47oj9ڢP*VYiyB ka xDsp϶5ڌI4-g,U8Ww53twl?ZxPZIHbUb߸^p8)q7|sDհ\DZet?{@|<+z3jX 7.4!iէCO=D \wnyDjSfeĬIRӼӂ=ᾄ`L:ܥt|QUsp6r􆑑d&XQW" eRݤSNoRш-='?uh_@bOcq<+9b#@\ψv!z} >@M| 7|0{vi#E p1ho8BխӻK7n'q.sq󖾥.2bzRKrkfaQ#~IwV/ # ^/@ **SsZM5Eo8DOth61@b@7i>Y0j0>}:$޿_ F+z;K@ ӎ޶Dُwr6+pȑgmywS2ї$88o7hS{?+hzŵ[ Os@ &Q 7LzzmsIZ56|iE5llxPsI̍LL碧LvCzvti^T [w M M ####G)^ ;.8jkQcŞ.۳sO=B%Q^{˩t)z} ted5RoJ3<~08\&# UNJ#T0e|OI U"c1c,vհ-+AdqiUE7_kW nġ>O;W+amV\:3yf ɧAPw^I 'mY`W U c۪$MP ʵ_* NbH96{ PáO׼YQ;jX8["}Ԑ]1N'5GC+fjv~Av"XjAk?nNCXdl݈qUDG!###GQs#ydTc _0222U+5|zm0A?G7|397z%qc5ivz]gac/E|&jPO7 ~d/Q{=<dt[6n1Q;\ڎ ^DHb&ȮׄyD'|{=~ cEL\õwr ̧Ѫ)CdhdraǩK1z#ernDE/)ߩīuƪ? rj:,-?ܓI,j3<=fkRiws,yO̭jI|V"Obh{%t^,Ͽ*[/ U3wvTz>hɵCA*q7j\-},iN7LƋFFox ?jQ հI.jmf[ߠ~Hׁ45̵wYboO|\ߚbkyn  Pl)]LCbQp>??B_ rX'Y_`CKB{9<9O?|{u˗-gvb3߷ȒfDy}SLNG7ԮB<P}@S[[]Y\a^AoZf r}ZHF2kfg-EF4wM73y1z#dhc!ὶqSPB[&ޒlq:b{ױӖU^V߅gA1gʹ1W4s4xT@O(1N^|O?Y;_l/ߢϟz~P Y<ް;F4zã#}ԢP0G=v̈Vl<{pSc[WsTYjv~%g/P#\H) ^~EFhg &>v(G&1^~TJ¾EF4 #}1ZFox ?jQo& >bTHQm̵mp?f߇Pà@ZAӃAGAx^Uw֚u~k[yA֥UN԰:]pw4|7579XOyZxNN>R_\F)gdd15q0 2 ?jQ\#>)MXOT76\a1&g'2_Ap} bLpP?>e媛T)R.[cwsrUVoWT7oa .mV#ƜEO7L>c.҂u(hGEkʿԠ}wGlsYi>Tϝ<;WsZY7]`2,n:6BFF&&w1Nu.7ySNisQ$[GO'K2N&de6ngx(Ԇ Xq|`4L-hWTcc;ް;Fc w7nYI Gq kӺuTpq5ddd`rBa5\~xat VRSRbYii|L[Mn.%mo߸ecUzy{~GghZ4+ 1[DQ$O7,c1c,혨 {]jJu<ް<):6D ]rW/6XP[j%12Ƙe${PSsS3~ [9L.cYzm?ZVWl,uo8G 9*O7V]^37 Wlm0sf}] D pr _&޹۴D@fjoCo%c K[˙gOYLY^absoX"c1X1S e<0ٗclvnvU\\Dji= =MъKA LHf:E{E5|N=#+wo8G 9* 2Meoff= $qdhMZ&Ľ֨43B )WTPsʣM6C3Ib~Ŷg"ap0c%[}H?C?jcH&>U?E{bwTlPp:VY hwa*0'kNxW$rZwa9$k |ֺ_ 6Ptx;A a W#~###K]<7|z 7L<`8rT)WpӒaHȒeuτ0sDDcL#*9-{n<022dgXT0R{]v=X2us𥓔9hadddG=w-\7|џ{&Eyx~6ן甯$dCYvwZķ&޽cabyJa>Qyü>࣎}ʴ!_.OkGL %)kJLDt1֦qꢴ$$ͫ-{иaNӧ5~x$dƦF팂s9~*NrSz-+ci̶|.g68Kby"##_%)y85Ƃ7<34Sعƪ#u.* tt2yݚXEwcbrHo쩄{׋4^W%5)igpr05Dr` ʵȘDTAV%9$ I%^廴[;]z"-ҸdXaRr^fkTl)XVZnd\i)bm幤M-lJ9O>y/us{-V4yyj{N.Ҏ?u#09V֘e4iZib-VŐfP}%^;gkgYh^XVt5zaYgͫھSݤUYΦCǚxuRiws,y̭jI|V6uIs^%^_bn *WyθsQ =ͳ 65L`K9s$edd raIwoKyq eDx(n8ӕs0)uU9T U7RZ}zy'7j[=v $ #jGvY}n:iϫ>AtmIiO{zޒ<7v@?j] zQYP'e6rĹ{-Uc ]cncN4Х*wUb5Z:ZWJ{@xSI R !'m=@Z:jR4- dKמzj;9 J66vY]Ń^TX} -/SKX*r - fάO3{{D /8*'w6-3?-{0ЦTUjoͤIO/edÜ}u5i^U1+ֶv icZf AM%|]>:Ϛ+vm}\Rq32Z^ S<"@:+v69-%dF.WS 5d]1Vq`>[ ) nȂ)ԓY Ibָ~p2FZFF"0ްȨQ g]-u>񿭰ǟ|f]bVǓ;*xHsBu0$At?yu?: 7ЃBVMN3\j/rgPs(kxxccs;贬tm <$@;O\hSRP D*jMZõycae%yO]7=qް;F{`ӷwmJn%i>A+~ `\qKJ^8M*-q'rDz>l-< Ю~诐!Z<0ȧSIAezC a6 pam~ ܘ{Âw)C&}*ED1;ϙ)BT A1hnӄENsG`C19?9?ԁw[_Y.`KYO,mlT .Z_?kH%wA;ZK6+y4LN/! W?*1<0gӣ];p]rWJ5OR,?Xt/kY3QްNЮa#u;>` Z1ʾ>Ifc}k_ ]! :OROyZxq#eܬُ-u,v&hY ~jOQ0@@]DCj~jBx'[-ՕfNA^+a-@~ad:NB0Vg5O#9pA\Ed<*S|Rǖ|wɺ֑^oZ j8 2ʙ#k rz}?_:K~c;߼VoxvKv :LO~+ZZ>GUt<\ŵjbOjWT76)M]ko[.\^"C/#ӧ7/ϼifʢl]Q xyZjX]n$5:-Q 52DVN7L)N}vD 䎀WUpt=P_xϭ LYwke z pFijutjm,J-nhmXw28fgM:$`ӶkPtmF q6RwӡK sg>'5χRRgr>vFe;tfsG# =8wj׷sĘ5kqC-55iM\O \ ohcze`?o j=C:yCuEOOklpt3ѯ?ʴw¾7́3ƥVj˩*Om#MT$K?7jmz1g>22M/Q2P%obPqݱKp@]*HX? Рa91K6&jxa wo_!_, GFFF,; R51i}]791K5&v}R+.o1-5X#Go7sY8'Fscf91K6xz"a}~[+'o-9*b7^+6 ~ް91cIտ6e] :Nx#]la8ojh=󑑑'I@9Sԑ!!0C,T:L粞1A p #O* hPDFFFGcNfR0y_C 2EAL.:apď22uèW N픒NŭN_;16@5|<7T 5W)i4^/8Y&-w;`\:aN37h-/o\022D0*07L5B-@ ,Z^a`N "ᗃ9s9p1\/νN/]c0UYrO qg8D-{t< y! wbx -ڇҔdss.UW yO;O+mV\ JNZVE5L͜a^N?W,{Ys`X.,9*o#O!O}o`.I^>osk-֔~ -n0Vך6*ED1{ &!/ S:#zJ=<4Gd&c)#;c]7#,e&V^mQ=) 4IA7l|ޭo(5̃< Mϑ^QS ̯w-ˠXUMSm/n.2={ 攁^;Üfvcg50@:hKJ[l-6##~D1jX~Z|B .FoyxFo1@oaq@oyY?C[+R` Sď22a5tjg@ 􆑑# #17Ύ Fha}5 #HϪ{Rȧ7=F"l6I&Foro)XjK #Xt@цm􆑑K \ c6/RV ####G>\}" HY zc ϼmnc5s{q )aa]TEAwTX[Lk-V} 7<@RV ####G bxBtek**ZE!e5 #33?gLg@L0`oXŽ|Bva[TUvJgmin/YƼuqno'kun{[ iHk9bXd [EqF?p]ASˬY[ˏ::b}s-zQ{6~Ь:"e5 #G' 5`%ǒtcR熌<<o8).ȲeYb[G> 4/Y* mVG} ɸکBR@U+G V)f_*r;p]AS៵t_X4b=LIUIފ<S/_/$`KY FD! -yz $B) y9wk ˞XC; I 2{\U2]7z{U6)T>nXϓ(%zOneWr+RV #G) TA?Iy-$17dqAiɾ,%5ڷj銗j7:? oK':.l{*/5lOtviHY zÈpUrs7µ q;GZad{*4 YR!2x1Hհ.aD)Ö{#,RV ####G HY zUGZadddbGZuQ #DaFo9)a@oה;2l}n|6 )a@o9:y]Z?vxcA[>IN+L|3=CػײXսoG 5Hհ.aDTc| ϢlioqHx$0qB- Eײy; HY 7YYZ毡.LG~R>~JEk_Xg\FtX3qS㻍-׬XC-Ŗ=}Zg&)e/ %M^QqʊJ仓g[_ڭO[{ \kϾmTt%dK2} 6K M [gUrZluuz?~UTU|`͎&ךUE֢²;75[tV{{+}2luzh +wU_/~=Gq%uZԑ=lns}sncYU` ]107Nx@ZGŮsHF$.U8r \h~\k522 ]=ռ}d(Y33$k+\G1b<5Ef?@١2d8Ͻ31?3;ݽ ymo'{OܚRX7rm!m[[{9/isuI݌ b.Qŏ-}3mu۽j/ɜ>y|Nf,kO ~㜬w WeٟeueKV,o ΰ#\u^^5Y¦TڔajF1b HY zɤ,YDqb̒p:Qi)Z-&Mv_OԔDk4W#אn-?8Bq0\bH%^l uvay Bo\:+k' lQ,ĞW`Hiwd)(CQysGrlLͬxbE von !FRkiNSi ;u!$Siy<0Uq"tzW3b$ HY 7"fZԦR8G֬ZC>ZfћE"y6Gv!yqmC{ܢ!Z~.j >Iyry/YB"|5|ܦ ,=z쀎*F01{XЧY ^=Ƥof {gg'~"!lo=cҾW;NjN|y7w432yuZwԯ9YgSTGڻ J1 W\WG&^JP't~9v.Lo#Fq xffO'yᗆ]]l* 0{JU"'!bZlXmMʟVۿ/t}aAa@zK9^A}_ӿVZ1jET}@TA0q0L2PKAB@7 6l6fu~QGGolQ$r^ײƐKMPN ss7Icu\zҘst9uj|z:\t:;F1b HY zɤ,\pk,k-԰/IZn)ؒl_oӞM܆O0>WT7H5>7n$?\?3m>*v,sYIQI|T,\?GodG?|{OMizMWK:_p5Ͽ}ڝc)-,5{DW"|Tr[Eb son]ҤI$5%Inoi[Bl0 ݮG8$3?P HY FD!}|l`-:afc;;5)Z@T͎ngLJ aN$Dr}U6EkuI\zsKf|l41!cEF\qb}wGf>ХD -tne28ЦZ*FAmwKoנ#<[ @oxEjadd1ɘs kG(}Z0[xe_GZadd)1z>>*OfFoxEjXX0@D)a􆑑q" HY z HY F (7<"e50222rt1z#.RVÀ0@D)a@o9)aa]TEGXFFFF.FoxEjF 7<"e5 ####G7<"e5,j@ 0z(9/&~tKEk򮥟L?rv3S=zR'V mO(!7 Wi6Vy϶=_Y[XXX'Qz鏤=;"C2~ڬijUMW 3גNNN6m\Rt/X*{>}ڽ[J[oܾqsf̼Ltj?$O>|L. ')a􆑯IMEcE{C{mC-!\i'Ѷsy]EeueKV,tѽt6-K~nV ۉ{3BϤ^VkViKw/tq:҉fƔj*;Tk8o8qPtOئlcفoԓ*ڎ9{)47rm!_+jx0z#.RVÀ0"!&}u{H ёwwޞ hh R W,$/(4{.9Tj,Vkk}]> 3%lNYPlrۑ6.cll\l#3IRǪSWtd˟Y~d@oxEjF~KP z~• )~KTix5ܴsfŽ/z{Nuwt$&s#z x)8/DMSO ĉ6ЗS-feqZYc A5|3z#-RVºQ'jPj,]|iIgJ)qڡ뿛],ŖO5*k*(/>i$xnwHiI&װxu:6jl'` \@L$10zF[)) Zx*d!Z6kj^5}ښڵԷS^hM3nL C_;>up_pMC&v!wlCMbb͊5007/OA':?|aiji U]9}*PcT=7<"e5 #9O]kU7Yƒ%EEVP8'I#7xGndWbxfSKs$Μ33W]zRV,e\é'RXzzZV+wQÃybʷt[HoL ՏjxRi􆑣^g)qmXq{X]x񰵄g{#-IZZlkNB`6fYgp={csYOzcGZuQ #DaFo9)a@o@ H07]Hհ.a$޹7qql88m0 mW4Аpp&WL_hYl4K(o$ MrŖI[& m6g%~m cP*re7L ##rjj1O F ph rxn;WGl]3N@ЫS#EnX^n1\5u BrjծqA G0rѯ//I"71ZvÄ0b$p%nJݥ_ǷV #EnvZ7WD7c:|5Ȏvxph Sp'&b$@Kaӈa%̒?9gHdVItE'ӡȥ u=%orCGnx)7Milk`)eԮhu_LJ n%"5W 4vG:|e6ֈFCQNFwm&FF9B@:Aռ(F #71Zv4ܰYm?)~zex(Ecz:aM5t:Nv70gX.~QIZ%WJ{Wߜ~Kzoc憉F 17 LU$Q~7u@yD rÑe7L ۝bnXH6:6y # MnW0%̠ZOѤ k -aya۱RvN6}]rOUe[{:t;;vJ뒧۲3p,>y x3?xn8u`p}rt+fJ퉮Ы'm/7c}k(aV~&{T>gCo|Uѥ)yi>Fx50s2G{i6f󘂿2?;Ι{k]'KWkZ_\g%ܖ0xn8u`8_yT'+_qgƏ2ƮM'8yֿCj5F]W'Gi$}$sEnXSh k󉃸aVS%^^4RVe+ +YQ(U^ٲ5˚Z]פ[k[՚\ҳ^3?7:fPIic+ k+r<ærcݱD~Q"ŨMxq5QpG˿RA;d%|EBQFpzw'OS%9$̵dq k -apxmC ˣ1Jt;4gicӘL;}t_Ӗݚuhׁ)&+幙f#>Vvv;^Ǡ5.'7Lo}t|mAn7%Rs@3=1HS[# :aMe7,/;amP7LJn8mmj7fV־ӣ@↣\V1|@)ljgNvWc])7Nv}I,ڄad"nnӢJN4˯Uv>8ug݉OHfx;-b1ܰвp7|%(ȅ WXȔ5TnO5py7ߟϦO%Ywϓt7K{ldS417hn81nt[̃ټyI6=s#eq6Άv#9Yѫ70 $;8CUMi=%kyS7oi5I1i#Zh+rÚBnF(7\VZVreK cX8;Әϳe-[Lvԯ}bUL@.lQ1e ۼc3G5O,2JWnh+-Ú%7co噧*$eJس1vÇ'̭ [gd[2(8<;7W|#V(aMe7,/{J{I^ySha憓<3M#`iwŒX} k -aU7lyOĎRM=o0We G[S;կg' ѹ"7)I { { ^3?BnXzX9ԨE P7ZväM"/ݰ7(,}<7~=c\-aR+7l~oX/ϴP9c%) wB 4t X3!7)ZvܰsEOp4C6z8ARBn8R9ᆡzT6>O *FKM]|G(!7!Zvp=M(Gc rCGna^Uv04:ˤ/*re7L #tpaЏ Bn8R aNU z&!sY5)#jlHѲF1ē$v4pH6;ﻳirHNIj\]^h n82솑Uny G`⬉Nzc˃MGiWae7L #tܰWM̯@/W{:t;;vJ Mnae7L CuA7l)};f2М֕/yT^^qYg-]YȒ,MVj@nXh #NMlC/SvXQ:m,%qJkV8J097Zf^[Yr4Pre70Tae DY)dg>l7J.)-:с.V(@nF47=e뷩,YYsx}{%tho x~DMrÑe7L Cul|OҬՖnJo \S쬱۞lq(WjɦLk=h #W nI{ʎYߙqÖ8o2yk]sϚ? X71iJۼc3ۖf^s *Gc !7!Zv C񩩓g\h/ONIiS6EV=xҨ̣z5<ܰѲ&: 'yLM$/% nXh rPjp|:$%&.QFy˼ae7,/ 7cܰn :c*Gc !7!Zv C0;Vޅ2#^fnaݣe7L #t8=?ZvÄ0Taz(2/qQc Gݰ,0Bs Dh #DnaN՞m~*{QZp_!;} VWR6 ) #DnaNࢥɑC_*X}> G0!7i)OZpKѭ^I56A G0!7 թ~%Q}jݰ,0B!aI~ 5L zXCѲFnWXu/ջLX}"71ZvÄ0B;2Mxk;-YFZakPZB@$Џ Bn8R aNK_H>/}IƸh ~D}QTyjm& U۫2fh<3EpD"7)Zvp=F {D( 1$;2I-uD-kq%o%d/g2us*󛔣جKklwS0mB磹DM/AS=ӫ#drWA~階X^*K^d{L)xu4ԀܰѲ&:}pe{HKKڃ_`I4hALO6r5ɎsZ(.Z ܟ'߽d׋/Ҁ'熇~DMrÑe7L CuN%^^O}}{*%e498M50VN  ^QQRy8zOD7X(tTƝ^ܰѲF17̋&!Sv3:,"?݀OV/'>X_Q5J.'"J(:r7_Z w*Gc !7!Zv CVFL7tG% ){Ki g90ަGD3+xK[x+ -aBn`ܭش/a<ё? $O+M\r_[)q`Z[qIezyy:Mi}QOae7L CuI csZHڹqr7˞O)ðe,dǒ$yMM^Yzp],PJnw::4 -aBnS a򈗙En8Rez %71x-a䆡zU M&DAE/g?ZvÄ0Bs^CR3#jl-aBnSUܰD~ 1QF9*eN#8F-ayYaÚbfwY /SOPQFyd 6سj!7!Zv Cut։7oBQR[R,ʝԴ6:ZvÄ0BaIv-?v$#EnBP})rÑe7,/ 7@ : Bn8B솑BP})re7L #-aBn B Gݰ,0@(ѲFn B G0!7@  { *]hjj rP(+Xr[Z wӅ>ؖnFn@ CH+Vq CP("7@ j0 B)r@ CP("7@ j0 B)r@ CP("7@ j0 B)r@ CP("7@ j3#P( Ag-)z@sîVqqL?V BQq" ic}plF V.Xùa<^PMsٹF@0@U 070JanXab( W:*W*Rz8ݞ1H0,tӤO:Xf >VFA @87ծ-醍1 W+ m\%: Wb:{ۑG|T~̱99݋.wa7:)}^9S;]]`wgm,h˰WKוnߵd:4L KT\=/zi7s|٫5k!ʋOLa}mLts 3=&TrL 87SB?q^sîk-=^_˫:).״)Cޘg;UWz?)FXZ(vG57Ls2}d#^uȦXmUfzf5uçite- oaݰW>Ϟkw;[鬟OD]ټgka3͓&V& A~21MKKcX(]UOrtE= ^qQ%$ٌdvwjw3r#N{SfYo2+&+<~w?pn 1&N=9Dʙ.Z~jqswSy鹋rwu'_J:YÒhi$ZUykƂuˣ)StV~~Փi)$I ?lTGurxzccgƵb.s@a`t00:en 7 rj 7E&4ْhњ\z 挶߷ͫf=u_-Xhyn֖|I8#!>lї˾7;z+ghV "tN,&@ 6ԗw'c3lݴ՞c#덻~kޒyV+uJ?v{K*JsgV:*˟-WV0NqbQ`r9XyW&l*i̝9;p=/mK^bs<(\THSǮr*[_ZUӱǫ38ޑνNel 6l߾=E`-3jw\:UA@ qno|lu|'ݝLvmkv_ʆNuV{FꌣKs%3g\|b_b[s&oڱ_Pk ɋ>tI5<(?ؖnknmgͼE\㗍'YfXjo}_yv7}փo6sp3yTYsfhCѾ**j]] fC=Q4ϕ*rꆏwo#bs[MreˋZmN avE1sWr.nz[hӥ+Kwll2p; : oX-.a׎]Oݽ8kquJΆ´K}|<5ϸ hJ(Qڗ_b>wmzΐR&B+ 3ا>wsKxy[NS)&[+ϓfK8| 687,4;+ce-+Z_TbF2S>G_N0OESoH&¬BB#Y厞&Y3Rlm &?)g>-q{y+JVz5ܻ+жtWXct$I6ݓlg[;N<{; Fǹ+V liY%edђ'd熵rVVƼ{}rkW5^odS̉tE5ȫZwu߿jmlz_qےYKٹ'lܰ.Y6(ϔnM/*+WWW)q9WW6l8ٱ%pxæ6-^o=D?Ygkb_E.E]]M՗mj{o|K-) xWtqxW{ח^Og]2m篝T@qnxM|n0o1&: Jx2cO6 =sãa?zzYF 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ܰ5r-F P( -j:7lKMWiBPQ[R,pn->@ t CP(~n@  sP( ƭj"7@ D|rP( ϸ Ny+(2(-ݦ >5lN( BG?y|bDKJagϜ|Q_4[gO mBec_fG!EP:ݜ+@n mgڊ+&CTU_Z mBQĬ.-tת)-kX)r"ܞh+ >Xi`\`o{LsÊ")+' mBcwG#d0Mzyް<ek ]M ' mBcIbK<lj@ի õ I{Vh+(SyMUI wG]ɦI;n(jϱJ3mՠ8mJ T thslʔ^ {Na0a]y6"5kocۚuˬ%238|ʭ _}mVֶܼt5c,6*QU{v [dܚjP۶%[;c#{O4V=_8aޘüJG%uz>؂`kLJu\Ml!F^\XQEn[ƴ4ٖ^”U[b[d#t]rUs,6j*qRf@c8bVP jkW8/{?|rms;[vJͪ6u붖B[r~m.BBc z.񚱡>Qk .ݳs&>2e5+~dN|V'soXwl4ZRQ$xj!oNH^|qIф %O9wTb?Y^V{~q[f~e'JUc ی7^h.y/5-QaYjt!IOTўcVT w U7ZĬTI=(1-mN{sgMqIvd{Mt%/xgO kװx˞lza`_Kہm6ۮ/)}j=(;pUyɞ٫,W[<(:Lyc$=`6ܰ7Bp p&(.{hj,&{~_d^?inksǭ5ere>r;|ᄚ0+OȘ*SiCK^ufcͺu3L^|kВЫ֞ؼhyyjV߅z #PۋCUʉM-wlQ mK^CE$&kuDEch DkV9<<+c鳄Dyk秏(3;Erٔ!*(;m^?u6N1>2w(X,ϳgSi+Žv`i4;py,oUVv`7{0+$7~IocuQI49͜a78w]el-L\y˔G}.2}9q=LʯMmuݕ٫8*V>YOH5ͷކa*;\:QdP5Tdd']>ԯrxmՠNvg[^sɳO|4es<XNi^}М2)=dA._6oM?z\ށ{-l7>(;\:f0_VrMxsó9svئl _q9vd߽2GY@K{غÛȖ~ڲۙ\{SKӄoLSJYxGo>mq''d+;wVu:O}xuFw[HvSmy6u[Acy[EuDJo{^ya/%}rYI[<۪5Oo7vֆc\TN7S)lemhU#cDlNU>?l/眧qsfM[{woj}gtZ9n^dN7rÑDaॄߙ$[_lv޿_~aθakmi&- ?q<橭k̖ǭ:<>:ś3aaG#sTo=U9f϶W=_T7X s?rt}R3wҫIxg<\~cKC\tSpyז*W빬l]ɓ;,9z*mlZxUi+u|ޘo?*I±ݗŝWڗ'QPx\TVRJ$͖Pm::Ϸ \1Qo _GmB1TvTa}_ۙ ihO),\Zܰ/lWŞC[Ph U//c[sk?/(YV{ m2(Ǿq ne@VP(4*zްȉ@{J'dLT{/O2 m2(ǰ|sdzT JUǵmBGV=]=r]A+N{uvwD'L=]nPUNK m2(Ǹ̎*"9{>ai`5+7lM6JS(==}lOV(rlpzuOi[F6CaA[ `d9`8L>Dդܰm Pnx@vür*)0DB+ػ]Yun}#?+.j’}u갚y9Ԯv)zhoގSR?< :)=r#@dp)4R.$pc-l;m/$ԮF)|K䎝;69Oη])Έa<SgsViX)gW|MvQ,ȅicf]]GO1ܰ7~A_:5$J4RGsվꪦeLS:78gnX'(NJ4kOǙծq8J׽fd"!inX_f/7,Q=\ ?I.%p JbH s; +đ(/lѨvU(DJ)Cy.SwnX (B|5e_3r28s6;Ul۳gu菋n4 ;JeAkה+ 9` [Xc˾-.zTJiڴgӝfkվ*{~Rgu"s&j|^7(s#6V Mj򋃪{h sbekՒnqsn0gܬ.-"ZZ59s)r@P+i`\`o0)iR|4'_4A K$'ri\S Kܠ{JZ\GOM9;'zՖaJ3=c܌QJV^>S[|YTn!MpS'a"Cq]=] {?X iև6 9f2Ha6aqk|EkP\oVtE͖NKHSFrÉl:S[9]ǹa+>%mp5|[M#S'*h3[Yʂ>p5rÝA%^3K|we67, {AKݡeyXjűUan`#$l)2͆g^߷7+ J0vDJzОܰ|],\ ggf={VpYi Dr̼+㸆_7/D:i'JVUrڜtۺj?BnzoX+_ys攤i#đmg6.}h 7^~cZ ~uEKݥnxCrbr8# B{= J: 2lC>x s ٿaDpju] Quy5v=:T :^|,7 hgUH>i8 DP7wNs6Ո ڧk>R𳂞m_V!MRe^μڢ۵TlpTߗ--} <0k_5VWg/=7_3Idp)fD0:?k_%FUNp}m_8B>?ڛ3?4ծ\g?z>oX=_eSF󆇃m{XO:gL3L[`q5Gj@eJ!?#\oﵳ 6m:z(+XȒ2 V3/7,+΋~1/K+TbMǚIp$Qrr(Jb0f.r%zU G +}^LHJOܰ\D!uJpuo߽?=(ki,7<{]l@bOi*L}-bO_gȕoϟyիV{#E5B. Ȕ|Eܕln?zyHi0p>}`OA˲gGv!Q=y_&}ٸ1ؒb;ErM[<9w6jBP(T:wII2'<ǹ D|u BR3O$E7@ t CP(~n@  sP( ƭj"7@ D|rP( #Z 7 BPj0@ EݰE.$( BTeݰrͿ,JM<(2(`}")xho Bо-7@ bD*0 B+0@ 0 B)0@ 0 B)0@ 0 B)0@ 0 BinW{t@ D<0 Bi7,JΖo3CP( a.'Ĝ!5xIENDB`PKnNw6ƹ-Pictures/10000201000000F50000007AC21FF7FF.pngPNG  IHDRzgWhIDATxhg?Y𖑡KXCp8-%,}MD,. e'ڦB>(u`oΞ@d2r3Hj؍+4 cnI03BK7:o kG#C(b/ʕxmdZ`{hy4NdL ?^x%>);\-V$BXM\!Sc ft{ ^lh,./ׅb%V~@váWw\K+\J1oOf̒$XSp" 7 1ctmn6Nv'#RrCۋܔ@K/~):Pڿڧ6H]2s"r ?>OSVdk)eo~|ţBn*|'BG"ђ|c]h_ٜc䊝I2t6$6 Nhpߥi 7>p݆4pě+>o|r) ._o%ACE瘯npo5?%C~{.]δ58K +])%'t~.|}&ԡc˹6bl`*F/鄶)ӓ}tڧ!Ӱު3<;%5=;Pr軝 +^字<B,Z?v%ch*V,FCk-hzc^; 5-!\u \:!DOCA!װ..-س#YCNxC+ OЄҏ=?bC4pf,% Ӏ 7eӱ'ߦ(n%‡loؽx}Q~u>wp$v1;#y8}+ξ #Ls ~4DfMo86 > 6)|ZyXN1{E,AOr/}z: Z✤ǽ}t_44镯5\B3ʴ:Xˉ"lia1|5w_z1V̇5;Na4nq՘3#K+?epW;=?)GGmΡfɩE--Ohh؎Kۋ#„C2eԭ{L6 h%6 \Xۍ~a#0ed49+H˼[pH'NNJ0 Ϝqq(h N40 #!˽ qQ>@R"…?qY A/‚g 3}qF$' HPQ㯌2q3p-r lye C:q zPQĕ$BȴwBMk+B%q&i-,5@k"~W8qqAdߖhuM"wՕLۈ.~ہ L[t2*\gw B?46L9yDug,sT{\s fBGLA˥|Qfvʏh7} 4\ttTI%]E?͸5 X6 Wmв5>?'%2Yh ώ{gu_=#2'YpCf?}&SGf-oHLQ6g3Y:R|uOdnm53`;Y?̽`t| ,cȤdg;m] L@|gڂ]ӒsHϠJwӘC$ǺGRY<W@l"2#W%' a:hyB/mTO^ *iy[UTD~?mWf ߸\̇5z_l$*,8]ٸvc"|GUжuvȴĞ08OO: kt6dz;sY/C?S^R^LC>]ʿBu =Y'GAfvZHL rsWDJ JIIZvہuDXwgߊs`]OmzE ߌ$; |0~[cD6.W^JcBsm1f}FI|'ϟ U ejSoAs.-; Fo8\Tmݯ!zӡNR29жSKaavn `n1jaYឋy{hLaS'2BkCFhsqzjEù3T%u!wC'5D\Hh5~k87b2^xqb5&>>izvkR2 hz0k߱z~x/x~=>NEʖŧ<=tۉ00,(GkJހaGCd|v=ſ"(Ho\B^MӴsFGPM8ZMۦufX--ZFM0]4a7aOa(zͧ130-IIMބ+-D||Zv`e^Bo˄b Q<`F}2mWӃRGɷ%EJ BJGvf֡vmh"u!4ݶඛVzazNg5̶fl5w,gigVMl*q?h\`k/8L%R(%_xj~` ?˿GwP`iZqgԭ"mEhhb]zWc,rv79yބ&DٽBqnfJ_TJ>& /Bt{3pfߕ0uB"Vvb"t4 E }NX*ԫ^2+HUڛEbS(+[|QKQo(y. b]DPTJ EDPTJ EDPTJ EDPTJ EDPTJ EDPTJ E]1Lƶw \iz`YE=( CD(Q+*|"MBV{{KYF֥0ڣA;kBQqKQþNvE8֝w#h!]!v(ûŞO:F-M*ҩFVFԳg_"| b B$k; ;"e/gOe5?nMX8w5I,DлC-zñ?5Q8Kb}S=u(Ac4i DhC? Dϵ'Lc~܁x~V#] H tɟNt2,YN/#$=g]aݶ8y$F`>7}p˞עΣ:x%j>?֣c0APunW9S8SNamH)iܔ?RJvEM>'EwF?VFDX^VF-,@5El;@Ckfb/!hȇ# ;0 D]m7ǫw2D 1Mo=vZtb{>!ch82-+KnKo_*Z֟nw[ [ ݻ7Aźg]⮅Lv'hAKXON`r} r.zj9}{=BQXU(e.oBQ>FY1( .j!ɔBV,ûDToZP̋Z_VD dX1˞" *D}JԊoPV( %jPV( %jXf7ٸq#{[qϫ غu+7nzz~ԣ(Vu+j s5 ;a΃a{y×|gw'BQ.Zԇ z+L"gF-j.v#Yvn97n˫NtIl&% &?̛Pa]l01L"xg cg߶ =rⅼf 9XOOSH=[W3@ grz>׳~e䉓Dҿ^y[=bws۶ `ݱRи#}xyΖj?g \%T(º̼M?㋶=ȫPT>5_}U%f:g,>vwLq5O"@$#bvb Q}ؗlw؛N οvW{Mw̫>/95PXum(eE}[?y록Cw!G.UVXIV(PV( %jPV( %jPV( %jPV( %jPV( %jPV(uZ@PgE}&\0YB`V]A 7~OLP[[K߶?_VW#- p}x]~O‹/zBM5XVViJ%&!vBmym&வJ 0/Q>D6|pRfm I!~QȫIބ9Τ~K)yW_{u6r=S-8""hhOX qdZ|ia)*)3g<؉`.چBTVӭ1hJLi7\1.aTJ8C&P() ?\ݍ@@qKw|B~}:Fb2Ƕ^(.dc[[:BV~' $,Nl]߇֟n1g<:fV.H'̒FV_BƟLXMV剮;o>\MnOt/j_b)NBߌs-!c]|r qrI!BX;'_O`KM-A?Cvy bnVңvOܮP(=BQe(Q+UBQe(Q+UBQe,wxW/X]vAQ,C;Cv ZoPV( %jPV( %j`+ bQ#o֬ b};ri)C<@z֎(z31 ґnIENDB`PKnNw6 layout-cachecd`d(```d``Q1atcqxc0BV0F<c2PKFֶ/lPKnNw6 content.xml=n$GvwE  54H[C [c DeQʅd >|0l_FctIŒK-ddUx{䧿qlr<N}@kpr/|{}//-MMns> v,}qzS.u? )_2W&kOXEdYcT[:>lmz:kc HM6Yv֝% 5(nl"VykroL&(6zгE-h1`~t]4+|X7 :3eF Uyf@^f3m,vdzϛ<'XX7*ó)k's#PPnD;_{VDuن4iAB6hm⨲oߜ] иuu3JK4%Vga2_~*?zLo$⋃z+gk9J҅(8 +/ISec\Y@[;4~=f2`&rqy(yYțp%!q<7UeiK놙B CrO۬*g@讨g*$g8&FT Z +?`}vzNXFCɗy'KA{tX|oof\ѱh,=Pp^`1$.XaP~]9\w٭ K.xͬ 3}YBh{mv*dXE f'&LmkS,B?.W |2{`.LA' *Pc!.zS\/T2< U#FPef5qVZm;vW(>I ztڥEEU-?] FκR2۰eNww1} <mT =F0>2UA:2v뜝h J&xz 1Tߥ}c*n?~43dS]/ |y^1L}Q.g} ~_TS<)5h6lk Q3a"x@07C ]̀^=G "įǘ=d9u NhsD7J2H镅C԰Ֆf ?5+/ ė6t~dJ wlS`+f+Bf>?=>˴SqCiU_|!1z%`K g{7@ &4t-ӫu%F6 1w.r`[)?7?-?zղwDMO/|栿<` _9?F/{fXj7hޠ9<|cK߰^gX [selB dM_ta 2rvC$@Ȃ([W̐ܘSf+֖LMM9 .1]S4=:4- QzW=}2nɩOBANB̝#N">Lòm$g܏ƀo!3+FB}u?>1)a1$+gbB)օV ' tph ̇] 0OFs4۟C(? H_d)ZNWCW3>$G_6.vUk9K2y]\`(qѫϟ@L~=|2~YKX7Pr4[zA8l`¯*J|;! [ =HC4a-[wrp* e`xZ}) B7dWط? +hz*3K˅g,+[SBm)Vڇ*jKbQJnSA&T ޳Ф=$@Sd4gq(Pb~H>^e6fػN =aCt30h@Hz-fEYd2A: : T%& bB<D 5J/|HI~f+\C|Pk/f?  %b#tK |:c<::>ƃ TBYL?93fG Pg qvFg R* d`eVE* /C;xa,濯Dq@G,eJsKz(",Dl!r=ڕPzd|$b}#}>(koLy%&n%H6!礝`e`CT)G$ čBct6Ʌ#2;GH@_x ˹w]02L*`kԭmI0#$H"{>ZVumfH۟P1_63 Y$HzDEJa-m0|F51yVEي&XJ᫪dY)4@|͍0خD""TvS{[\OzHgKW~Ṿi4?D8/ şw ,lX@. &^9 Љ/ 0E4irrE'~YnzimxhqAF+!.3f*'&<-~A^ZܧB}DG& P+X\0R` t tKBɉ`^ej.Qy,tok_I}䊅@v;R#S/"p\̽Ԏ5\#BTWCTvENQϴJ*_OP0} .x"7|3CU/{>L~=}kgԞX-w6aT3\ IdvrQ{ȢK"0vs"#uY "hs"v;%J}_y\,0xB+FZL&Ǝg2EPӱ훳FfUjER:$U9:" TN/Ojx=LfDR#mh$KR|$u$~s%il$u$_u^k_I*kþN^dmV,a䢌R R7\3&w\̛U2/~Ȉ~Z\m$ 8w)i2Ґ2ߑ1Śʜf( ֡!'z$ -1df27Ӕ^ MU"ۿrܾDd`2bNb^Xsy"իh2[zߢSRx'NY7'E9#Bzqv/;Huh gm U*;8:9\^Z.Kơ(0p^N*-UF+HE2CVĪd1G3eK5_rV%1ŖՄ{N+l'Yw9odIiP~NFGǧãWO~_ÙG{6φ1jwkܕĠo{$Ə]gI̗8γ|:\>8ügJ:WvUU:@HM}oO5LE\Œb`T%8zZ9 G}]DuFI;ZIIQI|$L2h2o5ۓ5S6}ܦo$L:xOaᾙ> 㙾HyQe~Q]^ yͮBf_ChĽ U:=U_"k<7>rns~|^{UE >4K同ͩ8Of%7BK_w*[ko붘doQ'FG~4+ށqmP\ <ܗ;bEDRKx4t|Y!Б+M 6_)N٥4HLAӶBD] f (X] ՌOۊ^UWM~-gN|xw!Q6]7+nd;O3Hތ4p'l.neY̰u7`42y:4L&=8ه@ĠΒI ֗FfJ`W1A5̊zZ#iPs$w~ )Ϣ\DRYY:D0ӑ<%^ґ%CݵVG6dQm<vSLƈ6rX!G -[Ao6l>y0h; ޷e0mh7:0yGl(⣲7P9%BKC]wȋw fgyU~Gz6ۮ79I]yr rz!M.ezܸQ|ݧ|iJbsޏ{%GLD 3ߞیzُ+M6v -ynwggr l2:i"A޸ * ף@92sh}Z'{{s'RʯۯLNYx ,g)fvMVϒVI^VҩR&R+>()&&}Z0цSeV߻,^?==9ўa+[ו$̰|fW(q~JSYjT>$g)|Qz_^ZbƿLns<PKtPKnNw6 styles.xmlZݏ6_a93I~]ݽ{-[Iڒ!ɓQ_8.HJ#EJ~!ςatƓY`*w_e I2eIc*#!S4UXrdH(b)%+0uBK{2#zٗ +ކ,Z_Y3)GŠloXȢ H?WNb9av/V '_QLsgX-&$:K4V?D|h :^/шx&!>އt{R_6Gr7/@~PccR S%i}yX0՝fSޟds"1ؓ ʒ,3SiH[\0O(I&޽5ت[h~:kq$;6|&`g MOSn#ނPn$-0g9ֿx_9N1*'o=+9QQSn$g)R@mtHu)~l|Q+T0MՌ0Tv/uS{w|} >-Z|#TG!q~NPqs=xnf疣bGQ!pI~PRXFU8<$g"BN8%pF;_:$R#B;kgNk 're2ᡡ@i 1$R2@V*}h5#KGQ)Ybgf< M:)Teo)t < p2vŮ@W  plH@x^H=!-T:Tr;Qr:ik;Y}"Ç+jwΊ&k̘@l ew,vB!h2euYgsR?SEIY @ 8:(%zT-Oo:",u8\mùVV^ٕ_>mq#B#U=;;LE)v-A7b~RʰӧWW؂\ @P!po]8lZFZ'E$˝jT[_*Nix Tԝ3~_D!8 #ɃK@uku.qCVA Q/4LV ~(-J]Wl88m Ať&6lc{L;X~WCr5hbh8lap 2$8g;c"H9rlA_i'INzcKKj(wP2T 4kþuk}xŮ1Ƶ'\)OQJW< A.uJ\NTh({ 0P/`P; v T?=.vŸk3VjfAPʹDoh7Sqܨ7vL A-0U4PԂeUK# [Dwbg6ըzf=@˦,N[4s7ipro97*t^˛GcG<-U#k PWjVU:ڮ:lX0%GV]Ҩ}Wf&1/u?@ [uvaSE_jOKc+^&' 1Lj}"D1/l@\#SF+[dA3X!p1u~1 DKQ[ݸoLlJv-H#酚j%htʚh v|6yxMMVNzST7wӝ|z-TxWILbg,ݐmVP"[~mwF'/(+Vv .c[/cZXXsttHAү^Y֠o|5ֱVPmpʉW*zHP8+zjۨ<{xZI>\;{=0_LNl.T&d}͸Ȱ]M5CoO@ ݨP2:.kd?׋vO<{xF(},(x`CW~H|9ߡnS; ;Blא5ؾTu!5wPK4mk-PKnNw6))meta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680m5$Build-90732007-03-05T10:44:292007-03-23T10:51:26es-ES106PT3H8M58SPKnNw6Thumbnails/thumbnail.pngU{4uΪڱCբ*#z^igz0U̫^Db# RZmRGd^g˜H4.;;g쏝s{Cw j (:9=3FrR r;NsV,cu [V{ׅ dS\wg߼u?&G#?xwogDx}H:J^G?pP(d+t9gPrqէ 0 }+Wn6.x9OUߥk,2LO[P<TēqجF/^Ten޿0NxY,v(b>wگcHtb\7vz>po(#0ISPA޼b$W,+cرlL6*@`o>>p'1Oy:)Ӆ֑q;v?*XDđ4fjBǝMGly< 4; êՂD7.i3y,"< CFL\VUg*l 刺L-">.i2^ \ s}%Ԇ* yj`tSe-pDi@Lqܝdq \H}5ؙܛ*#d@t~T>]ӽqOm7/YŞ2 ѪQֿny#ImqMFiR,ƋZ dcDS gDzg0E N|`q]x ΊdXT/ϳnB![ $yg*ɿhې(uDSYlV򮜝3{¨kM;sĩW._jѶW%C?W;!{s\xGx17<?BI{RjS(_rz=e dFԆnl miv:2@uV\`ӃGҸz!]o䣂j_g綸8Z2 >i= }cADR,ZJڲG)_֣;jBm8ٻ LPKjz.4PKnNw6 settings.xmlY[s:~?"w$)m!H2 {Z$]ɐIPHlio]"g4GyT+c.]|mu c% MI1Dv SLs],]7QSmNYd!| fƤry>/QM{^顪U!"!7)TivqRlؚv+[Ԃ]>y64X1˔piŧ7m1]9N3l͗ʑ& |:itR>|1 Z3&704ʠl*k1>aB,e canZNa64,/>ť˔u 2c'O'Kf;Ƀ}Ib3Qh &\})x|"&# *|Y\hEnjAwDⶢy*w/rx5dmR83F0LYdd'16)[~ˌ%.ip~Ȓ18s.5/i._c@}KR3?ek*QA+m H(kA0Ih}熂7$F~mEI*oJ}`͒r -z 1`9?lUwWh P4Ԯ\2 hЃ6LQa[HxP;qC7/ʒQ(d(%a?ud.x,F)xuzUGI׷dKyi 4G vzmL!{*'[r`|8fnu b{tޡL3WO%wh0Ss eD 񳢥-c+Sɂb-дXj2w{tOں|*hWKl o @%:WgH<ĽEC349>ho.eͶ(иF/G uJ}/)^3}lPKB>TPKnNw6META-INF/manifest.xml͎0(qUs0%ǎZ޾ a-[_ƖofGfD**ҁoĖVzYQ:u\]KH 9nuhLK*Dy]adKY:m|X-C;;Øa}X:ȓ*JcmK;i#PH),ZgYXDgKR%QvzpݚY--Uƃڿ/5Ae}oѦ?Q7 ؉Uf7HXD ]uS:T =settings.xmlPKnNw6j`eD ,META-INF/manifest.xmlPKqtoctave-0.10.1/widgetserver/doc/tutorial/tr.pl0000755000175000017500000000105011511434230020514 0ustar lucaslucas#!/usr/bin/perl $symbols{'<'}='<'; $symbols{'>'}='>'; sub proc { local($file)=@_; #print "Procesando $file\n"; open (IN,"$file")||die("No se puede leer el origen $file"); $pre=0; while( $line= ) { if( $line=~ /
/ )
		{
			$pre=2;
		}
		elsif ( $line=~ /<\/pre>/ )
		{
			$pre=0;
		}
		if ($pre==1)
		{
			foreach $k (keys %symbols)
			{
				$line=~ s/$k/$symbols{$k}/g;
			}
		}
		print $line;
		if($pre==2)
		{
			$pre=1;
		}
	}
	close(IN);
}


for($x=0;$x<=$#ARGV;$x++)
{
	#print "Procesando $ARGV[$x]\n";
	&proc($ARGV[$x]);
}qtoctave-0.10.1/widgetserver/doc/tutorial/ej5.ws0000755000175000017500000000046011511434230020574 0ustar  lucaslucas
	
	
		
		
		
			Columna 1
			Columna 2
			Columna 3
		
		
			1
			2
			3
		
		
			4
			5
			6
			
				7
				8
				9
			
		
	

qtoctave-0.10.1/widgetserver/doc/tutorial/ej7.ws0000755000175000017500000000025611511434230020601 0ustar  lucaslucas
	
	

Botn 1 Botn 2

qtoctave-0.10.1/widgetserver/doc/tutorial/english-widgetserver_tutorial.pdf0000755000175000017500000235331611511434230026332 0ustar lucaslucas%PDF-1.4 %äüöß 2 0 obj <> stream xۊ6|plXgυ!B?IC iI+ٲlh<>&d*h9uKUWVU[]5Fmן6<>>ۿ=T7O}9ycݶW[S=NRP=^=zsl]ѝ`co=PHv Gk=v ,=!# n<ƳO7r[/5 `!CYPC==%~"x ^CP$x;RW->ɨ3 I9FFYM g\Гǡ!G̜u&cɄdua(Qkd+s(Q=ڑd\}PN\Pz⪃ύl.<^EHVz.)ndHLK#v.&Yёa0INQ8'k~cNhN ð Mɰ{TĻMh+y>)Ea:2PA!J),b@JmG#YkY+̵PB$G ,!F/J [O1 e<1tQǵ?J6F"nxD ILT.M,7ċ]ԒH/0:"i$pa^VVm4cE#D ! 9`.k|A22F3'֚JVO6l|~׵IpYr%~Ef tf2NJd/0c /F}A:`хHlr:>Qy)_sHq疵)fAX ǖXHWCJKRkXMe,0a(*Jz2@r%3#kqlVC5|peUEڢ9IU-7,E,D5cVO 0*1 ,_l ( 2tghN̏ ļ׃vs>-D?vn*+.7,Yo< g7gYaEs(*wtƝ׻Ki| v a3mBrlY3B;8~W@q5 nz Q,ݫ-V:YxÃTřrqhU;t2LB%m/vq,&iMaӺ!@΀xDܳ@T)y|H4̅SHzV0cz AmlF]$18u6Q#_=0cv?}wy am l4t8u9nG|Jjv즃)jk 8C$shŇ[t!N,=VW _aJwFWy¤Њ%qǷcs6!ve_jhX=蒓oy6 rF8)r>2WrP 9ON)4s [DI?IE.9Uu;H6jE;,9gǫY2Z_RLV=/'tUA|"_E+֭&P쭧zC־/.I:f,-TKHu7EyMR }Ka48&׏Rp_} ZʪJG_;<nQto7o?Wm툁M\bIJCGk! l9$~QxE'6o2JFe!Y4tGOk*^,=\Μ_9&ߜ"H֦sjSwhcl Պc-6yboUx >BPlPLv5I^hBReiTl\H?فt#O"R` ggDOv88]5&;F54q nǑkJP&]_QS/!\F Ut>#|XO%#iRcQ+oI+p>ӊL~>pܧvEm}Z58M)~x浯x_v%L08?\`{|~uX9ġ#kZ{jv$}^濥V\~DH} #5eI` yQ=:j> stream x흽nJlmVmR,.`UrJNC H`H+6n  5+Sx  PMQLVI*8ph4gsy.jJ颋68L8IԋOO jvzn̵D<4<";IJBFt[Uiw\ { jbzًT$Jdjqܻu{txVAw\GǥL 羌/er<a΍y(1/Xx 7Q?5a3 */m?ԥ VL=N?[Miw`}>.F\K`>|UA^.tp.U e,;3W(c*C?EY>:hk}s[uoƘQl|aSVҷ玳3\'[]#.!hwfre0So?W_Otl]0r?U3wF_dX@`zN:߹a1?ҟۭ@sa"WcZ/6kk[UߛA nx^v{^:?)h_h:wz(}41r4?s|:c;#]QsjfuP<(({iA[.;e4q]Un\+ǯh٘Äygo(ۅ~9dad Nňn Tl|烛{8c`'C <HNIh]٪P"74r4c& lm,cuz#g\+ujWP|D6B-$XSϢR5\IŬdF \95O WY }\L1|DTh;'tn~̇('a*B[>mb0vlJ~jZu>C1:X魲_E쮥j;P2ڿ!MiUm(r d<*({~sfnw+:L}q`3PsU7|v3|;%%,y_I_%|< ?W_g+H~H$_EDɬXl H|c_I7& .IvI:H$KA"]tHlDb$$% .IvS:1O˼7&liJ~Ne$"X97:0u)H,2L#[ "=tb!(!RDb[ H:Ȼk}!FE {5IT>$WHƳi]ٱ1DEkay4>cM} sYFߎ0cn(6Cby .ZY<10A #9;Is:n"b=m%R|w”u`;.=_.<}o35aY_MFUg+tqv^{tP{O^qjljo&l}9 K:`;e.g> JG""|{M04Muak:U@WpZ&Fw`qn4d+8 sY6)5D b1#Ft0ۼ`0F^sG<#Wڽ/}q5?TupH;][kn;Rˡvan;K{kMo#u#x&Cue^*WP"z(1*-^N[3cqgi;EQu0 A[S)4ھ*kjVʡݹb%5`W:1G>ɗw}pu'Ci#;]ڈAΰ!i+_mHzCLupH:] m΂&ZZR1X<+IzA?v$ŷs\o{9c0$|x>`]RD:ns<<\>,W/8q4\ ]uy}}JԦA1;1E۬>[yPqHn}V;N9h(;$"3t0A"|$QȻ&li7AD3;dwnT!W^"Xm0䝊$la,J:H$Eo7/so P&[~x{;&;6kl KDb$$% .IvI:H$KA"]tHlDb$$% . HlU:H$c2H$6wtEW~ endstream endobj 44 0 obj 3079 endobj 46 0 obj <> stream x\Ko6йJ=hM PH>4b87m=ӴM{Q5ǾӯO_NMi|v0pk{"!?gyp~;|A<G>}3hG%,aෛd,pLpo\n(n9%X ākYr<~Q38/)Kt85XwbW;f`ոN.-EvoW&~Lo>]W-%ڥLl:P$,ψ$_{w>ܛ~W!ke K9IO>DbG%o ~ךA TJ0 LM#I MT$QĎ/X̼2sHvW{׸Q oPzR* \lw$waKX#|XGMX="H6:|;|k M3{W /,!yDȄj|Xֆ*YNԹ\IQ2!8Cv{DZe#:a&U-:G-ob7( gl@|yPn2*KėQFQژVƥ0cz;4Xlm:Aɭ͔>%Ŝ8ѕg ;(؊ /-X e0'_ŢOlF$|X"! f!w#{p}c=Pk;Yezr{R</;i^M-%8O}oYOhz( 3u zmF_Q+ӌ7 l8+TG 17! ɱ>[ub+XL\}Ʃ"eTÀpMrݞYp >0m-fb- } ,Dq-$93xOe{| w^q hk{YR!/ԣǏWBrxHVϯͼa_ѫKFveyqO]J)Z ΆRK Ӓcӂ1+y's?P<~=wuPjS2ʴr6li5o1ŏ׼oAƍRwerhވQKMI%%%229=G*#6%(on =a<W՞j*Mk[5TeIpH4B/d&=_ӏe9GmYn endstream endobj 47 0 obj 2315 endobj 85 0 obj <> stream xZ_k#7si4 M᠁@?@{=ZJ~ҮѬǥɝoZyVZQ.UmP/??77?|?씾{i ⎧_*op 9N=?m7U#S%%F}2([Ȁj6u!w> #-ho3:ZUu''B<Tű˸UÒ> upl5m\\e= k}œb[ocdЈ3Ƙ} R-pߴD -K~KDf\sƦȡYR/@5\C;EvP9<'3 hj%?z> stream x흽nHǝlI0"{ffFm`'0z)7 |Bi) 0~ܿXT֗mY#5j6_WKþ=9c{G8Id5WCT7Lkga=G!|+([x4= {כa8`Bt&֠f$OT:Va5/ϞM.(κO4,?ցrO/.u_UΟ͙!޹S',Mh N<_W><|Ҭvo"ZZ WuZ~py%ᔣNYd{}/8JYx7vfqB43 5P8< ',%?lf ma^@J Kב_>PҼ'*;a;;ܺ"?xL?#ka?amk>>.j9{j;yB&CÌHIRxl?Z}AnKu٪6"邇X8 @yprv4l:C`H:z`m|F4w Vsa 〖N:s},qT/\W ݺnjsP ]gc?֕5;]Âc'$C"aX5o&>Lsw)7)wvj=.ߓwΆ$?;rg{(c]uFìF~ g~A]a9U_\2*k ˸ 6v 4(lS-hORp=gs Ep8wnxu004 0%N?g];5g'?0~\&^鬅ygNiS=pl? .KjLA o{SN浗?vZr{zs3p IŇHwUC@!N݃wČ)lAK8[+j(mMm[.=48[6ϛ(Eyn⾿nLJOQIa#}|4x9:Nwc<'X@4XGݬwx"`لWSܳ~~+Q Gv>߻ s/&0  ; ӻ+# @zMsEΛF󗴧dV.EZeKVsyHy tA'x3!#(x G5L?y2,2h|7ೃLj r _qyF|>7-IPKvzaTwm`ST}4lџ|c=s>W:x8Zvi083}<2ڄ3 (s֤4咈gҤg.wa/*87gIX۩Zw`A{ƦÕ[9<>\Aw8QڻOa:ʏmߗ55, MOEkt-<ܹxQ5Qk:J;y(*N] EE ETt#ſ݈ EuPᡨ*<A:PTCQTx( EuPᡨ*<A:PTZ/)CV˫]>~ ]]U9]T;R:8ЁZ&?5c<ʁV*l#NS!a>m'_O>eXɷW ͶyH9 ~Fe7SF$W]CI4왅E(0P3jja9v;E֥5EE5z.f x p0 ?02(o$}LC K|pQ5UĴ{hІTm%(ж~Ʃ_#*O旷mF*U|G "MeZx .$PaP P]k42!X#Tqin|XT1_?zQ]_fDDȀYO] PhQr=vEs2P<7Z92;Ci^,͹hpJ].!Xn f[+Y/7"7ި{y WcֿU<,JE ?Ԡ%[}"yiB> Z~E=eWx'{[oZ,Ǻ[wv Ux( EuPᡨ*<A:PTCQTx( EuPᡨ*<A:<d~mۣRj[Ga~;7(wFu=]k,FyNiqZF/v*z_ 9:>fkFy,-w]?6ą}e.ՔVY˄?E_&-_oFYw(<\p-\nZ&M"IhF^LMUn>( -d)c{¦#tV-ᗭR|c7@M?=~ZG[4h˵xUe^- 69޷b)&oCړ}?Ï^s+yXt v]< e0 @}ĩ*=5x^VR8{xzٟyYN!xHc`w{7u=<|yd | eGT̏IS-a6%AYs#4f Y>_/OŇ 䬃s<Cx&b}{Kf ȶM.X2:wG V!SshF_Py QŐBܸ^!GXe)n&x i^ `^lv~F-nA-fuiZ/Q}.Vͼ@Uo>ò<,jY/F7=rR^M~tk[6<Ъ E? EuPᡨ*<A:PTCQTx( EuPᡨ*<A:PTCQTx(.⡨uEE7(*ݓC=߃ endstream endobj 131 0 obj 3934 endobj 133 0 obj <> stream xXۊ6}sz*d0BfnOٖnt`if)[Xc΄hɼ}2d~y||xp6x>yw|7&F/':Q=j@?#?{}2/_vy~<]qr0 z rx/HaX\nX{?-bҰHGU$ 9 >L ݖRpPI0Y-B+oWeYI^t_Ofl8;o"us".Y!vmIne)N6%TW ~HT@=E\ ,R$f\\hKO9 I^7B Zňs:xIrNZJs\ Ҟ9)6;So8&]wLA@ ѳnhWd;Q(8.Er=p"}v9>4iZm{؀TanXlY{cmO1sc(u;`.eY^qk(q\%<|3gLeXp=Ef‚-0MGT'橆&HMڎ2>\DV+ɱ]zoۄN49 <ϾWCgMƵ׌2BιNQ7Fc"ݟ~4sM`-ׁln lf endstream endobj 134 0 obj 1147 endobj 155 0 obj <> stream x1h;7txooC `lC2! d(&C PHb:! w(CA2h o 蝫+˲d9Wvl6ϟ^ѹjI=>]X{3rх5ŕ*ŵИKX=p:ʪ{ MSO2i7BՎ7v~'֮bݘt;=e?0ȧl;|:bRqkLN{}`r,h(7ˢw>Va_{ߏFOlٱJk;R.7`&ɯd4^A ?탥Hk*:rnu6EL^,wY%CnXՂ C=V%R"bRN 9;o.5MGBY>Y1ެzpʩ!oѓ]X\Q'j_\VBm,6-+WLؗ۝p]hrJձPNX>ʜ$YY1َ±%oP}fj컂Uy7y&w>yV;䅃RV +hWw1̚iOCإٔcN 'rm3xtm_M_sF\2|Փ@YO棘}$ׇV&rz3 5Vei/*8op컜^jC=Pb^Wmwz- >H<_"ǓH_=)HSpxe!Gm>я(3&?m0|fG*?$KІ*O2yՆٻ F 1̙ՄD߀D}Öl *$ I +Xi8^ȫ}7H}M-˅UlNC5|6ݳ T GnH8hڧ&x$'FJU]%\][MU}Ki3oR'f=Rz5b[fa5u}gba_xٗJ]Q p 땉UH5<“=>PmZ:%:5kכzhqK6twP>H~~q"ֿڮla" 8Ur ?y'bbx1$,]R>Li^m$7uɛ72tN1|fwIw>(X@nB?:f\W﯆6 a\=|⌿Ҫ4,š8 ~$ׁmEk?x_'{ ~Q7HRAp(+&f.Gfν&_Yrc(!ʡrc6*_Un QVsG]YAc/>o$k 3Cy ɑUC\0G;ɫl}b%o踗ڱ`" YE"dŋU/BVQYE"dŋU/BVQYE"dŋU/BVQYE"dŋU/BVQYE"dŋU/ƍ1<6]cX *]vW emU"۲lw K0 Y}ECV3QC/f ɪ{vo~V1,k Y`X6vY]~ZEXŰjEY'Tz"=kcEJ2$O?3 :8:ˆN{iS?aX6!K%Fh[ z /GeOZ@ +C$kcBjڻ+\U^=u?!kNF#z-Y^ ,g~-m*>\aӆnwf5$'bENw[~Q&-BX֟tIb $ , $Lbq~7uf\:f=#G6PGWd`Q>dZXzpHNj7mjź᫱IdVQdf`y`m:z'lYBɱEIkbmcuE j>aMwFUQ<9tHg@vȪVwJMU텅Q[du ż#9yXAIeٰ EhMiø(0|42U{.xCVAFհ0+) ·Lլaa ¨~RY~?@,ZXwawe!(^xE*!(^xE*!(^xE*!(^xE*!(^xE*-g.}2FQV.T(ht %y endstream endobj 178 0 obj 2964 endobj 179 0 obj <> stream x 0 ð'ŤFhj}⋜ ~ endstream endobj 180 0 obj 61 endobj 182 0 obj <> stream xX]6}siFٰ,&ho/-ܖ](˲K3-m nhf|ؚ?Wc=8p@zwg7xo/>?jhC L70@k\~3/Mp:t_o_&С5$n?sy gsq.qOԧlƅN]2_o[SrĎ"%ClbHt-"!"u)R>⸦{+us10g -.im: F:alkxM%8ZVB|D߯`y6O懫kڎ-VjuNr<;Ni8z<<2":L ;1C`͔1H=Xt*(̔R +e(l]bF]WGM]ȉ6pk3o-ú3V*3 ] ,ٖot7|@AcyBٶZ~CWim7TQeL]'jmWYgum+ld%c ,l%jK[E':Nscapi.o^^Vmo!=ď=H7c,EU%hTo@L3]anHSݛr7;6֌j|(|y2J,bvw!qe18[.ǎ7Vֿ<6!3{xHhscҶO*;݌i"䃫JXϳx? ȰwlpI1w<̂ka4 Nu?fQg!~9O`03LO.<XS>w]ơYn̽`n صs/uiA\y5V(â/$Gd7#(M'S'!` 7'.@H*uE4J×9),u!j<͝HQ̻EH.KU eitP`}u)c;νͭzPL:K^ρ\ڮwD[> stream x]?ho Aox7TС 1x0ƒxC bD`2Сw(C]L2ܡw蠡7h!~^Kg>>"{Ϲ=WgX{A0?/|Crpi FTc0ux SMh&Ko+zĩnu[VgmՈQV6;R&OQ"Q6 ^Bkun?{RAU[nAs umg&HWۻ9x?ЪBInt[$ K6 >W̠ԧʪs!%#~Iƾl}sNMmSY&ۛ[[ڀ4VU(d2 m7E'G6᏿SW%*"Gv/<;q߮&7D8'8oP$( LV6E6 ~ufC+iR7%n?Y7rn4J%ziڽcq/QG2g#:I\`saNGu8ʘT(Um:Zζ3Q^^I#gbi'tVy(Xyx];={%x6;q³f6bfK}u{m?B z1|&dAJQOw?NNd.d0'У?uT8ݖgr jH\k]UYTb[{7Mrv(o ;fxåVamRΈA(<2Ȗ6w/zޡt?u◘is];t⡪yx!lx Ӄ֎HMѭwp7]"ۮ,B3Bo}v誾g4;(KEK*H'g -H&zҠ=P61Y3_5׶>>5;mBmd}e :I¦u8"}ㄎ}3K_>[R^('׷yl#0 xlQ 7JȂL6q>RGMm- <ɞ{tysM,X؋7PG"͑F6\ZTS)uWtR-JSLn2JRՁ¦>Js&}iy~f{"1˃xp/V.Q[åyl\ny)}fSA!J{x,FmRAQ 6!9HXQRC}XqmiygKq'dCJЦPc1uL%گ1L)/QNio"Ғ^[;(nCżX;`uDaȼkWm:P|)AJXyÚT,iQklT!jf;xd#;yFq;#QmOD%Oª/»kաt ÓVG`iDP-wۜhg> {PVRb[DYz'mOQqu̲iZ=U43}aJؓ-..Q3t\u@Pu Pu Pu Pu Pu Pu Pu Pu Pu PpG갾ݏ#\") WP\.7]K#OxcQ*B2Xk}e|[w&0 cXvuPQo>'}o%g\Pps@w 7PdǏI; 9謯UdzozP&;?M[q>ѣG#ey OUEQ_>_Džִn XYq4ϬQ endstream endobj 231 0 obj 3052 endobj 232 0 obj <> stream xA07@HcKW! endstream endobj 233 0 obj 59 endobj 186 0 obj <> stream x=hZq|//}愕>A8eKhy&. :Ku.ʄѝ1uZ/\ޮ=h/'<^S*e'$@*~cطbn5^S/0N]a6W!yٷ=镃\|(OkG=YltkfRN@5݌OrDWK 'B!v£Ş2sPz@ C*'˷JX0j-s CUpI6Xj}MtGϟ1;9s7 Cv-ROgQ\,Ker(̮i Ú űS)vk^oצ5^3T~Rx+: Iicۍ[egJ~;9s'Sv>}GML6OT^>NSgJ*/;Á; GxU+jk<!'G%4,\,+DC[YN[Rזp |>S g\+nJ6'[,=χ7ƒ=U7m8u2U"H`M#~'@|ߙ7k ֮L4g7N2H o?fé{v:^б9Swsf+>C^۷Wv~׾h]z}^u<(yp+w/]gR^Z'wv=o,0Jxkkyk['NT-֮uî" ;?d'wPyp;c/H%6bu*|섯|سIyi罄Z]k]t |'R+VS !¹1bɳeFj:qb9x=yvި}5g[?@@Jd:ofhcX{gp(Pk!rqC]Ӊy>ߟ ?/܇@Wo">@xBEiNQÏ2}v}(m i"7.!y%d-k~ ELЊy5 :VL)9, \QwD_9ߩ)IppuoE57膢!rAxB÷QM5QyDB"z+ʹ5r%# > stream x 08[[uj۞]( endstream endobj 236 0 obj 73 endobj 238 0 obj <> stream xY[kc7~sit;p|Ѐ?.-lK:G3z>,a/_>HYH!J`ZLFx$~ANȇ6}9|^=W ]qUPRz?qܞR-Z bn; MPN+qz41AX ,BԪ`jaSY` Po,GS-g8^bKՉkA |*oJI< HJ)3E9 .y^NR%'7~ą= lFXg)UA܉F쎭{W 85QX@.-ݸgE(c&X[0q~F #CWOX6M4 8ě-זQ@n5H F2A#MИU D)#x=yǎzKyy'YeqnŶwj? ~] > B@&Yq7eܾ[&;&Jɗj= N M|;s ջ`g^-ڪ$Top|9x6lp%{^,nQ,b\cd{Ei/mI xl ~3b?uE};Dˁp=fg v?o %8 _hć'ȉ" 6|} A<ՠ CX!$̥>wMRC [͓Vf*5AQA؎%w4qMTd8T~#>/i+ /3eq!@nf՚/^8&O&yP ~&O 3SY5 nBsSooobkMc|An%,f⳿|+ u=gUl[险4 \]_`g'k0ѡқsYÐlt`W|ZmdZ,xFm<Ǝo*GhQH# |v(~I  j$]C endstream endobj 239 0 obj 1381 endobj 250 0 obj <> stream x=hI]\ WB[8C\\X‚"E)WW&+"E@)\lb["5ZW$+!Ȼݙg>V~FZ GP#\ERzO( re```%RŘPnwvOk_:y^~A79ӷg C( jE{avPԋ'ƽ~QYD_'T> >#n!#1K9TՓuK ~~4s Q˘&Ȱ7ę5h?7ƗKe:6tc'xVٮnqߪ6}+%Ja}q [¾v?~IU9 H}I}Q ?苜rS2p4A%Yic[N2-Tn]aʻ^=cS^Wg-M`eT M2n%?WnײUI%Z_W >JGS)[*'gA]ӈn&e26Qw{rʃ>|C'zlBys8@k72dX_v$7E,`3ePnt^ݭV HK;RT*f<`9. L;LZh[: /9ٹ 5)-pjq$,;g?6uKuɱ㙱G̓͝RPp-^wR%Tzn9*۵5CIvu^5cLR]~Qq?Lsfp_нA_3-`ض[oڮ-/~>>e2H[~$ ^ȐJTtb/c󹓔DZ K-Z)2Erw =!N[׶vY.D= N7x&ntN8==|ovq[ǹwIS=dϷI-i;YR~vNs*GI1%!DdXr^}:!`4v9d IjH2['jK'Gfqkkꉗ3@GG`lGy>[PCQGHtJY0]'}5M1-3WM쨧9ER&C7u%mͽҡ?R}.ZŸ߷eLpG\xaHh3e^7 cXBCN2?p@o=iw:]_7sx0 %jPW~yr^.vyWfnQx)ވhL;Ko|?8maw# ^j2IdW*;Pz#D޼uutb.i98BsP긑c7ʱr:Z'ǕcUq?Oo/O3;K\#canc& ; j=LUEaC[-brh;rD/t !$_B B B B B B B B B B B B B B B B B B j>c``Ux "b=000pspeD4_PBH---Kڢ@H>-KBVvϛ\ i>j67Ĥ[pRxTyBW[Y t[wjei:|rωlni=imnnb/RG/O8޺R++Am[>76>qNP(To~AFeR?kfUCamz}1>B&?}84!/OuPCy8eօ0?'-|Ɓ.RǞ?S$dUCvqc >[PyQuƃ(aL݈u[ހ7Rܢz®h%) - X$(ۻJ:zjlp'`X-k?߅EggW)nbpT_tg%=ߒU BV1QzeyN8$:-@h~TOw a|o[drß8&1O[0`AEX`TEϥ0U[$K7=|, Y-YEJ"-deX~NAPغF죢,nAR8#vqp=?98HS[p=@nY*2-KBVe[@? Y߹[p\BHޠf- t B -t !&[-sAM[rwz]?x[2ClyYjN_=PoU٫TIdq ]0Sɤ[閍6ZO[7zu:|bsωmWB߯cf="u i VL* 2gjuqY4:VpJl0YBP_D, E٫'-__n[P̚$C;S9E½nLyGw9QNIbw:yNq Q:/:.!Ӡt^N9>hpZ z& t˲.} F0#M5܂P-jB83tKnMg!d[o!t B -t !&[BL@-n[1Bbn!t B -y{ƢsAH>-ep>8p08~fo<=67?@u(/t 8_к2n! eޞbyBzIC ^4E|RŻqgQ;.2_,Cʋ[vv7  )o(6>#_et2 Ft dI_܂J#?#틨CEn%;dkKn%XBJaŸبZ+*1nb벧ql1%A}3ť[Lη wd_}w;/,#l E9^HP9 C@7nBF22Py͔=|t9o+Ui8$9G2yźrשب ƌwse n-)KƤV!3֐$4X--]t ɗy}*n16} ܔ,dY}o-?'JY2f}pR2dg^AU|zeo%ceBKkIA8#gbw\挽2#>'s#$}Nݲs4rs }槐zT t?Q(? !yA,-$t B -t !&[BL@-n[1Bbn!t B - _C95Dn[f]C`n 3Bm ߦr![}\ewG at t9k]q2:G9擬FIj%3n"!HWDTc}HS51NV;'!soHJ[泆[vZuM EsVy{;Lct 3Bg sdQq3~gtG Ԑy!xF薹!rפfBEƶ&](%B0HR[溆g9cSd&vy%^Oq>dZ9$5Dݲ5DMCh$ yZ4bah 3fn-5A\$tӃ'cJbh ij@oI:Ql$ZȭnYUTm/nY[YI-t !&[BL@-n[1Bbn!t B -Kqcn%*;?oټ[LRCkvP~47 }דG͍ to :z;[/)XB8v#a:/:((-m;_xMi<3D݂t[N_XTy[̹z5.Ba7LpeĤW  x Ay H$߬[ J%=HmB' Ӎs Z.4ĥz/_aM^ ń[{j5KmBޛ^t W_7VׇCCJZeKZQA>wwń[tH7]n4%pRx#JH&X$KALtWP(AȘn uDmxt|.o%%}l|}+4h|085B"Y٩4lH|FV-C-({2G%P>lE;}y:{..:W^|aBԽ'6N'$薹[Qfwe#0Ȁ#}8某\[E[vE3[RN-qq?!@ui{lTpC-jRř*6!Kb--'R.Ǐ~]"s^?'ωq?!@]n]{%InYo YI-t !&[BL@-n[1Bb%>5ݒB͡[BL@-n[1Bbn!tbݲVe>#ĥ[ _SZam}}BC\Wv*OÔ[w\W-> By%_+^AA5)q77.,8Y7MغG^Yڲhbm2BZ썰, wi㧍gI] QFA [Hz'Dz!H* YHA qS dFiَFm2BoبUvC-65 o-K,}c)66Z,_-B% me:tJxhm`PPܸb=ElS%a g5TrLvur^ h(-8JQtKD$v9qk= R٭貔-MUFsωПw-CBA]݋C4ԏ}Aiч-+Iu7$%LA DKj2B}mF96|H[JOFmq-+L=;.j_tZYO-# 5E> Эn ƼxEPe݋qQәoA؉ӗp:K(ejV|KRRK9EZnHJ*ꖤo dUs)8YxǗ1閅E@_#nĮ-' N&%v~ Ί[2~&%{%i9ؓb "';0@-q,Z/!,[/cJE],TҒV=s<+kɐ׻vSNϷWXKod -̇IS$6m[ŞTMmnʗ1PnIeѺ,w| -|ћ[[Piz[ѓѵB%-i3ť`i =W%vǁzhtwL='d>HS$6}ؤ~NtxEܺ1Pܘ(6NE%>'z[nKQ-sn!t B -t !&[BL@-n[1E```7f]V[!B1B1B1B1B1B1B1B1B1B1B1A[<0000\?x&q ÍC-WXF!fž endstream endobj 279 0 obj 8766 endobj 280 0 obj <> stream xA 0.aUYr`p endstream endobj 281 0 obj 136 endobj 283 0 obj <> stream xYn6)t!P-{X E l(Rds8iĖpoƪ{UwL?X}?/~xp=/=s^am8`-.^E7֧} OTUSG/ӹsxz<=pMkݟ?i48+`oSՒ|ta' @7Haj1,TE s -w2ʒ5U|U#M 0 #="&9{JlDm!jdnnL(86 vk9Dn k-A&X/XVF3x`65foLa ?rӰzr3 VSY'D{i=RV>{1ES(tb7"ǝ uv3d 5Gyi1WKbInb1Cmzn y֍iFVY:ʹ^oB`LqMvКd:H#&9LS;ufi-y0\&R4;B* D)p%t>H[f5Y)N6ۍ4O椩XX)7 A&xb0P+~CC+Ӝ94fiRTS@O/dO~|ku%DdT#؆?d endstream endobj 284 0 obj 1460 endobj 305 0 obj <> stream x=h\3t:x^7С 1xƒ1xC jL`2!w(C]PL:! uȠ:hȢ>:,KOlIssSTHsVL)N&7惰?7d#aO!ɛl!'~` ľN&gZ((B 佬9mVʕq^:ׯN}b2y̡O=@ϿcO=QT]գ:j)*ӒɛEa#.zc+檉*/65aOK&oo;+`>_?LR2ۮׄҩ^e=ђy|X+L{3'ՎjIl"]7]ʟ0j;SSu kL歅G[{zf36 (/jYN7#uI)1I^7QPj*e:O8AoCչSP`3]!K|h}!^-`*i!BVhq)' 9; ~샀䎘A}u)sW1C^o:!E-}dH71`e Mg6?sCXޏa̼XK?8Y3^]UhW¸:BryIf,{Nc];a ~߅l7W%y`| PجHUPc8_X?&رh6-*/T^ S' bUsjy`wjOy*JRԾO o!$TI1͸;55o c\{ =.NjӼd%^{Fy{7ljضX' }PiPr\ İƀm}V/ 12҉F޿&xjN<}gtTD}>O-+|\@dtEceJ'};spf]N>\$䅝zr<s&Dy8cnz)}ךjfTqfe~%>{kov4)іgs/zXKaH7xumm|O [<ֻ?5fU6+x*m5>h=`AΣ <謊ڠN>uZD;.uPqwf.j֢;vdޓn*A.+7AK,0F/g.J~Up{ o75O@:$țl Cǧ~`?y> v2yuίc-;L^Cd{,eM'H'\ejygg[ri3͕x<\ m_rtТXbcՃ*tɻ[[ԍ?w-R[x %jy#ǎOpmxs*.*KkUw2~' >ʝʯ%黔|zf\ۦ뢠'o_V6rHAhraUH]v\KLlbVTA8 XƐܙs\0eƆ\7]!むaedѭ!yIeױݻ¡Sbҏ>.=6j'u hɞ}#@qؘ=boFA;}[x|$K*i1BֵVUm!cy߽b+J`Z.w>wv:# 1˰KlmWk8@`q^,-NGpriש\1]'[A. :;~ =q΋"}6&Tn7\ejG55 *[B7k_\=|c\3*r4|a2ȼOC'"sF:᲻*jE d2-h.W=1V=ĭ!WaL#坧_V,ݱE*E5ñ/ []KS(bŞpE'?rx5 'Ly ]Nߪt8~݆)>$}]IS\E/ r~2Dj'l?ɤ *VW)lGuaԲPMum8FEstwĆBvHeli)i~pSzyWS<چ'Ȧ\-uܩ)va߃ )Wex SV1=86LZuʻ$a )Wex SVk$O¾YѠ\QVN LuJ3M$RtDHQxok%_&mU*Ouی`N^v(Ъ:Ր=W+KQk7GohzwPUg_$6bcm# ;z(ΧQ@ ~D'(4OSYX*=7ӻh奄:e7aVw8Atݛ\^̊tj~UBhqxߏF YP!4 󎍍 _c&4'L<6z_߉uc.'uskǵ:s빎ͷM 3iPG `pN"#Dw):"Ix'#Dw):Z?9sƬv:^A>%qO?|gpΧ]EZ; jLk;|nӿLHu/xZ|#k5# zN޻_7;=a>|Px0 =V<:ջ/OZ<r? y 3(e1;UnNmmbYJkIB;Vyhr%V,-xj&/;#»SXO~GPqn& oH?5{}k{{;<_BaKBƬ)B g*Dcd0,MwS[=iI WhɗI*јϣ^t׏tuXHx'#Dw):"Ix'#Dz{wLRR;g[XL)Or^߻] »u5.D%_&+^o D&{a/g~[mQ%[_TB1'E9X[#>En:,T,;( $n7)jk'#Ms7a>O>kWIc ;Fv~G13A^_)=R/&Eh<cwsI8稭w-dC ;c)?؝۰> stream x @%K0VsN^ > endstream endobj 330 0 obj 79 endobj 287 0 obj <> stream x=H#ǧ)na)nqxo- `)Ha€ ",- B,XB[LOa3d2d1ɬAy>oΜ.Bdd0^g9Y(L+âL5FF s[>EsJ{ ugmQ[|V*[z9|ovX~:ͥIxzp3]lҺmu;*X~^lҙ[qaOz㴑Δcyrݖl̬mC3 *,?+[7o|`Rmn7g6TE[JR,U7fZJ\H׹CmgyBW+O<[F/UǾ\l|1s{wgeqb~݁@jůmAot*L%aF,fD e]Ύm-OLh]z?Eb5Q$]@ -GY߾rbYIIUjX)Tp>6* En]㡴&HH5 ] W(otj6o(gת{S|Κ.|Uۘ%$-ũ}X2k=n{ζp;h6BV/+l& ťSӳXoqqtCUc1rgW~x&: V 쇷MDιK(m9!ő6u ?[Ǯ;y5*Ŀd]\7huKX>|eV,|eZ%V僛AfWS涰Vւ[PFgkMcq50V>[D|5I{Cݏ[Zɭ,=ۢ\)'SYyMVZtz%]+Z%xd YljS~,,hֽȰJlG2gG9zze6e} L^}&˭xܶ <+=5 A8QnnĢ|r9C m2_/DԫfUMdFۉڈB,p޼טqϷp|V;8;;q\!cgVn:v.uxb)[q L', ;ȩr {Fx[ ZAG[nTcGb~Tj5hn7>{qkbޒVd,ė*LO\6kF?Mڸ.Vtb |=4{4ҥ80[a&I۫1QVaF4:@Y(i;l۟۵A+tnOei[׭ӳ~]|3qg_[z(5&PUZ4ߊ~pʺtLGAjh88{"-G2Iʞf(`U?|\ ]gL-:dz=v.#giЦ7ZQ }g.o*S7y5 ֿpqyqU[ rkzNÉ^F?!n̪m/ֳ▌OF6<-j:4ǒp%Q-)"nIaqK [REܒ(F0%Q.dd4@Jh dd辙[ #W [RDܒ(F0%QԤ~i]g4Jet{O3vqqQTgoRx=M_X{p~oܜsO>~3s9?7nι=;=sNf"?D"o &mO{{p¿/ M˽.UU,|R QkDӾ_:W->'3wml ł#{{X(_0~(6 C'OidovJ)۞xn-h ?8ؼn`18 #8n[IKy(3_(C'AE*뎥 mHM/ב`oaAq~f xSQv=FɅ @T[t"7&)qW7EeClo?VF?z|".4RnLKp4!,Vgu*0X`#}U 4L ?[yv2b %~2]8ďۀ R8@p t[w1|pEEg{KUn{q2##; LU< e)Im?_@z,i1?c&q;=_m11uCFO}BSl"yq="A)vb:;1}[q[Ů+P?##6nF/#F͂]ӗsJ׃Gn#GJ7Pq;m-}40ð`gEMU1]_]`;H]|'A;:ENY4+wgn{U/ZD-*LkP)ݭ-)K|'$ViV?[NJ_E7}C,+3bvZD20%Q-)"nIaqK [REܒ(F0%Q-)"nIaqK [REܒ(F0%Q-)hn[*(dd4@>[ ]2 Zh-4+0%Q-)"nIaqK [REܒ(F0%Q蒑ͯzpKF6fbs.%# V` endstream endobj 331 0 obj 4187 endobj 332 0 obj <> stream xA0 7ͪ}(IE^1 endstream endobj 333 0 obj 67 endobj 335 0 obj <> stream xYj$7}sRI*f{z>,0n6OuK=RmǣiE՟'>?Z9s;Odz}z~>\ iXemOtx A]= a`v&?"vGoO =Юlpp!} @|Sba]ۚKG]0aaZ0[nj3FpV,7H7S> stream x?H;:wx `AZ`)8HqPB]8Hp A;8dp w9Ic56IዤO9=RH[m>ߣ .,WUo+]2[ Flmfb`|V{²6A"kඵdCZhKvQڞw_cE+* Ln 8}mh[ł_k{ۭlU!_Fn)#128}m'Futr+`x ʦ,,1XYƏ%XlHSe[rKޖw:QvZZ,ojܶXX( eqe\Q-YbշOiRNvAQkO1x{jᶶuy r!{эX>Pg{߀c~ǜ4;(Qy_ւ)(s,W|YrҟH))*s'q5['%?sGA:a;5j&h<;CLpkZՙa]N˟wj;`^>K?r<8+~/fJy bǪΛ0@:\wL\u׸ay=ºUu7>r'g0*NÐ8'\j#/ :\G⺝F1A ~I,/Ozo\~M~[Ϋ;'R?1'l/ [z0;vnAU ; UH6N5^89Jko,s[V=VfͶyc5Wzez-%CW "nkTQ N0kjdٓ׶җسh^'_?ohL,50"a!ĥ]᝷1ZX? a+j=P 7;M5lK}eW,NRASPj \Zj@Qn|8mZ w:TH 9;օ. 1 ƫz]:#MR;K*uN';#@0~Tr~9_ɃpMd+ ص;+an)(pBeѺ$q'lٗoz Z< 8zg[)ҘDfMI#=_%uAۆN|0\bG:ϋZD}F/uVhuA=}[<m Yw\0`;V GPfȪ Ś[l}Of#)vb[Kfv]'˲r\qYj[uxhUz/9hKS7hfJX5޴+{o_ ٵ6T0hҼdT#B}cy1p3R\ۭ0Qef^W ~[3e9ykk/_N2ZVROx7BVfkܪnU-]ͬ= C\3-0@7mpOzjL*V%l̞B^5m->pʟ y[Vi鷕CُfqT0YaFwnjP[uTa7Tť\j4 k;$;sOZ-Gzy2fʴS%[~z*Ga۠@Lm+ ӐKjQ(4ZB: Vi|;lu'W!~No=q %Xi,k ~ Ȳf&yy_u}0JSϭ٥}W(zOڍc_P ܶٹgU|vɒA{ :@:OBxxW嬱?~jԝ Bܵi]sOb7s`UlڵXn@vzNL0kv[ty_?ViYic~^~_oJM':i+F򃿅]ԗFlyGhl8^vQ_ &Vmۏ(m ̦PaLօ<*ڊ1Q 5oc``xc%D$fpaV?h+ h+ h+ h+ h+ h+ h+ h+ h+ h+ h+ h+ _VJΨOLk-vQ*$.|q[Aڊ8Vr6g;bh+m U"sG mMr,ʹ;f+o"Yi޶fWP[AH$s##žI{&ts+RP~Pkx`+x_ oXefo)-N1+mC(y'-#>m{R~<X(B7Cp&C[JDz)ѻ2}(RHMKUL&o]!LQV6+t,半crd~dd*< ^+e vP, UWwh+2m%O]z.%x轨Wwߐ-fR`cP, Rec5a\a+jG2 e@}Rw%In]`kcQsKA3=;6NJy[k:n0-[+o-[=umWOʯoX <4GSW,gg[ { V7.ضv:<{eH. ܶy%AEsٶaڄJ>'l':nؓ²U0ƑmaPx!2/eC[#mEFڊm 9h+5rV$ hk䠭H@A["A[#+*iCRaEmT1FD2@[1wePq$R4Q 2 T>V=až6Q9BQ2Fp+0wﻬ?T-oa2~)<ʭmMX3-gbkFyߴq6Zfmk+0|qH(-8h|45LܶDU>hy бroWl݆*t޴s3_[ݱU>R{I~SBho4߆.ru 1~G}4tPԘz[=-A+B[! EW @[Äٺ@Giz)ѻ2}(RHMKUL&o]A-yaر5\[!*O>H.uS`xmX[Zm'ײz0&rA]VmV3r`D :}afuJ }Hyӷjl>2߯j[a Tlo%#Yi<&[!{2=Oл;Q] r;z\[ ]=RQZsXV q!([xARV73Z|6ahgg@4m f^Z^$U9{nm@&YOʡl=zv2[ǽS/{&>pٳl=RVZ23&L~alV# =o j!:KP>i H0ګ ,AvB=NГ&|ЈLn0j$NBhn&Rێ\munjd%%W/h5L,[mu Ʒmu n#xn0A[֏ ڊ~5L;-A[ײ~GDH@[8A[8A[8A[83gD ڊęq5e|hmE[DiOCT ^HiCYM`A 4 Qւ"qfV>TWCH d޶ȃJzoNc\OX2WHqlgb{x[C[Ookv!"W[{\zsf&7u=v7n07L⚇'f`$l,3ff}O"o-Sz„@&RT7x24?tf G̷?{ s=a*|b<o]ټl\OX`8(W(E>1Cl= ]Y?,C^OvҒIHnV$m5%gfc/ot!H2o%NϐG6L%]+05h+g>jF-MnCY- 9Q"q1mE mE mE mE mE mE 8 VVj b+F,m+lc``9@UJ)w#ҹ endstream endobj 393 0 obj 6089 endobj 394 0 obj <> stream xA @.!Sд eܒqU endstream endobj 395 0 obj 87 endobj 368 0 obj <> stream x/h#~b+&+"~O#>+V(eb*ZXab&FQЉA'bA'd+&"k99i&m׮iwnyiryΟW<֌R*hhq2:lgR48'mq.ACVvl49Ca9-.Z~S7jbrX)t3pth۽R,L,'g,sdn.iWwx+y3Ӻ]Q/T1ϛ~-] 41;vhyҸh.[Zy_p]x}Xa l6!9UMHjh$Sd ۼ?97 $|/) wvW;Tr=EM1Zrqj=^8ލYVJZi^BhO3E xȞ7t>^zA,]Xag^&zH okä1QkJG`m@5׃*Go v=쩻j|d7N GŎvtYS~]xoŰW7@pxOJmr$* Rf~p.Eb(yVOutl`/2@KlΚ܅?ayc1/^ۭ{{wU#΃[NdxKYhܰj`!6Dzrf^Cҹ]2j CpYTC=[| 9",`';`vL5ޱ@]Pu~l nk,3y8nQg7e[v)Ҿ+^U|3-S:pnlwa[,{~ G%K h&6;{M!]lV9=xkg;lf _ 8 G=)Ba5lS6=wyks OoLg`\FyL;ޜh=6.[$mu{)l{u .%򗊺QneY@f.&s`[<*IC!r;Y;'WT[B7}_,yw"'' 1 ds[:el^f%vr,ޕsuD/3-ϾxߏO/.ƻgJF]Р w`&9,x2`'7NIxê*sO=zye~09--=6MvXpNs' +:g[)`fբ`aAe?oA>oY9wYpgx~G oj%|nvjUfҙV+$vsowIQު]ڍ[n ǖ[1|oH[wn x {ay= iwU-3ȽɤNś[dSs暑ߌ}<>Z{Wy 6ov"T,~ś=Mv0c861 X`ۼ7J;%|;խF堢hJr$<ײ<p"d /^Y;Цfxp!n+f(Q/>+ơߵVw'ٹGioF+hw6!\xCɵ@[4c~3J2} [8R6;ހ(ۺf$ vrw]^ijoՔvK|{_$s9j{_?~# 8 Gd{.-hm~$0tv=QY~?^G-(~61F}Z9_3. mvaP,s J$!ـox[_!K@x_D$yk{WbBH{xoI {xFa?.Y8o@XLN7o5!;!)xCf' 8]_>!Hdm狺ooo!"ߞ+9aeʥ"GőxO9Z!W W6mh To78Uz=2o/FBxCZR^6Z-|26fON|ܰIxC9 s7۶4sY}#HLh!\8B#-ȅx#;r!\8B#-ȅx#;r!\8B#-ȅx#;r!hxY~-S&Cm|}oqlJi\sp/^"Brs$O'Lъs•Ig$BdդfBg .i=' !qRxkުDjH@v;kƾ<U@.xLjжJ_3JX!1N;f>9-z}Tȭl~UeM'd9ZЎ|񎙖rk Uޯ -C췟='u(彜}BѲ<7i[Ok~#kLYX{Nl;78 '[- vHNb +<P|KK>SD$P&C^HR2_8ZV}F$4I^X@^t8iKfQ%xҳ1]M( ^X|! 6r!\8B#-ȅx#;r!\8]ƒ 5"S7*BQ1⍊oTxbx;<o4oFC۔R9Z O endstream endobj 396 0 obj 4480 endobj 397 0 obj <> stream x0 7ꢽ#Q+ ymp@c> endstream endobj 398 0 obj 68 endobj 400 0 obj <> stream xYn8 }>8)Q2>hmX/mKbAfCF/B )azӡpZux*&:<|~||txt9?a-?ÀBIq&l5LБ ]Hd@ ]@ x}?pt^a:62li䵪#A I`G07[AP_Yg5^A; i2ω]ct+s%&#@0b7$_7@Q11MX]iNg=Qs47 MCxmi6߹663mXRoZ7am%TQTXno㞫ڬy\%[UN9׎\ޒo,mS_YTlrbBQ7]C$mQsJ̮&+3L YϮM,)'V zZ 3^߼`t|~!1_(1l@,$ tJ8-hoImWڙeqfY7,%O ą@\<\xJ?,zLTsȢhC+P.GA~A9P5?"ՓB<%g1)PFSFt: z˼~̚;TqٙgۍFOK.3-ŇpgtP\(y䜷dEF=FGP i-"nV>|UT -6Mb+{J1-"wGT5iy᪮ơ1Uևg#1kʼm D)LvF:5*d{( 0Sާ@ J+ak~V-Z8~RbǐhEbA> s<'Ut֗-o2ۨwy߆En% OWH[2=2ZX".kPuY)G֨)GxﶖrO\x+n{Vh՜⛃*K1}$K*2]ě0 "&@o^ O,F,/JuI]x}[rR}1i*,=Υ6pjR=D(> stream x읿ZiRJVH E ݎ* -tH2/}&i4 C5Ư험$lo `藝l/d24Fb3Ah4 ) {+5zs$I$z]F;2GC#h\7%٫ -fYH$I2 DbZ}-:ޣ~捯o_nYD][tBc{Ű^7ɳbF|K߉Z6ps?uY΍Y$a>$jQ W40&-^xEwpTUWDzHoGja$I2QL}^0_$ILOI$I< I$I|Wia:NuZX $I$I`t:=.&I$ɸH-Ltz\N-L$IqZNZ$I$"0Nq90I$IEja:Nrja$It:N$I$T [VOK=ډ1طNgeؖi9Jfl }[$Ijad7$;J21طNfN;U'NS $I4EG%1it)?Tha3Niᛢ}av7$I'diawR zᖴ.F0nQKZzo.LS[]уք _â0b<iwa]xfcǞ9 bda<4]Sƭ'y /?ؚٵ5<6\O-L$y[ QׄW Rp ?TQuօ"RpCo>TKV@20R)>{ >2n6 xU{Yjؠ]fաZg}aY Ģb;t:~Z(YE2J>'/&օTVS\nur)-,e!_C S~>Vkj¿Ο1G_uR>$I'θ0s}I͋sz{WEow.kfED:-UVڷڕਧԠ|@ wͮj75ccCSŵ@ /,)~)VUe]NOŠ3_քy!DNLrO~;;+HvQOea{f#;:hWZC~_ yoqouccZk^XV TJ &I:WօS $I:a]wX.LgUsnS $I:T N,YS±v0_$IyZz%W(MP=co+:NT [C}+%͡F$yr;W|];XdpCE&I<T .1sTKwuBVZ&DhW}^RD~n8wꪸ7Dv8օt:=7J20h}yiҿ%lW/_ȣ' 7~6Ƶb,| [ ,E`~pF-L$yI 1'~˯7ڏqk =ێT6MS[kp]vz,e4q]Յ1f̘qcuCkaeoOԅ­WUjWia |"-Lª#k*F L{M$ydr}ia<'HQF\]D[~%+;zެ8>1J-<귪{벮.F$ :mm{-0r?MY+w- uah]و-iFM=$:3a2?X$I 7ʅZx[ /?FR^#Gsq4-hadH 3;_ȣ[ԹKZ؛y% r{cH$SAwcZp ] ЧެcT*V}pD;Wul>e1qT! v4V%Z8u7^Mjaj#pdm#sg#/–9:]ϺSoady `5]Ci#XS*~ik+ߪ*.~. y_ȹrVZS90q;H¶%$Z8",ud]xWByHgȒ!-.25ȍ82=tpc"un#V.*Zx8EWqCb~)E15TmI2ɴG ˔>R F U+غj,,i>PjMtȼ nͅ-_k5mRXfᙫP /XﺥFCG$O-Yޕ.:ooQK_/ias|GmԳxIXYf҇P5W.+ odICz#:j5da'мqcVWkKja|>R]8WZZ p;jiJ {Spe]X[2ޏP [1;N=J-lM²ۓKWy-6ž/5))-e]X~PȩBA $L:{$-ƫɺd]DˆG,)/.gpB;ƌ3Nx|L-lNД/奭 ]nh\E!2vId*-|W{¥O%'ZZFVZJ++o;:/EYʠo? ߂h+NN{ǘ1c '^L7R}:‰pCnSwKUk?jjbU1>c){ypId*h͎X @7`ZCԅ7}@b5 fG& Q]W*@ [K뚮ַ®/pTArDOI)p2;ƌ3NxO~j_,L+5]Sq}֛h+Xyo_Jܵqp-1cƌo<DGCh0ʬض;z'QnJ%W窢e]]89cƌ'9V)Z8l.Ky @£Q/~.[V]i45L6Tֶ5$Ir{I [u5:N?9&"0IxZxugkۿ}tN-LnEja$L0»ua:N?S [Z$ILdb>%irvMF h1~1nۃ ľ$XzAZX~q B [ūoH<_fZx-I-L-LޱWGriGU>LdbiXxuR ߍU4EugyLI-L-Lt.|;h܎ٿmd+=[.UJ"XQTힽ8[q8͚x_s] >˹r|l*[/2wY0G8rw]4~5 K+"uPr}7 y$%]q$-|gꦑUlL,;RpS]U PcYҚY{\J¿:[{lC{vn;o }l4.XO]jFL>mֱVUU\\Tu<4=AeL V"}ZLgtY.oQb-Is^իSe= vzV 2]s0q/ m>ز2w#H떫 =ՋbCԅ7}@b5 J 6>䣞PRZjQm0vvds˺/{`E1 |ltSy?BW bd«dq?:42=W/ dpk> DUT]ZH*nK0υvkc$Hi௣RGYL1a ϋY^) ̛zLj[O v q}m]k׃ڱdWꦩF0ghXĻ-l[.^emՋs!PJ*-XU 1_(-lj;f]l]㴮A:Qo ߻kh`MﺅQI1P{z>PjEpB;4/N/Kfҡbl%tVqOU,~ZX~mw uR]8WSj[Ljh1ȇ!o3fyJJ-|k-˭hTfLnZ_a-¥?S1w0KšZxbF[Ldb)?"-qD|RGkh>@2 I2ɔfG0źpN? &χ-j9$In&0}+g]xm~N-LnMZ]N2I$I|S]xf~ɺ0NߓS [q/ 7,}*asU*8‘?xWR $'R ӷua&DYr<^Q>5],iͬ-G؁'55`+ƥ.Lփd@\C,w 1LjͻR0DrT-ok# +-y^ZAΟNKUpm荖(Tma [ߪzSf'_ $NshnJ- 3o9X0bV~M_O Rp4\w[ߠ(1rT#>DZo t/}k?jjbU1Լϗ5 vz +E cGHL2"U">gvj)AH - d^,vbR >i2-*-l?PQ]W*@ [KczE-=Ys.ξ"eX&Ir#!gJ-O!|ԋ~:.G$J9A:_ ##B0byU!>>+-s;zެ0^ZBrG]Tg]NȽN_rjar+nrS 1 {}ο/ ,UFN߅#+-l&򫐅IxC k*bB ?'RpTk~ICkaU{t“͈qV̲aV-Vw}.:rBcFpT#v| }˾2㸞 t:N-LZvÌ|6շPՅڟ]#})!.ζN vGJ-,G{EG8o $In&+^FefSraf5[Fօtf&ua=+2~$l:^͌wJja$7ua~}.|=ON̾s)XGօtf&u3&0Iɺ0}'t:}S %0 i}Y`=_dNGVJre}w4ƌ^۾jhLKX T+VMkv':&ɽiq3$.O y&`n$yP¥OuZP9_Y[b.ljAogŒ!Ej7%p!wzaY uM^[Q g&V_.s+_k?2+-˩ʔTG|^aI¬ SJ S1zylqύN? #m!Kbqt Fp!ԅ#\Di4ʰ Zx> u7:S]x'63Ko=7I0"-ᢑ,C_pUKeah^,=ZՅI2E QLTJ2$̍$]8Xº$ Ϟ¶U7BX@K~<:-|đ֟}#H kaJQ]a]XuYZo*'Y .LO?3R!z:}׿~vPQ]z31_*pA^?%-3fUOR5i :&ɽ.<˚ӍV$y>һZ0zq6xCS y]Z$NUv}7^}Ki!d-̺0N»0I$/R jI¬ tzu]Z$Iw$kaօt:=]κF-L$I»Z0tzpe~ܢ ɍ{m j$w>LXʞjMj=f_D}o'oYh*h8}]Jj]-ZuazJYYUjىau]Z$ҧRß8:/ܵg4Up}Q 4pwa_RS\ī}WڞU8]U{dg尷|!n_)U~k/Et';ۯ/zV.+QKYty~laq 3pB~w fu6nrתte{+K»Z0:>ЊJ|#!"Ƈ-#3yp=@4Zc}a8Գpda\?SH*-ZWSv+Űu&Ff/|U[>jEH-#j;lFF.ܢ-FeVx>٪g +Zk,r{b|tv=w;;k5U,*9Y^XbκF-L{'0>푃CRpe4f^GqRZ2!t](>aFzjp,\cKבQ٭{6\ǠVJ }F\5$ L#Ţ*5cʚҡyFѷP7֯WK !d-̺0=,)(S)hv v׳O0FקCee JQѼo£(\A[X gyq1{VrH"Ѻ|3Wq4gyԶTGTQC_^`(0ӳ|`;;+pT_|wZbκF-L{纺ytUJ zQB=¡=o*y-Db$ -,,J=+ A# {׍jNa9_^\#| 3TW#bqѕꘌEsCi+م-\V)ֹ OV#w$kaօ)HT%\@$t)+cy:0#CњYHWϹB 0BjJ-N9ũ:i4gpU.}-SןދumW-x:GHp5ZXV?UH |g}K-r^u]Z$΅VP:^WMcP5 | FVȩj e| #DB /M+/1U|boEpt/~.)f۠qt/~DIa5R\sIA/4fk]ܐgfC]SDYTZxg痸.}ciu뵼ĕR|A-%Y .L'БJ Ĝu]Z$gy15#d-̺0(U٨j>ag]xW&I$Ej]-Zua:NO.Q $I"d-̺0NYըI$}ZxWKf]N j$IH-%Y .Lrօw5ja$Ir_ՒYt9»0I$/R jI¬ tzu]Z$Iw$kaօt:=]κF-L]G_zCooYہ<&w$kaօ'jW˼dgA,|T+i,da4u]Z$y-\*?y.yᖾ/-Э\EZzHVtrYV咣O綃EQzOEwô%8p j$yP.ԅîޔBueu *""v$85ڠ~ݾk#8\7չ! Z8h EgAjRZVK,}ٱt$٨N,ӊzn   թρ»Z0- Z";Zgey-4g7[Y$ց1@R$.%[oE:*ժ554.,>,<~h^TYըI\q+- Stuﺅ ݕ  PPh2Z^5Uyy,ԅE\*~v]wn;jYZ!Pwz4){N,e||\t0T<|hpK-|VκF-L$I»Z0t:.g]xW&I$Ej]-Zua:NO.Q $I"d-̺0䛅gAYըI2~\ˈی 1|-w$kaօg}Me=:MκF-L1s>Tp]H]YH-%Y .L? wb$S}Ftu]Z$۬ՄЄhIMIHrwR jI¬ OY[H,BTJg]xW&89̉ WC9|KHrwR jI¬ O'B7\k3َ}vt+u]Z$A@LGX5ѫ~N.!\}xM׳~k~O[/#9Hօ$דZxWK.lM,ѩbb=XI㕿TfF 3ρguVf^#/&1@>O{i7Šw{.3Ώ#cϸ3V:qAo-օw4jy"r~DJ+JI瑩aM\gYvvG?Y Tt4zƫV~SD-%Y ^Yܙja.竅p/YqVW؊xL Yɺ|coXը$#}|+Wn@ IiumqxV^^ R ^3 >@0WCϊZxWK.&AT0#ݟV#q'_?'M}3vxOYNX YӫB-<:|0^}aMC/e'n<YL; [#g-pk兘\lC2^ ΁䰉Сl3hO^ {Cprb{Oeg˥Ѷ =ko('8L߳.(;m-d8UnPtncO60lXY1n0+z{J{&p,ZuH +7/ja?=(nVc>Wj>}wgZxs]sX,a֑YX92&#A0ߢ{tx@?cg]8QvZx.,-\Zq'Noѳ/wyњ_rpk 3-)7F8l GJzL-B BLFǤ|ݐeƟn>I-(KW]X6ZXՅ=0q@osظ`ѳФiu3yZbw,*7-ZSZXthaӃ;KӾgFhW=5vLms.(;m-ªe-a>6 NNM ~{WtYcF̸Zes ϛ‰$kiﵣ>{l\C t22#jawZ*'+UF8͌[kW.3[I 'N[ u͆7, =(◒[jTt챃vfdfz!g<[FjkOl hK!O&3v 6bտ"YtVX辵/UrO6pJ֥ޕb9NjDYo-3gȺX.~|'H7rP,fyRp!ge‡מ,m" }jtV޵WG zf{s_ط.sN53~SA 'NX Kdωd -y0(mc52 ( O‰$kX#-us|笈tB]0<2:uDþLmpyX^v{gdN%Y X!W/Յ0#Z~κpZxaH7IPaG±$R 'ʒ 7QtΊpyd:cja 94uMwqײu0 j KT~]XDG~g̻Jı1{zg]xW&I$Ej]-Zu0N-օw4ja$Ir_Ւc t:κF-L$I»Z0t:.g]xW&I$Ej]-Zuazz]urI/u]Z$N^ <7.w$ktL3zr'>qϼźF-L{'Ni"y~kBj]-ZuazJZ< .Q ha? ZDda43+_zSpCϖ R %Y .LOZ8\ lظɩxp=5uyܛImiYNQ jaU$YxdZ*6f}vO{E'a S ޒYԩ_YVFfpcu0IR ǭKdג=_JJ3o;cݻ~]Ƽ7UVcIy.p-ZuazJ]ʓURb)փkg+ߪA;X\D >"|ߏJN]f]8F-L{gLSoI¬ Sh օSo$w*-Ne2fZ,ZuazJ]iawJ<YNQ i(&ƧS %Y .LOZx`G'њ.z&ɽ3s%{&3f;i$kaօ)uja8,օn$wZ^gZ2f|:I#R jI¬ *cƇU NXѨI$}E-%Y .Lrօw5ja$Ir_Ւ[ tzu]Z$Iw$kaօt:=]κF-L$I»Z0t:.g]xW&C8GV ɃzϓZxWKf]RG g]$Gߟ9»0I8;BIH-R-ZuazJ?KV"O)7ja;0}H-%Y .LOZ__~N$;}0IWfI [j(4R ߒYC-2 g1xc>.'?<Z8d-̺0=.w?u\axše!Zn}||0|b{wc8 M[8}=a]8F-L{7aŬ.Կ^+H&+U^4ol[a{o=s& X0z-zEV\\A(&G{{A tpzҚ0sG0i7ja;C-,O5}ꊛbs (弧=EO_YkUlrMs#L\kf>sS ޒYC-M̊\INsΟ2}HdiYXjachN/_K1©7ja;絰?1mFb}0wWjZX; ۻ.pI#R jI¬ SR ?,M] 3add:~⛌ݫ8¥%(_J_ ^o6T3q Q;y6i7ja;~Y]I2̈fUL:juZX׃kgk _Y<?EFEZ8d-̺0=jaEt+|=#,2l$s z.ͺpڍZ$P O^ gZoO$ p-ZuazJ]iawܩG#0i7ja;Ƈ{ǘ!bj$kaօ)ujahZu0I=@7 c{1p-ZuazJ=]Ipfi7ja;#-Tc{P ݒY͡"KgH`كYըIQ}»Z0t:.g]xW&I$Ej]-Zua:NO.Q $I"d-̺0NYըI$}ZxWKf]N j$IH-%Y .Lr5rv94_I$"~WQmmօt:N˩I$I2..Ltz\N-L$Iqua:Nrja$I t:S $Id\d]NZ$I$"t:N$I$Yt:=.&I$ɸȺ0Nqy5buH$I;+^-b]>I$IuMG"N9*h4F;9l.,ۂFh;Hs4Fb/օi4v-]Y֭`岒{A23v24Fvص]S[2\>P=0F%RZFV|M5/eH7o=!G,Zcy.ka+.kW2^U ~)0W$pq>gޛbNV,-/c8¹Fƛ2wzho6"vh4,uawiEF~q;h48~u])R*Shޙ%w}TfВhZdƭy'8||+EپkG*=o Z= R˺jE_i+gerv=ҿ}\b*G~i;h48vbuj5= P~!vPOjO݅f8ŁigZ1B/ga(啋 d .]V#~q;h48~u]xi$(~Y=dz$Vԅu]6#da-B_b> oZH.; nK--ׅWnchYh4q,uFAUW~oWyaL_ƵLϮ ^uCQA#s̞^K^Ot.//ϲ8R S ^\VIg1zvK-vy56ŏ~Teh4,v-H/TM;i4XKi]͕7;k^/h4-}M0FRZh4,v-̺0FXh4-.] .Lh5օi4Fb¬ h4luaFص04F;[c]Fh,v-̺0FXh4-.] .Lh5օi4Fb¬ h4luaFص04F;[c]Fh,v-̺0FXh4-.] .Lh5օi4Fb¬ h4luaFص04F;[c]Fh,v-̺0FXh4-.] .Lh5օi4Fb¬ h4luaFص04F;[c]Fh,v-b]lS%I$S"`%Y ™z$I))xs.Ltz0I$I'c t:~N-L$Iqua:Nrja$II [[=3f̘1͡9ƮuMG$k$I<%v:ЊQ 4b?cIEn+n+ƌ`o_TH+BnOn+n+$c`R6_|@{t+ Vbuf IG&>UE̸D`'%/,5Kp! Ie":4v-ޮ.LͲәIGf [ m"0:.LͲIG3- ;{ »Յ>3?9˴Y*1ۊL ';g#ZTօg?wqm?xJ%g)3an)og.|*dej׍Lߝ~g#!m/ ӈe[ dw؝߁{s]Ouwgp2YZjly[ dw()Fo wِ'wB4f ܰG})OPgV40=eI؆L Oef&D Vb8w§Bjv*Jt`%:0.e*\VZWp? }aJU}P,B]V9K-*>u^^>"H$޿3/E-rSP 1vNRځUv>jsqWג 7r.lW׼Յw<3pz弾f}z:ul*AW֖TJz1kb|Nݶ*W+ʞֳVjӠ;;p^h_E-,w_絰ocW۷]uЧԑkޖk^I̧~sȤq^ dj qnuO/Korו竾<Ny`Zgo;YY4_w?ݕ;<094r+w8G/kҝN~[aגԏe[ ځb߀ {W;0`u3e=GvZ4F؁*\؁p:i8 طvF߰mO.7¿B>cQ=Z'` J;/8/~)7rrQa)5~5v]ӷTl+YP[Vd) (s;sFwUH #ib.=s^ SDoDZ \Rup3-J u"N~S -P?qk¾'WY3I2H/7lH;q[\uv|0$ۊ$}_ ۾N=rkIOmE~9žKi c5] Vc$'1cƌ?[\#S]8 g;I|3 I2H/_۫3'1cƌT V/Ζj OmE~.< rFi 3 gXY˱p[q[1fq"? ]n2uashnWۊۊ1cƱ晇Tv‚Fh[^bBpk1FhoP {2)nfGt4FB-]m$ j\(M$vQ+u)F.R ;CMJ#"_CHa@ȺCj?ZFg~gMNV]?jW]4#Y|;}1=TSR`s9݂kp D^S#^ }߮[hu㾠mI.=cJ/`{Zn {^)Iהxa#uaq=VdYo' NNOzݞq@p~6ׅmYX**?xHqQ@&ߏ8%^!ya?:PB{p\X#/la]8./ڧZbzY¹ ySⅩ T?U+URQwv!SB/ua ]R?LrsQnݾo_EM Gǩ67q: ׅquȷǍAyYoxoumJ wb. †h7y4 D׉ja06IvDl _`)X3z. [k 8^ip0^j!bxG1/A]K:כ%c &S)*fᤝm$w;d04=QᑯgO=٭ GV_T*Uϫ _].(xvV[|[q{ !VKBX!5?%^xpt32zq+y%^vL"\y'O 'E[֫Ц4' dawExKuy֔*ND=FRe)ԅÕUS4 yaS}mn'k֏V(GsARO@sz=aC ǝ%D<.QU 3{MFs+Wi臖xfGjsX\|eu8Vcuh&(L~azB}Nd8_,<ga?gvxTҙAg^YMoSP281=WLn+<'gǑP>=;F!y~F>fj^`CY5 /Jw4 jj# da& 6ޞFRLvPASuqQ!~_\M]8b\ 6רhNI#77]QtcYϤ?_q,;g68 gI'wٟX>/.q~X3WEܮ+y-շ. q"N_XR~i/[3"*(Jtf/,+PEQ4[:b^8.LAF0(کAamQEQԔR& SFQEQSJ]  L^EQEM)ua 0n׽vۇEQE-a"G,>bmfmïO ((n .((jJAa*((jJAa*((jJAa*((jJAa*((jJWyaEQE_ByaEQE_B8#?QEQ}19Wx endstream endobj 438 0 obj 25202 endobj 440 0 obj <> stream x͊1 y {%KaYH&B/^Y;MKHdvHIcvbS TiPrj>}>^߽_C|x8p$A_C!U2]Ig|;D2vA]gN>"\aW꒩q LpUe5tKdvLbOaॗ8CN;ncUd\͖nnk,tF36cIB'[Q(f[H:ta.6Iql:L!5>XN6[넋l-n+ᆬS"Zc6H;{WN:FMPM6;gy\B5vgslӸZ\]:#{jmM.Vղ\> stream xjA ~9@=0=K_'$)fű3+'iϔS^J ү/ӻcwq~|Y_ޟvRS?9}N7JN {irIǻt;vO/ /2Wk{X%\BpT%|I4%۪՟UA d9TV<+MnYfk_/VP zمb7P4 UWMw=d/wA,!dgy-[`euXኵGV#\{56)&xA&FEMD(Ah?z.HҌ49*{'M̢=z!X&yyN j}9~ >)WA+]:P1PiR:N[w~PicqMԇ27XU6?+4q?) w(t@7 LtcN^Aݲ go`W١mfŔaiuy\2b;bSbf@5k'J=\)U hZ*)MPlغ#6SQ6&`(a X]%2\*lԫk"mj+m'F Ei ?MЪyW[HML`L?sR@uIp(~V".ڍL.I+n#Rmn^"nfj[@ zf/uY50o;A)#n{ϤT3)To0l"bN^yeu I@dEû٣M|0xo8bal%>e%@m״:1ڴX)3L?A\iD) ܋ endstream endobj 508 0 obj 923 endobj 574 0 obj <> stream xm 0snfB $ _ ؋oċYff?Ƌ`pS]Uj!)~zSK]3B3CL:IxW%kʝrXˉ)ٰl4t$o1 endstream endobj 575 0 obj 155 endobj 580 0 obj <> stream xSKkQI >6aUۅ1"t!BZh0R(ty4YƅniWw⮂;7h74){swF ni }2(%I|bh) 0_y'_#X:FɷGLGג/8(YKNȷ9f5xf&nz8Ct+BD ZJ]d'҉KD%)JϛVj}bM1 ^?7WG?vaB b VY=X#݃6|Z k37v_ endstream endobj 581 0 obj 575 endobj 582 0 obj <> endobj 583 0 obj <> stream x]Ak0s=,Q7eC? & I1k[!Mt=u~`{L0zrKX" 8yRetD%Z7] Nm/_c)Arϳ/fFKix"Buyb%lhBUE($;a%YJzht~ڀ]I=WCܩm endstream endobj 584 0 obj <> endobj 585 0 obj <> stream x|x$-;cv2m۶mgm۶m7==OU{ލU$r4FƢ6N4 skgG[k}[)cSg_Dw 9;;uR2s8,F&NV#==8:pLl m m̍m z@ @JAEE_ acGsSc+[K$flc7i"鄨񿲥gg99q? Ells'Voutk'-ml]m$MB rin  b)P8__v'H.=ӆ(#جQ 3K{2CՐ7?Ǽ^ՆnOR9ï$6PW Q3P*[<etSX'٘S'j.1dhJ""r3:.+ )vD#0v;|S{dPusϪ%C؋W#w9=Qm* 3.;"E"2`ܰENk+du1CI#G ܑ+D>U^HCzaNg]AWCω==0oxOy D/>ia_g mk1qݵeh O'!\۪ ro.q4 o4o+vSIsB*4ZtK('m菂;+=;AX}ZƒY't\n֍SY858nr* -̝SX}iFRDUxyzCG yLǸOux` 2 Q[{,w뜋'CϯQ=n: T+='$\H[ Yܺ|i 6W+%˥Bʉg{AAȗeRW1TA]9JVA3Ht&RByw!Ø@߸ ? >|8bku[PF)!dב2TE*}VN8:-uI TxD }퀟<"bwVV ȋf)FJ&ژye0En wLEh1ߨ* ѰS{N ɫR8lb:ƜrpR_U2*.|Yumm6z!vu {'4 h,?S;;^}pN$)ATbyDiٺRL7{u\3Й: *=@w7[Ҋ48|$*YOS8_ 8^<]1e@i3z (v%ؑ&BQ[3o,O#\}"đ^b,h#;f*0na(Yb+hqUJթB80X ݟ% cwZ\Zc%W\.y ؄NoS  `̀ݙgԊPj~|K+4V@R[4m 79\|J&ݘ6񼝯{je 4B}T>w*?Wl(80ǚ-Zw Kqq'O#SZ >ΪMw刲o%&LF:pn'1~aW 9Dhsa2.Sx|I?"NJ9mƗ8" ʅU\ 6OѨyF;HK+=fHx\J@^*"~*8[3һMTk6fFWa]P/9nI+@5 M~h39lb|`{ɻ $5yU藯`wކDekhXjNCzI:*甎&z@R$ ?oI>v">J9$>J@0:TnbQjs*ͫ({t@!$k+^& J)Yf~&F.+eJ\1A.*[ 2z|\:ץj>(R/9xXmí'$# q}SV;bd1nC[7 A!%t]/i ipP^$p֥~ GE"M;53b=>yC-i\,/y.Re/Jhh&x/N|#M>.Ǜ4+rDW:9v~ hTM/š)0{9g=,AȷWjLd6mw tۖ} kezHabmK0z ґ4#,Ĥє «{f '% r#V\, >) eAy9~QnqiE6NaJA'~} qȢ'K!<6Pml?70hȝio 7P 7t8ണ9|8L!P6XQu07R)bW)MkWdҔG,ODi'-};`&iհc7'6ɫ&"@)9:x jNBa=j\F6[Kfp>Ͼ6Pa> b067qs_<;)T-weݢ\~T!ɕK ^&u*fY.@d xmX)S{TmiaQ`@*ǐէKj_1@DsC,Eq'i}ɒga"ܩ_ !4I1Ժڴ))dG2s/^mCWھ莐_9db:))ӝ-\__Ղ M~LGq];} JEE,bWq q1{X;`6̃EǰU 9.YC֖ A.P;6×Ĕ^ b?!9-u+Q27)9*Y1M@y0un5Bդg3\s뇜ɣb=muQ}$kn (?8٦"ąF %RbAJP?)O*2ɶu#YAgDN~?GVz v. xtUWY2,<+sz3]"!^e.'+( Ĩf\2@e`I{lyiYaЌ70,Q-n.MFQ1)Izĸ5F"%{Qhn鯔h+.)oew6XEk}ms#5PvF  TK{s l2yh243yyv2VvX>/)YwE,wRy7!sm9ꡤ)u~_s!A>h U j@AJ!11)դ?k;71u6~bNtNYy=鳿tP9\ M'%5a[V]][`{)Z;༰~?mktۄva!2i 8+ꝭ"H;% q"kE%jR$3iu{gן,#Y]TQ5_Iz=Fb7 I p"Lų$#쮿ѥҷp k#@8s]q*EK9>ogSx-3ia1z!8ETuKz G6~rΧBIR{20~OȞJD5A:fK^NT_b?^sʌrX( bQ*NPgBf؉RP MlhL,n։hAؙo3Xc;fXhp'?娜GIWu:mY8~OqT7G7g*N(p1(Iz1GvkةH3;s)9A q?E|tϔ/E ڸ[.k83-8&:T0KZű湶QChBDSc,, i ɒ$UI61vs!<E;-1b[JT;KSC]*>uLIM]yj!*}y ZgZYI1o] 2h+s|uȟm^[kZ@v ^8GQL0lJ>i/J$*^=[LR%n&hm rpzwtwuSB Y^a)#l_M{)?~=&Iw,?6h6WڮfIq @ܫʯ>o w)]Z ̇~iEvPWU?Č'Y?Uqx>(A{^3="E_/5Gè0a(mLh ! Tm*o6mHr-=ҕc8Ќ_j |8YraYv:Kަ#KeOBW󨟻R pE/`MՇF8jrVMAxty~[Hȍ5\eQ띲6M6Ch  *n,#CTy*thFrR"iM RMlb^H'}@WZuvxf j[azh43VVLïz+cM$u+v%uO(>< 0Ea|8zPZ\ڮaqGe^;`x;|?-yx];tmFͺ+Y޹x!O+ I4k"ͧtV?//L;_ܖч*QUSlT>j1G)V-Sd$Ml1ܣAZ=Fd%?QGc=sK`L5%㍄{Rһ{dv M ґcH1 aG wG>;EM~ƻMy,|e XB~W(T{_SNTD~W3w"md) `Vuq8%6es0 zve'3y!-2^}($xLחhbs@~=YBg͖~k5vGxOΛelIhL_VH`y:nQ(sX}#JCn<ʏH%d2] ω_V+y gף1K ՙ&l K9fG$!ަP FLi| ,Q-+,osYTσa%$F n?:h\UN]Fˁ5]/հcޛ@J$p|vSGJ;[TV {}15k5SW/24)wCan _R{/g:ln4ZM#v;̊zGC'`C 2QF dxI/@:!IAg8JVL;W7%mhikXnV#)8͞"aBwĊ P7k4їnP&t!lөy?C{o>172m0FְuI':|ދDuuX>P =? fR7 Dd$Q2Y(=`˝6U=.#Z hJ8\@➮OKim8*S;}gf!&}cY"n[̾>ԟߝ w4_cG#g>rv?ovx (w̼v3=d`>mmz Yg$?:-$b ɱy x0|@OhENp8}3T'pP4+ ԏL4^cJSe_Q-?ٿ3 ARlC<$om ,'J1tܱE"ʳ|(-YgejKi22h=;?)BI*^hFg;+zKåК,ׅV*̋iYjhSx?AXJ .ߐƣTFK]^&3cÂ+ȥ,\d+lq"̑FThG[&遤" G^w5}p nh QsӣwXͨ:Q@u/|qDJ޵<LQHg"CCf^"5xʞ \suIegQb r8&c3$ ̮ooJϪvCaK*N«t~ 0ޘ2y 7]S0{JpG9ot)˦)oVKM *ɜ~; nB39@72yi& D,s4:=?Ou2T}Pd:`<6- ˌi@e9QQd7x0?KIQ.V.}1ϋz SZ-*il1۩SԒ {E\*0[i3jb'8\ISH#c2u1SʮiwY) #Ϸ ɳFI|c B4S)5Ŀ 8``bg .g{:=̗Lf-n29h'-2z_ո!+ =:Z~3)[\b />~Z GKx_AROiu}恽Jm_fpLgL eǦ:̔ģPע_0˷51un$Q;q>mǕZj{2 drHf[sW:xEzAӑ7,?5GԌFN; !<VOg;t&e9d-ѓMo SJُKoiFW/ՙyhl<*JߢˀPepF>T7~d0f\0M;A£)"q$ ȓo͛0p̲>^&rr˵uH!5WoRLqp8 z2̔nNxEeXv$z:(}gR""Բ 3zJ0_poek04ȣԸTf_Л߈ۧߋYk kJ ꯇCP l;Fħb$_,]ױeVqC l[OhjU`%_1xb= /d^̴TjECgSrq)U/9d.v.ܲcZ`MVO0/I?F7!Z o-_suDŻ+@1}EkE6 1 ndU_3\#\ҞD9qozC\m;tڹ`1zXeǛw#&$ƟP)h(x|E2(sYQ(#&uBu }C?fJ1s Rs(Lg &o9v aa%}Š3ϸQS { |V#03|Xjs،ek8fH! wQueÝGy1W~l-}1R`z [Q_9[rah B^;ή%+/ܵz%" =Kz5[-#>y/ 9)guGGWfp xw&&Ưsm0$Wk=&Η |V}Q%˪4c@4-}P$"u[6B3bt{7]Gܩ ڈs^[:Xsm%JU1+z$Ć9 +Z'`fU)g/&@નGd'*3r" _4w݃ %CpP[',яcIJ{ƛ!`B1HCj*T:Rƿ9o rHw#Er1tD㞸Vu83LLȲ5N&CbXOba-O3yҗ}B_]A).>S*n4{ovN8`#.X>D3%ޙ=m۴M_)L0i`Ot}^bLۑŋbҞTpbeIG]Ckv/Уdy|oڞaQ& ̓c㞯֞W 3XQta\q88\'4#M B(bXb-`dzރ E4ՈhGl2I |\~p[ Uv vgz~Z-9 .G*!'IslYAw!SnRHt ÎNDƈD8CKy疇{lSE?>(S (Bg@msrKuh/B4F%P)LUgzK4 ;ݹ XC.mSgmOX+QW'ugKq~a]lQjkLA].;o|,Vm"u5 Hp3oAokzYJ-B~Z䥎mw&ˌ ;Ucl ֝n!Ǔs׾W\U}P*\r4EB y_3`q%.wScisD5Nz?BzD2ZQInFukl9m:FZ I''V:G9=ƦIϫ(e_϶Px˕Q5{rbm* HHv菜s闫-Uʜ6r}+QDXk+@WWH&M))os`oWr_O_⠣qpsV$f ܇v]rbj Q[Ouw|Cjܰ44Eې.zo*L7XO*gs$"&ޅlG5>۬t;."^$> 3N<>JCIMh^8L09m?4E s͇V$Wi m륨aT>M0˟j4k=Q2|oezV)a|TT[$,1FyK\lK 챀SnY*|ʕj]x{!-N8LfޓYsrqDH)Q}ͳm-Z &* y&l)rJDtnc3zΩ4 '`-mb[S՟5np4fݘk k,)nȰYZa#PIm;EyC *OV*KOfTpM$=bϝŝ1t8eP?O$Pz쟷yBbɓuq)P'VyWl?<' [Pd<"N  ;,DaA/zhH`1m;4.19A[wZ$lD<iZp"p!)Q9 һI]0zǥ+#wźz)&֣~#$PYTtlW`R#yJP\@vt@_1dǫv/F #{~27F'ez4@G.Cy=•9UL2$ : MO2#b-7674#ްe;u3TK yREV]pS-u2RjVʕ%Q~ 3Cd@ ~*Gi-wI{z13jv鍳ݟ>mIm*d*z*̞oL:ف40KcNyҡOU2y^I+dzy^;âxvLq݋wɼ:!V kSk Jkrl1Gҟg>U6N>s{ܡs]pQ'+;-3 8c!/`2*U[azRX$حXm{-8׃Ka@QrqۏEmSTgH0U\-Ďz0El _A-CD*II }y̖V5|x=8*$I ,^m;Oy'I,3o`%ưr ЕMTiEN] GMԍx*  j+zʵÑ]BWw!9aELqԽti+7H 7.Baap\ZZdC6Zfz+PCwgо1cE LamZw8!DG(ad=pRQ&V:֠Wdǜ)yL^є%]Vfڽ QOgw<0 , M\+TE:.bю2}z*&[BCatj3L[Tm>g a6Tw@H*cz,vdl0!Ѵ􊄡c,CX}x)C*Ґgv2n(h 8zXU4r+tf>#.f2Tuݻ C2rol+0U  ghw5Z+ L-`3*wg(ܩѣUc g > AѴi4Unm1q,y5b) v]?(fgT O?1G"Ic2N{M@4n<!M[}`s 31& ^G]ua<*vNtTsC";0),7}#PH*%)2$)޼ū:*98yXh1Cr%ݫ̳O3,[tʉFeDzn [wŢ,ڰyQ)G^ܔݧ`ǴuZ}=8Uif5SSe6XAޡZTZu\+pILSm^Z]$̿ m==N ͧ,մ*JJ0H[)P_ZhugҊ癔çq<&˨ܴacA1Rm(v;0 (fa RIMw[~YPQlUB`5"]縵9m9"1^$e,gQs} MH !>PS>ΚىIһ= fېX;=߸o4 cgŘ07nės޵HS4́Qovݞv! S׺طof2`l ~Nڣ@jXkNgA1%7v͜6~ZXay*'KAfFL",hamzHz%iX>I}.;ф2K%-爠f/d_`ۘ~wDU06T<GNR'B:2o2T`:,}u|'a]W$hڧt5W2ȀJ L9P}4+se'ZBSMm[l@$=bb̾T5?6#5I"8bKܲxQ+|.iahwm?sZ}Ҷ @ C$dYTT:ȸ(GT)|7z5m ނKt4:,El|lFwb++暭[+WgnHe+#t=X-/}7JM7b'!"c Qq`p|ts;px! }@x,s3KuɶhhI;3kkF,4"p@5†S?L[xbxU[x o{aM0˟[D,:voJ <ضbY 0 ijP,iU'8eb7^(AT}n19oN!f)pK\Iyg{ԓBU#09L'&WgF$ӡJ8@w42 $pҚykjN0o7~3;p.'⏠s s+#N|zQ̀'9^p.}zJR LyOňӆt}. kzAe;r^@Gg}QuTfy &xfǹ ?I˜sR5$ ss(?ޞ N HهAaoRMFsv1^cèB#!>= U@~e?Q[/fQM/٠G\l}!U_Hk)+4$AZn%([/ ގK2:\C!h79혰5əsWQҭOLl0WjP]_z:r7MB+Ē$ t|M8,ɎC}V qxlz~چX4SO 6W2s9#)>i|VPIFKĖ쎢x< b}F<άmß¼jH>v"~v?:S5eusFie/_NC3~+wKZ諊sb>HCԼ$B0*:dxd *ŅQ̗fK0(mr'UnUmz`D ɍ@$6Hlfk zq#3WDmTnPp>_ʿ#sg(NsWj՚x71Ov4'&Cۓ$97J4.utel,<K]Ylo8+w[^#G~E:viŗvҜCzǺWPF#LA~Ya{:G0rffRXly!}3\,[ziқ+"32~] d 'C ǢkIvoLitEǟeIl|>bSpBa*"Aтc @# N 4n4ڈT-ϑ<774=W.+P+7cM :պ^K>5n}k{J9|tWW{mor%,|"s| oIs\,@'b,G47 K'?#{>4RyWO GU3zF[|u,f+/V% * Wٳ_\kC~,3{1AQ_5eΠY`^=Nxƹ4L6g3K2V8@@G8Wћڣ#=#3`zAeMv`8P%[rNv$)$9"aţ)se^Խ2xRA{p%LJe= qqjMtw>[*{!D\c+iRG:_ p#Wp "( ,ĸoo:kּeyo ūI] 22(Uq/K r>g 36N9ϖmqr"*KڡKTvҳM |K{~B$CUUv)k. u!z7\L8)]:L, ޶2e!"dBI p <^BMBϣEr߆7 B)$KL ^\.gJ?|EG)뙳@j~Js^ ~~DӘD2~vȳ" a)Xݴ fSSY{(޼nt5 auNb̀_֘!Cn#}, Gú=30 !yX,ooWC"׬ΊAXAz|ln\p5V=iXjI!46fM 8?MHl vEĄ9K )d;u ^n9._SI~*>2p0q# ܎99P8^; JiR)=h@H B pn{џnQDEVU)+)F-._j@ ZsAo., 5=Dg&RJ3B?؛T"^vƗV^y[ГP߂},G^܃3Da7OXʡMa}j_s%e CWa˖,N.6 #!0ުbk9GSƬ|(Yu3smcy#b%TKX L J J RU+&j !gđT[jcŽа[nVAkG\+Mrf|Ͼ|:,8V8@gu%mI2E&ٶsWkACޢ[FF ByM`vʮ.C'B\Dqdc}0k_#x9S'({dn1}~(B g\dk4EU}|ƔIz*1xhkD2{&#ך3pAc(0$iű {s,+C_Ґ%gzozܲ@'\^M[jq/_7{ub^I .VsXv~]vz Wq>:ZocE째6^ƆB<Ӡ"E>70mՏ,0+]Rn{IEu#D Nh6_j 7L=K)YhΧ2jFmt#?&xR,5x͌hHRq%z>b.3;F> g#eL|Qi~9g3q6X}fk*w]K.7s}Cu}Ecuu9H'êğ: /,%Vk.,lH[ pC909h;-;13r$U& ";tٛΛzg<઼rmKx`EMo4O{ٞyM4=t:k' DhuJƤ w&+# 9 s+yt$ vmq8If W'Jۙ]3a)W? mHvʱmcwRe…/wP3sM TÜ#+uk:KԨ ȩt) &NkG M$EWwlCM9yۮFKRN)!F;iд jNJ:#=RE%+ڝ̛(uϔ@;#xcIҦG~~l~ V{0oLˤXҌgNĖNRmӱ16b!#\iĻin$)b 뺯72iw"Fn#)ԱAt }۫!If[=wzTl#hQTP[g]Z-]Z5r)?;[6+ J mf$ڱ- YhԪc8 y$ؼ6{o\GGL(56 )-JzL$ZQ_Pu"P>Yc\2O4--5؛XGgd7Ms%ˮIv%|MDȢf$-8a^s?d9ˇD%A v9Ee<̱Q7n^HJN uJjL%uNyzN c42dhΚ'ۂn]Y0iR4:@hBLrXBuCN3'ɕG 3U?>tV#EEvn'V0R!<Ζs,_9ޒOy1faUpMIJ/s<_(&&; !@(긕FUX&HYrD!=(]Z썶BwJW; בbPzjcMpsV}82ofJJ|Q]}\4_Q|-#-[SvCIsOf2-cmUI/ &`*p~$,GX- wD %;"^ȺMh@8p(2\r೷Q)z{*dicoF ;}]̀y.Quzq6=BtV94جKsAUvEɴjNlXK$.LUV wVQɅkx=ējMa{ eA:{yeDŨ賀鸰N;O6OOrM=C]aOvE߭U'bԭ^љFI@&1/qAhFaQ@mSu͹^7QAc3T 1d)*Kj+=aG%7f 0Bn'dsIzԋN`kC&G@1@ ;/)4k]*X(Bx|[apI1Wd- a p3ꅡ&ܸiW&&_&/&itVCcIt[ְnJa؈MO&3Tj-٢ "7[11A_Ksvh@o ,˅9vu܉FǴbBq q\x+whQY|QF k^.w}U֌q:Sb4Q.݅VoF}cq`3Lcz ~95.:aW4/ N=-\/L>ؕCww0DбuJ"sۅ:M3IP.$K3f4ʱnmf\,!9o-!DO"u }iYq˾QWn.CR/GN}norf}֪mm;y4— r}mM>SiK".Qw'#%\3BEemㄕ˸W]Oe~Uz lYOpКziv.Icbw[SIs ҿaӄzU,{Aޗ>9~'(!kuUnl'!$y2kmMlY}@e,MnUM-:e8 >X B Y}P ɓK t~rY|OVnHc!7h-$#HVVZdǪߓ0q@W#d/9P6~i9\ )>UlaӴ?Ott+v{\y3rHДUhMIx ( ÒCmP)~,{  ,AK#K¡}A z#l Q#%nD{¯>}Z޾c'7o$W4hQ Tmš7D}_hA9Ue3Uj(q˚d 8`\Nn!yuܶk[1\6l_6¼\Ҹ,[.:#kź2hJ)7Ԝr4?VW./؆2vI>s{.KݸINva%$Cῢmyf$ C Ò\%.7j~؟,"-ԁX#AԽ^'-XAX_k?) Y\׏?ϔG ՔBx%o_`.v{E"j೓eFAP4K&Ƽ\s4M~-RP`LSɃ:\-])c-KgB;Y ?\u(~U_gZNj1ǃV:{vsShZg$0W?yqadt[$ ^~ U ^, Űp}]8xP "뭺% ^%ͭw*tp3ڝЈ'20xJʯseǥ, \IBa#¹i+R NH<`:󄲌Y{;d{zSʬ4m^40a*tn1S@`ƥGq޵8--ҚY&Tt&(k\6 Z~B6i_}1L" E-KUmcϟ,lbvw48Q Kb@!{E@<;+bUr[4"S`:v-bɧl2 51Duo#,yR T1w\rcwH &۹V=s wS^!0f 3!c|k]BHV|g)UjÏMT%#A}f益&^6kkoW{8yRefťg8!c]*F3jјrcY7ʈ%A%wfҵң 5Y0JFFqK|Ox@@US29 B2?[TMoZ<),`lQ2Ej9>wKH*<.*w޹YGu>lSg[= T'ֲ/ؽ6{4~CZS339MfoUҥ|) @/يx Y-&t35Vx]u؋ 2A<m)#;!pjT;"4vFdEwWIb8D)ڃHnV ]qJ%t 0G!m2U!@RTȞ!l3[AE>D @]O2!WI;Vt; '((ۤBɼ'*!g$ÅsQi%u۟9H: a>|ci-6ܒGrlْk]irAOg C^fwWoKG8r=a/cеWꩦ\GyD"L WEEtU8z_1子NNT:Gx_#< PȷK3ùF  /H@=_v< JXnyytEŠUj1n2{N+Q̙!e:3p.L1wE 6TV88e(,p[. ]硳uɇg]r$2mض -/a"]O?T4N=s$]@rd9!ks41cTݬzG&IԒNiچ)"} "X$L2B#1SiΖ֝B*~␫Qh1Yy3́?D xo8^>n3Tμ#.}RP6ZdQ$}YF@dXr#˧y ԑ"ҲI _"sxIC+Xw!jJM m,K>s3U:c UQJ1]$tB D;],G's2vAԊDW3sS0~]\|Pm=T|[,pJz3A@5Ki t@:QWc|(JC嗦ÀNv6VE=Gב8oټ=Y%'?ba?If"3CCnM)!2r1?bqR [][HrhCK֒‚|;R > .w5sj'Ǫ+Bh/b),o{,pJ.pD~PȂ~xAfobȎyuY֞FC=ٙz  y;V7D> \7P k F<(ܴaO*ޙ삐STF,Ģ[)Ro9U4:hг"_Zٵչ،}>JX&=ytuBzyvӄY0&[jjIOɨK;`bBM¯; \U3W7AbΙs8y}A{K oUZu-e<=W7_SEI db1QE,skM2"xIK}JG{A-+aWapAσrk,)nBj p8jChЄ`_f04.ZAg/,y r*.${`0(.ۤ$*FAw%^SD3sPx Ȑ-̺)|ПzS!at&CsEfOTلBOxtcH޲k7='|iSծT.LMV'AZ~bg ^qGНϿIK[琇$makc)/)7aϥlNuKMV6l xYxܬ 127,_SkVF NW( Tۑሪ;s̏96~kZzt[os8buv5XH+4֌ KxlyJW Qд-27=fd9o'cbڧWxuk\fIOtGK?SE%א p:Jua'=Q3K@{b_ ,vEJ-:JybuED_|ԢSu4B<_wL!/<{'}b[s eo+}D$_7@NŇf(#X kQ>V\~wx# 9u\ȪfFL*%:$[hՌ%n-eY\a.R}N}/\f;o1beBs:O`t8\'{u; `?Ո㉯i_דNEVù:8՟A`iɻM/ۏ" .q_So.{ ҁ:h.E7[ ^uCS̑U9=1w:)F[cb?._23;;poLÆv̋ϰR^ zZ=i S.gO\/H; n, zQy^nՃ)E-1V$ [?A"~USKZ rB!)%|P0ڈuMKӐoKA*K\uwZzCFwg3(25Mm4|Sʒ|+JjSO(&aOuYç%ZM(ZrDvHJ޴m"\ !BR3y!Z+s":y&<=.P4Bڽeq-MO( $C.`|Tij<"xnKc Ԏ.zJjU.EwA6}y!1gvu'@#' Ⱦtj)']I8J|oU._4Օ|R4dkdvhAGDTtX*7a9,%8>V;:l4f-/'\LHl{u1G.'J$=k =D_X^SۢIȖV鲏И#Z{5@5UgkEIHoqrd)Lta}Du_܇Ȼ|PŅ͙{5A} ?ECt$ 4}8mO3[LSMUSbgzڕ9 V ףy<135>Nn߻ Rόu\ӶާqACt6rE:w*|LcE>=ᦂ|(Ĉi P+l$ػc3Ne ոZ[qSp3c:Ch[{B&OkSE__,Ww f&ޱ͒Š_Z`sE{HۇT,&: S!l2 Lt䚟C_.ͮ7^nZ# Yk7Ȱ=RDbfk*|2Y0 C ña"3e4I.SHQj!z csgEat]FR f,:vkT!CV)z ߴI`8)MY_Im*R|m|PS8W5g A YŻ9ԺOf]OtFUZО|94$[cJ̡Ytmې%NJG0a7Ch@Hk~ >QfJm`b\ױ9ɗ9 &C1Ίҗ@iE}3B XZ: Q.3VQ[p7+Vi!-vf/Yf"n>ДZ*FWWGuEO+{_UI Ah_H0@@5y_\ɪpbJ8U0`Lk^W^zE4ijfH@x/D0%3ůX} :QI޵eHXg,00uomz7Ju᥮twQ$8MBK+ TpCZs8@yyb7*nrRץ]}e~Q4zP1:tyK=~-\S˗#u [V>N0LX&dI:q>uxok= z◎vDCߨS@]J'] {EP Y=m;w:(H5 _ETEQc5HG8UAޞ czN'}?x91`sܳߵER y62"#ȹRѲ#:#* rT> d̝C\ƍ۴@WUf_d1οZ [s퐅@Ʒ ^!O1uºZZ^@bk e728v]5X40r¾myNJ:儯!@뀋0]%*3p|ASfg`6|H (eWɳ$6>jY$a2XPf/H(P0ISvF777nf'.d+,YǒIb2շɠCya]8| ]"Mm̴{k8R5Wŗ3i}qh5#xb&Gf];Dt^@+^H+&H_tl2|| WYvET {B{>iG?M96n8N}Sט-P@-j4,HwKvU19zcGIN  S4= cB⬴Ũr-y*j~}}ހ]iG jyu~ \l [iչy& J.=uتY6M2 0iU1&@Y&O30% ޶ )I& P@APjӊfȉW<{y^;u*c`1Y/c݋/ c.\}UU)(O.\Wȵ$FI<āOv1f>mTUr4uSe)֧Ǝ ,+A[6:_;@ chLvtSɛTBm;|Y"u9IS"2Shԣ *%``Ф6+ [k{NϢހI1u99,> %&nb" H=֨G4TP*F5r+8cԱHY5,z(t:fKVQA|(Ϳ0󀅉͂4wi!@cRޑ3>);V):'B =4B X!,<ً/ࠐ᷹KֿD! 6Fe)k̏Eo^ͽc`IMbEԽ}Kh[nS跴/k}Jv^BY8%SJzRceJ̦ϠbdBS@< wڻp2Avxl be4K /M*Έ!?Odbfe$*5Ki4h! _gqo~nXZ>+v[*.u!!2G C{ DW(E'1~!nN7Zqn@X^DNޓWԘCR 2|QNf!E}$cv8bUr ms1L_o= ^~NuMa~^i*d=[mOp@z 6Aʱfء2XcR9U޷yL x&W;_fC&-[7b@?iA1rO%Cs0ɥ1HN$pg) sI`= ~1Іɘ&fŝ߬:¹j™F(04?pJZbm vK| _ё_艽<1_-xQNx06Z\ yX&51iFӸ js:x-41tw\ŭoPoCn'kt`Zmr->6lh+*l1t r(J}wh|74ګsBo@j9?9w?D9.[N2k-}{yu];R7SpuXobU%db<[ < zdCo^cu |zGVWpfi}sԩ$g]^@%4c~\?Tp+M:h{Sړ[0+68hn$y%9 wɂz;vRvS5.*K:T 1+냮K_vkΕ⩴ ZJXp5 s&#$0d"<>-U=[|@d ~EPzp1Q,ZT?ŸfN0QmfG#`{߁Gy $֥c Dgs$HX,bWؐ5nj̔!`~?$1UpTxJƋ}G}$rG<.'Иr(GMЮBTԾ'_OU'˖,(.\"DJ(ISVqB? /1f__!$$ ru1&&  rs:R Tl|78e) ,az3P:ߟjX1X98r|y 2%YZ=a{z#:"a7p>ר1rj_6Syp#Xp)RWaD€ҁ2<հ[^*SOI9ZPX g*?J֋LCp;8g`$LRrT)P% :ED-+@l%JdZ1JM8p#Bfi@6OLG* )HĻij9 ҒG0 K 8ew:<VQJ&ubc!c9;'(0~y,vQ]/-9$s'*й(Dԫ<(:+/R0Kjc FcDn܏hW0AAъHf3 <|.|r f2O_G0rOk811'=fيA(V[SY'o>K_,x[֢AfdQTKTydTP2k/u*ef7wxh|pRąuştJpHE)r\7'$H6\Eϻ7q"m}+S , VMHAuשdڇJcQE]ea_Lg*tJ=ZXdy&SYSvg]KcUBEcw̔/2Hh0''jRfù&Xwɸ(zėǖ/+?[{ɸmsz?RYth y.s81i\_ X&459>njfЕYx^XBc41ˬ{%( |N1*LŪW(|Mǐd-&m8z`zUug[$\{'Y=eZOP< GIF{a a[P+mDo^ yIH Ót.1)f?6$Ǻ48F@b=G2;b^͕c*Tm gl1k+-bh)Z,֭t2IM_ s+^ڋ}ebQ Hsb_cwBWDM]z\NNүal K*}>S$Z (n Q觯dHW2FUd29ŒL1"Lj-`b 逖'<⟼dzq,3$gEHw#@c.h'cI}Auմu^N2#(Rc=HWBSy4׫R0/ӝ(&ѯY)װ,. |}q5a#Մ3~(< IIiڀ< à0 g*-N]S( XF̒ݰ6a5 -=QX,b%_.UVC'GonBn>+~a..d9D{UlyuDQW%\w?Sp)Y~($?b!E(H wGβ0/}Z4*KMc`a]]㰦ߛvOh$% RpC<ռ{9#d^j|ߵ ϊq#>z9gIGF+9SE;}U=<?\1-DiFC\ tIq{ (bE_QR~ v3X3^I>5bilxH>1E~ EO` ȫ0P%w|wq=c;5e)}_KeJG"z^ svB wsu99T2Кޅ{=u.r}cM+=2NϢ4Rx3-ؤs4z9fܘy#KLSa =@In"; VJ Cd+ؕE-H].M,Ty=ڼ^w$>(LR+jdJNd3Nct; Dx¨?,^G_ؗIi.4}D?uf78Im¤DL2m\xM֠p_jNb+HzTm Ɵ/BPs7&VtxV` `\8bpzk?]% "pV8c׋ְ͌%B_:wxxrRÓCp)SX~ % 'rcߣLe,=OKdWNr+x#@XȟރeZ OujНfov+pe[[t%^BS$.ў3Q>I @ბQ)MOǔZ xlL#!e_eR;fC #AQ߿P3~<;tnADQaP X֚!=E F;ˊ=[VGͮK}3yO4žt\BgxβH|.E 4pPf.}3>V~+?5Y&qN3<ǒC7[$8(jd{iΥ`UZxHi1/} MwIԽ cQFp՗&ֹ8nd kJ|Cn"UYf5.x}B`ln3p_Q.Iސzɀg_ϝd}IXI(kJ>әڏLϡU B4[I: ^}@ܺX'd:*$$2A0ȟt"CUX5;~'AٲhNn'UWhTྷ'S{U77$^dK)a!v4ŒZ.Fi)b1 Yu+֦w!'e`iRu.4FxMix)}@9_)i=NqnpPLc.jw"o1@d!x)`#者́ fD4~nr9UyV zѠ'>!ߨҶG?˷]cуۄz9y'ӹn9,ea91;(SKIN [U{K aUlp_:Y}EZP6L3Rz{7xFE)ʸ5k2 e4p.o9ݦ>/v K{f®Ql*63mގUr4mSZ07K8ffLwK흆}j-X~vߓhg|oua޿!nkyQc:ua/_2S!,YZXهADr5z9Ⱦ p1rLUa7,9/=;y$L@4"'&C"}赓B-з'ÅҬ* +%U$Vyd]UBt[*\9)8Bw/Y,qCBşl y=[?ĵE?ʜ^QrԄ% &BA"^y9w rܕ^Imr8=l> o~:rE) ]:k㯸Hļ{1ǢQ MDj[[ο_U op "jfؠӭ WJlA]bgdw"rq69L/9w%;=J-b3F\-*AxU!֘QFi/39e[]Cۉͭ!r{WG8۾s0{D`j];d:{mʻ|@k DlevxXi ԙ,3*\FzaL"(f5V:?gX.V/-i%vK/ > RUȣ6MNR)ߟ[;*WNH߸(?t eV۫A'I!o<yI| Z\NW罘|6k94zg*2ᐷY" .>ⴻ9r& :7h:[:K[[)5 {%f5\%Mvȫ`8v""N?p;;z7/1R3sw3)_`ٚ1H5=EV0?+$) hULK(j`d)!N-zk &[qQZ,քؤ@B^xU`UkY/FRrid0a^Mxf O[Wlpqp.9w XowghJzW V ώ8)U Fq;$+φ4KAH@| )E);1 dF:kaix5,?{?#+ښIjOfFw:zίGoqȝ5ǻ v86Vt2 EPeWqtXNi.jɨEU S]̕5wMHv'C1J7mSW.o1^G# \+U7ʧR>ǦRM29t;b8z+Nm0v= )=3HnwRU5IL#7;KI< DE5isV{lgH(%_ts>vxuFaV{!m@EX]H&$#@uW)1f|R[L:W/1hJW$ qsZCԧhmKDuxِ1wgO\ӆ’7Tڮsƻꤷf[qO|DZ\QDxnDT Ts;#d8!4e|JyeFن1N?UyOkKw)ND0+yM; kSՑEDUZ;ܮFeWy MDH3RCnIeq5? 5u^22kjvfa٠93mg}}j NfopN-`qWM12U9SA2f2OD )>yԣfe7NM)w^;l(n)-B2>|GJ[N*1 ,'ŧ;7تޚ8`^d*/r5 ٵFLowaX iVqAԡ'h)ی`x$ C,8_Od)Tq!"(2r*Y̢9f3BU@.5e|R*r#Wec^6]PS}#JVs?R R>UV ´B]:Kz|8vRc@yZ{1P?H*w8̨Ѽn4|hf٘ 9\DˆJ|CPĿǼzSD|-8b( ?E'cp.R*TA*No΋.%d"4ǫHe+\2aϦz:Mh0j6{}$[@d-ZЏbE#B0uHd\_jL46pjZo|k[p@K9fGECrzeOJ/LOƲLUdriǸ>4h\T|S# D]k6(~7T!Wu%ziv[X;qCi{r&n6-o|"*\@f?j'i:­JҜmA Zx7 SL-uJ'p1^(Nv]/RoTF,`wXeOnnͲjg, eD2욵5Ƶ!8ԗAT}VRff6d;IgOV_<{"R#m)wA?x zrbe8m$6{"JWNqq&:0"{5ec&X3>ݎudP(űs霳`9)Gz x`0ue7l=޲d }>ƯLFu$7)-ؒ(_ ַѲb|vW kR<5~8X7>_E@N88aG6*cHv-ٻxvpR,Dٳxu B%hm$]uﻈBY.3`,Qh /L%%q&tۍRlyCQ Y|Zj ϨVY-Nj,;܄W$TY6UͶJt\I߷m#`\ U?n/l&g;NӦD-bI6)& p~_h^˟aeL[ ®)C8Kh ^ dB/4Ǹ_Rdq=N|j<&efZ㾣 x+ =ԅ.)Y]»{}&\6JI AlfU,&'IyZ {Yu>k?͑L3&pс=Pԓ4Eg̑FS$e E=|P0SFAIj= 4%gYeeW15?gW.|E" }' vmٙe V,oٮf6r?fr_x{ h~ g6fVۑ~ U,Ö-<mf =uN@Q;|ܸgCl@@B)/q>CzX5 ¼H! S7q#Rm@ l Yr/c1y#%#“EX[ә߭jROH9D#b:\n$/ m[aPsN*'yz ]v]Gv6sA:Tʺ};zQ=ycQ-^F#h@ ȿU~X9Y9{Axgu Fiv1 Gj=ѲԎlo:c c^zLydL]JޠCP,⬦3b36 b> MYV}]$_R|1PX<8y&eYP^%<(bp,O'+3͖6n^;h1(RNQ/GzHr͘ǯ3ۄGFPYT`~d(mK8!PzwWV_iԅU$ڎv+|0 1Eiom-(h:1}ֻ@hn *4q1H"Q,M˨rl8 |DfnmB$_:Jq1.I<2 EQ[OǡAkEՀKVd(cGkkuKHj0+0'TUv~zk)F=VE Klw`w5:S?<ͅwz'<`Ο<3/[@"P"&Ɇy既gW(o PY<@5,_8,53|p uUu>aTVP,k|.eiHgɴ0':4t_=B~Y*Ԍu?iސ <Ȁ<{{$m?t4ҌM0J0XY8˂Y8H9tkYq!9T{ka^E4@lh3ӎF ~ "՗FٲT*Q+ueBٝY3m,{W;%X%1 LDqs;uUr/Lh  trYG!<}(2zoFXpbz^'i8LGxhE(ƽSJť ~ GP3!S},6&YvQ:jt5!`b]{;*[cQY%Yz>4lISD|N'Qq_UL@I%lڎTu(X,K߾aO2ԍFdYad Iogg `pN{kW(EY^=]DQ,Ϛnj|{<2%\&}@Jp~=!a8BK/Ey#nT'B |YFX7]]dTGҠE,JLϡϭR,ζ,t/z'9s5PNafi蹊UvQĝtkyk²Iv':h q,R*e#3n^:GEιOl5'ItL}FnJn!:q|'&>xIoqΐ=D JC.C~@.mR[c'j!BHwpj40`3⹗) zbDpcV(Jʶ?MNTntY *qwg Yyj3`=OcRSXڃ w2KIb#Ui_١ӣ:ui}#xtȊ^y`4VhvqN%}mhp̚/bdRgXpA962w+z޶IźSs$K i FR|H03|i %A{+HxaY7$CM,|WN^t"b:g"74^maij|66ZG<a;x|[?/B\KL -8\F7Bf`cW#Rgc\Հ%ѹFd ҙߍt_EM8a$ϬdhUQs+A?S*?ZW C?)mOz~e6*46ވ~͠tS3|l̺ϣn <ڛҥngܙLQEˣȒPQ>p9-,)S7MTkJg"WM W73WxW37Myݾq2zI t:;FoS 2<쓴HdV0i%ɧ9FIKhhC[κl)W4>r{v t~Lp ~| %_5hiT[NRR0JkI˔ZP zŌ]y$~2d}F'\,`NozX,uM$[aG7E@4]TNcA^D.Mg%94fϳQi^`yp./*"Н,zKqUOԺHah F qYe -am%G"maxe_ːk1 -L')ppzgzU=փeSAB\KjH@o '[ 7KՆy.V`ֶ-+Q;h~E5&]X~Ln}M~E2 /#|SfbiK#]!d>%K)!|fbqAҠOuXz< ly\ҡJ:%7CPďnqeKW -nڄ HDsž~`W] !>rԀ67H֕31 CxuiP N`қ~\)g-g~5X0-8I pe)v(us&>a  ¶7T5:7UK~鲳a,DG^}ӹG9/bYgzSero@OBg5*?0Ծ>ГH}"rWT҂ J9 àrOwc& ` &5uo$[G` lY{Al "7ddg YI<"^) Dls,Z%c\_t\\I3l𷚊Y 4kMhLNj.aĽ E} 8>N j`nT?]EE}Qfq-jouvNlӳdX @z1rUs\[b[Bt)VX;%§x^Azz?IDh,bQ8U2垼C {}ʈ_PΟ8n4;o璙egWNf╢h&ez퉿)-A\GGb ]a#x'9!l *NDiyV\*iYkx1u0lKj˽qYZ"SF׏umcSL~\#g[?aB}wWIQUPU=95?gqB/XQK~ق1 ˴'~ t_ϒZ#޶D#_y>L'-PJ > l?BAjH0&.2U(Α in)6?_B rry$df5үm憜5]A[ 0&ᤞF.^y DwzJ9Is!LZC#7vmMl~늎d&쉻|jm8Z ^_S\Ĩ ү&]5b罼p>.Rv2&/ĉYǚiP?DȲui V(V?\t&Uոy.&kWڏlCxc] ;U<*K`2h *cSQ'[ľ@"&Y;jz<1(Ȩx}z7n0]>dAaMK9d8ZUؑ`Y:ܶ_hmeQ*nwk2 ЃBՐ#sУ:,cy~1"LmU?LdgtEjHt LoTd&~sJ)ws7vizz]o9p-$u]?$"->bfOA{ʠf5ûHRtZFB>+ӈn0VtkVdTȕ33aГmH.3/Qa_0klg{¥\ƭGT'|k4F)!dAG꣢=?#;;Rn8!02c=@?kDV>- 9ba|Sƙ QͫeWYw̓pR!EK*N[1E*Αîi#$v_ik%x DBR/ -s:9=}DlJSRW qU?iQxtݢ+ibiP)9Qd{pfw#GO/48Y90RŶ!NeRXOYF0ĝP{$Y"Gsw(V@ٹ:@ .&Ԇ쟃 S -v$$߈NfTGQZ%~c]d<6!%LBEV %p#(}g Mt$#3, 938`O6r*@)yKKV4]z)Ҏi2ӄɼx3k;X q.auf(2 c>}FI:$u$fB8Q,WG.DG<࿤)?4/;dE:{xl^!NƗPpRf}>\*1ͼx?Qg[cKk`O~CI+(˱MJ !@헥}]NNcBͰEf=L_8)V( TΟ zadx`z6YWDA~(Z U0|g sl%gWD:Th=ֿo>~qlIXǟxDX )5uQ曧xKXR8`v@.v0#TOv76V8G*+Jh8Z~B!!v(m\>6Pai#7Ov$6cήR֖Xxqnp}# A3)qz 6<-qquOa:DP1ʍ>H(5 :UGGLT]2#01Qtک>oBEKEUƘTB]M6/65[\MIX+DUVYM5}ǘG5?8odv$,KoGPSpPKRRu0]oV3^e$k뭨zn =MHZ݈7+M|K DRCr4+WXbu\ӓ$HV0d3' {ʱ/ A3B4qkvczz``kfa/[KHlL=a;xPs9WMhn@(8ZZ< vré O[BnQc?`k⾍w![2xP>RfvX#QxLف)lY uDN2MKDboႾYGH4#2̚¶t8CxmSF΋W$RRԞΡc C.[6ҹ9V g0%ESI\folK cz. O\qr_穆e0_֐`g8+g[%tIgJ'݌W:t ARzP?|]_c#=046O7hӾd-lȮ3v+1emuk6Gy034K)!Q/5^Au20Rmv3b b5~7 - ~2Ԣߓj"hWYLZ̀&2" ǀvu'k*/?C91c胛cvЪBbNZV{et{44" ^æyٲ 9.%ptvSF9GqP:I0=E,PskUm$Kg$\ൂL!ѽf-~W~6+_ %3aTrM[T< -~n;Sd"wVj-XԠHeQB#>a٘Yl/WX"S:o-b ,cڐr*MNy^z#!˗WY>{bUWg#"! >dX3Rnz~^Ϳ_`]oߵ7HΏ>ŕR73YE.1f>"=Vc^1P[؃}!"gdϚ6] Pw>͈_FϨ<@aހ)>P]^?x\&AunpK剧 )lKhN?'rn0T:6OLh5dXp+U|7_MOkѭZctЅE^V!=u" M5^8?6 / n4kgu%%O/^3GQ]R{ 4ޛIATLٻY1J`_;8<G7dvjDO dO1z S]Z Awv[-(hA{Qjo2RD{Q)N79: %Q^FEm8b0s|ƕwR@wHM_‰}2:SڨWFyz$J{8s[A]9 `WsTR`cJ#kYwY?*rTEz.s9l8ME{u@k1zv$I%.w?(% q]%N`}99*Պ@lRݴ%~7blwl wD[193ɭ2F*R#BIAU㔹$tbwFՅ`hn_+2W^!7#Rᖫ!ƒƽYKh)-7MPTfO͗r~z!{^OwE_0f"ϊ+b{,OPD0vŻi0K m #2u_Hv)ą.wd/T-FoHX\"U}^GٳX4MEp`1vتi nEox8XNmA=X8}L|*G) ZO:61e=EbGCUwmz79Mvr!iDUWu=:pJ(_**kJ4Fa(2a= qSWJ4MIܰՕt@eRkL.CgB'D$<60"YK#I Lg>.Euŧ*tÐ ;#=5FTuDEopNavFp`_uzBRdx|lD.65CL'gmzmp 2os,CNsg쇍oH4W*pR k?.xj*ZOɻQqG>. ίPI0y%/'OmUtR>&yI$DiuKJEaҒuX(L_ =࿺c7IP56n ^=CZ_'DgSt]{!=oGX4c2t@Vi~,@6^=T 'a}k\D'l KHK_ J>6QJ!. iAŅ{j`u$gkꟖ'`Tpb-V"<+{{-_bWK,k>p^ 8'amc#QB⍃(8~QA"&q(6 V5#9G1Qz&%2߉mhSԑVbi?mb?ւXs"ǖ}㎑Pİ+e\h{F>6n|Ƀ{af;jע6ɐ^U|)g`O:嘼v?jōB)Աo{.)`Ļ `KCKGC~1W[Sp] AE+:{@a3dza-F"h4;Ǥ>hqs3<OD+$"(Ѿ{a\D9@nh,c楨 Fb4<1U˔z(݉O{3d+ +X>]Ds{`X&ңz* yߦגb`=* U J՜a`ϭj<ԧ+uBVQSqYY{ ;0_ ͠?( ҍ>?u>y`CD:,|?|99}p\56b A0Hud@ݿz1Hx'M.4O8)EQZ.A`΃ߣ/7x[%Y*|/Ћ/ƏUҕrb{ 1.rЗyH14N &}Y8FvZ8yA8ωw+FBR _\BX c7JWNj dHv!z' Kbw9}dɳV N=3nWT>!p:^AL~|Pl -uV抰3RGQUX}.z;qn=xNM*pVRp=p ʩ . z Ƀs>a>d7F҈ /JTDLDY# L7ն`mcxgv8A$$8/5蓭wt\%.H /.,z+֝;mUpH@lW>O]DnƼ^[H-vAFoj51d(E#ze4 R \凓pf*5$x-Dd#gD>~GD;̴un8@x%*j>!ġ[زv}쿊󲊟$J%F*+S~f}EufE3 6N80?"?ˁ[dV^pNj4M%"SM=lTZP fF-ʪqWȀ.s=fx~2xS<bA[FqYB6vq{74Ϙ?t~|mHT\Uh1N\7˞Gyhp/jk䤲2. Vt;NyE,Ƒ=!ӻ:6_BWp@[gs/a:MFYG8$ 3IF|S'k ҝ1)V =ĘD_S(rOGsgNWL< 3F0>JŰ#DnID2n`80T ՠz\/X>-:~e*,mʗgusّ[l]r4mm~pfvp[4WpO 9$=顣Ŕ"Q}2`ײrf,EHDׂ~MrP=/|MEG*r0$4D:@BxCp0_+ hJ落/,Rk:4`[W;lz2ge iKk4f+xf}'-RM>eڼ;lM\$Ո5vIa;vyr]Im oߘ[ FS u4~a4 C rd-D-U5Ȕۖli& psYaHScox(~ pn="N;pΎ/iS'gy6^; &vI`g+T k^sS$ӵ%O2۰ NpI$Zmβb f[?͜㽈zmFS3D,d,u͆ YE]jyU(``9O֎#s@jp.KhܾϵTz_DHNSD) 'Ĺb^'FU8g]#ȳ4UV؂f:#Jr%{i4Fen7]VyAST\' (u#5 I. @O;"0I gbT =Jrޢ9Ô{'ŤspVJԤdJ u3q4@/GR}=6sO%d"[ބ| IFYg b8wԯK|^m.ݦm*Q Hk`i#zs{󦁀O KlHoY`X]o%x)ɜ쇙p)j%w6qĠs_5wJI8`ъ>Y7)Ƞ~n~聜Ԏh8dž^A}nTfյ]z%T4k]# ΣkO$ۃ^|,WtW? E~|b'Gg߈-#ԪZVc,/TڨO Cτ%k U uY ia'^Q˴z`8JBHH+va\x$fl8.d;o}AB`"u9g|GwZ R٢cUBd»!b +ig/cG ]GŒqK=BIfqh:.j"߽ɿU1r?xGkUFQͨԅs;XfF @ٸ#"`ڀu.dZe@󿣤ffcُMAJF_0 \BG+^r\⛺;\` =~C6jhETY6O~LJ%Gu > Ge[a<î&ZVϩXk]UIkn_Q!f7~ˆcx7Y~FL9lSMlcaNxǬKŵq?1&޶R4W#1L` z+kbX'zQ+qzYCu{iM>,%ݙAS'A0x$p||Dq x\pk#Ѫ 3 >Si#~)f`X[U(|8 f#NuBO ϻ4ziݾRtc՟v/3Ed zO# 8 /M'&(`pUjlQr;J^kMٹn0sfC0yT}AB$1[XlTfƩ]wZv",KСk=B֔,G ]ci~'^TұfGqOe]SӖ\ύKE;NttNr$Zye6Q=b@?X84Xlj>*7J Y.r0ŚZKmh>By$+.!ן.*'W kܦMg2BF105% t䨰{'Rm-f.9,i&pD;d: T3I&qud3p G>}Two+ɰ)uv7>нh™Q|f$DR`+ʣi f /Vot \{`s%{<(eI^:y{#28rw}L ބHW pb*I Ou>x| SxNU~"j"Eo U10AAAJhi)Z.^39'Yo6ȏAN'c1'G~^E2pTd6Ԩ@%)r0g}LjBqFLE{xkI~kȋMn(@n2QbUJ>8 ҠeN6Qx'YZz&Xu+etTHqLFF pw; -УOD:7!TDBvKwq:g2,N+9N¶-cgTY<Z:6_} BںK 0mjVn "黬ǚyzR߰(>sP;jSbԶ"*t2 J`iRwpۈª_phF=^vm*6qǒF<̄e /،qj~_5lK6Ⱦz1?;A+,9?Ms Jfl,#}L"L?RY;2PiӔ;.76JJ+. E{NS'#pxܝNg"`+n 5W-6[UKa"OުVתG AQPh`^ ry{bQ}=r>tDaHgDC{c fpV2QL:4%L8 TvzNj xA?4V֬Ox+·\k`I]`%^nEtBYYE/(B~)UPOwdGm>PG|o1rE]][G1J!PF*>#2KdyP aqu(E}ab=RXԬUl< -,OTwJMeYvH,KWsu' 6W]p0UQ8* /;9ycnUEmBt |e&LXO'IKHZK G<ЦoOe|4))w*D"tc[H;074i/;IйQXvq.btQ0$l]I&1UYCOGu 9EK衖g6v[s%o4K9@,iqy|X'&m2/^=~"6Py븙zX@t1AlG9O!]@ ^8QǥTh؝(_yӴnhm|ORC0Z 2qj,xse?ฒ(ecG|x{ OրHi̯p; $ $ pO@7[ksNƅ^p8c/cQWpVÁRPD W Sڻ@5;^4'-7݁$Nˎ?>ΎP{0y4j۷za͖y`MXP ei\ ,X#cS)i8Z7P̛uxT@w3L~Gbuշǡ]B2j5dr&=sĄdBUKԫ~zuMjo'Q9^.Z%yZ(OO&v%5F=+*&K}o1 vkh9yeEN![VGdEV' JsN7Csfaa ECL JD 4]0|^rgGO9WKP)}H|V˙"UHM$@CVk[ly8XKol*1@k6htiGh]ncIMt; H1ѫ`>֌9KZmf$Q_dh'EHXy6 -F$~CǖsÃAK,n胻[ 'b rA;bN7סKLdcu0irhQ ]-lތzmn]I3ڲMΥ%s[L*P-G'y~4}Ҫ^BT/ \ZG%fOC !&M&|)ڇq XnJ G-:;tʼ |g1CWȭnP}p,],W)5´lU]`^(WK=yol+rץU V4- nXqkn Arh蜏S^idl_8NMdYg)C5869+P;qͨp3F ڎ#~Tu# ٞ~|J࿸ߐ]a~/;ٸ˕(Ɵ+DTx?S^]Ӷ5JJciT]8/wrF͈ O#4sYM3B{i_ L^cPPʚ9@b\ڴԣnDQʄLh r|ZVz·-P-7QLu!9MN/KNȩ q)T ܟ)C4570H?nNApPzf*^X -vSUMƢvNhIbuBX_IsXk ./PzeN߻0Ogp}&"2TwJ(QIA" CYH~kxT쑷jAA+̂j2/jT* ʽIr٤^{xctZ5~2IޏOgԾgXOճ @݀ݿx/!<U|Zw@y$ԡ$)}8gܖ{& @)]z9YhwCL>"sD𩖛d4D;Pρ m)aͣk4w4{u k-U -?%8D1W(Fġ_3顧ZZ'uf?)Ax?}]fg[xQ#]2 s(jG ḩ* Hlz%Wd] Na`HES O% +7ᑉ3,eKtNXRG(Py=qA9bчѯIMOEfj OK7iht`6yj:I^,VI?Ԝd׳rrA`١MKU?Olgexz҂j Bh+ x@òJ6"_rVul ȒJPocpRV`pjҖ ۶!kˀBm7r[W`3v|PбIR"Q޽K;d,ITֆzh3d1nyȗ.r R]b[a <8)-w0Wh Q3 =)!>qE;ܔvM7Tu@k9#ʲXJA;{|~Q){ [ ݰvFmgMkA4y V`F7`$*~݆8LT4$xݐAIPZ>D|ztw-yJz2:X?`oX'65ϖVΒ(e)}6u?S3 +7Wk{0`1V)E\̈.c zV$g)QW].wI #mVu-I1K&1?(;)E7R7 ?*c&4< &w\\d'8֤SJPh so]q9ic&VDQj J--I NPIjs,ړ>T$'ؽMRw9KGbCqܤ0IKVݹZ at ǀMsmg\h"fm%f/6Nю/K28GPsi)& /| |H$oW E]|E3 L-?7j&sa:ZuP`1 e4Є:Df@wSV5eށvFd"_aY90\Rl@kк E-TȏaÖe2qϢru`&UuLڄY|z9zuDNweXkJО\H3&ʁ2=J+7B^Rن?ݣ^pk="5Jp@H,֧8`#ÎSw8mgZ~WkpT .bnOT@Bk 3.LŦٌƘe &ʰt]^||wVƮ?9f@:j#Vqm KRKQE/dz& jxwCl%/R*tr]6 g\֮e^KThaQ{:xzz4)G$HnDwx `M]"P?([x5&H4ذt pZ4l;*qXr0NX? y9xo{ n=L =^/s/~6T)]y>\t) *qŴCXМ!K62&;#"Uj@38tfe_\P7`߀?R0MH>r?V4Kɕ"Nj=dV֠W2p&5̮ x3kW?)cF>> @ #31X/Z(Wɞ"Ycj#uu۲h&4 Psu%>+9+P8;IޖP:8д gg#Du#V(p5!1֪eN.z¶bll2)SHPpŀM{ vvW2=g5d7;@U uڰWdyG@8`H5*SeL{  K&-odc:pi@ ig{fB58Q  co5_~ KYF#U2k\n 5^}DqFB_ĺlgfa>|!<rTHe` 4PyRAD'5ح``鬫 a8X)$o\'j9#d(%'O{Y|-4UP1z~[*>UL/Зe.ϙ? 櫾w3@̷yXwk۟imF*yhk9`ڄlcjX9Q 9 I7ix+AB{EW[7 -?^B uO[( h EBʹjt(MRYm遡U&hClG Fq>M/&p}a$>z8i/8GWձmM V=B"$VTG Q- G$GFx-x-*U4Z4!a|,1YkptΜ^eM c-ړu>vI.Y3TkH{Uy_IeG/3t#j=T8P2}[YNNյ'qƁיCfF+xwO^uMK$/ 6X M>/9shvIZ2>ˊ_&~0|Rmȃl'_Q: [vhAE5cIL*m!"m;e@}T=ξ &p6TI !1⁄G!L;6E^NwMݽ RrDQdxϹc %Pjӽ!_I3*[ 59FlFs*q>osՆ\i;%ukht!TN LVqx3ݸحĹ(-sxdM o(nqdM-7s5+|ɦ誦dsG|:Dk|CarT"\_w]2/f'/Dw"ɸpM4̕շE$lpvX{װ58蒴ݜm:Ri+2iز(}>nο2Jq9pZ"kZː5]5H1 QN@;/Q;nR>[R*h!΋`fL51jM[өʊON,+B~pxU 2M̸S8Rqͮ6~XN֟37nGݍTU@0ſE(f9:pRť{ޱmnK( %tTbN7YKh.CZnjdJqew>C&X8 HL8~#oj ؛dcUz[_VFS(/.yA@(Qmfxf6i_ ,th0s/CNFN6ĵ䷍stztk*ݝV΃ k+v F:Y%DDZk.!iJhbXOW|T/9.ѭ F@&ś8 .'b$e[4+]gQÐV&JL1dػպ5i{&t`8 1F@4XUl~J<9쳻QiŽ^s [X_ B-ݔ2pRRU]'{1?W1јlPk݄p.\VA6G+=~t_wҥ =2p yGOo40axH]6ryI6fy -0 k eI;ZA_ڈP%R`o\sVQvEslW fh K57r 1=)-LŌOf |7oۿ^4ZH8O>9Hf.'5VSVdq`.i亘5&PI ʳ6ՌVC>-2^8ЀӺ}ɞ^>0DlZ mΣ@ӋuÛ|-`A* bȩ捓o'awT_?xTObpKbO#Iu- wFف1`fƅHDdP6i4!lAR|e?a.!z3t$v%iKlns};"j)";Sez9: '{sO)Sg3||B]ۻ8=KPuH=o[ %Nȓ9'$̸yEʞMu%GUBr$C68NFP 0HbvO]Tkn.k"م[1+rEU9ӼtUd]x$kH$r<տͶ Ji-2=ACg/ݷGHhHӜn*8f~騥~M{F+u fQjM.[fZ6 ^ABQKG\Huh֎P\A46v(fw-!o.HԸN7u- e">mv,ևiOξ:e7@2^7ݱAsIqx%`Z#z wɏ^);"6zkgpDhèHD`6UG(1|HT>iXl9AC IYXFV.1$7h,@V^OA JO8,oT/Nu_5{̜%1^V$dfV> NipjuBb'3E[*l Q1G]B0bE]}fXsNJ_y*O h+56<@Oq(Yr2{{Õ?-hĿ@CG Ρ{lx_r8n) iJC|[K»9EQ5W0lz8i'Q;ޏ݁Ya"jf]ߖhw)G\d=p5nCڧX״">]4@A4dh-vΖ8H[J' %r,c*҃dҧ̇C[=/i]_&,g1Y,w۾tD4qڀP/S0%S0AHUMPHk6I(5IxS Np}&fiTts{y.'IQWz[lhm ) f)ѣ<)F-z($A7BkޡZw[۾uWH9}0`4C: MG.ځ4{=19"=g}ጆP}Q ߂>!9Lk1V^4 !u@W f0ݥ.p[e45@frnflH} ]Ḱ ѷ%\ecld׵ILRw|57ƤooyCrsiE͸ ިK-@ic"ȸv'ZMȉ! ;;M z(+D +1oI> /BpiPx'Pٮ` Ga!ĮSG D>!`W`F`VХDd/nڒ$=*L}ʳ_*1eB[#g4Cb_4_,zV癵=-ؿE'E;&|]#^/mvffGB!|J.=<uRBOfn@nM+x qz z-C>-And+( +'bMP{P<Dk$ƇKKdAyj7^59֕ sSh屦҄{ IonQ'ݧLuL[ez8A'1$)aE; ͪ;8#7j9?ĒD"oo|ܲ.⬅'FZNn׃`ڷ[A)^X Fza'"S9C.kABY^ a6 zEHx̀Gc\C[eX) 'l.3 k f3kH1,7.s9 X6Q&l)b}u[Φ8"-I.{&oO(W7Xתum~Y?7Ãzr#p- 30)u _g`dx3 ?5~Iޅq:a7DeΜWy e^rG 飬X ӽ pH_GB/k_` B]OS82Zm(dZE6 x e*ɶ nκK)՝ Z9UM=d^Ôe;LFg9m֝}fhL|xH oߧ* 3%G`-w/@eKZ{*-ZK:hOGq̯+~9E0=0&f['<& #1 gGyN@&U?Nt`B.;vvT=5C"Rr^KVŀhSrlC]^\! pAO*xfЭ:L@.tqOyfx0;to_*.Yxz,Ev{KI5r@ `W͈r<뙰% 65b&77*+6.zD!аEr @&測xFw-(/!,ͪ>=!47c ƛa w.+\Sјt-? ssE'F*>+}h}H#BAd}C Mqqh%%- J D2FfD̃Svz3XOwaw].]qt:DIݟDR bZIDH:РTP9j%l&AoCeϻ$(7A; LeVϺC/{)sp6~$/2$.ڶǬ,UA:!'5BG|ǜa#1]Ú@eݨ]BH"b-$r-siNN<'y/FLQvH;D~4W9KGwt-fe:+Kٱ;6m]gaU=|ad͍3%!C-b9nlcd4ꤠlR՛[4 ; (L$TJbbMϿjK2C`̌@LJ̠'/\}@IP6->QZ9ūl>&ɃӲ":G&T\ݘbhi+jeɞ̡ QFbU4k?W;m5ٲgS%is4?o\=A*V+F\r)BEM~1)7s6 0!=]Ok(}}3a2o}EAO6ȲIڛ-~|LǏXfz̓sa/L~!1~-HP4AWKk'8#t'] $фxZ=])z94K@֌g{+X@)4DJ|:>T/,NhЍGj(I[51kczSDMU"ރAq[_A֘)fSոP5ۃ)=ch+PYgWcg s.|@6*s%| vĎrޭBܡ8FSss1ٞ,odjn#q^dᅖϊ QWQCP'e~P}.~f .m97>^"ӆV3=r&Cw2u{&[s=2-x ^{zy𐖊8_7)#iFD tpW[Q9}uZJJmEÅ'Av&,uOi 2 @( RH]*1|xb.j)G!`[nwDD޴[0z+zSZ+R5ubatl!s-_xi0K&|#KEtzEO:T v~ |i!C$!&DIGmf$Tu2MfHۀ#xOdQDGStKZsP]9/,$,8ՊMzAe{N)Gn̷ƛ1xi1GG#l\Kf]F Gtn(tc`2[p/Hضʓ@h[&!Vsd"Of U?br ,o*g_%Gi`-P2ݔ#aOIK^廈ͼa8^f+3j]Dher[%v7Ѝ':L9ż=TkhFUVMsܡvI=;_F*Q{J+8?p@~Z/u;0*|0jâa*]YsZ?D;_x1es<ӑ֜һX+Z^*ci57MO]gl {vqsȺh \hz7`Ŗ=T22F@2f|4VѐډtH2<K/zW|L^R_Tu#ց 0CB޾ W ˋ.T^b_O  /{Xܪ*Nφ 9PF)33"aurrl%/* Z$'Ԥ@1n Lؘ1Ua^[<jfz]nِC^EJ38ރ[gQ)Mv>OB/]ٰvk :mL`<=Ȣu/QC2XL:O/4؅eĿ >mh!^LXNɍPǽe¶-)9b- @XDR|_qt5(W鈦5ݳ:wKN- ND^&q>qp B9[+%y:40_T*Cu40{Jf[z|pS8{qv 1 4&#?FMYաl"EටyN~-Ab Kk'hlR/]N-Rr6$rSM'?:Op7IR_UmXrSj9QhCH~C7.2pi87 ^"=Xy;Y pXiBq ֢\?8[9[cԷW UKuaKf&\W\ЮmOZ{x H_˻ZK@fGvE\ה,8&Df#o:oWɯ%f=[sfYmw(T--D^lx#C5w~V!ۗ~ϑ,M S SЬ;JH32EXڤΙ] **X%]#%t!l+?QZ`.1_C ju>ɁjExj.w8obp|@y#ޏT%] go.@k^K-Tu /g.+Uw]D[2)_J S!ڈ[{y٦3p \ܡӵ[WH[? 5 9oKu2.TeHw*F2:BGD>E 17\_P/G}{CXK!%1WvB1ߺs砓/rTi5'Kq! F.\D˩]_R~Ԕ>-xߒlA_;h$* N!U^3y/?p^wN#V[+*Os"Rz+VO2\W}_1቏үysr'r 1rq".cЙ -3gq%߾r`[ncDž%ʅʄdĊ "BA 7P7ƲEzXq m3#bp%]lg+G!;s9,"ai,1;T) *E-W-pvlv86m{9 BKrc8q2ڎi`X)9܆+HقF:L%w5TNY4EkAfek ;E) x3F#Da_zʎ0 3ߟZ"Z_C`>5< 5i>&/BLl ];x%+?"k-tj:dg"p4l;RU.e# Bax;Xz ISmDs %m"&4=(WQ^D l$]FC @qAfWP硙zwKfcvc5 u$fQI:e;9‡0Qr: R[l3蕞@\ e$:hT? tt0,z(5rF Y@T%% lxAn^X`NovgE{zv;=]]g8k-l6HJ5x6p>:L5~{qsp[6kZ=Dr`(`ӴG8M7hL)1:** PChnWo\KRd=iƈKWoidhRN} \W#D'qaߏ0y@n ?#fy{;Uff &KR+n4IȢ6P*2b-$u2ML4`raY:2,5!vP'C/2_}_pV@mP;H=[cq5ɳH[9H̾גR ٘ȸg4;o[!Ȳ8p6GIjayܦҷ֦aL82I!4*ٖenb2 $HD! Bv9=r)9U,a[Eҥ1r5"׉O{BHB}I_ {^* 85VQ1ȭq}α׉֩zjM-^ c)$81 ԑCx֍|lJqdD@ksm,A=zIVIOPM cZ»[ ]S6+ 7,&М 뛂n(Qy4duݴm&5[6MW0^KfcΨxLii`.TyI:]hYx*7n`$&"o3ȼ_U6 9W͎ \i{̛&m\+_.?/.X^?jzpz҆mnknr_|Hסԥ}̊r4j}vz|'$:FPCtӕ4anl^X n;?&(})(W)92|-#7r&EקW`1ձlْtB5{D Γ3Z yzEDngnhK.t1&ÂBqy7q\UX6xoja… DuCP?2k/X N19Ru)̀ҡPe*wMA!TIsfO kvV%ţ*T*j1}iz*h״(ò.#K(?0/+8X fEԉH=󷳔AyQ! _M4r.<1bE l ޙ?f 6{#97>VIg>ݮ" F\<ƉE+'GXq\pThdDpOxez؈ %"}[L7Nש6髠JƁEoU>h;pgW90ЍL  j[yP` 0B0n|1,ki0u': SN|EdJ'nVSVӐM y `ŝ߯*utH E #$b j Ҥh둊?3cY$_Hx.PZQN[j6*N-t߄m(aVEHm wX7kϽhFӻVuM½sgG| m!}e-jit`'ڢڛlHd0RZ8 x)gȨʪYTõ_g !IښVw{hp(8&p =Zj6A0d6K~%gAL C):4FFqCX.TA=5f&n&y\AwyJ|EW ߲AAnQϏ*4 /lf$Tn1d*Fc9(4ؓZX$i2ӎl+ʷ E;f Mi!$m#-CoyOnRJ[N9+llsVWg;Cظ 73Y^ 1Jɺ³T5=8QapU7ӏᡘғD% FYRe5 VUa Rdu6*wF#]2ωT=nj#yʛ'R:-t4uch/-S/OC=D638qՖYt( fK/0#_1`$)H8uBvxNBeB II>eMB$Kenf:G*;`E͒+4 Omjo6X@ru( Ⱥcz7VM֡[o vB|]gxq ߒ MX%W~VW|rdcB] Xj-T`.N -e]zB u!*Oݐs4w@QU{K;011Bz P _OWVqM D>ËcV/=^g}d ǟtD,iU_;"/hۺ}TO ghnƋޙ/eߎ"62l.@`a.&wbW:DqاI$ M^)BMrC' Qخ)U}Ō{Ni; UQĆXʴ+SqV>qmб MSbIUqR3.ŀvd'WbjHU Z ߷rA#%OrY0OR!Yĝ5p4Ke{+CL0`ۗejrvybkuCCs8(4T!1{G^jiBR "\c ;AJ쬟;SAގ %wVG iVgU50ӂ6Tܗm¾"RDRb_]7>dܘb~ow' ҆Q+}I4mU6|k1M+^Fjb=BSenB*X`!eI2A`V I$o[znzMɌ8ĩٞ*صA SI)VAz'ޅB?W;EÛjbQa!ERК&6Db@wu}&M&E23|E  IXo<,7vl葼 ٬TyԵ"E4bzA]g\^ѥ C]0XIM{|${l.29Wu?(hTY-!nl^\̪iMLɨ{WSS-}XZx:S &Irh-&u٩SA@y.$҄B1q:8b.ԏ λ/ jKle7@} Q݁I'{?X l[?V ,[)5Gc zTEdN>H nGsI}yhHn-}^pRYFق1(3Q|橕)"Q E#xp}M - 2&eV|Ų^Ie$?ɪ%.u59]OtQ5uZr>[2B6xvJ׶}mJ&wU5Ϙo\wf')pY>OYZ )X6O .2lp)T# MfƐr<E$ w,f+G|:V}~'T v zZHg9yc2%JEQ[SS`]ʮ"`Mv"dX]d5_x]E+ 'Jў:(qIq`7Dñon[# J6)`^$;C5iJx]L(_W,Zdyj.&ox1b8s<^ x:yt0>,UŶ[A8s>IMfMOŚX,}QQn߁9VjX 2$An|ևQ*N[ J3Ƶ0ފ=߮[oQEE[8H#$*fpG"X4pZ%g̽sΧiuJ vFgr^ߏ]CJPI.m fuO\Q^!YIIe~PO*Rr'qT?]㰕{ M< B"\/[@R%렼7p9)FqOn%~A@#(Qqy eɱYRP/\p`NCM5g[Z@]OE?ETJcI&6cm98 {28+kԲR d3EVAvRs/wkR CuEu rBUf:֑-PNg9x9)ѱƺҷفlpRQ7^e2-|a 뺃X;_aHZh&yK8u9Y;-fnCAYh1w~6H/Af!V1z3 b(EMLQh nQk0Z\xj 㙜Է7& G c/:)r$3, tlu>ꩀ>Mm?Q5 Uf!}"ua4YzzdiJ՛'CR@[w5 i~iXEJ0@DSNp׏?kt<^]!oMڲ#'a_KVin'$tݖJz%i?"1lA'"9L셈k+2QnIӕDLd8F4Fn5zd_Ci7ӹB}ŌLhHaW73u •;ZCajmv#SoGgS[{! ݜ$=4C96q/GIYYAܗJ 5kx'*=eib[:Rѻ]'G"λ6BiO]3+9f1M)Jp_ѻЎ&L|xS<㇦8C*W$PWu q.pVbm5wԢ@v|ӄ,f!9<̲^cm{[őw%VeD20¨49.U4͝b9mTwMyu;g\ w!v3J{ޤSVq쥽m E]7 ~ێPX2:'?hRY=!FH -bEIB2K-U^Eոį_']5Z#BϦnoPb E|B&9$-k]V6XcЄ _>s{b57?q)vot]*:} $Ah :nZ+ZÃ0a]^ឺIsZ/ (Zs~P`o>rtԙumJTē\=>U`OBNk$Ph2鋪L2-ʫwr/'Qz#{ZdZw Hu雥i > _?Q˰" r ~qE V]7{Kky1AYyo 7Z9;0Lzw%Cn^NZތDJMY&h%\4Ok O3M^uV"L҉[ {BW0}k?@Nxbrw/uߖs bLt}2B@Kt!1ʴm-IG0;R4tZ?4拕1"SAEw><;wle 0 vPl~9H$8ΏxCN`0;S-U2(o{~g3uhL\F޷z݆Xl<ي5FL4Zo.x;94πrDBjKv 蔶Cau !"I[\,X}G@Q $ӵrád]kڒ Y&c-54-q b(1=;~!ڵA̜x1E7g;^#AU?~(; [՗_5sFu7n9LErr/-زxWy1}%p룷 12 +vJ$[mNCf==h st@KgV_EVhT`" 5*BWd`^[!ޣ~FJpwآ$tc׈x9?[?ۓ(pc9lhx}Ubјan_#|Ңm3yq!+*ߟ9D'Ћ2=EI/J'#Z(!Zԗ!}dWL7ߤo*UjԃGBmUaj-/.Krls;, IPA sU%\w+Ӵ_ 8Mg[ ř?+6{$:E\~R6P#&P.W1Ŭ!GV9P}]@[uTc+*?\xO^K3Htsc02EG)r0?s-IjxiAI2D9ў`t=剖zVCڬĨLeP<*\#| ,ݞ8U%v Goț yxƹ'^)TЗFmf{T3uR2֩Angݬpj=z%-و}klfnV|]ϳkY(O$gقFHА yjN)ryL݁F\]: Rl3$\'1r@O)Qve,E:_o`75(%lpD3w<^9"zŬP7V4ʅ6o)#:O]/7`k8H3vNWxɭ<!X:Wl}^[Hv2lhhq;?=E}6n3ԛrH,2^/{dg8A'KcJiqw(?>߬qQVQ(/z C]ZpϲEaxh'A#Q =ĔXg{Z@M_9Msp3{.mW >o:[FzoGEg:̿2amp0>yùEԤ ;яTbZ͊WIn2:<)|W=h~JZq ndb-S4g[sw(TΏ 'ʉ'ׄ`nBP4"=X&.ЩA]ǧZZC 2CgFm492/cf?`z^^gAޛp7iN;f̒25u =`ڪlwbר/խ?Oy '+\U29!B_0 !71-o8O\85|zJJn@+̰)b Mo'-H%L*UՁ/8@\ S6f['Fxg8B,4_0K N:L/ R.6hV:x9‘Epb_lLib0)RAhwrYKw 0rC4.vJiKÑ_N=㯕tnIUJH R6 ^~e(j( ffŀP?E`lwBO' ,IJ2@3y w%/ЯD#czjtMݰӗ֌ DfɃI2^ƚf)`TO\L;:kذmf(x`?*(sQ&/;yLA\lrW[ oc'L:PӕCpZᾆG)5VЕEףٞaM.MѫՈgk{O94A9sٚ%F咮n"Ẽ*y;Ŵw[119]O:o0pVIRb6/8[\"@MxzD #Ҕ+-ǻ8 Yzй/y/ <6GTqTf>+< 6M) r VOˁ w_њJ7v,yL4\1v,n\qš,foH2R0<`A8Hm2vVgun O 3vLn3>-(CX#`K1=OYޘMa{!W@Zk>M ,l5#v >\d(xrH ?rEPrxQ1IɪQɰa }l(k.8(erɳDOLMg2>M|D{1!>d{u" ShZW2@#&w빛R7mXAjwB:[Tp8d/LPzbK%`w3@qr:ۘe Nڟ(XksKAe{2]ɹ]rNseuVZE9iц[GP:mF׷ Ǿ:!}uc:tau&Rq|ggSfbt a0IU)spXy9h$&eHfa$lNKU Yyڐ(cf3ŭ_>:hs ev;( ﵻo<Gۡ &x*˘wa Nj;#CmۡޮhT>nB19w2x\w꽠nL6RE>2OHm6b 2jGƜM?w(mNɈY`W3ғfbx a?4I'hofWT{!>f+.Ȧǃ+}Ϭ"??s -9T}ډС/OůS3>L t  +g"5~S'ڙLMӮ4 P7552ޛjﳆBopIȟd^S`(6h48u/oCPx1;օYl쒽5ď7},z !(S_ӡ6 A q=BU<~0YPz9x`!G̰S Poarrξ Ht[e1 )WX1N$*DGWSGR+ QBj)p)}ٟ 5 eGb >k&39mnPڒW +`.NC(Bc^g:Rc|"GHb/|\KSY(ŭH n@G\lb\&$vaLJJaS:Js-đrW"6O/ S˨:#@L6:Ѧڮ=K$g_9ܐ^4Wqnen+g8Z" +vA -R'48V`dR+ U:kCnX!a7u+3Ӈ4&.h8Pl. 2 4va)ir| o+s;\k9[sڀHh81[Y WNET< >S.Q !; ຠs)7Ƥ 9L%Q}' :|sAcԫa _hj k7[]8 Wv@rM9E4![J4i\ϸ:tP@OYJ|Zˣ*]DWbUp;gfD{>ZJJ$+}eVpia9Fq ٍ鎮n9Q.2Ǩ&Tɩr:#0/sۛ av'C5ZN[# <h#NoDɵm޿ɫ n`jFs|s'|+uWH'YP TH`GifQ2ܔt&9ue/xN%H7xWZ.*pUOqF٬+P {0xƍ-ʠy- i:S"BX۵W@rg'2KZ3hα& y\nAR}c=6 `T?=#2ɸ8tvǓ/qSfϞ;'iFȕiDj@'z/,$xU EZ6 wf)Lr8Y9mKBX9IbA)9o4 +*J}Sd ïWiE1YΑaV&G  *kp. „֝yq0A_Kp*μwL(Ҕ+?Xp -lIsBk!#3l3Bn(9}1a+U2kB]f( :z)gUɛ &ܪG- 2EךAS&bBOwq5cGuTC,jzQd~!yuIPɯ Cy{(:5L-}PUɓl귑GA}Jx&(9tDb|=Jbrbb.uΤʛ076'k 񛎄CtK縢_QwVۦLhr 7 -|`f5h& HDTzt=PWdr3"Q p:yj{$Z~b}C'@:Ljoc8.f0[fW8I5H8͐_صw1 Y)Ptֆfё+_U$)^w4/k1P4ye ]bS{ c3'CrIJr[R t\omx׿tNwJ:"Iy ~m[f7b:g|<AR6@OUTثLZʣ TrМ)M[IHFLKmOTRK nvhw(\\R~{)b^Px&^ _v#wWIaZ)gvP3Ө\dI7Чq 3,\Xr͉H!= v=4UsڈӢM1LrU`ͩ~Q@Q.4`sCע#i'{ڔOcy*a`%_Oy[a,p~}73jR!=[&}whI5Dy4럪FZZuXCoAw̚s $gKO^^[ޞ*p n`lW! QÑ8K d;w)cphCI/]R-:M%ݫ-}ީQ s` NwGS\ڮ;o"ۯV10ݟ}8+~4+Ĵ?yQ;Ћ ̏~%&v' iY$h0L?GaPe>=6!9s<%$T_sgm`B#@5_@e B>i;!v9zl(A9\,\[%FMi@䋡{Da˒GshdŮǞc]gl D$̒)?Zwh$N`53qdnLps j1 [n s,"/4Ο$glՒܭu"ՉV)fͫr<ٗ#h^73P SdwvsWKr־.͏@yֻ &j\g"e:s8ۙ-}eE>z1ĽIt+xC&]fC`9ZEӢP |4Ii&םQײBF0Qsu[IZF>nMEϛI#d>LAU&;"!NWǑؔ}ٲ. ZrF $Mg7RRwFV;PH1Npc*TuF|ԉtGYM Y.c4NcMgmΛH3T}b3ct֨?M{yl. ɜu3lzi9)M%)h~2fTk3oD#(׾!b4hn9b|.T.IB@L%,\Esŭzȹ=b^7)|43Mq.b Cd!m3A\aG~HTUOqR%28^Up3dR(O~Ub6?oڴP 39*B)^ibQ AlR9bīX+F)R$cc"d7:sjBd9x'TyVF=?͒ʩ5B Z næ$r=׈=mAV[2q& ZzT[Mӫ7}e\xLڦUx& }!o?yDlG9>x.Ųj͠n_2 %wЍsQ%MS}U! Ocx:GV;:T9jj"m΂|gܿf F1Ö*#˵r77j8ry 5웖gd_lIo8 +LK6_JhGk#Ӱ](d`HGj#ǯd6}D$ҩpdu=<džt<"oc)bX7~JA\b8Ē.Z$["\ z["nJ$T* ++' BG#ĶZdE!4 cH"7xWkns,XxX8X.įF`g2}xή.{-2ۤϸ)8Uk.RȀBj 3֒\y`U ;+MCTHwLSǹi˜^ZչI3pʙnDElŽJh1V^f3lBo/ɇ9s8z#]^X|z)+K3 O>$Wt=S]51jW^Mr#y@ ;6{nڇп%dsAPQd" us:v *$0QAptTi&]I%pC?l9~pJ(_m:)3LEs9IDp[g}Ţ 0{[B]DoZvH{7/P(q=hRO^ȖPCP g }B-b c=z s![mwi1D-RNo~ KG`8)fryz?ݱiU!N- izk˂jYa+ZjJ,`u>H O?.g .\JMޢehȺiDFMddp[AFtoO,|f+a0hFQP oϲiʊA–J1֏ "W f1͗N=ܷKTE!iCi̥fGh*{ 2Uz{_IN5^4{K$m-4w OO[ɰ0XFfcNAfqDi5бcK}WB.4#ӟ0>\P2>񷀌\}vЊo7^|<B)3JO$wW9?+x zaA: Id D/Y 3R1xv?i˘LتapKWtˏ |+6//'7j:LcpՑlj39p™gUmfalr$΀a˫h+*s#*)V`v)bhj,rsKؓxޘƷ,IS`RT~] +A G˱lT+ l&4^)s^;RһY+̛ _)>\p#ڗ@5bLt=>ՑC=86)c!5XWY|u=-*$^BK@'?"yxbBU$? eಝe@ຳ0U3 lKS]\!-LMc 'kѿoOGIJ!,N& qH+m( ^,Wǯ4-\>ń4] V,ta~,} aqn5"lTccb+&ccY?|Փ)b"Ct\ :̈́wsS&w!v캹՞MZ(t-}*A=caMÐݕOȭ |ٳ SYlEdnZeYQa9o1=YU/mxKO(U{jfzICӫVdP_ykABti,]ڇ @7Ng\C"{.7${G(iִv)>1lGwIo\D>/x7rS qT5<@yσ9k=Kd0"fqP)cP 6K8KbwTsXgVQ'[c?ةRhQw  lB6LأW:7 &'Ѵp&FV/cf[TZA_> :?^Cܼ@yWbx /Jn}Z*\i~i r$`?!.Dq7l}IEK'0&e9T7,oV<0 lrg;9fu@0k* -“|wePu"(79uT_x0 J䜥{?:%Kht]/n$@ALlwR;33Hx1,B0H["!pFEhAn.};ĜNq$3)xO-qNƢMWC X&lr2QE-]12R 0v,7Tì'QufZTgAݰyTkF8I@C0RO-bD0ʵuQ؉]xغ,LU<ͬꇗ"2CFYp*3xFZ )S Z޷oii}ϖlTnl%ɴ}`qQJCq{/|*"h i ~/Nc1]AYML"@SxhLQ!B_,n!iVe6Lz%2ZC"pX.yMs ĚWDKC41~@,(C4ܮE?7@}Myϯ612exUBf{/63}e0ZP>ʐECA^!6";|i*Bo-Rعs._( 쫢iy>BbӇ3Ҭ腎rZMkF}Q a# @~#62 |h h5C0BmQF%qQb8IEhUs6Y :sUtCG#BħZ&q*R[X@Ss(S<}0ڒ!Q[ ]#+&= ]s v!4? ߿YRSi/k=)tڷ:M`trs' ᇬ(Fh˰wKWgX%vES)PKaCJnXavN6F?J4Fԑ6*sP_(e_oπMm7}P,cJF_C\IP#Y i<(F+Cx J`f~,zco*}AG/c< ?^O ?a>]Q">Yѵg+*R# @$$Q{/Sp!,Jׅcu {8ܜrbIZ:?X2eXf~oB~PWJ%9pOvWhj):͛%ѾD45zRnW3l)"QXoyew /QlF$]bUԙ+Ch]+^- ;` v+u䦐ȘUbwܲ/k-K B([Zc;8Y{p3 Aˋ,_>İ/B|rޗnnJ\u G8g{&ܥRKx272Z7%sߠMuhWB˽GD|uy<*_c -p W0"*!&HyNb)FZ+uOZOsSM͑!)smz9sFQD;-V4&ޛAkq$05^PcJ#`׬C%GOFPnAx[JilW`\;^\ef*Q DC An'hOW ru )CEg$}e;w)"TC?ÛԻTq4vsΉWOb\NnbKPRvַj0Yzy%8J1+1 :;_G 'ahjz7|_o&ڽ ʃs |Ӝ+̐YEZM;cʰgሺuセқc0ios[0+3>#()E~w`I&l¬-{z/g8SME@)@ -\f|ha5q۸ '膄 чOoސED$Cd) YI'&c E~{2BE&R∹6,;Mr6—gL]al}>rUsoD`Eyi CʂZ69ŹHKРM~k>SRCNHgSm|;0v@W"};f!YXQ6V)o|Dꊼt=^ڶ.>i+: t q`bg=L#x_ }ѡzgT5j v%6y6;⡪yrOj X;"?qFl0ȁ<>DA,-C6t\̲zJT!yοRnon.| A[l"e YqP 1b!'zaQ_6N?K$^H)Ko-&E_7nix8TZGPC ?ϫݍkc)>3Ϡ!`]I7I%PRZNi?NxףyZ7 >sV=Ce}@Ke(+.YN](*co^gb#XAjQ/2wc/WS,5 1w$6t@C`ꇭML5 ʻ <)@rE:/ՀHe=sEL[E{bJQδ?#`Uwy"w@7NhgPzV['m@2u|oGA <學JQDS-Ӏa1ݑ%a|^/<8t1f.T9M{yoQ|p K| ?]]Lup1O|UZ G2|ꂴE?s OSL0\hJA"22x# - Us`te_l#{$̀VG$1M"%?ͪ9~5CR_9U׻LxȖHP74NYĵե5H*̖PEjjD Vs`[fv4[5w7yxJ|\Q)J.ձ.ו)KzClUhq5{Ǻr a/e+ee:|>בf"rk|XʼnLtCS~SC Qc׿W${0[qͱچ_8; ii Qu37hv ݯHEE˃E~ְe(Ύ,m4H~7ݪ1yRu3%B @utgtH;˸Vv O]I>NwralďѤC?'11ƫHGNͦp>kV0(OԁK=OWf3ϣ ;ŭQ+3>0g~ TtRc8#W#o.7Kߒ eQ/L N {q0}?3O~[#aS2zClZj+;S=]×X# #9:9i`s1?ĺ&O;S܀љxnCA} ]xzԹ _ew;[ 9!j pr[9UU^6TƣbihmM{bM4~ֿbJ &pA81HgS}mbim@>TN8!…!#vq0XGW~GBV|hvX@҆gmvuZKU|h.3 O2q+|nӜz=MyCOL&|q=_3)/'9{dM*t饌ewy&6`)$R'ui4z3֙YT_4I[Jt}m Ni=$9sơG[I g΍@6KiڏeLLࢍj|n Y[̑DOJka!ٖɔLLMG~CvL^ 9ΕKpLwZc)0xS>#q/4C%M.XQz$9"4ógG#װ H~W;Vͤ(dw6h{Ugr^ř~/*?{kyZle?hɇMnٌaߥ7FdR; 4/U@6jc#۹XuXˈ&qQ\RZPjM/,>E(|3ZQw͞yy'?b72ٍ;%"ٰхUց;`*HԁrZj,j j R{1z7u넼"W 7bh$e^t h6ʄ)u@E=L̊(,3=QfS?P[ӌQ&07fgL=%[S%cc͙*ywcWn2t/oR2ZHB}X/fA9a}_ '`N٭דM ߑ)KfO#uT5O\f90SVcA=9!h=Ͱ 8oʋw8=DR2&v9VR_i7ܾƖO<5F;%lT{(߸}U ndn*{dpNY!REמe}x2Ib=w{: tF<~O-{dB[.~Xް7@eP=ijRlzW}ItV*^N[ `&8ɈԹV2jNu_Ǘk_;+aUU(<'UrΗꐺr)E"eU2hszOuiXt3OzWh3d nn襉:."dr:%fNQ1G y񐇯_F_T%4{Q+="済drgnXz?v&p/ B҉TȧCckj|R;J3$,X$Yd~@]’SO^i)ܾx|t}~ E;'-/x^7㙪 J@|z=:ֲ0Iʹv\k @XӞB%εWeIzn=/ukZ+%F˩K%1}o"z9S$,A%mdjy6m-L%8]6ۑ_ͦ۝&h8"U}M@g9⒊Q={B1JWr aVM>&MDjihq "I^Ϝ1ɸvb\v(Zk Sr,hsN|Ң+Wg%[U de-=LP{w&Sk^qm,"R:_!j`~8 na-,`wt{XcY܍+jۃh:hB=2H2qK@1td6Q7f(3gճB[qJl֨xmѵqAgCzwrcM dVKP{Pkv e;a`}.Xe-Q#͊9rsmNtFZ%"T(m,WBEyKrZjG-cpF+>ں:2 ڏ=e+BcS U"g BX~a\ֻi󥩀diges끸bY#F* w>fi^y`ŴQph^K\677L׈,-sH~IJu䷗9ϗI*W UޞjXm|ǐcdG1얳.N۳̾zc P<|e1)ʓ hr Kw Emp~0z5 PfΨCԉB4gzZzIE#e&BX#66:0\zF'3 t$u/P"8JCJq![[XM$#&T:6MF['Etj:2ѓ)ZשD4qFƍ'sI,I:Aw0a $jk,8Mqҿ 0Ub\]Sej';G|J g[1L ܰ+ ć"fQEbL7"y8\XoNǓTȯ Q!mXslZ_moSk*r#һ sJrKuaG{h& P+}JdN ~ͮ\OBc&UX}4 vzƈzUً$$I*"ݐR8LF oZU׏2tZ z+  |ΆWbo dGgpfVj+OJTb('+8FfL4MBqxS6 C\7YRLhq#.KVTK8֊&+&0[E͝љ-ݣo1/q BGMKHH$Ehgd߸<ǓKpL;# w$D$ǔL Sbw'΁;M[X!.b8+ASQmaլ1ˈ&Ⱦbin@3#;Fj Hq"yTT^܎X;/@c-H2 LħWd[€;k ^,Uh9|0Y¬_V#$|8!EAKw7ڣb+5y?د20o6h1P`_z}nu#>N5W]RZ^AM(GzV9)}GXF ] ϐ.޻toVT H1A1o6+P$w#,y,RH2󽺬Vuò)N*,+BD[W mPpQ9[fIlplRKkc%\gI[h^[x TnvKtw)L`'2L@li>XZ?bQ|$r;\X?+0Jwa{x#J @R2 3d2\ 0Q+Miه(كDko@lS奣惌꩕2" 䦔Ǡ~ ׶84PN 0#i L{Ee5{١?NyCY! F".ΥW.10{GD9Dkya((@6!{|ypkH15Ch\B a3d+B%~٘L;_\٬0U2z~&mk,Pm.8ia׏[ŏ?Bw7@F]#qˈZYk[2gE0$khʦؒ*{ݷ\ȔXJ!!/ҿ#o)?T '/$ $ܹ $^3h]>ڒ aZ: M 3(LTd%I f?Il(/%R2A'Ҵ^*t&1Pb) 8ZR2I1{,34ZXCBϫ[7^x|I[nL#[d [r3GS( k}+_<H2#u l EVR],z\N\2GuJ`Ocf-]44f6MVڷJUDz++ "M^Md:W@ DE\p]Ћ/l7,_`O:RtgaaY?@vښ2iZJ#׭^uo90VZ+ ^y \Pv^&UAaD+OX,Zqsʵ2b۫+ίIkɢOl>x+&g@qJPwC7uHhfObMI,5>!ǰL"]qRE=LxP'pA#5'M< uc75 -jHE5̪ ks XD^I<*?A1p<`GIl/VTD#ڄ%KVo\BJg0DbxcfM4iu ,R[G`VL!ZjW:3V0T3`~)t0%",hadۓVcVgp]{QW;6!oukͩŒ}3[;rG0t>jO*jMڪWBu[)WMr/t^Z>]ez)62ht)"b{e]oTznoNzRjPt2 Lpb?Ry.j|/sڞo^^ufj: p s(u}8i@YD3n>LbshB'R^pKE܌ 3E,I>*'!4'K^&{K1:Qynǭt^MLE~{O3nz`>Kri0u%kc=,x}LRZOn[{MJ qhObAV'O魘.瘬<5\bJ=NA!U6^M^$Wf*wˎhKGe;;:&T_q =Γ=yA}4VZ(*qPpnjz64Vx#!=}g/E mB^ʠnu.y8JEN  m:G &-Φ^ge *~7a@ml`U,_vT( o@S0`k5I5h8xgi>z1[PtctkK0tfl;rl>FuM]ooÝ HRD$:tQMƁ .#O ed/ n,4 kP7!Ř`7Sfs/*7nD3/ 0'Eү֬- ݩ6.ᷠd[5e|ccLqhRfFZ@Kz;r5U}!Ĉ ȷSh,$<;-Do08bxRon V{CIcb<Pvn!+"*kU$w S$+Ge$XTH7K"D!$Ciq??BrO5ѐ<( Pu9AHrv^~c|wmQj̸~aӉ׸vc pYʦ%ֿFF2؞WFC0JkW'bO&J=cUqO/J^YD=رq'fg.G6y8DB_;k/|+]"Tw/4}sԶ͹7)ukg gRyլ%{Bc&25tCЊJV؛ײ=_ݪ_P^Xxi0 oQ{NF8d'Em 7+/`z*芮%t%fdEzݡAz=-u%iH_ ֎ U1An J#B1 i G U v!@ـdH *AbVE|SWZoqԶfOj4y:0'o*iv_rY;ts$iZu'P6칄 \8i< ?i6c#ffj 56?s"!~8VǏcJZ[MqW'9X0@i elQ#+p]cϲ871M=szN[ڇ"e ӡךa .ý"Iͯ[4x,k "豶߹ykGHD;JQnA}+VFF>}&*h#''x`S.06IdI^!odW],*>r sVr^KĜ|ddrVC?d.Gȇ x^ct%M:ôtNʠ=䅙/%UwH6U(Mvc8 At0?~.Wň )݊FǷc3=Ni+Kgܘ ^olm29,|SN(/y;4kNlS>k_nOj^ea!w3R]^=r8s y֪ϰZV$CZˍ.1Bܿ)_%!#Rs>x~*v$+: !+ x悜\W0#LhG<~H,V9xd~:/Pʉ)/ InK~^ f0n5ҷ!$#5e*TX.f_1Y$.if엦O?B6JKq!_gZ<7Fòft?[|N9f|N&f&4dq!+M}]r 3׭?1 /~eSn#Iq'wS \C_{Y֦ 4.N2֝ fFY~͌¾ x>n`ok ]HϢcIi)g'7aOwe[B\ӟڞ)O~#LmN$(O]YhD[#e>ݩ{mð~~[8]]j ouT)gˌba};FLqS@@Hi .t۞Ѝ]-^*rl"/@xMWe+jx$T`P"Sk!w8k+C4tm%3|kay(¢dɜ`vűn/_ ,kğ{o29%a 3Fɣx9>g0$/19 Qn01^GxlwK*aKeooy_Ȥ5_fʨغ ;#MƮ+o 2QeMfǫ^Mũ8)Q7\>{SX9 ֚_V‚KV*IjkV!C,eG/S9dh:U5 tlZrHD}Tr=b;~GOޜjU-yL kU 8PQ0Y"o }f*Y=uTC1 _G0*ݺLd<2\,j]Xۃzb K;+9`1$CJ8ůj%U75FH}]at1/x,#$s8Q/ɴ a7|rUjxZG.$ .u./a~9?9aG!pV)I n1"+dI\>[Uy,YyPqEtPX^ŀjz }Yp5 9 +s<;=?A>("~yp)%VWF )׻E vdK`ΔvڹlAyjo +I-Z=')Wd!qLgJ1c}F<@i#MMTQXˆSdRoRcsO+'F!fy"wъ=]la<AW'\zF?thQFB[2(I0W:fo:^Ґ'^67F$A@(.v~dp*$eFGvT6+%21asI5/RSqHJ߬ 4\S13cp6l#6җ%yh^) \[Ԓԕ=/2Y5S)iq;Ofi5oqq3ҐUUAhB5v.kgEO}۔1D~0!w8*MzЩYK^mG;=i|?8_E#:pT,Coorsl-R:\mnzÏoPP =.WT$%=ൊF}txlJzm`nYcɷ[c =! TuzLuIo9r99rfe73L~}Z-i㉯rzCӣxɪ~vǀ8uo$ƐD$6EӵՖ*EcGw@nR5Z*8Gیngg|,L{7,e[1NoF-/6z:VU>ַ`x}W;-~l.&a=u8Dr9Zdgw%p=4~-]Rn 7xB6m܂9 9tjPXw숰wҰ+T\k=k>;>Ok2 s1c0>sv7U`G{:dKЯ&x̉[Nqr'尕^BU"̏ð.LC XgJN|=,9 p{–9.)"Dg؋` ,LාQx$\j-}J k0A%gldk 樊n2>6._ `O:$vk'{\8wca5'douI MϦx+^8]B0d+W)7ܹ:PL}ot[X.|JL5>˥ejI@7bQ>h LG/261ۗжC&VeJ'ױ7r y{\:$<&$MbN4@uD#=&h {(_N-xt M)ɤY2ݱ=cǬPpub*w ց۵27gdfNdWrmtN-_i{";:>`jpCsۖA|JW~q4گ80>{mv尽P`c} 8u1ȋ6K蚌hx/ޫP< ";Jk+ Գ@}ihh>%4!2G0y7^=N0dВѼͿn38bϫGwd&,|zwva?Sz>X x +T!ﵡR*i}gJैI^h*芗=43j>伣k({暣0B}`aݸZsJIzzP o;#d ]CN1vQ=j h3Q^kSDW :۬TPVU n%ڲ9ף^,D)D0KXa`ɍ%=8ߚ#(5L8\~T)&O覷ӿufsGxuX l).aV&.s=`. 8ReNgFYE탼+54T lԐՀ~7tgZ,pr/Z+/y׊%3GXymz*0'vD}gOzW> $0Kxu@Ƞ[Oࠫl~ȟ=-l,zlg~vy)5tƅy )4rJg /+;ζ_oԄޢx1X-)z}'mi!j YAjƥML$>dP/ jߡvtlz<1_7YGy4ߋS0#F Fh﵂eG0PT:DN-8hX۱ι#;-uCg㘵]+ ܖ=oqY"f)xOUʥD{(SiS1r0\*k{Α%)qB~^'Hڠ9`[bbL}KGv3Cg[~Sa1MCyp;綞D . ܈ PG@]H8F[hp6ndyN~qk#v^9趮;#gjxlWl;}}"'~1?(ϲ+G'~ú=C.i 8[Rj5~>cӼaFEjQ}[,Y}Qlm_K[X uCc)/[}|agQLѷL~#{|JA9#d%k-2GAWXUJ]ؿbLo}XǛK'`#N +Lp),zEzx8ATƊw[K ^UM0KsHN@}qEYg/z*+: ~WT\@@5]ʾ w`r9uG2I)( +Q+xHlY.| ul\Rؿ=Q S7n%ic}Nқ\v+5 ĪSJz穼\#[ ԣ'|5*n65 q*wu[㫙gi%r_O:0n% BnqGjo  @\UI7qVR̺31Iȃ=*O~gډ?_&".,HNa4sa ?$IU;un!0&ӃȢ̍葓Uj~㴒gx7[R0u9 `tV=9bU@NR0wF@,+[4Y LWtKɞ"FCo/w\%=f ufR>\7ً9>:$ɪH&++\rVI5h8{!zTvaF ^_bOIKQZլi5$BɶpGպ5rW&5&B)x\1mm9xՆxZ2ʣǑ*F1X6j!lϭ{$l_"|?ֹd둣h/>1}&(7syPvDn&y2Cmԃܲ-2gi/Ġ$D^U#b!Bg@#/P+ʖ@}(pF\'P(Օ\~ $&`6z:Doe Fږ/33-@+s N~+F*T+x|.MM؍#ȋJB?TC{.Xb6bk=;("]gM<aNsʯ4-+ -v+ (w|c-:qb? ] {5^hp9+ǡNFvN/wցN94- 7l&U>|btNBId\| ܀XVVi#B_0MuYo oa}<|~uSBE0I;q?TȰjM趯?]>|c,HPߏZqڳS }gAkpֶ KӨxkLYuS7 T)n<=e~F\6Dzp@*6ɛHq~8oTN)o[b;Q$qPNrc7Lmj@#9RSuA5$ۏwV$Kpe_*{ +7==:ٜM\\zf.gyzKqk\>ڸS39Fdv;7n픁 zzt1~X4-EӀۥyHS 7Lϲf?>98vP_ [-Wm7> jXDkD~آ @Q/CNB>ìjLڴ7gCgj\je{͟l4|j]8ܧ5d?\`P2O[._34{ u]hÏ1]4V#\Tr#8a,a-PU c?Z6Ljd6)r>rdmOɅ\Stfse=^]v kpA0?08EnCȍU y@cJĶяWiG,(6Ҕ~HڅF2{ϱŝ5p*N+5lj9pE!(gƫ p &H5);.X5/0\gd%27C%Jc`J_= rŞr h9!Ӕ=ҔT؆b@@(m S`]C--y͆bKUd/sxU]bv-FplZ4FCI6M3lޮ}4g*h__& 娭?rB VHigH|U1Y=V ݛ)Ia բc<؞`$8,~{DfT r")xO\tO T\c|@hhBٵ*1;K6S%ɒ|pK`ۆzL vqн笜!/>VHW+<5;utD䲎'H%N&}P 3 ꍍa0;eEόGQw;- vx"Ԡ2+7gYVb12->f9Wh}n!t\Im4Aw1 ?3ԡEgɎ@騎ʤo_EꯆV^g~0` C<b | 3U[ּ MV߷S^zT\@z,*vM4Y8X 2O >{C랃ezH9ΐ[_i vE\TC%zsK j}tv W]{҈"ÎWL<Λ[!qLtdUgR*=pݦxȻUV">ֽ^v,+hZL;lڜ)ot!${QuZLabwah뾼̺dZYĉ3T#hb>R4fng9Ÿ.bx;-KOVң1+*J<=# S~^/ش1̠<$5|Jvp 1R8:Z:"ѧ] c(AQfjiWg(k2iCx$CcM-mnD #uCSiAT1N@kxhb3XS/W"uTr4䆧 T* 4 Z@Jyh75rPlc5z#BK8mlU$7jpIqZ=Y30 ?k蹘'mR,FU\;B3Nyj{j w@0'h>l)A2X@]+08IP;?/N)x8/鳁$w(̤4So0L9,ÏYp`<{KU$WL5;~ &Ѽ9KsҢG}inkf(sBgQ Eޘw.$ c~+c_0x" %h8ƘSXRT3G#_)OB^hj:5"3lD14vfF͛‡vٹܽw;N70K&گYܼ88~QtPQL<B_b1/uT԰wzkimje3(uˋ_wz(8<ܕ(9*8&ѫφM41ں7ltSvc꺄j ݱ?"ͼ黎TyvI  b#q^<5;QosM⧢`SQY,w,ʙ?Qƥ I|MlEuDQ`V9;fJQO)7.c߾`Ə8m|VWQgoahcypr+MO)-`LY7#9xDFOuZ6RcPmY7Lp֭>SfR5+hkrx,fsċY "%*Eqeֽv8>NuvGZѠɉO0yAwiH.W6;*|gTEUTۛ)%y~-?uOtzUI;aY"lT֋Q W!$Pb{AwٌN^ISٷ?4M3p,OGAz7pc9uӢ2! 8DVM.Jk We:msb~' k}E>_*`7~` _arY?|s=Y,9Q -:HtE `d#I&ckdY,n4Tb9H_AQArc_0ZɊa"k̻K\ش#v^;7kDǕ@0\{+!>6  QdD:8xl]i}Hil*gbkJ43.Փ*uMFwgSa-t_ΆQ"'@pR~d2]#fAZxш{l fpf͐6Lǒ1u6CL@~,YeW֛PL۠}ؘ] `ɨp(Nx]*a7/ &Qiz lXylUpgfK"e :Ɍ?;]a| DgT!!?(r :s]pJ_-kLVmR90F1ɇ2~`[p t6 8FAM}6i]#۶"+r!Zc\yfrFIKm z,f.y(7֓H$>JСg@ԢU*"n,A|x]+q\Xa8U6`Ui.kC.|!71Q"XQr3 ~\ЍRg, wQc0OyMlGUAAōbҐMsm'qH~Bv#e[ oħI=6^Vzؼ. %5مBB}3r6)>qΘ;!AZR}IQh ܏!.>DmW3䏬ZzѲ{ ULp^t؀ɤoU*s),uP抪3@l`G'\yD-&(U螔d[e<}Ċ)) ЇXVLDOwM0@셀<%y-FI n( xfr$|gTNQ: юj_B0+@)TT~J/QuS 4Eq-M?.Ez}TJF qt\f'U(op=t~M `OE  ՂS1I^ 2\[GI0A#Y(w;[CV9̥_v9,3 ysGpս~|QlVv٨3#3|Fo%,B8&aԊ'Zhcg fPH܌TPٰ|e=!Ҁ\a$M3lq!dӁ9 ?NXx=zQHAm*fqEt/<}îFh`}4[XyEZq)ge P9#bх0x%ǁ07-HktWa. Oʭz opmC\y lGX?1ght\6Oѿ>sJWYXqtsz\ ʝ%+7e`i%#"j*gOJRG5"Xhm娄,S2,=z VSblj8d_6l\1>~K??Ki=B4M$s2X+8,`nىQ0%}|- #ݨay+$|?sxci"#|۸OaI+{BEb1KɘųU<29=A6 3ͪ@8?:PuDhϧ0@SFz=azXxq[S+0c *TC[[F {HꙊm1V!l\ƥ)V2`r9w r(Mty\e1Q;dDݑ94ۚHmq@1**>9o)n>Y^ KCWߐ3 ht$^2\ 6Lu]}O %1Ͷ<QLfOʟ2=Iı^6׀.4B-ަJ6l=?dG2F4`Mߙi)}F6rpC 9b nQ+- I )sf8Ocon摍녎b(Ήr7WMѼzm]S`2^`ϯ䦓_- fJƀB.=1Lfc[.[U6X9q{2pR:0SI9+&HW¼c|V_#ʭ #Jm&+N^Jt._7gD[]6}ok#]%>uB_z'ԟ'VSrdΣm1+}jVEǢ÷ɇN/5{H& F|YMxk8/AoQ&*`YrkQ5`z 6LC']f\1J11?j% Z5gO},)h[`:nHR+gMa+sKwesx{\H_a`%ϱ(|Y`BjKڻ9FcA{8V5xYm*QJ HYf1ƿB. J10[`UB4C"bT1P \?c|s169bn*&sYB 9pvbeɝJܽ* u*,;rUL^vݿ;Z1(>tM q2[q(Oζ9@O2P|OH ߦ^ci:Bܳ^V/"4T%%UgDU:%Mow}烼,ƳφUKu}Ք9Od3YtØ 3  I RZ24ۤHP r3C8AڗWC&Ƣ;l} DZz B7B?]mwn dJ 6z#lғ?-n" F1'0+`z<tHl,wbP̃g+yLwEsHetsY@cKrAT(B_C& LlH'ʑNاԿmA$6iU!1/ܗ4I"ÇY:_]սOD(NwS?*w+uqPЦ,ɭm!+|H%q8X^Y".-7Y0V~ua-oZmegTҍz\gi/jѨ,D@UWY2W,8;HvrN=f t+{4kDof˦SLډ:,* r30X-f Yo⧳O^d8|aܴd 7ݞzr[3~AAɎ"h|UgDo:E_jtfi]o_"w1t,rPe=.|ohd}D$ VFmL|[parz|0Uoo19pvX'S ;[nﺸPH^`ЈǼh_KUϘhkZ!RQV 0kDT7 ]G%ȚqV3LTbsS EOŶ/|,_dxql#1J鐑iC Ug\R/n;[AYN_'B:1cȦt)o*wU _LamID_9h1S4ψɍź,.@'[N{dk뿎r~D_@dݡ5JN򊤋wKOv^aP|;_*)V.}T%Y324IY8=xw{V)u&;m%׻4~MnB‡_va&,@:V`|;=p'"H^*+Q|)r7\k4J- %=K YI['(W)aѾ#@>$ `LN yR=`cr[-/ \e(j4GN5)굀 !<ʫ9|ޖ6"U&\t'e{vY"7<1_p:}.kV_<`aYx_S`"综fNï W8 +,1)vmG*n,n?91,H* j2G` g:!mP_[(w[FdSE <;"x[X@;UL&.ޝU^FV9\FrdX(*dHP"% GoN%մsT:!ad! a3/V:_N+wkWA3!Nã;aF"z "B40ʿ ḿ`f\ɻopS>b0a86M!uAu⥐g=6UG\򶤛Y/>W:mr71 ǛBKYwf];ъ'3+h{FKyUi2.| 4~—eA :~83@ .rUz7W#$%ΤPZ:T:x;1T&MxLl{Am-\Zre]S,Z%Hl, P+ftKB \ ;^~fuR~tĈ:$.&Q}fE>PG!iJƒa6o-_$zհt|ڸV-V( I!C?qAXIi^om`$O.c ,@ T &nbo29: TF2 ݃g[ӓ،AOuY|UN>|?&U}J M&{0`YcZX˪Ɋ-~=+ l+K`Y#} Ri}ȖAMOm5zq86Z@Z*zc%l*4pˉRqWp—J*5+Y@򅠽`<6:wT׫\ŞnPD]qIMDZ hBnmz-V^+nj@zHSh~0! Ex4Pèg_cugͮ QYӞjue£o?!D ]31ѪB'W"jGn`jla5jj0yuHCWf)bniL'o+ BYUOb!X)T|",YP~#&ֳoPTK1mh#3dךNeCo¥bȗz_WE 1fBGBt]" IU噋1uvP%Zm\x^MaE?6 ~Ɣ W2aR`Fq14>E{z3MdW]Z_}'r1Mu7ܳ-a4`ל~?[CGsf,\{!LUr'>W3m:0',.;\B'&BOQ9 ֬/B]G/J*g<A[Q"T~U?! wH2MfP5+ 1o\HtQ*JdE= E7\ס@ath|]AFU~@z)YMKAhOS,Ǒ+<+P?E`e+^K<9IࣽŲ g\y-wXȬU)w*.hl=@1+Ez6"TK 1/ژ9Id{] ` 47jotkjoVAdrLqQԫ@y3kxo5ƍee}Kݍiy*? 'Æb]{3##ˁjGnңnlx,Ǭd`ujSf3(;UgJ:þb<2A1;PmmT5CI;$ 8 7|LL˨u"5SҦ3,dԑ8)i4R5.(B_5V7P*WX+1YjFϐ@8׻DhVՕ9C:פ=SԎ?VI]=qjP5dC%%%^3ޢ OfoGz>y@w=SiM >SK2ko mDEvݭaɾ6gLT^3 İ3u0,;?sNϼ%&?)xV"z~՞F*` ^QhT;Q8{8 s-6&PCCMx43x jeH߉d#†iHU7~.nau}gd& iR(؃W> %TQ[QnBhvIC%PMĀmб(M@OsLa;!=r[d^lWǕムΪg ሶU~|L>Y |gAd\|c3jwP3UrcjYR-qىI(U=5?ԯ C*ޡ;i9;8no2daXD2Cw>–4B~LDfAþ(>FUh2#3FYO!4ɼPg}I_o?nOp44d,?'xzp-̚h|>yMeNGϳ#$ԣ Dn*gC8Nn>'*GќE=7‘ofG9'gRTY9cI S#1]өy_8 MHwfԚ;tBfؔjH?Y V "ӊ{M1B/~^V3kv,BuOsSAg"p}ByBlvv/_ Fe/ 9T?/Q1$0T 5ӸG6;jZ+$+>#L[0y0oYn ~V1ᠴqd;z+z꧇LqhQ|-.`E,ޒzW/He^?ɃoghE3JכxeoǶ!Ï:@EprmzILXKd}. pnۯrp޹Cjj}Q;q+j`J#ۖY9jmZJbu&Y4=lLD^g-'۱83wH_J@!̞ WXio:t](p,<b ^r#*E%8u˩ o^Sp-<\;BPj'G׭M+xKSFv \ Uo n*' 6`kؾ }RCl҈4 oLJKHd럷9]O4|d,-jpCҜۯ<9M,i5qFb$X=1|b>r~N)qJJN#Gs%ӕȮ'@*l6`Ac{?y[biIRAԍ*O6NcY*A dr.̻-iqr16 :L`~6qH淕=W1tlj!!-t_iu3p>:<23ӵUXGB=|\Vsdp/$zlQ:d{g׏Hxr  .{L $K+W*j _}^Fw.LϘ/]D2L9)ga = ֗<(Nݯ_F5"QQp`MfM-3K+QD >TyDZ/[0TM7RGo~:L}.gYzIbYϔAT y UBB76"װ.᫐17= jzik*"YH+8_ `^lS"o:َqNѝ<!vgTFg1}Z? 7qbmƿٗ} րhyY`y+g;.TY$~Iz' *Gٙb`j E? ސ]dm@ e#Xm7S3޵BJFHH$ ,6HP#׋cN+4l^g?gp]t"bۆ{mpyrv]*)'%s}Oz ßJ88y  _񻻵lGq*gю=6k:ngZbC,EšVQT%2pIR'B} ~\Уx!Wxe8}Ӛ,V@a@ ;7Hb-PY_zYPFUO-%52.m9X`RԍWFzG`orrUEr|5ϷnE:}H`sI2fGV~4G5꾾fV%Ӯam[16=lƼ#Yr^񼈃ЅiWrNLP[G)0Hu~)6Ov(t"M)_h 𙇪~fPO0H5B7$,GNbgRBRIױi"BQ,Q)9L] j*IT|S;J0apJ}Vu+* Z]/T%87]mfSPVj]{_"@l*hDaT'fC'T^ב=wgSk3F`I㋊nsJQJZ{7m,&K< endstream endobj 586 0 obj 146154 endobj 587 0 obj <> endobj 588 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 589 0 obj <> endobj 590 0 obj <> endobj 591 0 obj <> endobj 592 0 obj <> stream x|t%m5N:رm۶۶AǶ;V۶m'~?5Z\f1j+ 9%]x Vv&n.*v r*@ 7iWc[_\%EƮVbƮ,n;<sgk1S7;Ll t#@@IMKKfnnn"1=; y66=$- tuuad?9=Е/}q{3QS+f 4;[ٛkl37GFu{+'7 w `cb`@OSKy9267qtpۺ́/p>.@ `fe 0ZXwaƮV]&&&f?}f^`loW'@`fff{bϖ% 񯨒efW tv[?F Rup2ZzLL]i`ah0634m6 +[+GG?fdIKQ+ +=௪9?;5ߪtMߴS?0{Sa{ [ ?V.V@3%+WS[?u{3=PߑeLLoP`77LM̬-ol_`S7gO_&[ks<@O)`(mNRS%= { m]c ]j]l(h*0OLj̲ 4b;y4|.#kړ׀X0yٜ~Oj/&@'mC;㇍ f xQ#?! EtvTR(,R>WTnMOWE 'aiwc ЙhK6 |4ZM%n`LjaYl60pyljۡ_ ީvְ29OkR*Uo*1mT"ϕr7't"3KG}FնsdX|'z%,g^ӮQqv Ӆx!ڃeGP cӓFo^O.2m* xT-h| G_tv̘֝ꌫo()D`.M %wйnശz8m ,iHdTmc&✵< Uoւ;a5zDLfL 1-̱p*FIX +dQ1ļb4Vٙ7s~zm !`ݕ4}#p^Sv0 I̮,<ʼPo\eg@ѰB8S}ȶR945V&{ 1|Vz]ԉE΂R ;Lw(i"vJ'\Ha+x B{7pRm:?xx y'8.?w_!$sUH!Tq XM#IZ@sgګhR١q{uK ?DnܱUSullk)л*Eǰs~i\TƙnptϲLhCű&x1HB@dYVGl'70~t,aRE2a}5kMƹyeb)efCS1L78o !cuDaeOxXNۇ+ C9jX g)x>Rvr87t>6X?OT^lr?s͆Ĩ> eqȇ_,j.sm۝v>U ai?/)ˎH ,0YK479u*yNCnX"H5 ޤk aƇ <ބ߽p?f`O* \okvsr="e{^HIPk"1QjDQI;Nѱ|~`s&I6ɻfU`[t>CQ!@jCY}n{%}BN]EAelj 1Ν O3CX"z5[]z׾oQR<]u$*kuMHr95XA`ą2DSqy \ j+[ĸHsrO@h0"g(TS-nIظ !wl&; KӫYExҋ]x`b^Mw82v_{% 1B؀RqH`LC. [1@k>kl$O  'hϼsRUW4yϞ#P4< $GKxMxt4 +Yfr[w5r*xOA y3Ӱσ xkjLeeyq.¡"Q1ئE)IE{Jʼn'Ooׂn0 q4$9\O?Ԩp^=1y%K)鯮BWo-+luV3`d475@iX#[W!fQI k<όjMW$h+ڻB,E/I2mx<z`(̷$v`gqȷ!D.T3gCɋ%LEyrQdtbPo[n¸)f=Pc. L-LGk ;'`^1mu5pBVۇUGAB24'H eSEf B+ !1BWT<%CUz"FM"98c/X㮽 j ޻W[(x3, ޢ'pp}q2{w0d\?:_Ǜ.$sQ)nd |Ea`E"(9[?`!/ܐ#kٵ^m5WEciȕ u;rA;'W컼z?x[~M{O,aپ u(u$?> S7S DkYN<9(eC4BYW@:sNhߙx~zRɏA~h,X9A&bzɯ]˳qJ%r,*z)*a+Lqqݫ]Cqŭ9 4Fbϣ1"nT>p"4z?aYSWJ~2uF?EAv Ŧ }o'LW kyG:z;@R瑭<cHҕڊI6$WWF1@j2ەWyq1uaS];|أg#HF>O䄰GPxk5)V -_Hx<#ߜNF;cT44\G3h4]1LB$R glj\rX] A(Zpmc`?Ίu+R.짟S2?QT_ )m\zt4WRB2(66ߩHy5P8COUEBtI̖XZyGߍ ;S X=O]r!qrkK.C`,XКY7\2$NXr1I?:mJ& 6Cxw(M C Hu((؀p dC lv d5ݤߵ8F?6X*XS4 %}-vEC#bHNI`-xy Nn9eqIDS`d!ZS0C"ڄX7j$Y. lnu{A.ʱ26dN,~gR .a*p0.۸R'њuY:|_y3Ql216Jx[X 7-()fMGkql8J+jV$UP9@mgב6S{KS ayR mJR ?R5Yxw)<[ͨܐ!bk[_OkU g|2v{l< Op? F,@d$B&6de(%/xQ|Sy`,}JҶo62Vc:^aG5&ҨODCH"%{¦_%Q$oh:JbƘd&ƣђ P^Ω.3G;U6uGhث=)\9DEk<'2Kf&L]>25'!mjpmgb\6yLoPÕx|gƨDs'Χ]Wldp>C:FPy?Yx!sH@,4sU^!K˻=,]]Q}`DL D _R7(kF'jz`DZjoĺ"E:ۈq-$-Hhp12<$^8q+6:WjlTN z6$ 狪QIa'h~;HPm:G nE9_ƕB;pnx!s^)S> ];Ρ Ydʈ@PC/Sflˮ=2 c^͉qt^#菹 riq3NsTMd=[~GY[(N>A KeK#s&ľ$;W PL{[ 2iMi;j Cj:<m^^kw.UjIݥ'*'\ !FEyyܸz@<{Ӎz.*He#`skAx w"TJEx:DDR(|4#SCy% q2H4r85仃[pG[uپ>+dX  1 #:AYj, R@l0w 񳗻QYqpF$nڐ.y#fj9\=oI韔TI'PNĢHU7$=i>cX;M,yoSH͖5-IϿA;xLdgh~_ٵ9y^.5Nmi;"bEVk+R7&^DTJEh B..Ôĭ0~AtлPW5HOݞm/eb!xN#.녰sd!sMA-u|Z:Uh2l_fg ,n^#/-V%@=P#Va䙾nޞ.bi23nlN0=4CCڦСN? ϳ(X#b2bN$uL+]exÒ;N ru*g wwC"l#Sؑdn{˻{].d26g_<ÕMFInыD؉_ZЂ_U(̰%r?2LWXzZ쒺#O 璄Y̺;AT욎o6S{SaJy`X\U߰b?r-9jxJg(.`梡tAK-2HFL_,Q8gKmfdOf"Ui]2xRo|.B XD vpǥsL?D|DN/by.3D:h0՗8uJwІ*O]KWZ o.=U>{hF4y|gEq l:vમ(ږ7bAhޤw؂G>( :/ϞOIBHEߍ.o++E)sJ2Һݹ5:lEZNu3;9o>`@LFDoMv]" BKzt%YW[ Ԁ x?Rf'H.𩤌Z"ZƈUWM؄}"M}"4%]KkOnq+KsG]bqviJ6թ[&@}&ƃp$q~E-"*sH]"K.CP\4%P?]G3hʰb6w ؋*SjUQb|&h+Є:A1ܜs7=TxcW%+]Qq"Gz=W=WrxcO_5$ߛ8AmnWVʒ:|hѡ -1fvy끈XG4DӗgI#/%Ľ9Ұ|TZtop6qW{u[;ÇM .6Yɖ ̺"-G"ITRW.ɅY,$@xsƜbY2@4Wz>hy0,3SQy0(7pk &RX L@{<'Q͊chhl %hQ(5c<|b)r!϶3jZO4* |6d WNuF\ى߮cHMN+7 ]Q|b5~N΍tLk6^B[ӿP,_IBU/k!<|cJް$#V֑"-|TwM}/\8{o1'B\F?Qָ1MxFe׾vo\Qȭ[^2Ljȧ|Fa > k 96KWS߯6i.\0nl~wd*uffbN,hg a%#RddmMKS"ޣz|f`" 0Зg$3e_C`{ldZ8X5lvݫcKzd]gVM/AĶ{)ӹ{@n {8JϏX̢BIMy3X_ݵT戄q./&'a2p|v×p26;RʔB蘰ZƶVコ0uW7)Qڛ>/nŲn .8_``q[8]\E䑿Zq z3ڕ<\ocwlkJj e09"wSe1gyD/b5iCi>P;KSp+v|v &H n?ZLk$:Ǣ5aͺC)Q3稻Y:Mo_Xk3'K}5yGíiYXb۸irRNӷb :9`a@}(G<ST9|74B&)dCsKok07Z9-70WKh\gI90=""7q9)Reo(U1V߮I_ϽxS6L뇴\ke[/$<'}\&jHP(pg`Qv4Ry8[$1:w>["meE_-}WKxpk6>< T*]qR[ ӑ\ FͯQg {4 r>ك3~CtCW/΁"P D\s ~݀} l:i&t1TX;S3'(?Oc/ǹ0Zm H4w p]B#6뽙.Ӧ [9foyCzQ~R}vJ\7c-YvƗG)s3zl)|'AbõbF03!8;ݩ<.pD*rG0}g@pRoK)>~ t,Β_8-f :(041))|RO?3 ht~ J%_?`5F]t7 $cEaq'2Sx>R3Ggj?R!u=GqWI;Ж{}BOW @i-+zI[b$["4ȃF[c`;ԧ5zoӠJofx4Il:9Ws h7я+W;U$_^Jw-: |?`n"P{{<{2$ȖŽDWI`sUC}]˼ .Lx-`PeW(}6B|ݭ˜ءS'Kz+~(k@7Qhyw% K6DLs/c/^OipZZƠ;nF}:OTM5*$+/BOqz:NIONkD}hfD}jt1bEz38<,n*T1j湀5XwPa-%YMx&$㪊z$rڪuO,;Cz{&u~>M8K-'v&t?2jq2LQ~,$nLzih"Ŀ&:&ޏ#T}?6UՔ{Rv ђ2ఛp.? VM4J2*7@Pen: t 9{6'8w/mJrEĚ`ʷiBL$h 8{E,OnHDGރ>f\~ йR9iZ6X"}u:q \Ě&{ H,g@>|\3l]O&P|mbŸ:y*X )wA.a=U1oOl:L6+Ϧn䫍+)񸁘쾼 G{=3GT-=:(vVrD#"eZK1rv\;@-CԈ!.eSqܥs78nxKvoQzRUNI{;A'>YPE G:wFtkSMWnwTS~BP/̿,(>"!) O EwF>@RFxڡtĿR^B#y&bِI~\ vbSFI `yCif~H@[߷G az-q{7HU]ӎ=ϋQ*JhE^T 8mOeI k^^ڥ ˰Or/'ey:JRpeҒٰ9w^j,\ -[F% $j>^ t³}y ߗ`ҳ0M+K!coVr## ;je86friճӸ|\ĭ*+rXaӞ3,T|#W%Sp>\r ryM/?a]'hWm٘';;f2B6ݎ0b=]Ġ %Qw 8W:tUf_^B&|W0aw0hܹUB*A42BM桜0>ɗϷsovFJ>Q)UOhwbaO62tݡjx|~ygy[ S ѵ\$SҊRWgۉnٝuf*woS.e[Ii>ۭ&0*0Vl.mG@ÐFh2iu~c #Jt,XT %V x pυ;w}2*x+:柃n )l:L'‰)܉m.P/\R>}<ť&e'j ҝF%+3T >m@;t:ZӒF jerI9 ?]eMԨXKpy~ycT(۫ *?lhjqt*hBm4m_٢囡fNoC hZn౛0&{0r+ $n3  O?JJRգva#.g:' LXD@ٟt12\j~e{U5I.NǗ)]^kA6$I}daCX-ċ^!va(S-򻢧šoY3W"b+RCbtgH-ZLSX>b {r^YO¶JJ4- ~KXFY7SJ-#D:b8Qc`1KpѮC0D/|kOg*Y)eYogB}$W_YHx:{=n)=>9^!)G".ȃ6>g֪{4_@MFޞ̥}LXE-!Kn6-1O"C$gh?ONx1i_arcˠ;Vlb ;-KC~nN?oj3E%l-PEFQqDX,$̬-aװXmZ]E 0r3sYoXF, ĘVI;<7DAB3txZJOưaNzɽ5t cS4qW+-\r8 0 k/ '/'O\dxC5OSf`f3տO(T/y4]՚GBz8!ܣ7:'Zn$0l$<t:`ͭ ˃_¾wR]='ϣVgס_Bgl:u%@C~rP|%B aѝٞ2M!FQ2=f`WE!a*Ac{Ca'x]"i]cԳ'>11VI C`,{>_`hNFԖJB>&Pj}m8kVH۽c]=IӓT>m٤N2K,.z+2\I_:Fj ~܏pKTNhF>#oŨ"ufRjH+ DV+ 'n 4%`|-g>^:g0=[>3Q669iƫW > ;ѧ4hr 9*,Z?%r`xpoKo6 F%[x i|yA11QYҲjOݱ淞@é(sU=W>p}XF<4OpC" eƏ9/u>eE/+(٪%`s͔gӑ>+@!y|Qbe}SWpW' duĀu!5סHx:&菋,u1|\A\3Owdt!JKCC".ޔekVj҂hbŖiZ(3%%MbfG. 7oh'SsVb0ԤXG,/{#rF($oy@O^e)g$tTc~T%D+2"XIm&晷(%Oh`v'7Rfp&cP&haCeieOLd~vY `e* BD̡kDQxY;/V9D  Uckڎ 9#yҬ#Y椥3dv1ǔrճL%2H+XLqz`9!+.d`4gOH<.fJ,խ}La,y?kևh8֣7&ImKa%= vvᗢSUgHUNP#3 v0d7V> ay瞏Ȗ$*orëw'bgknCI `Uwa_OrH ]TeJ{8"'TÑrt(s{1سfj!/XyEe3p},:ZPdYIp&/{^&y1KG1~(j,j+A`5lX!fbSv{ݿ{ I 9aW-U7}grOފ鈛&78=~zeR ]kDZ4 be6B07r gFR;LHK X^H<@?9 d#DXl& lYC#w7"YډQ|ZMrPrFuȃjP6Оeܫ<{v~ޅEp Whpᄬm{$Ҧ-p@9X4R8hͦ(i0E&ֶBK=o+Nc@U7L*:)=_7 QEE$`Ƹo:uBS`T/̑Q\m9NA%'B `jLF#X([EVЍ2\ZyS%uh7Qԅ|\ENaYOgYN=\rIGQv-90x԰ B07?:>ЎHaRKB0HaZXwud-#h>FO0&{PُsŒcSyqjLȋEM6f(5p q8}QQ/a]M2S: 7y`N;-Ze^r9HBRut>43]2س0DtKv^m`WTa>˕ML(77P_(Dw€,,aVf2/GRoF AϴߢQ7z55Nn佶mjB U)0mc<?JI!ǨeFWu7B.aTCc2F>*UՃ/reUt8-}mx w)|_Ar7Ex^1R~˱LOk vZ2AI`k ""t:P{M5KOk1pFgvL:]p}ӭu%ڐIР%;ODHt|<зŵ2{^4V.pC* Dd@&6&Cί74* t?(tҍjzѿKh(Lyԕ ` 0??şNI)Y5ՇHV%ІD"~# AV 7D3.$4CD|C9ՖTWEGt5`X:[pr\SA q5`0ڴܙt${ӳ^; 8`N]"h G.Xb gBHQQ##bBtZsٜԒkX{@ ={vH_dT oj6[RWF=4 &ގ\yҴiy 89kDx.J!٠u^WC_oUl0 s'<Qm:mci1_.=lLHuJ(S؁G +q:Vd?{ 3ڊg#!+øPl9ŷ8)hvcwEž{q7~O!Q̛;.}r> >}&?_!C|[omzD*c`h~M/@:{yưj|4UW|FxXND",g7@ܘb d ֜~TڵğM\IXǥ+{Pf.P3^}/̖fٰm`"[V wėXR~n2Ew#VKbaԏ' F@< RSy_3| ZZ*UQ\bdm9ޭ,XJ"r'NHfP6E&JMz>{Ŷ*@z ER{'F5iڵ.Zfπ/@y8hKՓpW.'i@0ݶζ?7j@27 8EPsFFNIxnٕ4$ϝ?҅.e8V; hk WgQ(*ɦ}LnMJia}kHsҷzD-cLBmH4 XdŪynQ GH€]lBAת[D^th^ZZWMT˿)5v8޴6n+ UCt Kmg.>]23xa&Jg` -Hrs&c2r S*rRr=av*HJQOraI֥c^C/"/,JTNn5.Bxsf61]e[TqB gkxxLǣQ@"4A/c١;t#3F>(CN#\E.2 NV$c}LZIpn@5paºTـA*N`f@\ JpPeP^NOO\%un7&6M5Jwhj\w=9kh&%5Յkts5)XO_'GR)% >̒)pr@^*Ѻ;K|ua\UأB<&7)pQrfGQ@E|0eFe4.ސ$xqOFa og V.[Q+}i$Ickg0%qwtZ!S3_)OYz/ȾԎ~%^B@ȡs"} `MdXD1VDxJ@i>OK3V"J |MG:e#dܕ?2f-lPm \*ZoLrؗxJ~+ޭ_ǒ)n x0g%sIvdf0tPV3瘚D (mv|(GEۖ?0j{" A3mcfebKyBgp\ baP&*׋?tyWz*DCߧdy%4 懏N8M.J),F]%YމF6_NB=\M]}1J?g m_r}5kl>`!:w?95-2):yj$;Jʞ+;Ѥ0/A*w`FIV:s%|UNA\^6$8ˤq/U`oR{b ħ?Xۭn\7w t] ^7F/e54f6E|ç.F/z%D,$+ !*dFnA\R3N6Q`9Bl:UCYm |imRϒ]c H.| n̢+JFX D'f(KW09WSQ:k/ARˏVT!fEBCDŽiu % &QĆv(ǹ:cZ[ <EjɶnsCAY`v}pb:ڟgH%2'ҠL.ds} 6^KM+ߖ go|3[{u3DCذC5sҽJeRO;K 4#PN+ /gA-Mllf+$Bָ~aj(.tJBpQ:m@eʯݒnptʧrߦi>]Ӏ1"Si/eh"ɧ2-8>ɓ z[3ȶw}6k\L_1'- & {kzƄ`dvP?II$3NA <t`0u@tۭo+`7qZX#} )9@]%vXLc dc}Z@gũeEwFkLiRlF@C6VMp@9T)3^eqy(^,3R9ɣ1@Wh>i-Azܝ!4x6&47bĠ5Z\䅝rZQv- z`9R_lS,l-ǥڱ`[/ғ>?shA-_պr,X D4bErX7CS^^tsu5DYkvP?5ŭ90"F(7!:^s%{YyZtFǚF m?uȨ*wdk%9#؄"|pNաzu %NBJva|6^plkCL̚5@Pfn?X-yQI#}.?琢i"yY! 46KIG #K&10 R($9f˝' Ɖl [rIʊFo514Ѿ2PꥎYƁ1ui,"ǟRl cF6S‡$52!Ѩ^Q<ꫢakpխ񇻼/3@RDڷ%ZZ/!ձ =m]JW#/QPWl\%V4_j[?̺k[ Ie JX:8t/cখtȊ<0lUg{_`_^'.L5Y5[΁m 8t PHcf4RPhpWbr57/W;R iƝdw1DlS1d<bFmӹB=u(ۈKsa^-^)o\}9뙰"Xny\ zOmweu&]uUX)QLk CJQ}o]U2نL{M]wL[b/~>Xh_6)^,>w;fy^Fcyk;WRdžЧ{#7[S{<ڙK()|`ѩ{3+#!#y<9v Pc ٜhW BeljQ*=afftMv?o}LS[SsGA\iP[ vc`}$.롿\?\Z.B|@]巣ȎjC݂B ޺oe*UBY\kfF-jU"6w]V$r\֝tkYYuʒFu:JBSh+.tRw:ߐWyviQ_F7f8[.*[9[?`~gهs&łC4Ws+A;YV9zTF(Z]EH]]!TiÖ6Ҏ8Ar6^ؽYgbC^t ߰x_JU+8VdIpI @(ǮWqUWqUeΕNrHr4%wɊFIu@1s0s:0K(P| Mmje1_^u#{1p\+KNj k$+vX,"_jzޚQ.y鄭5/ ԴZ*wAAfg?5<򨠒xQLdUrrYDLma,8H1~Ĭ+V9Ec1WBs~MXI7!ظSDqu&b~qKG*55^ Yy(0m$ne英!ҫTC@viR~qPRMD۱=f~Xh۫߄ڗ+=9 W1Pc"}XD<8 3' DH9{Ya"`KnuJ2nRD[b؁C^-Jc}d\|܊&5@ӭ(Z0+VEOSqhև1Zd֤q[Nl&Ww3D H~1q-%ehbk(Q#<4+~vӔK 9U3 W\BrC>6*LC/fNc\x+ MMLӄ." I4P-=#XXj;@ Suː >dA#\_Qg WƳ'ŭa4ڃEa!7|Tf&Ȁ'^K؞v`%oV 9ʺ$Ff HQjy{C]?QEm)P2m ,!F޷7"E("κT=|9v/?RݺO*Xw EG䯩O7Ym@gZՈ ҡ>cр ݰ-}%!iخSJ:LA"Z\j ChAdOA,CR,ЙS>2qa6X 4S!H1! t@YV2r5 >43$믈}3A2i2P'W5W`08ҡmHpX_dX %<Ε}>/pm">) :NWX[D(.X:Aг$rd VFXh橏s2|vIެ荡_C8Ni~}λ<&;hD@.y|oj.5[P xvD;w^ɭ6{U,dHh;<oD 0Ǘ,S;\_XBpBSbG s0Jw:Ω|Ň-ɴYQsOm KdX!Ȫ)E_ZL CO6baذi}]|rsc%ٵֵi~(vFu&'iv)`0Lsĥe=ʧcVl[lV=L*tȷuB$8@(gjhd159Ge<,I L|{VЁBZ!b-l잢(*YI:aY?ӄpl͇ MWʀzq]]? ^.C̈TEA1 p!bЃۯ`lN+ #4s23D TԱ:#\yq̡}]"IP~8I,XF\Ǣ0J }^I?!C(˹>$ c$աN:ب9ۀa>v)ku}F#/(Q+"h 2 puL%fᡉDMz76iyV}rV.vqﱄ28eWVQUa»|괺5ZYW1?}G+M޼ԏ!!/h Ԍ[!3LsHY/ÞS,0բkR*S >t*QSC>NE oNh{\5GPY, ˣ!/*yVf]@7Uү9S*DV5ٿp&QY5KYg+ZjTw$ *UPM/ka9+/LCZ2cSP.eK'ٱGBZJJ2< b4mߜ{9*mGw7InY(`f*PviM5| 1#j~l]Խc9&e{=Ju~ ă:Q+KsQQX>/"IA8ؘ|s0KH,'d/p؟g.G",b!qA]6[.;WWyNz]'{$ܠ+Bx|?$h5DJTKB&ԭ/XsZ:,l' ؉[9H|2O0Lu֒E[E/Z=ڝA'E`V\S/ /㶝Gr^zMgjaL&]i$'ƖVWyuH3Edc={],ܟϘ Eh8af@溰/ -MVc:V~S4v7vs5].qrm4fs_3S2dl7sSm,8+'^O ??tE5@ H3 m#O\ &c|l"O#Kj*3ө xdĕF0:tp$Px5QǤ9JoIT Q^<&Guׅ;Ҹζ+PZMTs)t0sC(Dov"k XINa 025WѼ(VJjMx߽'ɾ If @(#yI Yetgz,z#|V`_e'֔Ww4~暶5ӨEɉFZ'}ֿ_ -%V7$!&x]5s$&_ۓ (!S<<kAp§:]Qx_㡜ZU3[]Miе(ؗP5ER? *#*Ȍ.6p"#6.20PNG$z ,3A׿UF-YxІcP+CUڌ- S.ą a \8k c;uPJ↣)I`QV4{T-˘lO ,[3Qغl>㮌k/ uf!m%UL2{zFDKg^^XcXSY&/wR[jsDgOf&a9Q X ll6T-"d` ND2QNB#^d鼎yJB{^JDrkW-)I_| lѤލtz.]`1Mdjc!kc ,X. $p`%C`FD[1<$T2Ϊ<0(G 0 {>ΠChéOC&Q#> =`P}+}؂پ>~|XDߒb"ihOU)>^Z}ڤ;!R^T]\Xm(]S3?-W -vwf>4V{-L!cU|׉UOI%d#:A]+tpQjfn,+rw"+53ףa'8Cيןt UQdz$t^<>OcU\K[ Nm3.ir2 +ɥ2EZ}LR~gK?m#Cy E=gڜ]'h/b QSC"D6RjH:Et")cvǦ#R8߅TmNvyޚ븲1e @[ܽjTH!Xf]8%}n KfDBK{L1D&s!}eBVKdztt2QW gIZl|dfO|ioO,OҖlAy㩄BX8f+1" [8ɑ1Q-Y %y^N'ԙ]Ueaӹ5v74ODIO &9a7Qw=@nKPqtM= tOC5Iӽl.~cvvP;O0eH[\;vüoyCr4hUf!OB:I]HWmo<)cYgi`xb]IʉCn'f(g4%/gĵzOyi|%?j-qOpI:{zTZ:zЯw`86Z~S;.nZTſ]iO&ےJBY1Pb4< \ܲ;۸D|Tn`WBċ\Y> N#Xr1#لR2,F͊JSDʶZya^\zXYfKT,ƹ);u?7zf|fWvo㆗%n|%e+p!02XSXn-]lml;P,v<ڮvڕo `.,zGM#2I?H҃c,(ޣ(+DռG@Yn.}b} >PMiϠ\+JρɥnFfi۱]}Xc(&jCQ\gn؝ )W9GlW)&1__HrC<-N> `p+B7D7R Ar9R-诒 ,Gǡ)<;TM|DjUNmjխ2mȿV@3L6ppv9bg‡|=wܠ&-)Hv*NdBVw%옇ɹ3v F!< |"?5\Sˠa['7^Ag+ [bt!}К /Y<% Kv4qhO'#]2j:?BiůfKd!SD5|krdڔWY5ZmH!KLu&\?r:)j͵It!8A&EcF)E"ф\=EqVHfՓ B5z5fBUj6qQX|]8\˭\Bۂ\k<1[U'j5Kصp*Ht'|pKFC͵fU⌣xL ?Rf{KX:c/&%U/\=dΑ֖jpIikn0' hxJ"::zM~Q" J.eWQni0ϦbQ2dNp68z%7o( ms '48ŇS $ iO`O}se$'=w>G[(b^mH49,*jD4)>/G(pYkw9C;gEm7W1~e=@ b5۸41s6U2ǟO??002Gp7j8p'}fd>Rq1`(!B"=n`_UDCSD_`޼,AwU4~/8?NvO7tK']mOH/Jk}T&Y@Y0R:2_;X`a3#~Dⰴ ъ2}J vWv2uShg$+oǭX_byِ\ ng̟{^Tih)ل;[STU _%]t-'5-]l7\[g3*{"<ޟ'Z >[C ՚\|CaO׸Cv<h.WFŊ?X)7Kx5t1 5 ,(e&8K5z13ځo@6u'm6E3Ha_@Zh |$U6G(wܱ%~nL KTdou22ok nR=*w&!.m`؄"]%Ϲkma|ق*V"` Ky=}P<\ v`0Phu>GQD꣉.$*A WN!N+ljp=phD$ {҉`E @%Z9eTixy~$4mgIO/ lbMho~^vzA}@YБǎ1CJ4|RE7 +v%?;Oˡ &*rHE&S#E'aWig]߿ɲsQp[攫1/2y&: J6H;"oɗy׭b}m ,A468#E;.~'(2*+O_̦]6bb'Qz]W1mj-`$PBh 쑏 .5a3ASV,GmM~d̩>LQ@ʍ?0d :ԝé6C(lNכy6H1/~EM%J.j~xIϕϭQ) hi?Ӽj$5[be 5{" |B4P N40n| U9/C`5P%B涄ؚ/dJ,@wÌ_ۙӒYrv&+< G>*":#E N,9y5mQZR:mOǷo=iKppXqpAo?RDzK;=5 J8|?Ǖl$XkS_ϫc%:Lf|Y3E[7 琉,E4\Rxن47 huX}fOYD2/mT1NxUnYPR2!8|̆?eYz_K`V5><À<a:3[4KH Gssӡ5Mg5[U!Ơ0]6 'lc<Ȩhz(ԵNqɂo,헱<#TE% %ɳK?wtHxLġue=@ ņ51_ &^X@(Pȑzc$4`i:ϖ{P$b^AR_FA%rHd^p)fEDcc\->…wmxÆ95BĹZjavizX8W$N* bA3/רH5.H 7KjؗLGabE8#r6;'r0)Ã} ]]O )AH(*=:2'kP Q-(B;cH59O(Dsvcqx[L Q^Ee\s}U|7#[랬a n\ئO"틚hTv*Xo o'91*ݥHI 9q0jH2_Idloe DQ hB֙0=>h.xo91\uM\qOm9c}|ayv2LrhEҢ{Ysl[c}e;ge$-]ƍܳ>]lKI~xƶ8#@h=j% `)tk|Zޙ_ On0IwQJ`ٳU8n \8Ixav{'H"T-T|s(|ȏ"ʔFA>d -<3/֠>(=EKh٣9c\h70 rk[^C.z&O xl9z,0TrޖGOî7M$lCޓhNJǙFs 4L{ƶU*nr7 |r4d;aGB1MM]EXi5Kf""-;[V`۵ f_NljVen'kj&m[7=p A%28ӆ,G SjEiWWkV|W~Ύ ʀ)t={ qOԝ߀e`!9}Q!\M1>a.=vєx^V}CgZ~RJ'G.M2M.ElFѭv#sO*OH}D9OYF.C20z" 㥴fGXZP3II8Wz7!7XS0pl8slʂÕ [Kir#N7ȩU^ӮX廓bIoȇhj,jЉj@si=: )ծʶ&%G9ڀ[fU:7ZƷucYU1M_<1ڙp(f0WsVrtbK%E$ ]γE\W-m[n1kն$vC5h 3z{uet mծ4*H$%H$hC#Z2.wNGGEH ASzg3.Jp-:I #,թ|,v1KR_#+a GF@kz;$[ D{Q_/6c;3VHwm;$Z?!Tؽ;J^?#ZK#v y= $"*܊ 2z&a440aP${%']7h`Q >5{[:tUm|&?F a2`@3qP+0Gk8(od4D- dƢ޽Q0jy, KJ;̙vkUX~7"]zjK;иٓH "aȃUbM8Rfn$Fc56y~ȾɱK>^.K-`iKo@P*sIUsX]!?n[N[Y-Bh = ״8!o?$@njO o,eʅG>Uqw)Jxȳu6Wh`*$$GM^옹݀onrOx*`oF:o!)D5/45.qj^:R' 륀p L JT1YwpL;,la:I{L";7:@FJn|9^/O)܎%exZFR޲}ݚz3Za0>KO^aqQejL$ W W)koDo#WُqLƞLHdFz[:!`AI|CF:(a< O)k/YPNQ}UR B) /"4I|,7v*Qjx8$SpMZ?.o'^U>~tno-1aߘ*zXۙ[ZHx3DWMq)ArF%j\ 0S jshġE 0)NS}Q t ]٩}DU"triõB ;j>L?ҕ*e7*<Jv_36ە|Ȋ' z]?r$2xSU.8IIml8^b.:Z'{8^saK!ˑW>nW.tz (IP(rucfz# ೷EU41aJXRxY*yC6NQ~' Іx1ƻ/teg86+,U)%iP1vPmz+rGA7$+QwO.suP$p>#}-;O}GW/|'Om S *+ ID7$lDh10QS1&pja4kKgkTjb:pXMkL[dP%IsKQ%jyjhŁ7pxlbpZLTXm̕UZx[gsq@aZQ͐:eK Ԫtµ:XCjyͥ%-((6Vdx&3ux+L/rgGwjs.&1Wrc/{7/+y_RDlAѽx %,{>a ŒR4)y8ZUj,F+~#F1)|}'wLIzǶNŖSY3Y=Ԡ7aT aOPDpHgzVAZ i LB(QӋF%#|5co0U\dfg2ŸfUdQwR<[roMuur:@WoqIӡMG^ _b/HZZ5 fBZ&{x:V7Ca݃]9?iP/ ]Yo{)y KN}8%%< G\JgP=<^/5 626)+ @ _{3F5]Q/d>67 `?fũXd U{FNv;e%9(jqfO >1 |x^wy5ԉ;G€~\.\y;&nIqsц-d^\%rfh Y|LQhைR:U0oް ;7tJ e(3OVCYvSW40ʙDb:є—`i gn!0<[{qd`& #JYmEET'𪙐k)%VϤ #+1K21)ؑIl MpqiXl _ďu0=CF;!rF~u"CPvJ6yڣR4&)z2 a ?ǛL<ʾ>X PK-?W(stAbU0‘q).?Onw!-D0LEg?BMpGc ߒ y[e]u6dDt*b;GL[,#ׇQR j >[ W}X=:6?TU`1gTU=9p<ܴr]ź'9Ab`6MGT m/㹧-CvBǸ2 Wn@*Ud kP}]kw} <O`|,hv3- TVE$w:+2vF . <\Vu:YEp> 0hYaIa;N_ m0Ϻq%]zȮf;"7fVWWudžkuDnRۅ=w +>|fT@9)Vn%u>hH4=Vk9^ȃ*{`<I]Ȏ6.?wjJs(o5332dߔWϽs4 FߺK=r;Q{ ҤzxѨ(ޭCjr뭿eCp⿊>jsq.F %"S|DAho?gLEd,Fs}1=rJvdAE]([LYkeʘ䡦,b~U  _Ӧ_sn%#~ǎgYUd'v"BjENl@lﶹ5{AQ{ (:5EM{Ω;mZlBRKpoh+O p^7qÌliSkx[x}$3A aD@LŎQ}2צ;Xl>3h<&?s$^I$YVͳ }'Z5R(olT䰡^sCw*̪n]X4沕`cgMp/yĀ0g`Mc'b!dRs@*T5&gB}ݢ4!['xkҋV^#v:q '< #͗fe`LB䮷kq!_dG*Њ9G<|YN:d&{ zcy]+B81B`"|d\N0(^*o4H6~jK~yISFi*H?j4$FB(2|:h3˗D*+d!&2|1P,1Cѱ nYk8\3s2ʚJH課? ˓O "{is-lTY +!)ň "W Yp5Y_lW&*N\Iu>,H.`?_3ֹOΙ!?\"TGp9 V+?vb'w ρtwx73j{O^ōAuo hU{!_ [he Vx(F$28l?"=_էw NOx@tdGjtfvA4)dS;\_9ug! djy`$<,?|0wswsc[ٞ2 (E) ֶPB!1agU h Ұ,͛Յs;i&^3#fIL~Bq/9lFVo٤E$ZF#fܡ0= fG£0Fwr WRj~li;2nɊY;ǭ,Ԏk ]z2LjUgQN(f8/#s4D H~5a I5Q^h2OYB4BtvGg=}(ޝjŷdM?S0p,̳og'YNmDn%0͍/ـm!FrBY1U5dk,E1R[r㠷~:\,5NF4)__#&;L4ֈ+5_Q;j0EC!|Hձkt>rarmvt ߴ?jv^:85AqsŎXIŀ+RST MF?zkdrVζ4?"LVq(ǚb7+* vu1~Q)' KFZ@`n\FKXaZ-Z=6.x)kP2a6*w>r~PPi^wۗoHCM t,y.j4OuAb+ CҡD,8˪mG{Z34s_o]}#u(n8|[^Ub ʅ5[Wm+F09u3G?ocRޜd票 B;6nBcw0}v,tG5?845=m$(]`ˆc@ Rݛp/9}V RU+fjN1&+UUfM2us\* ]?T}٬@.~_kb 3s!y\Ln>/kLdl0DJ(?A/?v+wvs ~tMax%-mrT,TEK׍2"=N-2F̦כeꊭ˟m۫d[\wZݨ_!!Ai,FW~gemfwrG;Ib;s!HњiCEctMlJ{c}C:uVowH6П2&{i;9R<bD3~Js Vp5. O6Et**0Zf`[x%Yɫ m+ e{oA$kļEgҧ$\]9]d`ߴ` 5&BI6aJMDpo+/uT>K$c{||Q',aڙV'A}h:c l۴ÿv4_p mo˳N9bRD^ ?Rӏj2wJDcSq}NhvnۭFz\\ *S}(gb$ m<"&KFy%gX9 #6 C3 A96;V1H`Lb k,+|=[J=P 47)0v#m$ ?;gHI-a,ʸNK $ Z~L\*+D/uꠞ9Y-Fͮ66i'fjT75y[p35`KS& -??rCu<'ϫArZl;J7f;N'w5ݢͶʛHn.{<\`kR) <uX-y&Jƛ\%Kz.ْ:Oݐ-Y[vUcs1)K߫\93& 7^Cױ+ (~޸]J :}HuN׫:<)XreCeytUC~kS-*nKs)%"gSClM &q9M+ҕZq27rgRa{lk w>[6.v\UJ0LQ~ (A W!, nq/iN_Ve:Pd k$/[ V۪Q$ɱ;j锐*w iTktd*_wHV!)H/"lPHOA\Z:Sz0e}#γULN$C:*j7ez3O>A7H}^8v; @{i(Kt<-Q7պ@1f䁩K7VM+Qz^(qy ͑B;!PmH}'>ֵ]TE"]UeCW{²Є&oԽ ["%TZs@X![1!#T=6V-@@K$NQMq} Xu|=6w.H74-MϦpŲ]jl)ƥ=ϭRgrs-}8^ZTX53k/cץsoߚ<IwN[UuN >nX8@(J;+p~A0 ( hBusgzM`rWޡ\cʋ8Xȅ+R7%-=44g~Tsp- eAI *]B4 M)ȓ"c,+\v-KkAML-[D/@j1jȒi<fE8C#,j e@%x&O}5Jo_ծ!؝S0/0*(WlYP'׾I`L8յeFZpϒRje~bUYTrn4P6b)e|7YQxd? kjbKJ3Hi#.{&T"ɓ,e&v{(p'.dŌx@aJJ൪],Y-owO3E\UՁtxXgB94O?h&|m]IF1n^PZhz٘(wDFb~+$ݥpNo,25>F=;gR1ЖE6 t HT>KU+YO/I:%* ;qa B>"t7tަګu jN6d'*U;c-4-/Q,jKtN_^'B4KfRdeO :%ɐBȻ^ ZA*Kf:.k@wsBh;1ɖEyzGD`|괣e%07fYJ  |#/ҮqAH䧸e.ߥ.K&a)E5z9<ϟP6!r{wdXpYYՆ.3x[J9#i"a?e(@fǢ @ISCf>9 > ѩ잟Ưhj̗YzyXM:|kH)G xt Op"M.v2^ W?oZ6'X4S5-*b?g_<(l_O+@}^`0#(9m+n&>Xx t*Q<}r!ʪPCԭ#Vy(IG^rR"֤Y<"sbhC΀{]K!5r_`\LLF"[1)M@驫vLJwaCضe Mgh0ɄoAa!(z?dDt!f<]pWLDcݽ=1W2EO%`ZKd 0젻Pʇ')w E0Z ڕk1 >v.}2m)_^1f\\@fA1{㈕`&WD̍D?x5!/D~;ﶊ&A: 9M3z5JXZ,wK5?]WDg=d6] 7J+V]ci7(O cp^cnXf imvHPK"("Tx*qPOFw&#X$=ir}G  0V6#(>D. !nc7ܑ] mE A.ƹ$hecJLV K(|0m ti[jr(^p!Ym WuT7 ^4_?N v j?[5-hV]<TCa-$(7l_KG٭$5oV4,}"W}plzf/}|PE]pnDޓXPv$FJ̌X:WL]SQ;ٍ Ex<Q%␼ء/ Scs;!pxi%ug$C. Ό6M*K;lMΆ[Q38VHF 80L@=\gv&xv,gLm(!ik6&v=cg}֢s17a>p 9hYT]J~/b/Z?Juڌ:ae)JhB0IfOV+r2 8 Gޡ?@Թ)8(TKx#/R3Uķ=zUU6 ok@I@ ՉPKj4_-򨄌k/!HĂGaTqCtF,&? \rF+^G>5&[b vV[C[3"0|rĵ$Mk/r M}iD( NTYhlOl_و9"kۏUlYioE$6})oU0ML*>\T҉̜uiBrxјB& _1@>}j |lTP94` (\"D`oki#B-u$J\.^cQ,fD夥+M"FK j}Sn P^ZuѷDu?=AJ>fo\s)}]GECYՄ^ aM98 \[ƑڀN~}sY^>P}[ d:sgvcli>}6Iv'MZg}4(0c3(jTú7,3M-tMɴ&|&JO^JRX˾$ pCZy?S.Z9QvtM a-h 5%|7K2mБDom;N|֣gK%Czow N8հIuTS*fQ\Ԅۋ~“i"Y)G#i#N,?ĵΫ+xő iЭ]P)O\$ K[wDɊ ""rCKͽ ]IG 쟠r!oQwrKgW*C H,)H:Ɉ#|dRq.ND8-ٶJ^\ ;J]W8 x/Nlr՞gbMTZ>6ߕY=TyXW-o*2dt҉+3϶166.If @m$LV$ bRW}RI`g2.c5-Ҡ'/ZtQ paQbBBĬ92;GITc& P~rqU+RzF9Y.LSЯ&Z<mC tGءյSBG#66i75QOH{\|8狄îH$'W՟Ӿ3HKѵuqv&VA9F#y;.N@B˖(NH@ql&hiH8Hc&f7J!M Dub:ٴ5+FA: fc8jMװhK5?`sc!Rv8(f&>#G!{6Be$x9C6,ٝZeJE5=hWI-e`Gkˈ?7@S>@˚~|y'2F;Fu3+?j/!FED^ݼ-;V"ek36 #"W9cOb?&=lAQ]6_[SWr[Ƀ:]+|)vtH_(CisjI->Ӻ)բ2aCkDTYDnT/z>'hGMmg"(}Q,kVOo6ӗ kϵ;6fc2m}k?/ꔌ+⚫Fi\E0X&.K&-lka.D0[Hh9]'cwq\lUȇ$>q+ z{#r9s<2`T*˚ &H&>OJp2mĜΌxD $Kt(eJu!E8/N.}X,x,k% lK6+ъG0Á-+ ZxX7 醡N)l í*pquukOe%Z}?]BA G#&C!oyqfIiO֤ > '-VK\OpŁ-Jc h-aŇ*wv$Z; a'E>4T5> '|(1 KqZtik֖7u,E$2)T!ۤ{^f)(yT@O=6NlKg.tSkxV%1 鉤T)Zmޠ#JIp~*bWHy5EbJ# ?[9 /5UZbPЖ^XKL.2fi7t]F.=$q%bYPQ ,BD ϶M Wsz Zɝ-eܠKš+]B-!'"ڎWUE '5CY4lkNR07ɚm66S졫8$᎗CldXň5nggB +vHC.|L!:YhA&}b.NhPCz8{NXM;7z*숫膼S띊ldυp5f"B$;Zn*}ђ,bl :mںDJX)uP&tqG@nl&q8 NM{1ދ!}F jLxYz \c q+)_݅%!Z:9Ey;xHM氦#Qbǜ|5d s|l1C5|Zn;ɞƷG/e"ąaV!qҹ5O4K8Njn} ^+ZVIh)]`4bC6󿻜fq@k ^TwncyevOc2 >GZGܡ0*?OT^I^/;ZE.id}傜ÔL'>_,`y!6=2QZGbgмS㨫/ gζ;h[i %ͤl{ }:د1"iU?/W*O x+dV>Z6Tixe8VSRuMSWB#/\vY EYLX8[-Sh酭̕C]fVkCkoP~wx þ>w_Ve-k:dj)1\+NEO͙xL:w3P ҍSآ ț{qԫd-E/O8dV{Zpri3/;,Ъb,B cW$E"Xr˰ꯦHE%'zmesZx W*4*NAH*Lbbm^KNNuO's; P1 YoFĆAئeҢNCjdo؏r&ͫFH*tQe >|~VyDWJk1sg*=m8AOZ#.4BrAxv 빋^)Ofj-Uo&Պޤ{,D(qcmyo@UϮx*EhtHwxOdTJ4"A,4K_^ND;PaEЈAfZ4&A^@s*{w?fr.⺼튮 ͙0xnbt4BJd%^zZqͱ}$r>n*svy15h#&ZOAIGÎ5i?2ŵV)jWzw$w 0q|-2~5b3R<3w:R\)D$0~.a 3makf}J&E$KVP:n0ozocYmuI6N Ms ļ2K2۝x\'~FLŅfl{_=`ղwrǤ B.ΫJf%β.+x3 >cECOhSʿ:̽ Xx{Ҽ>60l`ac/y ]-^k-գT;edC\n9\Dз =rz=ǕyZ#˥,Fzsb 5 !p*ǟC{0bۨIybaR4ܡdIO4ر,?uw.`y q≽U[o(sub$WXpšG…89me 4쥆W˹wߤ ^JP:uq,AJb.]bpCZnqI<:Zhul82)qnU(Qw8r5._ ,w?&[h7x7]^;6"| s5Nє#;DKJMKص"WCaES (Y)!)$9#bFN׆ݶ>8-peܫn?l7Av$SG5]E M[J'RJ#XNqzv_(ԋF,&Q Czh0мn7\W$q|-C9;YڢnY{,C)-oH}"W^ DyfrbE*LمEQpd@j"hjrjN`%P .gҿ3ǣl.۱3Ž'_8wf5P~ ?-?@_7-`(i.Db ˬ3=+tvP9!]9K6ধYs9|P +S&yNs4\[(+Kx5fBT/莥sNޒJ!'x{k.pv2MƬke >'Sg2;]\ SL+̩?R*C7%],2T9&! kqQՊ{ a0qa`ӑa?vI|4˿JjBr"2)d5Rߝ5ۏ0;eۋqH2Mc0h6tZM "U A@ / Wg0u6ZƌԴO'@\OH}@Vxٰj /wP AnoyA92Y5A"s#E  H_!>C5D;'ZKyPX稈*Eӆ7&V.N&i+H Y/OȠ LSL-)7gH2HTĆ3k-w7*Nˡ|14l'D$?A_\Ed 3r:yx~tYF"aMNcxu3[a*yҌ NsX5\"ՓsS6͊,R;R%}|+c-F/ĈE^KoA)Цq7;Y﫶v[DL@4t>V ql@$Q)qO0.-%vrޒ|XT${@ic`y1O2 S>>B}3jKZ͉Jԥ &޲luMxxdI^#]ʮfQן>ĢA? ⽕VPS ҰMeesa' `C[~e4iB6q7K~<;iE7wx׭ڃj!CРM:}L>*K~Zn2l-6n${rLǢy >[!/tׂa-*NEIs=(C:`73xG@6M&uk"m$߇sأJj [cO%'lvMjiX4s4(쾂 oYSX j[cFQ?'J"G# aw NhsQ6cv9$T-#eݷӫq[]PV&#u/VOD:u2h#4UhHkGRmxOdb1z`%`(Z2#eVUmV|kUߝ17\+K%L9u#kg'`!)(}4Df ұ~"ś2pv)'] R5:LnmC-% v9>'d!(CNd!20Ⓗfͦ GlAV_.&8ƊT$i#l阗YҕYsL`"PkKP̽cq8~^>_)Cڙ %#k* y╿.1P!>B-?܅d13C] "zx>6(:r.̃cirfBL:yF]DqCcʪs+%82؎`((?d]Ώ z3)q6,>i^8yڕ-t#Hu ;Y%cHrF3zP8 0}@BVP2iz몡`X?W 1CRd5}8N8itD@j , }(haw:C"][K))>^YE`}DnZ+9q=vƲe˄77fiuW%Y=+adg/y"[8~+j`g44x4tnqx~2DFK#\vttR\u] 5;[ʦ֭Y!CӀɚ_>3nӋ_y-%\V/{U2 /B0`Yu[3ݼU 4Nf5Z5?>mH= 7uWwt~O&SL =r#y`~NFODE!qVMmN)!  ϑQ3v3߾bN4ԯ}_H*#,5/w3BPlBYl|=+E62O0L/mG7MdM; ؇T8/e.= QP X.q`ь{^{zN;Ne[#|(c :6JŀnҀi\jW-/_9D^=fym+5pXjg;7p-%gGq|pBx:vǴliD/Qy!á妮@)۝Adg:L#h՞MYܑjKS+Glvߒf Q䬊XpoQ=-af̸5CA]Gz/ W!TY[:!15fTg3$^H.QSk#x}WTOQ͟ه 2GX@> 6bL9Oz3Ee1y %i\;cr: 8lWS~ U`&l=,`>&mǪ`ҷ.8~_!}{+Ҏf յ9ߨgtt; ;`;"\/@3M3˚EQ*'2'OGaA,E&q03bՏ鼗+oK6 $V|{z~!,w@@>_wcgvdy Y6{k9RJl/@H%d + eҧla0[Tk|S`{8< `r3 4w%*rjBoTyGJ㨖0(pbԔ ?5(6c^*6د3{Æ ىC 9EVi/_LΡpz>Nfw+2ɫҾAR}@\( r5ATwJ[ʹ|r7ٌkuJ: A&93$)'[#$+wg7|49B:اqԼqLQUT\${sCZOFrXXPIi¢jv@а4>Aqq9e\!N)l4Tflb~=# ҈O_(hJϔjQй7:~'17)Fy\2S@K9:O i?Rm{P{Y1;4u$l%A:*R.xߺ|q qd-ڙt%x&P 8+ "QNymUȇC9n ߝ[ TZu55ȼ/YVJJW0)F0*aDuy1VݡN+E^U4Ry[z[kp{|?Lk_ b_Lғíߜ?)E᧣ <3=ZP#~Y8&- CV`{c9ꆗJjOt|*7֢1w gQb˯Wkng=i.[X >jy@Uc5Rd旨 d"0RYL{_t-t~7 u | h0L4Efk@6SE s 81ZM|F}IC5n٥1nLMuPDyP* TjrGwX3DSIvC׷fR2drb6#&҃xBC {R~9Ys6B#>jqB\[UkTIqߑrw. zs!{Eގ3T8#0qM80Ӥ \+: b<AOy-Ua)>*I`, /vcz;;pR\ՅسhoӔlڤ{Y\O*8)3 .\3ա^SlV^'IyhDELoȦ#9bbH2gw#>Ko/4NөLOyY3c^ʬJogolS14z6V8 %Ŏ@(6]7ט^SQf&n|dh?w#\op|Z N+H2q6 !ls kjr= ۖRTL~nXL8l0(뎊:]Aa_z(?V{@S Sb/ =z`ajZVGlή~ܮ#cZu1D\ura)_Mr5^C4_ޏI~Y,bP;n{њڤb"<#_W >D[m5ڌcS_0lɪ^hJ&c 0DV%-ʺIZfU\٩r0<){[v&34=y+l\y`?H%\Y1y] KwXyDij51]нLI D#v]9 PTNKZYkaͭ pI($7۞)q$Ɛ@Ռ6u1 Sdb Ԓ:m&]XetJXx+YN ,|w9aNKKOMFurJY~82hXtyܿ[یSخ(14" Y;ee^"%o#%4$:!EW} EnL)hߠޕhcTTdHMlo5U֪rj ȅ5Q-@ȣXSջì&T+ wgdSFϦݾK47.JU{#=sc0j] 9Q'{eyj*H=Z ۺ%رJn]ipJOԗXRfL4_@NF?8p,tV8-";B[Wh~)OoWW^H݀F$/J? ˏ_h*]~ %4z6'=l>ljC^۹d^H2d~#jaY,G(e?,\h 6婍eͿ>).(HC4_KLiz^,9̬aCQ չf®% C^]y  @D'jMxsdfTF=(GQ߹;ϸ߾nDAqH &[w24r $6iEutEnUI : xdܴ-m@0gsAdP^? (Cs~5-wxk!x>_l Yq 1$TmfpB$ņ=&td3x)e)qM#I]Gl,8.t$ ju [5u]%* gÏxzݻ(2&]ɌQ*B4Y>6Pba o̓ud}qgUHr6u!7gxF-cr*4j/> +Mz-q#YT*iAxٞrNƥ>HDX7 F 0}h?xQ"qJz5jObB49 ֍$iܱ"*cw=t6@Y_E\⋤DAkVt)YSOzx_lQ^VxnIS ݺ(?hl zx)<+7ZN[rX+xX$xNF?[dr^KD\!~y uXFٞS>[5@ &Pq'y5|eP4CiٕJLP_]T᚛3&@GrBgx]eLxQ~3n0e'bgk(,h\Q3 1(Y}mw|b#EgnddX/"!å9R tW-L=-V`fǪJ4e2y+8_w(7_='eiөV1LA^8nƥlYM@˹o |{k lA6?)G̻2~ΕVm5-ʫ1Q(0iW( zm_E)KpadҒE׶99xD)r4$[p_Yt=l^9B?k0eE\ΒYvV-ճS ھ[6ɱae"J37@'i5TY waӗ|!(caz˂!BUۭ'/wnثUSw-{ZIyd.g""Oű\)7:g&_XP. F[Ϸl/zZ +E_P+Ӈnvm(NoeiL`LYc ?*^@.[,e|(+kR 1lYP^/pERj9 PwH3D{=F?Pg) \QZ ~aG1I|{6S@7ZU!.hHS^M稸F_,'Ԟ}SN-Sd$KHQDSO972<%'%,v_bh{)"q~jsRM^{ QC]5E?h=өԬ֝;WcLa|?T*KHT`A :U'?- $P!j=-͏Mu;vx"t%sJ `K"quiR!ǒoR=nYpm-< ~깎dV \~J}eU6bAI3^A|H#"[VBf[CZ2֕5 !F&` v85I16:±F<R+39lRz ( #(<~/ UZKUE] Sl2o 9d)RP ŗlӑz{j^Q ㆏S*,ȼ5?w<p2s#>e7T:[IH1ä6-m4H9yz!73=I_Yxyia7^?od$O#D5R0prӷopUym9ʓ/C8+.T^(nIMd_‚Ý+]U}-9)Ů+YBy -XR !vd1|hI%|ۍ#c\a@`owVRc5V/,"]4K*ʡg1V@]/JA%A)]~AZr[6ѼF*,sߵxN(w%đf-;O<޽W.:b|*JU"tdkr ć))ie$|J]seù;{[V*k sn&LUY=\L?Sj2yo6Mp@/[ŹJRr Ṙ&ٝdglqKAm?@}'P=B^TUT?7fjN vb}39E 6([ UI_Qخʜ u&Ш1nbyx.T}lq>KGTJr[jul,tkp˦+K'K](SK;m`fu2L` t$dd!1SSsACnwGG` .JP {AIc犺Λ5Bm~ H|XlGӰ#@)$8ϓҖ}LX5Gw#N(~=] [+G^ș9[\t^>$q68@^%s]N>Jȳq@U72daiHi':4}S_(Tc8\urd"5'G~][3yQfxj\<@. ~?n[)H~n^#_c̈nR>誨yS"xxCD[rl,d9-tÐ]pV`B,c(9=5Ժ`}!c!ǩL#t_IL}zΈ{_Hud+m~E\{KT&][#gGy # d<]]ZĠZ1 >*&J /җ?vYNOF rЙ>uw"qэ7 TGςWIV.!Ea(M; N=r{^ל+l?fƥs/iʅvt%69"DfEGaF_{ygY3Ƃc_D[GW?)IM] w\_汹!08G`)BxR|4FBd~zKqC`<;`Ryr򥹸g}WA 5 6Hc]nainƾ$[Е #=7 CmոR7@~ Fk[q uUoZo\;ylɌTe!rÄ;~lk3dp(^>34).K'9ڎ*7 B? C*]@>o%2\06?e!94 L[ܮS[ h_FؼËqpGB(䙞FGl=.؈\]%Ao D9`=Sڞ3^#O@5o@|&mfCͨ>pb}ofNȪohf*k [ت_c<'` Zfڦd8#TG&] iQ?GDH!QkE2GzU\=2ݺpK`h2Cu0s[bV!ؽ5lD>^bQrx*Б<B,'#pY[,AIq&2E1VTl`ty1(a}~si٭s!dwo!CA-QSbF`F(r=^+KAO}}ݿ=x=Xij;4a͋٤aq[7_Y . z+{a'͚oEJ1<rg׭,9qSXV:f@^l&&"bOITv[m&uExK"ə t߇[cfPUc< TQ\fɈt⊲=}mXE P3y`f[I`)$(6S+m0Ǯ}9#mKxTfVf^4BgUjPG ԵV-fMܨ,';.ߨY ջ7^ }wS>[\KEإ QW[{ AiM=>[6k1<2BP)S*PC k&=,6-R 9eD`[*1f-NCU2 &ٓӭdVk8MZo8bYubo5W;45r0=;~p|bY:uO{qR&ٟQfCΠns7aw|t lh7c|̶پa4ݱ=!6 ~K]9aE0Bi!amA$FnpO]kiI?Ӌ,B%Ԕx:W8غ3,d;7Z\ (v*0b ݲL̈N! rL8IVai[%&gmi;L&&pꉡ93в}j:̆=)[!йEf~`GtƹȗKV)9,YVeOΓ0q69%,uȺ򯓬,c#I0|*aai -Y?:FsS?kI,yak2`[ᷓ >Yc%F`zXb+&[6_lc䶄68pV~y?@a2whG 1r)dOge952\Ks[`氵!lԼ`AF0DfwaAU`G~-ˋ1P}artVͅ-P.-I;l]T?`}eα "|(։~Tt;]t%&ہe lj[͵^R d$ A䘅B<XuvS?˯r9<8v% m 7ᰟ`E}63+M^ܰ̂\L&|(n!3|5] pMWE}ʻ?_xPPXΆ%kn`F!OGM遅]QOzHf1_3Ƿç}l!+߅d)T/- r5qŋmc?M5cw>/S MJor~s,ƸHrAF-LU#"&۽au7x5f:* {a< ~)1QeQb70@}a}O">MnғX%f p崫ucfiږKzZoJ&6 y'M\д`8<5{LQ||RMwc5@ G &l s0ֳM '|Sv+g%<~B7?#ҭJ~]# ]Q/P@܄K*'=m>1 GuO $S,׃ɵ9_{U:q-zhhǪG4~F{2wl."T3iQBlƨ΂O6޵:L؎| j [dM]/&bF~nAJ~_7#7:O4ߓ y^bS8nd=/ .9Iy)DVzٟY%bZ:P HϴݺsL;$ >sD mOSK:Ff{ntG| B7IfXϹ\eI;})rE;S6]#Q Z)*F2Ph &|=q b~!gkd*ep9HQwxCS8w2TcE b, s'9E!Oxdjw>2 l}`P H$~r.flv$4#%國f^Ǥ HLlэ=3Sx^}eyT }N hSҧΥԀxz18f % dw81HEZ\+.cyMulVk0(&OU_*AX~znMF=, ;o@]-#+;\S Jv|ՕgS-$D#VgBUKV =Wt~!lBnCffJC_1YV6F_D^". Vg〿|poBU``f@K@!`tŪ*651ҺG#zLKx z }$C`9li=ln$^+MR|V@^E(\E!!Rֲ9ԡ-LHq&a/ #<; ٚ@kϻ PgYSN'%_`2c@儙rQ/dqG, &c^Wc[ߎ{{ٱ.,HB8ʆbw?V+3!@K1v3_K&.leТJ,c lz(wE{ut6hZM|U& +@P{(PX33N]f=m/pX ۃԮ ĄЀ&ØS*> !KK }/6/Ҧ]O81r;(5Soh䭃jjv@ @DK L4L]׀Y Q[8O zE p{Za4c ,|݆y\#& s@ʪ4pc*q"濁~$H/Sh[XqL*u!րeu3[Gl4GM2TSneuea4s Fd j*OmI_&q?D~ԘSe+>AMnK co+gm)(r !}b6S;%0i$>!_+َAU3=6G9Jk*({357M^F` J(< Fü6A@[&S~^wp*w-o 7b上c'fD3}AnP 􍳜Z޼VTO"uB[ l'l~\zVs;G|):ѴA_'7lQ1<(c%͒|M]o>9C_.i]oHrB$2+8%;G:v@I8 \h^NEfmx\]}!ya_4UIϼ0ux 6gꅝFA>t 90$ؤ&83iK;.r,>10 ;`0Pwgq77%!mP;t{܍O 4ҺsUExpׂ)upJb?w}/0ODx6p+Lw`j К`Ϙh'1!H}?>PAoj}Lv ,l9t|En3$T<"_M1xG'=}=Sʱ})B+lf$=uY8EIOk]ra#<`-MVDBk;$`D$ Hts֝Gq= FCdžoH[SLk i"  G:FO"OV %B@ O|HP`LlPy%7D 7C^&k|4_]{4X 9JP'Ӿ&bBoyzsBk(1'Rm<iE^yc쭉ʛz UjY0DЗOGP0D&sݕ<%o G5p"U2d 0 |\ϠқX"L(˼/IlП:ؚ Yi 1wZ>`o66_ Q ].;Uyý`Zej͚pd؀9 H>252 1smOc{ëOS[Xl|`p l)Z dY]fzmW ǝ.V+1hlf&IpwS^snf&2nmO9Yc8rj>VM/ vEo<3>U:kCJHę ,'_3[i_ O4g~tѤlL{,Pq [Pg o3ƅ>FhBK>ҎYo;.ڣ{60wg|6ނ0\w0M^.Ճq7‰"Z;Eȶa9G;ԡ8VE:*WhkηG.Z+o;WemsܧP/z7,J0V/b2yz9cۂ}Orς52L-ថF-dQPtbX 4"gZ#N*͞8tee8Ŷp*.C5zP*~TQ~k~ܠ^6a]'i|ւ PkT)%ء"4 Lűމ&oX1Ϛ_ 1C{t!e i'#:*4{N&~eYƪ^a%=n cn ֱYA_tb_)??:5K?'%/vkEW'W[M=zy-VHK f;dD[iY+#8RmZ^hlZq8[_`rE<*ݡ2:wu1́R٬BX*Oƺv|5ɞ\kr:n*7pؾ䎼(\^fTvP߮IO, AfLtȰ6cהHV;.Z_\ϓ̩Yo+wgY*SJLPv, '/b399Ǟ1BL aS5҇]WL}FdY73HIXj!O@IX- mr S=3Y[ZU+^ao;ePZ r,:G!ghbhE| 8E`t]`򀩦KB)B \{ܿ"Pܟ{"yYɻ{ڵe*6xL=EeZt|C&h@tD+|B?w[C9CΥy:, WWVrUYU0M0bZ%T'zkYD4 j mYTϠʪeEFi1lsHpS|p_ ½8o84.q,6.(+Yk|L' hjI߫Ά?I웘˜";Zc*8Az'?'9àr0Q`q3p}qlLиuDf">$@n IBea4F.Wo;Wi^58=z"0vkϏU;c7ef=-bāHW}'P )jR0i!)+}{mHf)ᰬ? &\4ީZⴻcCJ.%,}G9H}/)R?{!z|R0ycʸs *^.M>PޙQa|<@R{] _A;BE꺌|oX|LQ 92]=@u0^T_Nѕ;9r-߃{'b—l;CO$C.,n#ȒlKK]L%oBؿ`E=(:f ?2G)8dJzF\*%2RYty8/NwWRqV /#c ~YZbQxz4J?AxM)?J좃ʰU}8@As2Vwf {b9ZyP}\̒G{nx+ۦcu̔YUd3RmpH/0 \{8^'$&10(;0n[ |Z:Epugkˣ$Z=O: "b.[(c3@ރbRUoPJRmGm-) 1ʙ_BD?S&K fOwHsUH,{f2/ XL - Xndts*7_7|1С~#w-Ti<?XlɾoB0hj{ o5Ʃ6^)+f_*}ekir4|)Vڣ5/Uf.5L+2q@mW$: 3 AKDPnJ ?I厠e+T3o7πӁA EgOd;`5Re$YD_O$"Qޡk6wZ|=>@$0-R@v#iy* dm@`csD)Uj—.6"<[3ӑ z: @˧#wmb-pIB80W!v^X=Qǿ-6 L8=&>ӋDjʋFǑW-^`$TANEIeOp_YtFg8MX$ m,׉l&*YHcy{\zgB8z _uB r5`ϛ ),iFw? Nl6:J'%YBG}V$PB rIBVN6Lk.%vڰs9[~|0j޾ *μP>p`d=}e6gDp9p47DNp}@PAzl񑱊l6;-)T`|1}f(?+i@%򤉅|p,۬h>gsZ + PN\v8!یs_\ ;"7Be%#V&ojǠDAP]&W$"EPc:@[S6kpjj6B6A0l|KD_lm?,9^q#AʾCKZ^RNmT{11r'qƱq]nЂyB$72 @Zc?xO%shz 3z̥-y%l<>B>ml8f#^Q(/ 3[,Iʁ8Euӱ߀F[S<ޘɸ YzTuIj65N~8qvH&Ӯ%!quJtXRT~B@BM@$x\=w1S3݉Hp ET-KgT_eX@<몵XjdG+6LӇ`9S+RWLѬ${նVEvT Mo 뇻8C{M3߿kPmg[J Bj3P}D=X"20sF+>>ꈁ &xJC; pn9F_un:AS洚o$싿YN_K0Ɔe[M*JRC;掇o #|[N .6L6JO Xщt$eq?7dE짂a˿/Yz#.&>ScKdnkjot,,٩ g,WA.!Dvxj|nz,4~`$"%g *X~<WQF <8m-bb,ʏk&iki-8f(uXJ3]f&+=>0sW@ݷ&.vWrG"ڟޘsc-nwjR`d@Gc$UM1>֘@̫f~@Gpߑj)Ѣ6v.icUBnUA8?[a;OD.z"*MN V>k|H^^utoF͐A>RYfTy|zy{~ œޡj{svL5Sg[>at l W,#]23}-Dĸ1݀'Y-7B8UV!xUy>*g:>fQc2AN, :Aq^%E$`J\3e@Jt;x{.v8Ҋ ֥ %2>e'{^Cl=APL) 6Q?:i]Q'4}T?syΞ dL°lrլ.KDo0Yt2Z1M))&ĪxLH+4hҏJ ?oxnv-"HKL9@8ړ|3 L#GM~TWE(V8~fԎ=aj&* m^Z;6Н . 8|X]Qf3\r\M8"ivgkiQgv=|t1z7MAGQj>5L`r)wQ{22F,MyKzyRVhS{ 1Z6pȹow|{a^qfb5<;sKx;oR˃"Ig _ĆZug"FיuYضXbM5ͼoS5. W)j^si@5&5wLMzYa~N,33*9T次+xó"FT4(Γ lSR٬ԂG]5 1F@#nԤ'Va&ifTަdAq!*%-+)D) ǚϦοx[]mTɈt|tqKPm)䰅^e+V.\ҋ,$Ԇ8JP7>%Z+*3!)XD'mu]?h#pv^JBT -5jw1.[][^<-' a@Goy' >wl^ m$Hêp2bP'%ė;fdzB6\ȱB,tU{YZCO/kf(o8l!ݚ-9K}Tt,T VԜa lX ϐԥl3-qVf=PHO |— iS>~RzxʵiRDgVn3z6vUa=lyq̂rp嫩d$^F6xQ1du`%i)lXȭƪٲzd7ZYq6=Ee/=JMJt^FEH]<8ͤ`ɰM/4UĒvW+\)E H$V(1>guI1o'ߞYGУ)XϲL}/+) "yfGO_fn{iZ aU`M4AY屴m;H,G;8rnTe7+gUWE $>q=r?/I/$tg\H"ʯp_Ddn%`OD)#XqbkAw9L1 y-gE8`Ts WnA7cvmNs& \2M Ŋ ѵ=J]9q\xi ;2 _`dvZ d`Gs6z6c0l +r+&?K-GϓԂ p6%Bδຏ݄VԀ Ȼ@K`tU>V29 Z4i<'Q┿NX/ eCU\AߓܺydgOՔ0&Q31Gaa t _wpLE@CC8nR GyIH_?ठ-c ')z ~ni<@E鷺 |8M`_>Eqdp)JAӕy i 5z%- s0}.G`K"&Ve=VQX16MM)DLùJf-(N?Y5->80BJY;*2SsmVyVk-"#۝ 9*F4 e+Ḋ/-9ͦGQ1ǓuG,V΢2Cc !H3c|e-N:3\7O~!Y-GDũ26ԓj{Eh7xn SBR !9BH%UNe夳4 6dZTF/ Q>o-OƿyN.S v} )Qz!%oV-f 2CrsR4*#:ks,^t 4,߾s<͐> ߣC'[Ƙ{t}]-X[T(cmLF! lC? ݟ>n UVΫ1D+Bn3BMG7 YIW #!2;ξ&i[b&>`}M BuO[@˗B$X>HQ{Ϡb95(ʁjn@&i1|F2EMeTL:L/w%+D c6VВ[{Xc[G2Y[Xq>R/ѸjS_2o&֑֙a,;ttĽm *o./-t ZD՛Ŕc_6閭Υm.xSUL/@gz2;q37xB@Jqf_Z;7srtdvER[C1=x(4R(KnOia29ÛH5 Ƃr9}[rz ļHplHsShz(jَFnH$ȕՌwVWcF|-_!g/ݾjQ>gn}(lQyCrX'G<6tZP.)M`pd4V:䴺%ѠGCrP@f-G ?7Wݕ%-3PLJ_Lml~NȌK:抠U.T08%1.XJZ1WYMͤ?d2r*ޕ܎k ZK 3>;Ma9Khknhx[ShFG eg_f|W.^@Qelo Qo/zʍ 1c3>X= ʪ(:4=uh;qٹkn;nJAe{G*Iю52_%ݧY`/7^ 09:SIwRB*)?-KU/>%ٖ*⇾$y ezqaM0kSe}/WB+P~$ c#ܿe#@dӁc lk$.xTB ucKdǷYAg]Z9)z}zB)b/=4(P3rX %CS4d$ТLmiG#!ek`P٨O[ 0Oys.,[W^:7=EKN4aU%{60dR>q%Jt7*i-H`[rFCn:2M*NIFͪi EDŽeፔ]\#{NA@SAңѿ'u?C8\\&,QC prDC2hP"x-[z"wyֹ$;iṧX%VQ1crBNͫR= nž:Ng](hxj1ym.  "'=ɹv9At3ٲҪ)w?OSb^!cOȼKLJFZu&B};$ ::kO\H9MYz:[4-bN)0sf噮G a䢶/"Ss8wY=Fq”DBgƔgܧa%}tJpeIнgGGW|aaN~y]Hn095r,/bLV4d CJkϳLwpuMFNekyY81XTlal2s޷₼JVft rqo}q;Y[og|R0 N⬊ՃFM\oޝScBrWu2 OjQA5#:㥰;r?/ẅ́_LؾwZ̘2vDK5 aO fhHOŹ U4_W5K|Ȉ ltzG,s6WJ}1?*Ifj|7^_cb}PHKXڬjCh?x}mo;o-6k1!~Wӫ\}R.h[JHD"fG"|H9BYi,]0ȩ;%D4  *&=0٘3Ujkӆ'Nfc>_'41Sy򸆛JZ)], q4Qd)3W~Ko"a7Yp#wap~@e:nһ.:6|ИNZ˸Wh1{kn40zTF PL#A:᫒+ד(}U8Qm9e[́1 ]<[ցirc ׇ.Mu_O@]biL! kNS>v44_,<ͼI <ǚmd}VX6:2i1F;7} u573 }`z&az^tJiή]r4GzփXt2} RClo y!|V&V9ycr7 FQ:YxfLJĞ}l NU:seT()dJl$l8cmhxsxLb?n~ fꯋ+W\l*xS~=>slQ;NrH!9Md<=J_T7ۺa|.9GѰ$?"#Ps,,n)u9'} } ob(g(ʴ^$ql3M4vOڵ¹9p=^cXF|Q$Ȋz5-WM|} 卖5̠K WO# eV!@^ 䈿FK1/{<|C^@AP>ƿsýCSAvܪ"nFggpnmwSWUthH2%t_ DyӨ#x!Y6-LWIDl& ;Uds[^Ŗl\ښԃȟ$#=mjvjֈCs\u'لG0hlry($l2&jm/F2Dd:N@yK&KΙN$@rTZ;Ӣp两(~z1&ٿE!"0tA}ϭ|p/&Hvך"Gn-硒2xҾ5PwF4dvhaEl V.8u#ޜUpVlFмfz7@A?͑x23(|?Mf6y/:1d(m Om>PqL J n>GyCS԰촃( \6znkR8.oH†+&#7`C3+(Wz6+5./,\b/_Q%bX X i@b،ݕ^Y8@/V5ag6Dr/ꮁJRHEX]Qݧ0\APYxKΉ'_-5է6E$eLCC"@ǭ$ݓD <({%ӌMi:d%tqTf$׶" "lN\q ; ssDe Õ8aeBE\Uڟ^߾.VjE&CҼ]]n4'~ܟ%*B)! GF B ϑ +^kԺ9![@sqyh)3 d/6OF(o|}_WW$?a6޸ Zs|ƀ$贬mId!9bFsKct4P6FNW@Ҝб%t_y6WNX_}i&~5d7c`.N~\lz)crD+8q >pɅ+ DDi'AI@ )!r<1~ĬU] 8좮,*O^Jtk0z1CI"r_Eq7WA+/j/$r‚TMX.5=hL-b=߾]nQlIoMg os}ⷔ96=pX4JE3"N|;x7p>IgYvK^yswqBm!ԆLl~hq{0}n@o4gQN*Xg /SMk6pmЌ`;Gc^~(a22>JUVEWygrfjuZjh庾q>7%GN p%ΪR+ieh愡\s ;Č(**:ǝ҅wz)2v/xb-TsGqH9#Co0I73wߏ*iRtgwHV'Y= V[$U_G(̀5lC D J13)*oKHK|\" |k_J2:ĖhWa-K=ly9޹ Gȫ1TPbcSZِSl-,5M%W;H Tv`ݖ i߀b#k*B[踩BKlb)Қ2@M6Y}:<[⩀$v]#\.ӭY8pfRb\?bft&sd3DF'miyT/CX_`fK`mumlq$zn 9 q> mbyE$idkYj%'w Z)1eZc"^dxNtEAR͇Иh d;%â*W pCw=uC02=2@Y M#^D:-;@6˔7C60R,ia@wC*'02&<,ؽ"-~0T ).'DKQ 6JgK+ܕ TҀZ $'&yG_efց~~VF' YdxQoVߨ~Z/"~ qo[#ˑ4bMZ/Iɯ&r gZbWNHˊ,E豹Șy|t@A`#3;J=սI=e ew䜩C)o{錮k#È{lkmG*3QTUߤ$W| II&! kh5%Rvr:0ɢ tuX$X%(T]`]P}߾be܁j7b 5&SRb+Z=tgGH$G74RVQ?o'{i;_,j`l$93'i]^,è׷u/}T˥i1i[u $C# # %RxE:P\h$")zB_4]W{n}iK1! .㈬tmt4ςW3u4<-0$|41cZjW<)(0ơt`.ICu–57ɏ fe.[rd?cEףNo)`ɵA%7e`(9~OPbƒ_"E Z:!ku/I/RV=aawG^1@bmqBf|2]1h2>/:o5|W*h91?Q `Ws01ju٪}64g׿Ho.˾~6&jk\I].+`3N/S  >&L*aCRʰŸVKߧ[kdt6o쐰Lr*msdM7`pG˟"d%m)GCQl7R19p460Ľ/uYWRF ]Uߵ~xyTyMYwB-nOMU?ڝa$dQX}i4d5<r!G7S}%oCH@[QUp| N8(Bծ,I{cd]7 CwlwCwld1Ţ- ]Eqc)wrF$9 #4nӅpek+N2v0w"t"?$I wnꀴ('Ry)bqne689Y"# pr{Y\>䕜*Pb*f- Z&\ÏuA5WBP%/BRԜM?~308zn)r l:, AnJ謜df@>Θ~7:F$#z8"i*hBTUT 4:ssBϴ;ą.0#/ ޻ o  [r%~ Ʊؔy?|MD= g6HEEܨ8$eaCkYG*jF 1&b)!E xEE[aVή @h~ M B JR`ҥBYlF>٤$ rɣp\܀hү?|r'pA}H _MZyuZG:۟1Et)uM7NZuV*Og~%{k sÌ>t?B:l$i_6VQ`XY]Yfzvv~73ZW6b$zTM@3&d`S$&&}F .BbT`Ұw$z^Jrdc.TN;:3'[׻ =PenjDF;gζ2rq۬2$Im]ʃ=L%gJDƒDPdkuL)]sm:hEů>ڵwMoI`n8&bʐDETd uDƶ)z`DۂI02YD^);?WSQ:vɱA=׵@ ѱ87ݒ&Kje Ϩy٩P."' E/z]AP&{gW=S5 &]2p7/Bv?z`qJ#86} R-?hB&e,,)2YuG_JNm?ە]iiw@8:''_69v\: &ct$QfwIij9(_f33΂qē d)R4R^K.w{-Φ#850v 5!+ o>C,l>d.s'suwqH2 '˘4 Hx_ue mk1PK#˶|r?d1W~2GNfټVKu|I9@t2FJpJ3$ܬ9r?&\t~x.)R%0TfwJv:g[ݤ@֮lPHd (a I +ʫڕL8u/njMߙum=&)9]nݩ|+ljX]]+S,.$[Aρd⹤jwCҎ52ދ[I,d4S @{܁NJX=&~,i-*5K.?nL$˂0d7UiW~Bxqlcqo: o}Ps^Vƚs(L7q;T#+6v\R7\ {[Dlx$5* +VpiH* g%:̭"уWFuıޑE!#.H7Wdap xMDLL2P._pAh|l$}iG{m:,U׆oH  Ю%2x=޺*Z=-Pzr0'q!- N14,eӷr嚜awZk|ˠkxu>Xxn A| b@ 3mx:H]g& 2p?qoon4R%@eO#ey+(Qd)]MDw)CF G06p^eo _N/o0/7@gΑȁQ ,f ڄe.bڍy>,GǷjp`;jv^sw w@j-?-E8,d㌶`NlW0vw" 6{H?+C[C>ULb8zj?)hL8O1x $xkQUQhY6 C鋊h[KD{Y/./>'!0BVIz~DKkXZ gw~-sE@Mv'=%ʀ1qX5`Xi gЄ?ITHLkemj3*HWz*$4I9 n})H.Ys.bbD?d RުXq[ )u,KB|pћe/G(")} B(1N1sFf# m)@>ywNy[&J$l @6`1zukFgT 3Ns(JcU]X#A:i8m3e .E*W~a"HGOA𼭶ؒQ/#4jCу\% C t*﷭eӳ'~rk A=`bxaʆ%6\$ E _3` d]Y7Vp _ 6ʵ9IQP⑳Ƹٵ)*m]{=K%<HU%h"Qp8ؤШe)$۷t;Չv"tq@͟s[1SHgI^8T&wVXP=fYxvi , ~Mp-ͪJ y^>߽?;Q0Y;OBij=t6 ;OV-ÿEh}Zrtv{藢B4'&\yzB.1J1'$@*&!g=4B2cs(:|jŜ$QUv Vkiғ~q{rR*z׀ahDE]DR>bfBzݡׅVyEdv5Y%kEhy>9yİRp N%5ۛ ,3jX y*htR9[r(= ͞9;HM% by"ฎD"h {M lZ)3b@$ ZtyFKl^u62- r]i#룽9@;MkmlO:%yWŽ)B1CY9_EFlBڷ+M`r-3 oWNY'^0<']JVa!rC b*g{ 돠ϊ a ؊b>-,8՚]WYrg|ecXV0E51 5IUss- ԜAֲ`>b=l'Ä\Sy$LFέmP jKw( ddWGڃ,n,qǟX|ŏĊ?>m)8ɿZmrd9:ay3bjɄ9Wg$k=τKW<|102 BymfzZp{v@+(bogv|}|\>W+lS=ז*aX;C!J-Ea07I5J8uH/꒒p' A)@|[U83f:mW }Z됥Y~Y&ɨHS/Z_Vw7u| X9ctB߯.|EHvDBq0-I:zJX>DKO@i[٫Q^sDdV&WctBPntC&> UU3bӌwĶ; c' Exsn94wߙwTLaá u{c(C89$H}Z@8"a;pZ D0]k a6l-deԝ xH 6)܋ͽcif:*'阩}4{ +zAl FEQrrհT$Ƈ\p=)ߠѺ [\qB&/ 3p:!B|ŭˠ1E|SM?F'6 ZwpNa8TYێ#3քrنhZ`[4ZO sCx);\ j IL}?8l ,ΜR[C=C0?-?5{B2QI8R$k@*-gΕϔDR'7έ"gUq OqՌe}J"B@^-T1kˮG+*Q˹&o.$ԣk,uI8X /c!q*[$)t-h5k]WvDaBٕDB$j?  t֥-dDCL{NJ{ػyc~r^$s*d(_dDֺ V-V:.$Rz嬉5(!9yQ#?f_)ns99(J+׋ kku;V <~,WzMnҌ AmT,eڦ?4ط3׻s5[![TR9R6&xFWJ K9uVD7a"Odm1Ңڏ8z<!&2ZM( U=~+7b z!96ܝ Fֳ@.7,_j5&iARA9gb9doZ0A0#{YX6ɐ(Dc+hoKaA#WWc1a@F25DMeJa jg֚(ұ-xұ\"hvsFV.{Z['͈6"yXQElP]Rjף C?IՋc4RLO} A&្q+9Xy_ 3filܿ$=-jvb˨<' `IVQ Q'Hm8ʿ.znxIl$qD0Dt*glG#Es:6PBJޡ, =Tb,=cB @8ܪ^w`BɑҦu(]ee|73;V]Nhd6_w|Y?2a<*[gY-=GԺ Mi>}%S_HhS\l rϦIc+ TUβǾhL B5ZF̶T&(ymgO 3QWcv2pEˬOs%z#& ~<ؕ4fz )EVؼ$嗄u`kru_jjDhEæjYI(p?ug<6abm^&6EE5<&}fS/ޞò}A,8?: #Ŏ&WE:s]HAyQ]g>`Z+iLL 5th5ROQSX\ʩiZBIAEf[=#L5+Mxx#cKf.2*PEcpl^Y|Ð:M_6H|WJoF,r]jhץ@B"sht a^]F KeES{ ^K"YIuH@B6NV^jxԇ_oSS6 N98RB"΃g:\IZ:D*&]X37}kgLJrݍ C`7^U, uWBe]@S m kZ9kUV}_L)=sŔuE|XfafdQ@ P8KHe]ք@xsk;z8M8dCZ_=`K?VcBsmddYb 6 FkSu5fX:mQE+F)L5t̆ϔ؛b̫~y\HçOWFySL8N~{wМ crAyteY/j.w[(IdR'p9}4-EcK+ lc3G.P#^rk&DZЮ"fOq-nqv$~i*,C+%Vc瘟wp*F8'gjT{9T>ϼ5AX1s1gwOTÊ"C ʉqqF20_x>ۚ&+, f|gU5 D}7Y>qbG׀Wo8OnvQQ)NJ / =gP=L0 rz 8X×cuyމzUg&>+6뺗*L~V kG D&DK7|#=I j:M.n@Aמqt I4@;'-->+r`@oW UԚ;nx%?#"eZ I/JF0b݆`{?E8^0m$TG[ IG3MpմP_KpiS•弰I9utstK;@.|:{-͑ cJoīrbY-SUW˼GVP#l8hN2DȎ_yb InMWk&ҾpO}$ ]sVЭ~3R3Yn6Raޏ,eqy*Gn&UBayMt7i3ըG:Wla@4CѴŸ723rm2ݴy~pg7f= $9eЂ?pjIcef/B㵸>]OM8. 7SZڡOH_$(FF2@ }}#S{}LSsA%'gĂ1 k;A?WPE!D:!nӑ:W))@ ͻw'D2[ϛCYPQ`q plG|a,J";pCrȐi)¹T6~ tUm '5hmq݈C;_C18pzkrBgj\"c*bsZ9?`sp1NO8M"83ߜ諲K|'7lOXQ0JKfU6?cea}%Vf]6|E&/%#z*5!g> 5: shnmtP@^jRv!HTU"gJЧ Q"77'tS>7f>bvG"(=ݚ9Ue}J}dmh<oPV^KF@F%[8kXzŤ/o /J;ÛnƠ>(e dJkYrg5mk_2]=uVtN *3ڦLrL/|zHhxu3vbsvC#.iXR0L8X.`Nj:j(}IJ3 0[, N3<]@Db,1ևUw(p5^|%:2E1ۊl,)4+iĭ7<]Vp Qz~)bsdPopw|7kIs>< o-{㮽 + ]OYm9ojGp(9CU:3~!@fQ ^\6cQuFnZZԑeDWv|͏=/u(fܡ#N؀&b7?{"+-GcG.Ee+2ϖ5lQ2#m̵#v!쫇}~\>lP 8b8< _ߠk7¬kl0n D3klj痎5 ngt?mE ]^ڞl4Ӹ UxIǂrBѵ-̑ 9لv|fK;,, /cfy qA*q,NF`H!lC/*n8M6NtΔ$"=MhADΉ-svW$\@U֚.f3ȧJ${M?kS#9(- ŇCsY_t|5N0)ѯ)v?\m^R'q_R=s:2u/k!{Y_XehߩCy%fV&;5;(Ν-hPCm۰ 8"K) ]\x}1jj2^|n,٤Tɞ[d8{[|?+wpABF#8M &J(dks_۩/O|.me z" /㗾:Xɧ7h)z ;JVˇ.+R/ǔ)ѓ.[QـG,~ޱW8h zJWFt/s|_*2*ũeu&ojbiR a>ԄV)4W_f|`ɉ^\#>Qi˺8Av52=y-!;91xeI& ~?,t,f$@iq&XnyvYKfBLpo~E}sBZ~9Pc≘('㟁d3 ՊV ;ͫ*;缀9H{וa/d޻6CUg4 +T.*%\VMJ~UjI{He._#:NɌkxn@zS JFqP1mࢊe_%a3NKL7h ͻj% &ݗnWˀ. NڕV1!= 8'msOJk&ɒW_rX9N{ҹ8|l빈"ba ٬B>E1N Z=Ds#%N&?(*vW_ ~dU &@^|pKҁ'>Dre^[l瞾ЛGe]b$SMF9x 2-ّiI!!+".l a8n9=RFXo9(q/PLX#@蚢H}s4x5S]Y^&bkdvl9R.=KI5~ 谽2t6> J[" Nw\45b+"2_ YĦOjut+o{ǥÙg)cQK4’QU5PcuG2s\S=kl\;;†vQ׺#M{06NU³g#"i0@cYq W I baDTV5Ď ZL"6`ir`w\CigxpӃUkSc@)½ Gnޏr3+.|vxZ]-ko.M+c^4caKo3lM,#*a(u zÃ8/)>wޘjF,{ u1! HT24a)v9q7am9`plE 3OkfT,7m?7S<|0 YDCX-+֒171'Q=] ԓA%z6TTs2*tNbcߦ8pyR-ig fG&!$snPÅ%9i`:j4c ٙ(pl^ c+|ɢvMս *VbP}p/l֊&>GΰMY{ENrPf#`&˾,yEW0-]%let8+Y#4uhDG* >-4Q FLl_ΙgHp2è(Q1S_+ཱིt~悊`Gkg2@Q=;j %fYq_&J7rt慫bj[M%ɃՁQ}O;5s ,fg9sm<|EɕƊ~h/%.K6ym>E\$I!σu\mUķWöYZL釱W8H?<\'p[j&!/R檟8WBvlG&?MۂXS8 v Auޜr|c1%,H凛[H%֠7wtDJM2`ɛ’}#-S>ng7A٩)oJ!ֳ_-uZn{i6Gu}p$f RQ^JP 5WIR3{2;fmvˎ0f[|_de2dmG+AfĄZi־/q4HeDf;Y O7WƢ \gi?JghphGޔγ.[n&oF_vٶJB&jD%絅tfyf3N5'QO蔗=ۡ$M{vJq+VFņTޱޖڎ\[^oC`yƝoP[]PVVvr*Di V ?՛B }݊}2f nK.+ʋGWJ }-ĚHDvRW'Dۧy}{~aA' ޓV\8MZȶ9 ZU#)pZXv:&'E$B0kYae󯥾? $rz|Cc-'|LB]-<o- :qcSWV檴.l+=l("켳EUd/&?GaP#ˆ(-!h\! h1uʒr+oeBPDWtԝ}mDDgGGm&L/R,ndMs-9K4Z1S%B/a{M i4JQ=c{ jք t]-QRnIpb)0jRjX.qݢc Q Ona %N9L"7 \auӈ;!G+!#$=DF0|y V1EFd,h ~ WG^:e|"Ml16gVjtf L윯!!;誖X `tGf9w^5RPmr2QYxM] ԱrU4\:29ϓ1IEpJ45 hzHR[9e.ՕmENm$/ng|:όA;X r HM$23G"{+q}աТ%M+jB]o0צzzt[>ob4'KaUOÓ4<ǹVoכj>(%h6sݔp]05=@(+-V7xfz-թMÜž B7+1&ăm1y-?{Ĉ| ׆LDv\ԥ&iEg+! 'ws∘+ ~izW=GL]F\p0|C# |BԈ1/aXBYE@#Օo90oeE[-vm$B9s4$ADA=VSvZ伮n]VٽfYlxfamsW՝7zCGa:}nprt%W{anm(G(QlJ>C0d*3T95ˠK=Xۑrv°xA_{۴[5 "( QJ"yV&9}2JV S\5{Qxޢ'GlV+gb҈[3 &j5s2*_CW]2+ &lTߟKzwz*6x`.< 6J˷{K|PLƇ'iX{ Q*|@kbs>pZa90J7(r xcX"ɀ<<P=5SseiSmd%Yą?l1nVP(oldCuqbiF*{>9{.ѱ̎ Ј~ah9iP>+_PT-)v1/:N.'Bᅁb7hcٝ H0=8;gݣT:& [uOCHЍYxfEٚx;1gR7qm8Qiؒȣ<9}i @XIn,Or_ Ofx4jTSO/OfW 0$rڌJ+2q=86P QTp@.CKn(,Q*-}qIߋsk.rrCW E*6RKC!>k@m8KLs?J@{bӔ%OyIH땫9H+ާ˜֧ôa"IŘJS 5AR~l\=~: lve'θcSiV gҲ\`]֗qg'5=dWvxohÙ=%H4wS:?K"lY[{]1UnaEb.fMF@&a2V+PWS2Eʐb>hWC^44rc[QC:Pu2>psSE]k!yk'ыr!5OQܣ4SʺGߵYm*%w@?t倃l-I&=Ӣ>9MS]\YV:t AހS V% ruFdQ1ENOZu}cos%Xb܌-OpG鸨a|lc۾I{OQh3-xK<(,q=ľbT `-s!F|K.v&V`Ԗp/c#Iy}W~{r0Ev #)ePťӯPŸ:%Fǚ"mTٌ磮khs֐ŗIk)c7-'w" >q GnC6Vz&!p˔ۨF v|GђD\nc}Q:dͺf%:o ;H2|"aldmwFWkazA|ϺHtwG_`'s4;7X\s5nyO`9=268*o nH )XX yWuUPLNj}63 c*_EdVDk4mX&َ\r7\jweG8kuQĶ$VޘeSEgxx`˻כMaW~êvBӒoD+*)jE[@B8|l2`uڼ5O,@%~PM"1,**Dz}oڕs$FnZ#z$wѼ0~qTN*hoٜS)'mdJ8 2}H?]a>='q^ \qEXdWHzTyu9'/a- s£z?ܢĶJNҥqN- Qxcb{/qꋚ4gg0=*eFbÃyHhˆ21,a&wBZ}gx4%56 ofn*@lL}M@Q 躭2ʺ4"MkShE]oim`IΌ/qN~͵ dq :W\Ό _N}- wjI#vՇj`y[mhӑdlucLYyB',ˌyq }_Y&cnB3U]c~ fyzn*E4e-͒j$S2]ԑNy잍+ +Ft=n'@V$0=5cTØo~;Fr,Yu">5qo2s=W1[7c߬@RAubqyk[<nZŒi/p=#3>o[5?0yFK HEafxg3øi9]`9M~ŀW5EEN@ )a~#E7o`×wL(ijT/XwkR:1Iе9GðpeJ~M:Y֬V( 2,R{d +UT/gW0h돯~ߟm /pDrZ^ul i#'4aQmMg5N]1lR{F_X1h@PCpv@}jeA[Ñ=BKw bmÝGԁﶽ1Dd$SI}Db D2yPw6W]r7 sr~uz4A4EyI>iXlߵXB![(<;@_PvB:'OIb=WۜCgD^e/K (L#?6]bg)wʀ!쬪˾M# czybKV"-Z[.mcZQnFXRHZڱi8eB"ZADrޑE\ڲlhZqÙWq$'bߩ~~v9mTɠCxGo^q4vt*S t9A|m9|fx`u*4A !Bט%x6r]I+, 2 c`|c'Ho)}%^d߆"#Gmn rB7)R~ 8WS`'H (0b+į;ŀFGʔ\&e9*0*Ḯ.Xc"V`tTtL(.JR ~B$ZggZ(:@B@oUfc>ocNvkVud,|dT !f4XNYz:TB#GK-qs>1$sGwg$rߕp٭0VP^7;Icڟ&Fug'[(Nip2&-rBF51h.3¦"l\o-!(IVWobdZͶ}B AFX ڝ)G?Ro3{uE; =w岬)LXU$ކlT+#ZpI8q(`6 ]=kcvL.,.\/?.Q{[4h[ek"[ 8;Ni c+L[)("Z~%̾gvi#9֕HhWrE"v?GBip\ٛb̪mMݖE wL>sT^f":hFTIuW Q ںb3u0;Ÿ8u Euu$&!HRV$^iVXȣCmAi(Gx]ZCLz[F`_t(!X5}*;:M# SuXׇ!KH|IjD7]X*nSߌ\\dcijw5+ϣbvљh'Bƻ+[ԙCҭ8noTrah׶Mo9qP_#Ov}@tgd~M1m"s%ut&a_/dR=Da2Ըj~ypQMb^WHz2UaZHXŔ+MʯPDw7Eֱ{#5ǰνt(`D8w <dnH߈7 W2 Tp`%tc:ߨKp}#F޼n.ǜ<+:xٿ%Ӈjl R<d_,Tx%7G,̣]_`/S]]b^Iϖ%k}(ol y޴6scI?HYkK|&}CjɝBI6vH}L&e q AɾxˀM\~GZqҸݟ w|e{ueV_5dD%1(JӀV@ 0Mn50A) ? ŻDB$N6cۚ"hatSC+j~g1BwRK5yu51utC6r{[j_ !>$yfCā,^"Xw9 }5pӑ_DžpMfӥ%VEB/UTA gۗٶL5YySW6;͍!*:7.}ū}wL Yv INNx'N.#ec"hK 6:z?f)LD;Z%_ÔRtHѠ++qBS4b1J Isa( ᯅ6ae3Me0_֚gN(<, `$dM.fZTdv~]]m<?`/D:u' 7|,[EWO6,@,ס~0z{~X{ϝ9Œ^ȸHY]Ҩ/Γ' [/뙶N_Jބy. x5FEԔr CVn963[`q!ɶ !sڍV "-V:D.& 9rV,x- s4`ZmɁ F;qWuO3ы^ ƩpQM+&^\ocx#N2i-i[CܨYov1P3LLbv2eb'W)A @5q]}S4rqvgjo|`#qFg?+ 'so o$F^zI 6۸`VT V@bas4՝@og6)̂ hg=Ɨ<'WxD8w2paZA7`[pB)2q3H6 ^ԂGA GfSw_}TdHu7nyYRAIݍ5ǯ2XD>tcxjةxQ*tE?Ɉ[5cfI6V ϳX¥zq ;7Kk$Yΰ\lfJwpȡ28q=E^!-6F<64D540p^fdF={~#9|7 rZɪ3 mrd71ORV.Ѯ͍L= roIoDTGt';vPt2CO\1@ǃx\x#Yqtl]potCB(s&b`:\YuZ :PXRJAcOp^i99u%ΝUtZӎ(mt{AwLk :#R' 66梈`(HTi{>Zhh6ީh3LZ%uLSE/ K$`kؙŅ&W=nty,@xR~l?I5 " %x 1 1y٩`-0"k :QE׺AFZu*(!L==H`Оy=Yek{7όyOdHB,c9c|ƧZCLGC2SKQ߶bT!<)VCB;]5\ڞ-[⻠b^C#۽S+}ܼ@%CXW"r'vԈPvCyXqbY\ն~:8;? UX}Q[Aꮯ;AܱQj~y} Vmgf"޲q4~RXKt^6`u5.0p2A[E0HMa8RU(>*:Jc5Xu|a6qf Zт(!0bh,_PNh0#!p)Ω3QKZXL,(5jywѼK}TXyӾR?¸f{Ebꂦu,NT(u/P1OŘ[҂'er5jr`uof`G1-̩QB vBmγi!g:NJ™MoĊnGQL Ql5 3 SUy8s`4'`:@?5EgYI_z9juKX^>@9}חO-T/VC 4bg@L:x, Τ!UM[wqJplK׬>ج$[Ԓo,|v牤u%apB׾)v=N.}xI҇XC)" /|قD:JycHX\ffStm06c܏줻 2e03? D+,B?+7W fb !{=!vu/ Mj/HA$!&H-J!HţJmٮޅaǣJkɫj?DIܿLs\P ]X=&]}#9z\+i e ]xݖR"L bN9 @,m‚̔U6d_˻}ۑ,Y{>" Yտ`]Dz8zW1qr Q4 \a؟-z!9wh} R 6TǴCNh x ZtYQ (TJl)(1x򱩼t}mAk"%/{l? u&ԚEolppaF%a[ߣl({Ίr'mDt:zCuWID{|0e' r?>L;̬vWx ¯"+:?arOxIbS–T%OB3Q %Jrd\DjVR.{) ګI2brZ$c*Nlڠɗ%XyDZwqv⢧ޘ$-7gURXfwk!W&ؘU]z2& h ̫> wmUf$Ojj^2ڜx;x-- Uj<ThA:fE+R.\tXH_DZ]l}/0*{*ݢL0$tW=Mslx lqf_dS[Zd-%q<=r%Y[^EUxèփr/&MN \Ějn9E9eX93X{YW`E*L+F!_t0eJYM\!ǿhvMG#PZe~AV cyc d`d ӸzJQK3=ȒiޖyGc3~a푤>&U •omThMCƯރp +nr͂mg3"5HxLv<,[ a@MB"H '$1-7?޵-j+&=h1t4v6%E$v$j:"a ^S4F(v,Q{qG 7V&ɓ,$ NrIU}MiԾ18@ ?Kk]&A8T`!vT}m&g,!ZHTVQi hQ#voz!4aSJZ6s]ԙ޾Bv#Q6J$<[/-: ڞ(&p_@׌]kL+[:;"?N1 $Mw#z>%DL22`ߌ^("N%mqhˠ4K  nlT cShe#Кrw%Ho@qkam =²˽<8T$zo`>r-PFDN ;y'qGD6jb]yMNaޮi ATs)woB.7+x*bZ4OW+F.M jY?R0 ̯870pT$Ati]fD;.tPA J}UD=§ߘO, '-}/j&t\iÉͶB2a5_]2A*4Lxe.[wvNy2d.iA!%[ir>B"*=oPt57ѹ{]+~Էh [O ;÷VVvW9%H57fZɦIEHE$BG[04/ݹnHd;-R B*_eV#d=;U`N*M^6,\̟$M9ajQ2pH9 l:hו>`OU"hAl Sa(W;:ii$&NPM^a9Xnv쿖 NXաYcE?CZxzkѴ2췚)pA"9 ڼէzUm`T\R̺yBf1>v*[9c8_֋XF_9w3˹u["S4^`aa?E;,="k6Y| xj{ X9#.| m88{"xoUA*;Lz Mp-AbOyIpZ8 ů&IvuYM}|a]+8iC7ld1@0;K}$xb|w5"QmuKb-$$jWX*yl}'B6F `+je~ [4%/4H`irZSʭ{]%?+hvјDٜ?r8^5anT?&}4'iMo LL~FMMu;" R4baj.U^ճy _a_Q )cXKCF=Z(').݌S 2DV!q>@L=-Ʉ}/^?Qֱv[=XeV~T mVjf?'94i-Ahn*iW8j U!F~b7̎]A>tț?1?*Q>s7?r[mJ)7INO0|0H 6\Lo;ڊ }|6'ۇcz~K -bF\} 0F92ZT z8_` rAr'*+SH A>!6x0^F?_ꦞG6uz6*cɕcHemv!p֫ļrh67p:<ԯ*ք)-ft;7ܦ tJFj5[Ub$1)8G9P5E_R!%@8[Ĵk[MFU0!u@X-n RqƽwWPY~=!dw¡ !(Js}K%$O;`8cDi%!0 t`3{Uz) ʣP::iЙR.XD &-a ĆVKP: 4(Y%ZH3gN o^uJSa/j'=e5%$ԬFi56"iEY~Pm}%וd zY> .4 xk_6žڶ.}nv< Sxٸbv"L4Nn^ G>𘚄Wx]'c9 e.ݑ|#\Jtݬ Ǫ!pi乞uxo4T"쫵#MHRg_&6r7D!9F̋z2g>ˊdg䱏-.T͏51Da,WAPFʮ1Ѿ ?IkHP Fbi{s58RKѾn?ůC5Jc̳oEW|{6L>n8KMXyyS}k@,À"zE{.$e!ݬnCsiXJk@ O*sEoұ~rTݙHʽy5jK4Aw7˯[E Ȝ.|qDvYJMJE!O>2K:-t& G+jcɇɾzZFA%v^|Xox&l&c+S mQ8(ySrXuL\5Ei>:'·o# 14KO1oFAĮ4D逢&8WH˩[.һ~1kZnV;L>vGX ˙8o%F늞N%h?os}RNy3dfsDz dRqK o˵znגkwjc:6 w =ր1yVw6GZGHAq2 tA}?4sLgv09j[ Dy1uoh͛DiAʱfYr82\ Lm~0 }:zMV武lII%/)``Q> K8ny/5q_FUn6$PcA0,yɟ:DUM-j)ьqcǦޔ7 1hbβg`"]Xy/JVeo=Qix[z\Vs C"YTrx `L KȔSX t'F1ڐKMzFx[8TyڏY(Xë%s揎EXֵ1V]߶13X'=rJIPAj&-3)W_8G hR.[wl c}HMվc)fB"H{Y;2D<ɍj^%xQ^&G=F7^Zro\'orkЀT[ ?0bY6}Ss~=V9-Z%B1T'5ح.TvWNZׇyZC/tqrV46ܝkpdלH YEH֊vicܪGQ#kg}-g9鿒yW/N ;a<;7!ǒ4rМrd&DZ8i] WaU~6FA\ t:r/ oLx I5lS2FS'W츸;X9"]e-ǿ9\sE7ۃdjg/%e~O dȑ5l'%E6 V458t$3=,;)@Lm')W #9<˼7Zꛍ$ݰ_#/!F q7oR.MpN!Z;IlNP&DJprc؍ޮ=OM0Q BK Q]dY vM*Nj!1cu'Վ{@W j%-`P@ $ֻYK6qpdg9 褡ok(cvكk+}>Y@a]'/5k<ꊪ" 8+.ڶs'̂MOP-G#5FLcĿM{rљNU 1+;=gװR8+뀏1O7OYތ@p2 Gh; |uya=;Í/~E4WhA<$C. ZEp-U<1׽Z4ReN_ךJ9@cIKlw&F!7J'7 L&l1,|;nW =N2]@:8~tz]c~ثt|8_磵d޼ܖ?#\}/ç'usΏ]z{uTs|\ ?,Tm|"iGg%JJ/It_ٷx%4"d7 A'JA?&9iUChDKGgL'b?pB@m+"#TbP8V yuq) E+&}rk-&+?RgN._|Μٽd)X X1rUi]2uNqb"Uc]yUe׊R 10.od ]45-,fKe T.`V0f)>Z&$V8b \X~Y6n^`}T#eX`yy36;o'*;9g6n*Κ>i"&r`+Gus!il0k]sR ,Eek*E4U'LUS]ʀsS*Rlb!cA9@(ogbɊ8 n 2/`\_0bL& ~zp1%Do2?_<ɶqSA&̙>x9ϔ_j1mԱS9$O.,-j{:r5Y>KG-:;0ۛM_ pu4)Eb9MW䭞BK2ĠO ;x ;\O_o}a1@1#/yp 5 36&.M,K`Hn4mm\4{1Q?KKG.N~J#\j "l%w1prlC9W-2YPBV1T[,CCU=u-tP,MU'*#]w %Zlof5~^SJnt-FWE-5LQl\3N|sʺC3_!9 Jzz2 d<6$p 9b4۶dz pEۥV?Vid<ѓY FB(a4jR.AAfY ޣvLkQoJl)DYS0|r5dn].yH *%)sd.7-N&ߴXԚGȮ+c}dIbd^V7f9\5=r&Xݣ:LAjt&꼕m/$g|u| PKe縦֕wg#򎸒&GB TYײ~!XϯGQF yFv<&/a Ӆ= |t"H&veEn'SQ ^"Xff%ޅylKÂH鎌9i>(mpfX5an)ԃl 7V僑0R)π}w#O;x[@Ҿ/߂kdo%K, Ys#X{O@rpga @Yi T$>¯'B U`g8{߬kUS90.PG+W*ۖ `kW!9QPNSM)w$ =բO{Weӹ\TO q0X4%WK9XlJn\>:: y2~ 1TS_YX5׋h" I쿋5B"wo%w NNL%Gaģs'[ݜ۵Dhjb{_8 nSt'\XHPNc3S NeMA]'x2VfuˆW=4X ; C % "z4aWLyA*Z퐶O"~4H-kҲۼzrSS*R{RFn/T)j-gwvgF ݽ!P hBheR86X_ZnޱuR*;ӪcV-;(LdM m '\QC\h+;ѝonzH*0pg؏ DVFPܪmTW\z>̈́C^W΀Z>}|8( 1608!ӶeWW'&tYX'ee.DUuƶ|$B5mH0,C51K@|񜀙ʯH53^~_| CP;J$L+-{d V t?i|VP/nz.7 txD"oP]ڽ{*T[i3n eCy| 9t& Ly!UdVD6վϓ;CdB ke,&98}]p[ݤ:Pʕ<|<V3o2^Ъ ?eyNqIk_,f@ CF G} -+$ |Pz_q'y}NznFVDX=O@rmkz=n{C:ZhDjb,?Phd@AiCHC_7q{k:5#,Mv,܎tVLb) m7"݆̾ 1-DHO`5LuL}9unD:BzA9˝h@f-]=N<"ǒۭiGZ&JĸCI4`>,@0wgw-X/W#~5ݞ4_P7JRj~K5:Z$b)ZeEhq1t tm>cc6W皚=G.:Y4y)ٕ PCuZ0Tm<ȷ%hX>$ ?lz{)2yɺb=76$ښck] ) i > 8nMۮHiQ;:6p~.,"Qygey6t fAsOFI _ҤpoCfrm]p/a1ҵL-W5-G=HL}b- 2i:t&j+Tn.-_`mY^ԭK{S@/5ӏ5f}m{+ϋFW{+Qz?~a̢2p+LqbesLTBTHw>c—_v,ă32Sa}GO7 1ehxlc`}uNI7T~40Aۧ3<92y=;>&t/Q!OXS]4EmC Q|{3C8%>a~˦qO9hHfn6GoNLxYt p@IGB&i{YWzf@ l{~ٷȨEǞX*RGu߁,0&=Z3U!`'"H=lҌ␯ٯ8i +~"K}95 Qd2Wߦځ "y[9&H|G%@H#>#eɮ ~g@iuۍAP1v^))^'^Ѕ/GjE~k o* x 4a)҃H4zFGG ?Tu4rr;L;^ Lgswٵ7ˤ֥QZV1w'Z6%'3kU_qƆ2.@oEK:>f&pB.EϐmR%z˳xL:@mke~G?妘e\ҋoZ'F.U7DOOq Qz ݯgt Nom>a?TDx[xݖkWt6s ȓ TRkng#%^ `{mΝRY*,ʠ?\b,6LX[ i?Z$P=,VD_b1ǟ5<= 7:ʪ}oW1GBݟk⌞>Eֽ"4j`T,Gd?RZ&$'88c1JPASu9.i6\OUSh:8>Z-^>zHUZ.X ɀ}k߮EhԖO(kQĶx]Sֹx:6B2sb)ҪO;L{gkF$Ku8P_HAtn0 nyԯI!qu\&l0oC㜫:Ti&!ΘƥEG+|Y'3@z tcJh.+.'XJ`XV?P.w" A" $V|DS!)"=NwjxʝpJqyvbXk wk~")Krx0_s3-&|2ƊOLI ̑C\`=VuNz;%=NFQ̾7HzZxC("պw9pn1Fv|絥'h 9ne/Un:(zsL-#;5jz7w'{Pzw 2bef#_]nTְeZp.&?`.-nIuH1,-tzƑ2F(;hu{=w?Uܛ Вd05'scd?|S/׎A \VN}6N6YTߜUEUZ"{ca%H J-?+EVW5hޯ6-n996Ud#,OYwG~=\hw d؄OӇ0P `>QZ*/QF&sr!;69r+;_ asH{+ `Y ja=WmˁI(x:ш@#h%g{SbC574ࢌ.#l.Tr?n!樉sH6J;ڐrZB[dl8;*ƤBZmc!ˮWHc#[]Y?m+DBZHT:'wy! wcu8& I^5 e}4L.,ŀd.N>(%D6->̵=h@M07ddT.Amk9di#EvͰdXq{/)#>TMLɪQgq"jr65$O l넏ǯq<W 0j/!veCcG+:TQLr%fF_-|/z%k;LeXݔBҘ1@ W;#̻hWct薄w@2[~V,'WT%"%=]f0=1QlZᙗ|>‹ {dfT(E ^˱Wt/﯁9Oh<{!un$p[s]@#v -cI`V?ZOd*?"泄 5RF Gu蒕3ɜᏀxiHU;b&seC Ri#!=B$nj2.$`}30BNk+M9!9Byqӯ3 [% V:t{К$ 4iSVWVv( s?zpfmiAG[yrU}KhH5'qhcQ!Qu 9% H)]xSLoGa3p9X\ Lˠ]53LӎvOꆨ.A8H )u`%*J*1J>> h{7p9ߒ;ӎ dM16$Opu(5%DJF2}@LaK KpSx)hQPW.  > pa\)tӿ0+a~;8 ,]؉"eyG(O0B۴- =a+Aȩ I:mY0E5zlQ/\ kQ9e|8%3>CaO+eRVpY=Zk`: CZЬDΦA;29Q>QG2gc߃,i#"vÑ=D-foNK`ԓrjZm 7B>Q8DO,.tR!|%.()f̈́PJ5C\yTG 捌*~LưeX[juN.C8Dҏ)|}^3aykƾcn+NWXAKk{0/M(n{ KGcg mju;z9#DVS KX+5,gR&w #ou`|ޜ.ߣ\i9d~ߟ] 7 NK K|r&+C)Edª߻ѭޢSQ:etx>U80RDC&w@3,]O6TDcoLYWQHPCտ?} .)L)/0Tܷ͛gR~<ɹz h *pd.+?KMTRn\j^W>S* $Tzû-ƁH i2Gzv+ԽdZ64oֶIER [Rx7;+;GNyZbxnWZQ&b{GSyK泗;0LPEdWF&LCpю\ k&9 Ǫqz)Y+#!KדZMj9'%'o\}}S xh{et5 e,g<#vAZD9 Ku8ր]ʆ1&.bHg3'M^*l~̠P&b ?LoUgYAۧXF|ߎT:_KEF~rm,0ŲCWkF  .w\e +T _z΄OO;眯-[* A1O@g%[vmA|t9q#O󡖟Iv3}nx(3'5CZ{Fʍm/UD`*15еu}KaOZ+^AH[Tyms6Q2ָ-<,RկeZ_;Yhl4+%j(Nm~mOKqC)Ĩ5ߦ0kT-c#VGqRұA|,}% ! @ء*oRc Ӱ)OFV7A%ՙE>[nNTs!SG0V2 hOO0 Fd5c_++_妉t=j9#OE @n(A$Gje$o*[5yO7DcwãdALo($7HJvsLsĈbpE.P47#=p4}Xm$1[sy1,Tj9Q4(;?ލѦ%C @vnD#NY/?`1a0:VݞXF3;N+ߓ71 zXk6Fֲw n_4L?򴔬 (/\YX ">gƞpy (/k0auMX̍:r~S Ao ڻWӢ#ҏ<yގ'GFptJ$d{zupQ+䨆/~<=lP=F֎^ɑϞTQU^T[բ0_`h!we{\Z(=m#`U՜ꌓG:G9m98FQY5 u7a@ph{?w73vkELs.CGt^h~um֐Q{˾z׆ͩoDlA]ou+8Ɂ~E#uW@sӏS]eY/}BWu7'kA!Zݑ DEr}vc-:ᶲ׻sB_kh{+rH>X^*Q &2;4Vjis5y0I~lϒFUG$س !) ԐˣtFU{rH{$UBkSJ#s:2Gd. #DI T,Zㄸ7{խHw;?1֑ ?Y7Bm'UzZ|z$9%Y$HlWK[g#;`Y R7$iD+n6he")Fn^;. ƟI@Hhޓd/W~&m =D#˴P^q9 X͒D cm҃M‡ U1"xgY_~TTkżQA1Q͉ #ӅXS!TaF]!8V2 iBn_I ~w_DE0.6' 6&gmx QP3|S,S >˯R`EL n{WĸE adjX'qO8r~=(pIevX)}u/nE+{6d'z UIY*iW}unkb endstream endobj 593 0 obj 147936 endobj 594 0 obj <> endobj 595 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 596 0 obj <> endobj 597 0 obj <> stream x|st%_5۶m۶ӱIrtlv:XQǶ{G^s5k=\MY`qwefga S}5wspĬ y@vt\h)ٓ sqqw߱W89[]foW#tprYYik322+OfdeOFhbdR3 dQ*@,.,@WVԥ_\)3oo^FC[{{X*͑U!Ŭd\l\ld@'25? ky9d'lfqtp$4s,o>.f@2Wg7 ;;dJf#0?f O26 sϓ߷ pWW ٿ2$$<|yȘ99ٹwEHB_!2Vw_cjz_ ݿdIof 1Ȃڅ O}1ڒɀ@QKJ"'fgjd4'(ad5J7kiʻH_1 PZX ж@@5?3;ԲY]\ȸ7 Vi{ ފL͜psv+s{l Z ĥƄ1\vȸ õ$w(O CGZ_~V=$"| uJ^ƞIk/;~M3߯aj{.6jg{hQLA#6wbza-i|#:eqDjGͭԿ@buCԷ6Bܮn xa~Zh6~b}`}҃(. =>dn9=,=UknjjNx_ 𦻬zR hYX$\QaM E_;e3gBF^b ܃.+%Y7^tiov\y4(g#׈O&`2.o!+w"ɐߛ]@brٕqyĬƇ|&Z>GoP8.5Fʪ;N$q aGǕtjCᶯ3?ّzujv>9 \#Ж([f#UbB3q !Ns-|=d}̟iry~y܁ƪ84MyINY-S9kiA"Hξ;C/lC^c.)ק:J_>pd[QP@lRoĝڪh2'7y`B}6<LS7V=-A2cMp Bq= ~6KєPjFթ]/j;t*0¦5Y!}8!+|X^ U6~ 姘cl|V7jSpJe/'J]a"lE,YW%鄤^LG5/J&ӧcNɧfƭ{LlEf<s$v$.՜m NV9۹FMfOǚI|VlA}Ӿ_(ȇO/N!/a?)a (\|Sh=Es(u&ARqYY3 <V4OJFlȼ;?I"LZB"0|Djt ԍM)nE?iUjRzQUǠ Fq*֚8U@RrE;^/25)hAssvt =[&( 5MqG144Z vseA?ؽU{!ȳ㵇sFNcx53p732{2, )e#gKrJT-ƒ79 wߜ+ǎ$]0OP˷KBL4m~fvJoV*n e,- (|yzH$]1珓~q^QO.[@V=ǔ8<=3Ȃg}}+ʰ9S1:EyL"s7u.1]RΙ SJIНB} 4rP]F_TJ&e\\4S~Vji3`V 9i[ |M m2I7.ywG"Lf )Slra_=/[}]E?,\:L\9i)l)>h͐%=G䇓NvRrk09>e|ӨvDJ+'_v"dk c;X~1Xl3RT(߮?yX/¿"03 iyYxжU '[gMRxU߬[fq<Ɨ7FuJI&Ҷ\guvb%;Ӟo9Ta"$XzS`/n]ͣQU iʚ1WWt_*yQ] 2ѮtJq($g2gKkaJ<9F=G67DU/S}Vb g"S<;Y`|1jzz#6̚وOXVBS |h_JK ݆z:|+zj_h뻍&xuH=4okTf‹[*TDcRw6F]0} kvCw,S, xwdAi| 7$,l( <$W!ovG%Ÿ >FAH,eLJ߲5̎J&㼕 Ѥ[FM["yeA@%tE|j1KTܫXez[Bں&Euᦽ,B +vsv߇n0 gv/Vm4\//En뜏a© \^w3g9;L-em*X[, u`mDwwiӶuPTm/{!-*.2&fU8{HrSDnrh -JG߸%fnIYP̜fz 6W҃%KW֚5|᫼ҭ#о"ŝ'Lif,$_« YG%9O9,HcoK"? i2w(3B&Nh$*qD8CVWlSURF.,u񴪳XmP*| /bbb{ptF2ZU;6)djc$L>׋>qId͙v-a<)nk"n k1(>ڔ> | bI2~a[¨`/ VR`ya4>0+to_nzAd | S㐧N*lxx}=xĄ=&?!*j[pO /@"3 '7lk}0OG7$ڞwa/dx^M%M 2KfK95*jpcL TZX3 _ꗹc0 gyv)=(exZ*AРg8 |MprMIA%2Of]jLs T3lEO2(&4y$Qi˨xchd Sumctr}жS ",nr{]KRj{jp(Hcϵ{O$ӺSj4=Bj ok+L8!AUɠHQI!0 creD3H\YXCb߭vZe6j&ymgE-^X so”w{ffT; h[vM^閼}F!J 82{"?|?HQ:`~?$G!~]Q4Hc!Gi>73&EjYፑiG?]%b;$oĠt7K):ުEAX3ZS˥:-Xv&pt,ƶ_WlƷ ,8;r ;Af[4 3N}(X9 .som^껊AHuzrSxE7ϩArBDcEQzÖCoSd8.EdO$mj([E_6 :K~%s+ \΅Z%cx5.F%>fԳO8=!RWM Ι̋B V|Y ?ӂ?@45χG]fxWl~egzi!_U2pUlaP+!q+IsoJyC& [6%BaAfkdGd:T,e+IiXȲ/+g@!]Lf~7#ray ձ<b&f-_}}: 馋'ecu]UqƒШ+F2h(D5cAfd$z"l9m7rE֒ }gv R+fr/SOBɁw~K9ޟA'!?Pyֈge^N47wj+~KUBeJl3r1lr7.>*1–=XkD (WЫTѷ(mrX Q M!VA<^̿gaz~s;t&Oyr $8[c0H()<& ƟNV^ b;O0\`KR͚}ngx+ Z{h7hxvW nʜ3(Xі}*e,";yAП̑aݦF@khDL>G Mi|҆KW.*H2n2>u?{Fw!jX4 7sd|-a xIƿq+p9<ݝI>IMTvg!C,j5|>嵪JOoZN^-jӢ SK'l`Zz$dKo|+Tv&SC}*B>r~dԶ>XΖݶCaSΌW.zp2La\j C!5\+972c/|ʊ-+Kn|%;nTS K[nJ ޴Z88t2޼+(Ea*(x-5Хs# ȉ2_B+c‘ H ;IL?lO<<$9-(=|=.-t;ejכ%SKHۋLCQe٦P+ry*'-32 89lE| ne+޻ӬiKAv4Pӟ`CԨUSaink±XhQO )ŪbR ^; I*fCBLUtL $b-wM/g @U?ְMjۢ\p*HwEqB%^Xށri qRRFkMG=׼̻Bю@ cȃFnI(8;n/Mhj"ƯO%jm_⿤}L)dtގNzvYrOQnB1C;!1#9e_~A[u",/aE056>iKgBW6qa^79zk[/Dm-Kh}y^;]pkErO zJY緁frAS P͂T%;PbzQ"9.zuͲ=! 5_5oJ5V7I4%ݪ\EabUgCs:`3ݍF2JIK[LNšc'EOZxCZ9b9 QA. * O3n $FƬF߼%H6=WٝqVI06G f:|,OLb0 b9wēV>lKlХb<` KnzDxXh=A;)))VAYZ}r_lVa5赯49)uZf:I'u 棛gx؂Տa85gamj~A&0 up4܇ @TbWApGy@1pQOFo^vzvA)OZ`Hei`3Y}܂ {)u&E#YH1kg0v(0ˆܱ" # WӬ"0h/:itIwt{LJW Of]Yß ]8U!#$aM}85vI4|e}'*2\n6Zrw3`tgZ0D[WJ8mO.:zE@go;;Tni[v܌QWd}u79KX6Oܠ$ռ;vPR:u!*z6+cEyAƷŏJb*kncbXސhq(a#֘%WږM(NK漁<424DJmlF5h6`[j爗">@Ǻ2g=sP@Yl Fܘn Ru2M Cح#{{&ޖ|{YV+9GaVt!14jJ|he<눙w8y<תvh @6BF|g탸MZ,H֕(=5WB,nnpOOgstB@t yys`Vÿ!&^(rT 3[dOVߥ~83k~u8TA϶R%!, ŷ.\č`,6B( Hqi%-uWRE[Ԟ[榋k7s7XWBԽש9/Qo\P%{śl?{^nizsB׍.&Vv_0k.m?FQ k{!Z1(^ z=oYK1Ѧ&@7&o>8 eА `HX`-}{iǨN 'ȊAv! Gs;2n\'!g IHll% K&L0ܺ=_sĤG(|lZ`*rc:8"R6b&`*m˿&P]nm 6n[>f6|a']WyݼUbF3b*Hy|vP?'BT>E/_J_pf"R0Aob՞:1 Gjd-0|n6N}jgI78Ig:fW}!0T"D~De.ixJ09QOlJ^5)Z}neua'ׁϟےÞ&D/PƁ'iE}5$F=; 㵳HI(~=XOonK${;Av{Z.bu1ٽv#j[uwk=pG6ݎkFBXE3`Sâ os*m: U[̰B'aME S{Q2&Ҩ=o5af_Ifσ #CsW'GK\uuggFl>$ ‹| cp- -DxK"A.qfy{^y2fJ[1Y&ݠ B=k1Âם e[g#- "_D1JXZDpw8'ܩG-y| ;_k ƆQcG傎t|/qI |gi84wTc)"G2}nEMDzPuxۈ:.ՒU]üc"$Q9^8VV:8Ϋa77?7/[εleGm̳{F闤ȱVcE,ԵB3~B>xlu3(.pͿh$ĩ9 0-ܶ/!=@.4/++s psk*#ʜCQH}aX '6ҫU=rO>?vl^ ]Q5e-R*jK# @FsQ+?jPD8韾iZ밴sk$)$:*)7šXf+r6 ʦ0 <,QqdvY/Ac[g*kMC܈xL)p2sŤfTذ' y V()w`G*ËO_NWB&`:ƨ&Pj1\P<{Mu\ m. }:EU ɴ~0Ղ8㘨y.iK}Z82.N $a "c~O#&.{lo5,Md¬e5uP:K<A{Vumݔw gDl "^72`-~Y@/1 ^E,ͣism_r>^;p||􇕿 gL8s5b$yflΒOjӧZ>:R. X !ުfA5yV9j⭐h jb (3Vi4ҁ~ITp  ٛ 2>+{It#7BK2uU1]rַ]뚘v;6a_[ *8<c- *oR׭);FOj(3E]3WSK(gg!ópmi&~>/@cWDc-ۤQf%pɄdڦ:<] l(Pie|)G蕝)["₮ҷY'ߪ.;i6^ip2ġ<ԓgW Z6Zw)-<8H=Uw0RMJAJFS$QD! P!zFrq ƀt54UEꍔvg̓OmH֝0k~nMե;$2'иX7HS` ;< Ҋ ^!%Jn~PbyAWp >'IՇ(DxH$fۮ{^ hG1y>JxKuiDbI?a~W$@ۿФ2f-h 9[,<o9mnBbA!l쮑 f 7hm{0  . ET#'Э,.jNR_u&_[+g|A8UW@'ΕIb~߸5F@NOrj>$P\a鋎:Zq,.-G,A:ʧؒ`xƼ.+V%HfߢUUM @2и;IjHRI-7~ݏڒ=xmYV Iݝ]WR`'>Xp/S[I <0]tЧYavPyB-+>G\_\+P\pbA&VfGϗ_C TE\At Tr^[U%bB\c&Jр ĆN-ú5@tۼܜx:D/hR]"1 0p}7Є-S5{5"t)a@}v@0,RУH%Fa1Z,YT1+H{:w`$P%"Z}TsQ6Q?y 0! wq~5- t;dZM$C: g+b{L5VSv9x1Q81PۊZz&T.# ۙ%6 vmuLggg%+ #&nmyjpTw5!K=,P@9)z##UF:raDŎY1a()-SO !ލ u,q͒O{!F:tX+wr>ҒȊ7B1[gfOx`aEGHX{Ok#Jbk<2#T6q/dv[TVK J$a@%t1UU $Fߐ"D&?Qn ш`nXM3|`wX-Z#!(cR q=$ >CƚWePM/̙--X5\pP+?OO (a6)Hn\DqoxvD%Nfk߃7ŶX/7R:O@lPxqdED$^20ys=%\ff;je Ǖff_}A_ C"0f>3z-|WB*"d *URʚ"-Up 2QƛU3!X%/`>S$+m#TOsKza~hE]_w9OJ+C"%JxKfc[Ϛ\X1sp /K:KP`eFMd/g0cͣ3vb2$tvO7 xbz8 x>ְ*&y[}6_s e0PM& !qO=HQeCŊν/#vl1D#ru:Aʍ +Y8÷)\7^QDv?%Y3٠&v7>ţh^9Q{*ޕR,bDO k']2Sv>67vfnf>GrUt\BqEtt%r\1)RҦ(Y{MZ=>O>*b"̘PkDR%~Tƕh"7ʡ;ނbwp$KI&*8_ w%' :^OX8D :_OOFʲr]>08džnD#:i9rK,cP,?o6%;PD\M b\v^hn5y)FG/NYsnݰ=8:Tۻ#!t fWvcs\r7Bm03eKȃ%B(䳳6bRU[ 's\,\z\앢:ʇ\Xe8+)߲CŀԁQRt N;Y(Eka4AX,E}6He4q;{%,щ ᳑a bP\S!o |\jjYRNm}ob)A,RVU) Q6qj!wl)lZ`CƉ S)S7v# _b.z}#΄RѺEXi3eD-nɴjC-ݿ?HXoi{?Zf1]!߆5K*.4b$%:L~qEˠ;/$](19d3b-uZ{!Ok4G%6X9֤9__l/5yԏv@ x<[ ]?u;K \#qe p]6os0@k)(ci!E*'q g$J(b*? U7Lj\i~df4w᷹niŃ9MA)NfOp !csvrC,bQ$eX[?Pk,5kplmZSL+F+Y2,°~ 0r\fS(0@04(~7Q?Q; 0\-e_ms ~(E Γo-y: .|k"%]u:Q`^K!%sy*b~h{F_Jh R-:1i!zDVrI#h}8 L5zP1c><VsH\jALeU>衾ꈝE/~j4f$GbŞФ݆u8ml6zV#Xq <+81ڽJZs32ءy 1]F WqmO ~][ rGҍT 'qF!24NlF@<9g}XWbĈ@?&$`If '-TY/M9ljKjsG$STu9)8ϊ9Kn6L 2P:\v6Z*}U߾ atTf k}:M$APY덢H{nz0ɈÇ mXSͩ.X/QRv{UwͯaFn^JM_N`J>?tuB?~N vO.+x+KaƂ? j$(e-cLXM?ɦ(敚}>:Cy7z\WpO/6b׽G'la]mFMLGđO=wEd;୻QW6I]Kz[@l4sl1XCԭŔru-Lw>DŽPE?zoqk/ " C8|Y50G(@L@ .&4+ qN; >LZy+ 53[lZz1hm("MPir3p/(Hj"9q +zA%va 9VVj\l-jFe;i)bbڪUIⷵGس{4@tVki17S-\p~'g?7.hz$,/5Mоu&A(0fO&Ԣ?Vo7ƃk.E>(`:9U-DrXKz?@=mp0Jk-Lpo'%3,'ɕ$xL8!&ncu' 9ٳasEIeIeJPZDih[XwO 49%/FCQˆ#:xhy$u],@4i;$>R3XG>ZTTEڰF/{Udt.'pgYen?(wy׳}"ɭu9mG ȿ9릦+K@nK㖽ݨ9߇/gE'ڈXe^%}$7-"%x"Lh t1* WqgR%j)}|?ʼGm%E3RoykvZu> (H^gld{aF_1cb2rtdqLqy 10lhʟl3deYD$0fK] o5٬-_KME\{SEV[<9\_V)X;{|)d7ٽHY|^E_e9 怂C Ђ젻6 LXDMT#p|\Jq(f GHhy0R*gSޯˍh>4 ŏ{~{ړAC$Tkxڈ>f,}<wN {K[df~rm/3g BiQD׼K+A/+`d\o< r.-<mbAc$Yz9^Xś ByiN'}O(g!g#վZఆذ@Pȓ|3- E8WX[0߰aނt=;0 2Edj׶ M">5Sir-䑻\ELU+3ohnfph7c[b{Yv J$ď) 5~|}. Z 7UwSj'0鞍Յ̙j`SĜW¬c]:Odlgʽa_?i4chjg*K&،73uKo< {`G|y.GZ&З8'9h[/fݐ{;7aǹŲ߆ʼ/yp4zk ŚIdcsB b^ri=Y~W5&iyq%X7xtՑ=ߋqOu_l,"*6e/a d@{c=I kt{*L_ )[PB~K5 Pc |,?=e/MP[$p]k4I1mS=q矧؝/iol Dm@F.mF5-94N 8nDOʖbH4:<m7)oD?×RXΓ` zF*k@v :AuܩJߡV6Z;dh^1PUP{PB.ڐdtaS_gl(c'f]?y9EĖÕMo+J(F&\&јap0@?hsb"HW2 m KfUzBpx7LdU߭a46Qy%?.(-p_- ?QnΤǔ;m+hB:,ށ޺_QU<,5Q>i< l7Ip bw<ެn`X>\GG|9vv3T&O5+ĮeKLLIm_0'Kڞl#mOYAr 4X v,R$ɲhT|X&VR/U|Z!tqژkY㤕2y8B8tyq `]O,p vc6[fy}/[2}x ޤhzWn UIǙ&uڛ #2{NI- )@sq!xg`ff\yVš᪸N)ʄ7JSx&^ _P//8"-TiwsK^6Xpͨ 3["]`8G]:YyN[ m7UgxO+&FFI,P> 5Vˉ}'~a4Hʉ};m 4 `putL8zmNxTnJϵovUo0}eYU4~Nق<4%5[M"{~ oQ IRE CQ(_e_v5Ӹ =iTFkKIV? |ŦkwWctf|B>'QE^5Xzo hTd}y u}j2}gB=XdD>˾1bC m9貽%4 8ټߘ6:vUTu-n&lmkT|~؆/UNU,ʤL85gm}0t3L/T)KFD+N+1_HG2EZ`2IҼe{w\Sp21kX <\HWo=4#GsG$ -5yY~wO\^_[_[&qTu fe0Uvg7+"S&ZnYT9v+P0߻Q1LmP5!!`"{ A T)ĪgiT-F:®8rk8苤\؋g| [)SsrWiFHbO:(  =WAc`:DU[ZNsZ-UHC^\)~שD%|lF\>-t'EQ[DaC-+'R02X8k*CC&p%Xj*7k;caSzqX)35U53TKGGʊ Ӊri4C2t戝r>Q= 4XRe;)5V) SwLw5Z+iTU!Ȣ%<[L k U6kؑI5at0|-WCn74 n4ڎB*P/GN|1˞n s/"){*ɔg}.#6 V󁏽L~I 7?vưq\$R89xiW3!AgHIҽ5{ki=#RAh MdCF|aah,ZH_E!őM;f+BL6;-O6~."†>J&ZlQM +iXXiM;`p@2:'0$"1*kyvlWYUÔ.2BsfQn“</L2Vwץe/r`F6txNLO#/mϺbr|[(-K`y :ŇQ$xll8]L ]@rQrF9Ye;=&yh3rLg/(Ht\KQ|I:hX];F2Yɛ"{j I}HN2•<@y^}F4˾Ae?lU_~j`,y_"@_j2#Kx'[ٜM)ڑZ@-AyV6';KnbpxLɳaGJf'UܚA`)d|iͦ3Rh_ETO+q<\%K,Rxs:{>=k ENT>N{-đ`P{rt- O[GݏɛSpob0-n4KOq?pvc>|Y 5(G(N.:98@w>0]򫳌 LsO^C\{z44jSN^n ֲ~ILYĴqHv6[4ua =mGn ¶ψ)֤EѻSea'*Ҟ~V=RZOV9I F8^E84|n؀c({BGMb_(gŒUw6*nx*S\;eFw=HpM~h< UZo'J4WP [滲52&8È&?5ez$ӯUV%D'>3.F(rye\3@~! ua'@->&U\[i*^kMtQzb;Ds)䫓YZLш#>qg7ⅎʻo*{gYVp.KϢZM>SVK^rb+Ġ}H=V%b6Ҳ&EA9j[C,5ا㣓n'Klq `-^K{D^4_=`Qg4 f1(H>Y7UHPk\W;yGv mc>!OR⺡M uiM%2^0g_lIB_l!r8GȵU[Eďq!Jv̐{q%Cƒ(l_jiZMjv"yOYH[ qU[InP *r,T^cIb.8yV4\~+E|z`IEh @WpJxIc{qFPTOt<vO SW iPfQb=/WDӥ ־]⊝aӠڌr dm>h[F#3}{#ѻxmX 'ۨۋCa08 Jota}M?qe tk._7NÞdܙON<~dQM^NRМQa$'Kom/ۤB=Knؐ_7qR[1+ckרv,Ra#.t0/ ";;;PR(%\-=)![f`~%]ctdj>]ҷ \Y?UP.?6aTQ淌z݌3"0PRLD0,7-%/y+㪰5G%y9OKњPqlDΈ:ʭmKP|ᩱ8fگ<4g͇ -t 3J:5DԺ] ۶B86jM׎G3; $ c]ypk$Q/QKm͟~ yeUIP•<0?D@X5qî̂_v\y*oy1uOuB\&t edh+vS`aWb'0k1golRPBB}o4 kezh 2? }yu0TP.͔Ƞ}(Wj!hBYe{kEÈ n&Z?kI"\GRߥIufDX{HSȣ)ML)N[;k( 7Jޤ(L<>lc+jzat\lGUAAԠ(v Z8_W葂"ݎDqNޱzTf3F7JGwؚޫ"r`X8_LTn-XuʬlH1KcD`ߤOK-Zx'5^;.ykn-I@b-g_f>"?\}TY#q55ҌmWMܨ(YKl!Qߣ3|h˟M~}x:@AS8JeU+EKh?c";vBu3{mC?AGe$ ׊q0%,֓p.H <@ >F-wu3+u@RI7-sX;x*Y#ԖbbsXJ 1 OB A ?IDvxDl0IcEHH?=EkTu@vϟ&YNqu.d C>cQn3=eX},H{H0).[0M ϊ&On*zH nej_@IW}},T;y7'* )loCbV Z-xu$z^nxE$ߘm~Jn-zv^N˒_rpY-;6L9~.|~4P@]*© En,go=;\g)@,<`n/޳^$CD^-eF"8r0W ??UjN:5=+测>ܓvx)+1`#mb}87a>C 7fDKݎoJ%\:CP]$A,rt1EԼ%rG"5lPڣyVYx YT9j0^2Vx۟Wajz"VB*:j5 9\m.Lu^ }_ߜvHc"NuE.$S/\QVYiMzbMR2N&50 !PY k@6(F>tǣu~w)=) *CZw6ICUؠ{t"]4c96Ꟍ}x6LSAIvb.Κ muWH%lE~t~#Fy7.MT:}mĽsAZh̓?PY;IOVצޛp'XbGH&nl@T'D}cݜaDT|8b/[c&aϪ%YMӘ)) |YT?M_LoMuq?UE (L E+hw_iyanx8L,5xj]t\O© L1jM:tJf,AsYYC7[1fIiqa 5$<+ ķa-v_ɎwhA9W\{K&gL m>FVGc8YNd'K%K^$Rv@~${P/$ (MzĐs?dlr &m Ep ڹ(P'nP{9Z%؝/-\47X?&T_Ț yRΞO W$>LF `DS <)Q`Ƒ@kg?l58ί{PEL1LJ0h - $hhJf^PG^+Uؙw8fCdkAR:&"y?\'c;5~cbs|zܹBv GѫMV a f;qe=ԕaN-K|/<;u΁tNtc4$إа ,9yQ~sQ @Z ?r+ͩJ/ŗ(= 6ywLH; C7I$=CY$ >#! T|mqDe]ת/ nN2R&7yDsf Pܭi4q2}xnMXG刀4`3pV T-w ^Vkl|K8E}"_' /-R8>cWS1vnxmVDpJڙMT'&pGxE%GiD十pmmˈ}ODL i$WmԀ:1:}  F"y =U#MK@,HL釧AQ/rWZUoL-V Iw_kz@pjߍAF:÷Enl˞ɪ3H2E;Udob1?l?y96~6Etd)uԨo#oSz:/?{M{ xA~{`XeSw&dhXdj`f @) WJ&9~rLOR` B߭d"j"Ng?b"-Z:94E{M`A fB8} vkHɸC!MoTeNŒ׹MH2X)WEdD^xd _̠'FQ6%4̠KlnR,=J@zzUu%ǥbe Nё$_&'N,oܞ $坡l!4İ(Fqc=vZ,sJ`{ӥKa+Ʌ u^~fHEQ|Z5~ru'm^0Sica'\7̠7̦h ) y >֢),wuQ!1̭C'\NKEg0J֕6L!YmIS-z5k3>$#!3߮R4] Y ͙Z?[ٟ#{"G0Qhæ"^caI{yq*)K:'037o6 m@3xXz:k7/^6"~^{2Ndžk=W&T=أ㸮",N!)[Kmظ[Ӕ ѭ7ޢ 肸 e#H!yZ||,(PEyXQaSmJ=b8N)\}}\Ei9*%8[1xӊ)V\ !3gc /Gʣ+gцEumB Y]e.J_-S^j=mc?MT1ansh`Y _c4-s\gX:Q "VO;' ;,^\ňtq<7Qm²j09-HҍP&]LB]KYhXW|mF(UA}ےVb0z˟q8v&g)ML8B|$c ք]4G7d5+r_SS$Z<i>A=y"I.aYpY^ʉ{+1Ft\{H(doPu57iK!&=wu}b*I"Oڑ0:!<yl#'Q$42~H}BKw t^Tp z1QodzB$'U)6!|X b8mw?ǣm>q7kUIn~B!5Aocv lC:詚Ev|FO%Z> ޯ_I͂L5Znf 2kt6L!% {a}gzLc4=RZc;FhcvӦ.Gڙm|*q}6Ml. &>GFg1r5ta0 Qxmĩ[Z!Y\D>um۸QJO !># AY @.7=5%0tPٓSm~SA,w\^=rtox&*syid7'I##`1\UimXoe1Sy5ΠR~P^,}p%zzB7Y:|W.:0fs΁ \GFnxK5~JQuX޻ "G/nq0*>B!kN8;HLβ%u*"U]JTfKɢ͆IFh(k]հy6WO\P}|K)xM_4#Me*R/U߲8ן8l=TӘ>X _wdzz|9H H+w"P{Gz}/#`‹syt-i"؎JN;Ik\,%UƋlLgX1rbChAjKъf ]Yz('`ti:C(cqlxFYQG'{hɔb> .xQ$IYIp3n[1|av*3Kg|ǣ-5"CKst/dX g%<ah,İO$ߏ XQ.xH5if:4$'Z>7*1 iRP3)$Zf:'@֗ -R< \^M*`O0lql]L.fĄ шr1ԑ9' Ȅ䉞E髯Jg 䨲7j-˦N`~;9ɂ3/#!s$zrh5-qgε{R{R_Ş,k{iI@k ;k} SΨZ}6oS}BzlTWIar<ң,#bL&=nCInߗxt鍏Fu{b:g]>va(bj cssMY \o۾Q8֧9[r.7& $1q.(\r{Ygq#)*##F,R51KXd". " Xo&mU*B-?$X,F&/=Dc M xK:kaIC3IY<T%Vi>E٨<݁K;# 2t-"}FcA@8Zz1==LYqyEcRVaK.,9@B)0rH~&Pi+>-6&;e; U9*nVM֣ÿbWO/||>\PPQ6xwv2 'o5`A4Yxf7 KŻnfW4(O`%@e 8%ثsa!r5i|:iDT W9a C eꁿ xf\ NXv4u-w[\H"PWyq:s9@ j `qhЉocvyĴ LهD`fZWƚO!-g2X`-7i 򒞜Wќ9z:8}ݽ'iЉ 2D O21 OO`c=7{mezurj iIFI|O/@5koHa5ډ$я{TrW.>vdy}?+1yccAB1ޜ%^tXeeDWQu!}V͊1i(')&]*l5@tBiBkMEv8ru9fs eǒ-'pLVѸaQ$ù8(?ZWp[?8pI73L4Ozs}fmL'"~gJ=k?(u() JbMYBu`h:a[|>pEƋApNrhأo]sv@xB*1?<ּ(k8;ȹOK;+M F軀-ВNtm܋hOBn۲Sf,P*-ژ^p EF.O1:ip^RYZh4e$Zz:@U7I̥=bZqeDTA;3\zCCI(]zf GX5ڝq_}7e\Q5Zy>c,HLx_$MDih[89%B<:(rCXn:=9Ǣ*\q"c73z7XIHLS6Oר;̶4q:pOAN{O wceĉVk@ԽҙJf+=  Ͻ +FpAt!z֦ޓ%|RɈ`Gkk1R%iH1"ۤ~' 8| cEd\Zʗ냽j+R^)n|v`Vnj+u\HIxVOFjUBsa_?zsnzq |(䴖.~^t? .{<wō' h~־Vr{O/ѵe:݌ERAb]ӠuPj ªKwteYyjYHﷸp\_ؙe޶'+!ٮU4,V>vOoBfOIӞLj_SC5U=MklMA590{XTPcN:24J #ywR͍ 9+3pr=:>hluAef?%XxΎ)Gtc!'wi5/ ?(p^dЈO!>Mbv>,H}keUt(B ( =JэU;MW vlh\#aD~`9R]% ΅2F`/u k4w՛6pt46I~0KN_Hڭ] ОĊ܌?;q?E0_\j6)_z>} OY30ܛP5*5 8i ]d1`=`"zث7`CrۄgU\2IY^P`24$~zZvҮ dH0ra7Tϒ&SF!錚ԾzΦQN'LDb3&/w*u&oly>[9F&i] c >pR&dk?1V aXd5 K498FD`}bPf;1Io奆T D4 (,p97XW8y)B/V-]eOOt& oD^˩6)%,Ű'BA E;\L>JyvnѿH`ieAp0[b'&w{YĦDD`8j{m&ddXlnyq ֺnZoe]Е@"-Vנvr+ L%Amtuo5̩Q72u3of&5*ͷp劐9c'܅Z'/dݚr%]ȹ\ۺ1"^>9F}^q:K%+]Nix:@qW Z-vZbM^C9Q*dzR#R9GOiG/0#iS4KHYMGs䇏hAc6p`;5uNF6 7h},El5Q«Nzy)ݞVl #8Kރ;Nt~XScT)4GGʅpos],̓%~-gw']4<~ t[.$[} 'gI*&tBaHwxkb+ Q_~lqnXf!"}Y/~u*w'tojM|h" JWCC}>BNaNny9Qձ. o̿:rǖliBn Wc9$hdOY/rTGgӨ^Z |X+,{E'$;iN`Ax<~Ć}*dO'iBc$xPqJX3"Iv%=3$U ;^NyQEF3?IH<57^Z~2 sa/U~cLDاf>{pb\0}WbeSL@'dmF@Ӯع5Z!!p=]N7zR0To!F4 crB1 '@bݤR#Ƈ< Ԛ{t x_lW2,_e {)="Յunc1h|K,y@͆*@ a0mk4uc >lJ1+ 1]6fDu iHi !}vcS#|;9.pĐ8j+AĉɹDɧI-^Yblebpa_ [n2L5&7 +Յa .QvF k84F˂;R7%foZu<1bL0q,1UOѷ߽( 5eSyxlQ,8npW8n8>`F?}l| 웑kuҏ`n&iD>_Yg{a4g9E}#RKw|_rDB 0e([E/gHV0/J3%X {O)ɳ<htf <ۙO l?P&m)x dz;cQߟM`DǥT pxuT{ R{1LL(F}pΔ&nM8% X!E&7Hl&L< FknΨR&`ϡU\{V{+_X\L\> Ř% 1w+^׃]$syT w [@5F] ZFj>2#C/}^IcFY Kȧ4/Q͚!7!ia`!P ydLVg?D߉]CnVkf2~@! nVhEomNnüdJV!@wˉΟ6~* SBhBjf>-z($]MzA:%w=kkT\tc8Q^~="fHrßI9}`[B,G;ޥK{7}QG3 -^D -j>:8&\VO9#N%9~iYԔaX$8bj\L 3LH.0l' }̮ǹb)fhʉmso, J%\6''K…V+\[c-C5RdZuRZs{T3#BKgT]F! !FlrfR[H<Ѽ"[='|٠sNݓ[kulbBkg[PyD./OK|\;f!f B ?%>kuI&a=`yHZ{pIeR| ~z3aR09+b1KK=~ 9)T.f JdM>Pv}VsLl?ǶZ%iZA)#,+[O=(f=.iRQǨ\*sF̌MX]AT'#:i]f#ա{VAF0.w=J^v+wQ3 ”Dh$Nj/>"(3))M0B` JnR۪;D>܋qL-sJH5*m9W oLnd}lI\Ls.KҶyQc#yJǁ^)]HP yKqe-p+=z.T+r;?ʉ3c.'0x)Ў8(rh@CgMe|hzXCm9ݻi‘Hи >Hn!꣍bCfW[|os`|"NJÐ[bQB#MձF~J9 D 3[?#~frnrwW.mݧ~՟Rݏt4_{}㏄YYֽYիTk>("VP'j\m+U$zTxNgmdChӮ"=>cA/C =}&zʘܥBIK5=? #JtC}Y^Qr,|ƱXp d:7*ky삯ʎnS+# {ZS}hM,B-K1҂n>mh蘆emo+0g9mcDj?Hj#Hd3598HYQ,ok^eu2(^:<.ƎfIYa>_g6`Ӗ;EN`|iB .^)2+ $v-Ϣey5(拕ҟ#IQ#ʊex!$mRWŪJoSp{'ډ-)>wkZñ~l,k()DAfάy-{ %6aQ4 6rwB R,]qu{p "P1Ԡtb7]PoqHD0WB^e5V_:C"yTHV3NS TݍԶz;MA!H6'!Y7IiG8+)O^ص,?)W|o"w^(cώk`Uqihו[4>N[nH*d^2`?DIf%$w5lbN @1r7 z8X^z bՕDoI,od(;`viS>@gFAT <8v&`W6i:]għPr1ld4wR1WFMR~Ŝɝ]S67:5omZX('Hn./H:Kah㯛Ve\K41t-ILG8Aѓ~{BS1]J3=C`0XOxٜH!VѵovzFlz+U| ft)S{{H6[FOHNswf09\`i SHH3:qC(Bp,j4 ry-9')[%s`^YV)Z>&ྗ=lɏΕq%z#[+~/nXcF\#4lɝaO|x 0O>NjEM#px`F%ۣ ;H:*cSZ%<m- @C@Y)q#Cc}X0#"R 55tUtF#իlU:ɻNZ<ǚ캲'a8b-]7\hDOP–ėo~З#Bפ`=3fbDAk9S$R6 Ljԧ?ppdQ1 'c EhῺ8] ta!tjvI㒖 b@UdKwdEDG ?;3.C|1?H~Ӥ9&99 B4rNGfnm RA~e8pBHI8dgf.hn$9ɡf  ΐ2u%LH6Z+JE6. 1X#&+ A,LP4'_0o 8+,Q{@3oeQ>Ln'BS@.Rv⏺KjI']b&͟uKѓ$IʚsH3}< 0xT1R H>$llio#x~%t`eD p9Z8HKҍu$JHUV֭.0gyQof\a4:*+J:om54pLy* [V;a S: +![f`8aO`a3 GENF |-a}Dn.P՟ "Fح"e 9KLAzYS>d7ed\^$~7l-% ٪ua8 >u-LWgx+wD:} nr@ 93^n3Fo=-q0|PQ YJhArumE=ʕ_C$~BYc:"wpEjDNG1- C:PMpm.y(ͯAө$;0a :Zn"2KF9qܜc=4o6Y aǍ! E.,!x. }ٱ rb#@p$ǖr_*8\迱L YMݳ8X`pl[kxQ3l}>1yBHRDݚ=p|-Ќ%2KN Z Oa-8}% <>(0//|ٴڤ?p OJT՛ת!9W .#[hJޡqjuduz˰ʧxԧ)ʚ./69C4)1L 8_\h4DF'޲`jr7 r4Fh5 u9ؾ^[Uz-mgI 6w biZo'gߠKd]f$V,f'V!ykkrhQ|_qS3﬘bwsM#L/pjor(t' T|h48^ m3!՚R;D'O+O5B-ڔX/>"Jt%aE@a=$v" lOXXDtLj qIxFrHB _۔KNE۪`5l)퍝UW4xmax4GxwDo"8G[~irTN09ZHZ+}0Pd344Ͷ^o1;#1$Vmn %(~(UH)Z L|s^ bCx-.p&"ёoqv {lhyJyy$ rlNrsFTî| PefjIS =KQ14ީPʔȤ_HwiyoUXVÄd(6r?CY\7FHWnMHXY[>(qI-\*^nl#e%Tkc.x7 4as~MW onu 6mt#)_V%]qFGBԗDQ=tJ֟:X[qX;EMDz#^.K2/0STчDfMw(0Pq2[eِylh4yHc]E86˰lm7S mu=TVrSXٸG!Pwt-p׍,>ųu38@tI4Y!Q{Kp¹g.UVBK#l3BL9T}٧Dy1e GW-3m.8!Ǭ"TcQ*1T;TSV@wG+@ò="UPuӻgF=pYV=I(wnܳ}z+-=t)Ep1r}R&cߩ튵CcDc=M(E'82\+ەyԥy M]q=,P&Ye+C[O<|Pn1sű)Yy̲ܬnРgęT:#N# cprJV5DTvf&zTXT#"}0Vϵc3aDW7dIA/$}qB=|M>/f)^shQ`mZ6!U& aĪl.Tț K2:['*ݦ''C*74} -<. 8G}f5([ˌ9;ep@q5tvM`3 q赩-U٨z|z|tbe2XcS$_n-/\PeH&Ks21_@j) }5mv9䠷d3M2_g$,N=lm(nHef#qNi꒾aCgU%s嶰dM>N}cΗĠ&Xxq+hՋJ_"!r!,r_@'`E=2|'旔~޿;w'ӧ?>=`O&YMo앲4֟ &@IW"5]t^OI@6dZEl]"t Yr#=W[CC]>]jȀK {޸7|ScPӈIl-|WR@6)x VnܫD~KԃV< 0ţ¾ytn0nxVPBD?kɞbm?Nzg[%$0\Ә;B)W-9% +R9G:!mhDjݟMxtQqx(e&5S){VٸmSO Â7t^:!Z7W>BmyuDBJiwq9RG!Q3MKIdG"V f zV;kj/F>T:moNMd$ߔ$τ*0-`iv}WSΌp.mSUaڧBΨԤmF4NMҳ 3yɠ ,IZ :=-2?#6b[ΚT34s0Ub^:{/.:r+!pl([2paLk/)`>qى)z?0f/N$iŵ̸ s&arSq 1w^M&ǰV,0Y6gYWu5`jc t$'t[-5m];L=7/B`z*LgnVw ,/畨Jxj) ](LЏszm4e>[ܝM_v}"QevE?Zӳ>[W+Vt%ʝpN-9ioTFT|( M,N#+Xe)CkZ4FȒ Jhj:y}w<}Q{ W$լ<:_ʡ x3ԀE &6dc 2F-`OE%y\m+87Cvb)r)ICR<*ߥR68O1nu ("EqAP)2zAYT=A;V#߇.A7%APuSxb1z[{x1UM NnxQj⳹$/%`'LsRZD=<$}BƘ_G+zO5nGIQ(];)oNܐTx42;L`iuR0f20#c}EDЖqÒtfdO"".Sm{c`H I>ݥ~8] ?u>VHȈ^G,A>YvZaO {0G17>="2 |\'-b5$^4(8$2IapTMP^1Ji}!=K ]r| qn2~Z&3`-$On-5`R$[a*'#B`#V|-R=G `JpOUء.ִ .Vf@A=.NLaksh!|؏v榞׭ 'ʲH w>)P`du_qcy6H&1PIx?.zV[=Td.p ]KWQ 4i}TGrGO )c/Z\_h6޵Qs]-Q_30$Kuл6 "hpeȂ(;Ci-'We?6l.& `1x)gIi(mwp =y/ȁ GXNOHoEB RuU,$amܰȪzwztìgXyB$(󔀛CţGv83D 88lwjhf)=`Y8;-A3Bo*68:ObԆڭQs,z,5k#4)DS5I+sg=mEDBTR'EO 1Bꚣl6ƨ1v۔Ź% >^,d/&W+LbT(Tcg;;5P pg[l[Һׇ2<&<;+En $Jf+D k"*q]86dm3Ob|JȬ vQ .YhQVazD#J1 4A Z$d۷4$rݬ_s)WR 'T :nCzeQeъ\z'Uf<7[K &xn//XDZ8[ny˕@|*}Fui ג,t~ۅ:;m~ivVHs?E3I۞~DgX3"Y֗]bR>(/OHPBYIT-J͇` QLA ƃUտ z091b d-`|CYeI|+L?U^">dhW_$~smV&:teT/[ 9m1 5Rݢ {"-%VjbiP<74'tgi^BH/C=ڤMc?v*A.Y>+WC(yg'dQ#6rbVPt+M4޾S^+1>/cq|lׂ},9lv뭹'=7FR evr_8hJêi7v<1t[zщ&Ӝh#)c 9Sv&Hsg,/dNJ)Fc[]̭1(moX(㫸[OM r{tOnbv2n(=9~Ӗ{6 ŨkF^3k~|WGa$ ꚳZ/O&ʕ_!v\8DU[?]/EnBbbu `4浳_9mc%^zYR8L~Z%p-2w>:DWvA*<-8Lx[$L,X(2*TPlfBu|Y/?[YpԪ; "=wp93 ASХkˠuª!@lYq5S8P@4G%VRK1c-,vxD-tp 5?+7_q 嵄bX\{_ I<rzUo} pFj7vV x*BW[ D{s*\8+NYeՃL5seܶgz ښt4*sƿAc':fѮq U7y5ceBj"ϰo˵YZ2-렬V; My2uPMxYAԑYcKϴZwlfG=6ijC}`##xu>Bɀ'N,Rؖþ;V],+k?~WS_4Js"j7%Noz]qV0Zx~[o4@3]O! ȯ "al3ƨӎf+ft3[Mɱ֚d' _Cw`c_fiޒ7Qeh4jcw ?KxHo8 `E;!5kj, J+]/s9X2p/vAzw.~ɧ@>,h^kPN5%Q%4\Iκ K1}"mh4L6eO/xOdoki!GWٴUWp|^L%AS'- -!`^^+g!`)2S.HlP՞Pcn@vyd7%Nn9FÖLI*TW.&c!NƿBSS"+ۛm'j]-yÛ HStZ=!$uk2e ʓ}M`[pJЂ|:^d!MwN5HЫH>C*S<#[\~sb,))ߑ&:BW:jzҪ]B'Da6Yn‚PGt['Fqj}@J̌>)ZF_J9 WL֚@: W+lnDm`n>[P Z4㑁MQ_jN$ŅSskک9k-0g?"W2j^Ge!У!:G^o\#NImlB(R>hf0k>zМ ^ϋ5v籹 D1ݡssK jӋv;7Sn[ r`!EIXuxС +b9 ,)vI'6:ľ]BpMЁ ;xQ&61z|;âO' "#8 48X|օ \Z pA(˖0^\Ny(ߕߤ,gLf|JJ`,6; QY5YE JBg1 {Xf> 괴w $#GO`zFپdD Yu>Y\l|`WLcځEZN~]DnmI\/4a+zk(rpS~4ᥧs'ϱݣh-a}QӬtpuiLg-f%D[n1ϒ/՘S}mD Q[.8 -'$5%ǺT"#>v Zx :g{Xr@}ķx l^4_m|bK"T\_Eہ ȱH * i ^z:071,5rSRQM .S˹ou`Lzrx^ ^P1mQAle \$#J@QFhndHVE`Z0p_7toж=ؒtU/a2]M!AgW/>-_v^j:8l?LL?bv†5- !U!k]w )%%,"z ${:bWgxx8;I»f 3ۜBaynu:r5p dzCޏ y_uNyGٵĂR݄dTĆq~e2βϢ*5ס@mOҼ8$kN8\r;LiEH(/,z5N\R0V0W9{Ya'Kş=si\mVC+p "|f\f-z5G)ohzlarf6]Iʲ|_l‹ _6 *y[@ $:@+`9lAܬAZYν~dR#9B S .+k3nc:28KU};)$N`k5̏䎪ju'QIj@ ٮPp//euLgLbj|[%4tH'{.p)lxƊSjzgjͲ3[w@!wd"  od:4a]!Sீ gXD-h" JlOS)@5) [4ԉ$Uۋ=_n"kOӈq@_!BC:WuL|Jxǡ*?}?BZv!f㷯o3.{ *"J EN!pPvOylGZYM7- X,bO4ꌈ%,0hoUD_)aC&uȿl-6${PCA-HSyBkwޅ$, f:mF~k#VCUv ޗ9bXvwn8&W6Vt@- xa/!gj]TCT[i~y`ZKt;J%!`4}6vIAlQZtCؠ1 ,߆mnD<6wT2A6vdNnGf40'k~z$ysc"ۆ~XXɿ~B1*|ʶʾis@XQfV$ RͱhmZ'QeEσ$Yp؉&#=~1›A Io/%2 aA5N}WZ͎ >2<(d}WqcO4.8Hn=ҚPI ubmj^۫'- RWQ0ש(.AG=Gd'ed]0, Vjm 9, ?rUh&kJϨ;uKb[S$/NN,B@ޅqA'^'T볒[Z7 /Bmʕ J*Dn-{C r,tp%l]0++PyG 5ǯQS|Mn(]L&y5P[RY_ T-/I,=̼.0mm\x.:0Vr??*.~nqdJCR}_L#LQW)[Teo9(|~mLP2U*htq)%+wi}Bg7zi}j̠qR1bN8xLrWwv J ŢyWqbd;Pםo\ݱO BJI Tɜ )?2'w(Q+7yI/LIU]G?\93Y]vL؁GUS mOqł'+R 'aO!Ֆ투^ܫ濾w'wrK:,ayrjPJFlh6er]+"{r2x}F!7)q֬Mng8DC7 }2-@Z rq%: k:ZROu5\D]W%//FB=sv0X2ܰ+ʼn<` faq/ͺ'?CbPdjР952Lj=Es:O؍˜+"[ZC-?ªq&pn mMo)_̎)r nݿ< ^;IB఑n/-&K RV;_xyPy!SbZ:t*nD]O7.uQ ;&hy 4keA.nաخ/"DMMOf$F{;3yJD :}lB "K5=KC誴ś"=)1TH T^(DPhI}lbxp({,/1"Pr$Tm3cMpMo`r?&ô +ҐjT~@\;qڶ\]*HpVxUQ{0kHɳiz%]ѵ"L߾=">~ fiake/"AM3w qmoO0Pr9(LAN#YsBp%MS": (O I?(gOn0?E4G|è"ˆd.,)K0 iGrPK &DV{pQ#uI}V!fb2~uB4ĀEa[tDŽ2!;^T6M!s=iAF<' ~V2\U)FvCØvCt!I PfxIb zӅ9k݊!5Fo-^ID.DLmD!T!`SN w"s%!y5]D[UNfu1HQLreAB>/p]Z3{X18cU C_5ϬU^8935ɚbprD/2$6wIt h"{׽Ƀ)`s:60ԊM4t6'$~𔫍QKȒ_}$ V?^|)3~?Cx sA֮܁Cy;SG#uNA70iE|=}y4 ݆Va/ȌFeʉAN ]D䧰~z$?DǢeNat@6rX Ll"6$R;W%tE3;oރ:J-+M.MA_i!OhE= ZEEܻ3@QC"My$ӂzGZT:÷T&>Wf  uS|Ys)sG"(eqKg@z\} j!o|f]5P,z-|QBjWlϴAR9(&o Ό[)gzB$9~*Y؞N0Փf#WԻUF[e+4 =]kgQ .A-nީK}#߃vSٷ{l,޳@8 d[]/ɜŦI+(Y&Y9:$BPۆ)=+|҉2u(xan&7 g5#oP^DyP~wL_LqJY4›c,0ŨMvx,qЃOӒdcuHrc .R֯{۴792.Aأj~ eLNvى29L=; Mn,FhRMzn;>nz!C^ݏpjô`o8^NcQ24B}x潣-֛<:?>>-*e8,k _;@K v"|6:{Ӿ,[%=#g"OhzծKY* 7n{5Y_q1^O¸EF%Ty}FEGDIfc3MT-KdmM$&=a)lf;'a^f̣[Y(?2+|R-iL&)R-_n>^44# )m5/*1Hz#il"7˭m]ykYXԀƝr]X K&uyA/$le mMЪc.CNINCXc|<)JRs0b -#N4%id|}V(gr6"UIHr\NBĻʓ!/‰.bt#1{VS @k9=˄a-WB|X٤w+ssދzw}D+\7ΌHPRf9HJs"ߦi 6*%MG]œ -/؄s^R]del Ӑd8LrlQ8̍hWJ%yOhm`1;a=yYʇHL%% PrOptn{?03bR kV$Οu1,9xoVH碡ޥa.%{ڒha#? W+h兩Ś*4f+lMej۴zUDZlyfQwe?\+SP/#Go}rc6Q.,9˖T7Ņζr%o2:@ݙXH.}!"] C.IDv#Gt˙-H5e4BeoU,+5w^v0ވ h,`@{SGE4&Pm WB̓'e׌i Mͧ&w'L@=@2\ PHFi  $:dT@S<"# C9*ʚܖ"<^|`3I}ޤ`S%߶% 嫸.'5 (eī{D7e7^ :'E|K,V w#TӛAn&O%24@tYj9L8IF1 ::UjYN[Ć-srF=X}#Z}嶳x^%6u>6=(l؄;-ėI?\ctt&k\wPD3鵚% =sɝ莥MoqGMNUvTc>yVID5ۻ w"nzsxMXRG(=w1 ۬AWdP6c@ jw[,jz&{rhc=X9>pf^˪M*XE(n>ύ. m;J,4c&kvS^iJJ1#EVF F5ќPx! h3Cauâ6QB֪=^g%@O"4jh[\w)íb e^m͖6v KIlj6 'xU<_?5Z v|^1dj7$. kf.ٹm|q!j!ޟ+  vkM}sN6Ӻ'31ú20x0aဇ=s˂^솧\fpH] --OH`^:)}2Tλ¨sKoӤkvTAnW:r{*<u|:*m]1z t-B ?>f3 ۂm {' Ρ;W& a0jGRV^*ġxOtU9\ ]@xA6h sP7SA7qX 2|X09E/Yc[Yn输2#٣sDs6'Ή*U^Y;qP9}O6/gJVyg}=P eti^Ԁs̆c+4AZa_Y_J!ZG*'ae]ڬGAS}QwIG hRrI^%gJOvdpIR;~dk;Cw=-'hfb'zvڎ7Pm-RrϱA'ނ~(D )3jݍ`,\IN5r:0 st#Hd ~O6A&K$R!/6K6g_?()wİeyҙW ~-#{ Zi%']J]bW3> 3Ի`)zbfUʿZ7G/I,K =YHhfv9K ߾G9ْXihQe[-EQe} s?3W|!׎rA>{t2'VE9X`UF~w<|[]nu1ܟkyWϲ &5S.tPv4(Ax}#cVc~53-&w6ms{JL3b֮VT ʩ|z5c&[{6n!XFu͎40"`3y}ӉMcc*:~*&oR V@<"~5N˳8Cvoހ2'Wy$I M2tbAV:^mG<酯C^}{#l+1UUVdR;-X\M~IJ7|_`Z$`M_k(ȓh@F/ ڧVI0)fઇsi|ۏFI/`u4tA^*Tٙb0#_3R@ 2:i2oؑ׀gτV@$oPvL;ixKw K" hraK3C >.C2e^i'Z[!#q֝ vt_,FIOi_1GiD_Wʙò`dE’{{Ss6 | Fс~aɂ4{ɛ>oΎ^"A`FV\5beOLnoX S zJh\S9֌Ab5fCr)L 2X#3+ƺC4&X5Y9IU RmW'cR s6UήI/5svqg1\,XDǬd#&(# x<Ԗܕ]S?ݨWk]}3. ժ3[DAk fT:{Nٵ6(^.!DO*{ns9~6`y_iI瑐ܣ6~z>/$ȁʸ|{M3R`Z/w`uK4t14bHjfI\0v9C]PwŎ$NU|xx4kAp;4DԾRH"<RJ*K@*EQ%[gV YԅLT﷭ŝXF,4(&5Qa-P:+|7U)*֭XӬW2MQI$?f#Cy>K5*bPK^XiU)Y|R?N 5}~X*@"V>X5HZˍK_'I!c09GX oTeqY!i ÊJ3FOy8Ljp!xflj2ٿhYS8]i,H9'g6oww5%-^չ&VvހRTՈ\!ۚ.D {-`+, ͱ5I$cB6s0zw=HN+U|JjG]ΈhO*?jfk>! Hc2Xkډ( @3B.uҜgQQc Y;LPG(2j"xP_;.X7wF5BpT1F6POϚϼ||3|xzci#2ӼitA򲺘'0"ڋi1FAvpsoq Vp%OWPF]zWa`hk(8)o?d⸂ p[0){ X YiRIQAsO=Ok ITRYfyjR gihJP.)K ")oY5t-*Y`Sli7DzX컛f *f_Vn@r_qPvۓS* T1VjIjlGnC3etr:c t*'^]<;.5 N ˦U^B$cx:?ucݠ<2N{74Z(_~Xoi@'X~u]y'TldEd!Ƒ:y㠬D=+a5707͗5P 4R to{H'r*p׷݊KKFlLj}qq!O_`ystP el0HD9xFzƈ5Z*} x]wF“La3Qv  F2S=28# +MZ,A;v[mAL4'.WΪoryAunԞlٸ;liʅIo11k!ßqZu6B7f߅@:!D&nKH'jKK)]S"!6ZRYf0dbT# kmdIq*l7k"lESyM!sw2" D:">_}h<æ}8 T%MTV0gRK7rUϿ+W-+ڄހ?v^9T9W1LHtdMwܩ=$VV}EۨU{}ҸNLJݾ"ЩIp+IP a?}#<8k8o(ɩ*fPT a[JAtSX(*ixG5KQՙ3EWڟ+K0 5`s o8Űpz]m\Ht`S8ٜ04NDF7V{-7SFU|\&bu_?qzSuθ{^?#C .?󻼗C2A}rq#k#5͛)4>Z޹Ӎc8j⚰T-6Zɭ ?AԿӐ <߶YH$zWHMa/FS+u 4^ZY ` JH3b$p.3+KݵEGl %kRJ~ eM{[MM汽IU+0@S^8NJi?@lMebWrwyHZ)E뀸fރsĹ [}dM !?:5xaInVp!P2UG7 S=1d˃ݸ^1?,Y.7z`ڿzv*ҊRlfŤ4%<<܁qrH.]~F9ʶml$yغ !kV)"ݐc`&o@x !\U*ɏ-[b"pyn|0MziA&@raK6/ooX!сMm%\JQ(y&RPU`vpݺ!hKEq Թ(e ,  #K/؄6̔ɭ!ɀl`@dl~+tma֩dfjLڕhR|GxUur9CpԝG{/-͇fhF@CO10>sJRS3dd@oNl6ރ}[j$L+tǑaM/ӅI8:H -JybF+7B &@ 8Y?kγ$qz/s_K_9&ggWG1p"V $2\ _3l >XܕZDg*>bo(9c3;C>!#q;8*Co%7n=Z3JIb+$b \toTNN|̔A Xx)x-,%ijg(4KJ<6QYjBGapDD]CndΒXmEc%K2u쳇/4A8>\< Ƅo@B0;z%S%Lw};FuQF_wh[O96B.1)?#һԷD#-l%@Nf,.|'G-9F‰"@{?8:|C7~k$7'[ձ? f2'h)AU'yOՑw&O@T F̸~ifU2DoY1!`Ks{b3Ke+{wVxfLMDvF<<*9ߐITOz\6xτt ]dZ# ~b& ] Q‘Az&>b9Lz\€W"CpQY*q-ݑ$ ʂ<}NdU?j1$v$`i~C4[«|K=(>&bϬ>t|DL~,bZ`C{nj;Q(bmr4M2*~M.j%JbT'h5\\lV2uF.0ԙ4cUO;Dj޼XŃ8Vf~ \^\ó_ȑ&on}k%#qTI7е\SXyu%ME!XNMYX͐I yMiOYY*r^=Lboo Pͯq Ov!]ƎwyCNaP) \,3htrVznPZFO.&"| P\x|8[H>V8gI=P"ҷKF@:nG0ԫl'U b]N)}˩[_:6HDZWl')PTԛ;g9]%[|Ӄ9A0>kOON_]K.ɅkŮƔ>HOtm(7sS8U|ҙC;S*3 |6`Аp=jDt/+S3bFi녝0(@+Y-iW?Mxt*9@N~pQX1FI vkVɂcXERT&蟥a,񶘄T/(+BOcס׸B|~Mtζ,~UNW=*2-RrcJHU˶Bw_70fIZL>5Cu=1]^dRw5-<1ܹAH+p5aPy 8K5]l,@ۣ.))V`&K81*1^8YC,w;߽D]Z?$E_ٰbNVknҦu ) !mULq]rf.q]M\GL[lmL u`itMǩ^ ΗpeLgCgc6SߴO2o3Z\!#U^"[LMq!WJs!:5Akϓiچwb FU* `R5U ϽLVx2ΐwꞆckHvKΓ>gYzjwWHt *.e4ChyAW\znU*7lJ_3nTg<3-Ssz|$‹Rh9N;=s~vbY],ɮz`yi/9cj{P8-'tk$:,w ǤR?M, ބ!NLk!lll͓U(c^v9ڥuz ~taAQozkf9k[#s|9w7ISe ãOݕanΆ 1a-bQdXLy+a_sa5qɁT~j:5߰ ^nd6`#X/-[Pb39O{Oų^AX=ɡB>n`]$ ;" " pϐK1#I {Ԩ˱_F_]Sn!1*-c_FLiq5jQF3Olug u O]RK<:A3{$A]c"JH"p#$ZQW뒳v7Oe/7=U 6h1ד&`rGiOz3Nj7Y],eIޜ .GJچ(CRo95p2E~V..Ov`` b? 겒>ތ X6m:D /F_.̼H׊c,:fSwH;]_{dKQT3Jl@b\ٯ (}8ȸAiTiȜhnMoɿ˕b\J#Knq>37<\~&P!vW8N䵖ȅB}fD:n*seOjrU,8 |ӏn:G2iH^z ø}9rN䡕,[IBI)ݛk:6;zqwҝ{J:kLZ_ NJ?RgOJXֵ|,wna 'tRt#0 fvO Eb؎yF+- mbQ GkM׆H% - fڞ&T0[[ƔxJmrʤΛT5;s*R,3!BNJteIoS=-K +"?uFMqy/~;S sVX Qa]v4u]I%򾝨ꨁ-D mB)zRK阘^m-xʀљq21J[{W!^fgy kr Oal`yPRiJ o2t aeVHJwhpW=b.V| !fC6K Y4DaQr7&UN!g־*Kg/YF6?C穰WånJ"TعЊA`r {'Lo"8"߂zW?zɕ Xĕ~T=W1WJ8~ルͦ,oW/UҌdno &t $oj|SLEr̮KP_̋겶 ֵY Vviگ,p\EuHUz-qnM5kJ=ZZP0ƤԎz0egÓt- %PcXWhR5Y׳mƏ~=$W2\R}MW0ؗ]FS̓<&\(Xٍ6Av}*mJA5FM@lY;q ΂FsͫP{/6툾]w6"$˰džzY]/p*v%'X~Ns7XQuٝz \b :70*!nXc--Z>VCzQdIf%'q:+SVaBGX};H )ća@/|o0aqwJcawE>>]5ʴv YD/dVN=|qdDB6¥<Қ@Z[e7Á]5Ol7{>L uIPwji(1KN׷p0n Ӟ^J"9&. #Z%* uWY *`7Q8Tg<ǪkO=,y=RS/<<-+rc(k2=TJolWZLKΐ;7NЯJ. ۟GDQ;gz"[ؕP_1r|[_ShӮҿ)YRlc{M|,wpHU^, T{T"7\ , jwu5.s1\MbVE7:̝=n1',#HF5.%c&Ѱ ugHҶiGO\Ǣn-MnAK[[#yӄaLyIN`ĻDEf> {Wy;1R.k$ >s/u%U1~H NRaݐ"8v$| ^ʐĴk0Ye_9: n^[1u#QX'KLC?4R cmRaD/+J3t?bvu/5nS{"&A"JZ=1ТiEʕx1dߑѸגqAlYQmN{2b佰╇OIs˻3Uv(R ôsDp| !Y[>hO."f`$|/ގ{+7"|w˶`U+N-74VYهTdwKlw{B}uS Ք5H %j 8r7ǙwP>.+dP|R?Yb'8I(AFAlI!DMARu jSc|K` e8Q;6s%icc_}Pܭަ&vf!0M^YeH.t&y+᫘YUHztEfyÇ`C\<\ Cs}fK&BN_ǧ= =m>a Gg:jŹJ? ?F0Y [W\_=ʩӀ:Wke@sOGɠu=慮 AÉDxi2H0~fA!OQBxF@QACyϛ:$> -9tLhNDD'_@׬\AѨ_F e-fk&*q #?9@ xiZX@A}܁$9+ p܅@ 3o*y,0[EGC)=yd#ǀ-SϢ{y%6@q!dQs2F[u=B&\?`U@9YڢM4ڌ7IAcj5Mrgkm搲@}7th0pCP[p7q1giؽ>,M|ƬgM7ѫ3.$Ȓ^kDUijE/d 0TSk'LY͉]X E]$ဋ`{Vl=Pݯt}0m|vtYL+pB]Hlb%@LD7#1 Qݐ!MWנO̡C|'˪G=a6"枅/¢,{c<ϗ*/h5f˥iN o̍BlMzLL%>mhW tֆn`8h~Z#; -m^fAcɮC_~ZP;<a,~u,NFjvk^EYsDJ YN4`y#9oOMtEUohuYCh ۴K{;xxhKz[$ocTRލ(c7F,;z8g,XV*N]{fuzMcxqq)ȱ/fcU"xxshP($3ٺ]AmN|E A_\o_CF).ޝlJo8iRȅSzO[k M"~O7-E8 j mfCn%ӌ@Ńcur?i U/^׆~NauUnƊ~Q2"Y*4p:<'h͆h 92`/ݞӖbÃk{jf &@2UTOJ-NnhepS]j񦩇~[rHQkJ5R U=%e۽ P꯷TZBHhmT6LBhG*3_wp6]̀Ua_vCJޙ ,H;Ar`*~HmBө0 jE_$3x^=|#EUT jљgL+H}*WyCZL?,,U.V-=4O# |Vw-](D(_}L䖋qrjA:R&ymI_ȓoQK?GsשNyMbS)ZҨM) sN1M0Sʲ? uN.&ϒn7d 4f ,ɀ*k0 +{cσwNGZ:Z(b0NmR }®gz%Z\9 h]t?mXI& 0 g~x(or~n]vl!xDj/5mnXnQZ<]\4X)<6iܡS0Ȓ !a;g,.}Cn$Y5~`>hUW4X0RqI1K;ۭ |{ti&0 g3*{IUɜ<~1gM!uA][UPKw3W U%ȉ] 2ѡەy7G\$< <_lxso'_!]So Do :wd] $fw엪~J;Y0[Ī* <܋\#Ơ ~WS4NO`(hs*p[OgȖ`\$zU װ>q7w- N#S\ӛ+X)(0sw,.7-9tcB.? U:JcXnGT͚QKԗ3l2]U!Qdy׊tm̙zEzW´}!""rAsEJE2ۄi$ m.#P=6L br.ךP TdIpr)hOLQa-ݥR6젔Mɣ~פ̺龝R1i)G}E H!p-Xty/jLck_1#W>/FV+Xx9ٯ5Těh.wZ$Gٔx>ZB{4$5$ZjqsKuhHԄakķt }D`֓%vʅ> FLB1ODI0mD"-Zc'ޗ~}j#RlTP/yoћfˣnS- Ģ|{VEs +ijfbUH2%b>TR\[7. 8I-U3 ̔NIxVQ>Pb6FIkihL xMT04R OaL-F^ת(O[gZ)ՠ\ e y-v,p]-Iq hZ% e$# =?L ;H?hy1lGFC`o-{EiW{n؈g֜ e<œ3!y< М,!lH vOdI%5Mڦ5A$^lLڡ =⧨=?n^V}8TBӼX)]PJ"_YC?yF5:3*u,MZ6 p }@/4Δg2l1ƞDIdU1.GL`COk]B۟STkg]ћO ;bce'kbO#F4DIhHA4m^pVpC[TAKHΗ$mv Jw0 2:T][B ^j7|NMN'v0hL=j gL>KzU>چ!Sa!Q8N~KoJ $K}[.'3W;w|< H0LU&<5[0!R}sxk6l-eDX,7˝*c)xg>g^'{آ Qq༞(G}ٞmf:\d0&m$iѫ x$a1"۹U4ǹ-FoI5(6Ct.rM؍m(Օ}>֡<4Ӈ6Mm՘] J ?]88g{?󸻐GڋТӏ^j;|} .g~V+Dw֌Or`/цijtgkFy i{:Rj'7MbR ѿ+5!yvŒA~<vM !v$ЅoxE\9J}\! F VjCnbBEne76&ӱ|W5UsV;. "ײ=>Xx^_Uc8MSb.z襨EElf'_;_.9FdsTͩU`Bս_fg7(wNLf M-YWL+"wnvάI!B(A+deCSs nO">\8aJ>g3r:̻&!&l˘}Mȱ߁vUyr]jx-}&\JGeLj 7U[ i%Is1f$ٚ4J$BaySA?9b?vd8O}=),8e}EHI(3 UߝNK Y&iM5 1phC܉GKٯJӐ&49!b[ k%[|EJsO: WibI ݒ %xL%4ؔgT,~/ᙨRZI !@vNZ`YO*7\]R@r:q֬ -/ /pG) BF|P˻S~L^7YHR&)b{-Zދx |3iq~FP+8p#cc 3E2w@JþD(GD[՘!қsg@Fk.=p2̑\a(,#F:.AM ]}Er6J`PZg]lѻ< .?~JڗJjheN[o 7PmV'j1{;!G,̢vtxrߙgXOE6B( *: 诣 8Y8}d`9O@Bz7q1vCjXQ0:9#!z:QӋ>.W+MF>_([~|0W;L: ȟnJ4De|H>[?R sG)Yr cD#kFy&"|yskYÍ6w4_:X}32>nLD;R΃5O& f61reSp2X|1U-)>|̳mh1Sֶ׍Cj 륰{G-D"X9PD=*k7)-ydl~WUKxo^`72C"CNax6b9!2;$<F˛b2%} G n͛Wܺ1Qj=:=, <np;NܷI}}W _}?W[ͭ&M3_S A$F1]zT v*Kϒ$NS'R8}J!6eg8 w]_8"22\ClJFH|> Ĝ77w r_Te;PA!iЈJD6}?DS36Yewd)+2 _sB_7M:ݙ  XiI3 d#6I+8F/rXv3oC. %uMY)ZZO ~-;!Qiw_UT/}]yf~2]sns7VEiKC@("N/F5(z!gah;]M8>{Gf: SF0Йϫ9Y/Dž%o{Xu *LLGGj{NzCfк]lq5͋5{ID `,z&[[h+rQc~78;;HS w0GU u\Q?yπz2/fϽ$6L wh-c#$y3RY/`&Ō³;JT+\hsCEDa! Q(61u i'6HZgYxV̸Ę26ricj.5sW  ]P4>xu.N0X!YNsU(4vGrzKi :+ll( ȴώ:ÐҏZwwpt2 >1bYTA ֻY%0*tHl YR= <+}e}{S/+HuGZ^[s/Wt1$o*UŅP3bw2@-jFmZ{~T,(?=+3-7{fR_ŝu2:4Ll`i[ap" Q;wjM YAK@BzN=oxz$7j g]r\ :DaŤm:0%!9펔jvnw _ VS;0QUW6_ݯQ=`/T7+1`#Q>pC ɖujVtW?¨~q70fш։7t{U^1ά*о l:`$,c 9|MIsau_ q~_S]LV#ʱqZeȄt?dC'ĵ!N'ccbMTti'|=!pm*K[&#+dq"ڙ&!ح")1h`vJ +MxСR)nG]}׷Or`v7 p2O,`@'^tbqZBrY. 9nGk1Q!P~᮰X~Q8 h`f&-ϩs2m-h͎fWYy1~ߥ vZ9h01?zSICdUV4"S[zҁspX B5j DL/(ҰR:zYTo'1$pf(r;ROB⟂n(@|gπB7BƮd>, D4~8+C9ཛWz;mXhusU2@[h%mHnRk0}F ;'DPpGu[c~xb68M5ሙk0nq,([s ':ۭ_6-ѤGs ĦޮTȇPV,wG!ie4iHd/<Ӽ' ygل;3kw!u6%u͵ʦzaFe #4:Sd:@ZEwg&~6̕3U+uVL.)8P!tΑ άqӅעR~-mMc*`IvSrvD?_)ks&7xﱨLd[G\#kcDJ] oAOG"dMA>WV_nfW9KQ2+pl3p~*+Ftߐ,+mą6WO$26MγWD܈葜NT)Xu/eE ׳jv>ذ3 hk8"AxAI>fRJT5l-T륩4(µyy FawST@;qE$Cq 1QCNq\Jd؈8d nF樮8O ,Εg栃ޠK'8;Pdnё`tPjcwץnL Q:Ir%j0NtPN?+/8ev+e0VfO0*^v2#Vj0|#rfObe]p *.C)9j=ʎsylu1DIީ/P؀<њq}p%DFG1=g}bV2n "E7U51 TK ] v4ŝa*ZH`Y8 c10zT dF /6)WWLSS)ZU +ᬛkRO>Ԓb{fQE<=mI5í> ƨ{@MI9x6tlhBy~65lePk!a)gC-+./(oeK1}[^;ڀ;F`~1( JAh0v?:gi`EƩoS g1-LwFGN X'*kZl +|$8K*;o+O8c\NE~{ %ex~Q&G>ٗazɣrZ/`)=PyQd3<&O0dMHa x Q5a彪,v>._- .\ 5~ڴgN;̥-+ZsќIN[:r )*{!ĢaQwul (>ʾH̭HHw+}ښ3%vj ?Ckqm_N+o]n TotEհ&)WUى$fKy+uM!:TmDCeWkoj?# ۯm|PGzTגnz`%NH9)t<MXN7n"ηv8$tl@:Ҽi cP5|&>Bw`?0)ֶYז]sG1loKݲƎB]n#<z}EI }z38t%M VaI5" IƝ/Ąʡq#G}h/۞i:ʂ;p {@tlY: ї2_ݍ'DLxKoyG {{eG~ڇ}@m'l H1A#뷀i$od;Iޏ ܄/|vx,OS,m(#un$;s@*uj[`(UDd }ʢ^jA(vyWׇ_>PXi4Oɏ7':9_/2,= J?c3?}}؟l_ś`aB*x΄(2NS#J +QEQP5Cb2Aaz觲q7;?-yaPҨJX-헢4A) =l|1LDAhY ǡYx3ilKPDBH9/ifd$hR˔:s@d(zM>;0@eF鲽!a?З$s.K8{3߂{q[Yև8@Rݝ:Hӄ!iPRaA my#Q"xo] ul.G =^'D]4yTyVВ7;{޳*{&W B5w89F"7O=kHR\,Nh37N+KvsZʠ 5N>B-tVATg}!T ";'$~Sp5/U_uOz~O)/z49yޥ+VRGmW&T6=eZh8E! \:RKgM] c+5^G/ėƄF?E*LS]_̰Y{x!dl"!P1 ӯ /uzLPK^Bxyylϡ3H%!t iQx=ٹ *ntLqWCj}œ_nSC0;#!\>7fG6 | I+%PD"%w_l0t%ZKF*=oT.تs"&ӖW5P=_ cxjIʭ^=t0P]&``WGט~idI1=@m& 3qT// ?:!.wVW n?Z W<0OSTz'mtwֹhHz(0 OeVj Q,ꁰfmSUTjĚhy8eXqQ˴ɃcIR,: ga54_:{\jtd{ɦL!n<@޲b 47!'0P1Sw|uFo5|I 󆑕 jxzAn&VxVQ{SI >Չ m4o9yzYH<; K*K1L.jH\]}F_."ǜ `_"hE}2F JSVY ~6H kZI(Q3ea0tcu]A.rhi8Z'L,<ӁxS O$P]#n,sOAuQ!w Uizn_~+E> (]yc͔PpW[T[g>JlB1S`16s a@Jo`?bj,(L"x0CmeoDO'i¶!UD"2qpCI ncmkv M$|MY-vy8_*;a|NcEeYv9"7IEb= [a2gY[Ԏ3F|GT[to_łlgtӑF؎kXO"W2Rj,%-q`L3g- )6iw~MkdeٲvM7Q,y 0+g$?}(ht`)olJa0}vp l G7=/0m@F b;7 ᾨ ?ٽFcb{Kw8p[SǙ GBA@}LPYaNߌqb$jcl"WK~FE!"HI蝛 IpUiWAg> op M.a ʿt>rׯr:h1O0sYVƌAʚwRCӬAg{s{%ZbO{Bp@~+ }9OØ' ñ=cK}#"eN^|αXn,98 \lYFb-uRDl}cJR.)IJ=qQ㫳1.#j_l~_m.Z@%^g/e@)w⢤HG44 l0tm^P Vgq;kYܨBݚ g8ljfNXWȻbл2$`ӓX*IN6xeA=8N^=‡Y mi~{8ԑLZYLӻN+ xZ(m:llf$VIiAMBS=|W=8;*> VE+%j\N#3U4px|EwYW-aoL공:Fu1.&Ttk_/N&4㢫As7r&/J{0A@fjJЉFuəAELv v9WPtE peӢ2{GYV)23vpEthlBL$^?^&n ^߱ lz",I]|5Vn@iXH"cm8֍\$g4XtÒǝB4?\j!$7h\v[D6 Yn|xG8boPJ,úӊI>kX6M|iE1,ya?<9M͓ؗל~OΊK!zHGOэz冩eb;uЩ"i5N(ݒH%ygmpqÄС}9< a/Xls0z!3q^ ]ڬȚ[~V$Z?IrC;ǸnWV`#A7Yx#x68sFjgo}!6N`y>.K?ڗI?\qJ L>ڽΠ`4r"M'TOȺ k*00r!~3(Lf\BRA)S$ de2z 11G'W^tAa~tD}gg}_Xx禹/2Gi+,)-?z2ȼu'b%WBbHE I ᛼J?~ yD4[aR`:1Msh u=%z[Xs3X}zU] kPa^vl#~a=r$Vȴ7DžG72SX%۸`wV@ o;DahQ1ra=.Ïn4pO(CC,^Lgb+'C|$x%}4l74?RK'"雖+HJ+ 7&vp.9Ͻ3JdSB=+. d,ȇx۰| SȬ v kNV[& E{)&9K'|K)`J<愈}Tud? s5W)(1K~W{xZHx#MLq6p0@layph)=ϷbܲMmU~X6afոUGpץ/a:uLI0;kPoP] 7(1 _s; %n '^"̑o5=AO.>I˹7j{PςW5NybN&\<{5$[D|}ǸO"ԄX[ 6T[5v [x:r~M.e˂U_XTc ~qG(9:q(. ?Y BM~KRû$jVfYϊ;S_| |3İ.\5. 1JJ Z3{oa`+ żeL=^mQy6UV/>|~k]SY:6mZ ʒF Vk-7 (]5LxjH ~M@[sb,%3Z3e5- .FsIpX`uRԕ<ǃ@T(T0a B?A[BނK3>.ew*u3P6crcZaKgg9|^W B.˝]{EQ[(~QZ7Kny1m3]ۊQ(Ļ5H,=逼L~ANg>B=D*iܬ$ND0 .PDViU(4E9eEjqC&K3/';;X>ެ6-:>}2ܫFQ&JHŽ*,#lvt@Ighi/ ޴*WaTᬟx%x*:IkvJ|PIX\Ƙo٥6\ڂA6hjG9 kD]n¦ gq up=U =-3sNLFsԐF09RLB_4l}\Q<RU-i\uN'Ϸ'W*39.uZ ONgkuq!*]VoJ\o'}%`pwszbKOMըr0ũ#褱Q`rC?YOt \Y@팴!FaSR| /Jvj5<*=OYn.> }5*Š;YQBK9YPWmҝ`u8R^{|"y/vu-xxL mN)h,<EhpaȝGӸf̗ 3<44 B_d"kgwU0DvY{䗐dhh70Vl 8R&7zg ͅeob /nbȱ?ΥZPtk-V!xN[fƔOV ~^4tirhUo?rxqip4Oj+;ƷH͌OZ%;EPYF/~D͡ 6-22 tpsa^=|qn POPrjeXӸK=-$`{IC^iĤ˿%$'A#oW0/O+b7@낅{.C|ߗ "P!<,5wSpkJ5 Э䃷0\pW "9խ57~R}7 Cˢrf*(Nz8jjBמ0@+rR#ʂz_BbavVu,6%GO.w;l`HgqAfd>'Qf~hEy~[,ޫvO[5tZ:d/^$p#z^}M&ajeՃ3.4- )# Q!bz iv$ d1 ==>0Ύ%U?wB\Mܶ[OH߽܊- Y~`;MGEPhHZTȥ`.+"~rpĬBΫ4(k{Q[v/:5'Ɋ4dYnrZ3;v@`! [>i JZ,ǙRCGMi<,_}Όȃ+6.,=QڤXOR?(ZܬR*s 5;ѯWc4hVQNEu^%,<??;[g!|Qgo`z\푠P[1I56FX]}D|Ɯ- ?#L:|xpOy- ¦;,ȇy#H(.=IxX{ ".Q,YnPK'xIdz*_[h^\4sIQ Tf=XkhǖMڝ(ϻ6l=-#tV:Oaj΀&Kk P?>Zfe @]N!L]fj('&dx"BoCxoq 1U46Ŗ۽Mr"d=id2)ܞ;iOA_a7P8G`,!&oF`Ángo0.FJĦ +t/{G|WsE6QQWzC:j^s3nKj+_?@aת; ο\ҢCjƚ*16"z7ѹb D?{ݫΦխ FHoPaAn:ޠşc[l(MZVZ* :k%K(K!?\9鿰%8 *g6,{aX`aflL'frZ1nQt|ay=.yGP/X[{1<\_zpd/dC~Aϗxw=FehI&%fKB21g %6nG<:<0Hg̍E ,l;Qw0T;pI–46n{"D5ar3c_/ /lzk1rӣݎ8Q;ŵm]S)!wDΞw(~7ҫjpY?Ϸ*5BnX#&ANq5ضc)d{&Eau]ձ0"YFu ޛI=ҐBS}h&̮ǰٌ ].wSkH'cl.ђ26)EaA,5d9︼)~|͝Vkxlf'xXp=It2+m;*2Ae#.#X0PA c5[,;Uu>u =C>e9߲h\d! moRF?DVcS=,4:ݪS 4;RΔ QOׁG'5nr~NN٦B+O-VUyg@:[b+Zޥ梱txg.&*iKD$ok|Xx<RQ5_C9̞T}28Bts>E:ĊqAqyVmsTk?@h.G ϸMYMC^%B?DOB^@%|pA{4b0]Sc.O8~j`b'vRST%^@'IUs, Lsjj&VTi}]>g ~_[AUH|wE&^22[j;:H/&.PxVdD~}dtcW%'M9SF}z Vq GY+Ó .mLz-I+bY$Z4gTK1ΜgmT{y[%c9y=U^iĿ>Uo+w#7IÙ&/fk@Q&MmWslem(v<_L9.{ t7<)8Al&A{}|#ȗa|yR1 kp);Q=\7ʭx+r_%q'c|_ԇBnK:f(;>! AaUk%&(\ӆV,?1큭`8_r,[4B5~86)~q?rО<@isG07 B}Bж1gT{?ߤ{x:b^Rۮ w>Z6?siD w艀{۾sל8^B?$XFu"{v\ Hk\VΟ\3%[[ǼŽ-X#)ea@ǀUVQQg4}R=L <^PCEB(zwp0'P4 Ga>;3Q~߄R If@0Yʣy6G|T7rd}(As BX~-jNV6_:88 __WSZw/HU/5Qy!&w[DSXI,}Gqf |UtztKBeT !\EڿԪ=ƦCPl{2V:0'tU-*%0FցGw\_gqfbbjzߔ*gj=E6#L̷iZ|+B mam#ʤnebH# ;f1,w}"z ^fI}ܚl$,ءi>/EXD7"hE=sJ'T*;\lVUetu%3!{) P} ib%̍Ga>呭c%uhqIZw3{ze܈tx-LClҷO17U]:#m$f|z"L_z>:mLL^"@ 컆 (h tBDꌠs2?Mr-tIE{LJ~O _ꓽ:="kF TÙiTe_<*/&1H;i,Ҙg/=Ƀϒd™e@>AA}hhi,fq&te)vj9'CgKĎraK)޺᠅(Vfmdʢ9Q-δR1g*1mTxiD^BL~6dO[q7AGw .!EhI2 b&B蚧U o*ty]r*WxPY_"ǽBo ItKhmC-P;u *.)\k,;X~XVlH=p 8.&pF"$̨2*MFBxSD~P^\9TY_S 4@P@#Pͭd-4Ri;u!F9_w=BN{An#ۏmw8i^(4fph&%kW4mc6[XJH$} # MAG pXK^DKbMmUI89>rW/OBk4ݫo*p[ X;n[VKR,^M}3 LO1Xnus)$TV%D6ځ'6v=$qÒ^,FX^$=|xHd!FxܦYuHA5֓]:*S*j1oXESI0[!u<YF :m4Y79: ^3 ?ߢ'blP5NZoڏC,PtZ+v(lv2!o[3™3lG*u&|2(8^Y9hTf2g8.jl*nG k @jOCKʝ(*kL+{ щ[|膼" E(z3B+'Yp,w #W-Ӕ@Vp6WG;}i@%M޼J9#] ٪M#T x.Z  7S G^ n.Q,HR)LPy. ݓgtҔ^6,I?Qkv1|, ^|ԟj>;[e7AEn@mE'`N)|FJ &kg;XkyN/g8ZSxx䎊4׋gf<$, СsŁ|. ya}ݪ_>OXAo,o۬{Kh)qru/a#Нzw92 v6SuiQW$<̋][EG\Rd:?}lf_q{ ?B(3z5 GĶߖV4S^K>qƦS{iu۸թNP2[u 34zDuM/-!r:閗%}`!/_ﳞWVtFXR;a3qPGTP2@H#BT,V88V=,Fgоoeo8!p?8  @+Yhԙ- gۗ<'p@QU±F4c5Br J<&蛔)#>?^]< ;|:`"yg@ wc%Ex uq>5򤺨$eϴjƺrꇋnt\Śű,9@sODQ!vvJX0LFNA% ̈́֩sۂn,*LԮ\F,a"0}߮W'OFNc? %fORoԂ+G؟D$_gqJ dW^ͅ5yVb=,P*HJV뷞xFSԁWHJG[)S 8<\ HnY)c .Mz%{m2I.sc=sߵB~>XzMz.ikb*W5㯜[iXF#5M/V{1̾k+gn^sv y :(*/JlU]MyS9 (bG%yUrrD)@nAGCw=dF qU8UM F42^P&S-,蝙܀XʵT|9 5{cAUKG~g#9o265" NfO S[JRCb3XXYj^aNZ{8{8j0RInd]\nU;`5uoaj +{O܉v McڰɬvA5؜yjU|G%cn:\aUr#LX@ZsGZ/NKɒp<4w+21f̓2DX&w}^g2>hkxENa&˃OIE5Aq !!{"!}V cludd7eT}H!` U$W8Q"̺xb7;WyU;d6oW~C2C(ڭ|>6A @`#~Ƴt_T19FYq0>luIʚn%hzi '|fھfr~BHkk=s+"N%9RGTT}S'AېwN wv͸14 OlZ(8G 6gZ09:55( HާڌqF;}Hm!nrA(RuA'?NM}=mIEb9 cbWHF>|gŚ%,/RF.rIɔ"tPve]*sc~)R%f$弢TOpV_|]kDŽu3 ^s'ɖWoO\Jzp5íYW榻 WeBϨT]=Q _)w0oLi<1-2_5U"Tog1M?ۯt.JR䃀P!YsG[ǥKmb$Yn +W+BnZ6W42sDetL(õ>oCߋMKṠp3@%bdG4{EgM˴eӾLljhe9O>xz{Dlw1DAdW\@Z/wˠ}Dݟ g%s캐+q%5'j7 9W.&k/ [Ow"3~dTKTI '-C_/ʓ4n/j8m^'&"O5F5|&S6rvZ v l*_d##r܅OMi*W5z+(^;͍a4ii2 wz+<Y۬ګR8ʯ{[{*3?khy׆>&MQ \. V]}* EZJS~o ]ihh1;įcp :yĖg^%M:0-vοkW(4\Vt-jXcI{Ś;q]P|#O)¶ bʲteB9+Ɣ|)6L5*,%.W$Bm0oA؇o`,F# 9zVy+y= a(qImmí12G|+Q{s{GMG3:>`WmDK:: 2vq D3~yr{G_}\^0\0bW+;wݟ/ˏW̓FRJvŃI(vn4: vò^rۿ)*4ɶٴm9NaN\-" 1ks"% I.,H'9W $uKa<($${51 6cC]_A7F5 ?<"ڠc=Iyf~wݤbɱ~&5b~p#[׭yfË=crNH)?nΞx qvX<7^mizz. CN)UI<Y\ $F`s[Oyw4_SNJex RL*^Y%~PrS^ɵkܖнk3"\UvQERA&Jx6Y՞ςEd5Meǘ,`(~}}}P#Ўџl1Tb: ݦ?1kjyjNIOO DZ0(M@Z! vn=LVZ_I:M*eQOqں0TPr՜M}ga(ĬB,:`);6'hAL:Y GK],>K(8!!HG =0>ܰ2qJ3G;:I,l ˓_|ݻ?C{3|47GW u7 k[?4kp(P9ZUGn_;fPF |M&z`(}^8YG1BE^,^w)TFhRPRGV$=7"$]/iwv0 0(f#a +&ӭ1ꎄ=!`$e5RS_;y=fP _Tk5eԆrC+`V|[ GֺBh$W ^=AYgif0 {ҬeVݷBwrg ?J|eѷGNnV,fG:"3#}*$q^TPNic@lz,  XDLv%\K=JeF]v(=xX'[,V $I y)KyܜlW0/ y4I(g1Oy}``, yqV4xǨŴT7^uAJ81c)-;M&@RF#d}5}.zb3 ;®S].9]N˕,,>^VtT1GB}UqRv%:lܯ/&q۪)v=twf+< }U^ُK&ܜf>u3V\ɚK;fٔK,qm4`pyd1wI t_7hZjnSIa#DrO*_ΊQj8Q #8- ~a̤iX=6m e{Zki:g"j5ǂSXSKdCfHh&Cޤ, . ׊c5[>B}Tw{ώ"ֵ|Wk_oKq{֫ꈷʬNwTV!P_|̜b='wg:|$״oz"4PlNj΂`-[,BŜs 򰀡2Rvoc숸/PbAK a 3Dk̾e}˨;)*bog:kdŢX+'y>Rw%vQC$۴0mIw`-]+~eo{s8AR͏$c8bFN.}<ZQezn Z sPWE>:C V%0+֪1*ߥ-^5spZ!"_ x.K `ky/lO KNNOD5- gf@Wreˣ":=ߌ5n_fka@?4RdjwHw:2 ܯ MqIy%f<و(Wx"R"x[IMV!kYWIPj2$> CL="ѨYVɔ =be#oC4"K?ĽI$^E1؆Ϭ:Vʯqo"xbq wWoбb %`3UoYx9_O]>ZL)%F88W %_T:f7f׷z_iUfX (.V-H9[xKGǹT1 # *W]S/r{~4VXI {s+h~0yX&~>, *4{).(:Ld%VK̒&c}1=N*?EoVuբ *넞F{\? ֚JSIGI}s{A&Y:yV j |P܋u d1hbMr|P2Of{Ik?J_G $j@ۆij/2I_V$̙óS)UYL{|x⩄)HSSXނeb-+9ط /3Uۭ?*F-؅=\MIVfTh3Kc܋iB_`=C0rHT8uySQmH0MH\噯hU9Z\$d"w+w}k U7 egn}LV\}.3 9p>WNU``Iq3۶,vZ"E_4,28@ɤušjD =NS~!ѥ_M jy$ r!<K |mXQ+HbJUzuHe[ًㅏ< d$m)[#&eEKTNDj1pHJrHRd~3/{HƖi7A ~cB=7hm!5 KUYUf  Sei!F6şR %rbI#~$̾Hed9W@HQ>mWw^1ړxGh8Wàq%> Ub f+99> h o!%+zQaXo4Bq‹ߗr l*voT?̇H#x342ns3oѶ gjvj#(7sr;_m=U2y&R J2<#F"] 5Zr$Gd#,ӱСǀj]*#>o"SǖA*S]6 M#~ѠAg\kxY7A0oy3? $x 9("ƎY38BOx=G!Lx^x؀8- vMnACw~ Q s Jg*HNR+}Zjillӵn2$X\5eA-h O',~X I 8L DIS>18n.Hq,t,0QE3zqe4E-HWc*;C\ jw^Q]}9*|3RA'b,"|VӎQs%m4լBF2БOQ8bԽ:G ~ZXDBEzFN9Rw,,%|?mnNn;QSSPjR2LyޠrW7s:9˴veo].>DWafKJ,sL+KQ!,j5:d[~Y\<;(|/}>^lOSv1,əSb{ DZty€S#_{d S:92K#.B:BceߴN(ᥢ:T96HN Qy|:Ì@s>xC{06*v_ V.< FZ`rb6 _˫.n|zD.,)3Ģ\||^xqxE1PSoN=^T/SS/MjG6֘A 7PǍ'h.jj{ooئHQڊo4D@_g!:pÜ0Ou.$ZL$7-VWJIޝ$9Ey*} aa-=}``A?0CSzq}Ǿ_+Ru2&`aB18ܣ_ hjoͧlFt&#,^оy6+N?*j_'֫A{ʵQXHQMfo D0&v[X 3CVhHbP[ЉUk*j6>ܼ#F\:Mk 3:IgEƠWmlcZ5 zٔh83԰b9%,?c9r~3Z8N!N"DݭN)ވd># rqSϦ#\`O(ũ47& mC2loJCUߎ'੣ (Psރ驞2hGR7QR5Sb m#Me1elKu{N+W7"n(%>8m,5eXX;>R ix-f&54?=Ԙ4am|]fۼ!k؂nJiY'*:N dM]LhPq 74`1ٲrгå`m*N⵼ Q%W+YkAEv5Ps3t#Ц7Kcp_{rRZWig!Jʘj{õu˒l߭jKχDTذJ)9Uaz\Lv"<6&$MWLB8mh|>aT#jx˳Ėas<Ut2❙l}F_ǯC$[1< YnWM\jkJ+~'ODogȼGP"wUhY=#W 㘨/eԨh*lCV`,FK:Lϩ;!vﲚ܄AnjOImI,4[Fcs·o9SXblhBse YWtl7H$K4<>?"Ї{BhY+Cz yM|q;R0lg@J2dfmD#yXژ+rE _@J85e"x݉(bCNNЊa=id^ys~ CY8̌Cֿ2BX5U; +_ˣ#Y"b}$=gS"iP|bu:$vi'ϟOr, ޲3Wjet %i*zߡn9 R%Kb÷EDsNrzc5U(g "].hWYS C\k6Tivs2+cuj4WdPonZ!>PjR7T`Ϡ|*O&&`u͔WߨL>_q|UudG=$(+L ZpѨ+ˬˡ)cxF2=Ɠ3풳2tofׂ.6h?TIFr ̘@}E~af˯Jȑz?tE~jD_:ymf΁>dnpVyb `tMP8>_/XzjC3hfj\*oʩajk?;Tn"[iNj9gV6 2sP+~f`gS𝱖QهfZ_D bM&n &YIqϷȭdmNWT =Y/g @IsiT˧; W$, p¬ƓU4u61Kbtu-;‹q a 2Y6|-9>2xĢ!i@t܊F ׻+-?J>8BC+{PzGpp(9OUںgck/,sN7e 8K}jD4pgy{֛OBYjmIfo20^"pk tF=K.pδR)KX{$8#5Zi=Uܔ`ov} rLؼ%Rq (K˸v, ˤi1Ƥe̳ϐGtrS4|Dl4GjRt 3h[>bG;cBʖXc0ܤ%R'sb-݇*?ԓ~݄=lk5N/= ٫ \oX!%B@͝5R 4{ڮrR%jC?cx6FnSs'rBO}9D-@*dY>%2c( G>PKVA 3|--ZF& :\KGvԍE6EOh@I/3*BVlz2rf*#](u/du `H,D_=g u2O]4&8-? ӑyC+]?Zqs Rb%>3٨޵I|6׌nڄRh/ 3I5_}zu̜ !a8+#N@:; HW9ƽ6 ,&(U?j DuD1zJJTH)udKdao..ֺSu\ԭȹk_iLz( ,=ؕ.,:4;eبYH#QtF=}guH='z=/C 'ӁوIzfR{1FUv Wmp;ƽ!:=޺eDJA:H $d@IwpzaaȇbYrB--?OЭ_-3:ʑVcN=PYʴI t֦ALdLTB=NW^1*V`Vn#Mƕ{gcVId|uR:IdХf =F\F7OT 2 YhT8St_-v03Yt!V(D0~|Dq1¢e6Ќ@Gbm04>*@Λh>۠.4JM5&h*1~8|L$>}@@0CT490{jw/^c['#|7*^|VȐX8d=&4+d0)/=Eľ r=KHn[. _7q PXQ,z|Q$>)!eOrk ͹Er#g{;={1BXe Jߢ󓧨!:a~ɗ^u-,Beca9l"!HIE[T3/se|޶RJ^de2`*gW_-9icjZs <(hYvC*Re@_`c^5:i 1V@Y]|bd8GǐpVG#A|5OݾSFuخ<]>=:Tm%ʼ#=,c $ع(/8UVw'ӋU*M8pۋGUҰ7+l˔cNOz( A9n0lhc^j;U;?S<[ݳ gSd>ǴykN5/Wݥ-ˡG{򧁬e/.]B`G:>^ʷ/™o)9Eg,ukB x۫R(1wck$.";`1(@]GЋŃg$_pl1&ӵDu 3+i 21aV,6ۧA8 $%vGeIdMb} r"%!Ӯ:P 8UA_JjԿS 4cg=laj>7ٽr G}Kj[[ނ@, C #o5љoS+~-G!u`7ǔKm'OvO,.[H] TeMI}1咔](u`+-If̓i+o?\bu#-=T`4N  GJMTmptΛ`EA5&C ic˂(i·1' 9 sjkV !d:4Yг~:%U&D@>a 5hr"EyojlΨ1a\1>8a!y蒺RMüi]C60X&4nL2yawx`q$T.8, k+5I!`0ۓcxXCA_N?ԞQ|PI^wU_lw(,>S,µUs&4@Z!b¥;1\OhN(( /BNZ N;Q [-iqKlVV}S+LKD622JpR m=O;~OnF!_؎E) Kx+(OY d.Q)2+FlaoR3]ޑ#I0~Uؐx?9(*Zxlu#UH#֭OlQvƱT_1|4bUt)zP+6w2~/|D-GjYrNd:;ax]l@D\zct_.ٜ63B (ix sfZ~q,,ڠs F7z}~?!G_e|X r?CG0ϗ\[3j۰Qc8ɜŪeҺF{鳋:<[x}d_2m8T3hÁr(wZvIpOrhL;t̫SvLgl6@*iܲA^Rq8M0Oo,qM kMss Ts&#Qs)cqΠckφFdrxxJ@'JYv-j2u4S*»&iSYJAE}!IExLu6[Nl &gvc6Ern֦x9>0ߋq>=l|V8LQ¦@K@.CPocH_Qh7F'R|ÔR:}_ %BlP[{f.!pxo+??5`؏ DFHĖ]N|XNW]F)ۄ6=&o+, JT$S)n Tρ\xo#PGXk9si\' T3(ܛ!aY ߭Z4.xriқÁ!anrzsډ&1cPM9^N%B$wP4P1h6`L?־S5Wbl SFgPlEjW;h7cKV|s?EDs2Y]FgV##pǨzc \ N]8~~ώF `;(c+)2XݙqA+s_Վ|ʀp Ȓ/X#&h(3 9`+c- }I±Ɩ+sHDUDi5HV`1dیƉF>R&S>LJ T:?wi׉׻ܻL^mh@W\6żM/I0Yљ~D1H-3wHkL(Nc坱o= \{~/iÉlJ/b-esJvL^82/oY P$Cc}6anB}K BjCс5=z~^}3{5%PodTTk99 $G Hx0y4O!)Ttf6xjV[a)u<&4}Q3 [vXBv;`PVA! zc 4'%̽Bk Hs%ǁ9z &$J(ˠ C+uroKv% ',5iw=FkA֣=FhhPq,OƢF>:%$T:M#>*uc,;YZ%Ol5\jc]eoֺQaoN u=s졳MdՃ'H@hy'tW~.mÊy止 8]%Ɋ[2pM< eq5WMjtk^?5g$0vorޏ4 o8 `S:Zβ18Z9Ơ$gb ܺ8D;l}*ڇ9R7eaPqYX^㭀Yє^$I;uGoflYBemkYʹv-kl;rLARw&䮳.oW+0J:i]0>crar DikS S?EFr챠0^ȗ2I2:M}aKx}E\UY.l]WA-/J(|~*iFsJ[\D b4ґd_)}64>UuC1SJP!z,?kւ¶F&I5HG f%&t3r1 9N\@֌ CLM z'?74 < NA=P;mr !a"iI0HgCIք/ˆwdj̺ëIIa N_ A%2! n٨B QQF˼dTV-o"CwfIgO TRs⻈\$.`}hGdwIR;m(7ϓ> (5uUnWaF+Hճr\mF}Ŀ RNO(\.kĆNKW)O({'Z9gU6ҷ-7eRګњ!ŗ&l[&SM~ŷx,&iq#aub%(T Jwĵϑܶ n=UocjM6Ԓ:D䘇.C{A)&<z~F.!٦W:uxdA0T~&  >?FJ'YmJՓ TNVAB>WNSS1VAQz݁ߋ 5J5d:N]_nnc|;<آRvxQb>`/p zy2CE^(<]BϷbHA_CB7$9󯩂O 1孹A=?lϡij9H5*'/HYE[#\ ҂";-p2~>C/q+ǽwگj oR|C  q;-Iy¼ހOnc Hw\C-K6D1VX傆i h'YsCho׬ έu2Z1:zW@D[p#Jwb:߀iN VQЌ'OE'ռ㍯p[ȟVvQƲӞ?x5t'6{)dp}7f#`(UڂJdvTT|Z:@[B,! :_;rHnY/ՒrK SF-SI$ishgBd*\_O@77/WMnVuKu!@Ja jy9pQ񺞹}''dn HBHO!!y>` Q$.³A^CK6Ht*wG}*flȊۓr+۽Rf~혝WR655TyLqDW`=b&²r?vkS*W6q81. 2%_y<,E+VP:'18ЙXD]ƒS6<嚬cgOM9fa(/bѶ.#+'*1 SQ%[Y]X4i=mϦ#2Wo8corvrjMZ4l#rP By}xGĿ[wǟ>gu^{+JVݬٔ .] .ѻp;; >T(JEo!vK;?`%l gw Ce,0:W)`V -&zyG+45rG5J <:~MȘDY2羅P̿ϯӲE].0HC,-h~%!1;84()욝D(%Q)9/1$$Rks\m"7)PTL_P5k&MK]YR@ >=o)$p`\ Eg[`wB=XHJ(k-4E|j~d^u3 0gt@.\+ :fֻpEi7ԍ8iʤcdĘE.$Ҕ3K$%3y *t66Y0`; ?M@eStrC[?PiMgm AWAj^J2p z mիK7~MBVqhlgt%ZD?t T/ wo?u}c|*6:-yRuN4Wţ)ܓ 0R9ŋ&|֫ҥW̝ @$x+"kxB'O1p P2g PآmU75Ҝ=_B_ݗ@hRW?ݖw|qhHA[fZlP8K^+@T @ڭRZuR'$-Ԟ; 7TbrRdCwu_w9)Gu1zidevXߠY&̋'؈^}" 6W 38S* A[p]~$⿞/*fύtDS.TS% YTSFS uo~n;N7NHJ/<6TVmJ śzZt oleHK0Z2L1p|gc sַ]ka7SI+d> pP>NfGǵN_Pߧ6XHg4J\vLuG.˟@—XآNSH6:Cn/01p1ObW4acPiqk<3971wbF0sѤ}mo,:22N.mUW=l0shYHR)" ػߛN*t 5L!(M1ޮz nӸL,O0D;.ªYt "5N )b YU;kpe=!0HS6?b;Tdu>8_?=ѹK*.;`Zb se%%Jgr>w3mNNmO UB[ڃ0 M0\ *`!зȘ8uc<.x`l}~xkE0cqKIYɂ cSL4VȧD~\>#x`9Q4'۲gG8}2/Ȃ*A;SČu6Tgӌ!E#;3Jh!ǘ+TĦLP:zI[_&g՘/q?};yZRxpW=yRijػzHD4pf?} FXݿZutu%JaFf'L BK q¾._-5]^g "⺅&h!u"m2.SepߟCKd%eiC˕~%*ItZS7k?e8.;<ʚC ?r >oAcbڈ$jK׹0Ϟha| PNC%ݩ=5WZ}r$ `\ " >:YzPh]ы>4Ƶk_z)J)c"bYHi[]Vr `29Co$鏰r12`CUvLU dԼ7)۸ӝY(uvcDHYۣdZݰ_ݏ1sF0]}[4w`ED>)S\3ի`if41CԦXcVBLs9Sb!ɖ8Y #˲m鰽,|ݑmey{)}Ԭ0 YB#BxC QO&Lz_œf!nְ0fSnTqQFFvȨ?HiVa4MhZPGhM؉yAU.ƍ02$ @iLǣVt'9 MA-Y }7 7߷]Ǯux5 4Vk-CgNCL,V-Ew/w(猊T'K>>11KIcG_Bz<ɮ`s|w1儳e^کi{e=&,@0bn׫q.K*ϯ`.k0>ȕCgP'sp͐ E}~Kfj<^'!ub\*e >#*~1t'9~[s@A]G9w+Si/k7ۆ)c OY9vI@AmQ"U7,WC@J (e+iN:([Ɲ;ٓx!6Ҕx)T0LMFHiJY!9;;,[~=oحPt姏;T&r((b'NeB6 4RQ7NQٱOO,<ԩh]-L #y';GIzƎdSw~e%O:ϝ]C[1 qc zoWwmթ!NdNGtgsٲJkH.d+w[]Z 0]{(X0ڠ 8׀,qNHqE2?kݦqnRli_1{xGԫ:/:)*noF5Z8 88}{P,-.YJԵ|R M"ke!6OWyJD.M++^lJ %+{RzZ,M6EVnm-wuSKtI&ng,,i_Xy.PMWҭ%!6:9 Bsسj6-@7DR ^:+yk%YKJqP|R"sWiގKt$f?3orb3QQ!@P5>ǣ1:n`(A`On5E` S Z\# V%|Bw@D(hAU%M;@zdM_^Bʁ&r]yȂ%+cJy%ɠSJ~e%:h8XAC'Xf3E!:WZԗu&<:jC]nMI\<;mkSۮaZtYdpq1>~zӿa-ˆB7D3E59)'B0- J$4R0!aXȼyzm|cG6]g^0 om, 9F HDxc3R\eg/j‚|Y*iIib{Bw>]ڲ&>ŧ݈F Uߊ]|q+hd$ť=Y0?ZxUM0Yg;, B1~`88SQ05g2>H=xTčÀB}tp(‘džzRqr"gTM3)5jbf[wy'bJ*f8"5U TLHvw`DZpgfycsA7٩ k_j#!!NUQ>ѫržg^ݛ"o hƪ&po pz*`*Z.{+K-߬=p]B@\ә8MϏBt;#n,XE֩L:5ܔa(2kY//~E ;fBo+ ȇ 4WRt!, ;yoRf||Vkk0L;-^Ñz%)g}Yj>PLt18ۘYap|mzB:M*|s Tj̇=P6CwP鯎ho*̵mL~HU(t;dm:%"f"P„Sp9n)\/f4OR첨O0̇EOXg)=S%1$!U|s/i=ĽTyIpex0:b(qedo z0VPF݃o*N@Zϴ&D6n]9,Zυ -=M@Z(Ch[xgDre2'z/'n-bUғXn>"~CkoEp5) R4RL}tvtBԦS*.<8masSfT lK&E1W9e2aS ,Mo;$O|eWgrw:N{3"L-'Gow{d`Bm n |g$;HԸ ElhʭAVk I>j4+G $ćW?)_/Hir2pZ(YDm2f7RékWk8f*ÍX}jG=se\q''MCZgٴWoܗӎ6 H đxloP|2ɽ?9wQ1g|=5# uixlqt/kH缿ӲKZQ0Yg'p)\')sE /`^LfZ+v*!FA^q$MH@Pl^4ɤX "5}DM\2bg䣛?pIt16oe;2PF׉Jk*zEe&GhٖfZ? 㦕eKp Z`b˪ ߘff$4nw}F[@ ]Fү'lѓ#FYT`5yte'͏{&ԾMmޝÝ!ǟR g X7gO.$/9ۙjn~w 4X`Y/mɄ<(/Sz/QZ-m.ϮSV/,Gxh\lU ; ݶg ax^Kڿ-YT.13|inGUG~1!UFg(E17 ِUI @n ±~$js\_~X}v5+[ku/+9֕iI-PZhQ#о DڙY:Pey̍GrPo\!4haioQ.7hdE !i-lQ^$ʳa4{"["M_%LKr*bzygeua Wz|R@#3N :yТh]4%Tj%Y|"1w8[ЛO= (2!V{0A~}ᔳI /Bk?_R endstream endobj 598 0 obj 143671 endobj 599 0 obj <> endobj 600 0 obj <> stream x]n8ཟBvQXO HYi@#WGt>R4uwϷ?oytnW/^}cZNy:Շo|v/yUjNi%]O| _sՖ㆔_cs^mzWmasM]ǧôڶcsS1疹EYY٘ w#rbNsmܳGn@?@?@?@?~_~_~_~_~_~_~_~_W~_W~_W~_W~_W~_W~_W~_W~_ᷚs~7~7~7~R~7~7~7~9w~w~w~w~w~w~w~tF8#Hg3ٶ l+ڲr Y,h6;сDt8. Pi|Fv +KdDTguNm-^F ̸>-AāNą,ua`ʼnALt&8eM<#art˄F{ǁN tޮLvqpvvΙK2=n=azf1OOg$@;<) bwW<}ynS~y.XG) 3,ud@ژ4͛rPvc1Kzp endstream endobj 601 0 obj <> endobj 602 0 obj << /F1 601 0 R /F2 589 0 R /F3 590 0 R /F4 596 0 R /F5 591 0 R /F6 584 0 R >> endobj 603 0 obj <> endobj 604 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 45 0 obj <>/Contents 46 0 R>> endobj 84 0 obj <>/Contents 85 0 R>> endobj 132 0 obj <>/Contents 133 0 R>> endobj 181 0 obj <>/Contents 182 0 R>> endobj 237 0 obj <>/Contents 238 0 R>> endobj 282 0 obj <>/Contents 283 0 R>> endobj 334 0 obj <>/Contents 335 0 R>> endobj 399 0 obj <>/Contents 400 0 R>> endobj 439 0 obj <>/Contents 440 0 R>> endobj 506 0 obj <>/Contents 507 0 R>> endobj 573 0 obj <>/Contents 574 0 R>> endobj 605 0 obj <> endobj 606 0 obj < /Dest[1 0 R/XYZ 56.7 634.5 0]/Parent 605 0 R/Next 607 0 R>> endobj 607 0 obj < /Dest[45 0 R/XYZ 56.7 751.8 0]/Parent 605 0 R/Prev 606 0 R/Next 608 0 R>> endobj 608 0 obj < /Dest[45 0 R/XYZ 56.7 492.7 0]/Parent 605 0 R/Prev 607 0 R/Next 609 0 R>> endobj 609 0 obj < /Dest[45 0 R/XYZ 56.7 293.3 0]/Parent 605 0 R/Prev 608 0 R/Next 622 0 R>> endobj 610 0 obj < /Dest[45 0 R/XYZ 56.7 219.6 0]/Parent 609 0 R/Next 611 0 R>> endobj 611 0 obj < /Dest[84 0 R/XYZ 56.7 624.4 0]/Parent 609 0 R/Prev 610 0 R/Next 612 0 R>> endobj 612 0 obj < /Dest[84 0 R/XYZ 56.7 379.1 0]/Parent 609 0 R/Prev 611 0 R/Next 613 0 R>> endobj 613 0 obj < /Dest[132 0 R/XYZ 56.7 564.2 0]/Parent 609 0 R/Prev 612 0 R/Next 614 0 R>> endobj 614 0 obj < /Dest[132 0 R/XYZ 56.7 166.7 0]/Parent 609 0 R/Prev 613 0 R/Next 615 0 R>> endobj 615 0 obj < /Dest[181 0 R/XYZ 56.7 359.8 0]/Parent 609 0 R/Prev 614 0 R/Next 616 0 R>> endobj 616 0 obj < /Dest[237 0 R/XYZ 56.7 705.5 0]/Parent 609 0 R/Prev 615 0 R/Next 617 0 R>> endobj 617 0 obj < /Dest[237 0 R/XYZ 56.7 137.4 0]/Parent 609 0 R/Prev 616 0 R/Next 618 0 R>> endobj 618 0 obj < /Dest[282 0 R/XYZ 56.7 511.4 0]/Parent 609 0 R/Prev 617 0 R/Next 619 0 R>> endobj 619 0 obj < /Dest[334 0 R/XYZ 56.7 468.2 0]/Parent 609 0 R/Prev 618 0 R/Next 620 0 R>> endobj 620 0 obj < /Dest[399 0 R/XYZ 56.7 592.5 0]/Parent 609 0 R/Prev 619 0 R/Next 621 0 R>> endobj 621 0 obj < /Dest[399 0 R/XYZ 56.7 477.2 0]/Parent 609 0 R/Prev 620 0 R>> endobj 622 0 obj < /Dest[399 0 R/XYZ 56.7 384.5 0]/Parent 605 0 R/Prev 609 0 R>> endobj 624 0 obj <> endobj 5 0 obj <> endobj 625 0 obj <> endobj 6 0 obj <> endobj 626 0 obj <> endobj 7 0 obj <> endobj 627 0 obj <> endobj 8 0 obj <> endobj 628 0 obj <> endobj 9 0 obj <> endobj 629 0 obj <> endobj 10 0 obj <> endobj 630 0 obj <> endobj 11 0 obj <> endobj 631 0 obj <> endobj 12 0 obj <> endobj 632 0 obj <> endobj 13 0 obj <> endobj 633 0 obj <> endobj 14 0 obj <> endobj 634 0 obj <> endobj 15 0 obj <> endobj 635 0 obj <> endobj 16 0 obj <> endobj 636 0 obj <> endobj 17 0 obj <> endobj 637 0 obj <> endobj 18 0 obj <> endobj 638 0 obj <> endobj 19 0 obj <> endobj 639 0 obj <> endobj 20 0 obj <> endobj 640 0 obj <> endobj 21 0 obj <> endobj 641 0 obj <> endobj 22 0 obj <> endobj 642 0 obj <> endobj 23 0 obj <> endobj 643 0 obj <> endobj 25 0 obj <> endobj 644 0 obj <> endobj 24 0 obj <> endobj 645 0 obj <> endobj 27 0 obj <> endobj 646 0 obj <> endobj 28 0 obj <> endobj 647 0 obj <> endobj 29 0 obj <> endobj 648 0 obj <> endobj 30 0 obj <> endobj 649 0 obj <> endobj 31 0 obj <> endobj 650 0 obj <> endobj 32 0 obj <> endobj 651 0 obj <> endobj 33 0 obj <> endobj 652 0 obj <> endobj 34 0 obj <> endobj 653 0 obj <> endobj 35 0 obj <> endobj 654 0 obj <> endobj 36 0 obj <> endobj 655 0 obj <> endobj 37 0 obj <> endobj 656 0 obj <> endobj 38 0 obj <> endobj 657 0 obj <> endobj 39 0 obj <> endobj 658 0 obj <> endobj 40 0 obj <> endobj 659 0 obj <> endobj 41 0 obj <> endobj 660 0 obj <> endobj 42 0 obj <> endobj 661 0 obj <> endobj 43 0 obj <> endobj 662 0 obj <> endobj 48 0 obj <> endobj 663 0 obj <> endobj 49 0 obj <> endobj 664 0 obj <> endobj 50 0 obj <> endobj 665 0 obj <> endobj 51 0 obj <> endobj 666 0 obj <> endobj 52 0 obj <> endobj 667 0 obj <> endobj 53 0 obj <> endobj 668 0 obj <> endobj 54 0 obj <> endobj 669 0 obj <> endobj 55 0 obj <> endobj 670 0 obj <> endobj 56 0 obj <> endobj 671 0 obj <> endobj 57 0 obj <> endobj 672 0 obj <> endobj 58 0 obj <> endobj 673 0 obj <> endobj 59 0 obj <> endobj 674 0 obj <> endobj 60 0 obj <> endobj 675 0 obj <> endobj 61 0 obj <> endobj 676 0 obj <> endobj 62 0 obj <> endobj 677 0 obj <> endobj 63 0 obj <> endobj 678 0 obj <> endobj 64 0 obj <> endobj 679 0 obj <> endobj 65 0 obj <> endobj 680 0 obj <> endobj 66 0 obj <> endobj 681 0 obj <> endobj 67 0 obj <> endobj 682 0 obj <> endobj 68 0 obj <> endobj 683 0 obj <> endobj 69 0 obj <> endobj 684 0 obj <> endobj 70 0 obj <> endobj 685 0 obj <> endobj 71 0 obj <> endobj 686 0 obj <> endobj 72 0 obj <> endobj 687 0 obj <> endobj 73 0 obj <> endobj 688 0 obj <> endobj 74 0 obj <> endobj 689 0 obj <> endobj 75 0 obj <> endobj 690 0 obj <> endobj 76 0 obj <> endobj 691 0 obj <> endobj 77 0 obj <> endobj 692 0 obj <> endobj 78 0 obj <> endobj 693 0 obj <> endobj 79 0 obj <> endobj 694 0 obj <> endobj 80 0 obj <> endobj 695 0 obj <> endobj 81 0 obj <> endobj 696 0 obj <> endobj 82 0 obj <> endobj 697 0 obj <> endobj 83 0 obj <> endobj 698 0 obj <> endobj 87 0 obj <> endobj 699 0 obj <> endobj 88 0 obj <> endobj 700 0 obj <> endobj 89 0 obj <> endobj 701 0 obj <> endobj 90 0 obj <> endobj 702 0 obj <> endobj 91 0 obj <> endobj 703 0 obj <> endobj 92 0 obj <> endobj 704 0 obj <> endobj 93 0 obj <> endobj 705 0 obj <> endobj 94 0 obj <> endobj 706 0 obj <> endobj 96 0 obj <> endobj 707 0 obj <> endobj 95 0 obj <> endobj 708 0 obj <> endobj 98 0 obj <> endobj 709 0 obj <> endobj 99 0 obj <> endobj 710 0 obj <> endobj 100 0 obj <> endobj 711 0 obj <> endobj 101 0 obj <> endobj 712 0 obj <> endobj 102 0 obj <> endobj 713 0 obj <> endobj 103 0 obj <> endobj 714 0 obj <> endobj 104 0 obj <> endobj 715 0 obj <> endobj 105 0 obj <> endobj 716 0 obj <> endobj 106 0 obj <> endobj 717 0 obj <> endobj 107 0 obj <> endobj 718 0 obj <> endobj 108 0 obj <> endobj 719 0 obj <> endobj 109 0 obj <> endobj 720 0 obj <> endobj 110 0 obj <> endobj 721 0 obj <> endobj 111 0 obj <> endobj 722 0 obj <> endobj 112 0 obj <> endobj 723 0 obj <> endobj 113 0 obj <> endobj 724 0 obj <> endobj 115 0 obj <> endobj 725 0 obj <> endobj 114 0 obj <> endobj 726 0 obj <> endobj 116 0 obj <> endobj 727 0 obj <> endobj 117 0 obj <> endobj 728 0 obj <> endobj 118 0 obj <> endobj 729 0 obj <> endobj 119 0 obj <> endobj 730 0 obj <> endobj 120 0 obj <> endobj 731 0 obj <> endobj 121 0 obj <> endobj 732 0 obj <> endobj 122 0 obj <> endobj 733 0 obj <> endobj 123 0 obj <> endobj 734 0 obj <> endobj 124 0 obj <> endobj 735 0 obj <> endobj 125 0 obj <> endobj 736 0 obj <> endobj 126 0 obj <> endobj 737 0 obj <> endobj 127 0 obj <> endobj 738 0 obj <> endobj 128 0 obj <> endobj 739 0 obj <> endobj 129 0 obj <> endobj 740 0 obj <> endobj 130 0 obj <> endobj 741 0 obj <> endobj 135 0 obj <> endobj 742 0 obj <> endobj 136 0 obj <> endobj 743 0 obj <> endobj 137 0 obj <> endobj 744 0 obj <> endobj 138 0 obj <> endobj 745 0 obj <> endobj 139 0 obj <> endobj 746 0 obj <> endobj 140 0 obj <> endobj 747 0 obj <> endobj 141 0 obj <> endobj 748 0 obj <> endobj 142 0 obj <> endobj 749 0 obj <> endobj 143 0 obj <> endobj 750 0 obj <> endobj 144 0 obj <> endobj 751 0 obj <> endobj 145 0 obj <> endobj 752 0 obj <> endobj 146 0 obj <> endobj 753 0 obj <> endobj 147 0 obj <> endobj 754 0 obj <> endobj 148 0 obj <> endobj 755 0 obj <> endobj 149 0 obj <> endobj 756 0 obj <> endobj 150 0 obj <> endobj 757 0 obj <> endobj 151 0 obj <> endobj 758 0 obj <> endobj 152 0 obj <> endobj 759 0 obj <> endobj 154 0 obj <> endobj 760 0 obj <> endobj 153 0 obj <> endobj 761 0 obj <> endobj 156 0 obj <> endobj 762 0 obj <> endobj 157 0 obj <> endobj 763 0 obj <> endobj 158 0 obj <> endobj 764 0 obj <> endobj 159 0 obj <> endobj 765 0 obj <> endobj 160 0 obj <> endobj 766 0 obj <> endobj 161 0 obj <> endobj 767 0 obj <> endobj 162 0 obj <> endobj 768 0 obj <> endobj 163 0 obj <> endobj 769 0 obj <> endobj 164 0 obj <> endobj 770 0 obj <> endobj 165 0 obj <> endobj 771 0 obj <> endobj 166 0 obj <> endobj 772 0 obj <> endobj 167 0 obj <> endobj 773 0 obj <> endobj 168 0 obj <> endobj 774 0 obj <> endobj 169 0 obj <> endobj 775 0 obj <> endobj 170 0 obj <> endobj 776 0 obj <> endobj 171 0 obj <> endobj 777 0 obj <> endobj 172 0 obj <> endobj 778 0 obj <> endobj 173 0 obj <> endobj 779 0 obj <> endobj 174 0 obj <> endobj 780 0 obj <> endobj 175 0 obj <> endobj 781 0 obj <> endobj 176 0 obj <> endobj 782 0 obj <> endobj 177 0 obj <> endobj 783 0 obj <> endobj 185 0 obj <> endobj 784 0 obj <> endobj 184 0 obj <> endobj 785 0 obj <> endobj 187 0 obj <> endobj 786 0 obj <> endobj 188 0 obj <> endobj 787 0 obj <> endobj 189 0 obj <> endobj 788 0 obj <> endobj 190 0 obj <> endobj 789 0 obj <> endobj 191 0 obj <> endobj 790 0 obj <> endobj 192 0 obj <> endobj 791 0 obj <> endobj 193 0 obj <> endobj 792 0 obj <> endobj 194 0 obj <> endobj 793 0 obj <> endobj 195 0 obj <> endobj 794 0 obj <> endobj 196 0 obj <> endobj 795 0 obj <> endobj 197 0 obj <> endobj 796 0 obj <> endobj 198 0 obj <> endobj 797 0 obj <> endobj 199 0 obj <> endobj 798 0 obj <> endobj 200 0 obj <> endobj 799 0 obj <> endobj 201 0 obj <> endobj 800 0 obj <> endobj 202 0 obj <> endobj 801 0 obj <> endobj 203 0 obj <> endobj 802 0 obj <> endobj 204 0 obj <> endobj 803 0 obj <> endobj 205 0 obj <> endobj 804 0 obj <> endobj 206 0 obj <> endobj 805 0 obj <> endobj 207 0 obj <> endobj 806 0 obj <> endobj 208 0 obj <> endobj 807 0 obj <> endobj 209 0 obj <> endobj 808 0 obj <> endobj 210 0 obj <> endobj 809 0 obj <> endobj 211 0 obj <> endobj 810 0 obj <> endobj 212 0 obj <> endobj 811 0 obj <> endobj 213 0 obj <> endobj 812 0 obj <> endobj 214 0 obj <> endobj 813 0 obj <> endobj 215 0 obj <> endobj 814 0 obj <> endobj 217 0 obj <> endobj 815 0 obj <> endobj 216 0 obj <> endobj 816 0 obj <> endobj 219 0 obj <> endobj 817 0 obj <> endobj 220 0 obj <> endobj 818 0 obj <> endobj 221 0 obj <> endobj 819 0 obj <> endobj 222 0 obj <> endobj 820 0 obj <> endobj 223 0 obj <> endobj 821 0 obj <> endobj 224 0 obj <> endobj 822 0 obj <> endobj 225 0 obj <> endobj 823 0 obj <> endobj 226 0 obj <> endobj 824 0 obj <> endobj 227 0 obj <> endobj 825 0 obj <> endobj 228 0 obj <> endobj 826 0 obj <> endobj 229 0 obj <> endobj 827 0 obj <> endobj 230 0 obj <> endobj 828 0 obj <> endobj 240 0 obj <> endobj 829 0 obj <> endobj 241 0 obj <> endobj 830 0 obj <> endobj 242 0 obj <> endobj 831 0 obj <> endobj 243 0 obj <> endobj 832 0 obj <> endobj 244 0 obj <> endobj 833 0 obj <> endobj 245 0 obj <> endobj 834 0 obj <> endobj 246 0 obj <> endobj 835 0 obj <> endobj 247 0 obj <> endobj 836 0 obj <> endobj 249 0 obj <> endobj 837 0 obj <> endobj 248 0 obj <> endobj 838 0 obj <> endobj 251 0 obj <> endobj 839 0 obj <> endobj 252 0 obj <> endobj 840 0 obj <> endobj 253 0 obj <> endobj 841 0 obj <> endobj 254 0 obj <> endobj 842 0 obj <> endobj 255 0 obj <> endobj 843 0 obj <> endobj 256 0 obj <> endobj 844 0 obj <> endobj 257 0 obj <> endobj 845 0 obj <> endobj 258 0 obj <> endobj 846 0 obj <> endobj 259 0 obj <> endobj 847 0 obj <> endobj 260 0 obj <> endobj 848 0 obj <> endobj 261 0 obj <> endobj 849 0 obj <> endobj 262 0 obj <> endobj 850 0 obj <> endobj 263 0 obj <> endobj 851 0 obj <> endobj 264 0 obj <> endobj 852 0 obj <> endobj 265 0 obj <> endobj 853 0 obj <> endobj 266 0 obj <> endobj 854 0 obj <> endobj 267 0 obj <> endobj 855 0 obj <> endobj 268 0 obj <> endobj 856 0 obj <> endobj 269 0 obj <> endobj 857 0 obj <> endobj 270 0 obj <> endobj 858 0 obj <> endobj 271 0 obj <> endobj 859 0 obj <> endobj 272 0 obj <> endobj 860 0 obj <> endobj 273 0 obj <> endobj 861 0 obj <> endobj 274 0 obj <> endobj 862 0 obj <> endobj 275 0 obj <> endobj 863 0 obj <> endobj 276 0 obj <> endobj 864 0 obj <> endobj 277 0 obj <> endobj 865 0 obj <> endobj 278 0 obj <> endobj 866 0 obj <> endobj 286 0 obj <> endobj 867 0 obj <> endobj 285 0 obj <> endobj 868 0 obj <> endobj 288 0 obj <> endobj 869 0 obj <> endobj 289 0 obj <> endobj 870 0 obj <> endobj 290 0 obj <> endobj 871 0 obj <> endobj 291 0 obj <> endobj 872 0 obj <> endobj 292 0 obj <> endobj 873 0 obj <> endobj 293 0 obj <> endobj 874 0 obj <> endobj 294 0 obj <> endobj 875 0 obj <> endobj 295 0 obj <> endobj 876 0 obj <> endobj 296 0 obj <> endobj 877 0 obj <> endobj 297 0 obj <> endobj 878 0 obj <> endobj 298 0 obj <> endobj 879 0 obj <> endobj 299 0 obj <> endobj 880 0 obj <> endobj 300 0 obj <> endobj 881 0 obj <> endobj 301 0 obj <> endobj 882 0 obj <> endobj 302 0 obj <> endobj 883 0 obj <> endobj 304 0 obj <> endobj 884 0 obj <> endobj 303 0 obj <> endobj 885 0 obj <> endobj 306 0 obj <> endobj 886 0 obj <> endobj 307 0 obj <> endobj 887 0 obj <> endobj 308 0 obj <> endobj 888 0 obj <> endobj 309 0 obj <> endobj 889 0 obj <> endobj 310 0 obj <> endobj 890 0 obj <> endobj 311 0 obj <> endobj 891 0 obj <> endobj 312 0 obj <> endobj 892 0 obj <> endobj 313 0 obj <> endobj 893 0 obj <> endobj 314 0 obj <> endobj 894 0 obj <> endobj 315 0 obj <> endobj 895 0 obj <> endobj 316 0 obj <> endobj 896 0 obj <> endobj 317 0 obj <> endobj 897 0 obj <> endobj 318 0 obj <> endobj 898 0 obj <> endobj 319 0 obj <> endobj 899 0 obj <> endobj 320 0 obj <> endobj 900 0 obj <> endobj 321 0 obj <> endobj 901 0 obj <> endobj 322 0 obj <> endobj 902 0 obj <> endobj 323 0 obj <> endobj 903 0 obj <> endobj 324 0 obj <> endobj 904 0 obj <> endobj 325 0 obj <> endobj 905 0 obj <> endobj 326 0 obj <> endobj 906 0 obj <> endobj 327 0 obj <> endobj 907 0 obj <> endobj 337 0 obj <> endobj 908 0 obj <> endobj 338 0 obj <> endobj 909 0 obj <> endobj 339 0 obj <> endobj 910 0 obj <> endobj 340 0 obj <> endobj 911 0 obj <> endobj 341 0 obj <> endobj 912 0 obj <> endobj 342 0 obj <> endobj 913 0 obj <> endobj 343 0 obj <> endobj 914 0 obj <> endobj 344 0 obj <> endobj 915 0 obj <> endobj 345 0 obj <> endobj 916 0 obj <> endobj 346 0 obj <> endobj 917 0 obj <> endobj 347 0 obj <> endobj 918 0 obj <> endobj 348 0 obj <> endobj 919 0 obj <> endobj 349 0 obj <> endobj 920 0 obj <> endobj 350 0 obj <> endobj 921 0 obj <> endobj 351 0 obj <> endobj 922 0 obj <> endobj 352 0 obj <> endobj 923 0 obj <> endobj 353 0 obj <> endobj 924 0 obj <> endobj 354 0 obj <> endobj 925 0 obj <> endobj 355 0 obj <> endobj 926 0 obj <> endobj 356 0 obj <> endobj 927 0 obj <> endobj 357 0 obj <> endobj 928 0 obj <> endobj 358 0 obj <> endobj 929 0 obj <> endobj 359 0 obj <> endobj 930 0 obj <> endobj 360 0 obj <> endobj 931 0 obj <> endobj 361 0 obj <> endobj 932 0 obj <> endobj 362 0 obj <> endobj 933 0 obj <> endobj 363 0 obj <> endobj 934 0 obj <> endobj 364 0 obj <> endobj 935 0 obj <> endobj 365 0 obj <> endobj 936 0 obj <> endobj 367 0 obj <> endobj 937 0 obj <> endobj 369 0 obj <> endobj 938 0 obj <> endobj 366 0 obj <> endobj 939 0 obj <> endobj 371 0 obj <> endobj 940 0 obj <> endobj 372 0 obj <> endobj 941 0 obj <> endobj 373 0 obj <> endobj 942 0 obj <> endobj 374 0 obj <> endobj 943 0 obj <> endobj 375 0 obj <> endobj 944 0 obj <> endobj 379 0 obj <> endobj 378 0 obj <> endobj 377 0 obj <> endobj 376 0 obj <> endobj 945 0 obj <> endobj 380 0 obj <> endobj 946 0 obj <> endobj 381 0 obj <> endobj 947 0 obj <> endobj 382 0 obj <> endobj 948 0 obj <> endobj 386 0 obj <> endobj 385 0 obj <> endobj 384 0 obj <> endobj 383 0 obj <> endobj 949 0 obj <> endobj 387 0 obj <> endobj 950 0 obj <> endobj 388 0 obj <> endobj 951 0 obj <> endobj 389 0 obj <> endobj 952 0 obj <> endobj 390 0 obj <> endobj 953 0 obj <> endobj 391 0 obj <> endobj 954 0 obj <> endobj 392 0 obj <> endobj 955 0 obj <> endobj 402 0 obj <> endobj 956 0 obj <> endobj 403 0 obj <> endobj 957 0 obj <> endobj 404 0 obj <> endobj 958 0 obj <> endobj 405 0 obj <> endobj 959 0 obj <> endobj 406 0 obj <> endobj 960 0 obj <> endobj 407 0 obj <> endobj 961 0 obj <> endobj 408 0 obj <> endobj 962 0 obj <> endobj 409 0 obj <> endobj 963 0 obj <> endobj 410 0 obj <> endobj 964 0 obj <> endobj 411 0 obj <> endobj 965 0 obj <> endobj 412 0 obj <> endobj 966 0 obj <> endobj 413 0 obj <> endobj 967 0 obj <> endobj 414 0 obj <> endobj 968 0 obj <> endobj 415 0 obj <> endobj 969 0 obj <> endobj 416 0 obj <> endobj 970 0 obj <> endobj 417 0 obj <> endobj 971 0 obj <> endobj 418 0 obj <> endobj 972 0 obj <> endobj 419 0 obj <> endobj 973 0 obj <> endobj 420 0 obj <> endobj 974 0 obj <> endobj 421 0 obj <> endobj 975 0 obj <> endobj 422 0 obj <> endobj 976 0 obj <> endobj 423 0 obj <> endobj 977 0 obj <> endobj 424 0 obj <> endobj 978 0 obj <> endobj 425 0 obj <> endobj 979 0 obj <> endobj 426 0 obj <> endobj 980 0 obj <> endobj 427 0 obj <> endobj 981 0 obj <> endobj 428 0 obj <> endobj 982 0 obj <> endobj 429 0 obj <> endobj 983 0 obj <> endobj 431 0 obj <> endobj 984 0 obj <> endobj 430 0 obj <> endobj 985 0 obj <> endobj 433 0 obj <> endobj 986 0 obj <> endobj 434 0 obj <> endobj 987 0 obj <> endobj 435 0 obj <> endobj 988 0 obj <> endobj 436 0 obj <> endobj 989 0 obj <> endobj 437 0 obj <> endobj 990 0 obj <> endobj 442 0 obj <> endobj 991 0 obj <> endobj 443 0 obj <> endobj 992 0 obj <> endobj 444 0 obj <> endobj 993 0 obj <> endobj 445 0 obj <> endobj 994 0 obj <> endobj 446 0 obj <> endobj 995 0 obj <> endobj 447 0 obj <> endobj 996 0 obj <> endobj 448 0 obj <> endobj 997 0 obj <> endobj 449 0 obj <> endobj 998 0 obj <> endobj 450 0 obj <> endobj 999 0 obj <> endobj 451 0 obj <> endobj 1000 0 obj <> endobj 452 0 obj <> endobj 1001 0 obj <> endobj 453 0 obj <> endobj 1002 0 obj <> endobj 454 0 obj <> endobj 1003 0 obj <> endobj 455 0 obj <> endobj 1004 0 obj <> endobj 456 0 obj <> endobj 1005 0 obj <> endobj 457 0 obj <> endobj 1006 0 obj <> endobj 458 0 obj <> endobj 1007 0 obj <> endobj 459 0 obj <> endobj 1008 0 obj <> endobj 460 0 obj <> endobj 1009 0 obj <> endobj 461 0 obj <> endobj 1010 0 obj <> endobj 462 0 obj <> endobj 1011 0 obj <> endobj 463 0 obj <> endobj 1012 0 obj <> endobj 464 0 obj <> endobj 1013 0 obj <> endobj 465 0 obj <> endobj 1014 0 obj <> endobj 466 0 obj <> endobj 1015 0 obj <> endobj 467 0 obj <> endobj 1016 0 obj <> endobj 468 0 obj <> endobj 1017 0 obj <> endobj 469 0 obj <> endobj 1018 0 obj <> endobj 470 0 obj <> endobj 1019 0 obj <> endobj 471 0 obj <> endobj 1020 0 obj <> endobj 472 0 obj <> endobj 1021 0 obj <> endobj 473 0 obj <> endobj 1022 0 obj <> endobj 474 0 obj <> endobj 1023 0 obj <> endobj 475 0 obj <> endobj 1024 0 obj <> endobj 476 0 obj <> endobj 1025 0 obj <> endobj 477 0 obj <> endobj 1026 0 obj <> endobj 478 0 obj <> endobj 1027 0 obj <> endobj 479 0 obj <> endobj 1028 0 obj <> endobj 480 0 obj <> endobj 1029 0 obj <> endobj 481 0 obj <> endobj 1030 0 obj <> endobj 482 0 obj <> endobj 1031 0 obj <> endobj 483 0 obj <> endobj 1032 0 obj <> endobj 484 0 obj <> endobj 1033 0 obj <> endobj 485 0 obj <> endobj 1034 0 obj <> endobj 486 0 obj <> endobj 1035 0 obj <> endobj 487 0 obj <> endobj 1036 0 obj <> endobj 488 0 obj <> endobj 1037 0 obj <> endobj 489 0 obj <> endobj 1038 0 obj <> endobj 490 0 obj <> endobj 1039 0 obj <> endobj 491 0 obj <> endobj 1040 0 obj <> endobj 492 0 obj <> endobj 1041 0 obj <> endobj 493 0 obj <> endobj 1042 0 obj <> endobj 494 0 obj <> endobj 1043 0 obj <> endobj 495 0 obj <> endobj 1044 0 obj <> endobj 496 0 obj <> endobj 1045 0 obj <> endobj 497 0 obj <> endobj 1046 0 obj <> endobj 498 0 obj <> endobj 1047 0 obj <> endobj 499 0 obj <> endobj 1048 0 obj <> endobj 500 0 obj <> endobj 1049 0 obj <> endobj 501 0 obj <> endobj 1050 0 obj <> endobj 502 0 obj <> endobj 1051 0 obj <> endobj 503 0 obj <> endobj 1052 0 obj <> endobj 504 0 obj <> endobj 1053 0 obj <> endobj 505 0 obj <> endobj 1054 0 obj <> endobj 509 0 obj <> endobj 1055 0 obj <> endobj 510 0 obj <> endobj 1056 0 obj <> endobj 511 0 obj <> endobj 1057 0 obj <> endobj 512 0 obj <> endobj 1058 0 obj <> endobj 513 0 obj <> endobj 1059 0 obj <> endobj 514 0 obj <> endobj 1060 0 obj <> endobj 515 0 obj <> endobj 1061 0 obj <> endobj 516 0 obj <> endobj 1062 0 obj <> endobj 517 0 obj <> endobj 1063 0 obj <> endobj 518 0 obj <> endobj 1064 0 obj <> endobj 519 0 obj <> endobj 1065 0 obj <> endobj 520 0 obj <> endobj 1066 0 obj <> endobj 521 0 obj <> endobj 1067 0 obj <> endobj 522 0 obj <> endobj 1068 0 obj <> endobj 523 0 obj <> endobj 1069 0 obj <> endobj 524 0 obj <> endobj 1070 0 obj <> endobj 525 0 obj <> endobj 1071 0 obj <> endobj 526 0 obj <> endobj 1072 0 obj <> endobj 527 0 obj <> endobj 1073 0 obj <> endobj 528 0 obj <> endobj 1074 0 obj <> endobj 529 0 obj <> endobj 1075 0 obj <> endobj 530 0 obj <> endobj 1076 0 obj <> endobj 531 0 obj <> endobj 1077 0 obj <> endobj 532 0 obj <> endobj 1078 0 obj <> endobj 533 0 obj <> endobj 1079 0 obj <> endobj 534 0 obj <> endobj 1080 0 obj <> endobj 535 0 obj <> endobj 1081 0 obj <> endobj 536 0 obj <> endobj 1082 0 obj <> endobj 537 0 obj <> endobj 1083 0 obj <> endobj 538 0 obj <> endobj 1084 0 obj <> endobj 539 0 obj <> endobj 1085 0 obj <> endobj 540 0 obj <> endobj 1086 0 obj <> endobj 541 0 obj <> endobj 1087 0 obj <> endobj 542 0 obj <> endobj 1088 0 obj <> endobj 543 0 obj <> endobj 1089 0 obj <> endobj 544 0 obj <> endobj 1090 0 obj <> endobj 545 0 obj <> endobj 1091 0 obj <> endobj 546 0 obj <> endobj 1092 0 obj <> endobj 547 0 obj <> endobj 1093 0 obj <> endobj 548 0 obj <> endobj 1094 0 obj <> endobj 549 0 obj <> endobj 1095 0 obj <> endobj 550 0 obj <> endobj 1096 0 obj <> endobj 551 0 obj <> endobj 1097 0 obj <> endobj 552 0 obj <> endobj 1098 0 obj <> endobj 553 0 obj <> endobj 1099 0 obj <> endobj 554 0 obj <> endobj 1100 0 obj <> endobj 555 0 obj <> endobj 1101 0 obj <> endobj 556 0 obj <> endobj 1102 0 obj <> endobj 557 0 obj <> endobj 1103 0 obj <> endobj 558 0 obj <> endobj 1104 0 obj <> endobj 559 0 obj <> endobj 1105 0 obj <> endobj 560 0 obj <> endobj 1106 0 obj <> endobj 561 0 obj <> endobj 1107 0 obj <> endobj 562 0 obj <> endobj 1108 0 obj <> endobj 563 0 obj <> endobj 1109 0 obj <> endobj 564 0 obj <> endobj 1110 0 obj <> endobj 565 0 obj <> endobj 1111 0 obj <> endobj 566 0 obj <> endobj 1112 0 obj <> endobj 567 0 obj <> endobj 1113 0 obj <> endobj 568 0 obj <> endobj 1114 0 obj <> endobj 569 0 obj <> endobj 1115 0 obj <> endobj 570 0 obj <> endobj 1116 0 obj <> endobj 571 0 obj <> endobj 1117 0 obj <> endobj 572 0 obj <> endobj 1118 0 obj <> endobj 576 0 obj <> endobj 1119 0 obj <> endobj 577 0 obj <> endobj 1120 0 obj <> endobj 578 0 obj <> endobj 4 0 obj <> endobj 623 0 obj <> endobj 1121 0 obj <> endobj 579 0 obj <> endobj 1122 0 obj <> >> endobj 1123 0 obj < /Producer /CreationDate(D:20070323105144+01'00')>> endobj xref 0 1124 0000000000 65535 f 0000538358 00000 n 0000000019 00000 n 0000002444 00000 n 0000613839 00000 n 0000543270 00000 n 0000543416 00000 n 0000543562 00000 n 0000543708 00000 n 0000543854 00000 n 0000544001 00000 n 0000544148 00000 n 0000544279 00000 n 0000544410 00000 n 0000544541 00000 n 0000544672 00000 n 0000544804 00000 n 0000544936 00000 n 0000545068 00000 n 0000545200 00000 n 0000545340 00000 n 0000545488 00000 n 0000545636 00000 n 0000545768 00000 n 0000546129 00000 n 0000545957 00000 n 0000002465 00000 n 0000546281 00000 n 0000546429 00000 n 0000546577 00000 n 0000546709 00000 n 0000546841 00000 n 0000546973 00000 n 0000547105 00000 n 0000547237 00000 n 0000547369 00000 n 0000547501 00000 n 0000547633 00000 n 0000547765 00000 n 0000547913 00000 n 0000548045 00000 n 0000548193 00000 n 0000548325 00000 n 0000548473 00000 n 0000005709 00000 n 0000538521 00000 n 0000005731 00000 n 0000008119 00000 n 0000548605 00000 n 0000548753 00000 n 0000548902 00000 n 0000549050 00000 n 0000549198 00000 n 0000549330 00000 n 0000549462 00000 n 0000549594 00000 n 0000549742 00000 n 0000549874 00000 n 0000550006 00000 n 0000550139 00000 n 0000550288 00000 n 0000550437 00000 n 0000550570 00000 n 0000550719 00000 n 0000550869 00000 n 0000551018 00000 n 0000551151 00000 n 0000551284 00000 n 0000551417 00000 n 0000551550 00000 n 0000551683 00000 n 0000551832 00000 n 0000551981 00000 n 0000552131 00000 n 0000552280 00000 n 0000552430 00000 n 0000552579 00000 n 0000552728 00000 n 0000552861 00000 n 0000552994 00000 n 0000553127 00000 n 0000553276 00000 n 0000553409 00000 n 0000553542 00000 n 0000538686 00000 n 0000008141 00000 n 0000009767 00000 n 0000553675 00000 n 0000553807 00000 n 0000553939 00000 n 0000554071 00000 n 0000554203 00000 n 0000554335 00000 n 0000554467 00000 n 0000554599 00000 n 0000554958 00000 n 0000554786 00000 n 0000009789 00000 n 0000555111 00000 n 0000555260 00000 n 0000555409 00000 n 0000555543 00000 n 0000555677 00000 n 0000555811 00000 n 0000555961 00000 n 0000556095 00000 n 0000556245 00000 n 0000556379 00000 n 0000556529 00000 n 0000556663 00000 n 0000556813 00000 n 0000556947 00000 n 0000557097 00000 n 0000557248 00000 n 0000557612 00000 n 0000557437 00000 n 0000557767 00000 n 0000557917 00000 n 0000558051 00000 n 0000558185 00000 n 0000558319 00000 n 0000558469 00000 n 0000558603 00000 n 0000558737 00000 n 0000558871 00000 n 0000559021 00000 n 0000559155 00000 n 0000559289 00000 n 0000559423 00000 n 0000559573 00000 n 0000559707 00000 n 0000013890 00000 n 0000538851 00000 n 0000013913 00000 n 0000015135 00000 n 0000559841 00000 n 0000559975 00000 n 0000560125 00000 n 0000560275 00000 n 0000560425 00000 n 0000560559 00000 n 0000560693 00000 n 0000560827 00000 n 0000560961 00000 n 0000561095 00000 n 0000561229 00000 n 0000561364 00000 n 0000561499 00000 n 0000561634 00000 n 0000561769 00000 n 0000561912 00000 n 0000562064 00000 n 0000562215 00000 n 0000562574 00000 n 0000562398 00000 n 0000015158 00000 n 0000562730 00000 n 0000562881 00000 n 0000563016 00000 n 0000563151 00000 n 0000563286 00000 n 0000563437 00000 n 0000563572 00000 n 0000563707 00000 n 0000563842 00000 n 0000563977 00000 n 0000564112 00000 n 0000564247 00000 n 0000564382 00000 n 0000564517 00000 n 0000564652 00000 n 0000564787 00000 n 0000564922 00000 n 0000565057 00000 n 0000565192 00000 n 0000565327 00000 n 0000565478 00000 n 0000565630 00000 n 0000018304 00000 n 0000018327 00000 n 0000018572 00000 n 0000539018 00000 n 0000018593 00000 n 0000019857 00000 n 0000565980 00000 n 0000565821 00000 n 0000023401 00000 n 0000566136 00000 n 0000566286 00000 n 0000566420 00000 n 0000566554 00000 n 0000566688 00000 n 0000566838 00000 n 0000566972 00000 n 0000567106 00000 n 0000567240 00000 n 0000567374 00000 n 0000567509 00000 n 0000567644 00000 n 0000567779 00000 n 0000567914 00000 n 0000568049 00000 n 0000568184 00000 n 0000568319 00000 n 0000568454 00000 n 0000568589 00000 n 0000568724 00000 n 0000568859 00000 n 0000568994 00000 n 0000569129 00000 n 0000569264 00000 n 0000569399 00000 n 0000569534 00000 n 0000569669 00000 n 0000569820 00000 n 0000569972 00000 n 0000570339 00000 n 0000570163 00000 n 0000019880 00000 n 0000570495 00000 n 0000570646 00000 n 0000570781 00000 n 0000570916 00000 n 0000571051 00000 n 0000571202 00000 n 0000571337 00000 n 0000571488 00000 n 0000571623 00000 n 0000571774 00000 n 0000571925 00000 n 0000572060 00000 n 0000023114 00000 n 0000023137 00000 n 0000023380 00000 n 0000027352 00000 n 0000027375 00000 n 0000027633 00000 n 0000539185 00000 n 0000027654 00000 n 0000029110 00000 n 0000572195 00000 n 0000572329 00000 n 0000572463 00000 n 0000572597 00000 n 0000572731 00000 n 0000572865 00000 n 0000573015 00000 n 0000573166 00000 n 0000573533 00000 n 0000573358 00000 n 0000029133 00000 n 0000573689 00000 n 0000573839 00000 n 0000573974 00000 n 0000574109 00000 n 0000574244 00000 n 0000574395 00000 n 0000574530 00000 n 0000574665 00000 n 0000574800 00000 n 0000574951 00000 n 0000575086 00000 n 0000575221 00000 n 0000575356 00000 n 0000575507 00000 n 0000575642 00000 n 0000575793 00000 n 0000575944 00000 n 0000576079 00000 n 0000576214 00000 n 0000576349 00000 n 0000576484 00000 n 0000576619 00000 n 0000576754 00000 n 0000576889 00000 n 0000577024 00000 n 0000577159 00000 n 0000577310 00000 n 0000577462 00000 n 0000038082 00000 n 0000038105 00000 n 0000038426 00000 n 0000539352 00000 n 0000038448 00000 n 0000039983 00000 n 0000577810 00000 n 0000577651 00000 n 0000045040 00000 n 0000577966 00000 n 0000578116 00000 n 0000578250 00000 n 0000578384 00000 n 0000578518 00000 n 0000578668 00000 n 0000578818 00000 n 0000578952 00000 n 0000579086 00000 n 0000579220 00000 n 0000579355 00000 n 0000579490 00000 n 0000579625 00000 n 0000579776 00000 n 0000579928 00000 n 0000580297 00000 n 0000580121 00000 n 0000040006 00000 n 0000580453 00000 n 0000580604 00000 n 0000580739 00000 n 0000580874 00000 n 0000581009 00000 n 0000581144 00000 n 0000581295 00000 n 0000581430 00000 n 0000581581 00000 n 0000581716 00000 n 0000581867 00000 n 0000582002 00000 n 0000582153 00000 n 0000582304 00000 n 0000582439 00000 n 0000582574 00000 n 0000582709 00000 n 0000582844 00000 n 0000582995 00000 n 0000583130 00000 n 0000583265 00000 n 0000583400 00000 n 0000044732 00000 n 0000044755 00000 n 0000045019 00000 n 0000049410 00000 n 0000049433 00000 n 0000049685 00000 n 0000539519 00000 n 0000049706 00000 n 0000051147 00000 n 0000583535 00000 n 0000583669 00000 n 0000583803 00000 n 0000583937 00000 n 0000584071 00000 n 0000584205 00000 n 0000584339 00000 n 0000584473 00000 n 0000584607 00000 n 0000584741 00000 n 0000584875 00000 n 0000585010 00000 n 0000585145 00000 n 0000585280 00000 n 0000585415 00000 n 0000585550 00000 n 0000585685 00000 n 0000585820 00000 n 0000585955 00000 n 0000586090 00000 n 0000586225 00000 n 0000586360 00000 n 0000586495 00000 n 0000586630 00000 n 0000586765 00000 n 0000586900 00000 n 0000587035 00000 n 0000587186 00000 n 0000587338 00000 n 0000587903 00000 n 0000587531 00000 n 0000057758 00000 n 0000587727 00000 n 0000051170 00000 n 0000588070 00000 n 0000588221 00000 n 0000588356 00000 n 0000588491 00000 n 0000588626 00000 n 0000589047 00000 n 0000588965 00000 n 0000588880 00000 n 0000588793 00000 n 0000589210 00000 n 0000589379 00000 n 0000589532 00000 n 0000589953 00000 n 0000589871 00000 n 0000589786 00000 n 0000589699 00000 n 0000590116 00000 n 0000590269 00000 n 0000590422 00000 n 0000590575 00000 n 0000590726 00000 n 0000590877 00000 n 0000057442 00000 n 0000057465 00000 n 0000057737 00000 n 0000062421 00000 n 0000062444 00000 n 0000062697 00000 n 0000539686 00000 n 0000062718 00000 n 0000064120 00000 n 0000591012 00000 n 0000591146 00000 n 0000591280 00000 n 0000591414 00000 n 0000591548 00000 n 0000591682 00000 n 0000591816 00000 n 0000591950 00000 n 0000592084 00000 n 0000592218 00000 n 0000592352 00000 n 0000592487 00000 n 0000592622 00000 n 0000592757 00000 n 0000592892 00000 n 0000593027 00000 n 0000593178 00000 n 0000593330 00000 n 0000593481 00000 n 0000593632 00000 n 0000593767 00000 n 0000593902 00000 n 0000594053 00000 n 0000594205 00000 n 0000594356 00000 n 0000594491 00000 n 0000594642 00000 n 0000594794 00000 n 0000595161 00000 n 0000594985 00000 n 0000064143 00000 n 0000595317 00000 n 0000595468 00000 n 0000595603 00000 n 0000595738 00000 n 0000595873 00000 n 0000089513 00000 n 0000539853 00000 n 0000089537 00000 n 0000090639 00000 n 0000596008 00000 n 0000596142 00000 n 0000596276 00000 n 0000596410 00000 n 0000596544 00000 n 0000596678 00000 n 0000596812 00000 n 0000596946 00000 n 0000597080 00000 n 0000597214 00000 n 0000597349 00000 n 0000597486 00000 n 0000597623 00000 n 0000597760 00000 n 0000597897 00000 n 0000598034 00000 n 0000598171 00000 n 0000598308 00000 n 0000598445 00000 n 0000598582 00000 n 0000598719 00000 n 0000598856 00000 n 0000598993 00000 n 0000599130 00000 n 0000599267 00000 n 0000599404 00000 n 0000599541 00000 n 0000599678 00000 n 0000599815 00000 n 0000599952 00000 n 0000600089 00000 n 0000600226 00000 n 0000600363 00000 n 0000600500 00000 n 0000600637 00000 n 0000600774 00000 n 0000600911 00000 n 0000601048 00000 n 0000601185 00000 n 0000601322 00000 n 0000601459 00000 n 0000601596 00000 n 0000601733 00000 n 0000601870 00000 n 0000602007 00000 n 0000602144 00000 n 0000602281 00000 n 0000602418 00000 n 0000602555 00000 n 0000602692 00000 n 0000602829 00000 n 0000602966 00000 n 0000603103 00000 n 0000603240 00000 n 0000603377 00000 n 0000603514 00000 n 0000603651 00000 n 0000603788 00000 n 0000603925 00000 n 0000604062 00000 n 0000604199 00000 n 0000604336 00000 n 0000604473 00000 n 0000604610 00000 n 0000540020 00000 n 0000090662 00000 n 0000091660 00000 n 0000604747 00000 n 0000604883 00000 n 0000605019 00000 n 0000605155 00000 n 0000605291 00000 n 0000605427 00000 n 0000605563 00000 n 0000605699 00000 n 0000605835 00000 n 0000605971 00000 n 0000606107 00000 n 0000606244 00000 n 0000606381 00000 n 0000606518 00000 n 0000606655 00000 n 0000606792 00000 n 0000606929 00000 n 0000607066 00000 n 0000607203 00000 n 0000607340 00000 n 0000607477 00000 n 0000607614 00000 n 0000607751 00000 n 0000607888 00000 n 0000608025 00000 n 0000608162 00000 n 0000608299 00000 n 0000608436 00000 n 0000608573 00000 n 0000608710 00000 n 0000608847 00000 n 0000608984 00000 n 0000609121 00000 n 0000609258 00000 n 0000609395 00000 n 0000609532 00000 n 0000609669 00000 n 0000609806 00000 n 0000609943 00000 n 0000610080 00000 n 0000610217 00000 n 0000610354 00000 n 0000610491 00000 n 0000610628 00000 n 0000610765 00000 n 0000610902 00000 n 0000611039 00000 n 0000611176 00000 n 0000611313 00000 n 0000611450 00000 n 0000611587 00000 n 0000611724 00000 n 0000611861 00000 n 0000611998 00000 n 0000612135 00000 n 0000612272 00000 n 0000612409 00000 n 0000612546 00000 n 0000612675 00000 n 0000612812 00000 n 0000612949 00000 n 0000613086 00000 n 0000613215 00000 n 0000613352 00000 n 0000540188 00000 n 0000091682 00000 n 0000091912 00000 n 0000613489 00000 n 0000613625 00000 n 0000613761 00000 n 0000621648 00000 n 0000091934 00000 n 0000092597 00000 n 0000092619 00000 n 0000092812 00000 n 0000093105 00000 n 0000093269 00000 n 0000239538 00000 n 0000239563 00000 n 0000239761 00000 n 0000240707 00000 n 0000241677 00000 n 0000241768 00000 n 0000241864 00000 n 0000389915 00000 n 0000389940 00000 n 0000390143 00000 n 0000391089 00000 n 0000392059 00000 n 0000535845 00000 n 0000535870 00000 n 0000536066 00000 n 0000537012 00000 n 0000537984 00000 n 0000538080 00000 n 0000538264 00000 n 0000540356 00000 n 0000540415 00000 n 0000540560 00000 n 0000540735 00000 n 0000540894 00000 n 0000541094 00000 n 0000541244 00000 n 0000541411 00000 n 0000541578 00000 n 0000541726 00000 n 0000541886 00000 n 0000542062 00000 n 0000542238 00000 n 0000542398 00000 n 0000542558 00000 n 0000542730 00000 n 0000542910 00000 n 0000543073 00000 n 0000617706 00000 n 0000543220 00000 n 0000543350 00000 n 0000543496 00000 n 0000543642 00000 n 0000543788 00000 n 0000543935 00000 n 0000544082 00000 n 0000544229 00000 n 0000544360 00000 n 0000544491 00000 n 0000544622 00000 n 0000544754 00000 n 0000544886 00000 n 0000545018 00000 n 0000545150 00000 n 0000545274 00000 n 0000545422 00000 n 0000545570 00000 n 0000545718 00000 n 0000545850 00000 n 0000546045 00000 n 0000546215 00000 n 0000546363 00000 n 0000546511 00000 n 0000546659 00000 n 0000546791 00000 n 0000546923 00000 n 0000547055 00000 n 0000547187 00000 n 0000547319 00000 n 0000547451 00000 n 0000547583 00000 n 0000547715 00000 n 0000547847 00000 n 0000547995 00000 n 0000548127 00000 n 0000548275 00000 n 0000548407 00000 n 0000548555 00000 n 0000548687 00000 n 0000548836 00000 n 0000548984 00000 n 0000549132 00000 n 0000549280 00000 n 0000549412 00000 n 0000549544 00000 n 0000549676 00000 n 0000549824 00000 n 0000549956 00000 n 0000550089 00000 n 0000550222 00000 n 0000550371 00000 n 0000550520 00000 n 0000550653 00000 n 0000550803 00000 n 0000550952 00000 n 0000551101 00000 n 0000551234 00000 n 0000551367 00000 n 0000551500 00000 n 0000551633 00000 n 0000551766 00000 n 0000551915 00000 n 0000552065 00000 n 0000552214 00000 n 0000552364 00000 n 0000552513 00000 n 0000552662 00000 n 0000552811 00000 n 0000552944 00000 n 0000553077 00000 n 0000553210 00000 n 0000553359 00000 n 0000553492 00000 n 0000553625 00000 n 0000553757 00000 n 0000553889 00000 n 0000554021 00000 n 0000554153 00000 n 0000554285 00000 n 0000554417 00000 n 0000554549 00000 n 0000554681 00000 n 0000554874 00000 n 0000555045 00000 n 0000555194 00000 n 0000555343 00000 n 0000555493 00000 n 0000555627 00000 n 0000555761 00000 n 0000555895 00000 n 0000556045 00000 n 0000556179 00000 n 0000556329 00000 n 0000556463 00000 n 0000556613 00000 n 0000556747 00000 n 0000556897 00000 n 0000557031 00000 n 0000557182 00000 n 0000557332 00000 n 0000557528 00000 n 0000557701 00000 n 0000557851 00000 n 0000558001 00000 n 0000558135 00000 n 0000558269 00000 n 0000558403 00000 n 0000558553 00000 n 0000558687 00000 n 0000558821 00000 n 0000558955 00000 n 0000559105 00000 n 0000559239 00000 n 0000559373 00000 n 0000559507 00000 n 0000559657 00000 n 0000559791 00000 n 0000559925 00000 n 0000560059 00000 n 0000560209 00000 n 0000560359 00000 n 0000560509 00000 n 0000560643 00000 n 0000560777 00000 n 0000560911 00000 n 0000561045 00000 n 0000561179 00000 n 0000561314 00000 n 0000561449 00000 n 0000561584 00000 n 0000561719 00000 n 0000561846 00000 n 0000561998 00000 n 0000562149 00000 n 0000562292 00000 n 0000562490 00000 n 0000562664 00000 n 0000562815 00000 n 0000562966 00000 n 0000563101 00000 n 0000563236 00000 n 0000563371 00000 n 0000563522 00000 n 0000563657 00000 n 0000563792 00000 n 0000563927 00000 n 0000564062 00000 n 0000564197 00000 n 0000564332 00000 n 0000564467 00000 n 0000564602 00000 n 0000564737 00000 n 0000564872 00000 n 0000565007 00000 n 0000565142 00000 n 0000565277 00000 n 0000565412 00000 n 0000565564 00000 n 0000565715 00000 n 0000565912 00000 n 0000566070 00000 n 0000566220 00000 n 0000566370 00000 n 0000566504 00000 n 0000566638 00000 n 0000566772 00000 n 0000566922 00000 n 0000567056 00000 n 0000567190 00000 n 0000567324 00000 n 0000567459 00000 n 0000567594 00000 n 0000567729 00000 n 0000567864 00000 n 0000567999 00000 n 0000568134 00000 n 0000568269 00000 n 0000568404 00000 n 0000568539 00000 n 0000568674 00000 n 0000568809 00000 n 0000568944 00000 n 0000569079 00000 n 0000569214 00000 n 0000569349 00000 n 0000569484 00000 n 0000569619 00000 n 0000569754 00000 n 0000569906 00000 n 0000570057 00000 n 0000570255 00000 n 0000570429 00000 n 0000570580 00000 n 0000570731 00000 n 0000570866 00000 n 0000571001 00000 n 0000571136 00000 n 0000571287 00000 n 0000571422 00000 n 0000571573 00000 n 0000571708 00000 n 0000571859 00000 n 0000572010 00000 n 0000572145 00000 n 0000572279 00000 n 0000572413 00000 n 0000572547 00000 n 0000572681 00000 n 0000572815 00000 n 0000572949 00000 n 0000573100 00000 n 0000573250 00000 n 0000573449 00000 n 0000573623 00000 n 0000573773 00000 n 0000573924 00000 n 0000574059 00000 n 0000574194 00000 n 0000574329 00000 n 0000574480 00000 n 0000574615 00000 n 0000574750 00000 n 0000574885 00000 n 0000575036 00000 n 0000575171 00000 n 0000575306 00000 n 0000575441 00000 n 0000575592 00000 n 0000575727 00000 n 0000575878 00000 n 0000576029 00000 n 0000576164 00000 n 0000576299 00000 n 0000576434 00000 n 0000576569 00000 n 0000576704 00000 n 0000576839 00000 n 0000576974 00000 n 0000577109 00000 n 0000577244 00000 n 0000577396 00000 n 0000577547 00000 n 0000577742 00000 n 0000577900 00000 n 0000578050 00000 n 0000578200 00000 n 0000578334 00000 n 0000578468 00000 n 0000578602 00000 n 0000578752 00000 n 0000578902 00000 n 0000579036 00000 n 0000579170 00000 n 0000579305 00000 n 0000579440 00000 n 0000579575 00000 n 0000579710 00000 n 0000579862 00000 n 0000580013 00000 n 0000580213 00000 n 0000580387 00000 n 0000580538 00000 n 0000580689 00000 n 0000580824 00000 n 0000580959 00000 n 0000581094 00000 n 0000581229 00000 n 0000581380 00000 n 0000581515 00000 n 0000581666 00000 n 0000581801 00000 n 0000581952 00000 n 0000582087 00000 n 0000582238 00000 n 0000582389 00000 n 0000582524 00000 n 0000582659 00000 n 0000582794 00000 n 0000582929 00000 n 0000583080 00000 n 0000583215 00000 n 0000583350 00000 n 0000583485 00000 n 0000583619 00000 n 0000583753 00000 n 0000583887 00000 n 0000584021 00000 n 0000584155 00000 n 0000584289 00000 n 0000584423 00000 n 0000584557 00000 n 0000584691 00000 n 0000584825 00000 n 0000584960 00000 n 0000585095 00000 n 0000585230 00000 n 0000585365 00000 n 0000585500 00000 n 0000585635 00000 n 0000585770 00000 n 0000585905 00000 n 0000586040 00000 n 0000586175 00000 n 0000586310 00000 n 0000586445 00000 n 0000586580 00000 n 0000586715 00000 n 0000586850 00000 n 0000586985 00000 n 0000587120 00000 n 0000587272 00000 n 0000587423 00000 n 0000587623 00000 n 0000587819 00000 n 0000588004 00000 n 0000588155 00000 n 0000588306 00000 n 0000588441 00000 n 0000588576 00000 n 0000588711 00000 n 0000589126 00000 n 0000589295 00000 n 0000589464 00000 n 0000589617 00000 n 0000590032 00000 n 0000590201 00000 n 0000590354 00000 n 0000590507 00000 n 0000590660 00000 n 0000590811 00000 n 0000590962 00000 n 0000591096 00000 n 0000591230 00000 n 0000591364 00000 n 0000591498 00000 n 0000591632 00000 n 0000591766 00000 n 0000591900 00000 n 0000592034 00000 n 0000592168 00000 n 0000592302 00000 n 0000592437 00000 n 0000592572 00000 n 0000592707 00000 n 0000592842 00000 n 0000592977 00000 n 0000593112 00000 n 0000593264 00000 n 0000593415 00000 n 0000593566 00000 n 0000593717 00000 n 0000593852 00000 n 0000593987 00000 n 0000594139 00000 n 0000594290 00000 n 0000594441 00000 n 0000594576 00000 n 0000594728 00000 n 0000594879 00000 n 0000595077 00000 n 0000595251 00000 n 0000595402 00000 n 0000595553 00000 n 0000595688 00000 n 0000595823 00000 n 0000595958 00000 n 0000596092 00000 n 0000596226 00000 n 0000596360 00000 n 0000596494 00000 n 0000596628 00000 n 0000596762 00000 n 0000596896 00000 n 0000597030 00000 n 0000597164 00000 n 0000597298 00000 n 0000597435 00000 n 0000597572 00000 n 0000597709 00000 n 0000597846 00000 n 0000597983 00000 n 0000598120 00000 n 0000598257 00000 n 0000598394 00000 n 0000598531 00000 n 0000598668 00000 n 0000598805 00000 n 0000598942 00000 n 0000599079 00000 n 0000599216 00000 n 0000599353 00000 n 0000599490 00000 n 0000599627 00000 n 0000599764 00000 n 0000599901 00000 n 0000600038 00000 n 0000600175 00000 n 0000600312 00000 n 0000600449 00000 n 0000600586 00000 n 0000600723 00000 n 0000600860 00000 n 0000600997 00000 n 0000601134 00000 n 0000601271 00000 n 0000601408 00000 n 0000601545 00000 n 0000601682 00000 n 0000601819 00000 n 0000601956 00000 n 0000602093 00000 n 0000602230 00000 n 0000602367 00000 n 0000602504 00000 n 0000602641 00000 n 0000602778 00000 n 0000602915 00000 n 0000603052 00000 n 0000603189 00000 n 0000603326 00000 n 0000603463 00000 n 0000603600 00000 n 0000603737 00000 n 0000603874 00000 n 0000604011 00000 n 0000604148 00000 n 0000604285 00000 n 0000604422 00000 n 0000604559 00000 n 0000604696 00000 n 0000604832 00000 n 0000604968 00000 n 0000605104 00000 n 0000605240 00000 n 0000605376 00000 n 0000605512 00000 n 0000605648 00000 n 0000605784 00000 n 0000605920 00000 n 0000606056 00000 n 0000606193 00000 n 0000606330 00000 n 0000606467 00000 n 0000606604 00000 n 0000606741 00000 n 0000606878 00000 n 0000607015 00000 n 0000607152 00000 n 0000607289 00000 n 0000607426 00000 n 0000607563 00000 n 0000607700 00000 n 0000607837 00000 n 0000607974 00000 n 0000608111 00000 n 0000608248 00000 n 0000608385 00000 n 0000608522 00000 n 0000608659 00000 n 0000608796 00000 n 0000608933 00000 n 0000609070 00000 n 0000609207 00000 n 0000609344 00000 n 0000609481 00000 n 0000609618 00000 n 0000609755 00000 n 0000609892 00000 n 0000610029 00000 n 0000610166 00000 n 0000610303 00000 n 0000610440 00000 n 0000610577 00000 n 0000610714 00000 n 0000610851 00000 n 0000610988 00000 n 0000611125 00000 n 0000611262 00000 n 0000611399 00000 n 0000611536 00000 n 0000611673 00000 n 0000611810 00000 n 0000611947 00000 n 0000612084 00000 n 0000612221 00000 n 0000612358 00000 n 0000612495 00000 n 0000612624 00000 n 0000612761 00000 n 0000612898 00000 n 0000613035 00000 n 0000613164 00000 n 0000613301 00000 n 0000613438 00000 n 0000613574 00000 n 0000613710 00000 n 0000617782 00000 n 0000621837 00000 n 0000621979 00000 n trailer < <4076F11A7BF1E9C94181719054314918> ] >> startxref 622168 %%EOF qtoctave-0.10.1/widgetserver/doc/tutorial/ej10.ws0000755000175000017500000000023411511434230020647 0ustar lucaslucas Esto es un ejemplo de html.
qtoctave-0.10.1/qtoctave/src/doc/images/modules_diagram.png0000644000175000017500000027404711511434227022726 0ustar lucaslucasPNG  IHDR? pHYs+wIDATx]Oh_9624!$ˇڤJH,Rrhb*CSzHbAr|H@ڤJXF?d]iWjw;yfޛ7^RZFNo}j-Ol] ~9Y.ʣu* %?m!i( hr,}uWξZߴ_VDf8T@,5+6?l?skfpSirs1u ]FB.l /ϳ_cHgҩ}vYhɋ(Ft=MHؚ |ن RQjSHUPHUPHUb%oG B1tCdNFQL& M5Mj*NhbM2O I H<6HN|Kk5;1 7"?D_x!)eH6Nw(-#S|pPmSC!#Jϖ7STǝgULߑ|* Y Ii08P@_|s~]ƌX_B+AsyډW\,,NŸX, )J_2vd _ܵ9X"nhό'H=737v 4Y;psa曙Ql+3iǨA&/YtcđH&ϲm:r/rxO&n-? Bn'@QLӹd;mذTENb=&0DZߴB:p?ͳX$ E&@:rJQ"|n/CڻcӂP("eQPj"&m \@9ٕTmI"C,^=5:}Y]S E심2gff UЬ|(A'i7*EcXF@/IjQJIG~LN֍6v5OԨEk4(tz4~vL%N&C!PB4 HߨfRʮQig$obtL(,$lQ& ydRD:idHUPH@QEQ:-u+}]`=}T՚v̷>m1h3g_mwD# WYf!=5j{ϦנOحVk(>.^7'4)?_:]𧻓?E%QzNklSUB& p- *&tTZwM+=œ󴢊:hMih5#㦿b+1V_DEԒߏXG󞉳G!`ɑw!(4VԭN(m.-gavAzx/t5'3tL}NZYfFx\R)#t|.#Bt&4`LQvLBhV_l8O;84ڠuLK#CD ;TD?I:Xz-僃t!&U҃mVﭒ׊SDm1tTOߑ>GtZG# S)v-*`l O~rt/b$H3Wд.BWB.t?0Jk}:{uv|h .vRLĔuےu Nw*cA;xtO╢k\5u_o: w HuNDML}/ 0D4$hVwњP\/K0VPCG-}.c2֨(-Ol'챕m/k񸲻pIŘ!c N Xs' 9!| sWo.{UIpffsmm j![I>a(8k}I]E3CRj%#ФnC-&$b8DOuPRג@+5Vk:Y3}~UbvC>vABdB$MBCz(x*/1D.v7GW57"7"K/2wmO7U)(}GYߪvdkPY@zh_) glAH{)Τ9Zogxc2U@4kB4(u8Kt74q}[VȤ{qѤ,{+woSbb :9?+Xߴtb@L%FR̝byh ] & T?o?nn\;La^45l&Eu+8[E9O;+fh6fgg moa?9HEN%0񀔄EMU2őhвb(j91B m 5=P!x*1Ŋ{PA>LA"b}=ύZ(, M" -:=l/o5+v_TQ iBQ8 9T%|ЌRtIMq݌UAxcK?M i4 ^ I2N#PEtб!>LdI9F hL1t*x(#90nZtRϽJ Xzܞ)\òf:? J=^p<WPA_;FH Jl`W[\ $VJ$#*# 4|"p.QzO~:IE)0#Kv'ρ l۩`Y2`w_U9Dh${3wz{ȫcpEt u@ ! $$$$DChF:< 1FZT&1$?ŐjқQҼȖԮea2HEQ29:35:@22b̃dfIˤ2yc2f]>wmVZ83͹sMm# n}#-"QDŽ vANCbh! 6Ye4Q57AdBŸF0 =gOz^8?OkbOt&8HN>?4׌~4~_hqOrpᚒ_:E93ΙK3gyrw%L=[:sDL+ Iij#]j&XB`.YONYV1Hɭz#/%Z+A_yqi2ߤIo((9rrm M"ʘ:6QBVry)L{PZ |}sA,MB)݁ @AAAPkkkc&@JL,TuqqБZ?v7[^xY[oq9Qbcʮ }söa5k/> zT܏NAAҩ4.h{ۆ'] ˔} _rVBur2d)333 >(02cSnջz_ CuުB?Oxj18qbՊ'Ry#q4j/M\MfR@b!L[CDk ilgOk 9V;8>Epb9V D/YVvW2m6kQS9fM4,N7 tV/Ld bو0lزϳq:m0aɉ_~5Y$ w+ 0+yq?h`aI <턚iygFj~2ђ3'$ &?e-463u@*dIv6Τ]iN ! $@Fn@=CW5N=Q26A AŃecދivBmk!ٹtG(TYj:h? JfG/yeF1<@}xc:SntmHu LD ՞OYCë; (4u0si)!s'(Yb.0D{${YbH! RpD9{@'ȄmWͩ":@mb47v|d#ڎO@ԥ2ᛨ&SH\<m-٣t-4.*x1"(,w7#'Ghcs!AjVqW+X!6mɚb^TYl^굣D!i.P3P$Nw@X,gYhT\` F͑˚E8s޳lK4J ,qdQK3rifuNVY2GԒo\Y\{T>`SWYjF9tblэȄYHsftij[%Zg(~TС k=:F{j֎a? ^ǃs/j)z18Z9n &paFP [ՑhTAB] 2 @T_z!YjPjCۻ6aBYZԎŠQ\@d,|q!Z-ʫ:4kTVTK r䅵N}EcswJԁȢZ4 dN.m%/յWs}s«UJL~<َmES7ed\lߙPvaSp$q$npkzOUBGKz|o] M]77#J@gm=\ht*xA(bb; ŗr:;1 _:Bda;;sg\^Oء~4YjhP" vqˠ"&e*bMڱ$FS\79vNvT%:u~5+Yg;+`”d:ΦLOtÖ\ qĹsU)ai5$ْQh0u^Bՠd*^NzOMO!VCzMȋ8 qa4[ٵR_U G]~ 0p9H@ضP'땏. XJ^bΨU#ϳ|'允d2h'o A|i-E?vN~2tsP6>.+ÑO_/h"t;,sDjLr8p) ]+ن8wNlExm{6tl-'|77NGAG;~؃džA?W;"{OZE#9"fV)yIe-Vh*SF)\J-5> R"JbU)$H 9@mQ#󴍯`S܈XL gQ ),z#FGSb{PHhl:c${2&Z!p %$i8~ܞ3Eߣq߷IGb׿䨏BS${ koQ 3CTD(e;HtZ+c$!-FMOyl:?΍vfg]$'GN?^;F wAF`:ګ |`&BGrR1iCoFQ7C?~AAO3dh6)2FUZǷЂV$tD.-R:@xKi4)7%l?nm>=ڿvqPxES}ksjƜxD(LdL~,z(-@ϽՂo.R.3`:z %|t& :~认N cbOV?4dQ][.ZYlo<^̥%2xs0nl_ۻ6Y8\ \w-:~[uʫv8w;ã'ut}e t)F &~N&~fwO!q?NT! 2\@LU \ 8NG8, `%oe }ҷ4c,IP4 "Ӏf/1~QfD咩 5t4&Rfnaqd'XÞE EpPÁ *63+5oujE}07(9 $;cj#on.m=j~K#X"UA:5XqWB#PHI ٣$DCh@ c Jk-$PhײG0o ]:@_aG$Q8ItInꅙf!P#h(Z[[s:x|tt{`8ȿ{6&%W'Zm5xJmL e Y,W}X/LD Wu㤘U$@z4_lLDɏ'9|I M~2&T4C~Q.CPQXG@L;ButF)>˪U s`ĄpctCt&"df~ӪNTRSeB8pK_(&~DRvi(u* 01!\3RB#OߏWWLe\suYz-jrEsi'q )UҤ\ȶfZl@r`:!; Ȅ6մZp9v-++U䯨pm(}tfa]&"PZ~9:)t7^7Cߢ#Y?qpwkz19e ubHqJUy~I7 tu-DGb1ؽMU j=ȸLg>mf[`3}ȏLj{h;LD c`( o{ ȥWvk*[p :qA*f}n<Ƞt:ۻ6MɎnIXۈ&""Ԟ1'oQ5$ydW9:vtMtT)wɇJ*@Gr&dr:Nj| b~3RV8Tw7wcj;a*[nASs:D6q >TRQkMc7'NOB(S.6JTgNlSv /{ h[GZǢE{Tki Mi;T@jx\@1(7wғΤxk`ix߁سl;A|T~^+ &"#7yBj`祅 4\c[hr]@S {y:i9 =)mEl`02sfpa݋)X{legѰP}L,!j D+fpT+ςb-(UGm/C̣jXk"Y "ZviE3$7`.N00mSI,>5DK/FPpsvQ+0#̎xCϽ a}'&b5<+A@T[)U5wI-EFŗJ!1Qf.}c: g &M$'A$~NSVkenWR(&Bq #0(g I>^lyBzwAqKgNvPv:eKp֨F\ޮ3.l (f&o_%_YxU^>φ8KBcji(?z鮳j#t{ #3 Jf*x֩ert "{Z07}` Љ`(1$e+=/6(J˾ z"Ӣ d,h8DJ~?E?J7P=0/RL'JF4[5H 6v{$a[.O?Jq&(ʯ#iؘJ7]M e+fϿ|3S7)H|uu5 @cyS}Zr+{|75 OHf0nPEu'P쾚 f&!4sT@ C7b=쥷u|mNLBr$f DI9ĵcSe(Y!^hcȍ՗?t:c3s(y/iRJڂݼ%"N/5 \#Ln1Wr@?(+iRvGI i;ҷ|;~?N5V zT?xlp⣉?Q@rb{f{϶psa1HY|심sP{] >=|5u\1[mE22-lu28m C J}O&@)5U^o73`,Sp&.|}R"$&gAQ EoE-=j0n:#At*op( J~魨9ve^Q'-I-K1^jp2Ki܈9Pe7&:D&OxTWi$PvkZ%Ɣ{*w J8WPBߛ/ԓg,?2tP(O4UjB5#I -<[vuI9FB$A+0}|7UT1‵$NqL~2>RЉDŽ!i'.9F/樘L$< 5XySf{ftTŝCdž,EM9}%D z؞$د$e{9`R%TxLvӎZA܍sK:AfBTSv[2@S[dP PEc:@a 2jvy׾BcG92'L$+Լה$-;oH=+z|jK͋uMESL- Ѿx C@3SWV v NPG&'n+ړ/Glh{LjC<;N'3f˛vvf˪KZe1%Pj/SXoSh!}e{ۖ|a&QX(,Xd3$%i-eಡp^Vt믭&-oh1uaW GsMn5eu꼶\@H#Z!HI4I $$$$DCh@ AH!HI4I $$$J3tFz:Ҕm0ɞnCsm :%:-${:ƸR!u !:$J;5-R\][\bH LJ B2-ڣZL@ BBd"Im4`(]!ß2/Ti*^,/x4H%_|M%[,Pn']P ~!,ܟ?V ] Oܛvv2}~ttT-ڕ/`BLyn?nkH0\D|AmLj#v/eom¡v.C$4:G` /]`h6Τ_UvjDr$ÜJ>;"°X e)0Ņ:W u@ah߅_ C)M GI:f`l%}=5K=^ASی*ruP *ӲTcܸBɸ7 %VIsWpz 9N:hmzm? h#Wg[/4ֿ{F(}{VnO+$)xIЏO2 i |Ƚ#cAx3e` LmB|'o TML~< -W!?܏gY]N5M= x? l~ C&Rf%'{ૃxjr|YJ&=A;_%s]zn0S EVY6X(QZ?ѝCdk5۸ 0[g@_{E ,db>bq'ZDj{m6 JSwMqf@Z{@#'BchS9f8'O/!w}n"jWzJ EӮN,W.h\\:sJ>&+Ve`P NPG71wu'ƒug'D >dL=;6د'q!3v/c/oVAӟ:=b9lkC/d IxsoqSǂO|I F4Ia> ^+- N؆,.òq8YMlXL^xS[> @<![˰`?oQ,vh자ɹN@ k@N_ltvЕ(;̽TbSSջy͔{ N#oC!v(p*07;{pGO>JΊv-S[J(:9Z1a?|) @`Z6АMV"{V*y]Sh* ܆8ИÒ=f@^!"!QthZڶ @ccc,i=*ʝcdG`QB%kd20U]D0{%Of6ȁ,_pHޞur_';RħXnQ8.hCI*˗f/۳+E*G$:r$Z!O @7khw VbT̠ؽ?Ώ"W^e샱{TmYLCy8!хW&`9Y Je:ク,艳C'4-va3Tpxw‚&#Z ZH#Z!HI4IF k&40\(c3ЯQ[4 &>$Jk^vw؃I4Ԥ̑D3L~2tkI\|2%$JB*#s:KśWg|OFdz0~ - 9pm:O̾dm x}I5a7frffTzfkWݬ=\VRcu! 'zv|:/ }!PWtC*7 e|St^2 D HBB0H$(o/ΗD +P8?|5W+ή[ (:66O>Y^/DtH/P`l%p54US*J~  ^ ȉ j6ʈH}QN;Q,s/&24S a& BEL:0$ ZAņ-nӷ, qi9~AA9$Ux̴8H&..) U5R͍W@qi2xl0[~¾rg;?Fj)]pHɿt&>?گ,]:k3w(K`l3NNgб!w7wm33HtbVIwwM$} AD4H[Ic |J?J( 5ǂO&n-YUq;tqiF@t=Y[M+Oߑ۳V{i-0n, 0k{DQ$K?Mݘ N+K#ϬȽ́4ZOu׎}?* (qkb`vصY9::J;|\hTS,~H/&o2Hq{l6x>ُ՜(=\B'(xRv}d۱1z={2b@l:9~ox/qS6]ޱHx5q7*I.]}Hw:_I4JoN"O4d'n;H=\S ) ͷtM?M҅_:m.sq9\U0 pqeeVYsہᝑe+2;;O|E0_ը8k܅`0l$P-+÷jOJ GDVWW~o`; ?qk6Į͓舗,4Iː ObȋS]_Mk3s7sL=D[DOB.n6شh> ɗ' CvS'?dךN!uff ?^3rϑ#h*x 4M3x5 '%+ ӕۗ`4QQBԖĉp^E".)#b7E^-1B}K85HAozNPYP$RE uQ?Ξ0,iV|dsѣq@"ĶQ+ iQ8"Hlg9r H4DЅ9pdD>TF(4kKׄm /Ӷ> @v; ^ȉ9>~žXKqPoRnh[͠A;-DsB[y``yVC1!MܦkR+jX3(VM4G9}&rj F/욇!q{39 vDɏ'+ 殸ŀ˨{n5Uch2QN,v4qt{%FQi~E&OC6OKdRPwG4^T\M+6xdž1.^0Q2-JM`-ubCƆJh8% $$8 b8B`MГF;x=irx+n𨾣΢3/T@]1HSWIt^FKӋHrh/ HBB0H$!!ahrnH$cxr%^MJ~:1iYqH$cR7S\a%gagǤYHnH$!!a2# _ZG# :  Ѥ46$:Ru;He&h*vTV&h RHx0̢j.QTR-Y$}zGY, HIh.C* fAj" s`v.5A P>BagqhwizƜZjGn8R)2l_'6|suuݠ0xl~5}]^*J< dzFsbfq2{{9.9N;<=Xrrgʒ$?;m/|;M8V#m@* c?a_L{S&M Tx:F_멹sr _c h3GNdžso}}G;xi4z{2R A*AÜdE:h]0p؛ } O&Ÿ&wvQ|oZsy PеI ǰmxffƾ}%~^-I^ mvvQu`6ӄrl3NeGY?;nZ3dD8CsVAL?;N:,/F¡oC[-bH$L*YE``cۀA f:`]r/r;WEZoW<j$tMY9S5u+lXҶR$ߏ]`v^Q r>ȍ7c@nL +$|I$YC`s7П.Nsݟςr)sNui R@ϡͧ7t:Fj`t˜_^7$cSυBYF Z!@D!g: ĥ\.4u}R81XN3KC}Ap|C x@h|5$J"LXJM;ڧ58;:2鞄nw EA; -]?ڏOhS GSpb{W,R)smm ~]Oد1c?a3|#}rIgչٙ4O##B*j.V"DzXfSs#%]2h6 GQ=qų'f ͬMQ^uC <Ȼ$^ʯť"EjtNxͯr*Ʒ~+aUD H)CQcV̕ Y@FDX}|s7cࢺЕPl%^ [K{#_CgAh"HΠ8KBHt 4C4[E;ݚ9J@sŃC`(>-+ 61f:@S4chh":%i8b-#*r}' h | (oUڇ ߴIZ:## ( І|e@=?=Nar2¸g7P@ty@Cuy(V[@*!ލ6\hw٥[K4L -Yc>tJ _VC>6RC!›}ic"+oŔ}őPUGIXK`W㻢{_lj؀b,]VɄzHT0y}i\{VED`M|3 pGK:wVIHT@Y>dۣS e$'%W:ئ?ihnN?ew7gã̓k,CE&֊)kJ}OeΪ/L HpծlCҹ333"Ry1:n`6&9>F%}5 N73M3_ʼ]mÚ_ CepB%Ff^f\^ p0 ] P=e濟܈ԔI|2(9l…hV4llG%o?۶f~u8xa-%Zߴ&%8,0X:؊4p^O +] #Fi0 Ъ+2JHT/8vZ[7S?xQQN&lOd|W(tz>t؉f姷̦S<$dLJA(#=Grjx鬒wNE>^c.:_|M&0V+ZˡU B*@?K;q^xBq@v+M+?{$4HRܡUR:4`3P)a($CmT;%C$ `#A(ЁX!P:Rw(JJb ɵcν>?}<Lj=Sdڣ/^#Ӱ L{gOp;#T ^; @C2Z9-2TO\Gޜ\ʅÜl]^Bs4T)Ss@d9" @n];r*]FD 6EAb>#O0Itu701%PZdν ҔGj^j.'shM?=7f%/a#|g}ÒO^y,w|XJQFaʡeℓ4@䅡5zKf$$ LQwosmզ?ʓp>LN .k !Tcn(܈wR xTԄ^K {߬cM~w0^qт_pU;XPs49-('ݗŨi ')GEqI}4S?tXDidgD 2,g/!=T4P? uP m#u:m<~pa=U"c#wʮ#;#$lPƱyALN(l.I`0H#u#(!q ;EȦls!Q #$i d0(l 8@JÑS<e$6)tS(hmK>` sF9eu;DlMUzr=P袣 =DmD]L%2CcSHGv@Ze/SZLB%jƑSۈU.@rUT\tJ zTFDzEG{A]VS\"@MtJ zTzv=2!TѱJ,h+PJ܅_Ռ蔗`0;qh=:~nA,lDEQ)NiRp% k[a}:iR\>߯X੥uF<$(yj\~1 >_z1Pb_,fV3='z2],H:82e8;XPD"1~c\5֌m]f4K-ZSz{ 7x/X rf-cV]]yOׇCktm婟I[qGw[]! s.u֠Ŋ59Ը!Dus/KA|!3wg Ebb\I'z^-sZy"@UϖEs~v5<\<]Y w:,XIo9ċޥ74n y^yʝxfm:ɝ>dH1ɀp%\vV|ш܍xxUj쟋EJ((/4^ !X)3)F (:`ܺ хےs<;a 4T 26FM//!PWgjv 9ѓ~F3ji|POƅ 1{N4v(FvZ 3g^\aOTq{aop P_0pV?. U+oM&t5ҐTxL<hy [}pIL)*`*2[= \!(ܡ4"sॠ^_"}gTg}l.w/g*t%75{?IQ 7'P^BЅO:hSr.H`PCt`O$Wǡ=_@!XOoC{O:?i\Qyי^t _O]a*sjU\5'ZetvRT6",DȦp5!B6 =6 Pj@P F!RNnkv3Ӷt<KNP>8g4#CѨz- K: qY] P [* RI^mi $}a\B#1[D?$>t;EHafd)/֝שU -:W5uG20қg1y;gÖt BS )"@U ]P"-:>;m  sOTl6 j~ݟBS^i:9 Ozy1ޗ/[þ>@=ޏNݞ?? Rh!0N}=;هhPe`80d&O@qO=k)/>GzXJh9D"(Q{AlX 2*;z<|T='. pmGI)ߒ4z'#TG~OHBM(cC{'nNtb4-5}˯q pb4ODF ?[}n#Um\>cGc+/ U&(AMd=f "`f hԂ&0#fy6NY]Serr k@O>W+)hiWAKk ퟶOܜazg6-GE>{Cn0W;UU.UݔPϘh*2ᠾ*YV^G D"5y{zFV^ lye3FqQ?Wi,8% -E|@<:/Q 1 Sdse 'S^f.78csH {A9! dT9aeqA ~ p8Z@<%9arm6)G+QskS|~}ʁ󣣣f5fP3@w ^m:ؤ ؇MyѓOܚxJ)*e?{<O=@8ec>%!WtᄶUf>l Sܺ<0h"AnĔ4}/}"JiG `֛` %EB2A A,CH2DA  A,CH2DA  A,CH2d^0A,cClBcCZŦM0 BMbS2QG+A:l!@;5p $Ո-hHM d6Ȅ4ԅ"M6Au*@&& Ti ` -M6AClPDʀ4awX,@Zzb&bcY9@d>viՃWBz RkdvH~ %(m P9qPK,X7V7XH0t}욹7χg 6tnLr0W:68;/ܾc:SbLFp7=k]"T#뛝?W^q EFMJ3G %Vޫ?sӱ:?p┠tfǮ _LJGw{s/y+9c CƇ 8[rڱk?W_NJ,N),OܜhsE ] q_OGݾNphrRVgRz M't'bڎ [eQƛuX@pc@w-888_u5wܾ^O>WJ\oC. A&DQ؃X>Z>6W`~ ~78::ڹ's~_H&XDžS5<ި9|='X t?@:CV %;{z{k{_Lq.Ba18GK2k|z{wk~1\'C&Ygxkd$KA7928Љ xe7  0w-O(^@y߮T7 /%4]qtsЩXCN_j[a#}".;e~7sG!P[ξS{zJ[[7oE}ʫx<sh\>ٍ6_aBh(Ft|?#_L/RPЅ#aw~v=l>v?|hrDE"ScWPa,??t~jPgybB:ZzN_qtڐ]rspNEGq9pJ# tPyڻѤ}0Kٱc_c|t8s W=\80U^8 13ŇZ.su:3fLՁec߇; wc0=Ezz{P t)Фjl\Ȟ tG*_RJҕׯ K\. Or݂BWBe* |^n;҆z:= 9'১;pwix>OсMPwO4 v҃{rMo'[Z@]:vⴕkf7:Peq)Q2pxKZ###t]Ǻ/<[2QX(ԟ)Pvn志C3ߘcM 447>t) \2'h#t|% 713uubY 08qkB| ޴||2 F{q7#߱#K*Zͩ< G׎`#FgYߝ]}*ē:hy-{vn:Z>:S-jh9 蔑F6UgD]49Jׯo%݉6apG7'tu;Rl XCФmnntx!L^^*,q?.y})Ȣ[.I5.D"En`, fVA4}~qLS!###ylBt[E읹?C&JHPv(+>j8+OL3Z@x&H:I  "4jO:}bIp)zqV|iܟt$ѻQ( T/_<}*xLW2IdO\?b?!ZTcOױLtvBC/x !q͟&w-QVcS(;Շ-t ґu!B% ++}헜S4DKXMOVWˮeC ) ghe E>q闦ORj>HED}~SaZ˰}i` ʆwh$;2s=kj0Nh9 εi3,gdh}{R;BJQDѨ\f+:ֻhcףK Ո]` !"@ XƆE~.ROa1jiDg$Y X/ ̳7z)Pq5 >(IA˻-'0ze'=#=B=bnf0[  +r9Lݾ'嶬5 53dk\'ݝi*%ǯ;4G濌>/6+ .*>Ě<4S5j;7ME)LCS3_m FYxiC,o9]ފOY K###0g WGiKr }0ǣg Y*tEAp{6v/Fԧc4w[]^ ^GS+ Z8B3=ލ1͍+˓IH7lu ՍO]9A`1CGNܜPiU{8}^_ÁeRtiRy##;fM%-HN&_cK%pAU>uiVLʨ 0iґ.?U建rI/;&Im( "#VL$A> X  #5{E^Cl }j?sO4yv[l5BJ#S lcR!ǜ97;wGw[hC|5ťhW_tޟ1e#o}{FIO^ә'=sof؋CwI(y+{Q*`#$' y?z/ j8s@yߩ>X@ߒWFuA>Hz(D"3gZk1'ƯBL[2{PÈT!h'w4:JdІܳ9|i3t? :w6^4*t49`jC( /WP".};G*~o?msOS2O*lL$P‡&I-\\9c/`@釙3eJߣ ؚI)?^*UFmG;W_FVG+i^IjUx jS5",?'4mܮO_mD}AQAAGkD}7hC5v|WuBIySj&|#LPQD}݌f(*=]/zONݞ}'Á)G+VԷv{%>sC}5`rzX(0N']=%'5q2f̽|8bAX!e]D+%ʼnލzQ+/U5,3dO~SvtɅ3.&F-t51cV_B>\: ,xQh`? ފO!O]]*&h)L'U713 ҭ^;X7顫$>6 Aztk%p10PsAᦃM7f& I Gxyޖ[(SjN$z?uۉC熔鴦D juNT v&z`K_BL2vm" .*@CaT@ r6d<'bO>\y"sTV0]'k iyم;&"O!c=>&rj QAAGkD}AQAAGkD}AQAAGkD}AQAAGkD}AQAAGkD}AQAAGkD}AQAAԧ)17VʜBYkҗ${GG06,$TQ8[5LehY_GHtbfV)!a/,z)Ȑ D}2vJ4X^VPQZh ȐPQD k?J#SSnaYȐPQZ.tD}vȐ`T)la鳯gD}5vފP"SԌVDQ[S-J 2TؑnaZE^O k >[X@d6iaFU^d}5"곯H k@jAg?% Q"-,; 2dOD}*Ȑ)'ªD쀨OyV"}"'U3 ?>AZX5о!3U? UQm!-zFdB1vFdG"CeAgNvn >9%`)>ʎ6SV]a X~w\N}%6^GZX]g$Kba2Hr.JBq1aQ*%= -㓎g9b{S#-,t~t{xkyX7>o*2H>N6jZ}z`3ʷ:[K\?RPl&91i9?S)e-?WM읹lCJh`9q4nƯSa 5֖bK>%YG*A^6`-Cf2Q0 u8򩕈]SSh~TG= +xzdS.j C늕.ErcCL KGlrUJ实3˞ϑ=VtX[GWZW.=+VXg/ z8sINzz{[q[P7'( Ђn==͇Ӌ%FB= C0poǣ+彖ނoGWV^i3 GBиledC'AttxXgH//NۭOoƙʁM=Y:_"ޯ} 7,z0e!H$K{2Yt*,Q=ӷ˘0 hζKA=9p.;\}lYޡ&Oё<4}K!39-1RA:[EO^{65xb ˅V1TȄuwЅ!zآxBCTkRR=t:wcnNEGq`\ ݗ3Bۋ~07xV0!i~.cr*8y ] O3MçϿJuOtep^C燨BA CSxmQh!8Nd obcҗ_TP}_.| #ifo+=_=g~/QInOnꥡۗ+x5hXQjw/^\}Go*<$X+GhTI5TJMMϓ9PHGTO\z.wcte?mfAb`)p3_. L`U"TxNFl#ozxxI _ɕ`T2rq_UlV xۉS_hi4k@.Ocńdo=Һ}kUڪZS&(WEbj[шVI8ܚc3~< W|S{:xׇos?T3 /[8$0\ Z'koQ@ xc+Q}88d2bbt0W5֣\R@(iEÉt?j8X Oq=|1] =o8#>iЂ?OUC ; CuLI˅k뀃ًj]À^B*p){݄ꢂ;2*@,[aRxe*\ty='<0^ rrr_s#1 ;e_{Kwk402Te{Y:곗A(Ma\l񧑍P魺9P&'M`јNy i~ U>S׏{6ue;\bU\28'Zfty؉,IݎwP$9!Xl{O{h &!*2{GkTgB|(˯f8B^jDG Z@=tzڀB$j`2IT\'.cME¶u;r${:trP4N!Y|paH߻M1"?RdAbsN7' zGGE4v`,@/ܵGazXEr\{C熊l<7="`@>hGi; 7|ilv^* 9osA >v&kl,aYv=C~mkfM=|jF~P\qbwYr{-cBiu*wa>ZQ5]9Gi|X{ǾyK_S7"~`&W^>$.{i+Tyc{ JSL P4KMkЯ ؇;KX_%h >~Mݸwv4hWMW$o2ÚPsѽpt= fgZsW"Nr?5dqЗpOǔ| zSStUq<學V!|fk W>NBOev,z6Ѩ&p/xLi?q>}8;j=sz4cF?ۓ=/ѡ30^vcI*|/pslE!gNAv#Ni uzS*zP);A/,V|6#4H %}/ IWInPL 5 tj8ըpҲNΝΔ&$EF L)i (6Q']pV«ʿ]UJoDծ3qǽЭ+ή鹧sחkUD{Ojt޺M" yk)DN6GԧRߐew{.Ŭjz29i62Ngj:2 0TB@edM Sl4˔laa MWSta%#ʔmM9|v$Gt48 O MNCR ' +[Cj媞%hl4DDψq'Ly~򯙒1џͯ/d4jrv ZJ/H=TOwUhS ]HolE]4oUvFcQDQ0g &4ɕ 2eZH-Pر):ٔl+Lq҅\m| ɘ|+-okʩgG*tQq`S4G? %02!eu#3LzF$5iZ']OĝmM)H䣱[]Kei)>v>|= 8Z]CĶ`!6J4>v/tP­:N D}=B]&4nһɕFOl4=S$bc_cA](\jmwW @UD Q.GjލH)(bSegJғ2'?B+ f:OToV{-Ko纪yD} @S7"I_)QMɏ|#my9MꉨL[ X *tt]QAȱUq e"#ݳd݌] 4ő ށ0ɕ% b3Mєo@>B]@3Q(MyqşKۓF>ؔ\646(q(ET>kr.Ihf1Urs<ld'ޑd&;EG hDyp?)?jpPqarDK,ҳ D}AQAS8M @G V]=}sA4rм`lv4aP!D}&**9&$Q EԧNم$Qzd""FPFD}ꎽkABY/ʥ%=ue'.SGT`#H5>uD%dBG5PTY$[!G~AaE}J`="FMD}jT@m"SXKPD}jULU?{BVZztjD"S+uOQ{Ϫ%'>G>b>#lAu`GDzQB ӯmD}l<{u~I> !=D}lIz#">E >B"AnjfJc J1RD}j ZFD}Hk'VW^?+Vdϗ=X:?4~mctQkXz4t.<+5Ê&s+ܟ=|&%δӝKZ}F_U4nFZh;0?]).C"@Uu91tn{3Gq,^:?.U`Q0 >)3I t+W6hFFHK{&dѯ?&n;qjdtuu᧙3H$Z~+1?6G_@G#sP3Y2yƮ?Lu|ґ|l:a+#S;N,wUN#mL=OQ;jyxf5Z~\ #T%MPT_f-SvO:U/7 nmZS/2B>)v~Z OaZMJ-׫Xh_XQ"?s@z#;x0DJЕ3UAT!Tl|alg$Dԧ,səꁏzz{K%G)^Pp 6oi2G#GJ:[mYwI_,*Z36:۷kSP>>E9՞͋Ee&:vA c,\zͺ 8_ch\AbЦCl4ڜm>=;BԧxێW_ E;!1@kMߨFIrFBV*S`9,l-8MAԧAK<4"|K3aP.A҆4h oTAkhXX ɇ3UKnƉ  S/+VA~e&Rv+ڌCD~x۝&7 : sYgD}*Ef܅;qDFlz2Ⱥ{˼QmIA L?\o(r}܉nFc\0\}_;ӪUT:gIq#|#>R#>B%YSwBk<&t%;f-Dȅ@HDN\ qiyŴU:OGc?L>tu>BL&`T`8&FŒ;? Qf5hr4mrD0>a=9h4{?:7 RaC3' (Q"H>J>mGڒOҹ,hَ?|&'c+lQ;\!NL|VhUt B`(-@MBa)<ޓ*LT4g8u%0^K[(;x #FWzŷcWƭ_:սx0*-SH;&FvրB|C V C=@E5И/Xa|^ȒYAvctV^K)Lzfy PX֍;|S ohNՠмM0Ӊ&t} p#H&T .H0A0e@~q,(Tm@htMi*/#Q" ͵R+ 堯14(A^b0y: Sg̢4!uv)mn=md| hm:S҅c3ޓV^@):;M{d]QJ:%_Dha׈bQ3N=d4 W4 <}Ei =zlI*H'8-#bFjJ<}a;AOr4D=hQ 0"YZhW8k%C&SEu_!.\(bI?0 gJ='z|~īL_Owͼ>ʂPLIV&AkSqTw`Yd*_$R\ 7uo+Q"^|ދIg*I.Lq4ΏIoYV_?s=CFW`%/asbbSc_rp j[1Tdd_~t<s:sY8ځm:qMr$)ϖSyy $Ƌ‹3s3AKƷ='zLBtʅ~t%!Qd_ڜSm93o2KQ|J h4(34vj4&9K6GlRpx1 ɀPsំ\6;4ȶ;*]NQ@oJ*O8ËaV9ÁCaiF]3%T=hXAk7ӷOa@`֫24./ ^Z]z͉7M3lj= isUO{8ș2OL2D}䭤bPр&sjaq\2A^U#ls\Wo-L.$;M!Q܈rBr1Jm )DCjK4 f c#,k+GIhc2J~pVPpS>BE(1>k+ehcHO{-Wշ;lsgN*)YJD2dDGqb#z2mN6[vOp[Òou\:օݙ y7w2/U46pBW6 b()(Dl뻘lV >EPwWK!BiD}70d"2O}ݜL4:Y }v^א̛ 7ԛDp P{h8fd, 1Z3T|EIt+%N䳆{hd2gCmD fMrz%OMEп}Q"L/dh]P*9烑D㠃9p90אcbg49=(?L xT|b04xjTΈ(; <ũxaIBjun\%.o"5hвP֢Sm j@p~S~~u *b (sಞ577F~٘WM:!vFԧԪ'i vr䅡|ɴy+Ձ"a.QS”5i[!T|jVEUm®*)⹡aX"#?W2ƻiSȲɊ\%K_.*Qr%7K }:ȍ{i6#!SqfT"x<3alNG.v./ AR= CP"?)ZasCI0HX. ^=;vu#et _t{E@jd"(alUSZ3WA Q" Ida)1|4=IY5r#Գ pV a+vI3>BHB!c0hm?GBU5dМ?垿41;E[58xb+eé?Sܜs ;B^@zjC`P?h041j:|xzp3O&6r*ܭ5(p10Ppi&nND Ds?9jQ":[L^Mi VD䰧df6eD$CjQAATm!vGTڒկVW]Q8+f*&nT"@E) Bԧj); }k q #TȒ$d9>BհSa|"CV!#T֝"T1TNwttQ_R SvG莎4Q&huDŽBOSKd)TiD}jx6l;&>Ywt*;>eTS\ 9W)wD}j;k@wL)kD}j P鎎B@ԧfնGԧ+Sh;nuDŽB%ʌN!b Eԧ/V#*b >EHtg/u;Lk1O=K.6ʂOҳ}Gtg+,<_~0tø焇 ဣ1q}T' 鐭GԧNَS@)M-DFSO08tjruh3}CS}(9y{20=5UH$PЅTf^݅ QAQhU36m_,s]>HD}ׇ.rnYyN6_AL'wwKUK`> ^;ɹ#W%I+/Wq4sZx@=)Fs=VgRz#8t FA04nm^lTx X(z7ʛ_t9·‘_">|^dLYmಯZeۤ>5s% 4nƳh92thggퟶ Rq*mpp8qPdB(Xntt{ͫ@,_߻8kxcT;د/{F|!˴~!F6Ťw6W33l{B `L&A WƩ;?E=-ԝ`'D}%1Q$H({'ۘ"?B؜jAoBsƋ!m^< Kf-*lp:tb&`7A }̍O=0f?a^A_<0 )jZ@c,ڎ^ .Ȫ@^>%E7 b^z)\h3/F6*Æ[mOS%/|궏삅.j2N}=zLf~J0!HbS\wll%**ْd{g-JJv+UdT8 2Q.j@YHl66uZXU M r_"oލvD}lGŸ )jZ@/ahlvrnbsJ`zrtߙ>;諹'sK%(Q0x5hX^Kwi #c;>]G#oZ=eĥNTsqRhܝI*f*?lLUuz`S$Jb;]Owݢ_DOqb؍xW}0OǿU INXPWjDrܝWG^t~ҩ,w[6#eC-FvuS5:5}g 2ǃe\P w:z/jF7Sޔ^&$#+u!%ɶTٱz 0'bzyH½:EP/ll4"DՐKq_,G7U6Z:B2ܠdt&utXrT\_iwWzzk üBA,fSP-<$6?"Q;N&7 BpAa ]5rnrNܣT 8x`O:`$ kSl:[UlZHKz2FufdB+>xZă4so`J^Vln]猻ޓIq.wA(R'O.rb)/jQv@^a4nWB`8JJ9PC"4[jm^ӻj!;= aCD}3꣨,lo% ql0 .>tU}o&x| K}ܝ35zX6@U_}.:v@Paњx0S)= wd&ų7x~LV' PjZcGKоxmslI, F{0DGj6A4D} =iXL-/3^RA0D} =iXS&AOƼ۩ǰ(Pμ9s(=YgÁ@VW]:?Db!K彧+NKC|mU=6ƈ8hO p>-`;R.lۢul6W[鑃ङzjwSL=YRjiҔԟ) Ad:{} kp$t=Aa-s@~ә'*g#{6zz{-<_ݏ9sÎ(JRJQ}^_e9$R8Qs&gzODV_RNչs<9GEc/0mӋ3^($ T#xA6x)tP<ȚҐ!b >if XoRZ솨ئl'dǑЂCD}l뛊LAro}~_JhPl6jgcUVPlJX֥郸P%-,X¶?7' #n 8z_NyuꃧȴlϤ l:7;}g^=X LGP*g\L$S_Č\N刼:J$l|#;{ށJy`@M'UXm6#*HT9cưr LޞD%(0Zd0̼ΰяޏJ#;B"ص1}y /ڎ_~ QK )"8}3\ɿ}o D!wJ|*ƕ]cXb&уkjh.TO#o!BM`0Z!*ĹQ%4©# =hҢ'fo,V1JnoFN=G>q֭JK4i#g!> XC/qBa&z7j4ȰA~>0wgߙZދnU0ҙ7K' b f't}T'{)w pa pMw~a#jE=EnO'jюrO<0{2ǺCFgp1= #pN Q%yA a8dxe11A/{zOB}Hz1\ PN#;؜Z]<%by?a+ʦ>htVLCCnJMTfM>N:[ijD9niNS6dtn'f2dS S %,}é?Sxh vtWS/ fb&:45YSa=)Ue(k'}Ry2{W'6 YV(paJ ϭ/hdS VW+ ;xhlI6S\?u޴x6xLj x95q a";i XE9'&6?^4@>*Cc !3$Z5Oa}%K9Շ#OF޼=dQsMnLYxΣ<$Rjq6ԧn3]H߰ X> XÆ ~"&PolOww}ʫ l*FtTdQZ ^f˄oyl#;Ӌ]gf=asOR,GPNPq{a/-^f ]+ge*'dLuퟴo4jFz~$C$Hزisy{ص4u<㝑 yKR(Iҧ/x:Ӝ$N~KQ+'0}͋ \ xROoOySp MR&MSge!mKESi%9op'h#-oYoU8ܽ9u)SgDy$Tr0w솭 Bvr GbU<Ǯ'(f;,UGDYk:>;K&22 \rG_q >.Gi6OSS.be5-~nRX߱=:: + }1$V~Z8l.x}oHa B/{߉k#4oDBV*V3>܁YT-]HYaY\=F+ Wr^y A4zuTz"DxhëT!dyf(vvհw?wtuYuGmm2OWˢLt~~ƪx-bVz!$ 1S-A̓L>=#l s~[@D"ru.,!dް>BYXIN AƳI|DvU<!&D P^ (ao|*жVl{Ny4=4#!:6$ZBH}!ZBH}!ZBH}!ZBH}!ZBH}!ZBH}!ZBH}!ZBH}!ZBH}!ZBH}!ZBH}!ZBH}!ZBH}ذ>ulGB S/! j揶6f^cTB>!BځF>az8##%ih#"%i#"hUS!-@CXA)DHSGB3DH3 G!MDKY!MA Z !L+[ gd4 ma}B4md}$4C4h}$RG( > !OE(So}M3D^PDpFF.Be(h}!;gm@kP %i}-hj=32BPO#nom(1QO;|-75C4O-O; (֧0?iHPg&/S*I!_e>o ciH;և ߔwzة8>pmԃgmh:wl: _4)%x6{XӁ3b?s왻7(*,,Y\2:􌍍ߟO=L lſ9vcl~v~xpn9_a:q/#ϒ%]'\ii_b6yYXX 2%qdE^\ܝtd?q]loz 1.M6]Q<'=lFAcZxLC^Lʈm<̪:@/a7cb{e9\#y $\=1٧YL X~,JzˡJ1?m)<+8:aq\}.Ksu %Wj:6ۂ(A,r-5߄`Q^.gd1Ncg$J.vd}bp؅Q/q:Yg =Gz*5zuI \7~:za `h6niQuZTbv N `}3 NS ˋϋnlGkvd}|\BC1cBOfaM0 Α#4βAL~? 9pQY̓L>=eg1v0x2AH0;8Bͼ`)0x?"@Oݞ@ܩp \K+#vbS[YLOu NH02p&);}{]+}U־ rgw7LHx>"~}5$kKv qӷ|\07%ŧAh@ ֪zޞ- w-V M5iXYqn}gsC^@CHݐ)ŋ`c\&r)\9[, 3HD}c;ln:x*>~ػ==> AuW VnBT2h-kſ3wfT.b$D}}]*. W yJRs3:phŧ{ʆo}lgMܚwsnŊϋ p,=_5>rydƸxY>?}-/CEҭKj }^+ H4 ̹tUz{A-cTuv=M-W^#F?z 3v]lXX&XϑR9:_-GhO _ F'YX%Y/ 7,"U.K/7z"';/wY,jZqIXܱ1C[|k R)4qע?T>zOP ʰS)a\Q0%Qlj87bYzZz+{: )Ϫo-Xjgy QzcǷ1$ /_S0W73w%@y  ۇ/v-|e{ˇ~(kQrT845 [L97Q0*!l85Lf(L/~ٞ}[k9֧v~P8ȦcV&mOzOy7|F;՗ArN&^ b&9´+;E  |S~kaXC]BG/cqt/\j=}kJ{ &U1Xb3eĝS|p7/q12ُ1Y|(0h0=ӻj}0QVz\)qs"T xc&KJ L_*M [dO i arYA~0\Cˢ&SCva'ΟБmwOx =K+u#=~]Cڡѣw/3#+'q»mz}Y0iwF0cBq+kq0e - PՉuqZ"4q+``X>^H-p6:q]Ql.y(FzqdO9֊b&8c4n0T+vcCwMD[HQP#yV-fm~jt=nюX׏01)ʚVVMrW& BXS|yyݕU! eT("S;jNTMŧHMb&o P4ׅbGQ8WܬIZ 47[ i(h}!ևzRzY/Tt0owSy|m}u'!.annw$kTj!W٫\&9tF}t=n)"N踘"|`·s3u{j NE$~t pA S&ڙnWKnfF3p^0%fڵ9|y~T]vh=ܒ$?C3g`w46XC*U%o;Vx<17>dfЗVce04.nH Jaejh$mhI-m< G3JՍ2da~FW#FoZ :.ֻl q/IJYu8=*z$&HBu#\iE30{}?XXG LSfDA>5 KΠ.mL."FaJDtWŤ8@^+1+5;Bޘy+j=!d/?!6$ZBH}huD"q4Lܘ!x'1iǓ.26duuUDEt+8zϮ./r,7cӷ%nr5/>EzҶPMBu}[XGZe=MuzN-mJ:rH]hy*6U^.ZZ" ewm^BȾ`>FjhotnzL~?~tdzE!*啲.D6$9k!yY>WY˲66DD9dz?O!mdh:Ͱ(Em!!i΄6ևRh}!ևR`}wJ !udGǣ26Е5ä@w !ud }5$,u5%fG󩇩6wq0/(~ػ`9`<"KPMWW7TB/\.llEYgokW"bB`.3 TzQ\) [maI4G(o9[U]fWݗWZ;=J=JTwX Ұ譏'"E-b,5e7ֶE.z#}DDGY/Xb1a!!>B!>B!>R7:::݄zBCH}+ OMEvNZE^@CL !>1!ۣ_qBZν!^P"$7ST|`wYR:x]TlJ-S3qcbf}½~}54pfHX+]R^.[[cvAB-~iEpjfQl9ts\b'm5uvh=-9js%X,8K/K8L!BCHD,dGt1uҋa/ ݇NN|}XStIl*_3=gbxH0tpz i9N_*.5(֖8 T<a,PӺ4ӧnO-\1Xi%B-~i5~ijr`wnvgĭHXT7|-l}Z.~c}9HWGC>vMߞ؏ P?qg?w{ U\6BBZ'W…gr!Ww}P3.+x!+eY|Q`P-IB(k;2O2\S`E 5^.ϋI_f5Z޲g[FՖ-5#!u0OFh}9mT-bI#=xYze`o푒[Ӗ#9豽k&<G5.BHPB쓬+TCGlҧލ")T?lW J/K\>K2x!XBB!T?l{VQ!-!B BO,Q͔˱bR`xeiDB-ߕ2^TaBBF]Y:nggw&oOOH]tՋJlu5 B!T?]YBPT9GBij6_Z9932(\v| r-9lb 6 we.VV)^Sz#GhO3%6t5 fD"U ^V#!BCN%8u%G|Ua(SY{-H{6H>HZ[ci ,#Pz b9` h>jQH!Bv]\Y >vAQߟx/2~{ UUesǴbXB/IUXtI*B g73DbkeFf*eH!Bޭ,mkDȦu$d#WF^n! TwѶPw)  ~C@HU9X]ӣ"r\A\eM'AT%fU[1\4/$!^ .>RT/ J;jK!dߠ! TV_^ >r l+eϓEh fEϑJ(Ŵ3n9 ] 9:!}vGC nvأ[u =S459;gElta8{s.k苡7j/%(lm! !PE~1g(OdE)1P<`DOONǦl5outݝs}R Tshx+5}BϬwΗ{C(W&e5'0р#g og V{IN]XCb\ S֞c.B[8}sC6|?] \}.gwZ{+$ .ww. i.CCHo>璶E{&/?Xoc%Y%#oO ҅^~v5 JY`Xbll,~7.;Ƃ# ꯁ* 8v\R2tz.2!ۣA$RF:kԻMAIDH@CJK ."Y!BH{AC!B!!B B!T?Bi/~!^PB!!BH{AC!B!!B B!T?Bi/~!^PB!!BH{AC!B!!B B!T?Bi/~!^PB!!BH{ACw!lBj lI麼s !P@"bLܹi >RU8G@ƁꇐBj)GLlCTzT}!^PFwX(JPBBZ ۫]-C!5BCHsc&~LGD݂ꇐ&7Y- _Bv Bj!ۃꇐƢ%dCZ!δ훬zbꇐo !ꇐ=ra!! wZ>""!dqM"e!dMPҤP |Ejz=|Ev!BB&+CvMi4rO>CCZ"wPoHKB=DnACZҞP=~HAB*A=DH-P&;l!BPFo;!O i=~H,B CIACdia~~7YCe!d&P&|EPlBHPw!CHݡ!&qO~ dB !wP)|EHUg@ӽm~" T? dBZDb6;OBo! Eb(~'|ev}~~^|Z g`;sv9ٴL9_Rv""cߌtzOKťZZHo! NXazP<Ӿ[pt a$ʜMIVw]VƾK,a'J^B?AA@JG׆bzZ'z#j;dS8Y.XZS? Q87^8^s"&t18QY?~CpXHYWQSY|X^.j`76ҋigC8s҃ڝG}ǫU7~c\n[:-VKJaSP=V:MT?B`IfƄ3^[Ba?fsLONܚmvN\RYVGݹ?s@vr. }5$>J=H%f\>JEF#mT&nNxcQ!}.AEegґ=-Ze*s$dCA1hcTx;3ukvP%D1Ɵ}y.\9VH(p#mnvδwE[;[m]ZF#M} IB`. FdةZ&%nO\ii:8sZ93wf_1ƬWЂ{I]QnyIŊ7uP%Ƈꧡf c Îqva'fb4] $d3,̃qg73~sגlP,n"#TB@,X^~ZL?Lc!eWYRb0oH・wuvg~0XzQߍSSsp.\&nNO"B:9YOY!x60WC2`AwO{9Hwݩ^(kdC_G~"eʈcJdiJ$:05O[# 遾}"*J ~-/Oc+ZH\΂HRB13~cy 𺎻SD)䃤SOlo*/[zUR^h!#dҔۊyh{FUtsWbSM ,W-hWqkupTlJ>–˥=w.p+ ;1v~BTc7ʗ6 "c+EO@~\eBwkE .BVhsR` 7|2p>jݝXi;sJlSRO\Q4|` p@Z;aaLS+"I3Y!FZ*`B=$^ ygwg~ 4tm8wE w4>v?\ޒ_Mbvp0ݤ G6FQk|dz+߸V<8~=wYW; @E\pt$k00hŅ12-_]ӱi񪥣C{*Mn: E1ݏ>ͪ?E#ӺIi/ڌp$n3BHДG.͈QD}SUWi-(u 3fT"; ٟUj\ r%n۴/Z̯?;7m4a|?=f|Zii!w6G Ժr L[OwP;kR2v-vjiGL{z=BZT?MGnM8;.8ZBipvL*حL\^h_;3uhXM.$RLܘ9;͘иBo !<\}MHCV5Di !LZ{iH"WG]{ ,b'm5uXcDDpƦUBɦwl*PBHuK;ә'_62t^z2 t얧WStRuyNyͮ>[Oz! v.ϋ(ȼkmܥt@b?#a'L gc?ČW -\K\-k~!EL#0қF`õV> {S :CYRBjW3,>vMߞF#3(G<4T6Rʔ5ɲݕ4 EߍW ۺk"TK\-k~.g i&x6ڸ?cy Ch8ӈBc6.Yu$$P<mԋ&AǠ nRO=y&% P) _;d@큙5S+J*ɘU }]JqM49:\(B?o|O^ܡK!5_N-?D%0?ˋxq!XkFOK%q6N!M[mvDM d8^>m4 &5(˫iCml"s%B`oͩ)mz]e&kŐHRLΝH憖*-ƫ .4_[T?u(tWsX g9f!ӱi(' E0Н67U]F |X,bEa (Duбb[G(B^ZOuA0MuP]@0 ɝGMж.uz19ϕ~u;ާJ6L@Mܟ{ˬd@ y7:;o!MoJ@X.l6&{6^s-FC]}<)( Q 1xh# ވ o``ÝaXXӦh1UG9ȕ% qحNW[Qb?c}׊o 3 &aS\Vs唨ƾ酶]PGG꟎/±i7Ww'O~?SO~Y%|#wg`+BoH*@޷cZlݻ齺Af^]s&LnՇFۣk϶M~zWI.j|A+遽^}ZzUĈK9e j7O.\bI戰/ki0/q T, */WTj/KctJBu]4r[{/cr{l=ҙ`UoJFͫxn Lx5ʫmtzpFFOBHД7G& j ]&n. y61},VO(̣_K n;Nօ)N@uaOΆsveZZ1!=Ε^h4ӘXx}3KN rs?;VL 33Z]c\}.qm]Fb9`L?۵ .ڀz:R+kJu_|-.>ש)\gjPnCؓ}U_3>7G-ĭ V:p{ȖOJew/ ը~\{k j1Ooرbo\5#PkeOHєGYsӭ.pp}5M ۭ]%- llANJ\g' JgmMhZn0 Et-r?{}^ %jm ߫߫[`zZMo=)5>a<ʼn߉7k]:BcH*/ՕwƩͪ~H3uC2pfgW%T%I)zFn $5spѳ|dPf8B`T ]R<'瓁VyiA<;3?0NPπ\!Oxc3e.@26I1Ǵz֊R#b֮wWƆ%glilC~H@CځJPB<ٛ:Ք3Ib>q/aAlyk-퀚A_c.iO^y9sGZmc}h2ciNz];RVmX苐i6*l)_6T?LL64}Ǖ0A\sIS޼ gU1]嬭vD?W؝З!WI6-^QW7~4[ˆꇐ}4|Єl)ڬ2Ԙx=Ӓid|u#(bX"N+嘮.cMzonwlȗ~v!?wwZ:S%璱[lBY^c1m.Y,ΌsK£BV*fmBc%T? 跣#WF `îGg1+11Mf^{+a }9˘y:6ͼۄ+P Wʦi.$3|&fꇐZ<@sy=-}-32öp淌1swtɱbP'&[sp/!A3#RKJ^ۄҤPR+ZwH$mcJ钵S M>hcrc:&!ԑєdPB1!sv9144T\PmԾ+URPBH066&VEHOb1a1NRd"vZYs 8,$Y)+90gР1>4Q%9pf`Ht<1!rPor6YzUd\NݝMizTG/2IJ!:0OKE'hbIc֯-Y1>1r-ic@z1}H .G}jy4YW1IJŠ!vf?b5qs`W6Np!Dϋs1H_RS2 ]}C38kO512 uԶ/c?shXkkǟ?ևV9_q.a ] z]7*T*B,I+AC!-v1Qcz?5F&><(XSLOT*:꘾=-65ڗ_]ô ,cURc%i%~!^PB!!BH{AC!n0S3 T?Bl)NR$bfBjBZYiMɹdV,1Prt6&>>ӋOT_SհQւQ>R#(晚 7~!Evtx #r=U1l7(DGss2N^f=~az`N_^.4'1c&yȩɠ k~!)l.,Aҟ{.PK=Yq̝dz.X9kdЄ)T?"dd|.߹ǹEʫ̣.cf L=H޳A8>p\t@f=tYK(}36ww.q/x?s'r=b\|^ĶG&Q$d!A]5ri2h(1~֏d=޴X߹p--KPX{cTԜ^LoIBvB!T?Bi/O%H i>! a iOB5ĆܩPBBRJ BHk@CQ{j9X+!M!Ζt BH3BCHݣ2DPvH)AƇꇐ6bl e!a!-Oݣ2hPQm`ޡNI!-K-LGJR;T?36AzACHИ{62Pl@LҼ/e!d!i=a!dO!)iBD ~i2ZaϦPBvB=:(!;ꇐ&e!dPҸr-e!dP҈a6J!!LDB݅2R B { BB3A!uPPP4'=!did(i+~[d9Җ2vꇐ{ BZBvV2փꇐ݄ "e!d?f,l+!![@ xFaO¤A4/T?Ԋ>?9 BBjB'}Lsks(i~ٜJ҇12ꇐMm&FHcBC6ғ6.G] #"BRF[(s?C_yZt}욎OΌ`|/Bg}j4iQ<]C BFLߞ6/ؘby˒b6\|Dw7r>ԭ<[?qaa!Jr&cSOH{S~Ygtto91( [v: h ?Ko }<aW: v*y@m BBTcg7#==/_. mJ/Kb^w E={-#{i;-ƾa#ۄS3 G졋!Ǯ>i<M?L塖F'kxc(}mE+?PX_ߏ}cڝ>'DxnaJ9~BBMZ ?mlS-XEBP6mS=P'XzYM M ȦĽilɹdV )ki8,$Y@==9wo `*B~0 ?}/0G-ֵY~<ȕ3tDz5/q$ VV1Xߵ>W30B$T?O ~zy\a0B~H{+`Zh,<+deZZXXp݋-fd|.߹9|}-qIMp:G?ևV9,(%'zCV;遾}HDYsD_ m=l SӾ3>-=5 +PWh=ROK%lۅ"ihb q>ퟹ?smhs9ҳb `DB6!5{ƸsVqv ?` |tsdP!P*zҽFE  \G(*Cl04ěM8zz?ʪSRcGYS?vP,Tq25]B_udƄH0PByU bA>ưc`ci!PyZߵ.W!ף;q!hȣx<S|^\@+DoDmlڪD&~"^Tjv%m_[#Cf OD ~KѦP8k;!_'P e>^h =>؍ bPwY%.GP iY}ZzU 25Хbn[['$+wFjt_%:VP쒽D$n,GdE)1deӱi9?@[8E+LܚP}t~P=!TѰt沐82cQ)}kbaŁ3wlv=$uqlO;_RG G*!T};gPsu!}}w`( 9Xo}i9GruqpJeՇOoY8djxo} ӎ 7)m EJ?j|`7jy -[= #Hҙ@7 *-tYѦG ޴ĵoi iy~H1F[AOZXczR P!ƑY/~mmnո d#K/KBDGx0 O*^CBZBHD,4Dt߱u]ӱi1??x`UI'MǝO6l_nXFC_Ob[{ ϥ>[QZoOC4ˑkO[4a?bGK\5^ǜGC( ہz];ilxx=19Dhf;g\◐Vd/4eқVangx4p8D$0C!Ӓ|BNADG ,В[Ɗ ԗ,[ſ{&5FoDqptYQEvNӫ!{NugK iF~!J~RYQ̣/9TT:1\S15@EfO^[M`?bw]ZwT*5󿙡χ') U5QToTҩ@Vk 2SO64A+2d`fzFa٣Yk x%;/̀z>y@W˺ %}6ҵDWz5LQ4@_.m|V۩m6͕ӄ*T? LwgÜG×?t=@BF7,W*qy9sgFiH&kaҖ3?&٤a/ pt^Y8|eX[I/uޝ`DЩבM+`YuXBi[~HM,;!Vd|ub?{6 /Bj7&&nMG(apvSWfBϑhtq4u7BHBCjeY^^*=f{w2x!x+pE8>p`P~U. *+6Xqֻsx5:9UR)Us@@ineFBHBCjBfzY!V$>fUqZ7O^V|Yk?54¸Gi)ѣ %mF3vsc6oqscr?eܓ\f%aBR9ccc"/y?О8%4xFN~7i}׊Ck){JcH$gO e-QVl.0C#v}w'#$IؽHYֳ@\|؅JYC/8WzQJW0_|^Ot,]}G;ea\]Fd#XSrrݺ>g=!  jL+^OߞN$~E #lLoH rj?=H餬F{VQFF}$6 kˑ@h 02"tX¬9Ȇ[~lZ1\.ٻt)ҋicꧣcw jv<Ř83wM|zeze-W.v]QN\'\0(;ǜȵƿ:f7v::рf,,?\і/ c:Cz./e=կh}ǚqn8BX&nN@@/mz?fLi һM5J6o]H `J҇Bv|H%uy'4f4V 8Z߱B8>t }(R-qj8]rhk:>-3ֻ AIH[AC =GzKHP%sXR:icGKp,S I?}vJ EAُ iTK<1.Qor6ןLl#q~Ҋ\@EoDm6j{6]=U^.Tg[ߵ.W~ף;q!ȣxK/=ATa;[sLK6}.4Ea?ca@4ֹVaVńkeXiG3Yݞܓǫ+X~[ ;&lR+1't@'.(+Z,(}N_UTRF;ÉP]bN<se/LԹd2_(bb(eiTHcC}NYW,}T !PZ9 a?o*M}N׵ gG)!1V4QeX#UG[]-$wP-0<ɨ7DJ/J+yqk}N!>fsNaO"E™P|XQrВT*ZZ~FVc;lC>vLW+r=btY6T;>1TEh5z_WҩGB:8u>hr e+pBh=i ntiέE61wY}3dڴ#U=^E^Q\UY{/ UNZDhU?GǢ Z|^L=H)k˘Tyw wcl4Fvy̩[M9ZaF5:-6:~Eג}wN$d!4 gS×/ OܜHR.K8]n"+(ArC\']WGqntzQM<~s+b} g~hn|pztLt}Q4P 0HR,]U'۠Wt\lӦgNdjJPP;;-y1Ë݊U0%]|Sh?bO/{?cӔڔljdW32tݝ| @!A_90ͪl¬THls_Ldј6 puhOݛ>΢b:Sč 횚LM6q"0@c-5bV1t`@JcD*ҁX!@%%Qp3@,g)f#:ԑJ%dId}~;'~d||p/e[t#d!u0AYl$^9z5* 8;TVƚփV1T>vy 1|? \Q:%f7[zW*:z1+ͱ*u1Qj2:]`yV,Dz8e 4V_ d'BC֋UʼȋlnRNodo>A]A7z^ ZPGSzIS'O̽i'~t 4!l6T?./7y{+]{1'/Y![R$, Zm ). 2c>Kj*l'MZX#}'GJaqU%uFb 9]y^Ƕ=m}_T<ֳ2Ҥc Ph 4!l%T?.A-j1u uyuRo\dhp zU6\dW fMFk:ksyvZ1B?>:#zm|XO[Yk'5ix~H3nlM cIq8й2hs%LZzBxA&FF=brW** M73`j'!!d7hoﰫ/ŷƳ/>t:=yoRuX S_Ϻ4Gk)85^!5U?ZfH9$Du~S7ʺC`I\@gs(߶Fr@d~rOQB~H]@diIOoWZY_}>ȏJ.N_+Zz[XHMv|.RgCT\Iv 3p'!!uѶp:SxwsLLb,^ie5`}-I(]ZY2U~mtQ|+J y_OB!M"#%/5]V"OY^sma4؍ȥHUYsy孟 *+-aD[ĄB RZ?U;+,K&+-Ԯ41UkWv::Odr~~GHCC!CwOwo !ԀEKKv@4ĭ kj*<<`>;3uK8K5<洴Z&R9VWI'h><<,L=Jܟk#S݄띺7%|_F;.WV֋y3_&!Q5'P~M~xT<-U%(])y)g$HjT0F&5 CBȏiIߌヂw_q'&aX| ^>]ضtB*ACH _Aۋ*2yyYμȋx=SXy$@AARo* Vri4~kilR@PRT6w `F|/psii۞+dgˬ+7s/rſs/栖ϳCiÿ(+/m>vt#}m)(E2~l7X!z|~3s r{OxꇐաNQm=ohtҾ(҆H}-4^Kˉ8ګ)!`09! !kBv.T?>J 떚]pvAHBC !h^Ү'B6 j (#uj ށTꇐ oȓJ8 ߪyb !Tkf6C9H1DBjakˢ"ꇐKv+ۥx6S1jAȪ!dᒠV DCV Bv;q@()T?ZvT϶ʂ&kJ3֨~4i4x&T?4ooS*BH#@CHa=ꟛExH=. ̽ m/.`Ժ;;:Gn^4 fffaMIyQߌodP\T^h)onȋ"vοo۷bT= ^y<OmvodP,|_$*tvtƮ"һ$\u¶ aON[{}zzZgKC^eOK~}ze;p>0xq0 J@%_:INDFsTB!uE߅KɻIlX6^Q',ْSH̡!Y02EC6\.uk"1qI!^>=cg܁ЁTu)ViyaoC&>8 (WP?Qcn1<Gkĭ ujjXbh˱b@*6-~IHyGL!LPy| ʢ%(i(H aXR$*//\Gu!-/ʑˑ ELeYl@0yIF8$~3Oxָ g[!1*!X[%'ZFvȖNui9}h1F~}ʶfj:RNGgżQ|E^G1SzHvt:6&Vg&nMNBjМ^1VtD( ~܉aduaj! T?Ԇad\4Mn\^iW|![MG_qB3>oDngxx8[H%KŲǒz?s&(L>N$& k !Ǻ>RVQw=vs!MBy;3]GWRF@%&PԽH i+BJ]ǜRV "dw $h"Y?T?ls/?:v]*e#C2=b_B*h|xj42 ' oIh %ViZhԭ{4%n=h-SD#Ғ;w1Ɲy]>VD|Je*ץip3 B@=r9F;AQ ~ þ>~ΕBz<=i4jSSN'6M:Yn)q7!vvvtN=r{~R^]|nqHPzWȈ\^j_^UʼȋxA qc,12}dc]6~&Mp C '{݉eXqz"84M> $&}g|VC"W"#F m}C|}TvȆ?!qcIP\.)Rd8+i: SQ1ՂJ[ 9`T1"q8]FKLTQv|I~/,TOEHu~>Z%a 7=ΣN4Ϸ,{1'B-"tF[v}_f=h ŊŅE顟av9CB7psii۞Kf9+Zpi Igmז. C*uQ'iG)Rm87š!~~> 9fąƭ +ᨁKP?: H$A vtvSHկJVLŀZd!h!7C&5-1RAU_Gs:RJ+Mʮ7T?l3J.L06>nGlܤrnO?ci!wsBg";%֮u1PtUbiso3vg3s(i_bNܜuc:4`:ER|[:T5TD^OTDBBz!6M4!q8|!,'MNt)^oj 2HU p3ک<=y:ҭ %zC"; Et\&.]ű!T'+n SHL7:xqwgHY "{a(j Fi3ZҶ|n١v:?sP}f=ӢkB6H=NYZ-ݒ[)CtO#&B*kI;A84)eT"]0+iZFDmkY L-1 #?Si5@CHmؠ4D@ϤiX~!\PR{r rj*9ڬ?sҒIyKEX?T'gff&y?)/b z(+Y?N=R8TA5c=d_%͋hl(o&#PD98}>\.zWu'-ꇐڈtbXz |cm!éSs/i0PG>?T+ [R:8tu|nZ*mm¢xBBֈ05RZl֩{\K(*-CF_O?I#DKoK3t: ^*Is3~ wn]nU_Q{;勞*c">!\sce1',a[^п;[H?NV[-(T^WvwggQStu|"A9yWyE?p.I:՝ oBPiSVwͬaBT;y>۝/k֨Nf[]AQ$0PV^Nʱ}j@Aapkc#ׁ rxjRJs&D3]_t9c,L'Puk6&ꇐYZ3O(ǭz" /r9Rx[~4{uXR 1`R4npRy`r}%QzB}hu&l8>ٗK8i8Q傤rh>qzCʌђӂ=PrP3>:'Jc焐:Ϻ=0{}-{Z_8}PE5(\&1iTJe _|*M+F([zTh^H\}UGͳdr-2$PR/c.^=|<ۡ~u"檹u::Ք\\W[vkV&Cw5@[_4괍tbdP ҄28ۧ&Pj2wўo+s6G<r' r㬛vN .VƝ)ֶ.P^$R NScV5j:SZP=zEԘ@Q,^ ~!i$AjNZ Vq7TvEVatmË5NvNj>tZqC"im br-~<;xf=97T? #We-18xn*Zگ@r)ei?Nu&1O5Vim=i֚֫5ϒPbFkP?ՓBaC3{!BHsACȦ 4!mꇐM;}XqU<}&T5<<-NMcX(n=[`!~ m,(sFKMxީ{SEߣ:>w,]}{̠Ͽ#X]s/烅ׅlvbF;&)R}}:?ㇶN5 -[t|@>pT' { \ P:2DՒw'? ge'gagl:&cQ! <T|nKR5XxyhnQFpG:IΐyS!6K٨;һNr7|vT?փV)3k3A+N[tegѠ;pN=BA)}^ ^4Z8R a/.+%,-5Vg_f!,)5i׸{`Lucyȋ geo ֤c 6yay'uM~!x5f!6Kِc0K]On;BjcZA0jU_G2S..[Tb6_V1;ydeiL>+$'6mt >؃n@{aJw'zca:$mX*X=ꘚ{Ɍ] _^\A *${>|i{eqxI S$YmVa#'ΣNGBMv۪hܼ & o 0I8E#;~YKbZ%!-ԩ)\ŌTrY1bk|;ΣZeSIĭ {}vfHWJtјےjIͨә6g 53Y$!n ^.toX~,ܙ@_tY<z[6SŝqqQq,ٌ*x{b#1d ޮ..Gv1M~ZZZ:q!~:m:mHuw ReF^ ¿ܪؤ*5sc%gG =5~kyii]ѵH +$:cϻpQ)4!Uhj}c@I?IQzy{%z*|įCPgT 9y:ҭu:sv]zu;ig{ ZmNDLYU@l"NkE|<"nc"C?!?6^ Ȥf `Zv@ዐzhjSN-wbCZDF%_X`شg}g*,ٌ*ܻ5s#m8j^^0\3:';-B i8RfW??>d]8vA:\h ^32PPEy{+]{1qt 'vXGP>d 4B#B iA]o` }VQ1B P!Q!

6f`a:Ô$uLB RBIZ*;ƶz`mwƧ=u?soq.^M` KfU@x^yI\RPp΅'p%T&Urw{2Tq]|SĿV=8PhOvf guQK/\p$<(7E2Qm!ѠG*n#?F0RysɬF)P=7r/ȯ#zb؍?Ʉdgjfe}RXYA,r_c\ztC> ƕHuςo$VQX\}i>nm{< e֤Xgqab Z˵h Zu"B"(O@2uemcDX CH9:]N<}} 53pi@ vjW4v8؏Ǯ >(D"AC1&{rm! {qՏT^ʀ! 'T#脈 V:h* Y_:31]96lf6p.1:u o!hD~um>N>UV6$% 'iqH15cq 92uF@"aLLCmPoH9IM"C{$BFT?SSOt@gh HU#Hcq t^E qOͰަg ȌaqTg }պ#BȆЈB!d0Q?\lBi*#];l*x !4|E!bA 'ƚ^tBv7gxpeVx FF~Om2ƅ:Adeĭ U$EQ3tV3cX(f>mot:ס=|̽CZE5!6YJJ-~&ɻIDP9mԸRtѦ D|U^wq铐/!_n '` l3~]⡡wȹP0*{烊C^7y'4}HL@AN!C$#]_U*=<洴ZCE؀C&NJe?"uB!dV?,t縧[ t~BhA^W k1*mT?RzB@TI   p,PFeBA@CɶU56pȤJE|_nA f=hE`3QW唇zA/܋\" ,~aǚ#uB!d݂͘e(Si "2 :zNKxOx-{>@g UT)Tu >Í2p~Ӏ\P~T6ڗv{=:!6PB!V?B!!B B!4kQ?ΎNs*ȋ5~=j B!l;kQ?Ⅼ:P fB!d1W?^˭$YZ'nMɋrJ;CPi$4 aONޕi++;9 ܯ<>϶hGV~F25Y|.gCFK_fh{1_?vc F^R-{ZՂ,,("p>:8pi y7|Wb^,]0`znM'{_---iĪn B!dc~RSCVwWPRЅC=>m Axv EJ,{npChiFb"CLA&F 2ZeSK"Lu+r%%U:%< Btvt ߉%?r.GS(h.=!s0=F BH:t:ҝ?ߏ?O yFBJoK e;rPEߴ*"*$ \#\_s>@:&yTQdd%V7gHjP"YjJ!+ku%¯)"B!huԥGJ;+3xD,=Ƕh_\X%>RT,U FuB|Gulj*ZOͪkfS#~X]f,ȸǘiT;qNo%Bx]A!~v!B@~!\PB!!BHsAC!B!!B B!4T?Bi.~!\PB!!BHsAC!B!!B B!4T?Bi.~!\PB!!BHsAC!B!!B B!4T?Bi.~!\PB!0Q?[oG#҂_NBSUB܏bȸB!;P B! a=MBPNB!; bBip~6>)#B [P'!g"BƂO!͆!P0(!uB2B!dP689D!TgC1D!i.Biv89D!٠!A1D!dCC'eBvT?duprBNꇬ !B!;- 2B!\89D!Ѡ![ !ml'|RF!d!'!l6M~> ! IN"BY?M~]CBVKJP BpϿv=k~RFD.-1$_86;x. )g|n~ָGWNO-{-TlF$I\igK|2^G^'MN>>8gCqE eY [$'qj 9AӬ6#mՄxoii;77#pѡu2ws ˍ{b'EIe  _M!x|f챤8r!!32C1#8~ey  !DCrdS&_JthxPJu=e"Ypln߾޾h4 XI=EJ> Fv˜yi^u42_MӪduKL4'б50^_~1ra M#c7p)/cuE$k.L?p'"H(u(|!5Z gRGQb8B>Pk1֝&BbY&uc3QOl?%Cw `,z_9>ʽȕޖ0fC|n)$  ).vW}#N&?2߬ڒъPo݃$G.E o `LgSj@0d- Jp O)wCW&"h#4=1w,XPj:/- oE B}zב.ݴZ?4hbMG^*)|b@i}8jiYF.Mfftlb0DZS ) K3d$&q$[Y96v}z ݃ G4 ſb`8,Yw1*rƅvOU(t(&c(y (}![OjT'>df|t::'nMTlw_O~|?KT**ilEQGQPL2BiB6{nr7Y3; g lqo*jz&BpS5y;G`|l8m iLuԵ|ww_FClgG:}Uh3T߽ʮŊ' Tząy![JT]H8C!/EZ.-wk։yKqġ3Ώ;:u/aݦ83ڄaw򂜚Jy{6kNeXnBe?_έyQy'~=ំwD9Cea@m '_cb~=*y$zXխAu ׷΅@*?  EuM[Q SjTuZ2wu>@Y鑄vpbZDڐlX`&:UF0!/o5D,15XZ*Zj')!+2A ERֶ )0 @֋*hLA[M4_Ds|E@UNjOMߝi) U0^\Pёȵ4TZ; NGjzՙ֫TOa%XTP?Kh ,돞]ICKM kcD"Rⱸ>2F\m%@&F0zֳyc)!l×S[%yỤ_JcAd~dB^2]ϙ-Cs@8>wjz@>HI@8pc6$\o/kU*UGIAfS 5Cu寍XM#cZe345U=iZ+UVxVKue5ܐGYwQsthZpW EQ{Cj?yBH=`b}xIv؛1x'dؼ!!*PmlB)T?BV#;>.vkBH2HLjW 5/"k7alRcjsBQ7q'a;`CuP?r!dSIj9rwjJ7fb#IF~05!}=?P0z9~8RP\v)+O;(^s%<ˠTXNsEQ\٧C6UIl}~6%j-*Z=|7 AZYp!_K>n١1+6ANc_&,Il?F]lfVE_N_|c7 ~4?돍е#7q!u)/*H^f GWQ[V%fD|eAĮllH11~3CjC=Lhc> &E8u󄇰B%;ՈfSTXBfqP0'|fJ싲l3~]J=Q3ۧTRV(>\T`TRRx uC^u'",kAVIգTO>0UD i_83 CTuPyq_ǣ(r0Mo䗑׎Ҝ(?Q՝):,z%c2yQY;;:L-K,ttyaPV@%f-7k3R4;EuZ;n!ŃjP%eeBr~DTZQ/W !5p E:U|SLOVTVx(F'jUDIBM_ r\_Va @C6}%FT&lu!0y-?:T߇ gJd,z"4hsmsy a܋\܋9yY~8-r)|':jҾ]8Bv?tp)~p31fZPS}C)M%5R荏Dky!)4OثoL0`SkAȯ#0_ m&Uj*r]u}ޅL1t 83P k0yI+|'%h{VzjT/Piɋd@{6vnSMWHVQ.o.5TףT1]q>U֎fNi GWg@!dP2[f !B@?Bi.~!\PB!D B炳(eS/ Rv5gme(6c.m U VMx&B.oB!!BHsAC!B!!B B!4T?B 1^qiii*c!B0Y3y ^q؞h/B!jtR B!423iIENDB`qtoctave-0.10.1/qtoctave/src/doc/images/modules_basewidget.png0000644000175000017500000033740611511434227023437 0ustar lucaslucasPNG  IHDR >@bKGDtIME 0"  IDATxy\T?װ("4MʄDRpT bL̅$r+-QKE"7Pw-* 300,8?39sgΑ ! s@DDDDDDDDDDDDDDDDDDDd(|$""""""""""""""""""zG"""""""""""""""""""7w9B;""""""ҭC~ "jp5sADD"bHDDDDTDDDDDD̙3Qk 1_$""""G"""""zC'NUS""x"2~ s@DDDDDDDDDDDDDDDDDDDd(|$""""""""""""""""""zG"""""""""""""""""""78𑈈 |$""""""""""""""""""zް2wDd/ÇE5kIĚ5kLZ&%<<;v4wDDT_5>5qND }U>5RW7Rn޼XID4h>52̯8_'gLƁDDD>5r'O4wDDO߿,ZFAԘDGGc^P(4wD&qu<"9rU>5bnnnѣ ""j=zX@dB=zG7>޽{ơC`gg___… EVVP(sN`޽x.]D ''O +"ơ#G`ݺuذad2 Ll`С0a+ ???~:ױc5k@&a޼y;v,qU|w;w.[o^gޟ!2"s@DDD&`a"((nBZZRSS<G͛?7d2|||uVZ~>DDDD0/8ܹs'v؁_~Xv-y:uҺ>,rym1q X|9śߝ:u,_\Gy85L|#Q#TTT(X[[k]z>ZXX -[Dvvd2ڵkW嘉q8,)))ѣsΡM6V4q=++ͷT91'""""O|$""""""j @˅HO1Lfiժ,Xl|駕+J3DbNDDDDD >5BԻDsaX`"##담J/5{98p@vpBDFFÉ'5xÆ %vc„ !cDDDׯЭ[7Wes󑘘q7nD6mt$''O>C.]믿Jj P̞=㏫58|ZT"553f̀;+++r$$$T9"""""W]A^y_h߾=z-\tImشi`8z(z衱\R`|7hݺ5`̘1WE5^7""""?+Wx<ȱUVo ˥ '"''=v؁/ĉqi\{{{bȑptt3<~ O>$F>۷ѹsgDEE!%%Ek\Kd2| F!EX|Z&A._Gvv6ك$\~cƌѣ~Um'0|$"""""""L:666ĵn67oAM\,_2 %%%BTZ  ?^kiii޽;Μ9c)++۷՞Ɉ[[[\MeyO+**ҹKlmm1i$:*qp*DDDDDDT,)))D׮]1e]Gt]V(t=zTiDDDDԸ9r>|IʫJ[U&+fE~g!"&<<;v4wDDDDDԀrCt񰷷c:o7PPPu!""Bj=B!R̙3ڵ{g2VΞ=8|W"99Ç׻MO_t 0x`#"""""M>"66 GU+W̙3QPPW_}3g΄ k̝;BFϞ=?>8ٳgcٰ'_xJKKk.`߾}xjٱcǰqFZ Gaxtg锖bڵشipttDAAz)xzz"77 .4wNS~PRRu 8{,rrr7n܀\II lllVB^JaÆQQQB@@]lٲŴ%"j@>޽{ơC`gg___… EVVkM䎗.]Bbb"RRRӧOl"2/UnU^I&!##w4OPh\|zsYY4}yn˖-+[~൦mUk֬YvZ^C^^~lڴ _OԖ?zO3f,DTAtt4o04i1}tr̙?~-# z_|F'Ν+Mg!˫|}}.]tI/wUVSNjغfggQCv}7o76VXiӦ!,,Q>%''#11 0?r9s&˗cX`FqqqXl ooouؿ?lllp $$$x|cu֭8p ?cɈg}!C >>^+Bad2!55???i@E?~<>MDsQ|˗/cСÇ!!Cm64kLZׯ\v [nŠA{n\v vZDff&`ҥ4iv $Dh׮ZlLW˧N틟Ym`̞=ݺu~i\xF_5SL&\.Dž L^vQQcǎljXj>r^z%̚5 -2i&@~py?^Ƙ\r6l0Cu>^1#"_QCcۣ_~4M9ʕ+ѯ_98P c?ՖھZݰu tQ`EC#WC7""QԼys17o޽{pttāpeiÇqM+^!31b?^ 5>{1uT-M ¦~| @˅ݽ"ҭ&^%KDDDd,__j=Qyn/io֭['M;x 7o^im0j(oRc„ ;v@DD\]]~ ݺuéSԶS"$$|LVV&Oӧ#:: Ý;w-\C&!((H3g*X믿wޘ?>ذa= … ]"LAi]ӦMן#11ƍ?6n܈6mHNNF>}`gg.]_ʮκp9 < ,@dd$|}}fTjHj mcGDDDT3lmm74bcc# ;// .Ddd$???8qPZZbʔ) DZZ₭[V)m0B9ړ0ܽ{t}4]vK5G@{%˥'i!*5k >\qղ> 777K KYYpqqVVVΝ;B!F-:$E֭EIIBӧ!˅REEEUVOD^^8y򤰰Һ%%%W^"<<\!Е%:v(bccersspqqnB!4i"O!YL8Q-ց RVU솴S:!P*b<\.4*5k67@Ivv ENNx'D۶mŚ5kDYY~jۨκ۷B}ɓO>)<<< W SU k,7"5tr:B!Ľ{iQ>W|"2NAAʠ OT}\֭ '''ݻ %\]]V6YwԩxBʕ+}ahӦ d2d2lقhѢx4pc۶mk is}ОQ4i(++111ڵ"rB!T*>}-c54]3‚򉈈taDDD:~QFA&I'_}6l؀qUZW@BMӬ!NJJxxx-W$?55࠶L@@ȑ#////P*(..FBB`ӦM ziג%K o_^ND5M6۷o﹦VVV(**RVuMqaXbJJJL}!}jUh,ξJKKCݥ1_y^&Mr>SÆ\DDDDƐdprrBTT\C3! ^s,_^tG"" >>>|2>c;гgO<3طo+lS4Q*k׮MW=1I&ҴH9s'OĒ%Kd 6 k׮ŹsЩS' CiCGHII7viv8/2-oLb)))D׮]1e!}{>"""LPҥKxQyuu0aua""""M '''@TP95HDDzvx wy[[[mSNY2}ݻWm[ 2۷ܹsQPPgy.;ɓ'w߭RӧOĴ8O#̟?_m"20h:/T>}q9?Rސ6O5~#"""9rE///`ݺujӳjժ ʪi#ĉW]HDDDT~ Q6mz-o1rH) \T/^٠zzjڴiӰ{nL:;w7._,Yfa툋øqW~FTTM+++?Ĺsh֬+^\\VJKKxbK4uҥ E_VVpEohڴ)6m֭[klG"2N֭}v 6 իѽ{wiիWl2=IKE5MPҲr~:޿eeeٳgq͛77Ihn߾~n߾Ν;; "zx'QPt%%%6 BVVp5$$$`˖-Y+iz}П1'2 GQQ?U(X` ,,, Zb;Жn|c#ĤժU+;C QަM߿u f_uV|k֮]}`ذa v?Ā5??wK/e˖aƌ9rpvvF@@6o gg*"ҬO>ѣG4hVXӧW_899OrrrgܹtI^t)x_ȑ#1j(+puuܹs'3r_BTj.VO?m= m'~ ŋ7W\ڱc5k@&a޼y;v,qU|w;w.[o^g.]Bbb"RRR#ڑ궚>vDDT7T}K5k-ZdҲ3oDDu+""2ϙD ߈>z|r;̙#UwN˗/;<<<0~x߿5<Q :'XYYiomms~E2 ڵ3MpDDDDDDDDDDDDDDDDDDDfL&3wDDDDDDDDDDDDDDDDDDD H^^.\H~~~8qeJ%RSS1c #-- >>>\.GBBB-GODDDDDDDDDDDDDDDDDDaI&xAOjT*7|֭[ƌz*ZhL&\.믿lٳIII~:ƌѣG zG IDATUXr!*j۷wF6m ɰe,}]׋͛s?qW{쉀QcG; " ,--Qqu"jxȼn޼aQ5qctQlڴ  `ܹ3\m۶ڵkӧcرx?cɈg}!C >>-Z7 ǭ[b6-["ɰSjѢ/^l0HjJ>}hѢQćzl޼/=ЩS'!0rHbHNNƾ}psk~ -BVVZjliR[ݻ7kkk:tvvvEII .\\deeYv v܉ݻW.]D ''O6i ???OīϟCb׮]HII}f1ICqucٳvd~???"$''HLLD.]v3$%06?":r>5X={ʕ++ܹ3]iSO={j,ӧO5_lY&"""""c˖-;v,n݊QF~3/G ENN9C5o૯Bpp0d2شi|}}i&1BZAAAؾ};2 nnnHMMOz#62 >>>Gvv<<<0~x|&u<쳕6~aaa___Tl 00WFǎ1o<~)>sܾ}?o?4ScH.Jal~ hޟDDDDDxp# Տ*M1bbccqՀWbر Ø1c2 o&Μ9qpww!**J=BCC|ZlsL&Cv팬}jaРA8v4>~eiiiT=kM4"""lll[իLڵë E<͏ s@P(eeef|_w]^HH>|hL"..EEE 8_5x1..Nz">!!!`ISd&+:J%#FDDD ٵkB\aQO"""""j|8*,,Ċ+5dW="&&Mb?{,^|EX[[k׮8y,L<ӧOGtt4&==ðӑpd2… 3g7nݻ7ϟpמ={ЬY3xyyiOYfػw4zFz*s0x`,XEZZZu~x{{=8syyyXp!"##ѿĉ:שJ*J߿&L`Æ 8z( ** .-}4?RT̘1HKK ˑ(--1e"-- nnnP(zJ>ԩS>QQQҀ`]&b5ߐADDD˞={R{!**Jcw^8::IIIҠ888`߾}ҲxH?C||-d2ѣLVVر ///"nݺ%"""B4iDB!8q^YY8pСBR)^C2;w: r۷R\O>vU6{lq9$8y( $ݻ':5mӧ+SwE|4ѴJspvvĜ9sDff8th߾ /yyyɓBx{{ ! Ϗ5xna6 UWDd:<#""j8s""yaN8!  5j(**n>ٱcGӦMDNNZ BWk֬ʗٷo_˗5iDm9CJ>JJJxxxka~iƐϟ6cu75@RR( 8qBʵNY1+?OK*۷bҤIhժm^ O+**RVuWSFh*_6aG""""""qNµkԦ 4*OT@2[l NH9s'OĒ%Kd 6 k׮ŹsЩS'CCCq!)))Ν;2hR_ݨ:j*]vŔ)S`oow'''@-4W(t=zTi!7m`Sc֭ukH[G4~cb&""cԩ%KjʌǫK몁VWUUO34?&"""""Ҧ϶/ή6c! ޽kLBP`ԩHJJRaڥK"??ߨ3g`޽ߺu _O:!C};w.3wE߾}1yd|7jea8~8>S?>1{k֬ŋѯ_?XZZJJ%H1daoo/=Аun߾ >|^^^(((u1++ 4im[]JOww%ukH[G:u_xL11M?~jӦ °zjܻw_}|cq@=Loꢊ:Ξ=8}!nV ͏:1$$6 ":@Pݨ'+8쓈\۷#** | lllGEff&-Z$-Z(++ Yfa툋øqFTTTܹs@r4k j.]h޼9"##WZ<l޼*^{5,XO=.^9sسgcYqq1h}]6ܿeeeٳgqKJJ]jz%ݠU=5FuSrذapuuETTk׮!!![lmڷ8UVx"~74mM6E֭ hb~:9}YjmS!mkؽ{7NΝ;/_FVV?DuƯMhmm… j*sZ>T0""jTdŜq>u`iim۪34ܹ3.^cĈصk߿8<==u|S[.W~\W^UΏZԆ=֮]Ð!Cڶ+ͯ][bРA?7|6mf͚u9P ,ϐl2!77HNNݻ'-Xv-^yiӦzJ>ڽ{7Ν={m۶2dr9p j/0MŨo~1{lP1'3̯s0ҭs,ckۚ5k|r\p %(--˗͛pqqG]96tե|ڰw^رrΜ98p Zn-倪& O=2+୷ު4||x!°l2]ݺuN>:̕M]ٳ+/hعs' իWqNN6nq!TȥK"$$?_X~= !DurrY_]zEڵkQg.]I&kiM}Ȑ{;1OU _xJDDD`֬Y8|pYDTj& ^~غu4-))I؈Nv5ѪU+{ip^}UpjQVVf6S*֭[jcVVë1Uխ?MN(J!aѤITi8@̞=[mqyJNj)S$沲2ѶmFѧhclmÇ b֬Y/zJT*g}&*RO*gC9mS_n݋ѩSjǥMUẔL:U"==P9rdƐ_ a|UrXijJu^FMqrsss+}oTJxիW5aH֖|wO6ۯ5ׅDS5֐߆۩ u5Yc!W>K]b㩹T|$ҍs???@MD\\4L4LTdOaaxMUbMݞW\vvv"**J(agg'\6=77W4iDo^IO<)}V*kٳ&sK7 R)ڴi#4ib،!ֽ.]ץ̧LL2Em۶Ν3wH5>tkLC {Pꡋ|uycM]Uވ7yyU/j26VmS!L_(M /6[ DҐ1>tgH\Ӭ y&8 >5 ODA~~>ǯD(/$$>4GHuR4w&!ɴ31b?nʰjWۋCQQBBB4 EQQԦ7o#F͛7w^i7q\|YCܼyݺu3YT) I&U.QWT4c@M)>u8ѐkTwXZZb8}4F & ::Zz B9"L_̱"UԕƚʛS/ݚlߚTs0w\l XZZb֭X4 pQ@TT.\saX`"##담40m111 ٳ?JRktŤ~yyyXp!"##ѿĉ|CwEgH5ٳg5k///~i4kLmpʛo Xn4h޼y۶mèQsii)<)S 00iiipss\.'W_iӦ7o֚>3J1cݑXYYA. >*!n޼~ Н35"mrJ;v -tSXX+V ##ϛ9*ʪ_XUmS\AAU=g6>W^7OODe轝{HJJ{{5kH~`mcCYY͛1c!ɤ#]Kc+0 R|5QQ^XZZ*pss[lJҲGϟ?_ӧO L&z!"++KtQJ ///"nݺ%"""B4iDW P IDATB!8q^YY8pZCBǯ>|κ2qiJRVZ O>yyyɓBx{{K唔^zpiZFF^P ʽb־ƼJ}S*'zaH=z0֭DRRֺIS  ݓ GGG6ggCKKKhҹsgaiiYizYYpqqVVVΝ;Bǯ>t萰[%%%B!DNNQ1?x@ٳGbժUb_ B-;#~w5}fJspvvĜ9sDff8th߾ /н}}.f͚+W BgSO=%MTfr01*}T4kr}4mGmqj".oDDYCί0<2|u:|9VU+a9Raaxų>+=z$F-.\4}oTTB0}5vNis]望OZ7Cϙkc aW6W6NLL ?.M#ƌcT~&V5xCm?ڎ B]Vƍ3|C?黆^)])6ꚈaG:.8?q0`tN={fѓJ%{ʕ.\S敵cG"5&q|r#'xU?DFFzx䅾٤;w4߲e6)hР=N 6{O?%dϧ^z 4m4@7o/VSjvLݫ%ݴ̤iӦѽ{'uknܸÉHz<0ڸ1߱cG"x"-[j5l\IZSLdgsSm! ҍZCvI_|dw}ELcp];r/>Lڡ4F:vQ޽)>>`?/OyIN<7ƿ)X"VԱ3WOM|1%QF}ܻw7nLcƌ>c:xo%Hz+$P=vJ޽KK.FO|$C.o}_|daaիv܉۷yذa>u+AO:tS#G0h ǃAC?#&NNLL T*L5)}e "O2x{{Գrlm(E_sbXb#?777񸳳3{=h`lGzz:wz:=Zxҹ: ;;={nBN?~?lٳD{^~eۗ/祒,<>0 01 rI\~]lذa8tf٬Y3O-aaa8}4N8`ȑHHHsSf̘ÇgϞHMME=m6IL)JJJ ֱV%55>>>ҥ fϞ ZJ|SVVʲMh4Ǐ#"Em ̍zB;Vq??? W\E0i$@޽ѩS'ٳ6lСC-fsU/_M6aҥՎ;/۪U+/7k瘹(g)fXTTTus6"88jZkչeJ|ӫW/`֭&ۤ~~~())AbbN\ZJxQz̍|hܸ1,YRPA@ll,f >M6ԩS<ت96Weذak.c /7۷@]| ͲzyTX|(=zЗ_~SۛPEEX֡C@CI<DDDP=XhRT KÆ ko6mvKKK ;V\XCHj֖8pT*ѩS(336mJV>4 ;JȰGܹstU1x=ZMΔE۶mf͚qԤI@&L͛7Ӛ5k((( M&}+..&wwwrtt ҁh͚5!]عQ۷9Ο?OШQח\"y~^^988uܹC}j(Y@رxӀgK.u{___@ׯ_Ϙ1uFD$=sJn}Զm[YØEDD(>L8ݽ{^uC%Hݣ$q_t4Qߚ~3H9`g?59 HDcI&I%ck-a1L}WD{U51 ٵ3aHLqU4l0q'MDGZW՛Z?EFFҸqH<7ƿ)X"Vر&O55DԘ?؎r%775jD#GvL>#ҿ=/C(? HZv-m۶:D3}cYLOR9XjB.\0{)1 0 S EumSOjy>}(66)88{zj1h4@-ZDEEE@vvv/^L>\ 7o͙3>*,,v;wԩSuVXAk+z諯{ƍGyyy}Tz#D֭Drrr"OBbcc~W''''𠰰0ݻ7M:Gƪʍ7(&&3[Hҿ;w-[RfhѢE:I\j5yyyi…@}l1TsѰaHVSÆ iرtMWTT$k]|^}Urvv&WWWz뭷Ν;-J[gٳgi̘1%''SwyG|Y2SLIUF;wЂ O7oޤӪUYnݺEׯ'ԪU+H틏B&LK)"y`j֬]xQ+S[6C!!!:t(3O4|jϫL۷/SΝ)==OSN{n… $KJ'[<h~c;mGu-**{EA4sLq>0FA#F^z7oNK<*S0 > i, ٵ/QTTTMTTT(HalܨO7IHPddNPJE cҸqhȐ!ԦMqhEEEkj믿X ұVI͇SCԘ>VcҎ;tʔD[͛郪(ݗwgƍuJ*J|6:99ѷ~LYOrRwa}-M_|daHw͛%K -- PBJJ ,YZ WWWxzz0n8 4uVN:er[ KSK>1~TJvׯ_h Ν8rzmk?˗/ڂ#Go"""_Zmy MIV(///Tٳ/_oABBFev{ .]2ɓ'ƍ"Bii)ߏ'2ւ7aؙu0i$|gHOOΝ;/c͚5}XgϞXn]ڤ֭|}}kZ޽{QZZjV[ KSKԘ>}=z>a111={64 F?&1 05agg_l?NNN{.-Ҿ}.|r|Ď;B[e25? ;60L]ƺ uq!:cǎ͛xPVVfS[-ןvWPXAw9޿!!!pttRШQ#tܙ$0 0LlźrJ#IJѣGcҥ:gh޼9ͽda5v-J6mX-K%|eee6l222̾|0 c b #11ӦMѽ{w?YFx*u 0R(jF15'5jv"0R%;BRM2SKV<mןfPXږ}" 6ķ~ [T#߿/Ftt4/^ ???1)))G 0 0u#ѣGf̘(<|{ٳgѧO8::K.8qx,77>>#̛7 48;;y8z(}Xv-̙3߿?1sLmVo {bڴiׯ'6mɓkg=bhذ!:w3gΈm:t1^zذaEEEXx1+_~%Q:ƴmn??c֬YpwwGVV^~e888k׮8y}LNNƱcXx1ǒa] ,,  "DEEqRa%Rm_^^`4h___h4xܹs _|0#==]<^\\9s`^stJb>>زe0 0 _aoo/[A RXHc)\^ZZ(̘1G@@-ZA(2UYKs%RsȘҮ];>|w~>d={OO?qK 0 0uBDDR^^Ng&<<-[һ+֩!CxyyQv툈H5jd կSNjڴ)?~ɉZnMW q9::Ҁvo߾M-[$ӵkFh޽5*_SP`` 'NHM6KMn,~TOA2jѢe˖QQQ8qGSubXV%0~4x 0ezF(""m3LmoJ7k.@-[UVQJJ ;e 777sϑ7=zK3g"GGG.( U1&Uw)MCHgh4dUq|s玢\9q>>@yyyDD@hbCںuXvy %"y=es|aܓǏOii)=ԭ[7z1M0.]$/ba,j_*-$O/?DԳgO D@[l1jTMf -J)*9oufF91 0L믋hǏ2:wMۓ=͝;P~~y6l 4k,V^-Z""")11Q<ޤI@k֬!Aѣ}/B`Y_Y{:t uرo6nHhbYw)[lX(mjCm2^^^R$Ruآt,Gaƒ<-~S)ZSOI<|r#'Vuʕ+ ]pA&M.(E]l;rīD*CMi.8O]v%TRRBDDw%ԥKvWnEEy{{K/$”gh BDt1޽{S||l0 c QRk%aH(;J4\IիbYYYQ^^Q\ϕ+R([Sb1ufF91 0LO]kիv܉۷yذa>u||BA:puuթ?`#G2??? 4 "deeA<|Pڏ?'@Raʔ)%e)-'s1:ֈ9aa[ɓ'quaÆСCǚ5kjOff< +ӧOĉALL F;w:̘1FϞ==z`۶m1QVZ=hǏW;fl`oͶ0 0 0DT+'RSS.]`b())91SiߥgsL=ϚjU%Xo9s&?ҥK WWWa͘4ix&g,#c!"dgguFEEU0 0&u틄YYYzJ*\)Wj8_aa,fh0gΜjDΝgggzݻuoݺɦ\e777,\%%%ԩBCC:cccǏcٲex1 cl}K  {%%%HLL)ŪU̺%ۖGm@`(5[aRm$Zvyzz'ysb69 cTw)M9^2֌Wbl.RɓX~=,X$DEEIj.m6jb3D||BIۦC&9j -Z\pYYY5x]%ci'//Iʕ+VR0fFtt4Rcǎ=zCE rlݺg?o=|||lk3a+233xbKQ^^-[߇a0 /Ă ~~~8Ͳ |ߘNoZVVM+'޽۷oڵk_߆Jœ9spiO>xQIfj̣≪Ν;WQߥ6s !wy`NZ^^^=|SKD^'_~Ç?}zb]-aaa(++Ë/{{{Ԙ\il/L{ΐ.\;wbڴi ¤Igϊu8~… [o^äIꫯ⭷… MKKJBVзo_ 0* ...0`zgy* yyyVyԩT*0j(3o???T*=-xw0dxW,!C]VB>}лwo 2ӱtR̟?&Zښa.>x2J4sTaH/);rD3FGDDI&HHHĉe$%%>ϕ+׾dFGGgϞظq]u ۷/ Yf!44i X3/뛾 0 }Pll,Spp0Qi$i4JHH @-"JHH ;;;@/Rnn.R@@͛7̙C| ;whԩ:e+V}U ^xꫯޣqQ^^_RRBqqqhݺuE˗/'ԸqcJOO~\\\-[ݻG?5hЀ?@DDK(<h4zc>>)ڼb @۷q6QW׿QFO? L...ev@zXV5(**^x_nQ[رc И1cիzے{[:n-XSF(99Yg~$%%Z;vԮ-r~~>ԭ[7:X^^^N_5T*9sfeI VKab뜐n*jHȨVOJHi2S5ƍ7%zGJdddWX~96ljjذ!;(mj.]d5-_+xEcܸq6)))֯_/mٲ4h@?MQl k4!}QWԼ`]ɏ3 0 #/>2AXש/- QEEX~ @/Rs&L@gϞ)|JKKmmM*KԗySʋ 7S|W[m'f:DAbڶm2F/jذ!=N 6K,ۺu+ݻWX"...]d1[ +8JSwux Rxhh(еk׌jZY]3f b믿Aɶ=}t4S?ZliukkXS|(..ƴi Aii)+mʗv0gsbܹin%~U=_{a)((@DDmmxL>0lx=N~_ 0 0uh4@EE-1$&&e@&MoܸǏ7ٳgѧO8::K.8qx/FXX^y;?3f͚wwwdee_v튓'O̙3߿?1sLm}͛شi&O]>,pQ}Xv"޽]vEÆ u`ZhHѮ];T*$$$ٱc\\\KͳM6 fjsU<Jt1|T,+]RR4h QTT$8;;뼸Q_-¡C ի 6վܽ0Knn.ԋ%=z4'5jhQAdd%u(ʟjo5_WUڑ9sƠV2sEQyAaa$f)))dooO?s,/mԧO%7***m۶@o&'>|0jjժ=z􈈈 @~tt4ЩSHRQϞ=HP`` L86mJݣ2jѢe˖QQQ8q}ˋڵkGDO>0j(ͥҥKz< ???j۶-ݺuK,#ԴiS:~8瓓nݚV^Mt rtt>uTO>TtMX W }+..={RHH @DDlbo=zD}3gdzѱN}6R>Xc"O VRksk.@-[UVQJJ ;˭vJlΚhnnnCDOֻ{IwƮŖ>7 K.oM]vݻӛoI6lr[P=y{{KСK֑ZJRz[nc0aBdil"}q\N\Κ5\\\>|H-[w}W/C uё<==%oߞ'vZ֯_Oh֭bpͳ^z!ݩTZ#&?vMrEJ簏O5{;vXrA۷oS˖-E}y5:|0ڻwۊ)\a,Cmi٢^u։-r먒5yϞ=m>{j..U>sZHYyU%c+oF5?u0 0~aj1a>駟Zd S^H6m͛7ŋ @rb}Ν; ni^^^RdoҤ 5k֐ tQ;w. ͚5K,ZܡCjtЁ6lOwMXW }΋$tU񜲲2<|rJ@.\闡1_c"/>Zj4g]qwwYӭyJlΚh˗/8"z:JI]-7aO}W 4탻lL##ǎ#;;;ݻ7WkGi:/>čRr;r{y@WZ""")11Q.C8::dOOOM]EEy{{K/$)7:uDTnLDwձF|V7SsEJg2m淚7>|4(a,Cmwzu@k\S 5_*D3Ū6DMa~f1ʟ?CRaڴiɘVgsDSϝ;w.&O+V ..=%wƮ 0 SWС#KKKq-tk(G^|E|@߾}MJB.~jP׶arP(׹~~~4hADʂ x'NTlWU<==qFAvv6<==2SD@^>qE!;;[rgdggKYyS5oC6G+Y+Vֶ6K+W>0@^sNl߾͛7dž 'ݎ5Y)ݪ3CT~]N崒R,gTJǵ& 0 <`1??? W\E0i$@޽ѩS'ٳ6lСCMj_ 33?v̔*3fÇѳgOG8y$:u5kIj7}ݶmQ9?h_@R6srr%%%dN^guӮ5Z~A.]0{ljP;cba+zB;k(ADln00b4o%%%Fc s1+,, OƉ'9 8w<==ukא!CPZZg=~6 =֬Yc(Y+ױ泣&RZ0/?h<,55da_|d1>M6EԩSpvv6m??? 11Q<77V2'" ǏDzetݻwԽu'sVA}f mTϛ9?Kfe uV2RȾ} 0*댥K+ּockCV6bR3 0L]>@ƍd_Xx{{#,,`r`:'Obҥz3냆l{w(ˡhc憅 :uBhh(222#44,Rm$%%QF;wXfJ(vj.m6YHHy,]TrsԩSo!7cۯlouP=}dff>0L}@`Μ9՞;w=he ɆXTu=VZ"Kkfk鎚 2 0 PҪbAoi#//h:w!ھ}s UTTe:t hё.\H5k믿N'""@ Tkr>ڴiC< "R@:x\ѣePǎ2=TF%}2DEE _~Ν;GW^Wʶoeȿcǎ5؎C5?r~?I&&L@7o5kPPPJ"777:ueffRӦM ط(ڰa_b:--PDDۖ"??_:c@޲Zj4e]Ar6)o!w+9kjrvv,ڶm5k֌Ѝ7(//O8)k%`0 S/jD#GSyy94j(+WH}6o^q%4l0=i$rtt?b;UUNNxqѓ+22ƍGDʟsƜ>1w"t.Qtt4T*?艦aÆ)Km۶ZkגZ;v蔛'j;-׮]#;;;Zlu̳+ݛN>s_EaaayfAc[;Gg}35WCJLLz_ IDAT{QRRx?^tI'חg̘AݺuR/m۶럥>g0fϞM>ˏ=J/˔Jd:> )%% RYYA /@_}{4n8ˣ\ 7o͙3>*,,ˣ˗jܸ1oF...-[Fݣ~4h@~|>999Ѻu먨vI-[f͚ѢEHͱkxHƍC֭ٙ['nܹs4l0R԰aC;v,ݼyS#:P~(00̙C׮]өdIII5oCYo抔j}%{{{ܹ3Siԩ"_h)$$&L@!!!t=`j֬]x`-Im{1T~jݧO`  ޽;^ZG(]GJ(yvH iȯWŐV!+RJ@$ gˋ&r 0 S?Pyd! ~æMb  ѣGb lذ 1tPZ)///Tٳ/_Ig֭8x كK.c]vׯ[]a9nݺ Sd4Z9o_~iѶiYr%>S7~m~… AD1cL޽{xEGGc?>ϟ;vko)jk,~!))֦(B".]2covjkSaw߅ ֮] F#~jڵ ӧO͚_5ײ2 6LQ͛7c޼yVrH]__;BR c9wC< y=VXSNaј6m͛ 64a%4h??RSSagg!C ''晍Lvq}T*iFq}SadMuaa*Ɩ0 0 ;g 0L ѤI=7oݻ=ziӦؿ?\"͛|=G#-YESv)~g=zʕ+/ǏI 0(--E\\QQQ˴-Z/@^^/_nksL6hRb5maaPg_|4ę3gпDGGc̙h۶-/FXX^y;ٳ1h h44Dii)0c ̟?Xh(;wAAA/?c֬YpwwGVV^~e888k׮> Q\\9s`b:xGa޼y@HHn߾mJYٳӧѥK8qB<&gc0 0 02~m@bbXv4iҤZƍ%_1E["Ϊ/i ///W^ppp/I;&QOU)JVd;v _\x^ {bڴiׯQW6mɓkg=bhذ!:w3gΈ*/vBxx8A@NN ܂Sba ,,  "DEEK.6"#G=~lhڴ)eQӤwVۥt9zT]f*r2 (A an\ ͛ѣxfΜ J@\t picڵb,5maa@U VP|}}%WˋڵkGDD ШQHP`` &NHM6i׮]ZlIV;v,i4mzI!!!$%&&ڲe s=G$Q--[ĉdggG=zףGo߾4sL,++E_Riҥbmۖnݺ%y S+g"aa?}}} EGGSII :uT*ٓH}ƌqMbÃ<<<,.0 cY^x 4:Զm[rpp۷oф äVUV#""0`Wk=,ȑ#ԲeK@9]v>LnnnKD7x br$3d6ޑo߿(^G :u}Nߩi?JHOQUHB!dcv|@rlll`ccCD$,Eu˫ڂvW93ίcCc5VKjڴ)=Z:7;wN!y )jU2y R~|֭[6m$]ݝLMM)'':D۶mS657ccοꚈdN UVA$?{gf͚!&&={DJ^ʔ 4###L>[̞=XnBBB }חe"""|YetRP}ֹr ie!b1O}c1SN]7nD"&Mزe v __j˩Iίj? _(+|C (o]eQ(CU UW: iOEƧ>f1c)쩏{Fv>QdĉT&/ܿ^㘫G q*ܠWVkBʷU[c1XU\\ڵW_}Ueo???ڵ ?#&L64uE!y˚>>HMje-yxx .D^^|ML:W\30uTc1k*:00PttRքK.ӫW護ޢ*kNl~~>?:vHpB:{,+?DD$H *s̘12cw5k֌7Shh(SVV%''Çe˖RRR(##I$i666UUvYDdaaA׮]#"S-z233Ɔ:w\Mёrss_UTgy/=mmm Ti/XL n/]:t@~8ݛ ҒO>4qD:s bJOOS -Xf͚EͣlCUT焄j_^{bںu+ ںu+Zl*}S˖-Ν; GyfkkK}Yn߿3uij+NMudԵm|c𙬋ݻw.]J>9::Vodތϩtu{Q?K^c@@7˗/V߬I?*55UPOVG~AP S(277-[RPṔyyyBC999ն,zj@M6?Ąʕ+˗o!_~233{NNN$$$PPPP 11ںBjjvWWcǎq}UnݺE4l0'___uV._LӦM#իW\]קQFG}D^^^No&*<ַܨ[W ӧDA4x`4hYFн1cѣG+LWݸqC|P,66aPP!  c5v"_`/_h1=u2="BZZ:t{{{ܽ{W:]"11Wӧpwwǵk״8Oe@${nL:wtׯ_;wFRRmh*WΆt cǎʕ+t/ c1{1%J-_PP777\rEmZBff(l*8i}uAmR?{g.R'Ю];x0X×@ܹSۡ05JJJ燏?X:]$O?EBB|}}_`hh000M ͚5Poe"̓u˃dūLFNi5L3eH$?Qx#c PCzXuI}e1cڦc1H$˃4[}:46a'kPA?-GXJOOѽ{wm(88/dΟludQ& 1Od1M<1(ݼyXt)ѻwoH_~ %K0etA:/==3fܹs`iiiexbL<_5\\\DDӧOcҤIpvvΝ;qe@@@-[&]/''˖-?}8;;?ŬY_oA@@rssmhUVūW0eD"1B tv*u#":tӦMCǎCBOOݻwիWSQ,UuGeؿ?|}}]v7ހ5bccq9 4x뭷p Ww\ܹs#GH$xb!""Bnj6i߾=@m5>59SP|ΩISM{kc(:O0V#$$ŋ㯿rT՞.]yى'дiS888ȜߵkW4m'OT|Y} eUs\ٳgUWRC IDATT?WT2)wCCCMرFFFnWW&cյ&ڗ/..ٳg1sL <111N8!xr|մ/Q S_B5l (h;z LӪ-4=[{*BPQ"… kkkĠW^Ӄ=]uy6.OuZhY;+:c1j UH(::,X-Ғ,--^n}aaaAvvvDD$H}dkk+ommMVVVDDN:u+VH}988PӧKNNNGmF(""JJJڵkdooOObFAϟ?N-Z?C_~є)S󓓓I__JYM6LLL(;; ܜK2%%%4|pi=+M"PAAnݚʕ+)''IGG)U]yJ!OFF-ZP\\effmۖ6mD%%%B4p *:.k׮ԣG***"ooo{:򊋋)$$DLdd$f@Sh@j/[ST=ȣ|-Sϸ&>V&Gy>1>ίdխאƆtuu+LאGV_Bh 4W /--M/ӧOWcBHQM削_ ԗ|cR<:okիb1Y[[H$o֬PH$KDDg&Y0@ӦMEJJJ/(( ;buC!**JMڰa۷oWXOEnݺEhӦMidjjJ999DDt!ڶm[dMIȪC2lll W "|2P>}h͂_*[vcŋԶm[֭fƀoW9FEku~YWA]9? o1Vq~%vرcDG"ٹ|Ah +7̤AU(4խlR*OW&cCR;vFO\T]} yq ԗ{}F1X4Ϸ*'LS=^-+K۷Gu˗/$NZOm^ ԗ|cRkX4{lbݺu ׯADVH${͚5\p`ffV.]Ǐ,,,󍌌0}tn*AhLĠgϞҁ;ӿ͛7 DBv  ɪi SH$vYd.P === *Lr\3g\~ ~MbH$/^ݻahh@)k|T9ȣ|-ϓ2*:?ܫ Uc14xx)|M!+/7|j ЪU+@___:]h$/^䭯lRyevLh-KMCThsOK]} yq ԗ&wc !qO6W˯?d֯&yje5Y[B|1cG0ݺu̙3ajjZaɓqE899pttÇ!H=|˖-^d/,'''5&Yb1߿*ϟ?)K$$$ >>VªU0j(lݺ7oDΝabbR SHFMr\RSSѶm[L0%%%Eٳ .DϞ=5}2*Eke9ڠFyu鳧<c11bJJJpyϟ?D1c(UnVVV(5FVZ!//Dy&ʬXMsںQ*%7y 1Ƙj :h{ ڴi#wu^t=BrcT'.ի066XUbZW^v ք `jj*^Vpp0Ν8^Ò%K0d$$$ɓ6mtOܐ7n 88[l.sSH$m۶U'==GΝq-9sGV ,\x71uT 23fە.Sq iڈ]1rH˔Gq?cРA7n<<]2rGMS˗|1c աhe^a/%YZZԔ(99>L-[$BԮ];z3f eff uY:Ht=j֬ ooo Prww,""*))!dgg'8&ggg@7oޤ$z9RǎI__.\HgϞPruuΞ=K",,,ڵkDDt}jѢPy,YB"/""H$dooOnnn2U7;;;@D:F:MhBڿ& CXLK.UڤvRt\ܺuܤ?_uIL˓H$Gݽ{W\^^-]TҥKCh|M(00Pek*ysjyA]^ydŮQt ?o1Vwq~%_dd$ШQ֭[T\\Lyzz}ႂ@U***ŋd D!BY߬re]h;Hp$/^YsY䭯l?$m6z%رCݻwI,-S dvYK$ǡL]} "/!ج/}u4sϘ4Ϸ!Q۷oJm|ztɓ'S=(??_nBTY9}pb266R^QQ"""н{wׯ_ܹsФI_FAACְcddTc(GH%''?~WH$899!((VXYYcnҥK߿??l `刎Zq3vQ'Ӵb9rϟǩS('.+V@AAΝ;/^`x뭷dݫί={6֮] ]]]\t }vH1Vh:?q9:u wUc8<233q55FYrJ&_CmtpFcJ#k:w;w͛裏p5 > sc1cPj=z.Otttлwoݻݫ0OV]V^~ -ѣGakklהǘZ 3g΄X,'/mcprrž={j<&Lӧ脩.dqnc1mU^uXcpoS{k;Dc1XPPP777\rE:jAi.,--ѪU+dffV'.eD033Ñ#G]&TٟUW?ƴMWW֭Ä m6L4 zqi;<curHvک)*TS28eX,@Oo3cGO^pI\t |1l08;;ɓ1c1V qqqJ+HӦuQ8uս&6l+W?GcF$iea| 99xb~9c1X='N@ll,o߾8~8H!2c14$77/\\\k.Fll,Ν;Ao_.]͛pwwҥK޽{#&&sN\|e˖qY̜9FLL ,--agg'N`ҤIpvvnΝ;9r$D"|||ŋr%Hp*1`,YSLA4>1cΝ ~~~HKKYf/7|V['N ϟ?G@@t=yuŋ1yd|pqqAPPtp*rrrl2߇3Oc1k(nܸ}B__ݺuC|||$ .\߰FLL z===#,,LayfEDԬY3@$H(66Vrٳ effVX&,,дiӈhÆ n߾]a9;; ˫E%%%I)(( "gTTI忈cc1uQIsN:2.]T){߾}<<<$4MyBj*wںmof+IZYYڵk);;[1cL ~5c_¾}/iii1c:w |R!2c1@$U'sZAAgφ/֭[~D$x{&&&-+2.̙+W_~ Q]yVH${͚5SEsYetH_mkk[a9/k!1?~`aa!fddӧuT۟111ٳ'׏1c!(B,K(oRTf xPS ݦ(ߕUt M}n߾ɓ'5k,--Tmc1~cղŖ-[h"شi;O]j;LARRR0c޹sڶm-Zh|[)))X˗/4(N" ==m۶v+VRD.:<Ǝ={`Ȑ!ظqƶEDHMME۶m1a\|Y N!&O pttľ}0rH+H=tz˖-ϟмysmҥeTٟbGQQ *#ZӮƜ_#55VVV14NNQޤ]LMMmڴ|TrJMlSjF>RLQ!RS-ѩ}@II бcGuXV~=6oތ%K`Æ ظq#VXksAݵ-c1၏]vXbkl޼!!!ؼy3lWWWWI$o3S &Ty$I?cРA7n<<` 4 DXզM,ZΝ;fܹv°a0w\ :Ta2cX a޼y={6"""vZDEE!** o+?^ެѣ(**v1V!** /^D||\ڼys8;;cӧZ|={D||ez*VX$`„ ?~< e.ooo_2u*{2Keb1tuu,' Çq233?1ZnDܾ}M4A&MЦMvʿ˶Sۈ‘#G 0~x,ZxK^yk֬ɓѬY3c޼yVkv7o#nرc5klll ==f͚ɬKqqvU@c֭ѣ`5j:v숀cx°g888߲e˰qF\pӁXǏ~ѣGQXX&M࣏>§~O5eJq4z.g.D!(˽%%%FMeO?=z`ԩrcVS*rj*weSHpl1z| &  `fV+x@O§~*}(/663f̀7ΝpX .&&&:u*&O 88'Oɓ'䄹sb*y1cjD1cǒ͛W_}Ewvh1(''"""?'sss@v7 IDAT>ڰa=zHa2Ԥ6l@[&dmmM[ZZemȠիWjڴ)A&&&V\I/_~ /I6l SSSHZp!Q~(55ܜZlIAAA$Hٳgե-[Г'O(//BBBО={(''EIc^nN:ٳgeK^yDDߦ5kiرIOOS -Xf͚Eͣ 8~8ݛ ҒO>4qD:s TKBBUhj~Mrss#SSS2661cГ'Oq?iذadddDfff'гgO,O-[;wp3E|ZsW\1cƐ.;ҪUիWcOj;}%i֭AAAC[n%@˖-B">oJIIUV222={PVV  ???&???zߗSʣ(T͚5Y|wڵd``@h͔M?88 7 mBBv-nu+ABа sssZd xBkqGSN%tImꙋ/ʊ֮][c1jHg3KIIM/ =="ƴi}}}mcLM$ ._H9roߖٳ'^zI%^|[lAII  =zv=vcjǏʕ+qE@1gSX%&]:h>k׮HLLŤ)C[ P+@_pv~'\:uœ9s0q:ЩS'z 霿2$&&b͚5صk Ѽysa̙h߾c1X-x587ҥKcҤIe1߈Ddd$.^(}Pvwww 2/P2Vݾ}f©Sɓ'cѢEhݺF7>cL=|"޽k֬g7o>QS^ׁ'OodQ+x# #*~=H$@V8:{JݻwǼyͯUѵk1c`߾}sذa6n܈LsAݵc1hh;CCC ::7nԩS%KComcLMlll={Blݺ077~dffj;dƘpI8p:uƍagguI;3cUVVVXΝ;/{x={<葩b1HcuX,sz/'+p`g~ 7Μ? .ƍA5p1#a A6mh"<|?,,,sNnnn8wCd1~#cZ={ 44333x{{/#d1 %%%ѣGqc;c XJJ <ҥK7􄗗?zի˗a``3foEU.0Ƙz3g 88Nsŧ~ ###mہI-v4՞'O ""Gll,:tǏcŜ`. $t@?=@n.ƍqơ}5ɳi&L:3gaDbb"֬Y]v͛7fΜɟwcLMx#cu˗/~t$ 1tP3hժd1!8|025^g/@GG bУG7ƯZcǎ!11]tv8y֯_M6˗044/fϞ mckDze8syyoUl{cĈpuuffr:t;w.VZpX,Ɓ8ΝѣGCOOO2c|dKJJ|tznၑ#GwDZ1Ƙb\pġCO߿?;;;-G+={6`llya0Vȱ1j]ؽHO/;_>>vS+W`8pb1ڶmӧcʔ)hݺcLBM HIRRR/_ "H$B~v,=l@7Nk |,((ٳ}}: (Ffg0|}L Qͪ8q"BCC mXѣG!H`eeL4 M6vx1Xk ?~H:t.\@QQ}pwwǨQ0h h3XEDǑ#Gp1SK.pww\\\۷oǂ KKK,_rrMiX];v`۶mٳaZ޽;Ç[HJ=ؕH$8tV^? / !cŒ;hÇؿ?~a ;w-9!0hPKA6c "P>v Q\ {s om޽;h1b&D"Av sj;$d}6֬Y__F˖-1e̘1m۶vx1Xkq :tQQQ1bZlHciʓ'OpQDFFٳ(,,h|<<<wcZ _EEEpqqO?GGGmƘ,X˗S4X l^o}`.۱n:wsbذa6V:xzfkh;KJJvE:ر}J^z?ytc2ҥKѣq%/xЇn _`pu5frƢ_~ϰcmØBϞ=i&|ٳc:>2… Çfſ/bxwn1@̙3ıcǐWbk9R{᫯‰' & ((ڵvh YC!ǎ۶Ǐ=)׭"$$7o˗/a``̙3G"ꣲ]7owݻwǵk^o0`F ///Δ̜Y=d`P:u׀1VYjj*?'NԩSi`D/@`m] 've”Sۇ1ch;+aۏ?$D"|ᇘ7o c:>2\~B\\b1 C+\]]r1XBDzi (KmmmO0`1-8q̙۷oyo1c h;4⁏!JM~)N4 AYr Y{AQQUhӧOWbU ïfGDáCpܾ}@`AI;Q񋡨A? :k+O,#..8q_"06 ҁ10n\iݜ[nx233ajjpSX,Ɓ8;#cԨQG2kx#c˗/qi>}'Oē'OvÇ #yXu', (h(hmqs)K-k4orKlhͤ" * ?έ&pu.ιs8[!h,/^d aʔ)L0A t:}-ZDQQX)h$(Z3bc Ziz!e) dú:bbbX|9rܹs1c?MGڨ".. 6qFrrr077gرL:iӦaooO/N|i91͛ٶmW^'RX8r彐OS?̙3xzz2~xmۦ8Bܳ8/_֭[ӓ_gyFBfIQ:~8111Đ@ee%۷' 1c0vXL!Zrvܩ.}E@i1b$v߾}5T˼[DEE [ф% >"?RiLKSu3f(([o!""'N0b,X -UPU;uRZW%&[QQ[neÆ DGGs5lmm8q"SN%$$kk{~|x5̙й=j!/*++ٳgƒ^K/w+̴ox{4\4+W2o<>fϞ8B4Ǐ|rQ]]M.]xWy@!D#G!-ۉԩS>kkkFŘ1c dРA&B2uuu9r7i&%{쩆 d ^!ّ#G?>񘚚2{lylmmMz$(ښ:HLO>G hIJxeD??ҥK0m4^{50"D3gXz>6LiDkt9l† ttڕzzѣGӮ]y>^iB0>A>m^'99Y :ڵK]Ą!C|R~^{%`n13vX]qhpϟ'22O>9s&ͣ[nZ'B4 > !HNNqqqܹx233}vvv5c2f|||0SUeӦMlڴzKb?)SƓ z?adggcoo;ìY[4|mYa!|-DE6ey3>_JJ |TVVbmm͟gΝK|~!3r (K qjjjصk[la֭ԩSy衇ӷddezO7NcVqq1paQGvxy0` !JB?$++85 yu=|||R!ZJvء! 0tP&L@HH~~~_VQQ+Xx1 0+WhBHQ_߯4y] `l J ԩp°:mƊ+nݺ1w\fΜIǎ@h&dk򈎎f˖-P\\ 9Gf„ <ѣQz VUkFy:!ZW322}}gnW U[Y]_zpmM'䭷$/Ybiii1~x3f !BBAőaȑ9Cb.E!Dq6o̖-[ؿ?zP!!!L4qѩS''x":k׮~e˖ѳgOGmN A|8L6 {]/[V`tXNwNדĦMغu+IIInnnL8'UCh(\4ZS4S ѪTVVg5xajkkdԨQLټوhR#JQ~O>$}z!^gÆ ,_$ 1B:|B4Tٵkvܹs>sss>FI@@#FNaB4bbbغu+111B7AN8Q -ڷoctЁo q+|_Cqay8:~]seLMM6mg$Gpx]ŋپ}zÇaǁ6<0w.l ffJ,,hz=ǎ#66۷k.!CԠiΌD(*R> !ŋIHH`$&&emll7FbĈB!acƍDGGkprr"$$iz |Mrssqvvf !4Q\\̮]سg TU QQs'J'!GٰbdhHII!..x:### Сfk)a,P.tHB4eee۷9p@OOO=z4F{_Z 6(bcV 7)͎?,'<==ˣ@hή]G}ĪUԔGy0|}}O!c|B4[߿{r>LuuޞaÆ͐CcǎN,W o߮ejjʈ#e R;sN̙Cjj*VVV3|y_4 > q݅ Xz5QQQҮ];{1BCCu33!'G6pyiAD[v7ILL~5*zSB0>_ɄЎa9tތ5J9jkav%OJ` g[ryu1}eȐ!w} 2bnnB! rlٲGbM AK(~m._L=X|9?֣VHBC~N:1k,̙s7o6mR4[*;tGUBxB4c~~p8\vvZO#^ĉj1!!+W]\\=z46_a>ma<05z2!VAA$$$cǨĄ2j(Fȑ#JJo B+MO=5lż|z!Z ^ϦMXlvח0yL!͔-ŋٿ}ꫯbaaqOEm^^[ t#xmߕPOh=[eee 4??? B޽1WO٫aϞ=jVm7N:i<Ojj*`jjʬYxw~qC;%G֔gj*233 "44 &4z㧟*K>VW9< ̚cJ(@~+?kj==/^dϞ=ٳDQQuF7… Lz*!x`޽߿CQQQfȐ!e;:Ucb"ՁL4;N 7摉(??ggg ¾}G/--e˖7PUU=gW^AB@B6@ӑ̡C@djj@ǎϏ3h C !D ͛ٺu+RJ~~~<< 6L~Yp!_~Y{"GVdee'p5ӟDhh( h/HCR0c<<ŪB(uuJ^i)@vZO$ ***8|0b޽lu)dĈ1\]]5= sJ8+4K}hV ۧ/\766  ?>Ql?Q] FF0|v|qsXŽϙ1c.Z#DGdd$k֬ }Y^{5zxB!8 > !ڤ29!n޽DDD?R[[/"gI !>~**DiIz Qn њ̞ }fm!%%r:DJJJ6G~Fϐ!CZ҈հb=6 @OɄwgΜQ޷oGZߩS'СCհ]=ǵkJS?@L TU)WӧCϞ yT-{ٰaǎZ#DSRRš5kXjϟĄiӦ !h$((**9rD^̌0h w|BuUbccپ};Z zy JIVnn.o&_|zɓ'֣F5$""B]._~<ӴoFk0^ ~ Wß4Ai; eV8΅+&55ǏsA<ѣG-ukff2dCo߾-~%ݻᥗt)8p OO8#6rLi-CzJc[VWWDž 8}4O&==]yS///뇷7н{w@[:,YᆱGA^ZO&ڪZΞ=IMM%%%TNGC,\0:thh)^JTTWŋ3qD͛GPP5@Y0iHYh<<._n_deeq9Ν;Gfft<}47=ښ޽{GG9 (Kw˗Ok=h+8{,8qN8S8caahUWÎJO?)o\]G%(0.]?#<8BEDD/^ԔӧpBxB!Z > !D3Mrr2ǎ8q̷ۛӯ_?뇏M.mKFFDGGǵkmaС3n8eiѪz>3x ._;/fɻ] >DDDW_QVV%< *}z}prrHZ˗/3g*vv%ZlRSS9~|jj*eeegff}||F֞={bbbsVWC\a\lwrRŽ=|hnʢ+++B܂NoaҥaddĤI אB > !D3V]]MZZzojj*ǎٳ7mooBMvB4٣A&%%b 0Xh>:>C hBc|U\\lڴ ^ sa֬YtI񚝤$RZ KJpøqJ )YOi=ͭQPP@AA\p .pEհc~~m?#ݻw{xxx===qwwƻPW_}}|eJKK == 2228y$ xzz 7׏^z5 utܴ ÎK!SNѷo_&OƍG;z=ׯgɒ%|?.wT ?FEC6'-={j;W(>6NG~~>.]ҥKp%Ԁc^^֭ܲ...tU 7vޝ:4bʲС,XffZO&Zr5xc1==ܛobbBc '{yyaߕ+Jqz..C?v-ŋy7O9s!Ν;Yx1۷oLJ0O !h)$(HII_x322C C.\$66۷sN^V @hY`XYYoyB|իWYf W&''ccc&OLhh(Zb9rXi RZ zHZ v>{lee%GCkK(,,maaA.]prrGGGҥptss娛@M  >=L4W9s N>ӧՀoWWWuyOOOu zOOOڷoGpk.O?)aǟVmӦԩ0t,c-Z !Dpj((ˬٳ^ LJ^zUBqz=V wMee%|W &wERSSÇ~oMQQ,]~XDRzz:|Waiiɳ>˼yիŸ|+ۺt3$H$FYY唔hQ1^Vw1%%%SVVFaaVa Cё.]舣cP]tKKF:zq7UjV퍌'z*˗/Mvv6YYYŰvK;99_k(#-M :lx7p`xa%B܋vՔBFҥKꫯs2{l:uxB!) > !Dˉ'8~LMMի^^^.}Ze 11Q B&''f̘1jo߾O+ĝ|2o6QQQ|֣& G8"##ٴizΝ / o4do@,%;e 9R@k())QbYYoー[[m;w6XTi{ %d֒s@vYY-ۮ];\]]qww{jc'zjARv\NTȑJᇡ[7m|ǼK,_ h=̵kװf֬YxB! > !ɹs-} n ^^^ooo郗nnnL.-WAA;wTRbɒxKMM_&>>SSSf͚;#֣F$GTt:=+Vȑ#1o<qɺM ֮5kAeҲ6s&k;;z^ RZZʵk(..VoaE"5XVVFQQeeet{kkk:v숥%bee%[嗶XnEG.^deYgFFF '%]=ii &i=W呓C~~>.\ ??.]DNNyyyScXW,--֭6gggLLL]m-$$(Aǟ~le{zHu a۶m>}OOOB4">#"##̌z ҧOBLHQ!#++tN<ɩSHKKɓtkkk5ycCd޽%A!ӧ6ȸ8 rԨQXYYi<~z.\HFF;̞=[ro$(իWYf W&''ccc&OLhh(Z'P]NY&LPZ 'LPnUUUUo9[-}jښӾ}{:t@0113335ܮ];022^Ov055^)ƔSUU>GIII`SjjuXX@ERͭf׮][[o׮mRړ] IDATZv;vnncco^U&&&t񎎳()7ހ>RZ^|/6Тsrۆ~sѥK\]]qssh4;wDG*+!&6lee{ǎӦ)[@IXqq1xzz8BFTYYؘSΐ!CO!$(s)N:ɓ'IOO'55LĄݻӷo_5 ٷo_Ӫ^BT[[KRR۷o'66={9fff3n82dHlN#""EQZZ7!!!Z&EcIOO'22/r,--yg ffDY{8zT/3f(pe (((ҥK6hjj111Q/@R[[Kee%:JKKeccS舙*++қ^hⴳ$ !JC47---133sssc\ ̰lcHMo߾֭J1;zO>Ql; EEE\z^ۆ놏kf5jgggpvvGGG@aq1lެlQtQNU͵Sn:O_W-Z8B&PSS?%KHNN`ر3n8B > !h4dffZ)ԩStz퐆=<<&!P^^NBBy1MgFEPPAAAOBnn.o&_|z &j* -"| -..6oތ^Օ9s /ЩS'wh~%vgj S(-A[UK.az FN ECg?^Ouu5: *++i~Cá- . Ps5ƦDlhddD~-&@f;r$$&!ߓÐ7Tm7^/..FKšUUU(++F?~27. pkbz04V?QQv <5baaAe9ldi;^~ي0ҥ v +Gןkגzܗ[pfsөS':w~ܹh4|h?!3S ;nxx+#QYMӧOgݺu8p@߄hcꈎfɒ% <0yy?Q! > !D^^'O$--^SdVVMxyyѻwoԆ>}4hBT.]bǎƲc}]taرgϞN*9rٳgo>̘3goo.%)Z >Xn9r???͛?^/%Zb+%yℲG-]*+†k\t/˅ FCco133S7jkkËagg tؑ;bii%666X[[mmmRo٩3_&MRBjjj())vzb JCv2t:4. єvpCFjկ[DoX1 7=!VVVX[[ccc`USNjka{צMJAJqT4Hhpttښl9W6l޽,Y7d…<37L'uBftԩSv{qU>c>rrr066f̟?ѣGk=h`v)~*03S g҂5p`Y]]ͅ pYYYdggsrrҥK(j׮ڂhX:;^B /.:uiۭ.%ؐJJ``=(|}$΍JC(,//ުd (eܸZq|}!`brk,^ݶfw4ZYƦ^kkkСև¶mq#DGիah%y$Qضm!!!ˬ^Zq@jj*K.ᆪggg͛Nj/HǎO!D#BAs99q}鉧'ͨj2!!^ˊӊ%KtR***4h+V 00P GGrJK˱c޼yxzzj=hdW_BT)zYs[?Kl <Ǟsq9?ln211Q歭V0[[[qpp'''ԋvΝ[8tHY޵nGsM:h ˗_md\`AvHSӧa֡rmk |Ȱ4(olߩSJqd_V &Oa8vN!^z?ƍ8Bf$;;+V駟RVV-/ͣ,3 ŐBӧOt2228}ύ޽ixzz./ !Z:Ď;cj+ 1vXFyjB4lYv-uuuL6ݵM >GDD7oFʜ9s5k۠:WZ ׯ͕ƾE 8;vLL͘q筬ٳ.Ν#33sEѾ}{LMM7[ڷoX0}la¯q6{6|A#ƞ=J]m͡޽f΄^) -Nח64)VO\[hz=]vYIqKW\g\rkѣGBр$(U|2Q/YRRr۷o.mCZ#]]]58!h\ٳGmߣXv-=z???BCCyMK@~™36oo%3׿‡^5y  ̙ 222$77all K~ₛNNNt'''pvv)E %bo%<}ig%vp!,Yt3 G(6AL ^`%8ih;-'oz!D3WVV'|Š+8<<,\___B$(#==ӧOaHoeeuS(ҰT !Z~gرco0f4hR"^/7$77ggg.]ʓO>)͜\r5k1SL!44ѣGk=hzU7nFuunn4`&&&jWWWojttth~Ђ-ReS`[>%Cn6!Tr2lެW/pwWB'رоs ђ~yGGBTWW߲l2RSS122"$$0y]B!Z8 > !RWWDž njLOO'33cccS!W^jSdN48 !hűsNvӧ}vvvĘ1cpRڔHt:DDDh6$(~---+W_R^^%?<*Z'lN:EZZpI\rWWWWuFnPw 777:tHG!Zt4L\+ 4T[xۧ=*1JعS :n vcc6z)Dkҷo_Ξ=˗eu!]eɒ%۷ÇƔ)S$!h$(B^OVVVHCks種1;wӓ={ңGz^wqq*!DM\\;v`ǎd`` =zpRZdddpB֯_O<˖-YįHQܹlق^͍W^yYfaggxBc:3gΐɓ'IJJ"55[dvkf;trz߾ljJnq9z5x֬YGܝ] 0Piǻw+dk %pu+ǃaјax%8q"88h:RZZ^^^L8͛7k=Yx1۶mooo.\O !@^^^Pȼ[>Ȯ]bllG!ra㉋#11Ru޽ TÐNNNN+Z"j*jjj>`Z֦Im"22KKKy^}U<%j:u[w^N8ANN׮]m 033 ;;;찴筮6cŊǍ/Ï-GJ`6o~ ?[3O$~Kl$%i}>][3gҡCӵLk=FSP11J16 /)ȑ(Vrssqssߟݻwk=c͚5ҩS'^y^}U)$BfHB!D3WVV!o E9s,oz ESݻ5z{{AѣGӥK -Ajj* , ::ccc{9-Z֣I|lX|9ɉ9s/^'33x8~8YYY2hll ...xyy1d~㼀y@_.@{` nۥ@8 /~G_`8OY^ ~j4SNVVc4{55g};$%) J@HyB4QQQ/aҥZ#h\ʕ+Yz5<>{kȾ"!j "A7BZkqZ[ZZKzcE,EHEȾHJ$̽}݃|ybܸqȵG!HQ!NJIHH(7y%)fKsvvVCw#%h$+;vʑ#G@бcG @`` ՞={2e QQQXYY1sLBBB$_$p)O?Ē%K8x PV ^{QXXHll,O&,,'Ore]Vae˖xxx˝Nׇ˗Ca\#rr)(0m#n6&?_W.e8&cFŗ5t9F]넧g~~89G|ĕ+7J@Ϟ%!'KXB_ Ğ={]v.Gшܼy5kְtR222hҤ ӦM !D'G!̬0ByXZZI֭iӦ M6hg"h 9z(DDD-:uĀ߿?}IQQׯgΜ9dff… BFA O~~>[laҥDEEпL“O>)ꉼSҽ{wC'*ǹs8}裏ҴiM^5࣢@d$_1, J5i &Qر#G2{l͛gr\AA[la…\x### ƬYڵBFGB!(Wzzr W\Q'$$PPPTT#u733:>!DCoFhh(ɓ`bbB $ >}Hx"&MbϞ=h4^y͛~5lX|9}9994k֌_`5L!DFFrYΜ9Ù3gxbG333ڶmt___LMMk^y}B.տx !?֭[gϞ.G!(..oaDFFh4h.{6tyBhHQ!wMՒ!K#HNN~FFF8;;"u7](>&<U{{0,`e !jPAAXZZF1tIBGQ`= @@@.>BOB!q$&&AH](Rw?55LMMqssӛ>[lݺ5NNNrqKQׯΡC ԩSjGH###:wlժ+u3g233qwwg…J `SjXx12}tF%]똢(\|Y 7={ӧOW2cccxի={B>!Dk7СY3( ::j/D/3a>C#ڿ?ٓYfSO5H!%|B!D B*w?sss;B_%,,0?Naa!;! \mׯ_gܹ\Yl.A`Sϗ_~ɒ%KL2'|R~7o 7~### iӆ={ҳgO֭M;A!j_C>o M(bn=WбgO2Bpy|}}$&L`͚5ݻ{̀ !Dz IDAT=zy?( <fbȑA!* > !⾓,=˗yf憇TﻺJ"!9BXX;v|u 200V+jSll,SNeh4Xd NNN.HJJ"==]o٪Uشi7nK.z|||n޼ɚ5kX|9iii0|pNJ ]^ɓ'9qgΜ!22+WPrF (ں:;;;ccqqIqokגp 3ߟvڑիW1555tBqWΜ9 ojmۖYf/gUBQC$(Bz'++K B&$$p۟Y~FFF899aH] ]]& !<""" %,,Grmu _~xzzXQ+Ô)Sʊ3gK}cKiժ'Nߦe˖.KOO 8Z/Q~K/y*?Q5Lw5щ'Xh}ZL믿.]իW'O$11Qo-[₩)׮]#11bu#={䡇ߟ=z[7|Bw/7EAQ *$Vr++خ][Q 0V]ӦM9}4uPBԼt,Yڵkښ~wy7177J'G!B;hZRSS?urrr7775B[wMBSŜ9sFεkj200;60\}ٵk .\{m;wLdd$3f`…ְàA*\h&--{/ǎcر?~J_裏ؿ?> ӦM#((}_ʄ lOOO6mJvv6qqqdggҥ =vl(SV+ >?111̟? lllz*....dPXXȆ ؼy3`ccCNNڵۛ7n0|CYyٴiKunhlIIpÖb, 8¯BYji 􁀀[ BTdȐ!Unax:H!j׵kXr%v;\\\*wҤI8;;3s:V!O|B!zHݴںeWWWՐ;5Rz@ryBCC dFF֖}]!|;iCt&NHTT`aaΝ;>|ի?~5"̤K cƌaݺuu\YJؾ};#F(Mqq1~--ԩS׏3f0h _W͛?~Ǐa+WmcccCvhѢyyy$&&rem<<<ݻ7={ߟ]] 姟~bĈ^_|F(|嗼l۶c^z;;ZbYYY <s,Y¥K022bСL>zPeט"~~{Z_VKTTǎDDDVUcǎj VKZZϟ6ѫW/z!zꅣ㽟l#!#11___^|EV^]f /RCVU%00.R#p9Ν;Wn>ҥK|uZ[M1s+OUKRF}2}; رnp0ã$註Bc̘1lذ>}kk:J!N^^~)/ʕ+ĬY/q,^iӦǍ'|" 5B! 4ILLTo`dbb^;YYY#u"u!IWWW<<ĉ133hbcc|m ݻ°$(BрiZԮCiiioaa;jRwsssYNơC #**J ???uj~KKKZl}gy˗^`]| G۷-ZQuTGЮ];5l!{1o<5\dzz:vٳ'[?V^,--y&111u&Kwsܹ3z~/|?pssҥKnV>9sO9r$Z0tRy뭷jx{{sekqq1>>>xxxo>&O̘1cС{aРAָsN{=),,toSLaҥdffbkk.߱c#Gd„ |'o^ kmVvܹs*^Mܟ<<?ܹ3DGGS4zAQyV\YeQ_2z?K2e wVw{t5ƒ.czA QWZnMRRZ##2닋IIIQx?^I&[U+$$7nb 4 z׍yw8q"xzzB8|0]tԩS>ʕ+&%%Z_9t@/-믿;155-:UvUGwܖwܚ>7qj֭\6{DzB=>УB˖-vG%00_~ZJ! KB!9m۶m۶nCBB$''se]a$]\\pssѱWh6lÆ ?$<s?gҥ<3]vҪky~yF2`5Cqq1o6m2%6nԩSʚYx1yyyn޼Inn:].X4B 4+VW竝 sssڵc2bnh+{j*=z/RPPPK0`BCCٿ?j:뽎lMUs{>7Qbc!(]_f]U\< #FBqBqJ)„ xꩧ XB?bcco}dd$}a߾}xxxbeBaX|B!UCjw撘Hrr12%%Ev) NNNu၃CaС :(@|Jхygy'X|9۷zsss.\9wQQQmS^x͍ eunԨQj{ k.n裏w;wd$&&XX<ٰa7ndժUeoڴ KKKBBBѣ,^׫]~}. VVV 8(ʊ7|5k֐uj |„ ƎҥKYh#F"UNn8p Nb޽z !C*RUNu}nnyyoA),l˻'6EEe+MA ԟx,YbjGBSuҷo_ɵ:!DQd !BQGtj_nɴ  8::憋 ϺNNN ~ZYѰ8qB*j7emmtZ )((лmVh޼yWX‒)Bjj]u<422F)-[7udeekUUjѣG=(1k,.\Hxx8}1t9 =Gfz|7ō ضmŋу7ocʹhт>}oqY,--ޞf͚QTTDtt4\v,,,hժP6mڰpBM֓CHKKcٺu+քOӡC֬Y2..e˖ȰaʢW^hZN>̚5{%ڵŋhZ5ťKU۷+իbbb7@?:-/,+W .0ŋ%ŕ0f<)&//\]]͘G_5Yvm?h222(,,Dբj)..uUѐ7NFT!Bz}-wRSSILL9zhqttI G:99憓:r*//O iӦm8x7t!$bjjAJQ@dNNdeeabbҠ%++f͚V%--}###۝Bϻ7`iݚ[nС8qycggǍ7ɓz.{{{o1k,~v͐!CXf -Z㥗^" fϞ E1cdŊL8y7/2^۷'h"/_СCٴiҥK GGGi׮SNUb9r9s0x`K^^:tKKKo߮6lQr K.孷bڮ V?dg۶m 2FϭI&S]r{quZ-$& A> f<)F7iժsDߵkX8{{2ˊ)..Voeh4RSSqppڵk2(B!Ꝣ"5YdJJLMMU%屰 E:;;j;;;LMM̄_}2sJGt^^^wtt///бu';;+WЩS'CRk=z47t)|{(%33 ׷k׎]t$] !Dh\;~t{=/@Qj{|"qB7wB!wLLLpssͭ0drr2)))jPRŋ+_r IDATP&Y{tq)qppK.jˋ6m`eeeE)͚5kСG( ۮ\e ]h44 bccx !BvZ6j(211T5y9~ iӦN䤆c/Q{ ]z|}} ]w^!BQh%!BzFB!QPUDQPdrr2$$$Fbb")))>Fgggk#nnn۫j4B!B!B!B!UЅHZZ ]#SSSILL$22'OVfff8::$qrrRGꂓ2B!B!B!B!5‚vѮ] uM$SSSGAQJU^(R7Ͷ#...4k֬6NU!B!B!B! FB!Bԡ#w^vj@R7vFFQ2))t.]T,--LꊃU >U!B!B!B!|B!>djj+n)RIRLwpBӢE \\\Ԯ)]\\pttGGG H !B!B!B! NB!BcxzzYvtں.III㉊q7o 3899䄃ZB!DC#_BZRPPB!B!B!h,,,˫nݺ"ui'%%LtttcffutttI"ioo/ !oaAsww7t B!B!DB!Beee>>>nKJJ iii"usq+},;;;c.䄽=jpy5yufݺu<4kХ!5zh\]] ]B4Hk֬1t B!B!DB!YXXжm[ڶm[vZtIIIJjj*iiiqܹ*YSocll\{ 7nƍcټ;,Q̙3]vqYLMMy)**"!!sssFŸq01'|Œ3aذa̘1>S̙(3W_}9‡~={6gooo~a6mTX|/S&;ƍO>.C![!~s/ǏiӦÇb v.\ƍddd`ggWkL: .`ggܹs9r$-ZPOX`fff,]~|L+ ٰa7oFQlllɡ]vx{{s ϟϏ}/׮]ˊ+p <cccEXIJJ宎+B< > !B!jK.nvu#K<tںΑZt%K0Q՟ϟϒ%Kxט:u*mڴcgXYYѺukv(?aĉDGG'joyyyL:?OlB``zx衇9r$̙3G:wL=~~~7Z9WhB!BkȐ!+++f޽{ӦMv_|Q'5 =z`ܸq\z֏Wn߾ٵk8F;֭[ ZW^y333}z-v̙34h1Bb_ @QQV"$$c5qӢE Znͮ]+ˆ#(((!){$(B!/4k֬Zl$Α%''ӧ7%88X =ʊ1chq`ǎ5j_}۷o_[Jff&O<ƴB! ^|sLLL͛U6A߹ؼys@zFQ~ǽCS IQ!BQZ YYYjH]H]d58y…* v,L477WKII{EQ)mƶmxǙ>}: gC4fzR͛ϲe˓O> @׮]aIJJSN>VȨNja;vN+B!hoNn3f ~~~Ny'4oxqiꫯXd /٧~믿^ߣ!ƴBPٳ` 0q:zt \fHQ!B`bkkKǎ+.//OARR:嶮dZZ;EEEUS12;;޽{cƌ2($''j*gϞeJDD+Vw>}I&裏_fʕ۷Y|ޅ^z-[qF5x7oΟƍYp!;vx%϶mۈȑ#@Tf?nݺoQQ#&&'''֭[GNNTz_|GJ:UۗۑR!B!ɉ;vпFExxxu6mرc)((@Qٹs'ƍ#??EQu?3wʕ+3iӦaiiW_}E^^>iӆܙ$~7~mΝ;GN8p Ppg2o< **۷oW:njlפIj=TZY̜9 ֬Y6o… 6lXΝ;㏳w^c%_6ܼy3VhL[Y$K,LJSN1tP͛K/TI!o!CT!!! >C155%<<;'''zܺu)S訷!)!B!BjjJjjr姟~R6mڤ̛7O4i2bO>biitsvvVeڴi>]q)Jf͔O>D)..UV߬奮oӦᡮgbeJzzݨQ?T)...()aaaboo+(Jff^mEEEJEQ|wʸq._*/[L>]W*(6lP^Pyo^!N3gT%<<Х4H !DswwW ]0pPfΜiR㊥K˗7.]vzˮ^r1%33S133Sk*EEEJBBbjj=n3{lٳΝ;D9qDc?Sٳg(vvvիZyJخQ7>SuxoV|||Ν;+JPPr…r߿_GyD]{n񦢔?N&LP6mܼySQES7|S h 5'2j=zP%77Zgdd(ʢEe7nP|}}%99CսZ5|uQE޵?ES qHm!B!&F#>  _f٬X۷[uÇc^f ^G;Ѹk׎"'3f ׯM>M60}t~~Gh4h4nʟɁ}y(**/ ++Xȑ#/.\e˖ꝃqn$7nL4I]鉧v?3:> tԩy!B!DM f|ٳʛiu({{{͍4Ǝ1nnnW8=<>G}DQQ/rdmmvQh4LJiӦW_믿K.$$^x+Vj*u4?Fëʀh޼9K.ꅼ7]PG7ƍٲe #GDѨׯ__| /PysN`>}֏<ݜB!BFg}/{}; 111!77(nsUk̤;~ӦMjjFuxzbʔ)DDDлw>Faڴi@ɘ9..rοKYnpeZ-yyyl߾͛73jԨ]!#j_:t-Z-_н^?h4Ǖ`CB!BQK*]helݺ$BCCԩS%BP~`ҤIXYY3f޽;tڕ/RPPPCPM=eܹ=:t/y'uU/_ϸq2e ?YhMqqqC!B!jRfعs'o_4t9*]Ikk5fjFuUyW(**c 6֭[}v}]ƌSJuk|9u'N??駟fÆ ={֭[3!DC7`_Z-z[l >w>SڒV?!DIQ!B!jɩSУG&OqUΝ;ի @*55'''u+^[x1}رc|Gpyrrrظq޶^qu]ck4^{5;c&Mu[`߾}nɓ'ٶm׿شi|fff6>S!B![Dy_LYPMnZ<]TվەVUY@֭[ɓ' WZe@LBqq1}kCՕ9s搓C?~<L8WxB;kkk-ZTi`PsݻWo}rr2PݸCPGQ|M6+#)we !B! SN<#׏޽{ӬY3C&꙼OVV111x{{ۖOK/L9Ww޼[U9f1hU-__jJӍw}3ƋG0zh}̙3gyt:wiS#+ǎ˿/Ξ= @i߾=͚5M6O!"{{{vO?#<š5kҥ>..e˖Hnݘ9s&vbż ɺuڵ+;vZCy$3o<122;?@S QB!Bccc]FDDУk 66s@.]033#44@uEabb122bĉDaa!ۗe˖1m4F_|}߿?-glڴ kk2ujՊѣG3tP<۷Yv-P25Ͷm <<BBBJl_x1vڡEhժ^{5;v W\CE?7oĚ5kp%Ut'ѹsgt'O憝;wիxXb.osԩ޽{o.\ui.Tmڴ-l۶- ЧOݻy&O iED|zرxWOx愉'DDIǎqibEhh(°dxušCн{w3fiӠho>TVM}ܽȑ#:u*c;wAW^K/&M`̙_ToNNNGNNSفJ]v|pʌc?{n 2kqܹ̉sPGSXZ۷olܸQgΜ $$} ((YYYf_8`R=\F0h4_hݺ5_n.(^_JʧVqe6n܈#F>Ð!CR "/0a|߿wjժhѢΞ= 51j(lڴ ۶mC׮]m.Eg͹*mۆAaٲe1bZz5"##n:Ӣ4_^شiSJDDK""ah_|$""""""2/""B xZjx'+įT#**Jq!??^^^%^1ĭ Jm#ojذaoPNY٢sry 6 cǎСCu֤R0rH7Çuqww鉅 BVc޼yXYzʪ? F5P1j(1 hA`~~>J+d""""""".|$""""""2/;;ϟQPP7nDLL kGGDvԽ{wtqcƌAf,N+KCxAw㑟1cܯ]o6{ _cѢEѣ @^^>CE_]KDDDDDDDe>Q{n9fB۶m1e`͚5utxDdGpvv6{G IDAT[__-[DZZv܉ѣG#$$D;ǏG1k,?52o^^0n8̘1xM.PT2dnݺ8!))Iq:Jې[TRbsJ cǎpZеkW~ItPTHKKCrrޫkԨ3gW^ٳtR{ǎغu+4hP"={Fϟ5R:u ++ o ((޺6XjժHLLDpp0ڷoW_}sI`E[ێmyŒ%Kзo_+0ydEuпUDDDDDDDDDT!]Zmp_Q ,J«Ν;FF߶mqƺm4iիg{ӦMñxb,Y݃(rq8yii_e]lehq!͛7Gff&ݻgp^^._'x>4 \kעEzh}j֬wl`|gh;WsאwJI9_x 8kۗoV̄1`<8;;_ݻqi#33Sw*K"""""""2 7nߏ $''#006m2xl~~> ##â<燖-[bʔ)T%Sn]~ޮ^ ͵={Daa! ONNF /mS$[V#==/Vj;Wsא֞+%wff&}QТtm_=z@^^~W?{Goǀ5kbɒ%ذa ۧ.<Ꚉ JNNFtt "FeSi/Ǜo#G`…>}:f͚>}8u_>L֭[ػw/g0pxzzK.JT gLff&O~cZN®]0`O?ܹs /Y/x"22RkK.矱}vL8Q w@@rssεkװ~zL4KOO輚\))'|'ر#^yo8kWTTVX,YDTV ӦM`Y;.Fecǎ'|W⫯.l$qk駟b˖-%/""௿*QHII?8@mS 6zBݶ͛ Q""RXX(O 6۷o5p@;wNjԨ!daYjKnݺ%""jZH-twwwȐM6I:u\tI_n2Kr]ݶӧKppnK/$$!!Anܸ!Rvm gΜZmoϞ=Rqr1IOOץݔNT"}SNIAA}`ʕԩtjժeݻ70{lZ ۷#ѣhѢX%#GC6mf̘apt8DDBLL Ν:: K6m-Zggg8p=C"*6m ET9q>IDd^iO8!""*;7[""""""""""h2e j5뇓'O::$""""""""*𑈈ggg,^ǎC1zh^MDDDDDDDD.@,]aQ_|$""""""""""""""""""r G"""""""""""""""""""*7𑈈 .|$""""""""""""""""""r LPՎsC*Ox9a"}Mp#Q96sL}o߾ AΝxb=27T*<#FR:CZRpRO?O<{Я_? 0/2zT*\|Mݳu?7-LSkej|72e *Vb?`<9J0f:K1 >c8t_5O4h&O_Qpܹyyyc…-[wqX<<6?rrrB6mn:;wN ]gϞut(V+jƍh۶-z~_~%oߎ_|mڴ7|S;Hm6K.ضm֬Y;vSNxguV+?Qh;zq}\֮5*44˗/`ni&|8x ͛+V'ѣG ~ߞtYʒqz^^z˗/#55xyya߾}8|0/5kքJB͚5yf<Kφ cSBݺuQc.O6lƎCھJȑ#1n8 >ϟ}'??aaa%?+`ȑ9r^ZFˆ#0h \xQq|"",mמ}Y/ovFTxڴid899Gzjڳ.+sC[X:NGTT\]]q}FxST>}:<== ge:yӖ{,_'''xyyN:b?`0tȕq\j2[RJҷejy~QLe,m^˘ *(Zxxx8: =L},YH! u㑟1cܯH||< 77Ǒ#GJh"`ӊ@^^>CEʋ2]Gr.seS^z={6_ <ƞtYqzѩS'3͚5[mڴAʳu0|K#OS+fQǥ*siJx+bJ[e3k믿矇+ZlR-nQ}g3~@`p?իc?DEEaΜ9cn www<3jժVK 0ݦeM9rM6JŠ+tlٲzy[U4i}'EF}[oYfHMME֭|WD(DTgJmqr/￯NMTQзo_8;;cͺmiX^ilQvm899!))I7LNNF͚5cY1l2Mrj =ӧT* [n!..~~~HJJҥgi_%gNoYt>Tm1<tn'ȑ#m :T Kk5L %Լ*~ʥKU:t`g̘!'N$]HZZ{bsSJ{~bkũ-͵/%;v(WyxMsoO>]EDdŊ@nQZikKʹէq%5ߔ:絵N͕ڹveҶiͽֱFz1ԖϽ14"""""2Ė?ThB %;;[N>-OOO {PpBYdJQUVFCog 9n[~~,YDK 51*g?m4 YYYz}W@&Nۦh4iDo1N駟K<==%;;[DD[IHH(G -(^OK.oWAҲZ0E[Y%m777 4i"UVf͚LGxJI66]XX(ҥKݶ(k~H .+]_{XmWkm5w(?g|@zmJbu6Ēq2:FIڒ>َ I>6kLM# oܸ!իW趽[w^x-kř:J漢'''yd2hFcǎz ޳ϕ =<Cey؛7o^{͛7/q k*((m.f[<Q?b:=+*iW枩(mkK+oZCꚈPTpvv'q[/qMÇcXd ݻs,XJW_};wF5gyhL۶m4nX&MBz~ϚSj߾}5kmСmexxx|%Kqԩ/_AFF4  IDAT޽{5_|!Cȣ(C\]]I___㜜8@iY|;h^)^eQRX{i޼9233q=pe<fmjPzm:vލӧO#??ze"Vloֶ]cT%vᅴ,ՓۆX2n#ꔈʆBdff_o~X~\ZvmL8III8wj5~']$6k5ĞtCS7?`RT[.t߳̑Mvji֦cn{q=KJJrqq1-??`E |P;v| oxS̵%kfZS]5om`:g{.JI2LEi۴^kX^c k(DDDDDDXnɺmC˖-1exzz}gܸqؿ?@|7HOOKajªgddX51nڴ> I.^N:<4Edd$~gaX`+Vĉ9z* 771՚-=.KYѳgO뢒h0p@iyyy_ ?~8ݻ=z(6 Y&,Y 6`ذazjUQE.`{-+mW#?~<owy잗)ڒ׷T2nkdkڳ=]{Rc8Jp#Qv@Æ u?Op#G`>N:\$$${5,[h[֥Yԭ[qF߳&Yfݧ6۷m|2rzƍc̙O< &ɓ1a׮]cIYa+:Ws?5 -pQQQ(ѶQZ5L6 emh^4aرccӦMٳ!a][Vnzz:W^zۋԯuM-%d!֌[\թ'"+((;# _7{cySAիG!<<جm+C=O>Aǎ|r=zbKbرcXϲ&{a{!33Я_?g<ۏ+Ji_$msס5K}1|^YѣXn}]$&&"..UT{^hm-z}O%KX͒([缶֩5Y\TI2L`>Ē{QeT英KII;@|}}?ҽ{wqvv{{zzdddȦMN:@.]$ׯ_ ۷ED$//OK/$M4WWW9sٳGVZ%ݻw7oܹsRF   6ȪUW^r-Q@ZhaS1ϐ,i޼@mh4ߜYfJ'O mhtۚ7omϞ=Rqr1IOOڵk }Ee4nχ}}}(ZΛeQRX{LJ*ҷo_9uɓ'_~/!!!@N8!ϟWmڴI<==e͚5zYzxzzʖ-[t۔iCykZ.\'''?~2fϞ-5*Q~sX=R[:F1O2~]C "O /^3n8y%//ODD^z% r ILLϜ9?2WOobOI YIڒ>K9-!ݻwF ӦJkZ׮]jժI߾} y|t^6.oooSO:%aaa{˰aU~ _ "wll 4HD߳-X:5<31tZ;~vt^l<֏<ݻmӧO`{zb-(qJگܒut^>h{<4VfKJй֭XYzlڴI'7nܰ8}K>ɶdL\}(߭y09uj.kJڕg*Jۦ=7 KdInhÅDDDDDDeڱcDDD,P0`o^4i"{.uҥ)͚5NfΜ)...,@z)eҤI2h ~={Vv*RfM1bfc{RSN2p@4hC6ligeggN o^`c駧+\kLi}(-}a!Rڳ-sQ%3si\~ݦ{cidKNN^ wT"VsJŁЮ];DGG>pt8DTL6 -38{!;111;w.RRRp*/=l?8Ξ=k0i״iSŋ 9RYOv?r}t)))pqq)<,q:QT%0޿?K.Dyyyؽ{7 \Gpq mP|1 ,X)S@V_~8yC"""""zh4 {=۷L-8H_DD\]]uVTV|I;0[+.|$"""""""*ǜxb;v ѣѡ9Z:8uJD*~dڵprr3֭[ɓ'-m{8+Ø;;;ϟQPP7nDLL kGWʶ?Xˇ*@,]a9L^^V\ @\\ -[:8uJD*~$88Z*>cxxx؜fi8RrLcݻwcΜ95k̙k֬~X^-TTZ """""""""Jtt(딈lUHӦM~KDDd/Ji?a8-d?X&""""""""""""""""""r G"""""""""""""""""""*7\tQ=zaU o"|ȸ?=zUV}(yU\HDDDDDTܹ;wttDDDDDDTp>IDxQQQG"""""2q0*ƍ;:"ZmTzXD$r5СDT&"ڷo>aÆQ9ҡCw]"""""""""*%111;w.RRRpIOO둜,;v6K`HNNƎ;pYǩjlڴ ؾ}mƍػw/v؁3gΘ=!!!HLL{,oM.^H> *U|ׯ_kzΝ;gtЦM[Ν3zJB֭gE.((k׮U駟e&""""""">QGXX]TThذmrvv֭k8'''xyyN:6gNS[Q6l@LLLif&""""""">QEqRm+UwNTꛈ.|$"""""""""*#N8^zaوD6m (((={0et 򂿿?nݺ9s 22/"BBBO?///qqq7nf̘Pr׮]ɓo"&&+W "o1qD4ixVZѣ?DEEaΜ9fsZ#;;d`ԩ3f ~mDEE!''Ǣ<<@gݻ۷oGڵ䄤$]&''f͚رc4՝֯hٲ%t4 v܉ѣG#$$Dh߾=f͚ǣQF&e1ul.K#""""""/V"ƍcԨQHOOGnn. /y!)) CEbb"yСCѭ[7?j2Wnn.:t֭[cPT1c ڵÿ/L0ӧOܹs?<ڴiݻwرc 6oٳgѶm[;ǎĉ֭[裏7T> =&Md0#GS\C ʕ+ ֏u놧z .`ٲem۶/s0ftFn0m4Ӄ#SеkWi;͛7c8{,0~xGAzrJ/CVwށڵkF7wL]b$>"""""""𑈈:u*"""""""k"""""""""2bڴi>|8/^%K޽{~3g["""""""𑈈p\p7oFVV?DVVnYWM4ATT{=ݻ5j f4hԨQ+V!CD9;wFtt47oxܹsG˗#00QQQ Bm"ok-|]|6mT*Nb,)eI&oxGkU޴u^tvm~!ܹ'''DFF5kf0osHѴsױL3g7n?CQQ{ bڽ{78^{ ^^^̫Uك$KhҤ ܾ} 6ģ>ugϞ8}4֬Y 6J*Xlnќ!uE^bǎHJJJԯ_2d/,Z;n '''Z ꫯZ{ -Z7|UVADPzu<Ž;rJxzz{vEӠA%$$`Νͅ//ּysFm۶EZZfϞܺu G׮]Qn]x{{}-7^+W͛QfM|gZޱժUkE{LWw|2Kh4TR>,V^/"wwwmGBBmۆ3fmp]|We B5b4i 40z0Fcx7۵kRSSnڮ>#^NDDDDDyQ%J!"""""""""BLL Ν::">:t耔8:@6m x#!""""*㫮JF{g}r#t]Æ 'OttHDDDDDDDD>`jժ萈=.|$""""""""""*%M6QG"""""""""""""""""""*7𑈈 G@DDDDDDDDD_tt4BCCQt%xyy9: """""" QiԨ5j0qrtDDDDDDDDDDDDDDDDDDDDJq#\HDDDDDDDDDDDDDDDDDDD>QDDDDDDDDDDDDDDDDDDDTnp#\HDDDDDDDDDDDDDDDDDDD>oΣ*ud)E1kh](-U ƨXR% 1ATAp\{ G| GD IDAT| G| G| G| G| G| G| G| G| G| G()&i{o~>HV$Ee=Liii䭷ʾ3g;NU T#Cz{Wjn׮]3}mMp5Ckҭ[J-++G`իWΩYf< M|vXgyfj׮sN8|;N_#j֬YN:餯S]!oG`VVV񒒒G۹#|vhݻwOSRRxQ9ӨQ* AѣGc|vxw]RRƍSO%N<4mڴ( u֭΀-%ԩw}gWaG|v zn햿뿮nUʺhѢnj˻=:thvCuw1O6vJ%ŗ5X֭`n C u]Wm@sUu TSj ~8%%%UЌ32pnc&@ҪUtر۠رcaVխPM-_[ըۿA6jC6jC6jC6jVU7ecǎ_ qi۶mȏ~{UPoqƥwyrYg%Iz+Gu6GE۴9կ~$޽{XϞ=3bĈ|۬soG[cɒ%I8?,Zh\tizYfm,G[gϞI /0Æ $iРA^1oʔ)iڴijԨ &<o2w|9NղeԫW/Z{_O؇zh֭ٳgsUW]:le ͘1#GuT 뮻)֨UVFٳgO΂ RVV߿5jnb\YfIiذa:v6m^l/ ʥ^$)"y7+׫W/cƌK/>:{#laɓ'w]7o/_gNӦMsg„ yײf͚̞=;ݺu.IRvT.,sNFn-+V?<γ>.]l[BV3gǘ~6mZj֬ѣGopϠARnȴirI'm45zꩴo>x`  n0(}ӧO^ l#f͚ 4h]8l2ܳno߾{s-O>_' 6q$%;1;3sɈ#V}`o:dĉ8p`VXQ13d޼y #L6-=zHN*ܹsVZݻ6Z%-Ժu$A\2ݺuSVn܌3rQGeȐ!몺j;vlK.9Sr_~Xխmg}6KIIIjԨÇ筷J[>|xjԨ'?ɬY*m߾}E&Nd_=^{mNC7n\zCf̙쓟g}m۶I#Gs|[ رcƍsnrNvҧOڵg}=رc;<;vlNc=6zh&M^kUjԨN:kVԪ`[կ~$޽{XϞ=3bĈm|\|yN?<ԩ$Ukџڵko>ŵZj͛?䜒j&vwwq)))Iƍ#lZN:묜{9s+KJJ8>l~W^I֭+VUf͚n1ڒ%K|qYh7^oҥٳ:L[o疔lך{ϟ]$7ߜ%K}fٲe馛*o[KZϞ=$^xa ?*("Iq9Sk >Xti%%%Eǎ7i7Uu+Ssckf͚N+>ÊiӦ'|R|'c=V$)ZhQ~رcŚ5k6[Q… 6m#FO߿k{(bծ]h۶&{)hӦMQv(bɒ%Eǎ}V|ӣF*&LZm{|$ĉ+?ys12kbŊK.E]T1.j׮{nM1}"I1dȐ~_ءժU+#Gٳs'g)++KYYYIҿ4j(7pCߟ . 9YfIiذa:v6m^> K/4IREJKKoV\W^ƌ^z)G}t=taСCԬYsN<9IR~$gMСCS~r!iݺWjni-$SNͤInU 9nܸ|'y'ӤIxI\tE)++o~ԨQ(_ys.{wk&IW_3gN⊊޽{nGgl{<3Ӯ]vmcwuW.䒊7~+F̙33`9mڴI6m֩5Q=>S82ywK3~\~כ6m/8&Lk5kd֭:X(v)+_ve9s2rvmYb~x`  n0(}ӧO^1rK\tE6lX1b6Y&zV\SP@f5N9,[,/F YbEN9$˓$oթاO4n8v[|{[ޛ2k&I.]Uݾ?GvXk֬ɠA69piٲeJKKmҷo{ケ[ҧOU˻' 6qd;#sL̙3ga*Zti̙x W^yeƌaÆN:k}u.]QF3g…ۿV_w8eʔu{$_kS~ a1cƤA˒|ix[hQ&Nؖ~ 6\{'osis}k{sVfmv?a5NTV:t萉'fRn$3}zO^3fLn4i$:u׿uSNz衹{s}(f=ѣgҥi׮]7oouIݺu7Yw]v/ٚ;wשS'vZ^}Ռ;6>`ԩo=k>Êc?}+u{7y'+7j(-[LYYY}|y72iҤԨQ#G86zKաC?wߝ;#=XF>(w_8∊͛7gwy'SN̈́ RRRM-${}gyf5j$iҤIϟ+b#7~ׯٵm۶m:w{.\sMFEeʕ9Ӽyi&ul2sg=o=ztv?R*)V@5Ѻu$Y+W[n>}zjqT}s9dIؙpٲey'RVVKPu2cƌuQ2dFwe۫Q Eyyyc=&I߾}Sv튟KJJҠApСWq;@%7.{NQi۶m^~ni[xq{gz>,O?tƍ7;\]`aGvz]tI׮]s'fɩ_~U=9s3|t9 ȪU2vشkn 8Nuy駫C{vÎ@!T@Q-`Uz뭷#FVR Pug$IfͪWIQEU7P5| GbE" +IENDB`qtoctave-0.10.1/qtoctave/src/doc/images/build_pngs.sh0000755000175000017500000000016011511434227021530 0ustar lucaslucasdot -Tpng modules_main.dot -o modules_main.png dot -Tpng modules_basewidget.dot -o modules_basewidget.png rm *~ qtoctave-0.10.1/qtoctave/src/doc/images/modules_diagram.odg0000644000175000017500000003264411511434227022706 0ustar lucaslucasPK5Lu6.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK5Lu6Configurations2/statusbar/PK5Lu6'Configurations2/accelerator/current.xmlPKPK5Lu6Configurations2/floater/PK5Lu6Configurations2/popupmenu/PK5Lu6Configurations2/progressbar/PK5Lu6Configurations2/menubar/PK5Lu6Configurations2/toolbar/PK5Lu6Configurations2/images/Bitmaps/PK5Lu6fRNN-Pictures/100000000000000800000008913C8356.pngPNG  IHDRKm)IDATxc?6UtJ^.XffIENDB`PK5Lu6ϣ[[-Pictures/10000000000000200000002000309F1C.pngPNG  IHDR DPLTE3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f̙333f3̙333f3fff̙fff3f̙̙3f̙3f̙3f333f3333f3ffffff3f̙3f3fOIDATxc'F*U0RU<4IENDB`PK5Lu6 content.xml\r8}߯@ik)DRWOI[OeR I(,{~bK )Q*:Rb@@A_۟5KCC3I$h^d㢱u=./iΔpTx96rSacWit.@(NyRC?(/.@還K!rKa}>~/YD7cxxx@vҘ765p[8[6U&po)&۷'N8aNaФF+ H.R,_4'4E,=N\JR 8'RR<6ROpx4hYVF*A*FszsqZ2X]{G,;}hMKhR s9M O6_@l2Ne-m#by^g۸ѷZA< nkEf2@PS{SiBf0 TatyN,bf4@<  8=D:ܒf2zR%zH0>_${ny,Lhy!)2 ZwtlHњ46O[U[_Bb4]/)_OX,'oETp<E6_Vr>o[Q@kk^UI\1BpœUNlxu\ZNus U( s4aJyR9t %M)wh'(Sx#Kx 4D#P=tcskCk !v_%BJ!Wа5WϨ=|^9=n +='-":iD6󀹻@wD\>۷*zNtEiЪvU>,`@l*B_igNC$ IH H\y032?^*j 3^/:*Ϸm[^OUh\>?UnXuۏ%_sM)HRݫ{**C퍵*9gfn=o*BIhػ؝M~}b>m徺n!4tqVQ@S<,vك{Q{pm {; *gXK`Q2B!Y*Oc"M%YHwEۍ~N@$XS8uoXB"FCz\R|3\f"\1+/ź~XF)2.Wy*FX]5S5hp^; ;t[0DG ;[;5:F>MhO?wgei$7xI`d%4E*͞IVp )l=olUiWNyѮ\cz5@G>@x/2: msϋ8$*i>&_ bRʂ/лI,xc _}A3ڽJVbX?İmPAls ` Ѓ8+furm@ÙSJ`T&)\24GIKg橈Ȃ?"aIy"k TZ x7GGF8:l/mb=}:#^Q<1p?ޞ=lſ}Np^UHO˾A<|uY8f1ֳ2،s=*L!k䷨Z$4+[aMatvAx 7D̒l=X]TуeVWcoo}λJ&xw=gP/4C/5og^uvk`J<]WbhcC?iߋxW癷g7 7L(~LaUi"fg+QU~^41KKU^CҩS=\1'0w~mA K"c-~C h[u fW}2VZ44sQiw^_;ŗW銁OV>NKxܶ'6+wӪW+YRWWw\Pj0:H;)/}{$KWGPwi%*)YUi+ooJd?*'a>\|~aglǿ h;ug2PJ";`QC50מT=[0 `'#xޙ;=gp+e?/j&5O"ފ~.N .pϤ"/Qi~0Qủͨ" mi,0,q.[I{D{u86ᄏ»{PKZn 8KPK5Lu6 styles.xml]s۸񽿂(,KnvL"! geOA)S9#>:3qbXʛoȹ"c<Co$!K֗~ro _X@/B1Mf0'مF^r\p"!1.dpS B !a]-ʌ5^>"CA]ljxW,rW xvXrs9H^Fv Xb1RRࠤKs)0ш`#CSIʇHI/l"ެf@_v{Sug]9qU&awW6oLe~+@U~%c!mT`ig559/EEؕcϛgz{|+"$ Jh@珀¥1:k -NBHkjk:ܾ}Qb-H9C\~.`Ƅ,K#r)..JD ")P XK$M2&ArbjƐd/1b~Qj!jn 6E$A=f*Js4á X0Iܸ n®./@#B= ӊE khMkc2&)m_9^l]]޳@氁|[''a OVqZiXFa J$|@TwΛ |r6;p17T؂}+#/n~`:ƞ346#l3>=<'ӥbopߟ6 O?w lv" ch1ug?9g/p6qJL ~Cݐd|nw6F\Ai|G7w@ԸN9n]ANB"yT$f ڦ mJQ07y (L]Ka!嚔D 4Ogu\Q1"KA $`[F!P11r W. j !")(:HRHAWf`QZ%9굧mQ2o]5xA+<,^//w^SBkPk)z9%ɣ-c.i*,M&:S ΏMCBfB#+DC0>%o*sMAX%a(P&C%+fPD)4fY1͊(,dy KrČ ,u[*i׬$iԭkW@ k+,uXgy n/ nBU0XZGuWgGq8)Q G/, "90J{lj׭YOaL鶧NDn[6Tmnk^mH@,XVgTwu]FlU`W0V"8E.(HF}(O?aگ%DŽSg*Ke)c=RI]R8.}uFW%nDSs$ MNf!8~BWiYhյ3qu0pi.}a5MBQU8q>Kbh ӜxT͡6X^O/diZu=D"hİe<8=Pii L6'%wTudM4ώ<55)֛>Ú:<9Pv2,[k."}s` {wq&NNД:"Mzy5W?@p9S[H!-)%= X

A'K"=$[2E-\rcX+laHHjˊ\]\ةjL.` 2cC6N,eJBXϭ p76znvt%:c݋U_^2kuC=eGJ*ߣ$fIxЈ?x/wy ϧiM۷$Dߒ[}KXoI-%ѷ$Dߒڒ00ӨxKOwMyƊ_9) ^­Y9| I;2;1"XetSv .H:PR7Y :V!plV8}u<Z [Fs*O][fOf:z6%{d%} 5c׀p_~^ 5j{&R =9NGQ%9t:z w=/hܿZ\\8c8t;_ CbsRN$SuO/B?UTݟ_SOz-ퟫwvo_U"Uǽ]䨖醒.T˨\{S. ̶Y^W(4 s% nbc7N~`IP@ AToJB߄IbcTT]=Q eu44 V~m}A[M2EG!PKm 6J PdPK5Lu6znnmeta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680m5$Build-90732006-09-10T03:46:352007-03-21T10:33:42es-ES40PT2H8M29SPK5Lu6Thumbnails/thumbnail.pngcPNG  IHDR|cIDATxْ&)"_ghEứ\sqI_ïPOF i|9qS* _HS$ ӿ(Ђz3oE-8&<-x'vabVNmgk#-HuOQ ԉq ׂsp-î (q ice~Q8aާmڱ_DՒ<%sxj)?2%ҫYyҹvgV粊Na^^?TxKlu[% n=ໄy9C ~BW='y-گ ҇],h.4%iYPX\>V#|'2B` NڌE4t^"WUf>sX^K(KHGte*U`W?p~Z:vL3; gZf8Ujmυ\а12 >;*&ole k=/ ;+ippi,NPwhlK%[(h閵/ܦY5d#eXA Dj,|g\ٶtDmEl?߮Yw Fڟ׎{ÅZK/q!xQX >u `*0yX٭d&'F$s"oxш)JhŢ~ZxFѭm٫?%1wB OƜڮlWpyYΈO ް<8R >Sg?v;O ԇ~{u:LbjQaXRp;$)$)vEHSȂ穾BBH)G\dYcͣl|8\aG>VFڑ6Zƻ紏Yڎ5.\ջ=K→Vbeou_Lo˂:ZۦzSR T/RRfK }M}R hZv״\m~{NYg*H -lm2+ZH0GiAHK/ .q=Ti>%ғQ'OF <%x2Jdɘ:ו/^!㈒TH]@bQ!5w `B" ! Cg@G@ yAXAV]]6WVCj.Wd2'v P@Fg֢9lV 6l ufyʥ֦-zR~g+@{*Zuhw.n}ui>Tt/t/ˊ!%U/"|TԾ{+eLAzMMDD53@?ބ/" =}{F![̣௮o!rgwS.҈p}.VG["1\6=1`2RE~dn{3J1$U|85Fɾ5Gק$9p` 0D&H}ZC#tTX4: 6KN0xU7|pީb"P֔"ҍajsȕB4Z{Sɯ=Y:2A HӤڟMM!, ibz(b`O}|SxS&hVgn ZN ^BN'IK1}U%r9 MK:=l;u2ך]E9'+ۏ kMŁρѥqڐ\%ܐ|/0Jխ+@85Y&&q Z#KDŽ{]Ȁ,1ˌ+Р&оqLWc tJT{sI)wQ."s9ɱ%z)ςRgmCV*!!XtG&AK 2<:.9ʋY2uXW 2pnhkfVksښXHڞ8RNJg5fȶ!ys_ dS~D  r]jYO1D=.A5FqqGu ,j{Z~\KI LJ.0<EM.GbDLfeƉ *DBo'5dGȯ2LD M ?ΡU 38 "3PsՑeÀ7Tr "}Ǚg5ɩgb[ht.žR3eSey2d]+c_mL_3w3?y3Ŗca~td-C&sW3kӁ|=fͣc͘U7twsC:~&ҳb~n^5~gXzHw=a_G 1p_]LOLOD.&#/k]uTrt&of6i1 P1m[Z!vOInσj2)Yɸ;/|ro};Ͷ&3?h<[VVq^Uqt69MN/PK®%PK5Lu6META-INF/manifest.xmlKn0@"򞘏ZAD@*.Kmyn__ڂp-9Mf']-xT֔XFڵ2u>ͦI#8NӲd TX$ *iJiƍ~eVK{%i%8֬+Tn$3 ZwM8w oST8+!.2x~fdrWA HwAH*݆ NdpՈ)jä;_{=yP-;凐3m3:p>-?ԃq/Կ숷&5֐k?sHBaseWidget WindowList->BaseWidget Terminal->BaseWidget Table->BaseWidget DinamicHelp->BaseWidget CommandList->BaseWidget Editor->BaseWidget subgraph G2 { Table->OctaveConnection[color=blue] Terminal->OctaveConnection[color=blue] DinamicHelp->OctaveConnection[color=blue] Editor->OctaveConnection[color=blue] } subgraph G1{ NumberedTextView[label="{NumberedTextView|Displays a QTextEdit with line numbers.}"] CodeEdit[label="{CodeEdit|TextEdit that supports highlited syntax and autocompletion.}"] Syntax[label="{Syntax|SyntaxHighlighter for Octave code.}"] Editor->NumberedTextView Editor->CodeEdit->Syntax } }qtoctave-0.10.1/qtoctave/src/doc/images/modules_main.dot0000644000175000017500000000340311511434227022232 0ustar lucaslucasdigraph G { node[shape=record] #BaseWidget[label="{BaseWidget|Base class for windows shown in QtOctave.}"] #Help[label="{Help|Shows simple help in html.\n Users can do searches.}"] #WindowList[label="{WindowList|Shows window list asociated to QWorkspace.\n When some item is selected,\n asociated window is maximized.}"] Main[label="{Main|Controls all modules.\n Exec application and interconnect modules.}"] #Table[label="{Table|Shows QTable with spreadsheet.\n Spreadsheet's data are from given matrix.\nWhen spreadsheet is modificated,\n matrix is modificated.}"] #Terminal[label="{Terminal|Builds windows with QtextEdit and QLineEdit.\nQTextEdit shows OctaveConnection output.\nQLineEdit is used to write commands. }"] #OctaveConnection[label="{OctaveConnection|This class build QProcess and exec Octave.\nOctave input and output\n are controlled by this class.}"] #DinamicHelp[label="{DinamicHelp|If you write a command in\n Terminal's command line,\n DynamicHelp shows\n help of commands}"] MainWindow[label="{MainWindow|Builds QtOctave's main window,\n and some menus.}"] GenerateMenu[label="{GenerateMenu|This module read builds QtOctave menus.\n These menus are read from 'menus' folder.}"] Operations[label="{Operations|Connects menu signals with callbacks.}"] Config[label="{Config|Config of QtOctave.\nAll modules need this one. }", style=bold] S1[label="{Visual tools point of view}", style=bold] #Help->BaseWidget #WindowList->BaseWidget #Terminal->BaseWidget #Table->BaseWidget #Main->Help #Main->WindowList #Main->BaseWidget #Table->OctaveConnection #Main->Terminal #Terminal->OctaveConnection Main->S1 MainWindow->S1 Main->MainWindow->GenerateMenu GenerateMenu->S1[taillabel="OctaveConnection"] MainWindow->Operations->S1 #DinamicHelp->Terminal #DinamicHelp->BaseWidget } qtoctave-0.10.1/qtoctave/src/doc/images/modules_main.png0000644000175000017500000015447411511434227022247 0ustar lucaslucasPNG  IHDR]j6bKGDtIME 0"  IDATxyXTe?O E{i] \3 3XO)". MM!\Mߜau]^5Ϲ?>gp}4"" """""""revDDDDDDDD.DDDDDDDDf X<ǫQ+++&]j<|P0jƍɩ\WWr&\\\ܣċځQ0` JDT "$$D0Ȍt!"">#C "pq Q ₅ Q.]TH[O<+-l…w^r&]>W6UAPPPr>2 t!"""""""2&]̀I""""""""3`҅ t!"""""""2&]̀I""""""""3`҅ t!""" qAA@ 22hǏ+>>}v1f̘LDd@nn.KF߾}ѵkW?-̙3ֶVEHHf͚.].\R;""""z.]`ժU˗{놆YYYXt)Mnm۶(ܾ}ǃOOO@^^BCC___l2|HLLć~ѣG8UVLQU{իWW')) wEӦMq%\`۶m/`ذaѨQ#eq}_faժUpppFvޭ,W9"""""pXв5k`ҤIeھV-DDۿ?"""0m4KA0츸"s|t!""" ꫯYfذaݻ?| b}C }I""""RO>;vsТE ԯ_:5jVXP@D.7TfmmQq|I@bbI9ppp+֭ **J)+8eh}@V޽M&&]H5SNF˱rJL2pwwG֭1uTWPDTp!&}|[U-+P>Ü9s0qD̝;~!>,ZȬ>&]~憁ɓHHHR_xnj{{{h""sOǦ>!ä _v܉7owޅFvLX@`` \]]tRܿ_zjxyy)c`8 u\Aƾ#Gb8z(޽[Nc҅*ľ}8q";޽;~._`OӧO-Z+++ 2e 0b᫯r͛7cʥk׮Ezz:6mڄׯ>S%CDTݻŋ# 0>}:^u@ p ̙3V#GN:-[;N?/bڵ?YYYƾ 77Ƨ~wy*uƍ/n4>QҬY31'".] 00!!!xekT5=zFR",:t#G,)* "((Hy^BDDDDDDTZyhPNj *FV0BDDDDDDTͤڵkغu+rssqmܹAAA`҅9t~m̛7?233OiiiV;b]r[nEdd$RSSq i"-\޽8p._lyJCͱNbѢEÇqmlݺ:w0[xZjet?!!!HNNFÆ '|AAA4˗/#88ɨ_>RRR䄏?{8!""E\\\D$55U^xi۶\pA)͕˗F'rݞV ڨvK+//OaÆRүݕy;&$00ܷ'!!!FI9։,^X7n,ZVݻ'hy%88l4cv!uԑoVZ<#6n(vvv}BGSlܸQo;aaaboo/?C?O^\\J"""" X?5RYYY_Umgggc8uTmSѠI&=SۨvK...hРRSSKne/PsYjhݻwmf6K!׮][o___JFo~ FѲeKÇo~[o;N:aÆ?@fLs|T7ӅHGDDM#XX׵L 2O.6*]5TE8˴Z5xtRdggcO0Xt)cˑq܎/駟9?O&]TuVֱG@@:99SL")) "~~~hڴ)bccѻwoXYYM68s `ƍ8y$_C!77:u*zhIIIF-ιsеkW̛7'NScbb0p@,X'OFǎ]l;֭[1j(믿ƓO>-[ĉ8|0wڵkUV8wE6M??222aaaUPIOOGXXlmmMJ#88'OK/Ν;_~QMxVŭ[\Y?cܸqܹ^,yyy3g|M|ᇰFQc`,cߏugAݺuO?0>㏰Ev nM6],̝;&L̙3Cmqh֬4 ֮]?NiJQ'"""Rt:t $;;ۤҼysYhR&$7nܐleŋKzzbaa!^^^z{߿_HF/p޽m7!!Ao;xl-[JfD.r?]SO[m+3$%%EHӒ*666Ҹqcꫯ$//OZu리W\'$$HNNtIonXowwBO~K֭[#GJݻ"R&uԤ9]tٳǍ3fIIIk 5jTc.n,e1qbii64[[[K-NZy!۷___eu eCm7o޼YΝ; .ȤIDĴ226 .DDD5 .ó>+$77פ@RSSʷl"OD xoٲh4嵡/"M*_MmWajrĉ"sٲe*"x?6ǂu]]] Ԯ][ymJ?\RW$7vL ƺo>/~I5)Xch|04iFHffܾ}[H֭sQSVb?6m7^KlٲhB/2g ׮]Sʲ%44TIJjq$ 11ѤG888w < bЭkggdh4ٳ'իWd5 +V@hh(rrrLTʪ%6opssӫS^sUDGG]vG87d%o"scpP׻w2\HLLDNNYYYHHH>[vZh7o&??hѢRw^Rfkk 64Vq㸥%>:t/^Dvv6}0eJt!"""RAϞ=20:::x(1;a=z۷Gdd$k.###֭[cԩ/S֭[M.ir >|XhMIܪXgaΜ98q"Ν?| -Zdtsܿ!22HhZ :YYY .?wrrrзo_Lx-Q̦cƌBCCm6[2SƺI""""'E~Y@^$ SQv.] >}/Ç1o<nj{{{۔~&m`[Xn^yrr2K%o"s c]Idff̙3ؼy3f͚0̝;666F1g|֭ 'Z-.] 777L<к?tPN ;tʓtݻ;wm˔q6n܈]v2Sƺ*"q""""qN o-믿dɲm6IMMWWWiѢ)K222DCts3gs@bbbڵkd9 Nxhj" O?R֤Ie, C5'bkk+k.qtt/)))0Tf>+T3S!""B48;;ٳgEDʕ+R~}ׯ_? ֭;wHXXRҥKo0֌ iڴX[[ٳ%""B6l }Q&,,X NNNrb̫&"X'"BȣyE(+@̙#_ڵK9"w1%'S={kr͕ã{k.p_?W*D1Bm&6lʽ{U8suŋkXW3NKDDD"¤Ke(ӧOquuΝ;Keڴiru2i$񑠠 6m̘1C߿/"acc#dr} KKK K.lٷo4jHej͛2k, fqI튈˒%KʦM޽{@{9OߗaÆ}~ʕ+^Zl){ٳgtIN:U"˖-Rn]Ǐ;wȷ~+j~zerLSa޽ұcG-?ou/2&]ľ+}:___$%%ADM6Ell,z +++igΜ)r$i0~x|GFFFm?ߦiu:sssSG <<<^1-80)iYOE222uV5 >>>Oe˖8q>ݻvhժΝ;~qbZj)?[[[~,WΝC׮]1oD_.Gggg (?'뼼<9{^)b,f)UP;""ҼysYhR&$7nܐliذŋKzzbaa!^^^EmqkʶsrrSN2qDebmm-}]}|MmP޽{W/QF_JxxOCBBI~2?Ƥ_>}ZRSSF7n,_}I||X[[KnݔLSwwB>iٲ4kLD6_9v2mǐ88$$D매Ȅ AAA@`cey#.nyYZcl޼y)gϞF#۷W|*C:u :u[vAQHߐ!Cw^-}4lذȸ0j(XɁ]ЫW/իWMSTdʾ)#GzݺuDEE]ں6Mmn1sssӫcaaWUS0e; nN⎩؋c!Ⱳ*+++dgg+M闲1/Y.zL$^bʕh׮42lNNÑXWuq'cUݷOy~r.DDDT^}U4hzѸqc3yyyʲ|\rcED"##֭[cԩ&=UIW_Wbʾ&fCtWQ⠬[|yOU!"/0zBˆ㫯?kyS\-/ƄOyK7,QT^sdee eՂdΜ92l0… 2`zK322iӦbmm-gϖٰaG޽+r#d۶ma8pܻwXVbcce׮]($>>^RRR{u_L0Aڶm+YYY""&Oꏂ}eʾsΝȵk֭[IMMWWWiѢ)偁%"=ͭP4[ܶ#""Dш={VDD\"zqbhMC}Xy('6.zL:~2?:u17S_~@֭['wܑ0ΥK$??`&M(ƾCȂ I^jWtٻwKF Y|Rf !e}_c1ͭŬ;tIiԨ8::%##`;"0i$񑠠 6m̘1C߿/""7oݿ_RҥK%;;T|rw^ر؈L-s='~2l0eYf\x{q-w^qvvٴiS=zqpp7˘kHM?og8\\-/X+?&̝;W֬Y#VVV@ϟ/vZ,<09X1嘗䳬~*XE#bj֬Ed< ._\m1!"2ETTt@qBBBXmQa .DPP:.....Ӆt!""O7ib)QALQP屹sK\+ """R&Oɓ'!҅ t!"""""""2^DDDDDDTMa۶mjAT9s`9.DDD5P||<\]]*,¢f\ kkkàڵkڞDd~L0...W2,++ 7oDڵѤI1}Ae˖GGG#!"s' Q s1CJԩSٳ'lllp!jdvV&L?Xp۷W; Q9""""Rٍ7D|7x뭷B nnnpQ5S3n%""""Я_?$$$ 88$\aÆӧ;wNpa҅{! L4 jT|M@xxʑQuۋj(ѣbРAرc,--eeeqƨ[.&""2?~P3gķ~^x6m Ð!CH!"jI"""hXp!c٩t#""*O@߾}Qvm;v mڴQ;$<@RRlmm^BDDDT`Ȑ!;v0YZZbw~!"jI""""%% @ZZ={T;Jex^DDDDTdeegϞ8uvH3<ׯ͛x'8^BDDDT͉ƌSN7Dpp!UZo&rrr}vC!"jI"""jn̙غu+^x]F*#G6oެr$DDT""""j,,, .\]]q 4jH*=///?IIIhذQ+];wdDCE^^{C!"*I"""jի2dD.Cnݪr$DDT1BDDDTͤo߾HKKÊ+hrwwGvT!"*I"""jÇ2d^>&MR;*7-FDDTfLU"c"**  ‚ -FDDT""""jbܹ={6y>|vvvjTyyy… HJJB  ^BDDDT |8;;cL7xňJI"""*ĉ;v,֭{Y퐪-F}ʑQUۋWSNsv؁ARҶm[\xQJ"""**--  @JJ >s&\`СŮ] &] ݣ/_I&O퐪aÆ-FDDT: ?~<֯_bΝT;jKw͛7v8DDTJ"""*f…X~=ڴio 3{בQPa҅ ٱcfΜ '''ݻjTٳgʑQUۋSNgϞ *GTs4k wAjj*jժv8DDTEJ"""*ի8p rrri&&\*k >|XP a҅KIIA߾}/VwV9""Jx{Q%={ԩS裏pBCrssѨQ#ԩS7n܀FQ;$""x Q%%"3f N:AajTcY[[_~HLLę3g&]Tnt̙3uV شi 2m]ňLۋT/wޘ1c^U777DGGQF*EH:iiihԨyjCDDU.DDDD*믿KKK޽C #:W^ykТE !"Jdڵ>:u±c*0"2} UrLU?.ݻwѵkW|wJ^Hc҅]mEƼp႙#򂳳3<|!"JI""" Clذz#GŋѪU Lh+ݻ8yQ%Ƥ Qھ};n߾mJ]"KEH&xW?ʑQeƤ QZfM2]ሎwEF%лwoXZZjBDDFLҥKTrh4ԩSAAA@ڵULչsg|8Ɖn/lق}e߿I""*./ F~IPb҅z)nǏGFFQ%ä Q9998rڡQ%ä Q+=ʞ &]ua҅ a҅ jժݻիvQ%¤ Qn1:tʑQe¤ Qu8.a҅Zn 0BDDzt!"""FFHu?piqwwǘ1cLrJC7/D̛7h4ɓ'uN8~VZ3grssKrss}vL2U/]vō7pU!"JI"""˗/W^DžtR<&Ӷm%+}̙3၎;⩧'|z [;u^|E >'Nٳamm]gaa;b?K~x=I"""RԪU Gٳ_쓒p]4mضmJ{;;;|Wׯ/1~ri KKKAUOݺu"#"I"""*"+VZfL4Lj%_^= 27nO?{yy~8t^޽{qڴiS.M6ׅ0BDDDh֬6l؀{)>ā0``X`&O;"::D?qơs|CӦM޽{ mڴ3go֭[EDD^zʿ; >\oiӦaB)S` |}}8vlmmѠA8qiii8q"4 K.~74m_u1G* Ƶk*!"";vLP׃e˖ YdlͲtRǿJ8;;hZyꩧMDDٳ@<<LU ҅ ;v,ԩ/yyy 6`رFי6m>GskNh`kk GGGۣ}h޼9Ν;mKKK5 yyyظq#n߾WÇGrr2كK.ѱМ+mݺuԩSu7o͛m…~:ƍիWgFBB,XYYYhooolڴIz~믿Fcr[EDDDdO>;vsТE ԯ_:5jVXP@D冒ʬ)x_ >FItY7nĨQ Wopssӫca5J#A\#<** =z`Bزe oȑ# Un=ׯt.DDDTSB`Xr%LRdHu֘:u*5OOOtW^GF{{{gŁeׯڼu 33zyuW 'Oo_K,%KkaڵA-Saaa]">>jCDD*c҅ā*777 8'ODBB<==D3f ѫW/uJwKǎѤIV[[rkEYO 7Aٳg#33>,&MSNaʔ)e~:k׮x1BDDDܹspm %r$DD6&]o>&Ncǎw+\|L>O,ZVVVի,,,0eXYYaĈHKKW_}-87oq֮]tlڴ ׯ_|JrGaÆx뭷0h '|GK/dpJ/M475k+Vcǎ/V<O>߿?fΜhZ9ruыûヒVZxt^rm'ѣGTs\KDDdfAAAXp!;!J.** ]^t IDATtA`` BBBޠAgz҅ux Q Ǥ Q9M{q#!""51BDDDDTڵk;;;&]j8&]ʙ:t耋/"--MpH%L7Zt/""yt!""""2ݓN8r$DD&]UQdvDDDeqeԮ][0|r٨Q#j;j&]J?~!x"Zjv8DDTt!"*ނaQ%w |nΝ'Od҅b҅'*UJ>}ƍH]Lڴi[[[jBDD*`҅LѶm[xQc҅Ȍy?=.\"rCm#fڄNb!l>ls܇GFSl%S9PP9uN]GTunn7zz^%%HJJ: 2] p)QmcхH&.DD .DDDDDjdooF!11Q(DDTXt!""""R#---trrrCDDE"""""5srrRę3gBDDE"""""5+L+5,,B:]v'!"Ģ 5_~%tL]]]ݻwG^rJTvvv R}s߆scΝ2e _']xxw燷~x QFa'9k˃`ffTf{YSȈ#]]A5kN8ƶm۰k.:u >>>2e >j_/f]v /J҂3n݊-7| صkWeffVO? O?(+k(*?Ɯ9sggg$$$Ѷm[d2[NuΏ?CCCU999;w.BBB^zԩSkԵWWW|hٲ%lllp 9r}􁁁:uTM^wƤI`aaTxxx@[[]b8..h֬N8G!882 ^^^|2ܹss/gdd`ʔ)1c &/+bхDDDPXX ^<4jHZJ(rىl߾j[II8{ +l{QQpqqBGG\666m۶B!J:t3_\.ڵ{1B.foo_kkgeee%tttB '''1aT*B_^;w!077vvvBٺurc֭Qmp႘8qBB!ݻwUG)LMMŃ*633S"11Qdee ]]]ѪU+vZQRR"nܸ!ttt{_RL .999BKKKt9bҤIPdgg !(,,͛7ƍSSRR"  J+eν!Ă T}:|r\EEEBr|_q% ==]:еkW}o+VPPB+ۦS888o߾ @jj*J%  شiFs/=zиqrǸ_:w}׹sgq1899!66ݺuÞ={< %%%U掍RİaÞq+ݟ" 0T]Y.;;;tSNqcиqc\;v쀟jB@JJJKVUxk*jZHHΝ;ӧOcѢEXh}[_i2չ wOtմiS(re;s#"E"""@5geK=?9CPTeC:/^ WWW$&&b…x1fϞ]15jWȦT*xbk!!!k !֯__022ݻwWe~ÇSe?@iAPyƍƍgxyy988 //B֌ ^/zm_Eu^_M{`nn/yyyر#&N~ SLĉkeI֭[Pn]WMz}EQm`хB 'ĉ!nkk ذaK.\.G||Bxxj]"M+VQ(/5R ""׭[7ZJDjѾ}{#errH""""Zdggt4""l,բvA.㯿: .DDDDDHWW,5,ղ#33>: .DDDDDl^v!"l,ղ8.fcх^Hqq1v܉)S^8D.DD ~҂3%uz`y:q \KKK4kL(D9 9҅HñBDDDDTd2qUBDD <sAHH!vލI&6qU6mƎ?ͭVIIIݻ7fϞ`iF/##SL3WWWL0oV}v=Zl 8qGA>}```N:!))\999;w.BBB^zԩSUfUWսӃL&S}}}ն]S?{IECaaa:Jgnn.B(JѺukѮ];T*EAA033… ENN8}ݺuBQTT$\\\DppT#󫄍h۶C !VVVbc=z$D6mĭ[Bdff T$&&,+Zj%֮]+JJJč7pwwWP({jȑ#xAyuήum߾}mU]SZ\\ ¤"ӧOKԄ#]4ܴiիW!ɠMfΜ ccc899J5cHHHԩSUmZYYʪZgee눈|'#-- }X|嗸u̙cZhggg4k s&L\ XZZ"11Qo>l2 2 [lp*󪣿#GTZ?Q.ϺTX[[RSS%NBDD¢ >}:|r\EEEB?tttTܹЮ]rTV̢E 0zh&&&G7n\xwww@|||+. ڵ+x{{WW=ZWWUהꗲ˵k$NBDD¢ :wSο{. //?~<;'''Ƣ[nسgJ%/ bhhRQ(HIIǏ+{"G]믪kJKh4IsBDDႂ`llx@٧z/^ WWW$&&b…x1fϞsrߺu 0hРꯌ~r322zWj6++J'UuM~)bхHsBDDݻ۷o#-- {EVV͛RSRR6}td2L6 Ν\rgddggCKK !!!/.w}nݺ!44*Wbǽ@hh(+9r5j̫wa>>Xz55k'Nw߅>3L>JGl2U;'N@BBj4̒%KDEEƍJ݃:}b:t(>4iҤҬ/::׺˗/ &L777o3f Ξ=ǏWyM(..~jIO&/<C?>*u"憰0̛7O8*8tn߾VZIjGIeDDDE"""""i.q""R]$ҺukBDXt!""""9t!"T,I[$DD,INj4.DDDDDiԨLLLXt!"PR ""zgΜAEEEс?_ +֭[BDXt!"z-44TDDM6|2 *-"QŢ KBݻ .… o߾ppp2&",[ 9rq͛7m6RǪ6www#Tмys;w`mm-q""I,Qo 996mR=6`dd???ã^=z˖-СC1|7sLԩSB`۶m,-Zx4 .DDTo`Ϟ=شi~C.1]JԵkW>}cǎo`Æ xV/(-fDDT)Jbx0rHOС.\7n_~A`` .Kfbbm۶aժU(,,7Ob;e#]޽+q""iBDDuҥK#** 7nPرc.]HjCRRtttЩS'P&M`ҥ8uvڥZݻwO$DDTXt!":###QQQؼyjccc# <- HII .\Jq ୷޽{ѹsg eq aх$UPPݻwc8p r9<==CҥK(**E v܉/̓ l///yONKDDE""uelڴ vR-QFaȑhݺ)IjIII8K}"0g888`ر2d,XRG8.bхjͅ i&lٲ<-ǏG`` %NHu W.`ccooo̘1.]իX5k\Nj4.DDVwUrY 00}<-T)\T r bbb`jj*u:G&I&xQɄBDDYrss{nDFF_~Q၀ 2shzzzyQ{A.]pjJXu-pQ H"" Ddd$ك\`Ĉ͛ĠAB;wDpp0֯_WWW/:ZҸqcKj.DDJ["##`iiSN'~8;;Kj\.bѢEի<%`bbBAOOO8DDTCXt!"vUDFF"22ƍ?\]]%qJN8t^ 2 .Dfwww۷=z:Zиqc@vv67o.q""),Qdee!::7zzz?OgƜ|صkrrr;w|}}aii)qJd;؉6lLLL>?cINjHsBDDsaغuj6m`„ 믿.qBj(N< 4vooo 2?3z-u,I}pB\ueEtie > QF\QMbх>oߎHC{a`` uLjN<ƍcǎRGZ͛7.~W899IVN"" ,5EEEi&߿EEEdpqqMJr <==9ʪ>|8 0f;8|0t"uZt"i"",i(RG"22;vPСC$*".0&LΞ= sssc ccc@^^I&BDa[j Gw.qB]z-Tƍ{!<<D\\\X:\.%NBDD5E"" HDEE&mԨ /DuYBBd2YHOXXnܸ5k?3tuuV&&&|QMbх¶mՄ/  q^)**ɓ'ѱcG4o\8$+V֭[ػw/ƌM6A&IKm0***8 $]|ٳQQQ8p! ___pB\QXXwwwP ˱e#22۷ǿ/cMHBQMbхS(8x {n:w ___m۶$zuG[$TW"&&={W_}[[[IK--((8 $]ꨓ'O"** XXX`ҤIkPKRp1,Py駟1c...RǪqe=~X$DDTXt!"CU^zдiS7~~~pssS=OIqqo[:1ؾ}; Çٳ]$hDEE|À'qJ":}49 Uf_|#G\<]$# ** B\.0tP4nXDPu|g8y$~GܹsTd4faхaؼy3ۧ,{X5XeEtgdشi0|:V*..: ]HT"..عs'߿U<ԡCSIKP㰱qkҤ v؁^z! gΜԱ*Ţ ?غu+nܸhѢL___CDuٳg>@(TOt V˜1cĉח:+4DDE"r C'%@ OOOhk]"zG},Y"uWRd4iOD ߿m۶!** B@GG^^^Ð!C`hh(uL:>}He˖!66˗/{{]^PAA݋H߿Ődpqq/|||`ff&uLz8vlmmaee%ugߣw abb"u,"""]APСCBLL rrr q%NITj7%%@}E"*_'utuuyf8;;cٳ'Zh!uRWa""Xt!"t=xמ[tsD6z{{^^^egg#11]vEfͤC#O?ɓ}v#|`QHðBDԩSpM۷qetСq999ATT:B|7n,K j=xzzJ4?ܹ;v?Hڊ58 $҉HYKOi&drd26l؀tl۶ X[[ر_իQHƪU0||WRGNj8҅Hp {)))x뭷i&~!RSSvZrL<ǏիW1{l\,%%~-]ږ .W^0000iZ‚ TuewqN""Չ^[naʕpqq0"#''1lmmѹsgaڵT4G&Mh"bԩRǩl\HӰBDRII >|}2 IIIѩtD$###/^ `066Fbb"o߮zITSЧO߿;v:Nq<""¢ ;w܁-ZDB?˗bhh?yyyؽ{7|||иqcaŊ&zLիWf̘=[NN?/DDTUHwѢE!DDuMaa!U_3tW3gJH-LLL*o||ř3gS Gi]H5jTfԩl… %NR9>^DDXt!"""322*7L&nQ0D5eppp]K>^DDXt!"""344,sA%JD L&ɓQRRuIGAGGRG!"Ģ zzz -066ƺuPRR"urѤIcQ cхG&Zh9^}6bbbSݻwѼyscQ Ӗ:Onn.AL߿ ܺu nݒ0gptt|s'N5k`͚56lX '{9FVBDD5E"" 777c3uT#P=giiׯԹpssCll,.];pwmHBD@|RGѣHMME@@rq[`+1qDaÆ ub 鲑`BDyXti=ze˖a000)?~wF||1СCصk֬Y8rSǏ+OioVTWyI+WFBܖ-[^C?>Ν;8҅Hq"ŋpttɓ'g$$$`߾}8p0k,deeI=9oxxx`ҥV\Zt,dzBu> t9rD8]Zl)q""i,4P9998p Zl={ROKK #F%Lr 0hР:GOO~W\p۷XXXttt^=,Q+ur|}}7o8 t!"d,4P+V_}]۵/u~hh(X|y}0qWHDDDuD>}`aa]v@,ӅHs@رrTm1}:=z˗C&Hveߓ4i1c`ŊصkjlSSӗnyׄo۷o_TT۷oͭ&"". ԀPXXGVlœB<~- jCΝ1uTxSNL&ҥKj*L2F'"" ?J͛7!$z@}u~r322zZi#((߿? J[Vv0x`e}XXX 44pwwF(նQVبp= -- ϟGVVO `ffd\xFFFpqqynWmfft{VX&T}5dErr26loooݻ$''ήy_111믿о}Z?-- .DD0WWW\|{[ow_`Ŋ8|x###:t}ł 0tP>|hҤ quu됓-[~Xd r3۸{.+[nReX`ѿhiiaʔ)ƈ#P\\/͛7;`ee~gL4 8@>}0tP 8@icܹq`ƌHLLkRXX˗&LڷoGGG3gϞ%"jؒ1j( 0DPPRRRVmvvv :jSm۶Hd%1|U\DD B||<yջI?|||zj@&A!!!غuj"33͛7/?%JEQYqCpetAAAذaC[~~~իWUEDDD͛71|p"00P]&aԨQニ/֙O 0h oرCDD Ǐ aaaQ}"""zdҥG}T & ??K,d˃7+DRdpqqAJJ 222jk׮:::/]}A__]vt# p(J=z3g΄ н{whkkѪrrr0w\z©SN~aL:}EBB,--aooB?Ɯ9sggg$$$6n܈'O(|ܹP*_GW^gdd`ʔ)1c &B`ݘ4i,,, hkkgΜQ޽{cF6mj@^.>ĝ;wʭHDD#077\.tZlk׮A&Æ Cff&ߏ;wƍň#ЬY3#G?hwy׮]PZxYb7o ,@LL d2BFBJJ &Mo>IJeNgffWe[o'O>dgggϞpvvow}ƍCVVv؁ݻw#99o&ƍg>( G/PӣGoCJ/^]4.DDDL/ЪU+"33f͂L&C۶md`Ŋ())}вe m>|xL&ȑ#ӦM@}}}\z|rґ:GZZZGLLL_b;w.VZM"++ 3g899 III󲲲5JU!JN.\>/]СCIDD#ָsNs( Z"L\tB ˝khhX3}tcXr%TV8:z(q嶻(]sutth"d2=35k -ZPBjCY_BDXt!""G |?III(**€َ1EP(HIIǏ+ ;wԩSUmBK7m@iƏcǎ ֭RСPXXX+BD|hڵk3 QKP[ׯʕ++쏈OvRRRF˖-cҤIc222}vLgƐ!C5<8v/tE]p4iHU]"##k3Ul???K5 lڴ esoܸ_ĉT*aaaPdddׯ_Gtt4l ) BCII pydeen޼ !99/^ЬY3嗌 CLL /^ #A}ur!T۶d?&&& '|@M|%]p O,_(f$%%aرRǠzӧ1glذ͛7ǣGТE 9s۷K=Bƍq:)S`Xl{=DDDI&{.V^ tuae,XO?1e̙3#F;_ 00>}:BCCvZmݺ Bfp |򂛛 GѪǏ֭[#GDZZ`ɒ%:t@rrrg!ڶm ?5ѣӧ>S̟?ҦMիWcĉj틈Étղjܹs7xC}tXt!""pe{BD333dffӧOC[[V&%""BDDrJ?8Qeffܽ{W( ;w;wVͫDDDʉt~344DHHBBBBToP}$''#77NNNj퇈Ǒ.DDDDDԩSݻKԍE""""'䨵gG5,P*jԩS$DD t!"j֮]m۶I蕥ujk_.mtSk_DD$=t'ʖGDDDQPP]]]""B-#]лwo4oڵ;8;;/_ƣGx9r˗۾zꅈuįQػw/bccqA$''Wܔl߾R=[U* ٳ8p ]<}_T2/^ļy󐑑333dffe˖ s"##D6mrRyI蕵mV?|P}$$$wXT?\EP4&4*`4_ 7kbX1^^MEbhh[{DM#6~.‚~^ϳϣ3|f, :c5rKaa!<==89s`aa3gǏo@" wVo {{]tttзo_ٳwQ\[[[L6 NBaaa=EYW$O>e* U.קCƈ#pI_1l0Tx^fffǏ 8~8o o;v|a1&&&VGŃ :c5rD"#1{lH$ۣuRh*z WN$CYP:::&* U.ק{a¤Ib裏p5L27oބ/H0rH$$$i=‡~>}\Y10~xܾ}[oc1y999P.gϞ1^]rVqfͪ/^UDI<.!H0k,BZAAƎ/7 ??3gTX abSVc1ZjU/'%%ɓ'| cFePߛ5kVn7n`GϞ=qe!O&ԩS9s&\\\ׯcРAXr%̙N:)3??ǔ)S]v]vF|| YYYU[V׮]I__ɉH& EDD(kKDg@nݺEs%ڍGڿ/;;$ iӆڵk)//._L:::(OqPΝ#|khdaaQ/eرЖ-[ɓ'JJJc5>nҥC#QRe2YZlIhǎ$(>>XaccS  #%w޽{ ͛76mDrTCc=qP*]]t"Ǫ~z !$Tn2m.))BCC M0ARtM;5kV]tOڦOՖeee%L,_н{|DB!!!-Qل-yxxi>>>Bu<T>e'ۥOqP<cIoV/w҅:tP/e3k񢺨x{f J[nD"OwwwlR:U]SXOODjW} l J*yPJyCϞ=pBbho֭"vƫDii)bccB&aܸq58bƍ _"1I?Qݵ-7m4 $$ɓShWL&Cpp0lmmm񁱱qkR.,, ͛7O>BСCJb1>ܹXMWӘj-1;wҲFp f1ֈU~ި>t),,$ԵkW*--xJBZii)$"С5n8uIR@ݺuXyZ(YYYdccCVVVB}De}HM":wLW^%"d255%y.۷Svv6 _B+ǚO]t!}}}ZlEGGӎ;h.\ZF^U)O,!Ç̌Çi߾}*Wu4^|)-^4UJѸP^uQdd$ѣ֭[TRRB7oޤ1cƐ=ݽ{9...޽{&XLrڵb1=zTHs现Ȅ c5jT[Ou׶|="]V.ڎھU9DYRO8XjuI5UXU,//묯5]RSS xdbbRm1^=>Ms\|9%$$RBCCIOOP`` Qhh( /_RAA200ݻwS^^7x6l@ϧ}`(33֯_OEG.\ ccc$;;~gj֬~AX<7##ΝK@xbzPǩo߾d``@M3fӧI*Rrr29;;.уhРA4c 'DB>u244ݻwSNN%%%;CdbbBSNt ==.]JHWWmF?k*oӦM$ښ"##iٲeGΔR{$wwwrqq!ooo򢯾 cjgϞ)OxSݸq>a[XXΝ;I"(<ĉdnnNfff(7Q_ԩSiذa4i$ӧ+ 11FIbhܸqrXY=5]ۊO^eiOeu}VWߞ={֭[ŋNI"#"`ҥdffFvNӦMԯ_?>|8 8fΜIWzi-} ^;whժU4l0RMm?x -XڍꋢQVZZJ`mMΦu֑3KթIHoQM&1^ {c___a>va8钕E7|nݺ%7|C"Hn(##C!4Z?)((dژ Rc¶ MQ(JJ2778KKK}ZtYbǏk+ީcPuX[R}ƌSNgϞƏܼyB||| Zn$ Fm(8p@+D"tA+uc[FVVVǦfff̬xtuuabbz]z[oicǎȈsa+{c.6n܈Wbر9s&w^mXNߏ)SvBv`mmx`Ȑ!022B=pWЬY3w^^`hhXped8ufΜ R,_&Mg}X H$ԉ;11FªU퍾}"..V*r9uֈGnn.̙HOOO_k׮K.صkҶW7Vƍ0`ѳgO\|vՏOM.\GGG㭷BTTWS}5[ٶmмys,_\xOsݻHMMr11kF c5ƶK>}ş+Ƞ]Қ5k\rppN:Qjj*d2H$Zk׮<|2萣JW)ED4qD255ϟS~~>999` EDDvMښ,--l1cTL@tE"j߾=mٲJKKÇO1l\N]u֭56^ZeMŋa1P@SLP5Ν; d2رc]*ׯu7o ܿ|O>)--#FcDY+WRAA]zD"999U*c6,tٶmKDI/1XǓ.1Emҥ{JJJT:ϏTj޽͛')&H1'Nv˗wpD"a@٤K;v LV"2ʇ+!###WCYTm6Ջ={PϞ=U% jRvU_r-@[lFEbX_~۷˝qvJƥجM(K+{|l„ 5֧{)99fΜIUڭSE}LL4͛75ZnAAQ^4Z.c/b1&(_ --MϜ9011K _}֬YvݱCϞ=pBb ޸v._uaݺu=z4BCC+++͚26k?hݺ5#է{iؿ1﫺JNNFZZ'>cIc///j k֬AAAʷVr_6PPP۷˥gdd`ӧ 88X.?''Khpp0\]]qE]Xre_Q,((+Wg,]aaaXb Ԏuڴi¸Qe6CΝl2{;w.`̝;W5*c6;ƌSc}꼗F |8y\^Cĉ777cǎ[n 5c']c ڶmC!==Cuݻ ~xp֭[!kvri53zht>>>?ɓ-["44'NDDDG w?qm ##ax:::X[[++EUx\MO`ccرc?;wٳg$յ9,G u PHN<ŋ(@moo-Z(<_Q*^vV79جM(JH͛X߬YjN"ʕ+1h L8IIIB] t~kwhzwHH$L0A2kb*/ 2^Fm!riiih"'rqq!OOOAs%WWW  ___Zx{ ў={֭[ŋN),,c$ %%%;CdbbBSNtD9r$b222qǏ'N9Q`` *z7hÆ 4|?~`he~z@-Z8p ;dgg?L͚5#?PVVVO;K%''3R=(.. D3f̠p;P)kgAA200ݻwS^^۷ڷoO&&&$ S+M6X,&kkke˖9;;SBB[!޽rrrԺ.ӌ36nHOrW++Vm۶@ˣP!D/_TSMcSILLTgDDN...M^^^W_ "T_ZZx?N7o&CCCᚧҞ={mۖnJ^KYjɅtsrrH__z-WѨQeq^cMH^ΝS׹s0h 8{,зo_᯿Bnn.222py~_U:+))#G~M6Ed2֬YD<{ G=(=vvv J IDAT noiOmOrr2ߏXdee Tx/ϟɕ^}gϞŔ)SCew5"** 'N14ꃥ%kI1~x|WXbE+v7nX1ƚ,h@aa!<==q!([B"??...H$prrٳZ sQi,_}gaԩrG4xFӞ^[[[L6 K,/@͛Gվk "##hѢCǏh1ƚztH$#2XٳgC"[>NtuuaaaXabbH9rTOaii-,ED"tС/򐚚cxΞ=ݻwc߾}Z+))cбcGWeٳx=cUZ~֬Y5.X}m ={vj{r}4'c(|GXr%~m,\%%%cN>lܟęGcϤ!tuuk"/yK.HIIСC^zʕ+Baaah֬2//aaa044P$&&bԨQXjѷo_(':: .`aa{{{HRUk5ŬYdɓ'LOG8x322`,Zpuu$}}}} (((@VԪ6d2^mllt333eIU2^ېV^]I]訴{u<|>G kkkk\cM\[_"ECT# ?M6SuQ٣(k׮{c ESfôi4Z.c&,ts L,_|TJG@7yyyJ:::˗DDD M:ӅoA6l)33̤jѢх ؘ^f͚(++CnJ/^p%LٙtuuGG 3fPxx8I$mVfӦM$ښ"##iٲeGt5Zt) ]]]ڶm=~X8W~LOOSyŚFǏ}YXX7ߟf̘AOV#Arr2ŔR4w\ruuŋӋ/u244ݻwSNNJ㥺>i|,]?TD-cu!iyfmÚѡk .;vFe1իq9dc|&ݻpvvFvv6<{O!F,00_}l///c׮]8v}]ckt1c000ĉX#ED Fw-JKKÞ={`kkÇk\cta1X֯_?B"`ԨQ{Cb߇oP\\ ___֌1oc5y'OFPP2331fj;$l۶ 0}t۷M6-1ث']c1JܹsqM;5ϟ?GDD0l0e`ܹ022X1^<cW{ƌ3Pi!H0k,=TZZ?022… 5R&cWO0c액ݻw_~_h;$BOOӦMX{Ç1eiFc2{ c1^)ƈ-V^^!1-pn޼#Gcǎ+w2czeյ!caαc%%%ZW9N8ggg,Xxwӂ۷>k׮߇e1Qzjmc%]]]8;;ׯ cM^||< ###ǣ{5'O:u½{4 8<\\\4)cWUITk+{$$$ ..׮]ß),ټys 8nnnduӧ/^Cb >Æ k̈|9r$"##5R&cWWIcڑDGG#::B www÷~Wj;$Vϲ`eeX{idK璒888?ࠁHcʔcERRSSSdffSNXdI{AD055EAAu;;;b˖- 0QQQ8x <ر#<<<;a,,,٬aaa֮]۷oɓw}X=۸q#W_id{ܽ{g c*;]c1~xl޼SNH$a׮]ƞ={v077{<==K "$$~~~Rʟ)L";;[ȳqsskS֯|+~!)) ۶mªqE׮]@,kL[[[|h߾"e1IX#888`ԩؼysyaΝ}6,--U.W"`Ȑ!HHHd"" :7o͛7NLX7vYcy2 ׮]&aΝ;H$o!L <-Zx*F2wO>H$8u X=Xr%.]˗cҥ)_֮]XlFd1IXo/_S?{… qF,((|'O!8q.k+<&?? ,;. Btt4P\\ o-L 0ujOeL&ŀYp)1fffx"v퐘eeezzzwLLL\fbb"sss$%%y1e5Zǎ!z0W^022¯*^XX+V`/@d2ܹ;AAA5jVZoooqqq/"B=GP^^aÆ.]߿0rH `ѢE+ew/7olllйsg?qqqw}?G`` Ѽys}عs'Ri׶_e2N:3gmZ]*K.HIIСC^zʕ+J1U 6 ׯGff&{=.1j ċ/dLHR̜9y…1Ƙz1)}}}]|rrr"///dDD}v@DDdooOuܙ숈H&QǎV߳gC inݢsT*%OOOz?qD255ϟS>}I$ڞA]v5ki@:uTd$HM6֮]Kyyyte!GGG֭[0`򗉉 5zAgΜbRz* {{{Ř&̜9ѣq͚{QfR執5Yf  &h<cta5Zdmm]1VVVr.˗/'t=!M"PHHeffɁSHHMX[[H$KKK֖<<<4}68qBn"+""wNDʒK߻w/y iݺuҞW>&55ڶmKBi׶_&*N6UX]+/R0 cǎ055>>dXfFoqy=&L@1^G<k|||`ll۷+ Cӧ 88X؜:tH.4ӦMX,(B,O>Ν;qaxzz y(((kFF6o ///j k֬vΫWGESSST omT_$7߄~ZJ}s[5 ޽; ^L*mc&o""" 0i$a5v¹s0zhںtѶm[l޼Y2{mi&SÇI,Sxx\]H,ѣGܹC-[=%XLB&333@>{Ck׮7??tBl2;vDDC&&&Կv7y{{Ӂ(++lllʊrssё4;;; \ZM~7n}4|p211!5`HK,dTZZJUm*bL>S@TZZprrr}ddd$TmeggS׮]IWW~7 DcuƓ.FﯿSҰahҤIIӧO$'&&ȑ#I,7?~,8q̌I&ѦMH,5EFFҲeHOO)--MӧWY())y244$:u*F-"{{{!$___ܱ4w\ruuŋӋ/cCnJ/^p%Laaa5#Hj_Yfff޽{iĈB/sssa&}}}ڽ{76UڥI+WZZJ#F h"mTpB@+VsY2{=^\1ƘƈxEBcӧO#** rjCZnHӧRRRo>|Uƍprr%n޼ CC:?nnn8utuu5)cO07D?QQQ8}4Ν;'iGGGaŅeggg !!) J쌋/رcxwT^\\`ffk׮}1']c5b#** QQQx"JKKmA=` :ӧ̴槟~ԩSaoo*[3[v-aʔ)Tݻwl:u nnn1']ci͋/pq[n yZ!CIZ|||qF=H$vH믿VZ֭[–󵑛 WWWܼy6m¼y4)cO0k4 &LݻTּyGciO0kR)\"L˗===W f000rUqEtk߿?Zj7oM6.k@^p9^1XIcMD"Ǒ]L066ƠAwww:::Z5e6m7qyiK ЧO$%%ѣuڭ/f͚vҥKܹ#e1']c-쌔,innn$#eMմiӰsN| v8O>۷o/6lPr݋ɓ'C,ٳx74%c1&']c>^XWWW}qqq#f1rHXXXի033vHBرcMVr0|p5jfe1ƔIc=D ."]rR`hhQ>} K,APP<== H^9D &`߾}3gZs5 駟0a Gc)Ǔ.1X%999}gbbcС#e"J3g믿Cz?3bbbjo1cƠv c ']cL:8x ^2c5Icd2_.>C?~o&?^wc.1Ƙ &&FX7--Mk۶-܄Wnݴ)Sƍ 66ǏǴiӐ |2e{! 44'O7|^zܹs011wU} }\t 8x ZlYma1.1X#$Lœ9sB^ǎ!C]v^Lqx7q )/rJm&L޽{QQQpww,[ +V-Ν;˝w-ѢE !ʕ+=z4?~)S~Pc! c1Hnݺ%s<\ȷ ~q뇗/_B$ ."ݻwǭ[aÊfffHHHCxbXZZܹypqqŋ'NDxx8-M/_b/_Ƕc5n<c52 ׮]Cll,bbbpY ݺu; !C]vp]iW/"8"IIIͣbD !!A.k׮ΆX,ƙ3g`kk[+@c׮];vl1 ta1ƚR\|111 PXX(w^:tU=W^qF̚5KSRgaӦMrw(zj_jgݘ4i<ڵK7ӧJJJсT*>pc1I_{eq@FaxR@"5fj6e?%,5 fYJEweR] [^bl.&f5,dIZ);,,( ~0Ӟg<یyp8q6mڤ5khݺuUiixll+۷׏#=z$I~̙-Z2jĉo^qF+RjϞ=ՆPCG}$W[YYm۶㘠 +22ҖK.?mٲŵLnn۝0111n!L=5u]}uDD{=]{ϡ(++ӌ3zھCڵkWΔ)S3Ϝ_RR[`U1N]h]h"N8-[hڵZn[GEE0ڻwªܩɓ'+55.nǎJLL֭[k|(##C'NOQQbbbtر*TѣN;n?~|] -]hN<[Bѣ:tP\\VZUelyзo_eeeU{LSTVViӦ)--M'Oاήرc`T nF-YD ۽~yyyѣ,˪_֭5f7NQQQJKKɓkSy|IuR7v t=zT[kp8$ڛcƌ 2M:USLrŋu]w2kڵnmaP||ƍ#FYf۷gϞr:U+jذa>|  .^"tn6nܨ/ZhQ^r%9rڴicOqTQQ>ںt;ӇUս;v(++J^ݻꫯVV܎9N믿<3$$D]tQ.]ԱcGR/G\s؀y饗4i$_4 =ޯ Bа}׊usbm-:'ZKaa}]EFF@C ~%`B؀.6 t ]l@`B؀.6 t hNKpiHCg}Ν;pM6;w̚5Kaaaݎ(11^jݹsNoQ={l TTף&e)==]>ziǎg}ކ2?@@ʠAl2ɲ,%&&*$$ĭĉYfinǺvz5::ZֱcǼ7ZÙ^^3fh̙SEGGg}@ץK%$$hɒ%ZtNEEE:pXeeL9]z^/--i&R_zرNoBBBp8+Wyw:cI:u1ocpxkYJJJt뭷j>zصNuzh]@ڵn&}v;Neeein-RvvƎ뮻վ}v /Oڵ$-ZH+8r-Z@"??_C ы/dS6l|/^7JRRR4uTIuGդIԻwo?^EEENu̲,Sdd6lؠ=z( @Zti|=1Z|&Lp޽[W@@ m۶uj/"˲o>(%%EGx͛7}r87oO?UPPK+wM:U0`:mٲE7(00P-[Tnnu}phРA_$Iyyy ;SM ==Hrx=vF߿mŊfԨQUH2HӾ}{c1e#FĘ|ԩ[[XXqo۶vS=v:_~V\\lLv̟UjiYeL֭$3Ϙݬ[΄I&;;z*_˲LiiiժdMf9bnjLnݪ]fmFI?vر$%%^{9N3h o>Wsc̄ LPP9|1ƘǏ֭[{7|,˫z KOOj!tn&t,tH2yyych֯__m_/"#,\Xerss]<}6c a9:2281g|͛|uر^x:GyDNS+WԨQj5W^Q޽yfM6M'N /֧_q:nۣ.r)soZ?$ <ث>5fsNIҐ!Cκ8_`{ZxVXAvL\\JJJ4|+33zС s=uYIIIڴi~%%%qs scƌQ˖-5r*TTTꫯSrr$)22R%IZp-^X$믲,KTQQ~w\R$:p뽼 cZj%I駟{n}݊+Ç͙3GݺuSJJRSSOۧZjM ]=sLuUIIITcYY[[uڿɓnx+99Yի<Ç+<<\)))JKK_Einwh/K͛{u}MZZZ zjzē;OJHHP۶m=9vϟUVѣQOjժU=3:vLW^ڶmfϞO>DcƌQ~~ .@:uRVf}ᇺ[oVի}eggD W``۶mJ ,PppF#GjϞ=z״k.}g…  %$$G:͟?J-O?t$##<-_\K,Q``Լyst=6mڤw}WNSm۶UNGi…2ƨyꪫNH7ڵKs՚5kT\\K/T͛7W˖-OkѢ OTY/OԩFY-[f͚)33$աCt=H:?eY:thCbW޽ku@0u8'K4iuAA"""|Xjre_͂aBo:==]>`/ @#VOI>+ th; ޽[qU_ Rrr/;]l@`B؀.6 t ]l@`__~Y.8g@=!t5u ؀cuu!_4jѢ؀<^`tFIENDB`qtoctave-0.10.1/qtoctave/src/menus/Data/save_data.menu0000644000175000017500000000465211511434227021660 0ustar lucaslucas#Save matrix to file menu_name=Save matrix to file input_label= Matrix input= output_label= File output_file= output_label= Type begin{output_list} -text -binary -force -ascii -mat -mat-binary -6 -v6 -7 -v7 -V4 -v4 -4 -mat4-binary -hdf5 -float-hdf5 -import -z -zip end{output_list} begin{command} save("%o2%", "%o1%", "%i1%") end{command} begin{help}

Save matrix data to selected file.

Valid options for `load' are listed in the following list:

`-force'
The `-force' option is accepted but ignored for backward compatiability. Octave now overwrites variables currently in memory with the same name as those found in the file.
`-ascii'
Force Octave to assume the file contains columns of numbers in text format without any header or other information. Data in the file will be loaded as a single numeric matrix with the name of the variable derived from the name of the file.
`-binary'
Force Octave to assume the file is in Octave's binary format.
`-mat' `-mat-binary' `-6' `-v6' `-7' `-v7'
Force Octave to assume the file is in MATLAB's version 6 or 7 binary format.
`-V4' `-v4' `-4' `-mat4-binary'
Force Octave to assume the file is in the binary format written by MATLAB version 4.
`-hdf5'
Force Octave to assume the file is in HDF5 format. (HDF5 is a free, portable binary format developed by the National Center for Supercomputing Applications at the University of Illinois.) Note that Octave can read HDF5 files not created by itself, but may skip some datasets in formats that it cannot support.
HDF5 load and save are not available, as this Octave executable was not linked with the HDF5 library.
`-float-hdf5'
Save the data in HDF5 format but only using single precision. You should use this format only if you know that all the values to be saved can be represented in single precision.
`-import'
The `-import' is accepted but ignored for backward compatiability. Octave can now support multi-dimensional HDF data and automatically modifies variable names if they are invalid Octave identifiers.
`-text'
Force Octave to assume the file is in Octave's text format.
`-zip' `-z'
Use the gzip algorithm to compress the file. This works equally on files that are compressed with gzip outside of octave, and gzip can equally be used to convert the files for backward compatibility. end{help} qtoctave-0.10.1/qtoctave/src/menus/Data/format_output.menu0000644000175000017500000000107011511434227022630 0ustar lucaslucas#Control the format of the output produced by `disp' and Octave's normal echoing mechanism. menu_name=Format of the displayed output output_label= Format begin{output_list} short short e short E short g short G long long e long E long g long G free bank + native-hex hex native-bit bit compact loose end{output_list} begin{command} format %o1% end{command} begin{help} Control the format of the output produced by `disp' and Octave's normal echoing mechanism.
Type:
help format

In terminal for help. end{help} qtoctave-0.10.1/qtoctave/src/menus/Data/load_data.menu0000644000175000017500000000444011511434227021634 0ustar lucaslucas#Load matrix from file menu_name=Load matrix from file input_label= File input_file= input_label= Type begin{input_list} -text -binary -force -ascii -mat -mat-binary -6 -v6 -7 -v7 -V4 -v4 -4 -mat4-binary -hdf5 -import end{input_list} output_label= Matrix output= begin{command} load("%i2%", "%i1%", "%o1%") end{command} begin{help}

Load data from file and put this data in given matrix.

Valid options for `load' are listed in the following list:

`-force'
The `-force' option is accepted but ignored for backward compatiability. Octave now overwrites variables currently in memory with the same name as those found in the file.
`-ascii'
Force Octave to assume the file contains columns of numbers in text format without any header or other information. Data in the file will be loaded as a single numeric matrix with the name of the variable derived from the name of the file.
`-binary'
Force Octave to assume the file is in Octave's binary format.
`-mat' `-mat-binary' `-6' `-v6' `-7' `-v7'
Force Octave to assume the file is in MATLAB's version 6 or 7 binary format.
`-V4' `-v4' `-4' `-mat4-binary'
Force Octave to assume the file is in the binary format written by MATLAB version 4.
`-hdf5'
Force Octave to assume the file is in HDF5 format. (HDF5 is a free, portable binary format developed by the National Center for Supercomputing Applications at the University of Illinois.) Note that Octave can read HDF5 files not created by itself, but may skip some datasets in formats that it cannot support.
HDF5 load and save are not available, as this Octave executable was not linked with the HDF5 library.
`-import'
The `-import' is accepted but ignored for backward compatiability. Octave can now support multi-dimensional HDF data and automatically modifies variable names if they are invalid Octave identifiers.
`-text'
Force Octave to assume the file is in Octave's text format. end{help} qtoctave-0.10.1/qtoctave/src/menus/Equations/equation_by_bisection.menu0000644000175000017500000000173211511434227025402 0ustar lucaslucas#Solve equation by bisection method menu_name=Solve equation by bisection method #i1 input_label=Function input= #i2 input_label=Start pos. input= #i3 input_label=Step input=0.1 #i4 input_label=Tolerance input=0.00001 #o1 output_label=Result output= #o2 output_label=Auxiliar variable 1 output= #o3 output_label=Auxiliar variable 2 output= begin{command} %o1%=%i2%; %o2%=inline('%i1%')(%o1%); %o3%=%i3%; while( abs( %o2% ) > %i4% ) %o1%+=%o3%; if( %o2%>0 ) %o2%=inline('%i1%')(%o1%); if( %o2%<0 ) %o1%-=%o3%; %o2%=inline('%i1%')(%o1%); %o3%/=2; endif; else %o2%=inline('%i1%')(%o1%); if( %o2%>0 ) %o1%-=%o3%; %o2%=inline('%i1%')(%o1%); %o3%/=2; endif; endif; endwhile %o1% end{command} begin{help}

Solve nonlinear equation by bisection method.

This method checks functions' signs changes. Methods adds step to result. When sign changes, method comes back to previus position and makes step lower.

end{help} qtoctave-0.10.1/qtoctave/src/menus/Equations/nonlinear_equation.menu0000644000175000017500000000160411511434227024714 0ustar lucaslucas#Solve linear equation menu_name=Nonlinear equation #i1 input_label=Function (example: sin(x)) input= #i2 input_label=x0 input= #o1 output_label=Solution output= #o2 output_label=Info output= #o3 output_label=Menssage output= begin{command} [%o1%,%o2%,%o3%]=fsolve(inline("%i1%"), %i2%) end{command} begin{help}

Solve nonlinear equation

Octave can solve sets of nonlinear equations of the form

F (x) = 0

using the function fsolve, which is based on the MINPACK subroutine hybrd.

Given function, the name of a function of the form f (x) and an initial starting point x0, fsolve solves the set of equations such that f(x) = 0.

If function is a two-element string array, the first element names the function described above, and the second element names a function of the form j (x) to compute the Jacobian matrix.

end{help} qtoctave-0.10.1/qtoctave/src/menus/Equations/linear_equation.menu0000644000175000017500000000045311511434227024202 0ustar lucaslucas#Solve linear equation menu_name=Linear equation #i1 input_label=A input= #o1 output_label=B output= begin{command} (%i1%)\(%o1%) end{command} begin{help}

Solve linear equation

Solve the set of linear equations ax = b

a and b could be matrixs.

end{help} qtoctave-0.10.1/xmlwidget/examples/octave/hook/button_cancel.png0000755000175000017500000000267411511434226024023 0ustar lucaslucasPNG  IHDR szzgAMA7tEXtSoftwareAdobe ImageReadyqe<NIDATxb?@b O>erـ\O3g8_! eb&dybf9Pp<+YJ PX4k?=̕ 9@a.d{%@?5guJǷeçir @iRRG E e@i# i 0U0:0"`OlH|.&/o*#CBn,XH."!E fN@GL"l3 q4*C.#i ?uxVO|h11>!NEFZ;7/|~r_?AP׉au#o;3y묟  /3!Ñ3,mŰL g4Pu`X+p)?{댟 eK0@\ À@q vd!'2p $vb? g=7s4)0R;(薃@xZW|j/&G@ w((An9_8 Jd-ȲvPŹG8o-Y@w(s -#@am^Y{ZpG2۳3Ք啳v @LjkFPV2 _[\@ K8¿}óW߾a/И@Lj,gAUBAǕaY  m9OAMA׆au#3 (\a9A?~3q3H2HX@ NJȖ 1<Chȉ P@NJ , @q vt33MFp~|? GX篫X@ `Gn2@p@pJ\˟B9(hF#쀳y<-@Ab`U;{_w@G00h8|P7[K n(^ >')~;5;J-rv#1/(ob6-ҍ@7uL@u1e_[p3|`7́X H{>]gW > 1Š  {F`G; ex_$r8r9;i(;9! ˱:r  l!$?R 8T 8!D)0'EmNIENDB`qtoctave-0.10.1/xmlwidget/examples/octave/hook/hook_xmlwidget.m0000755000175000017500000000466711511434226023703 0ustar lucaslucasfunction hook_xmlwidget [in, out, pid] = popen2("xmlwidget", "rw"); %[in, out, pid] = popen2("../../../gtk2/xmlwidget.py", "rw"); xml=fopen("gui.xml","r"); while ( ! feof(xml) ) _line=fgets(xml); puts(_line); fputs(in,_line); endwhile fclose(xml); fflush(in); EAGAIN = errno ("EAGAIN"); done = false; % Events loop do s = fgets (out); if (ischar (s)) fputs (stdout, s); if ( strcmp(s,"* Exit\n") ) fputs(in,"\n"); elseif( strcmp(s,"* Ok\n") ) m=read_parameter(in, out, "m") v=read_parameter(in, out, "v") k=read_parameter(in, out, "k") A=read_parameter(in, out, "A") w=read_parameter(in, out, "w") fputs(in,"\n"); fflush(in); hook_solver(m,v,k,A,w) fputs(in,"\n"); fflush(in); endif elseif (errno () == EAGAIN) sleep (0.1); fclear (out); else done = true; endif until (done) fclose(in); fclose(out); endfunction function parameter=read_parameter(in, out, parameter) fprintf(in, "\n", parameter); fflush(in); EAGAIN = errno ("EAGAIN"); done = false; % Events loop do s = fgets (out); if (ischar (s)) fputs (stdout, s); if ( strcmp(s,"* Exit\n") ) fputs(in,"\n"); elseif( strncmp(s,"!",1) ) s( s=="!")=""; s( s==" ")=""; s( s=="\t")=""; parameter=str2double(s) return ; endif elseif (errno () == EAGAIN) sleep (0.1); fclear (out); else done = true; endif until (done) endfunction function [vel]=hook_eqn(m,v,k,A,w, v0,x0,t0) vel=( A*cos(w*t0) -v*v0 -k*x0 )/m; endfunction function hook_solver(m,v,k,A,w) x=[1]; t=[0]; vel=0; N=1000; h=(10-0)/N; while(rows(t)<=N) t=[t; t(rows(t))+h]; x=[x; x(rows(x))+h*vel]; vel=vel+h*( hook_eqn( m,v,k,A,w, vel, x(rows(x)-1), t(rows(t)) ) ); end plot(t,x); endfunction qtoctave-0.10.1/xmlwidget/examples/octave/hook/sciences_section.png0000755000175000017500000000463711511434226024524 0ustar lucaslucasPNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_F IDATxbd-` ݗhp O2ObϬ?SNAx DAY0!@0bb`2PF&oLo( (FP0!KE߾|1-2Vtu ufs}T~000 (ű_aS ӗ?@,?~z| Rzvz_ҼS_>/< ރLGAMos( @۽9tB\{u@,i!pP_Y50\qP$C0ӣ?-5)?ďbz~U|fK_(LOzc K9 ]  _~WE!!!V@g9VKoV_9;۷N:؇ *aQ~4?^fyTAf ypCE*aYFwo3j} `J׋vn] LULrⷯNyo߾\ 1K4ПŘë[II rҥK81I|e}m!mUWA=P X`E.(8x ߾5` J7*8,؄ pLM[In$r'^p| DsH*3Y Ȓ\J,L?_ MiR o\fX~ 05 *3g`e/0:4yp@TF̫]6~7G h3UI^_^0U7-e[ 2ggd`ea]&nC_1j'Bv[4'Z{G={7j۳IH0hiANؘPX|l#EB_[VQQ@i$M0ӋEXtxf@eCh"/g}bAsV/V~J?}90>Xv ّ- bkÇcG'݅gt#[NɊxmbQDl|pi~[:Dk㟑`çշM[7U<P@Q uƍ3IzI1PMI ?@GR@߄\4h5Xԥ@d@bPOG( E_1zZ/IENDB`qtoctave-0.10.1/xmlwidget/examples/octave/hook/gui.xml0000755000175000017500000000432511511434226021776 0ustar lucaslucas 1 1 4 0 1 This a hook diferential equation solver. Hook equation is: m dot(dot(x)) +v dot(x) +k x= A cos(w t) where: m is mass v is viscosity k is hook constant A amplitude of external force w angular frecuency Try to change parameters to see: Hook with absorption: m=1; v=1; k=4; A=0; w=1 Hook withouth absorption: m=1; v=0; k=4; A=0; w=0 Hook with external force: m=1; v=0; k=4; A=1; w=0.5 Hook with external force, resonant: m=1; v=0; k=4; A=1; w=2 Hook with external force resonan, with absorptiont: m=1; v=1; k=4; A=1; w=2 Hook with external force resonan: m=1; v=0; k=4; A=1; w=2 qtoctave-0.10.1/xmlwidget/examples/octave/window_button/window_button.xml0000755000175000017500000000037511511434226026057 0ustar lucaslucas qtoctave-0.10.1/xmlwidget/examples/octave/window_button/window_button.m0000755000175000017500000000165511511434226025515 0ustar lucaslucasfunction window_button % Connects with xmlwidget [in, out, pid] = popen2 ("xmlwidget", "rw"); % Sends window to xmlwidget xml=fopen("window_button.xml","r"); while ( ! feof(xml) ) _line=fgets(xml); puts(_line); fputs(in,_line); endwhile fclose(xml); % Don't close with , we will send more data to xmlwidget % NOTE: flush data or window doesn't been shown fflush(in); % Is more easy to save xml window description in a file and load from it. % Check all is ok EAGAIN = errno ("EAGAIN"); done = false; % Read events from window do s = fgets (out); if (ischar (s)) fputs (stdout, s); % Button event if ( strcmp(s,"* Exit\n") ) % Close xmlwidget fputs(in,"\n"); fflush(in); endif elseif (errno () == EAGAIN) sleep (0.1); fclear (out); else done = true; endif until (done) % Close streams with xmlwidget fclose (out); fclose (in); endfunctionqtoctave-0.10.1/xmlwidget/examples/python/xrcs/xrcs.py0000755000175000017500000013166611511434226022111 0ustar lucaslucas#!/usr/bin/python # -*- coding: utf8 -*- #/* Copyright (C) 2007 P.L. Lucas #* #* This program is free software; you can redistribute it and/or modify #* it under the terms of the GNU General Public License as published by #* the Free Software Foundation; either version 2 of the License, or #* (at your option) any later version. #* #* This program is distributed in the hope that it will be useful, #* but WITHOUT ANY WARRANTY; without even the implied warranty of #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #* GNU General Public License for more details. #* #* You should have received a copy of the GNU General Public License #* along with this program; if not, write to the Free Software #* Foundation, Inc., 59 Temple Place, Suite 330, #* Boston, MA 02111-1307, USA. #*/ import popen2 import os import re import sys import xml.sax import xml.sax.handler import xml.sax.xmlreader import select import time import string #################################################################### ### Abre el Servidor de Widgets def open_xmlwidget(): #[sin, sout]=popen2.popen4("xmlwidget") [sin, sout]=popen2.popen2("xmlwidget") #[sin, sout]=popen2.popen2( "/home/lucas/prog/cpp/qtoctave-project/csl-qtoctave/branches/xmlwidget/qt4/xmlwidget/xmlwidget") #[sin, sout]=popen2.popen2( "/home/lucas/prog/cpp/qtoctave-project/csl-qtoctave/branches/xmlwidget/gtk2/xmlwidget.py") #[sin, sout]=popen2.popen2("/bin/cat") return [sin,sout] #################################################################### ### Pasa los acentos a html def acentos2html(texto): t=string.replace(texto,'á','á') t=string.replace(t,'é','é') t=string.replace(t,'í','í') t=string.replace(t,'ó','ó') t=string.replace(t,'ú','ú') t=string.replace(t,'Á','Á') t=string.replace(t,'É','É') t=string.replace(t,'Í','Í') t=string.replace(t,'Ó','Ó') t=string.replace(t,'Ú','Ú') t=string.replace(t,'Ñ','Ñ') t=string.replace(t,'ñ','ñ') return t #################################################################### ### Pasa los textos a html def texto2html(texto): t=texto #t=acentos2html(t) t=string.replace(t,'<','<') t=string.replace(t,'>','>') t=string.replace(t,'&','&') return t #################################################################### ### Pasa las " a \" def comillas2c(texto): t=texto t=string.replace(t,'"',"''") return t #################################################################### ### Pregunta un texto class DialogoTexto(xml.sax.handler.ContentHandler): def __init__(self, texto): self.currentText="" self.respuesta=False self.texto='' [self.xin, self.xout]=open_xmlwidget() self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) #xmlparser=xml.sax.xmlreader.IncrementalParser() self.xmlparser.setContentHandler(self) self.crear_ventana(texto) self.run() def run(self): self.xmlparser.feed('') ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) #sys.stdout.write(ch) #print ch self.xin.close() def startElement(self, name, attrs): if name=="button": if attrs.has_key("id"): _id=attrs.getValue("id") if _id=="boton-no": self.xout.write('\n') self.xout.flush() self.xout.close() elif _id=="boton-si": self.respuesta=True self.xout.write('\n') self.xout.flush() self.currentText="" def endElement(self, name): if name=="lineedit": self.texto=self.currentText self.xout.write('\n') self.xout.flush() self.xout.close() return def characters(self, text): self.currentText+=text def crear_ventana(self, texto): self.xout.write( """\ """ ) self.xout.flush() #################################################################### ### Pregunta sí o no class DialogoSiNo(xml.sax.handler.ContentHandler): def __init__(self, texto): self.currentText="" self.respuesta=False [self.xin, self.xout]=open_xmlwidget() self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) #xmlparser=xml.sax.xmlreader.IncrementalParser() self.xmlparser.setContentHandler(self) self.crear_ventana(texto) self.run() def run(self): self.xmlparser.feed('') ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) #sys.stdout.write(ch) #print ch self.xin.close() def startElement(self, name, attrs): if name=="button": if attrs.has_key("id"): _id=attrs.getValue("id") if _id=="boton-no": self.xout.write('\n') self.xout.flush() self.xout.close() elif _id=="boton-si": self.respuesta=True self.xout.write('\n') self.xout.flush() self.xout.close() self.currentText="" def endElement(self, name): return def characters(self, text): self.currentText+=text def crear_ventana(self, texto): self.xout.write( """\ """ ) self.xout.flush() #################################################################### ### Muestra la ayuda class Ayuda(xml.sax.handler.ContentHandler): def __init__(self, texto): self.currentText="" self.respuesta=False [self.xin, self.xout]=open_xmlwidget() self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) #xmlparser=xml.sax.xmlreader.IncrementalParser() self.xmlparser.setContentHandler(self) self.crear_ventana(texto) self.run() def run(self): self.xmlparser.feed('') ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) #sys.stdout.write(ch) #print ch self.xin.close() def startElement(self, name, attrs): if name=="button": if attrs.has_key("id"): _id=attrs.getValue("id") if _id=="boton-cancelar": self.respuesta=True self.xout.write('\n') self.xout.flush() self.xout.close() self.currentText="" def endElement(self, name): return def characters(self, text): self.currentText+=text def crear_ventana(self, texto): self.xout.write( """\ INTRODUCCIÓN. ------------- Xrcs es una aplicación que ayuda a manejar el conjunto de aplicaciones RCS (Revision Control Sistem). RCS sirve para hacer copias de seguridad de sus proyectos, guardando las diversas versiones y permitiendo recuperar las direrentes versiones. Se puede poner un comentario a cada versión almacenada. Así es posible llevar un control más exhaustivo. A cada base de datos en la que se almacenarán las versiones se la llama un "repositorio". Los datos dentro del repositorio se almacenan usando las diferencias entre archivos, así se disminuye el tamaño de la base de datos. El trabajo se orienta a directorios, por lo que facilita el manejo de proyectos de gran tamaño. CREANDO UN NUEVO REPOSITORIO. ----------------------------- Sólo hay que seleccionar el dentro del menú Archivo la opción Nuevo. Nos preguntará el nombre que se le desea poner al repositorio, así como un directorio donde se almacenarán los diferentes datos. Por último se pedirá el directorio que contiene los archivos que se desean almacenar en el repositorio. A este último directorio, se le llama directorio fuente. Con el menú Archivo/Cambiar Repositorio podemos cambiar entre los repositorios que se estén administrando. HACIENDO COPIAS DE SEGURIDAD. ----------------------------- Una vez que el repositorio está creado, se pueden crear copias de seguridad usando el menú Acciones/Almacenar Fuentes. Se nos pedirá un texto con una descripción de las modificaciones que se han hecho en las fuentes. Si hay muchos ficheros el menú "Acciones/Almacenar Fuentes" puede ser lento. Con el menú "Acciones/Almacenar Fuentes rápido" se tarda mucho menos, pués sólo almacenará los archivos que tengan la fecha de modificación mayor que la fecha de la última copia de seguridad. EXTRACCIÓN DE VERSIONES. ------------------------ Con los menús "Acciones/Extraer última", "Acciones/Extraer versión" y "Acciones/Extraer modificados entre versiones", se extraen los archivos de: "Acciones/Extraer última" : Extrae la última versión "Acciones/Extraer versión": Extrae la versión que se solicite. "Acciones/Extraer modificados entre versiones": Extrae sólo los archivos que han sido modificados entre dos versiones distintas. En todos los casos se preguntará el lugar dónde realizar la extracción. FILTROS. -------- En el menú Filtros se puede filtrar lo que se almacena en el repositorio. Por ejemplo, usando "Filtros/Excluir" se nos preguntarán expresiones regulares que conparadas con los archivos deciden si se almacenan o no. Por defecto se incluyen dos, una para no incluir los archivos acabados en ~ y otra para no incluir los archivos ocultos. También se puede excluir un archivo en concreto. COMPRIMIR/DESCOMPRIMIR REPOSITORIOS. ------------------------------------ Se puede comprimir el tamaño de un repositorio, así ocupará mucho menos espacio en disco. Se deberá usar el menú "Archivo/Comprimir/Descomprimir repositorio". Cada vez que se abra un repositorio se tardará un poco en comprimirlo o descomprimirlo, por lo que el usuario deberá tener algo de paciencia si el repositorio es muy grande. Por ejemplo, en un Pentium IV, comprimir un repositorio de 8 Mb puede llevar unos 10 segundos. """ ) self.xout.flush() #################################################################### ### Selección de directorios class SeleccionDirectorios(xml.sax.handler.ContentHandler): def __init__(self, titulo='', directorio_padre='.'): self.item_stack=[] self.currentText="" self.directorio="" self.directorio_padre=self.directorio_padre=os.path.abspath(directorio_padre) [self.xin, self.xout]=open_xmlwidget() self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) #xmlparser=xml.sax.xmlreader.IncrementalParser() self.xmlparser.setContentHandler(self) self.crear_ventana(titulo) self.run() def run(self): self.xmlparser.feed('') ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) #sys.stdout.write(ch) #print ch self.xin.close() def startElement(self, name, attrs): if name=="button": if attrs.has_key("id"): _id=attrs.getValue("id") if _id=="quit_button": self.xout.write('\n') self.xout.flush() self.xout.close() elif _id=="boton-abrir": self.directorio=self.directorio_padre self.xout.write('\n') self.xout.flush() self.xout.close() elif name=="col": if attrs.has_key("value"): self.directorio_padre=os.path.abspath(self.directorio_padre+'/'+attrs.getValue("value")) self.ls(self.directorio_padre) self.currentText="" def endElement(self, name): return def characters(self, text): self.currentText+=text def ls(self, directorio_padre): self.xout.write('\n') dirs=os.listdir(directorio_padre) self.xout.write('"\n') for directorio in dirs: if os.path.isdir(directorio_padre+'/'+directorio): self.xout.write('"\n') self.xout.write('\n') self.xout.write('\n') self.xout.flush() def crear_ventana(self, titulo): self.xout.write( '' '' + """\
""" ) self.ls(self.directorio_padre) #################################################################### ### Clase que representa un repositorio class Repositorio: def __init__(self): self.nombre='' self.directorio='' self.fuente='' self.version='0' self.comprimir_repositorio_ok=False self.lista_re_archivos_excluidos=[".*~$", "^\..*"] def archivo_excluido(self, archivo, path=None): #Devuelve True o False según el archivo encaje o no con alguna expresión regular para los archivos excluídos for criterio in self.lista_re_archivos_excluidos: if None!=re.search(criterio,archivo): return True if path==None: return False for criterio in self.lista_re_archivos_excluidos: if None!=re.search(criterio,path): return True return False #################################################################### ### Selección de repositorio class SeleccionRepositorio(xml.sax.handler.ContentHandler): def __init__(self, lista_repositorios): self.item_stack=[] self.currentText="" self.repositorio=None self.lista_repositorios=lista_repositorios [self.xin, self.xout]=open_xmlwidget() self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) #xmlparser=xml.sax.xmlreader.IncrementalParser() self.xmlparser.setContentHandler(self) self.crear_ventana('Seleccion repositorio') self.run() def run(self): self.xmlparser.feed('') ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) #sys.stdout.write(ch) #print ch self.xin.close() def startElement(self, name, attrs): if name=="button": if attrs.has_key("id"): _id=attrs.getValue("id") if _id=="quit_button": self.xout.write('\n') self.xout.flush() self.xout.close() elif name=="item": if attrs.has_key("id"): _id=attrs.getValue("id") self.repositorio=self.lista_repositorios[int(_id)] print "Nombre "+self.repositorio.nombre self.xout.write('\n') self.xout.flush() self.xout.close() self.currentText="" def endElement(self, name): return def characters(self, text): self.currentText+=text def crear_ventana(self, titulo): self.xout.write( '' '' + """\
""" ) self.xout.write('\n') i=0 while i') if entrada.comprimir_repositorio_ok: self.xout.write('') else: self.xout.write('') self.xout.write('') self.xout.write('\n') i=i+1 self.xout.write('\n') self.xout.flush() #################################################################### ### Se procesa el archivo de UN repositorio class XMLRepositorio(xml.sax.handler.ContentHandler): def __init__(self, archivo, repositorio): self.currentText="" self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) self.xmlparser.setContentHandler(self) self.repositorio=repositorio self.lista_repositorios=[] if not os.path.exists(archivo): self.xin=None else: self.xin=open(archivo,"r") self.run() def run(self): ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) #print ch self.xin.close() def startElement(self, name, attrs): self.currentText="" if name=="repositorio": if attrs.has_key("nombre"): nombre=attrs.getValue("nombre") self.repositorio.nombre=nombre if attrs.has_key("directorio"): directorio=attrs.getValue("directorio") self.repositorio.directorio=directorio if attrs.has_key("fuente"): fuente=attrs.getValue("fuente") self.repositorio.fuente=fuente elif name=='version': if attrs.has_key("numero"): version=attrs.getValue("numero") self.repositorio.version=version elif name=='comprimido': if attrs.has_key("valor"): valor=attrs.getValue("valor") if valor=="True": self.repositorio.comprimir_repositorio_ok=True else: self.repositorio.comprimir_repositorio_ok=False #elif name=='excluidos': def endElement(self, name): if name=="repositorio": print "Fin de la lectura de repositorios" elif name=="excluidos": self.repositorio.lista_re_archivos_excluidos=string.split(self.currentText,'\n') while self.repositorio.lista_re_archivos_excluidos.count('')>0: self.repositorio.lista_re_archivos_excluidos.remove('') def characters(self, text): self.currentText+=text #################################################################### ### Se procesa el archivo de los repositorios class XMLListaRepositorios(xml.sax.handler.ContentHandler): def __init__(self, archivo): self.currentText="" #if os.path.exists(archivo): # self.xin=open(archivo,"r") #else: # self.xin=None self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) #xmlparser=xml.sax.xmlreader.IncrementalParser() self.xmlparser.setContentHandler(self) self.repositorio=None self.lista_repositorios=[] self.repositorio_actual=None if not os.path.exists(archivo): self.xin=None else: self.xin=open(archivo,"r") self.run() def run(self): ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) #sys.stdout.write(ch) #print ch self.xin.close() def startElement(self, name, attrs): self.currentText="" if name=="repositorio": self.repositorio=Repositorio() if attrs.has_key("nombre"): nombre=attrs.getValue("nombre") self.repositorio.nombre=nombre if attrs.has_key("directorio"): directorio=attrs.getValue("directorio") self.repositorio.directorio=directorio repositorio=XMLRepositorio(directorio+'/repositorio.xml', self.repositorio) if attrs.has_key("fuente"): fuente=attrs.getValue("fuente") self.repositorio.fuente=fuente if attrs.has_key("actual") or self.repositorio_actual==None: self.repositorio_actual=self.repositorio elif name=='version': if attrs.has_key("numero"): version=attrs.getValue("numero") self.repositorio.version=version def endElement(self, name): if name=="repositorio": self.lista_repositorios.append(self.repositorio) def characters(self, text): self.currentText+=text #################################################################### ### Pregunta se muestra una lista con las expresiones regulares y se tiene opción a añadir o quitar class DialogoAdministracionExpresionesRegulares(xml.sax.handler.ContentHandler): def __init__(self, texto, lista_re): self.currentText="" self.respuesta=False self.lista_re=lista_re [self.xin, self.xout]=open_xmlwidget() self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) #xmlparser=xml.sax.xmlreader.IncrementalParser() self.xmlparser.setContentHandler(self) self.crear_ventana(texto) self.run() def run(self): self.xmlparser.feed('') ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) #sys.stdout.write(ch) #print ch self.xin.close() def startElement(self, name, attrs): if name=="button": if attrs.has_key("id"): _id=attrs.getValue("id") if _id=="boton-cancelar": self.xout.write('\n') self.xout.flush() self.xout.close() elif _id=="boton-aceptar": self.respuesta=True self.xout.write('\n') self.xout.flush() self.xout.close() elif _id=="boton-agnadir": dialogo=DialogoTexto("Escriba la expresión regular") if dialogo.respuesta: entrada=string.replace(dialogo.texto,'\n','') self.xout.write('\n') self.xout.write('\n') self.xout.write('\n') self.xout.flush() self.lista_re.append(entrada) elif _id=="boton-agnadir-fichero": self.xout.write( """ """ ) self.xout.flush() elif name=="item": if attrs.has_key("id"): _id=attrs.getValue("id") for entrada in self.lista_re: if _id==entrada: dialogo=DialogoSiNo("Se va a eliminar: "+entrada) if dialogo.respuesta: self.lista_re.remove(entrada) self.listar_re() self.currentText="" def endElement(self, name): if name=="file": entrada='^'+self.currentText+'$' self.xout.write('\n') self.xout.write('\n') self.xout.write('\n') self.xout.flush() self.lista_re.append(entrada) return def characters(self, text): self.currentText+=text def listar_re(self): self.xout.write('\n') for entrada in self.lista_re: self.xout.write('\n') self.xout.write('\n') self.xout.flush() def crear_ventana(self, texto): self.xout.write( """\
""" ) self.listar_re() #################################################################### ### Se procesa el bucle principal de eventos class Handler(xml.sax.handler.ContentHandler): def __init__(self, xin, xout): #Variables para procesar el XML self.item_stack=[] self.currentText="" self.xin=xin self.xout=xout self.xmlparser=xml.sax.make_parser(["xml.sax.xmlreader.IncrementalParser"]) #xmlparser=xml.sax.xmlreader.IncrementalParser() self.xmlparser.setContentHandler(self) #Variables últiles self.repositorio='' self.directorio_fuente='' self.segnal_archivo_ok=False repositorios=XMLListaRepositorios(os.path.expanduser('~/.qtoctave/repositorios.xml')) self.lista_repositorios=repositorios.lista_repositorios self.repositorio_actual=None if repositorios.repositorio_actual!=None: self.repositorio_activo(repositorios.repositorio_actual) def run(self): self.xmlparser.feed('') ch=' ' while ch: ch=self.xin.read(1) self.xmlparser.feed(ch) sys.stdout.write(ch) self.xin.close() if self.repositorio_actual.comprimir_repositorio_ok: self.comprimir_repositorio() def startElement(self, name, attrs): if name=="button": if attrs.has_key("id"): _id=attrs.getValue("id") if _id=="quit_button": self.xout.write('\n') self.xout.flush() self.xin.close() self.xout.close() os._exit(0) elif name=="tree": self.segnal_archivo_ok=True print "Señal detectada" elif name=="item": if attrs.has_key("id"): _id=attrs.getValue("id") if self.segnal_archivo_ok: print "Señal detectada" self.bitacora(_id) else: self.procesar_menu(_id) self.currentText="" def endElement(self, name): if name=="tree": self.segnal_archivo_ok=False print "Señal acabada" def characters(self, text): self.currentText+=text def procesar_menu(self, _id): if _id=="menu-nuevo": self.crear_nuevo_repositorio() elif _id=="accion-almacenar" or _id=="accion-almacenar-rapido": dialogo=DialogoTexto("Mensaje") if dialogo.respuesta: tiempo=time.time() mensaje=comillas2c(string.replace(dialogo.texto,'\n','')) self.xout.write('\n') self.xout.flush() self.repositorio_actual.version=str(int(self.repositorio_actual.version)+1) self.xout.write('\n') self.xout.write('\n') #Se almacena la lista de archivos activos if _id=="accion-almacenar-rapido": self.almacenar_fuentes(self.repositorio, self.directorio_fuente, mensaje,self.repositorio_actual.version, True) else: self.almacenar_fuentes(self.repositorio, self.directorio_fuente, mensaje,self.repositorio_actual.version, False) #Se almacena la lista de directorios activos ¡Siempre después de almacenar_fuentes! self.xout.write('\n') self.xout.flush() lista=self.lista_directorios(self.repositorio, self.directorio_fuente, '') out=open(self.repositorio_actual.directorio+'/directorios.txt','w') for entrada in lista: out.write(entrada+'\n') out.close() comando='cd "'+self.repositorio_actual.directorio+'"; ci -l -f'+self.repositorio_actual.version+' -m"'+mensaje+'" -t-"Lista de directorios" -x,v "'+self.repositorio_actual.directorio+'/directorios.txt,v'+'" "'+self.repositorio_actual.directorio+'/directorios.txt'+'" ' os.system(comando.encode('utf-8')) comando='rcs -U "'+self.repositorio_actual.directorio+'/directorios.txt,v"' os.system(comando.encode('utf-8')) #Se comprime el repositorio si es necesario if self.repositorio_actual.comprimir_repositorio_ok: self.xout.write('\n') self.xout.flush() self.comprimir_repositorio() self.descomprimir_repositorio() self.xout.write('\n') self.xout.write('\n') self.xout.write('\n') self.xout.flush() self.almacenar_lista_repositorios() self.archivos(self.repositorio,self.repositorio) self.xout.write('\n') self.xout.flush() elif _id=="menu-cambiar": dialogo=SeleccionRepositorio(self.lista_repositorios) if dialogo.repositorio!=None: self.repositorio_activo(dialogo.repositorio) elif _id=="accion-extraer-version" or _id=="accion-extraer-ultima": version=None if _id=="accion-extraer-version": dialogo=DialogoTexto("Introduzca la versión") if not dialogo.respuesta: return version=string.replace(dialogo.texto,'\n','') else: version=self.repositorio_actual.version print "Version "+version seleccion_directorio=SeleccionDirectorios("Seleccione directorio", self.directorio_fuente) if seleccion_directorio.directorio!="": comando='\n' self.xout.write(comando.encode('utf-8')) self.xout.flush() os.system('cd "'+self.repositorio_actual.directorio+'"; co -M -f -r'+version+' "'+self.repositorio_actual.directorio+'/directorios.txt,v"') _in=open(self.repositorio_actual.directorio+'/directorios.txt','r') lista_directorios=_in.readlines() _in.close() self.xout.write('\n') self.xout.write('\n') self.xout.flush() self.extraer_fuentes(self.repositorio, seleccion_directorio.directorio, version, lista_directorios) self.xout.write('\n') self.xout.write('\n') self.xout.flush() self.xout.write('\n') self.xout.flush() elif _id=="menu-salir": self.xout.write('\n') self.xout.flush() self.xin.close() self.xout.close() if self.repositorio_actual.comprimir_repositorio_ok: self.comprimir_repositorio() os._exit(0) elif _id=="accion-extraer-modificados": dialogo=DialogoTexto("Introduzca primera la versión") if dialogo.respuesta: version1=string.replace(dialogo.texto,'\n','') dialogo=DialogoTexto("Introduzca segunda la versión") if dialogo.respuesta: version2=string.replace(dialogo.texto,'\n','') seleccion_directorio=SeleccionDirectorios("Seleccione directorio", self.directorio_fuente) if seleccion_directorio.directorio!="": os.system('cd "'+self.repositorio_actual.directorio+'"; co -M -f -r'+version2+' "'+self.repositorio_actual.directorio+'/directorios.txt,v"') _in=open(self.repositorio_actual.directorio+'/directorios.txt','r') lista_directorios=_in.readlines() _in.close() self.xout.write('\n') self.xout.write('\n') self.xout.flush() self.extraer_modificados(self.repositorio, seleccion_directorio.directorio, version1, version2, lista_directorios) self.xout.write('\n') self.xout.write('\n') self.xout.flush() elif _id=="menu-eliminar-repositorio": repositorio=SeleccionRepositorio(self.lista_repositorios) if repositorio.repositorio!=None: dialogo=DialogoSiNo('Desea borrar el repositorio:\n'+repositorio.repositorio.nombre) if dialogo.respuesta==True: self.lista_repositorios.remove(repositorio.repositorio) self.almacenar_lista_repositorios() repositorios=XMLListaRepositorios(os.path.expanduser('~/.qtoctave/repositorios.xml')) self.lista_repositorios=repositorios.lista_repositorios self.repositorio_actual=None if repositorios.repositorio_actual!=None: self.repositorio_activo(repositorios.repositorio_actual) elif _id=="menu-comprimir-repositorio": repositorio=SeleccionRepositorio(self.lista_repositorios) if repositorio.repositorio!=None: dialogo=DialogoSiNo('Desea comprimir/descomprimir el repositorio:\n'+repositorio.repositorio.nombre) if dialogo.respuesta==True: repositorio.repositorio.comprimir_repositorio_ok=not repositorio.repositorio.comprimir_repositorio_ok if repositorio.repositorio.comprimir_repositorio_ok: self.xout.write('\n') self.xout.flush() self.comprimir_repositorio(repositorio.repositorio) else: self.xout.write('\n') self.xout.flush() self.descomprimir_repositorio(repositorio.repositorio) comando='rm -f "'+repositorio.repositorio.directorio+'/RCS.tar.gz" ' os.system(comando.encode('utf-8')) self.almacenar_lista_repositorios() repositorios=XMLListaRepositorios(os.path.expanduser('~/.qtoctave/repositorios.xml')) self.lista_repositorios=repositorios.lista_repositorios self.repositorio_actual=None if repositorios.repositorio_actual!=None: self.repositorio_activo(repositorios.repositorio_actual) self.xout.write('\n') self.xout.flush() elif _id=="filtros-excluir": dialogo=DialogoAdministracionExpresionesRegulares("Excluir", self.repositorio_actual.lista_re_archivos_excluidos) if dialogo.respuesta: self.repositorio_actual.lista_re_archivos_excluidos=dialogo.lista_re self.almacenar_lista_repositorios() elif _id=="menu-abrir": dialogo=SeleccionDirectorios("Seleccione directorio") if dialogo.directorio!="": repositorio=Repositorio() xmlrepositorio=XMLRepositorio(dialogo.directorio+'/repositorio.xml',repositorio) self.lista_repositorios.append(repositorio) self.repositorio_activo(repositorio) elif _id=="ayuda-ayuda": dialogo=Ayuda("Ayuda") def almacenar_fuentes(self, repositorio, fuentes, mensaje, version, rapido): #Hace un commit de las fuentes print "Almacenando" tiempo_ultima_modificacion=0 if os.path.exists(self.repositorio_actual.directorio+'/directorios.txt,v'): tiempo_ultima_modificacion=os.path.getmtime(self.repositorio_actual.directorio+'/directorios.txt,v') dirs=os.listdir(fuentes) for entrada in dirs: #print entrada if os.path.isdir(fuentes+'/'+entrada): if self.repositorio_actual.archivo_excluido(entrada+'/', fuentes+'/'+entrada+'/'): self.xout.write('\n') self.xout.flush() continue print "Es un directorio" if not os.path.exists(repositorio+'/'+entrada): os.mkdir(repositorio+'/'+entrada) self.almacenar_fuentes(repositorio+'/'+entrada, fuentes+'/'+entrada, mensaje, version, rapido) else: if self.repositorio_actual.archivo_excluido(entrada, fuentes+'/'+entrada): self.xout.write('\n') self.xout.flush() continue if rapido: tiempo=os.path.getmtime(fuentes+'/'+entrada) if tiempo\n') self.xout.flush() #Se usa la opción -r en lugar de -f para no malgastar espacio en disco comando='cd "'+fuentes+'"; ci -l -r'+version+' -m"'+mensaje+'" -t-"Fuentes" "'+repositorio+'/'+entrada+'"' os.system(comando.encode('utf-8')) comando='rcs -U -u'+version+' "'+repositorio+'/'+entrada+'"' os.system(comando.encode('utf-8')) #os.system('cd "'+fuentes+'"; co -M -l "'+repositorio+'/'+entrada+'"') def extraer_fuentes(self, repositorio, fuentes, version, lista_directorios): #Hace un checkout de las fuentes print print "Extraccion: "+repositorio self.extraer_modificados(repositorio, fuentes, None, version, lista_directorios) def extraer_modificados(self, repositorio, fuentes, version1, version2, lista_directorios): #Se extraen sólo los modificados print print "Extraccion: "+repositorio for entrada_lista in lista_directorios: entrada=string.strip(entrada_lista) print "Entrada "+entrada if None!=re.search(".*/$",entrada): #Se trata de un directorio if not os.path.exists(fuentes+'/'+entrada): os.mkdir(string.strip(fuentes+'/'+entrada)) print "Se crea el directorio "+entrada else: #Se trata de un archivo if version1!=None: comando='rcsdiff -r'+version1+' -r'+version2+' "'+repositorio+'/'+entrada+'"' _in=os.popen(comando.encode('utf-8'),'r') salida=_in.readlines() _in.close() if len(salida)==0: continue directorio=os.path.dirname(fuentes+entrada) entrada_rcs=string.strip(repositorio+'/'+entrada) os.system('cd "'+directorio+'"; co -M -f "'+entrada_rcs+'"') #Se le quita la opción -l os.system('cd "'+directorio+'"; co -M -f -r'+version2+' "'+entrada_rcs+'"') comando='rcs -U -u'+version2+' "'+entrada_rcs+'"' os.system(comando.encode('utf-8')) print "Fin Extraccion: "+repositorio def archivos(self,repositorio, directorio): #Muestra la lista de archivos dirs=os.listdir(repositorio) if repositorio==self.repositorio: self.xout.write('\n') self.xout.write('"\n') else: self.xout.write('"\n') for entrada in dirs: if os.path.isdir(repositorio+'/'+entrada): self.archivos(repositorio+'/'+entrada, '/'+entrada) else: self.xout.write('"\n') if repositorio==self.repositorio: self.xout.write('\n') self.xout.flush() else: self.xout.write('\n') def bitacora(self, entrada): print "Mostrando bitacora" if not os.path.isdir(entrada): self.xout.write('\n') self.xout.write('"\n') r, w, e = popen2.popen3('rlog '+entrada) e.readlines() log=r.readlines() r.close() e.close() w.close() for linea in log: self.xout.write('"\n') self.xout.write('\n') self.xout.flush() def almacenar_lista_repositorios(self): out=open(os.path.expanduser('~/.qtoctave/repositorios.xml'),'w') out.write('\n') for entrada in self.lista_repositorios: #out.write('\n' ) #out.write('\n') rout=open(entrada.directorio+'/repositorio.xml','w') rout.write('\n' ) rout.write('\n') if entrada.comprimir_repositorio_ok: rout.write('\n') else: rout.write('\n') rout.write('\n') for criterio in entrada.lista_re_archivos_excluidos: rout.write(criterio+'\n') rout.write('\n') rout.write('\n') rout.close() out.write('\n') out.write('\n') out.close() def repositorio_activo(self, repositorio): if self.repositorio_actual!=None and self.repositorio_actual.comprimir_repositorio_ok: self.comprimir_repositorio() if not os.path.exists(repositorio.directorio+'/RCS'): return self.repositorio_actual=repositorio self.repositorio=repositorio.directorio+'/RCS' self.directorio_fuente=repositorio.fuente self.xout.write('\n') self.xout.write('\n') self.xout.write('\n') self.xout.flush() self.almacenar_lista_repositorios() if self.repositorio_actual.comprimir_repositorio_ok: self.descomprimir_repositorio() self.archivos(self.repositorio, self.repositorio) if os.path.exists(repositorio.directorio+'/directorios.txt,v'): self.bitacora(repositorio.directorio+'/directorios.txt,v') def crear_nuevo_repositorio(self): repositorio=Repositorio() dialogo=DialogoTexto("Nombre del repositorio:") if dialogo.respuesta: repositorio.nombre=string.replace(dialogo.texto,'\n','') else: return seleccion_directorio=SeleccionDirectorios("Seleccione el directorio del repositorio") if seleccion_directorio.directorio!="": dialogo=DialogoSiNo( 'Desea usar el directorio:\n'+seleccion_directorio.directorio+ '\ncomo repositorio?' ) if dialogo.respuesta==True: #Se usa el directorio como repositorio repositorio.directorio=seleccion_directorio.directorio seleccion_directorio=SeleccionDirectorios("Seleccione el directorio con las fuentes") if seleccion_directorio.directorio!="": repositorio.fuente=seleccion_directorio.directorio if not os.path.exists(repositorio.directorio+'/RCS'): os.mkdir(repositorio.directorio+'/RCS') #Se introduce el repositorio en la lista self.lista_repositorios.append(repositorio) self.repositorio_activo(repositorio) def lista_directorios(self,repositorio, fuentes, directorio, lista=[]): #Lista de archivos que sigan en las fuentes dirs=os.listdir(repositorio) lista.append(directorio+'/') for entrada in dirs: if (os.path.exists(fuentes+'/'+entrada)): if os.path.isdir(repositorio+'/'+entrada) : if self.repositorio_actual.archivo_excluido(entrada+'/', fuentes+'/'+entrada+'/'): #self.xout.write('\n') #self.xout.flush() continue self.lista_directorios(repositorio+'/'+entrada, fuentes+'/'+entrada, directorio+'/'+entrada,lista) else: if self.repositorio_actual.archivo_excluido(entrada, fuentes+'/'+entrada): #self.xout.write('\n') #self.xout.flush() continue lista.append(directorio+'/'+entrada) return lista def comprimir_repositorio(self, repositorio=None): if repositorio==None: repositorio=self.repositorio_actual [sin,sout]=open_xmlwidget() sout.write( """\ """ ) sout.flush() comando='cd "'+repositorio.directorio+'"; tar -czvf RCS.tar.gz RCS directorios.txt directorios.txt,v' os.system(comando.encode('utf-8')) comando='rm -Rf "'+repositorio.directorio+'/RCS"; mkdir "'+repositorio.directorio+'/RCS"' os.system(comando.encode('utf-8')) sout.write('\n') sout.flush() sout.close() sin.close() def descomprimir_repositorio(self, repositorio=None): if repositorio==None: repositorio=self.repositorio_actual [sin,sout]=open_xmlwidget() sout.write( """\ """ ) sout.flush() comando='cd "'+repositorio.directorio+'"; tar -xzvf RCS.tar.gz ' os.system(comando.encode('utf-8')) sout.write('\n') sout.flush() sout.close() sin.close() ######################################################################## #### Bucle principal del eventos [sin,sout]=open_xmlwidget() sout.write( """\
""" ) sout.flush() if not os.path.exists(os.path.expanduser('~/.qtoctave/')): os.mkdir(os.path.expanduser('~/.qtoctave/')) handler=Handler(sin,sout) handler.run() os._exit(0) qtoctave-0.10.1/xmlwidget/qt4/src/widgets/hseparator.h0000755000175000017500000000242611511434226021717 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __HSEPARATOR_H__ #define __HSEPARATOR_H__ #include #include "widget.h" Widget *new_hseparator(const QString & qName, const QXmlAttributes & atts, QWidget *parent); class HSeparator: public Widget { int child; public: HSeparator(); bool xml_start(const QString & qName, const QXmlAttributes & atts); bool xml_end(const QString & qName, const QString &text, bool &property_ok); void add_widget(Widget *w); }; class mHSeparator:public QSplitter { Q_OBJECT public: mHSeparator( QWidget * parent = 0); }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/widgets/button.h0000755000175000017500000000257511511434226021067 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __BUTTON_H__ #define __BUTTON_H__ #include #include "widget.h" Widget *new_button(const QString & qName, const QXmlAttributes & atts, QWidget *parent); class Button: public Widget { public: Button(); bool xml_start(const QString & qName, const QXmlAttributes & atts); bool xml_end(const QString & qName, const QString &text, bool &property_ok); void add_widget(Widget *w); }; class mButton:public QPushButton { Q_OBJECT Widget *w; QString output_format; public: mButton( QWidget * parent = 0); void setWidget(Widget *w); void setOutputFormat(QString text); public slots: void clicked_cb(); }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/widgets/vbox.h0000755000175000017500000000233311511434226020522 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __VBOX_H__ #define __VBOX_H__ #include #include "widget.h" Widget *new_vbox(const QString & qName, const QXmlAttributes & atts, QWidget *parent); class VBox: public Widget { public: VBox(); bool xml_start(const QString & qName, const QXmlAttributes & atts); bool xml_end(const QString & qName, const QString &text, bool &property_ok); void add_widget(Widget *w); }; class mVBox:public QWidget { Q_OBJECT public: mVBox(QWidget * parent = 0); }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/widgets/scroll.h0000755000175000017500000000241011511434226021036 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __SCROLL_H__ #define __SCROLL_H__ #include #include #include "widget.h" Widget *new_scroll(const QString & qName, const QXmlAttributes & atts, QWidget *parent); class Scroll: public Widget { public: Scroll(); bool xml_start(const QString & qName, const QXmlAttributes & atts); bool xml_end(const QString & qName, const QString &text, bool &property_ok); void add_widget(Widget *w); }; class mScroll:public QScrollArea { Q_OBJECT public: mScroll(QWidget * parent = 0); }; #endif qtoctave-0.10.1/xmlwidget/qt4/src/widgets/scroll.cpp0000755000175000017500000000406111511434226021375 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "scroll.h" Widget *new_scroll(const QString & qName, const QXmlAttributes & atts, QWidget *parent) { if(qName != "scroll") return NULL; Scroll *w=new Scroll(); QString id=atts.value("id"); if(!id.isEmpty()) w->name=id; w->container=true; w->widget=new mScroll(parent); return (Widget *)w; } Scroll::Scroll():Widget() { } bool Scroll::xml_start(const QString & qName, const QXmlAttributes & atts) { //printf("Procesando scroll %s start %s\n", name.toLocal8Bit().data(),qName.toLocal8Bit().data()); if(qName=="scroll" && check_id(atts) ) { widget_properties(atts,this); return true; } return false; } bool Scroll::xml_end(const QString & qName, const QString &/*text*/, bool &property_ok) { //printf("Procesando scroll end %s\n", qName.toLocal8Bit().data()); if(qName=="scroll") { property_ok=false; return true; } return false; } void Scroll::add_widget(Widget *w) { //w->widget->setParent(widget); mScroll *scroll=((mScroll*)widget); scroll->widget()->layout()->addWidget(w->widget); w->widget->show(); } mScroll::mScroll(QWidget *parent):QScrollArea(parent) { QVBoxLayout *layout = new QVBoxLayout; QWidget *inner_widget=new QWidget(this); inner_widget->setLayout(layout); layout->setMargin(0); setWidget(inner_widget); inner_widget->show(); setWidgetResizable ( true ); } qtoctave-0.10.1/xmlwidget/qt4/src/widgets/selectfile.cpp0000755000175000017500000000674211511434226022226 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "selectfile.h" #include Widget *new_selectfile(const QString & qName, const QXmlAttributes & atts, QWidget *parent) { if(qName != "selectfile") return NULL; SelectFile *w=new SelectFile(); QString id=atts.value("id"); if(!id.isEmpty()) w->name=id; w->container=false; mSelectFile *fs=new mSelectFile(parent); w->widget=fs; fs->w=w; w->type=SELECTFILE; return (Widget *)w; } SelectFile::SelectFile():Widget() { signal_property_ok=false; } bool SelectFile::xml_start(const QString & qName, const QXmlAttributes & atts) { //printf("Procesando botón %s\n",qName.toLocal8Bit().data() ); mSelectFile *w=(mSelectFile *)widget; if(qName=="selectfile" && check_id(atts) ) { widget_properties(atts,this); QString title=atts.value("title"); if(!title.isEmpty()) widget->setWindowTitle ( atts.value("title") ); return true; } else if(qName=="file") { return true; } else if(qName=="signal") { QString value=atts.value("name"); if(value=="activated") { signal_property_ok=true; w->startmark=w->linestartmark=w->endmark=""; } return true; } else if(signal_property_ok) { QString value=atts.value("value"); if(!value.isEmpty()) { if(qName=="startmark") w->startmark=value; else if(qName=="endmark") w->endmark=value; else if(qName=="linestartmark") w->linestartmark=value; } return true; } return false; } bool SelectFile::xml_end(const QString & qName, const QString &text, bool &property_ok) { if(type!=SELECTFILE) { return false; } mSelectFile *l=(mSelectFile *)widget; if(qName=="selectfile") { l->show(); property_ok=false; return true; } else if(qName=="file") { l->selectFile(text); property_ok=true; return true; } else if(qName=="signal") { signal_property_ok=false; property_ok=true; return true; } else if(signal_property_ok) { if(qName=="startmark" || qName=="endmark" || qName=="linestartmark") { property_ok=true; return true; } } return false; } void SelectFile::add_widget(Widget */*w*/) { ; } mSelectFile::mSelectFile( QWidget * parent):QFileDialog(parent) { setFileMode(QFileDialog::AnyFile); connect(this,SIGNAL(finished (int)), this, SLOT(activated_cb(int))); } void mSelectFile::activated_cb ( int result ) { if(result!=QDialog::Accepted) return; QStringList list=selectedFiles (); if(list.isEmpty()) return; QString text=list.at(0); if(linestartmark.isEmpty() && startmark.isEmpty() && endmark.isEmpty() ) { text.replace("<","<"); text.replace(">",">"); w->output->write("name+"\" signal=\"activated\">\n"+toXML(text)+"\n\n"); } else { w->output->write(startmark); w->output->write(linestartmark+text); w->output->write(endmark); } } qtoctave-0.10.1/xmlwidget/qt4/src/widgets/hseparator.cpp0000755000175000017500000000420511511434226022247 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "hseparator.h" Widget *new_hseparator(const QString & qName, const QXmlAttributes & atts, QWidget *parent) { if(qName != "hseparator") return NULL; HSeparator *w=new HSeparator(); QString id=atts.value("id"); if(!id.isEmpty()) w->name=id; w->container=true; w->widget=new mHSeparator(parent); w->type=HSEPARATOR; return (Widget *)w; } HSeparator::HSeparator():Widget() { child=0; } bool HSeparator::xml_start(const QString & qName, const QXmlAttributes & atts) { //printf("Procesando hseparator %s start %s\n", name.toLocal8Bit().data(),qName.toLocal8Bit().data()); if(qName=="hseparator" && check_id(atts) ) { widget_properties(atts,this); child=0; return true; } else if(qName=="first") { child=1; return true; } else if(qName=="second") { child=2; return true; } return false; } bool HSeparator::xml_end(const QString & qName, const QString &/*text*/, bool &property_ok) { //printf("Procesando hseparator end %s\n", qName.toLocal8Bit().data()); if(qName=="hseparator") { property_ok=false; return true; } else if(qName=="first") { property_ok=true; return true; } else if(qName=="second") { property_ok=true; return true; } return false; } void HSeparator::add_widget(Widget *w) { ((mHSeparator*)widget)->insertWidget ( child-1, w->widget); } mHSeparator::mHSeparator(QWidget *parent):QSplitter(parent) { //setOrientation(Qt::Vertical); } qtoctave-0.10.1/xmlwidget/qt4/src/widgets/button.cpp0000755000175000017500000000555411511434226021422 0ustar lucaslucas/* Copyright (C) 2007 P.L. Lucas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "button.h" #include Widget *new_button(const QString & qName, const QXmlAttributes & atts, QWidget *parent) { if(qName != "button") return NULL; Button *w=new Button(); QString id=atts.value("id"); if(!id.isEmpty()) w->name=id; w->container=false; w->widget=new mButton(parent); w->type=BUTTON; (( mButton*)(w->widget))->setWidget((Widget*)w); return (Widget *)w; } Button::Button():Widget() { } bool Button::xml_start(const QString & qName, const QXmlAttributes & atts) { //printf("Procesando botón %s\n",qName.toLocal8Bit().data() ); //mButton *w=(mButton *)widget; if(qName=="button" && check_id(atts) ) { //QString icon=atts.value("icon"); //if(!title.isEmpty()) widget->setWindowTitle ( atts.value("title") ); widget_properties(atts,this); return true; } else if(qName=="text") { return true; } else if(qName=="icon") { return true; } else if(qName=="signal") { QString signal=atts.value("name"); if(signal=="clicked") QObject::connect((mButton*)widget, SIGNAL(clicked()), (mButton*)widget, SLOT(clicked_cb()) ); return true; } return false; } bool Button::xml_end(const QString & qName, const QString &text, bool &property_ok) { if(type!=BUTTON) { return false; } mButton *b=(mButton *)widget; if(qName=="button") { property_ok=false; return true; } else if(qName=="text") { b->setText(text); property_ok=true; return true; } else if(qName=="icon") { b->setIcon(QIcon(text)); QPixmap pix(text); QSize size(pix.width(),pix.height()); b->setIconSize(size); property_ok=true; return true; } else if(qName=="signal") { if(!text.isEmpty()) b->setOutputFormat(text); property_ok=true; return true; } return false; } void Button::add_widget(Widget */*w*/) { ; } mButton::mButton( QWidget * parent):QPushButton(parent) { } void mButton::setWidget(Widget *w) { this->w=w; } void mButton::setOutputFormat(QString text) { output_format=text; } void mButton::clicked_cb() { if(output_format.isEmpty()) w->output->write("