ndoutils-1.4b9/0000755000175100017510000000000011271525175013554 5ustar baeckerhbaeckerhndoutils-1.4b9/aclocal.m40000644000175100017510000000114710746407742015424 0ustar baeckerhbaeckerh# generated automatically by aclocal 1.9.5 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_include([m4/np_mysqlclient.m4]) ndoutils-1.4b9/configure.in0000644000175100017510000003006211271525175016066 0ustar baeckerhbaeckerhdnl Process this -*-m4-*- file with autoconf to produce a configure script. dnl Disable caching define([AC_CACHE_LOAD],) define([AC_CACHE_SAVE],) AC_INIT(src/ndo2db.c) AC_CONFIG_HEADER(include/config.h) AC_PREFIX_DEFAULT(/usr/local/nagios) AC_DEFINE([DEFAULT_NAGIOS_USER], [nagios], [Default Nagios User]) AC_DEFINE([DEFAULT_NAGIOS_GROUP], [nagios], [Default Nagios Group]) PKG_NAME=ndoutils PKG_VERSION="1.4b9" PKG_HOME_URL="http://www.nagios.org/" PKG_REL_DATE="10-27-2009" dnl Figure out how to invoke "install" and what install options to use. AC_PROG_INSTALL AC_SUBST(INSTALL) dnl Figure out how to invoke "perl" AC_PATH_PROG(PERL,perl) dnl What OS are we running? AC_CANONICAL_HOST dnl Checks for programs. AC_PROG_CC AC_PROG_MAKE_SET dnl Checks for header files. AC_HEADER_STDC AC_HEADER_TIME AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(arpa/inet.h ctype.h dirent.h dlfcn.h errno.h fcntl.h float.h getopt.h grp.h inttypes.h limits.h ltdl.h math.h netdb.h netinet/in.h pthread.h pwd.h regex.h signal.h socket.h stdarg.h stdint.h string.h strings.h sys/ipc.h sys/mman.h sys/msg.h sys/poll.h sys/resource.h sys/sendfile.h sys/socket.h sys/stat.h sys/time.h sys/timeb.h sys/types.h sys/un.h sys/wait.h syslog.h tcpd.h unistd.h values.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_STRUCT_TM AC_TYPE_MODE_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_SIGNAL AC_TYPE_GETGROUPS dnl Check lengths for later tests of u_int32_t and int32_t AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(short) AC_CHECK_SIZEOF(long) dnl Define u_int32_t if we don't have it already (Solaris, etc.) AC_CHECK_TYPE(uint32_t,unsigned int) AC_CHECK_TYPE(u_int32_t,unsigned int) if test "$ac_cv_type_u_int32_t" = no ; then if test "$ac_cv_type_u_int32_t" = yes ; then AC_DEFINE(U_INT32_T_IS_UINT32_T) else if test "$ac_cv_sizeof_int" = 4 ; then AC_DEFINE(U_INT32_T_IS_UINT) else if test "$ac_cv_sizeof_long" = 4 ; then AC_DEFINE(U_INT32_T_IS_ULONG) else if test "$ac_cv_sizeof_short" = 4 ; then AC_DEFINE(U_INT32_T_IS_USHORT) fi fi fi fi fi dnl Define int32_t if we don't have it already AC_CHECK_TYPE(int32_t,int) if test "$ac_cv_type_int32_t" = no ; then if test "$ac_cv_sizeof_int" = 4 ; then AC_DEFINE(INT32_T_IS_UINT) else if test "$ac_cv_sizeof_long" = 4 ; then AC_DEFINE(INT32_T_IS_ULONG) else if test "$ac_cv_sizeof_short" = 4 ; then AC_DEFINE(INT32_T_IS_USHORT) fi fi fi fi dnl Check for getopt_long (Solaris) AC_CHECK_FUNCS([getopt_long],,AC_CHECK_LIB([iberty],[getopt_long],OTHERLIBS="$OTHERLIBS -liberty")) AC_SUBST(OTHERLIBS) dnl Checks for library functions. AC_CHECK_LIB(nsl,main,SOCKETLIBS="$SOCKETLIBS -lnsl") AC_CHECK_LIB(socket,socket,SOCKETLIBS="$SOCKETLIBS -lsocket") AC_SUBST(SOCKETLIBS) AC_CHECK_LIB(wrap,main,[ LIBWRAPLIBS="$LIBWRAPLIBS -lwrap" AC_DEFINE(HAVE_LIBWRAP) ]) AC_SUBST(LIBWRAPLIBS) AC_CHECK_FUNCS(strdup strstr strtoul initgroups strtof) AC_MSG_CHECKING(for type of socket size) AC_TRY_COMPILE([#include #include #include ], [int a = send(1, (const void *)0, (size_t *) 0, (int *) 0);], [AC_DEFINE(SOCKET_SIZE_TYPE, size_t) AC_MSG_RESULT(size_t)], [AC_DEFINE(SOCKET_SIZE_TYPE, int) AC_MSG_RESULT(int)]) dnl Stolen from Python code: loewis@users.sourceforge.net dnl AC_CHECK_TYPE(socklen_t,int, dnl AC_DEFINE(socklen_t,int, dnl Define to `int' if does not define.),[ dnl #ifdef HAVE_SYS_TYPES_H dnl #include dnl #endif dnl #ifdef HAVE_SYS_SOCKET_H dnl #include dnl #endif dnl ]) dnl Check if SUN_LEN exists AC_TRY_LINK([ #include #include], [struct sockaddr_un su; int i = SUN_LEN(&su);], [AC_DEFINE(HAVE_SUN_LEN)], ) dnl Check for location of init scripts init_dir=/etc/rc.d/init.d if test -d /etc/rc.d/init.d; then init_dir="/etc/rc.d/init.d" elif test -d /usr/local/etc/rc.d; then init_dir="/usr/local/etc/rc.d" elif test -d /etc/rc.d; then init_dir="/etc/rc.d" elif test -d /etc/init.d; then init_dir="/etc/init.d" elif test -d /sbin/init.d; then init_dir="/sbin/init.d" fi dnl User can override init script location AC_ARG_WITH(init_dir,AC_HELP_STRING([--with-init-dir=],[sets directory to place init script into]),init_dir=$withval) AC_SUBST(init_dir) dnl - Modified version from www.erlang.org dnl - Some 12/15/05 mods made after reading http://xaxxon.slackworks.com/phuku/dl.html AC_MSG_CHECKING(for linker flags for loadable modules) case $host_os in solaris2*|sysv4*) MOD_LDFLAGS="-G" ;; aix4*|aix5*) #MOD_LDFLAGS="-G -bnoentry -bexpall" MOD_LDFLAGS="-G -bM:SRE -bnoentry -bexpall" ;; freebsd2*) # Non-ELF GNU linker MOD_LDFLAGS="-Bshareable" ;; darwin*) # Mach-O linker, a shared lib and a loadable # object file is not the same thing. MOD_LDFLAGS="-bundle -flat_namespace -undefined suppress" MOD_CFLAGS="$MOD_CFLAGS -fno-common" ;; linux* | k*bsd*-gnu*) # assume GNU linker and ELF MOD_LDFLAGS="-shared" MOD_CFLAGS="-fPIC" ;; *) # assume GNU linker and ELF MOD_LDFLAGS="-shared" ;; esac AC_MSG_RESULT([$MOD_LDFLAGS]) AC_SUBST(MOD_CFLAGS) AC_SUBST(MOD_LDFLAGS) dnl DB support options USE_MYSQL=yes dnl USE_PGSQL=yes AC_ARG_ENABLE(mysql,AC_HELP_STRING([--enable-mysql],[enables MySQL database support])) AS_IF([test x$enable_mysql = xno], [USE_MYSQL=no]) dnl AC_ARG_ENABLE(pgsql,--enable-pgsql enables PostgreSQL database support) dnl AS_IF([test x$enable_pgsql = xno], [USE_PGSQL=no]) dnl Are we using any MySQL routines? if test $USE_MYSQL = yes; then np_mysqlclient if test $with_mysql = "no" ; then echo "" echo "" echo "*** MySQL library could not be located... **************************" echo "" echo "You chose to compile NDOutils with MySQL support, but I was unable to" echo "locate the MySQL library on your system. If the library is" echo "installed, use the --with-mysql-lib argument to specify the" echo "location of the MySQL library." echo "installed, use the --with-mysql=DIR argument to specify the" echo "location of the MySQL library, We assume mysql_config is in DIR/dir" echo "NOTE: After you install the necessary libraries on your system:" echo " 1. Make sure /etc/ld.so.conf has an entry for the directory in" echo " which the MySQL libraries are installed." echo " 2. Run 'ldconfig' to update the run-time linker options." echo " 3. Run 'make devclean' in the NDBXT distribution to clean out" echo " any old references to your previous compile." echo " 4. Rerun the configure script." echo "" echo "TIP: Try the following...." echo " ./configure --with-mysql=/usr/lib/mysql" echo "" echo "********************************************************************" echo "" echo "" USE_MYSQL=no else echo "MySQL library and include file(s) were found!" AC_DEFINE_UNQUOTED(USE_MYSQL) DBLIBS="$DBLIBS $np_mysql_libs" CFLAGS="$CFLAGS $np_mysql_include" fi fi dnl Optional PostgreSQL library and include paths dnl AC_ARG_WITH(pgsql-lib,AC_HELP_STRING([--with-pgsql-lib=DIR],[sets location of the PostgreSQL client library]),[ dnl DBLDFLAGS="-L${withval}" dnl LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" dnl ]) dnl AC_ARG_WITH(pgsql-inc,AC_HELP_STRING([--with-pgsql-inc=DIR],[sets location of the PostgreSQL client include files]),[ dnl DBCFLAGS="${DBCFLAGS} -I${withval}" dnl ]) save_LDFLAGS="$LDFLAGS" LDFLAGS="${LDFLAGS} ${DBLDFLAGS}" save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="${DBCFLAGS}" save_CFLAGS="$CFLAGS" CFLAGS="${DBCFLAGS}" AC_SUBST(DBCFLAGS) AC_SUBST(DBLDFLAGS) AC_SUBST(DBLIBS) LDFLAGS="$save_LDFLAGS" CPPFLAGS="$save_CPPFLAGS" CFLAGS="$save_CFLAGS" dnl Moving this before the Mysql detection options breaks them.... AC_ARG_WITH(ndo2db_user,AC_HELP_STRING([--with-ndo2db-user=],[sets user name to run NDO2DB]),ndo2db_user=$withval,ndo2db_user=nagios) AC_ARG_WITH(ndo2db_group,AC_HELP_STRING([--with-ndo2db-group=],[sets group name to run NDO2DB]),ndo2db_group=$withval,ndo2db_group=nagios) AC_SUBST(ndo2db_user) AC_SUBST(ndo2db_group) INSTALL_OPTS="-o $ndo2db_user -g $ndo2db_group" AC_SUBST(INSTALL_OPTS) dnl Does user want to check for SSL? AC_ARG_ENABLE(ssl,AC_HELP_STRING([--enable-ssl],[enables native SSL support]),[ if test x$enableval = xyes; then check_for_ssl=yes else check_for_ssl=no fi ],check_for_ssl=no) dnl Optional SSL library and include paths ssl_dir= ssl_inc_dir= ssl_lib_dir= AC_ARG_WITH(ssl,AC_HELP_STRING([--with-ssl=DIR],[sets location of the SSL installation]),[ ssl_dir=$withval ]) AC_ARG_WITH(ssl-inc,AC_HELP_STRING([--with-ssl-inc=DIR],[sets location of the SSL include files]),[ ssl_inc_dir=$withval ]) AC_ARG_WITH(ssl-lib,AC_HELP_STRING([--with-ssl-lib=DIR], [sets location of the SSL libraries]),[ ssl_lib_dir=$withval ]) AC_ARG_WITH(kerberos-inc,AC_HELP_STRING([--with-kerberos-inc=DIR],[sets location of the Kerberos include files]),[ kerberos_inc_dir=$withval ]) dnl Check for SSL support dnl Modified version of Mark Ethan Trostler's macro if test x$check_for_ssl = xyes; then AC_MSG_CHECKING(for SSL headers) found_ssl=no for dir in $ssl_inc_dir $ssl_dir /usr/local/openssl /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr /usr/freeware/lib/openssl; do ssldir="$dir" if test -f "$dir/include/openssl/ssl.h"; then found_ssl=yes CFLAGS="$CFLAGS -I$dir/include/openssl -I$ssldir/include" sslincdir="$dir/include/openssl" break fi if test -f "$dir/include/ssl.h"; then found_ssl=yes CFLAGS="$CFLAGS -I$dir/include" sslincdir="$dir/include" break fi if test -f "$dir/ssl.h"; then found_ssl=yes CFLAGS="$CFLAGS -I$dir" sslincdir="$dir" ssldir="$dir/.." break fi if test -f "$dir/openssl/ssl.h"; then found_ssl=yes CFLAGS="$CFLAGS -I$dir/openssl" sslincdir="$dir/openssl" ssldir="$dir/.." break fi done if test x_$found_ssl != x_yes; then AC_MSG_ERROR(Cannot find ssl headers) else printf "SSL headers found in $ssldir\n"; dnl Now try and find SSL libraries AC_MSG_CHECKING(for SSL libraries) found_ssl=no for dir in $ssl_lib_dir $ssl_dir /usr/lib64 /usr/lib /usr/local/lib /usr/lib/ssl /usr/ssl/lib /usr/openssl/lib /usr/pkg/lib /usr/freeware/lib/openssl; do ssllibdir="$dir" if test -f "$dir/libssl.so"; then found_ssl=yes break fi done if test x_$found_ssl != x_yes; then AC_MSG_ERROR(Cannot find ssl libraries) else printf "SSL libraries found in $ssllibdir\n"; LDFLAGS="$LDFLAGS -L$ssllibdir"; LIBS="$LIBS -lssl -lcrypto"; AC_DEFINE_UNQUOTED(HAVE_SSL) AC_SUBST(HAVE_SSL) dnl Generate DH parameters echo "" echo "*** Generating DH Parameters for SSL/TLS ***" if test -f "$ssldir/sbin/openssl"; then sslbin=$ssldir/sbin/openssl else sslbin=$ssldir/bin/openssl fi # awk to strip off meta data at bottom of dhparam output $sslbin dhparam -C 512 | awk '/^-----/ {exit} {print}' > include/dh.h fi fi dnl RedHat 8.0 and 9.0 include openssl compiled with kerberos, so we must include header file AC_MSG_CHECKING(for Kerberos include files) found_kerberos=no for dir in $kerberos_inc_dir /usr/kerberos/include; do kerbdir="$dir" if test -f "$dir/krb5.h"; then found_kerberos=yes CFLAGS="$CFLAGS -I$kerbdir" AC_DEFINE_UNQUOTED(HAVE_KRB5_H) dnl AC_CHECK_HEADERS(krb5.h) break fi done if test x_$found_kerberos != x_yes; then printf "could not find include files\n"; else printf "found Kerberos include files in $kerbdir\n"; fi fi AC_OUTPUT(Makefile src/Makefile docs/docbook/en-en/Makefile subst) $PERL subst daemon-init $PERL subst config/ndo2db.cfg-sample $PERL subst config/ndomod.cfg-sample $PERL subst config/nagios.cfg $PERL subst config/misccommands.cfg dnl Review options echo "" echo "" AC_MSG_RESULT([*** Configuration summary for $PKG_NAME $PKG_VERSION $PKG_REL_DATE ***:]) echo "" echo " General Options:" echo " -------------------------" AC_MSG_RESULT([ NDO2DB user: $ndo2db_user]) AC_MSG_RESULT([ NDO2DB group: $ndo2db_group]) echo "" echo "" echo "Review the options above for accuracy. If they look okay," echo "type 'make' to compile the NDO utilities." echo "" ndoutils-1.4b9/config/0000755000175100017510000000000011253702312015007 5ustar baeckerhbaeckerhndoutils-1.4b9/config/ndomod.cfg-sample.in0000644000175100017510000001177011251020332020633 0ustar baeckerhbaeckerh##################################################################### # NDOMOD CONFIG FILE # # Last Modified: 09-05-2007 ##################################################################### # INSTANCE NAME # This option identifies the "name" associated with this particular # instance of Nagios and is used to seperate data coming from multiple # instances. Defaults to 'default' (without quotes). instance_name=default # OUTPUT TYPE # This option determines what type of output sink the NDO NEB module # should use for data output. Valid options include: # file = standard text file # tcpsocket = TCP socket # unixsocket = UNIX domain socket (default) #output_type=file #output_type=tcpsocket output_type=unixsocket # OUTPUT # This option determines the name and path of the file or UNIX domain # socket to which output will be sent if the output type option specified # above is "file" or "unixsocket", respectively. If the output type # option is "tcpsocket", this option is used to specify the IP address # of fully qualified domain name of the host that the module should # connect to for sending output. #output=@localstatedir@/ndo.dat #output=127.0.0.1 output=@localstatedir@/ndo.sock # TCP PORT # This option determines what port the module will connect to in # order to send output. This option is only valid if the output type # option specified above is "tcpsocket". tcp_port=5668 # ENCRYPTION # This option determines if the module will use SSL to encrypt the # network traffic between module and ndo2db daemon. # Both sides have to enable this feature which depends on SSL Libraries # like openssl or kerberos # This option is only valid if the output type # option specified above is "tcpsocket". # # A value of '1' will enable this feature use_ssl=0 # OUTPUT BUFFER # This option determines the size of the output buffer, which will help # prevent data from getting lost if there is a temporary disconnect from # the data sink. The number of items specified here is the number of # lines (each of variable size) of output that will be buffered. output_buffer_items=5000 # BUFFER FILE # This option is used to specify a file which will be used to store the # contents of buffered data which could not be sent to the NDO2DB daemon # before Nagios shuts down. Prior to shutting down, the NDO NEB module # will write all buffered data to this file for later processing. When # Nagios (re)starts, the NDO NEB module will read the contents of this # file and send it to the NDO2DB daemon for processing. buffer_file=@localstatedir@/ndomod.tmp # FILE ROTATION INTERVAL # This option determines how often (in seconds) the output file is # rotated by Nagios. File rotation is handled by Nagios by executing # the command defined by the file_rotation_command option. This # option has no effect if the output_type option is a socket. file_rotation_interval=14400 # FILE ROTATION COMMAND # This option specified the command (as defined in Nagios) that is # used to rotate the output file at the interval specified by the # file_rotation_interval option. This option has no effect if the # output_type option is a socket. # # See the file 'misccommands.cfg' for an example command definition # that you can use to rotate the log file. #file_rotation_command=rotate_ndo_log # FILE ROTATION TIMEOUT # This option specified the maximum number of seconds that the file # rotation command should be allowed to run before being prematurely # terminated. file_rotation_timeout=60 # RECONNECT INTERVAL # This option determines how often (in seconds) that the NDO NEB # module will attempt to re-connect to the output file or socket if # a connection to it is lost. reconnect_interval=15 # RECONNECT WARNING INTERVAL # This option determines how often (in seconds) a warning message will # be logged to the Nagios log file if a connection to the output file # or socket cannot be re-established. reconnect_warning_interval=15 #reconnect_warning_interval=900 # DATA PROCESSING OPTION # This option determines what data the NDO NEB module will process. # Do not mess with this option unless you know what you're doing!!!! # Read the source code (include/ndbxtmod.h) to determine what values # to use here. Values from source code should be OR'ed to get the # value to use here. A value of -1 will cause all data to be processed. # Read the source code (include/ndomod.h) and look for "NDOMOD_PROCESS_" # to determine what values to use here. Values from source code should # be OR'ed to get the value to use here. A value of -1 will cause all # data to be processed. data_processing_options=-1 # CONFIG OUTPUT OPTION # This option determines what types of configuration data the NDO # NEB module will dump from Nagios. Values can be OR'ed together. # Values: # 0 = Don't dump any configuration information # 1 = Dump only original config (from config files) # 2 = Dump config only after retained information has been restored # 3 = Dump both original and retained configuration config_output_options=2 ndoutils-1.4b9/config/ndo2db.cfg-sample.in0000644000175100017510000001061111253701700020523 0ustar baeckerhbaeckerh##################################################################### # NDO2DB DAEMON CONFIG FILE # # Last Modified: 01-02-2009 ##################################################################### # LOCK FILE # This is the lockfile that NDO2DB will use to store its PID number # in when it is running in daemon mode. lock_file=@localstatedir@/ndo2db.lock # USER/GROUP PRIVILIGES # These options determine the user/group that the daemon should run as. # You can specify a number (uid/gid) or a name for either option. ndo2db_user=@ndo2db_user@ ndo2db_group=@ndo2db_user@ # SOCKET TYPE # This option determines what type of socket the daemon will create # an accept connections from. # Value: # unix = Unix domain socket (default) # tcp = TCP socket socket_type=unix #socket_type=tcp # SOCKET NAME # This option determines the name and path of the UNIX domain # socket that the daemon will create and accept connections from. # This option is only valid if the socket type specified above # is "unix". socket_name=@localstatedir@/ndo.sock # TCP PORT # This option determines what port the daemon will listen for # connections on. This option is only vlaid if the socket type # specified above is "tcp". tcp_port=5668 # ENCRYPTION # This option determines if the ndo2db daemon will accept SSL to encrypt the # network traffic between module and ndo2db daemon. # Both sides have to enable this feature which depends on SSL Libraries # like openssl or kerberos # This option is only valid if the output type # option specified above is "tcpsocket". # # A value of '1' will enable this feature use_ssl=0 # DATABASE SERVER TYPE # This option determines what type of DB server the daemon should # connect to. # Values: # mysql = MySQL # pgsql = PostgreSQL db_servertype=mysql # DATABASE HOST # This option specifies what host the DB server is running on. db_host=localhost # DATABASE PORT # This option specifies the port that the DB server is running on. # Values: # 3306 = Default MySQL port # 5432 = Default PostgreSQL port db_port=3306 # DATABASE NAME # This option specifies the name of the database that should be used. db_name=nagios # DATABASE TABLE PREFIX # Determines the prefix (if any) that should be prepended to table names. # If you modify the table prefix, you'll need to modify the SQL script for # creating the database! db_prefix=nagios_ # DATABASE USERNAME/PASSWORD # This is the username/password that will be used to authenticate to the DB. # The user needs at least SELECT, INSERT, UPDATE, and DELETE privileges on # the database. db_user=ndouser db_pass=ndopassword ## TABLE TRIMMING OPTIONS # Several database tables containing Nagios event data can become quite large # over time. Most admins will want to trim these tables and keep only a # certain amount of data in them. The options below are used to specify the # age (in MINUTES) that data should be allowd to remain in various tables # before it is deleted. Using a value of zero (0) for any value means that # that particular table should NOT be automatically trimmed. # Keep timed events for 24 hours max_timedevents_age=1440 # Keep system commands for 1 week max_systemcommands_age=10080 # Keep service checks for 1 week max_servicechecks_age=10080 # Keep host checks for 1 week max_hostchecks_age=10080 # Keep event handlers for 31 days max_eventhandlers_age=44640 # Keep external commands for 31 days max_externalcommands_age=44640 # DEBUG LEVEL # This option determines how much (if any) debugging information will # be written to the debug file. OR values together to log multiple # types of information. # Values: -1 = Everything # 0 = Nothing # 1 = Process info # 2 = SQL queries debug_level=0 # DEBUG VERBOSITY # This option determines how verbose the debug log out will be. # Values: 0 = Brief output # 1 = More detailed # 2 = Very detailed debug_verbosity=1 # DEBUG FILE # This option determines where the daemon should write debugging information. debug_file=@localstatedir@/ndo2db.debug # MAX DEBUG FILE SIZE # This option determines the maximum size (in bytes) of the debug file. If # the file grows larger than this size, it will be renamed with a .old # extension. If a file already exists with a .old extension it will # automatically be deleted. This helps ensure your disk space usage doesn't # get out of control when debugging. max_debug_file_size=1000000 ndoutils-1.4b9/config/nagios.cfg.in0000644000175100017510000000101211251020332017340 0ustar baeckerhbaeckerh# SAMPLE NAGIOS CONFIG SNIPPET FOR NDOMOD # # In order to have Nagios run the NDOMOD event broker module, you'll need # to place a statement like the one found below in your main Nagios # configuration file (nagios.cfg). Adjust the paths, etc. to suit your needs. # Uncomment the line below if you're running Nagios 2.x broker_module=@bindir@/ndomod-2x.o config_file=@sysconfdir@/ndomod.cfg # Uncomment the line below if you're running Nagios 3.x #broker_module=@bindir@/ndomod-3x.o config_file=@sysconfdir@/ndomod.cfg ndoutils-1.4b9/config/misccommands.cfg.in0000644000175100017510000000065311251020332020547 0ustar baeckerhbaeckerh# SAMPLE NDO FILE ROTATION COMMAND # # This is an example Nagios command definition that can be used to # rotate the NDO output file on a regular basis. Adjust the paths, etc. # to suit your needs. This definition will need to be included in your # Nagios config files if you want to use it. define command{ command_name rotate_ndo_log command_line /bin/mv @localstatedir@/ndo.dat @localstatedir@/ndo.`date +%s` } ndoutils-1.4b9/config.sub0000755000175100017510000007706010550310745015543 0ustar baeckerhbaeckerh#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2006-01-02' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m32c) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; m32c-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ndoutils-1.4b9/REQUIREMENTS0000644000175100017510000000203610606734615015425 0ustar baeckerhbaeckerh---------------- NDO REQUIREMENTS ---------------- Because the NDOMOD event broker module traverses internal object structures in the Nagios daemon, it is highly sensitive to code and structure changes that occur throughout the Nagios development process. Therefore, it is very important that you are using a version of the NDO utilities that matches your current Nagios installation. This version of the NDO utilities requires that you: 1. are either running Nagios Nagios 2.x or 3.x (see below for details) 2. compiled the Nagios daemon with event broker support (enabled by default). Version Compatability Details ----------------------------- If you're using the NDOUtils addon, you'll have to watch out for changing version requirements as your upgrade your Nagios installation. This is particularly true if you are running the Nagios 3.x alpha/beta code, as internal data structures are changing throughout the development process. Make sure the check the Changelog for specific Nagios version requirements for each release of NDOUtils. ndoutils-1.4b9/src/0000755000175100017510000000000011271525175014343 5ustar baeckerhbaeckerhndoutils-1.4b9/src/protonum.c0000644000175100017510000000100210550310752016353 0ustar baeckerhbaeckerh#include #include #include #include int main(int argc, char **argv){ int fd=STDIN_FILENO; FILE *fp; int x=0; char temp_buffer[1024]; char *ptr1=NULL; char *ptr2=NULL; if(argc<2) exit(1); x=atoi(argv[1]); fp=fdopen(fd,"r"); while(fgets(temp_buffer,sizeof(temp_buffer),fp)){ ptr1=strtok(temp_buffer," "); ptr2=strtok(NULL," "); printf("%s %-44s %d\n",(ptr1==NULL)?"NULL":ptr1,(ptr2==NULL)?"NULL":ptr2,x); x++; } exit(1); } ndoutils-1.4b9/src/db.c0000644000175100017510000005372011253701323015072 0ustar baeckerhbaeckerh/*************************************************************** * DB.C - Datatabase routines for NDO2DB daemon * * Copyright (c) 2009 Nagios Core Development Team and Community Contributors * Copyright (c) 2005-2009 Ethan Galstad * * Last Modified: 07-11-2009 * **************************************************************/ /* include our project's header files */ #include "../include/config.h" #include "../include/common.h" #include "../include/io.h" #include "../include/utils.h" #include "../include/protoapi.h" #include "../include/ndo2db.h" #include "../include/dbhandlers.h" #include "../include/db.h" extern int errno; extern ndo2db_dbconfig ndo2db_db_settings; extern time_t ndo2db_db_last_checkin_time; char *ndo2db_db_rawtablenames[NDO2DB_MAX_DBTABLES]={ "instances", "conninfo", "objects", "objecttypes", "logentries", "systemcommands", "eventhandlers", "servicechecks", "hostchecks", "programstatus", "externalcommands", "servicestatus", "hoststatus", "processevents", "timedevents", "timedeventqueue", "flappinghistory", "commenthistory", "comments", "notifications", "contactnotifications", "contactnotificationmethods", "acknowledgements", "statehistory", "downtimehistory", "scheduleddowntime", "configfiles", "configfilevariables", "runtimevariables", "contactstatus", "customvariablestatus", "", "", "", "", "", "", "", "", "", "commands", "timeperiods", "timeperiod_timeranges", "contactgroups", "contactgroup_members", "hostgroups", "hostgroup_members", "servicegroups", "servicegroup_members", "hostescalations", "hostescalation_contacts", "serviceescalations", "serviceescalation_contacts", "hostdependencies", "servicedependencies", "contacts", "contact_addresses", "contact_notificationcommands", "hosts", "host_parenthosts", "host_contacts", "services", "service_contacts", "customvariables", "host_contactgroups", "service_contactgroups", "hostescalation_contactgroups", "serviceescalation_contactgroups" }; char *ndo2db_db_tablenames[NDO2DB_MAX_DBTABLES]; /* #define DEBUG_NDO2DB_QUERIES 1 */ /****************************************************************************/ /* CONNECTION FUNCTIONS */ /****************************************************************************/ /* initialize database structures */ int ndo2db_db_init(ndo2db_idi *idi){ register int x; if(idi==NULL) return NDO_ERROR; /* initialize db server type */ idi->dbinfo.server_type=ndo2db_db_settings.server_type; /* initialize table names */ for(x=0;xdbinfo.connected=NDO_FALSE; idi->dbinfo.error=NDO_FALSE; idi->dbinfo.instance_id=0L; idi->dbinfo.conninfo_id=0L; idi->dbinfo.latest_program_status_time=(time_t)0L; idi->dbinfo.latest_host_status_time=(time_t)0L; idi->dbinfo.latest_service_status_time=(time_t)0L; idi->dbinfo.latest_queued_event_time=(time_t)0L; idi->dbinfo.latest_realtime_data_time=(time_t)0L; idi->dbinfo.latest_comment_time=(time_t)0L; idi->dbinfo.clean_event_queue=NDO_FALSE; idi->dbinfo.last_notification_id=0L; idi->dbinfo.last_contact_notification_id=0L; idi->dbinfo.max_timedevents_age=ndo2db_db_settings.max_timedevents_age; idi->dbinfo.max_systemcommands_age=ndo2db_db_settings.max_systemcommands_age; idi->dbinfo.max_servicechecks_age=ndo2db_db_settings.max_servicechecks_age; idi->dbinfo.max_hostchecks_age=ndo2db_db_settings.max_hostchecks_age; idi->dbinfo.max_eventhandlers_age=ndo2db_db_settings.max_eventhandlers_age; idi->dbinfo.max_externalcommands_age=ndo2db_db_settings.max_externalcommands_age; idi->dbinfo.last_table_trim_time=(time_t)0L; idi->dbinfo.last_logentry_time=(time_t)0L; idi->dbinfo.last_logentry_data=NULL; idi->dbinfo.object_hashlist=NULL; /* initialize db structures, etc. */ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL if(!mysql_init(&idi->dbinfo.mysql_conn)){ syslog(LOG_USER|LOG_INFO,"Error: mysql_init() failed\n"); return NDO_ERROR; } #endif break; case NDO2DB_DBSERVER_PGSQL: #ifdef USE_PGSQL idi->dbinfo.pgsql_conn=NULL; idi->dbinfo.pgsql_result=NULL; #endif break; default: break; } return NDO_OK; } /* clean up database structures */ int ndo2db_db_deinit(ndo2db_idi *idi){ register int x; if(idi==NULL) return NDO_ERROR; /* free table names */ for(x=0;xdbinfo.connected==NDO_TRUE) return NDO_OK; switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL if(!mysql_real_connect(&idi->dbinfo.mysql_conn,ndo2db_db_settings.host,ndo2db_db_settings.username,ndo2db_db_settings.password,ndo2db_db_settings.dbname,ndo2db_db_settings.port,NULL,0)){ mysql_close(&idi->dbinfo.mysql_conn); syslog(LOG_USER|LOG_INFO,"Error: Could not connect to MySQL database: %s",mysql_error(&idi->dbinfo.mysql_conn)); result=NDO_ERROR; idi->disconnect_client=NDO_TRUE; } else{ idi->dbinfo.connected=NDO_TRUE; syslog(LOG_USER|LOG_DEBUG,"Successfully connected to MySQL database"); } #endif break; case NDO2DB_DBSERVER_PGSQL: #ifdef USE_PGSQL snprintf(connect_string,sizeof(connect_string)-1,"host='%s' port=%d dbname='%s' user='%s' password='%s'",ndo2db_db_settings.host,ndo2db_db_settings.port,ndo2db_db_settings.dbname,ndo2db_db_settings.username,ndo2db_db_settings.password); connect_string[sizeof(connect_string)-1]='\x0'; idi->dbinfo.pgsql_conn=PQconnectdb(connect_string); if(PQstatus(idi->dbinfo.pgsql_conn)==CONNECTION_BAD){ PQfinish(idi->dbinfo.pgsql_conn); syslog(LOG_USER|LOG_INFO,"Error: Could not connect to PostgreSQL database: %s",PQerrorMessage(idi->dbinfo.pgsql_conn)); result=NDO_ERROR; idi->disconnect_client=NDO_TRUE; } else{ idi->dbinfo.connected=NDO_TRUE; syslog(LOG_USER|LOG_DEBUG,"Successfully connected to PostgreSQL database"); } #endif break; default: break; } return result; } /* disconnects from the database server */ int ndo2db_db_disconnect(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; /* we're not connected... */ if(idi->dbinfo.connected==NDO_FALSE) return NDO_OK; switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL /* close the connection to the database server */ mysql_close(&idi->dbinfo.mysql_conn); syslog(LOG_USER|LOG_DEBUG,"Successfully disconnected from MySQL database"); #endif break; case NDO2DB_DBSERVER_PGSQL: #ifdef USE_PGSQL /* close database connection and cleanup */ if(PQstatus(idi->dbinfo.pgsql_conn)!=CONNECTION_BAD) PQfinish(idi->dbinfo.pgsql_conn); syslog(LOG_USER|LOG_DEBUG,"Successfully disconnected from PostgreSQL database"); #endif break; default: break; } return NDO_OK; } /* post-connect routines */ int ndo2db_db_hello(ndo2db_idi *idi){ char *buf=NULL; char *ts=NULL; int result=NDO_OK; int have_instance=NDO_FALSE; time_t current_time; /* make sure we have an instance name */ if(idi->instance_name==NULL) idi->instance_name=strdup("default"); /* get existing instance */ if(asprintf(&buf,"SELECT instance_id FROM %s WHERE instance_name='%s'",ndo2db_db_tablenames[NDO2DB_DBTABLE_INSTANCES],idi->instance_name)==-1) buf=NULL; if((result=ndo2db_db_query(idi,buf))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.mysql_result=mysql_store_result(&idi->dbinfo.mysql_conn); if((idi->dbinfo.mysql_row=mysql_fetch_row(idi->dbinfo.mysql_result))!=NULL){ ndo2db_convert_string_to_unsignedlong(idi->dbinfo.mysql_row[0],&idi->dbinfo.instance_id); have_instance=NDO_TRUE; } mysql_free_result(idi->dbinfo.mysql_result); idi->dbinfo.mysql_result=NULL; #endif break; default: break; } } free(buf); /* insert new instance if necessary */ if(have_instance==NDO_FALSE){ if(asprintf(&buf,"INSERT INTO %s SET instance_name='%s'",ndo2db_db_tablenames[NDO2DB_DBTABLE_INSTANCES],idi->instance_name)==-1) buf=NULL; if((result=ndo2db_db_query(idi,buf))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.instance_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); } ts=ndo2db_db_timet_to_sql(idi,idi->data_start_time); /* record initial connection information */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', connect_time=NOW(), last_checkin_time=NOW(), bytes_processed='0', lines_processed='0', entries_processed='0', agent_name='%s', agent_version='%s', disposition='%s', connect_source='%s', connect_type='%s', data_start_time=%s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONNINFO] ,idi->dbinfo.instance_id ,idi->agent_name ,idi->agent_version ,idi->disposition ,idi->connect_source ,idi->connect_type ,ts )==-1) buf=NULL; if((result=ndo2db_db_query(idi,buf))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.conninfo_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(ts); /* get cached object ids... */ ndo2db_get_cached_object_ids(idi); /* get latest times from various tables... */ ndo2db_db_get_latest_data_time(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_PROGRAMSTATUS],"status_update_time",(unsigned long *)&idi->dbinfo.latest_program_status_time); ndo2db_db_get_latest_data_time(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTSTATUS],"status_update_time",(unsigned long *)&idi->dbinfo.latest_host_status_time); ndo2db_db_get_latest_data_time(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICESTATUS],"status_update_time",(unsigned long *)&idi->dbinfo.latest_service_status_time); ndo2db_db_get_latest_data_time(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTSTATUS],"status_update_time",(unsigned long *)&idi->dbinfo.latest_contact_status_time); ndo2db_db_get_latest_data_time(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTQUEUE],"queued_time",(unsigned long *)&idi->dbinfo.latest_queued_event_time); ndo2db_db_get_latest_data_time(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_COMMENTS],"entry_time",(unsigned long *)&idi->dbinfo.latest_comment_time); /* calculate time of latest realtime data */ idi->dbinfo.latest_realtime_data_time=(time_t)0L; if(idi->dbinfo.latest_program_status_time>idi->dbinfo.latest_realtime_data_time) idi->dbinfo.latest_realtime_data_time=idi->dbinfo.latest_program_status_time; if(idi->dbinfo.latest_host_status_time>idi->dbinfo.latest_realtime_data_time) idi->dbinfo.latest_realtime_data_time=idi->dbinfo.latest_host_status_time; if(idi->dbinfo.latest_service_status_time>idi->dbinfo.latest_realtime_data_time) idi->dbinfo.latest_realtime_data_time=idi->dbinfo.latest_service_status_time; if(idi->dbinfo.latest_contact_status_time>idi->dbinfo.latest_realtime_data_time) idi->dbinfo.latest_realtime_data_time=idi->dbinfo.latest_contact_status_time; if(idi->dbinfo.latest_queued_event_time>idi->dbinfo.latest_realtime_data_time) idi->dbinfo.latest_realtime_data_time=idi->dbinfo.latest_queued_event_time; /* get current time */ /* make sure latest time stamp isn't in the future - this will cause problems if a backwards system time change occurs */ time(¤t_time); if(idi->dbinfo.latest_realtime_data_time>current_time) idi->dbinfo.latest_realtime_data_time=current_time; /* set flags to clean event queue, etc. */ idi->dbinfo.clean_event_queue=NDO_TRUE; /* set misc data */ idi->dbinfo.last_notification_id=0L; idi->dbinfo.last_contact_notification_id=0L; return result; } /* pre-disconnect routines */ int ndo2db_db_goodbye(ndo2db_idi *idi){ int result=NDO_OK; char *buf=NULL; char *ts=NULL; ts=ndo2db_db_timet_to_sql(idi,idi->data_end_time); /* record last connection information */ if(asprintf(&buf,"UPDATE %s SET disconnect_time=NOW(), last_checkin_time=NOW(), data_end_time=%s, bytes_processed='%lu', lines_processed='%lu', entries_processed='%lu' WHERE conninfo_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONNINFO] ,ts ,idi->bytes_processed ,idi->lines_processed ,idi->entries_processed ,idi->dbinfo.conninfo_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); free(ts); return result; } /* checking routines */ int ndo2db_db_checkin(ndo2db_idi *idi){ int result=NDO_OK; char *buf=NULL; /* record last connection information */ if(asprintf(&buf,"UPDATE %s SET last_checkin_time=NOW(), bytes_processed='%lu', lines_processed='%lu', entries_processed='%lu' WHERE conninfo_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONNINFO] ,idi->bytes_processed ,idi->lines_processed ,idi->entries_processed ,idi->dbinfo.conninfo_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); time(&ndo2db_db_last_checkin_time); return result; } /****************************************************************************/ /* MISC FUNCTIONS */ /****************************************************************************/ /* escape a string for a SQL statement */ char *ndo2db_db_escape_string(ndo2db_idi *idi, char *buf){ register int x,y,z; char *newbuf=NULL; if(idi==NULL || buf==NULL) return NULL; z=strlen(buf); /* allocate space for the new string */ if((newbuf=(char *)malloc((z*2)+1))==NULL) return NULL; /* escape characters */ for(x=0,y=0;xdbinfo.server_type==NDO2DB_DBSERVER_MYSQL){ if(buf[x]=='\'' || buf[x]=='\"' || buf[x]=='*' || buf[x]=='\\' || buf[x]=='$' || buf[x]=='?' || buf[x]=='.' || buf[x]=='^' || buf[x]=='+' || buf[x]=='[' || buf[x]==']' || buf[x]=='(' || buf[x]==')') newbuf[y++]='\\'; } else if(idi->dbinfo.server_type==NDO2DB_DBSERVER_PGSQL){ if(! (isspace(buf[x]) || isalnum(buf[x]) || (buf[x]=='_')) ) newbuf[y++]='\\'; } newbuf[y++]=buf[x]; } /* terminate escape string */ newbuf [y]='\0'; return newbuf; } /* SQL query conversion of time_t format to date/time format */ char *ndo2db_db_timet_to_sql(ndo2db_idi *idi, time_t t){ char *buf=NULL; switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL asprintf(&buf,"FROM_UNIXTIME(%lu)",(unsigned long)t); #endif break; case NDO2DB_DBSERVER_PGSQL: #ifdef USE_PGSQL asprintf(&buf,"FROM_UNIXTIME(%lu)",(unsigned long)t); #endif break; default: break; } return buf; } /* SQL query conversion of date/time format to time_t format */ char *ndo2db_db_sql_to_timet(ndo2db_idi *idi, char *field){ char *buf=NULL; switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL asprintf(&buf,"UNIX_TIMESTAMP(%s)",(field==NULL)?"":field); #endif break; case NDO2DB_DBSERVER_PGSQL: #ifdef USE_PGSQL asprintf(&buf,"UNIX_TIMESTAMP(%s",(field==NULL)?"":field); #endif break; default: break; } return buf; } /* executes a SQL statement */ int ndo2db_db_query(ndo2db_idi *idi, char *buf){ int result=NDO_OK; int query_result=0; if(idi==NULL || buf==NULL) return NDO_ERROR; /* if we're not connected, try and reconnect... */ if(idi->dbinfo.connected==NDO_FALSE){ if(ndo2db_db_connect(idi)==NDO_ERROR) return NDO_ERROR; ndo2db_db_hello(idi); } #ifdef DEBUG_NDO2DB_QUERIES printf("%s\n\n",buf); #endif ndo2db_log_debug_info(NDO2DB_DEBUGL_SQL,0,"%s\n",buf); switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL if((query_result=mysql_query(&idi->dbinfo.mysql_conn,buf))){ syslog(LOG_USER|LOG_INFO,"Error: mysql_query() failed for '%s'\n",buf); syslog(LOG_USER|LOG_INFO,"mysql_error: '%s'\n", mysql_error(&idi->dbinfo.mysql_conn)); result=NDO_ERROR; } #endif break; case NDO2DB_DBSERVER_PGSQL: #ifdef USE_PGSQL idi->dbinfo.pgsql_result==PQexec(idi->dbinfo.pgsql_conn,buf); if((query_result=PQresultStatus(idi->dbinfo.pgsql_result))!=PGRES_COMMAND_OK){ syslog(LOG_USER|LOG_INFO,"Error: PQexec() failed for '%s'\n",buf); PQclear(idi->dbinfo.pgsql_result); result=NDO_ERROR; } #endif break; default: break; } /* handle errors */ if(result==NDO_ERROR) ndo2db_handle_db_error(idi,query_result); return result; } /* frees memory associated with a query */ int ndo2db_db_free_query(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL #endif break; case NDO2DB_DBSERVER_PGSQL: #ifdef USE_PGSQL PQclear(idi->dbinfo.pgsql_result); #endif break; default: break; } return NDO_OK; } /* handles SQL query errors */ int ndo2db_handle_db_error(ndo2db_idi *idi, int query_result){ int result=0; if(idi==NULL) return NDO_ERROR; /* we're not currently connected... */ if(idi->dbinfo.connected==NDO_FALSE) return NDO_OK; switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL result=mysql_errno(&idi->dbinfo.mysql_conn); if(result==CR_SERVER_LOST || result==CR_SERVER_GONE_ERROR){ syslog(LOG_USER|LOG_INFO,"Error: Connection to MySQL database has been lost!\n"); ndo2db_db_disconnect(idi); idi->disconnect_client=NDO_TRUE; } #endif break; case NDO2DB_DBSERVER_PGSQL: #ifdef USE_PGSQL result=PQstatus(idi->dbinfo.pgsql_conn); if(result!=CONNECTION_OK){ syslog(LOG_USER|LOG_INFO,"Error: Connection to PostgreSQL database has been lost!\n"); ndo2db_db_disconnect(idi); idi->disconnect_client=NDO_TRUE; } #endif break; default: break; } return NDO_OK; } /* clears data from a given table (current instance only) */ int ndo2db_db_clear_table(ndo2db_idi *idi, char *table_name){ char *buf=NULL; int result=NDO_OK; if(idi==NULL || table_name==NULL) return NDO_ERROR; if(asprintf(&buf,"DELETE FROM %s WHERE instance_id='%lu'" ,table_name ,idi->dbinfo.instance_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); return result; } /* gets latest data time value from a given table */ int ndo2db_db_get_latest_data_time(ndo2db_idi *idi, char *table_name, char *field_name, unsigned long *t){ char *buf=NULL; char *ts[1]; int result=NDO_OK; if(idi==NULL || table_name==NULL || field_name==NULL || t==NULL) return NDO_ERROR; *t=(time_t)0L; ts[0]=ndo2db_db_sql_to_timet(idi,field_name); if(asprintf(&buf,"SELECT %s AS latest_time FROM %s WHERE instance_id='%lu' ORDER BY %s DESC LIMIT 0,1" ,ts[0] ,table_name ,idi->dbinfo.instance_id ,field_name )==-1) buf=NULL; if((result=ndo2db_db_query(idi,buf))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.mysql_result=mysql_store_result(&idi->dbinfo.mysql_conn); if((idi->dbinfo.mysql_row=mysql_fetch_row(idi->dbinfo.mysql_result))!=NULL){ ndo2db_convert_string_to_unsignedlong(idi->dbinfo.mysql_row[0],t); } mysql_free_result(idi->dbinfo.mysql_result); idi->dbinfo.mysql_result=NULL; #endif break; default: break; } } free(buf); free(ts[0]); return result; } /* trim/delete old data from a given table */ int ndo2db_db_trim_data_table(ndo2db_idi *idi, char *table_name, char *field_name, unsigned long t){ char *buf=NULL; char *ts[1]; int result=NDO_OK; if(idi==NULL || table_name==NULL || field_name==NULL) return NDO_ERROR; ts[0]=ndo2db_db_timet_to_sql(idi,(time_t)t); if(asprintf(&buf,"DELETE FROM %s WHERE instance_id='%lu' AND %s<%s" ,table_name ,idi->dbinfo.instance_id ,field_name ,ts[0] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); free(ts[0]); return result; } /* performs some periodic table maintenance... */ int ndo2db_db_perform_maintenance(ndo2db_idi *idi){ time_t current_time; /* get the current time */ time(¤t_time); /* trim tables */ if(((unsigned long)current_time-60)>(unsigned long)idi->dbinfo.last_table_trim_time){ if(idi->dbinfo.max_timedevents_age>0L) ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTS],"scheduled_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_timedevents_age)); if(idi->dbinfo.max_systemcommands_age>0L) ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SYSTEMCOMMANDS],"start_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_systemcommands_age)); if(idi->dbinfo.max_servicechecks_age>0L) ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICECHECKS],"start_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_servicechecks_age)); if(idi->dbinfo.max_hostchecks_age>0L) ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTCHECKS],"start_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_hostchecks_age)); if(idi->dbinfo.max_eventhandlers_age>0L) ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_EVENTHANDLERS],"start_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_eventhandlers_age)); if(idi->dbinfo.max_externalcommands_age>0L) ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_EXTERNALCOMMANDS],"entry_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_externalcommands_age)); idi->dbinfo.last_table_trim_time=current_time; } return NDO_OK; } ndoutils-1.4b9/src/ndo2db.c0000644000175100017510000016033511271525175015667 0ustar baeckerhbaeckerh/*************************************************************** * NDO2DB.C - NDO To Database Daemon * * Copyright (c) 2009 Nagios Core Development Team and Community Contributors * Copyright (c) 2005-2009 Ethan Galstad * * First Written: 05-19-2005 * Last Modified: 10-27-2009 * **************************************************************/ /*#define DEBUG_MEMORY 1*/ #ifdef DEBUG_MEMORY #include #endif /* include our project's header files */ #include "../include/config.h" #include "../include/common.h" #include "../include/io.h" #include "../include/utils.h" #include "../include/protoapi.h" #include "../include/ndo2db.h" #include "../include/db.h" #include "../include/dbhandlers.h" #ifdef HAVE_SSL #include "../include/dh.h" #endif #define NDO2DB_VERSION "1.4b9" #define NDO2DB_NAME "NDO2DB" #define NDO2DB_DATE "10-27-2009" #ifdef HAVE_SSL SSL_METHOD *meth; SSL_CTX *ctx; int allow_weak_random_seed = NDO_FALSE; #endif extern int use_ssl; extern int errno; char *ndo2db_config_file=NULL; char *lock_file=NULL; char *ndo2db_user=NULL; char *ndo2db_group=NULL; int ndo2db_sd=0; int ndo2db_socket_type=NDO_SINK_UNIXSOCKET; char *ndo2db_socket_name=NULL; int ndo2db_tcp_port=NDO_DEFAULT_TCP_PORT; int ndo2db_use_inetd=NDO_FALSE; int ndo2db_show_version=NDO_FALSE; int ndo2db_show_license=NDO_FALSE; int ndo2db_show_help=NDO_FALSE; ndo2db_dbconfig ndo2db_db_settings; time_t ndo2db_db_last_checkin_time=0L; char *ndo2db_debug_file=NULL; int ndo2db_debug_level=NDO2DB_DEBUGL_NONE; int ndo2db_debug_verbosity=NDO2DB_DEBUGV_BASIC; FILE *ndo2db_debug_file_fp=NULL; unsigned long ndo2db_max_debug_file_size=0L; extern char *ndo2db_db_tablenames[NDO2DB_MAX_DBTABLES]; /*#define DEBUG_NDO2DB 1*/ /* don't daemonize */ /*#define DEBUG_NDO2DB_EXIT_AFTER_CONNECTION 1*/ /* exit after first client disconnects */ /*#define DEBUG_NDO2DB2 1*/ /*#define NDO2DB_DEBUG_MBUF 1*/ /* #ifdef NDO2DB_DEBUG_MBUF unsigned long mbuf_bytes_allocated=0L; unsigned long mbuf_data_allocated=0L; #endif */ int main(int argc, char **argv){ int db_supported=NDO_FALSE; int result=NDO_OK; #ifdef DEBUG_MEMORY mtrace(); #endif #ifdef HAVE_SSL DH *dh; char seedfile[FILENAME_MAX]; int i,c; #endif result=ndo2db_process_arguments(argc,argv); if(result!=NDO_OK || ndo2db_show_help==NDO_TRUE || ndo2db_show_license==NDO_TRUE || ndo2db_show_version==NDO_TRUE){ if(result!=NDO_OK) printf("Incorrect command line arguments supplied\n"); printf("\n"); printf("%s %s\n",NDO2DB_NAME,NDO2DB_VERSION); printf("Copyright (c) 2009 Nagios Core Development Team and Community Contributors\n"); printf("Copyright (c) 2005-2008 Ethan Galstad\n"); printf("Last Modified: %s\n",NDO2DB_DATE); printf("License: GPL v2\n"); #ifdef HAVE_SSL printf("SSL/TLS Available: Anonymous DH Mode, OpenSSL 0.9.6 or higher required\n"); #endif printf("\n"); printf("Stores Nagios event and configuration data to a database for later retrieval\n"); printf("and processing. Clients that are capable of sending data to the NDO2DB daemon\n"); printf("include the LOG2NDO utility and NDOMOD event broker module.\n"); printf("\n"); printf("Usage: %s -c [-i]\n",argv[0]); printf("\n"); printf("-i = Run under INETD/XINETD.\n"); printf("\n"); exit(1); } /* initialize variables */ ndo2db_initialize_variables(); /* process config file */ if(ndo2db_process_config_file(ndo2db_config_file)!=NDO_OK){ printf("Error processing config file '%s'.\n",ndo2db_config_file); exit(1); } #ifdef HAVE_SSL /* initialize SSL */ if(use_ssl==NDO_TRUE){ SSL_library_init(); SSLeay_add_ssl_algorithms(); meth=SSLv23_server_method(); SSL_load_error_strings(); /* use week random seed if necessary */ if(allow_weak_random_seed && (RAND_status()==0)){ if(RAND_file_name(seedfile,sizeof(seedfile)-1)) if(RAND_load_file(seedfile,-1)) RAND_write_file(seedfile); if(RAND_status()==0){ syslog(LOG_ERR,"Warning: SSL/TLS uses a weak random seed which is highly discouraged"); srand(time(NULL)); for(i=0;i<500 && RAND_status()==0;i++){ for(c=0;cgr_gid); else syslog(LOG_ERR,"Warning: Could not get group entry for '%s'",group); endgrent(); } /* else we were passed the GID */ else gid=(gid_t)atoi(group); /* set effective group ID if other than current EGID */ if(gid!=getegid()){ if(setgid(gid)==-1) syslog(LOG_ERR,"Warning: Could not set effective GID=%d",(int)gid); } } /* set effective user ID */ if(user!=NULL){ /* see if this is a user name */ if(strspn(user,"0123456789")pw_uid); else syslog(LOG_ERR,"Warning: Could not get passwd entry for '%s'",user); endpwent(); } /* else we were passed the UID */ else uid=(uid_t)atoi(user); /* set effective user ID if other than current EUID */ if(uid!=geteuid()){ #ifdef HAVE_INITGROUPS /* initialize supplementary groups */ if(initgroups(user,gid)==-1){ if(errno==EPERM) syslog(LOG_ERR,"Warning: Unable to change supplementary groups using initgroups()"); else{ syslog(LOG_ERR,"Warning: Possibly root user failed dropping privileges with initgroups()"); return NDO_ERROR; } } #endif if(setuid(uid)==-1) syslog(LOG_ERR,"Warning: Could not set effective UID=%d",(int)uid); } } return NDO_OK; } int ndo2db_daemonize(void){ pid_t pid=-1; int lockfile=0; struct flock lock; int val=0; char buf[256]; char *msg=NULL; umask(S_IWGRP|S_IWOTH); /* get a lock on the lockfile */ if(lock_file){ lockfile=open(lock_file,O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH); if(lockfile<0){ asprintf(&msg,"Failed to obtain lock on file %s: %s\n", lock_file, strerror(errno)); perror(msg); ndo2db_cleanup_socket(); return NDO_ERROR; } /* see if we can read the contents of the lockfile */ if((val=read(lockfile,buf,(size_t)10))<0){ asprintf(&msg,"Lockfile exists but cannot be read"); perror(msg); ndo2db_cleanup_socket(); return NDO_ERROR; } /* place a file lock on the lock file */ lock.l_type=F_WRLCK; lock.l_start=0; lock.l_whence=SEEK_SET; lock.l_len=0; if(fcntl(lockfile,F_SETLK,&lock)<0){ if(errno==EACCES || errno==EAGAIN){ fcntl(lockfile,F_GETLK,&lock); asprintf(&msg,"Lockfile '%s' looks like its already held by another instance (%d). Bailing out...",lock_file,(int)lock.l_pid); } else asprintf(&msg,"Cannot lock lockfile '%s': %s. Bailing out...",lock_file,strerror(errno)); perror(msg); ndo2db_cleanup_socket(); return NDO_ERROR; } } /* fork */ if((pid=fork())<0){ perror("Fork error"); ndo2db_cleanup_socket(); return NDO_ERROR; } /* parent process goes away... */ else if((int)pid!=0){ ndo2db_free_program_memory(); exit(0); } /* child forks again... */ else{ if((pid=fork())<0){ perror("Fork error"); ndo2db_cleanup_socket(); return NDO_ERROR; } /* first child process goes away.. */ else if((int)pid!=0){ ndo2db_free_program_memory(); exit(0); } /* grandchild continues... */ /* grandchild becomes session leader... */ setsid(); } if(lock_file){ /* write PID to lockfile... */ lseek(lockfile,0,SEEK_SET); ftruncate(lockfile,0); sprintf(buf,"%d\n",(int)getpid()); write(lockfile,buf,strlen(buf)); /* make sure lock file stays open while program is executing... */ val=fcntl(lockfile,F_GETFD,0); val|=FD_CLOEXEC; fcntl(lockfile,F_SETFD,val); } /* close existing stdin, stdout, stderr */ close(0); #ifndef DEBUG_NDO2DB close(1); #endif close(2); /* re-open stdin, stdout, stderr with known values */ open("/dev/null",O_RDONLY); #ifndef DEBUG_NDO2DB open("/dev/null",O_WRONLY); #endif open("/dev/null",O_WRONLY); return NDO_OK; } int ndo2db_cleanup_socket(void){ /* we're running under INETD */ if(ndo2db_use_inetd==NDO_TRUE) return NDO_OK; /* close the socket */ shutdown(ndo2db_sd,2); close(ndo2db_sd); /* unlink the file */ if(ndo2db_socket_type==NDO_SINK_UNIXSOCKET) unlink(ndo2db_socket_name); if(lock_file) unlink(lock_file); return NDO_OK; } void ndo2db_parent_sighandler(int sig){ switch (sig){ case SIGTERM: case SIGINT: /* forward signal to all members of this group of processes */ kill(0, sig); break; case SIGCHLD: /* cleanup children that exit, so we don't have zombies */ while(waitpid(-1,NULL,WNOHANG)>0); return; default: printf("Caught the Signal '%d' but don't care about this.\n", sig); } /* cleanup the socket */ ndo2db_cleanup_socket(); /* free memory */ ndo2db_free_program_memory(); exit(0); return; } void ndo2db_child_sighandler(int sig){ _exit(0); return; } /****************************************************************************/ /* UTILITY FUNCTIONS */ /****************************************************************************/ int ndo2db_wait_for_connections(void){ int sd_flag=1; int new_sd=0; pid_t new_pid=-1; struct sockaddr_un server_address_u; struct sockaddr_in server_address_i; struct sockaddr_un client_address_u; struct sockaddr_in client_address_i; socklen_t client_address_length; /* TCP socket */ if(ndo2db_socket_type==NDO_SINK_TCPSOCKET){ /* create a socket */ if(!(ndo2db_sd=socket(PF_INET,SOCK_STREAM,0))){ perror("Cannot create socket"); return NDO_ERROR; } /* set the reuse address flag so we don't get errors when restarting */ sd_flag=1; if(setsockopt(ndo2db_sd,SOL_SOCKET,SO_REUSEADDR,(char *)&sd_flag,sizeof(sd_flag))<0){ printf("Could not set reuse address option on socket!\n"); return NDO_ERROR; } /* clear the address */ bzero((char *)&server_address_i,sizeof(server_address_i)); server_address_i.sin_family=AF_INET; server_address_i.sin_addr.s_addr=INADDR_ANY; server_address_i.sin_port=htons(ndo2db_tcp_port); /* bind the socket */ if((bind(ndo2db_sd,(struct sockaddr *)&server_address_i,sizeof(server_address_i)))){ close(ndo2db_sd); perror("Could not bind socket"); return NDO_ERROR; } client_address_length=(socklen_t)sizeof(client_address_i); } /* UNIX domain socket */ else{ /* create a socket */ if(!(ndo2db_sd=socket(AF_UNIX,SOCK_STREAM,0))){ perror("Cannot create socket"); return NDO_ERROR; } /* copy the socket path */ strncpy(server_address_u.sun_path,ndo2db_socket_name,sizeof(server_address_u.sun_path)); server_address_u.sun_family=AF_UNIX; /* bind the socket */ if((bind(ndo2db_sd,(struct sockaddr *)&server_address_u,SUN_LEN(&server_address_u)))){ close(ndo2db_sd); perror("Could not bind socket"); return NDO_ERROR; } client_address_length=(socklen_t)sizeof(client_address_u); } /* listen for connections */ if((listen(ndo2db_sd,1))){ perror("Cannot listen on socket"); ndo2db_cleanup_socket(); return NDO_ERROR; } /* daemonize */ #ifndef DEBUG_NDO2DB if(ndo2db_daemonize()!=NDO_OK) return NDO_ERROR; #endif /* accept connections... */ while(1){ /* Solaris 10 gets an EINTR error when file2sock invoked on the 2nd call An alternative fix is not to fork below, but this has wider implications */ while(1) { new_sd=accept(ndo2db_sd,(ndo2db_socket_type==NDO_SINK_TCPSOCKET)?(struct sockaddr *)&client_address_i:(struct sockaddr *)&client_address_u,(socklen_t *)&client_address_length); /* ToDo: Hendrik 08/12/2009 * If both ends think differently about SSL encryption, data from a ndomod will * be lost forever (likewise on database errors/misconfiguration) * This seems a good place to output some information from which client * a possible misconfiguration comes from. * Logging the ip address together with the ndomod instance name might be * a great hint for further error hunting */ if(new_sd>=0) /* data available */ break; if(errno == EINTR) { /* continue */ } else { perror("Accept error"); ndo2db_cleanup_socket(); return NDO_ERROR; } } #ifndef DEBUG_NDO2DB /* fork... */ new_pid=fork(); switch(new_pid){ case -1: /* parent simply prints an error message and keeps on going... */ perror("Fork error"); close(new_sd); break; case 0: #endif /* child processes data... */ ndo2db_handle_client_connection(new_sd); /* close socket when we're done */ close(new_sd); #ifndef DEBUG_NDO2DB return NDO_OK; break; default: /* parent keeps on going... */ close(new_sd); break; } #endif #ifdef DEBUG_NDO2DB_EXIT_AFTER_CONNECTION break; #endif } /* cleanup after ourselves */ ndo2db_cleanup_socket(); return NDO_OK; } int ndo2db_handle_client_connection(int sd){ ndo_dbuf dbuf; int dbuf_chunk=2048; ndo2db_idi idi; char buf[512]; int result=0; int error=NDO_FALSE; #ifdef HAVE_SSL SSL *ssl=NULL; #endif /* open syslog facility */ /*openlog("ndo2db",0,LOG_DAEMON);*/ /* re-open debug log */ ndo2db_close_debug_log(); ndo2db_open_debug_log(); /* reset signal handling */ signal(SIGQUIT,ndo2db_child_sighandler); signal(SIGTERM,ndo2db_child_sighandler); signal(SIGINT,ndo2db_child_sighandler); signal(SIGSEGV,ndo2db_child_sighandler); signal(SIGFPE,ndo2db_child_sighandler); /* initialize input data information */ ndo2db_idi_init(&idi); /* initialize dynamic buffer (2KB chunk size) */ ndo_dbuf_init(&dbuf,dbuf_chunk); /* initialize database connection */ ndo2db_db_init(&idi); ndo2db_db_connect(&idi); #ifdef HAVE_SSL if(use_ssl==NDO_TRUE){ if((ssl=SSL_new(ctx))!=NULL){ SSL_set_fd(ssl,sd); /* keep attempting the request if needed */ while(((result=SSL_accept(ssl))!=1) && (SSL_get_error(ssl,result)==SSL_ERROR_WANT_READ)); if(result!=1){ syslog(LOG_ERR,"Error: Could not complete SSL handshake. %d\n",SSL_get_error(ssl,result)); return NDO_ERROR; } } } #endif /* read all data from client */ while(1){ #ifdef HAVE_SSL if(use_ssl==NDO_FALSE) result=read(sd,buf,sizeof(buf)-1); else{ result=SSL_read(ssl,buf,sizeof(buf)-1); if(result==-1 && (SSL_get_error(ssl,result)==SSL_ERROR_WANT_READ)){ syslog(LOG_ERR,"SSL read error\n"); } } #else result=read(sd,buf,sizeof(buf)-1); #endif /* bail out on hard errors */ if(result==-1) { /* EAGAIN and EINTR are soft errors, so try another read() */ if (errno==EAGAIN || errno==EINTR) continue; else { error=NDO_TRUE; #ifdef HAVE_SSL if(ssl){ SSL_shutdown(ssl); SSL_free(ssl); syslog(LOG_INFO,"INFO: SSL Socket Shutdown.\n"); } #endif break; } } /* zero bytes read means we lost the connection with the client */ if(result==0){ #ifdef HAVE_SSL if(ssl){ SSL_shutdown(ssl); SSL_free(ssl); syslog(LOG_INFO,"INFO: SSL Socket Shutdown.\n"); } #endif /* gracefully back out of current operation... */ ndo2db_db_goodbye(&idi); break; } #ifdef DEBUG_NDO2DB2 printf("BYTESREAD: %d\n",result); #endif /* append data we just read to dynamic buffer */ buf[result]='\x0'; ndo_dbuf_strcat(&dbuf,buf); /* check for completed lines of input */ ndo2db_check_for_client_input(&idi,&dbuf); /* should we disconnect the client? */ if(idi.disconnect_client==NDO_TRUE){ /* gracefully back out of current operation... */ ndo2db_db_goodbye(&idi); break; } } #ifdef DEBUG_NDO2DB2 printf("BYTES: %lu, LINES: %lu\n",idi.bytes_processed,idi.lines_processed); #endif /* free memory allocated to dynamic buffer */ ndo_dbuf_free(&dbuf); /* disconnect from database */ ndo2db_db_disconnect(&idi); ndo2db_db_deinit(&idi); /* free memory */ ndo2db_free_input_memory(&idi); ndo2db_free_connection_memory(&idi); /* close syslog facility */ /*closelog();*/ if(error==NDO_TRUE) return NDO_ERROR; return NDO_OK; } /* initializes structure for tracking data */ int ndo2db_idi_init(ndo2db_idi *idi){ int x=0; if(idi==NULL) return NDO_ERROR; idi->disconnect_client=NDO_FALSE; idi->ignore_client_data=NDO_FALSE; idi->protocol_version=0; idi->instance_name=NULL; idi->buffered_input=NULL; idi->agent_name=NULL; idi->agent_version=NULL; idi->disposition=NULL; idi->connect_source=NULL; idi->connect_type=NULL; idi->current_input_section=NDO2DB_INPUT_SECTION_NONE; idi->current_input_data=NDO2DB_INPUT_DATA_NONE; idi->bytes_processed=0L; idi->lines_processed=0L; idi->entries_processed=0L; idi->current_object_config_type=NDO2DB_CONFIGTYPE_ORIGINAL; idi->data_start_time=0L; idi->data_end_time=0L; /* initialize mbuf */ for(x=0;xmbuf[x].used_lines=0; idi->mbuf[x].allocated_lines=0; idi->mbuf[x].buffer=NULL; } return NDO_OK; } /* checks for single lines of input from a client connection */ int ndo2db_check_for_client_input(ndo2db_idi *idi,ndo_dbuf *dbuf){ char *buf=NULL; register int x; if(dbuf==NULL) return NDO_OK; if(dbuf->buf==NULL) return NDO_OK; #ifdef DEBUG_NDO2DB2 printf("RAWBUF: %s\n",dbuf->buf); printf(" USED1: %lu, BYTES: %lu, LINES: %lu\n",dbuf->used_size,idi->bytes_processed,idi->lines_processed); #endif /* search for complete lines of input */ for(x=0;dbuf->buf[x]!='\x0';x++){ /* we found the end of a line */ if(dbuf->buf[x]=='\n'){ #ifdef DEBUG_NDO2DB2 printf("BUF[%d]='\\n'\n",x); #endif /* handle this line of input */ dbuf->buf[x]='\x0'; if((buf=strdup(dbuf->buf))){ ndo2db_handle_client_input(idi,buf); free(buf); buf=NULL; idi->lines_processed++; idi->bytes_processed+=(x+1); } /* shift data back to front of buffer and adjust counters */ memmove((void *)&dbuf->buf[0],(void *)&dbuf->buf[x+1],(size_t)((int)dbuf->used_size-x-1)); dbuf->used_size-=(x+1); dbuf->buf[dbuf->used_size]='\x0'; x=-1; #ifdef DEBUG_NDO2DB2 printf(" USED2: %lu, BYTES: %lu, LINES: %lu\n",dbuf->used_size,idi->bytes_processed,idi->lines_processed); #endif } } return NDO_OK; } /* handles a single line of input from a client connection */ int ndo2db_handle_client_input(ndo2db_idi *idi, char *buf){ char *var=NULL; char *val=NULL; unsigned long data_type_long=0L; int data_type=NDO_DATA_NONE; int input_type=NDO2DB_INPUT_DATA_NONE; #ifdef DEBUG_NDO2DB2 printf("HANDLING: '%s'\n",buf); #endif if(buf==NULL || idi==NULL) return NDO_ERROR; /* we're ignoring client data because of wrong protocol version, etc... */ if(idi->ignore_client_data==NDO_TRUE) return NDO_ERROR; /* skip empty lines */ if(buf[0]=='\x0') return NDO_OK; switch(idi->current_input_section){ case NDO2DB_INPUT_SECTION_NONE: var=strtok(buf,":"); val=strtok(NULL,"\n"); if(!strcmp(var,NDO_API_HELLO)){ idi->current_input_section=NDO2DB_INPUT_SECTION_HEADER; idi->current_input_data=NDO2DB_INPUT_DATA_NONE; /* free old connection memory (necessary in some cases) */ ndo2db_free_connection_memory(idi); } break; case NDO2DB_INPUT_SECTION_HEADER: var=strtok(buf,":"); val=strtok(NULL,"\n"); if(!strcmp(var,NDO_API_STARTDATADUMP)){ /* client is using wrong protocol version, bail out here... */ if(idi->protocol_version!=NDO_API_PROTOVERSION){ syslog(LOG_USER|LOG_INFO,"Error: Client protocol version %d is incompatible with server version %d. Disconnecting client...",idi->protocol_version,NDO_API_PROTOVERSION); idi->disconnect_client=NDO_TRUE; idi->ignore_client_data=NDO_TRUE; return NDO_ERROR; } idi->current_input_section=NDO2DB_INPUT_SECTION_DATA; /* save connection info to DB */ ndo2db_db_hello(idi); } else if(!strcmp(var,NDO_API_PROTOCOL)) ndo2db_convert_string_to_int((val+1),&idi->protocol_version); else if(!strcmp(var,NDO_API_INSTANCENAME)) idi->instance_name=strdup(val+1); else if(!strcmp(var,NDO_API_AGENT)) idi->agent_name=strdup(val+1); else if(!strcmp(var,NDO_API_AGENTVERSION)) idi->agent_version=strdup(val+1); else if(!strcmp(var,NDO_API_DISPOSITION)) idi->disposition=strdup(val+1); else if(!strcmp(var,NDO_API_CONNECTION)) idi->connect_source=strdup(val+1); else if(!strcmp(var,NDO_API_CONNECTTYPE)) idi->connect_type=strdup(val+1); else if(!strcmp(var,NDO_API_STARTTIME)) ndo2db_convert_string_to_unsignedlong((val+1),&idi->data_start_time); break; case NDO2DB_INPUT_SECTION_FOOTER: var=strtok(buf,":"); val=strtok(NULL,"\n"); /* client is saying goodbye... */ if(!strcmp(var,NDO_API_GOODBYE)) idi->current_input_section=NDO2DB_INPUT_SECTION_NONE; else if(!strcmp(var,NDO_API_ENDTIME)) ndo2db_convert_string_to_unsignedlong((val+1),&idi->data_end_time); break; case NDO2DB_INPUT_SECTION_DATA: if(idi->current_input_data==NDO2DB_INPUT_DATA_NONE){ var=strtok(buf,":"); val=strtok(NULL,"\n"); input_type=atoi(var); switch(input_type){ /* we're reached the end of all of the data... */ case NDO_API_ENDDATADUMP: idi->current_input_section=NDO2DB_INPUT_SECTION_FOOTER; idi->current_input_data=NDO2DB_INPUT_DATA_NONE; break; /* config dumps */ case NDO_API_STARTCONFIGDUMP: idi->current_input_data=NDO2DB_INPUT_DATA_CONFIGDUMPSTART; break; case NDO_API_ENDCONFIGDUMP: idi->current_input_data=NDO2DB_INPUT_DATA_CONFIGDUMPEND; break; /* archived data */ case NDO_API_LOGENTRY: idi->current_input_data=NDO2DB_INPUT_DATA_LOGENTRY; break; /* realtime data */ case NDO_API_PROCESSDATA: idi->current_input_data=NDO2DB_INPUT_DATA_PROCESSDATA; break; case NDO_API_TIMEDEVENTDATA: idi->current_input_data=NDO2DB_INPUT_DATA_TIMEDEVENTDATA; break; case NDO_API_LOGDATA: idi->current_input_data=NDO2DB_INPUT_DATA_LOGDATA; break; case NDO_API_SYSTEMCOMMANDDATA: idi->current_input_data=NDO2DB_INPUT_DATA_SYSTEMCOMMANDDATA; break; case NDO_API_EVENTHANDLERDATA: idi->current_input_data=NDO2DB_INPUT_DATA_EVENTHANDLERDATA; break; case NDO_API_NOTIFICATIONDATA: idi->current_input_data=NDO2DB_INPUT_DATA_NOTIFICATIONDATA; break; case NDO_API_SERVICECHECKDATA: idi->current_input_data=NDO2DB_INPUT_DATA_SERVICECHECKDATA; break; case NDO_API_HOSTCHECKDATA: idi->current_input_data=NDO2DB_INPUT_DATA_HOSTCHECKDATA; break; case NDO_API_COMMENTDATA: idi->current_input_data=NDO2DB_INPUT_DATA_COMMENTDATA; break; case NDO_API_DOWNTIMEDATA: idi->current_input_data=NDO2DB_INPUT_DATA_DOWNTIMEDATA; break; case NDO_API_FLAPPINGDATA: idi->current_input_data=NDO2DB_INPUT_DATA_FLAPPINGDATA; break; case NDO_API_PROGRAMSTATUSDATA: idi->current_input_data=NDO2DB_INPUT_DATA_PROGRAMSTATUSDATA; break; case NDO_API_HOSTSTATUSDATA: idi->current_input_data=NDO2DB_INPUT_DATA_HOSTSTATUSDATA; break; case NDO_API_SERVICESTATUSDATA: idi->current_input_data=NDO2DB_INPUT_DATA_SERVICESTATUSDATA; break; case NDO_API_CONTACTSTATUSDATA: idi->current_input_data=NDO2DB_INPUT_DATA_CONTACTSTATUSDATA; break; case NDO_API_ADAPTIVEPROGRAMDATA: idi->current_input_data=NDO2DB_INPUT_DATA_ADAPTIVEPROGRAMDATA; break; case NDO_API_ADAPTIVEHOSTDATA: idi->current_input_data=NDO2DB_INPUT_DATA_ADAPTIVEHOSTDATA; break; case NDO_API_ADAPTIVESERVICEDATA: idi->current_input_data=NDO2DB_INPUT_DATA_ADAPTIVESERVICEDATA; break; case NDO_API_ADAPTIVECONTACTDATA: idi->current_input_data=NDO2DB_INPUT_DATA_ADAPTIVECONTACTDATA; break; case NDO_API_EXTERNALCOMMANDDATA: idi->current_input_data=NDO2DB_INPUT_DATA_EXTERNALCOMMANDDATA; break; case NDO_API_AGGREGATEDSTATUSDATA: idi->current_input_data=NDO2DB_INPUT_DATA_AGGREGATEDSTATUSDATA; break; case NDO_API_RETENTIONDATA: idi->current_input_data=NDO2DB_INPUT_DATA_RETENTIONDATA; break; case NDO_API_CONTACTNOTIFICATIONDATA: idi->current_input_data=NDO2DB_INPUT_DATA_CONTACTNOTIFICATIONDATA; break; case NDO_API_CONTACTNOTIFICATIONMETHODDATA: idi->current_input_data=NDO2DB_INPUT_DATA_CONTACTNOTIFICATIONMETHODDATA; break; case NDO_API_ACKNOWLEDGEMENTDATA: idi->current_input_data=NDO2DB_INPUT_DATA_ACKNOWLEDGEMENTDATA; break; case NDO_API_STATECHANGEDATA: idi->current_input_data=NDO2DB_INPUT_DATA_STATECHANGEDATA; break; /* config variables */ case NDO_API_MAINCONFIGFILEVARIABLES: idi->current_input_data=NDO2DB_INPUT_DATA_MAINCONFIGFILEVARIABLES; break; case NDO_API_RESOURCECONFIGFILEVARIABLES: idi->current_input_data=NDO2DB_INPUT_DATA_RESOURCECONFIGFILEVARIABLES; break; case NDO_API_CONFIGVARIABLES: idi->current_input_data=NDO2DB_INPUT_DATA_CONFIGVARIABLES; break; case NDO_API_RUNTIMEVARIABLES: idi->current_input_data=NDO2DB_INPUT_DATA_RUNTIMEVARIABLES; break; /* object configuration */ case NDO_API_HOSTDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_HOSTDEFINITION; break; case NDO_API_HOSTGROUPDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_HOSTGROUPDEFINITION; break; case NDO_API_SERVICEDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_SERVICEDEFINITION; break; case NDO_API_SERVICEGROUPDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_SERVICEGROUPDEFINITION; break; case NDO_API_HOSTDEPENDENCYDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_HOSTDEPENDENCYDEFINITION; break; case NDO_API_SERVICEDEPENDENCYDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_SERVICEDEPENDENCYDEFINITION; break; case NDO_API_HOSTESCALATIONDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_HOSTESCALATIONDEFINITION; break; case NDO_API_SERVICEESCALATIONDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_SERVICEESCALATIONDEFINITION; break; case NDO_API_COMMANDDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_COMMANDDEFINITION; break; case NDO_API_TIMEPERIODDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_TIMEPERIODDEFINITION; break; case NDO_API_CONTACTDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_CONTACTDEFINITION; break; case NDO_API_CONTACTGROUPDEFINITION: idi->current_input_data=NDO2DB_INPUT_DATA_CONTACTGROUPDEFINITION; break; case NDO_API_HOSTEXTINFODEFINITION: /* deprecated - merged with host definitions */ case NDO_API_SERVICEEXTINFODEFINITION: /* deprecated - merged with service definitions */ default: break; } /* initialize input data */ ndo2db_start_input_data(idi); } /* we are processing some type of data already... */ else{ var=strtok(buf,"="); val=strtok(NULL,"\n"); /* get the data type */ data_type_long=strtoul(var,NULL,0); /* there was an error with the data type - throw it out */ if(data_type_long==ULONG_MAX && errno==ERANGE) break; data_type=(int)data_type_long; /* the current data section is ending... */ if(data_type==NDO_API_ENDDATA){ /* finish current data processing */ ndo2db_end_input_data(idi); idi->current_input_data=NDO2DB_INPUT_DATA_NONE; } /* add data for already existing data type... */ else{ /* the data type is out of range - throw it out */ if(data_type>NDO_MAX_DATA_TYPES){ #ifdef DEBUG_NDO2DB2 printf("## DISCARD! LINE: %lu, TYPE: %d, VAL: %s\n",idi->lines_processed,data_type,val); #endif break; } #ifdef DEBUG_NDO2DB2 printf("LINE: %lu, TYPE: %d, VAL:%s\n",idi->lines_processed,data_type,val); #endif ndo2db_add_input_data_item(idi,data_type,val); } } break; default: break; } return NDO_OK; } int ndo2db_start_input_data(ndo2db_idi *idi){ int x; if(idi==NULL) return NDO_ERROR; /* sometimes ndo2db_end_input_data() isn't called, so free memory if we find it */ ndo2db_free_input_memory(idi); /* allocate memory for holding buffered input */ if((idi->buffered_input=(char **)malloc(sizeof(char *)*NDO_MAX_DATA_TYPES))==NULL) return NDO_ERROR; /* initialize buffered input slots */ for(x=0;xbuffered_input[x]=NULL; return NDO_OK; } int ndo2db_add_input_data_item(ndo2db_idi *idi, int type, char *buf){ char *newbuf=NULL; int mbuf_used=NDO_TRUE; if(idi==NULL) return NDO_ERROR; /* escape data if necessary */ switch(type){ case NDO_DATA_ACKAUTHOR: case NDO_DATA_ACKDATA: case NDO_DATA_AUTHORNAME: case NDO_DATA_CHECKCOMMAND: case NDO_DATA_COMMANDARGS: case NDO_DATA_COMMANDLINE: case NDO_DATA_COMMANDSTRING: case NDO_DATA_COMMENT: case NDO_DATA_EVENTHANDLER: case NDO_DATA_GLOBALHOSTEVENTHANDLER: case NDO_DATA_GLOBALSERVICEEVENTHANDLER: case NDO_DATA_HOST: case NDO_DATA_LOGENTRY: case NDO_DATA_OUTPUT: case NDO_DATA_LONGOUTPUT: case NDO_DATA_PERFDATA: case NDO_DATA_SERVICE: case NDO_DATA_PROGRAMNAME: case NDO_DATA_PROGRAMVERSION: case NDO_DATA_PROGRAMDATE: case NDO_DATA_COMMANDNAME: case NDO_DATA_CONTACTADDRESS: case NDO_DATA_CONTACTALIAS: case NDO_DATA_CONTACTGROUP: case NDO_DATA_CONTACTGROUPALIAS: case NDO_DATA_CONTACTGROUPMEMBER: case NDO_DATA_CONTACTGROUPNAME: case NDO_DATA_CONTACTNAME: case NDO_DATA_DEPENDENTHOSTNAME: case NDO_DATA_DEPENDENTSERVICEDESCRIPTION: case NDO_DATA_EMAILADDRESS: case NDO_DATA_HOSTADDRESS: case NDO_DATA_HOSTALIAS: case NDO_DATA_HOSTCHECKCOMMAND: case NDO_DATA_HOSTCHECKPERIOD: case NDO_DATA_HOSTEVENTHANDLER: case NDO_DATA_HOSTFAILUREPREDICTIONOPTIONS: case NDO_DATA_HOSTGROUPALIAS: case NDO_DATA_HOSTGROUPMEMBER: case NDO_DATA_HOSTGROUPNAME: case NDO_DATA_HOSTNAME: case NDO_DATA_HOSTNOTIFICATIONCOMMAND: case NDO_DATA_HOSTNOTIFICATIONPERIOD: case NDO_DATA_PAGERADDRESS: case NDO_DATA_PARENTHOST: case NDO_DATA_SERVICECHECKCOMMAND: case NDO_DATA_SERVICECHECKPERIOD: case NDO_DATA_SERVICEDESCRIPTION: case NDO_DATA_SERVICEEVENTHANDLER: case NDO_DATA_SERVICEFAILUREPREDICTIONOPTIONS: case NDO_DATA_SERVICEGROUPALIAS: case NDO_DATA_SERVICEGROUPMEMBER: case NDO_DATA_SERVICEGROUPNAME: case NDO_DATA_SERVICENOTIFICATIONCOMMAND: case NDO_DATA_SERVICENOTIFICATIONPERIOD: case NDO_DATA_TIMEPERIODALIAS: case NDO_DATA_TIMEPERIODNAME: case NDO_DATA_TIMERANGE: case NDO_DATA_ACTIONURL: case NDO_DATA_ICONIMAGE: case NDO_DATA_ICONIMAGEALT: case NDO_DATA_NOTES: case NDO_DATA_NOTESURL: case NDO_DATA_CUSTOMVARIABLE: case NDO_DATA_CONTACT: /* strings are escaped when they arrive */ if(buf==NULL) newbuf=strdup(""); else newbuf=strdup(buf); ndo_unescape_buffer(newbuf); break; default: /* data hasn't been escaped */ if(buf==NULL) newbuf=strdup(""); else newbuf=strdup(buf); break; } /* check for errors */ if(newbuf==NULL){ #ifdef DEBUG_NDO2DB printf("ALLOCATION ERROR\n"); #endif return NDO_ERROR; } /* store the buffered data */ switch(type){ /* special case for data items that may appear multiple times */ case NDO_DATA_CONTACTGROUP: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_CONTACTGROUP,newbuf); break; case NDO_DATA_CONTACTGROUPMEMBER: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_CONTACTGROUPMEMBER,newbuf); break; case NDO_DATA_SERVICEGROUPMEMBER: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_SERVICEGROUPMEMBER,newbuf); break; case NDO_DATA_HOSTGROUPMEMBER: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_HOSTGROUPMEMBER,newbuf); break; case NDO_DATA_SERVICENOTIFICATIONCOMMAND: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_SERVICENOTIFICATIONCOMMAND,newbuf); break; case NDO_DATA_HOSTNOTIFICATIONCOMMAND: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_HOSTNOTIFICATIONCOMMAND,newbuf); break; case NDO_DATA_CONTACTADDRESS: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_CONTACTADDRESS,newbuf); break; case NDO_DATA_TIMERANGE: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_TIMERANGE,newbuf); break; case NDO_DATA_PARENTHOST: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_PARENTHOST,newbuf); break; case NDO_DATA_CONFIGFILEVARIABLE: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_CONFIGFILEVARIABLE,newbuf); break; case NDO_DATA_CONFIGVARIABLE: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_CONFIGVARIABLE,newbuf); break; case NDO_DATA_RUNTIMEVARIABLE: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_RUNTIMEVARIABLE,newbuf); break; case NDO_DATA_CUSTOMVARIABLE: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_CUSTOMVARIABLE,newbuf); break; case NDO_DATA_CONTACT: ndo2db_add_input_data_mbuf(idi,type,NDO2DB_MBUF_CONTACT,newbuf); break; /* NORMAL DATA */ /* normal data items appear only once per data type */ default: mbuf_used=NDO_FALSE; /* if there was already a matching item, discard the old one */ if(idi->buffered_input[type]!=NULL){ free(idi->buffered_input[type]); idi->buffered_input[type]=NULL; } /* save buffered item */ idi->buffered_input[type]=newbuf; } return NDO_OK; } int ndo2db_add_input_data_mbuf(ndo2db_idi *idi, int type, int mbuf_slot, char *buf){ int allocation_chunk=80; char **newbuffer=NULL; if(idi==NULL || buf==NULL) return NDO_ERROR; if(mbuf_slot>=NDO2DB_MAX_MBUF_ITEMS) return NDO_ERROR; /* create buffer */ if(idi->mbuf[mbuf_slot].buffer==NULL){ #ifdef NDO2DB_DEBUG_MBUF mbuf_bytes_allocated+=sizeof(char *)*allocation_chunk; printf("MBUF INITIAL ALLOCATION (MBUF = %lu bytes)\n",mbuf_bytes_allocated); #endif idi->mbuf[mbuf_slot].buffer=(char **)malloc(sizeof(char *)*allocation_chunk); idi->mbuf[mbuf_slot].allocated_lines+=allocation_chunk; } /* expand buffer */ if(idi->mbuf[mbuf_slot].used_lines==idi->mbuf[mbuf_slot].allocated_lines){ newbuffer=(char **)realloc(idi->mbuf[mbuf_slot].buffer,sizeof(char *)*(idi->mbuf[mbuf_slot].allocated_lines+allocation_chunk)); if(newbuffer==NULL) return NDO_ERROR; #ifdef NDO2DB_DEBUG_MBUF mbuf_bytes_allocated+=sizeof(char *)*allocation_chunk; printf("MBUF RESIZED (MBUF = %lu bytes)\n",mbuf_bytes_allocated); #endif idi->mbuf[mbuf_slot].buffer=newbuffer; idi->mbuf[mbuf_slot].allocated_lines+=allocation_chunk; } /* store the data */ if(idi->mbuf[mbuf_slot].buffer){ idi->mbuf[mbuf_slot].buffer[idi->mbuf[mbuf_slot].used_lines]=buf; idi->mbuf[mbuf_slot].used_lines++; } else return NDO_ERROR; return NDO_OK; } int ndo2db_end_input_data(ndo2db_idi *idi){ int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* update db stats occassionally */ if(ndo2db_db_last_checkin_time<(time(NULL)-60)) ndo2db_db_checkin(idi); #ifdef DEBUG_NDO2DB2 printf("HANDLING TYPE: %d\n",idi->current_input_data); #endif switch(idi->current_input_data){ /* archived log entries */ case NDO2DB_INPUT_DATA_LOGENTRY: result=ndo2db_handle_logentry(idi); break; /* realtime Nagios data */ case NDO2DB_INPUT_DATA_PROCESSDATA: result=ndo2db_handle_processdata(idi); break; case NDO2DB_INPUT_DATA_TIMEDEVENTDATA: result=ndo2db_handle_timedeventdata(idi); break; case NDO2DB_INPUT_DATA_LOGDATA: result=ndo2db_handle_logdata(idi); break; case NDO2DB_INPUT_DATA_SYSTEMCOMMANDDATA: result=ndo2db_handle_systemcommanddata(idi); break; case NDO2DB_INPUT_DATA_EVENTHANDLERDATA: result=ndo2db_handle_eventhandlerdata(idi); break; case NDO2DB_INPUT_DATA_NOTIFICATIONDATA: result=ndo2db_handle_notificationdata(idi); break; case NDO2DB_INPUT_DATA_SERVICECHECKDATA: result=ndo2db_handle_servicecheckdata(idi); break; case NDO2DB_INPUT_DATA_HOSTCHECKDATA: result=ndo2db_handle_hostcheckdata(idi); break; case NDO2DB_INPUT_DATA_COMMENTDATA: result=ndo2db_handle_commentdata(idi); break; case NDO2DB_INPUT_DATA_DOWNTIMEDATA: result=ndo2db_handle_downtimedata(idi); break; case NDO2DB_INPUT_DATA_FLAPPINGDATA: result=ndo2db_handle_flappingdata(idi); break; case NDO2DB_INPUT_DATA_PROGRAMSTATUSDATA: result=ndo2db_handle_programstatusdata(idi); break; case NDO2DB_INPUT_DATA_HOSTSTATUSDATA: result=ndo2db_handle_hoststatusdata(idi); break; case NDO2DB_INPUT_DATA_SERVICESTATUSDATA: result=ndo2db_handle_servicestatusdata(idi); break; case NDO2DB_INPUT_DATA_CONTACTSTATUSDATA: result=ndo2db_handle_contactstatusdata(idi); break; case NDO2DB_INPUT_DATA_ADAPTIVEPROGRAMDATA: result=ndo2db_handle_adaptiveprogramdata(idi); break; case NDO2DB_INPUT_DATA_ADAPTIVEHOSTDATA: result=ndo2db_handle_adaptivehostdata(idi); break; case NDO2DB_INPUT_DATA_ADAPTIVESERVICEDATA: result=ndo2db_handle_adaptiveservicedata(idi); break; case NDO2DB_INPUT_DATA_ADAPTIVECONTACTDATA: result=ndo2db_handle_adaptivecontactdata(idi); break; case NDO2DB_INPUT_DATA_EXTERNALCOMMANDDATA: result=ndo2db_handle_externalcommanddata(idi); break; case NDO2DB_INPUT_DATA_AGGREGATEDSTATUSDATA: result=ndo2db_handle_aggregatedstatusdata(idi); break; case NDO2DB_INPUT_DATA_RETENTIONDATA: result=ndo2db_handle_retentiondata(idi); break; case NDO2DB_INPUT_DATA_CONTACTNOTIFICATIONDATA: result=ndo2db_handle_contactnotificationdata(idi); break; case NDO2DB_INPUT_DATA_CONTACTNOTIFICATIONMETHODDATA: result=ndo2db_handle_contactnotificationmethoddata(idi); break; case NDO2DB_INPUT_DATA_ACKNOWLEDGEMENTDATA: result=ndo2db_handle_acknowledgementdata(idi); break; case NDO2DB_INPUT_DATA_STATECHANGEDATA: result=ndo2db_handle_statechangedata(idi); break; /* config file and variable dumps */ case NDO2DB_INPUT_DATA_MAINCONFIGFILEVARIABLES: result=ndo2db_handle_configfilevariables(idi,0); break; case NDO2DB_INPUT_DATA_RESOURCECONFIGFILEVARIABLES: result=ndo2db_handle_configfilevariables(idi,1); break; case NDO2DB_INPUT_DATA_CONFIGVARIABLES: result=ndo2db_handle_configvariables(idi); break; case NDO2DB_INPUT_DATA_RUNTIMEVARIABLES: result=ndo2db_handle_runtimevariables(idi); break; case NDO2DB_INPUT_DATA_CONFIGDUMPSTART: result=ndo2db_handle_configdumpstart(idi); break; case NDO2DB_INPUT_DATA_CONFIGDUMPEND: result=ndo2db_handle_configdumpend(idi); break; /* config definitions */ case NDO2DB_INPUT_DATA_HOSTDEFINITION: result=ndo2db_handle_hostdefinition(idi); break; case NDO2DB_INPUT_DATA_HOSTGROUPDEFINITION: result=ndo2db_handle_hostgroupdefinition(idi); break; case NDO2DB_INPUT_DATA_SERVICEDEFINITION: result=ndo2db_handle_servicedefinition(idi); break; case NDO2DB_INPUT_DATA_SERVICEGROUPDEFINITION: result=ndo2db_handle_servicegroupdefinition(idi); break; case NDO2DB_INPUT_DATA_HOSTDEPENDENCYDEFINITION: result=ndo2db_handle_hostdependencydefinition(idi); break; case NDO2DB_INPUT_DATA_SERVICEDEPENDENCYDEFINITION: result=ndo2db_handle_servicedependencydefinition(idi); break; case NDO2DB_INPUT_DATA_HOSTESCALATIONDEFINITION: result=ndo2db_handle_hostescalationdefinition(idi); break; case NDO2DB_INPUT_DATA_SERVICEESCALATIONDEFINITION: result=ndo2db_handle_serviceescalationdefinition(idi); break; case NDO2DB_INPUT_DATA_COMMANDDEFINITION: result=ndo2db_handle_commanddefinition(idi); break; case NDO2DB_INPUT_DATA_TIMEPERIODDEFINITION: result=ndo2db_handle_timeperiodefinition(idi); break; case NDO2DB_INPUT_DATA_CONTACTDEFINITION: result=ndo2db_handle_contactdefinition(idi); break; case NDO2DB_INPUT_DATA_CONTACTGROUPDEFINITION: result=ndo2db_handle_contactgroupdefinition(idi); break; case NDO2DB_INPUT_DATA_HOSTEXTINFODEFINITION: /* deprecated - merged with host definitions */ break; case NDO2DB_INPUT_DATA_SERVICEEXTINFODEFINITION: /* deprecated - merged with service definitions */ break; default: break; } /* free input memory */ ndo2db_free_input_memory(idi); /* adjust items processed */ idi->entries_processed++; /* perform periodic maintenance... */ ndo2db_db_perform_maintenance(idi); return result; } /* free memory allocated to data input */ int ndo2db_free_input_memory(ndo2db_idi *idi){ register int x=0; register int y=0; if(idi==NULL) return NDO_ERROR; /* free memory allocated to single-instance data buffers */ if(idi->buffered_input){ for(x=0;xbuffered_input[x]) free(idi->buffered_input[x]); idi->buffered_input[x]=NULL; } free(idi->buffered_input); idi->buffered_input=NULL; } /* free memory allocated to multi-instance data buffers */ if(idi->mbuf){ for(x=0;xmbuf[x].buffer){ for(y=0;ymbuf[x].used_lines;y++){ if(idi->mbuf[x].buffer[y]){ free(idi->mbuf[x].buffer[y]); idi->mbuf[x].buffer[y]=NULL; } } free(idi->mbuf[x].buffer); idi->mbuf[x].buffer=NULL; } idi->mbuf[x].used_lines=0; idi->mbuf[x].allocated_lines=0; } } return NDO_OK; } /* free memory allocated to connection */ int ndo2db_free_connection_memory(ndo2db_idi *idi){ if(idi->instance_name){ free(idi->instance_name); idi->instance_name=NULL; } if(idi->agent_name){ free(idi->agent_name); idi->agent_name=NULL; } if(idi->agent_version){ free(idi->agent_version); idi->agent_version=NULL; } if(idi->disposition){ free(idi->disposition); idi->disposition=NULL; } if(idi->connect_source){ free(idi->connect_source); idi->connect_source=NULL; } if(idi->connect_type){ free(idi->connect_type); idi->connect_type=NULL; } return NDO_OK; } /****************************************************************************/ /* DATA TYPE CONVERTION ROUTINES */ /****************************************************************************/ int ndo2db_convert_standard_data_elements(ndo2db_idi *idi, int *type, int *flags, int *attr, struct timeval *tstamp){ int result1=NDO_OK; int result2=NDO_OK; int result3=NDO_OK; int result4=NDO_OK; result1=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_TYPE],type); result2=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAGS],flags); result3=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ATTRIBUTES],attr); result4=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_TIMESTAMP],tstamp); if(result1==NDO_ERROR || result2==NDO_ERROR || result3==NDO_ERROR || result4==NDO_ERROR) return NDO_ERROR; return NDO_OK; } int ndo2db_convert_string_to_int(char *buf, int *i){ if(buf==NULL) return NDO_ERROR; *i=atoi(buf); return NDO_OK; } int ndo2db_convert_string_to_float(char *buf, float *f){ char *endptr=NULL; if(buf==NULL) return NDO_ERROR; #ifdef HAVE_STRTOF *f=strtof(buf,&endptr); #else /* Solaris 8 doesn't have strtof() */ *f=(float)strtod(buf,&endptr); #endif if(*f==0 && (endptr==buf || errno==ERANGE)) return NDO_ERROR; if(errno==ERANGE) return NDO_ERROR; return NDO_OK; } int ndo2db_convert_string_to_double(char *buf, double *d){ char *endptr=NULL; if(buf==NULL) return NDO_ERROR; *d=strtod(buf,&endptr); if(*d==0 && (endptr==buf || errno==ERANGE)) return NDO_ERROR; if(errno==ERANGE) return NDO_ERROR; return NDO_OK; } int ndo2db_convert_string_to_long(char *buf, long *l){ char *endptr=NULL; if(buf==NULL) return NDO_ERROR; *l=strtol(buf,&endptr,0); if(*l==LONG_MAX && errno==ERANGE) return NDO_ERROR; if(*l==0L && endptr==buf) return NDO_ERROR; return NDO_OK; } int ndo2db_convert_string_to_unsignedlong(char *buf, unsigned long *ul){ char *endptr=NULL; if(buf==NULL) return NDO_ERROR; *ul=strtoul(buf,&endptr,0); if(*ul==ULONG_MAX && errno==ERANGE) return NDO_ERROR; if(*ul==0L && endptr==buf) return NDO_ERROR; return NDO_OK; } int ndo2db_convert_string_to_timeval(char *buf, struct timeval *tv){ char *newbuf=NULL; char *ptr=NULL; int result=NDO_OK; if(buf==NULL) return NDO_ERROR; tv->tv_sec=(time_t)0L; tv->tv_usec=(suseconds_t)0L; if((newbuf=strdup(buf))==NULL) return NDO_ERROR; ptr=strtok(newbuf,"."); if((result=ndo2db_convert_string_to_unsignedlong(ptr,(unsigned long *)&tv->tv_sec))==NDO_OK){ ptr=strtok(NULL,"\n"); result=ndo2db_convert_string_to_unsignedlong(ptr,(unsigned long *)&tv->tv_usec); } free(newbuf); if(result==NDO_ERROR) return NDO_ERROR; return NDO_OK; } /****************************************************************************/ /* LOGGING ROUTINES */ /****************************************************************************/ /* opens the debug log for writing */ int ndo2db_open_debug_log(void){ /* don't do anything if we're not debugging */ if(ndo2db_debug_level==NDO2DB_DEBUGL_NONE) return NDO_OK; if((ndo2db_debug_file_fp=fopen(ndo2db_debug_file,"a+"))==NULL) { syslog(LOG_ERR, "Warning: Could not open debug file '%s' - '%s'", ndo2db_debug_file, strerror(errno)); return NDO_ERROR; } return NDO_OK; } /* closes the debug log */ int ndo2db_close_debug_log(void){ if(ndo2db_debug_file_fp!=NULL) fclose(ndo2db_debug_file_fp); ndo2db_debug_file_fp=NULL; return NDO_OK; } /* write to the debug log */ int ndo2db_log_debug_info(int level, int verbosity, const char *fmt, ...){ va_list ap; char *temp_path=NULL; struct timeval current_time; if(!(ndo2db_debug_level==NDO2DB_DEBUGL_ALL || (level & ndo2db_debug_level))) return NDO_OK; if(verbosity>ndo2db_debug_verbosity) return NDO_OK; if(ndo2db_debug_file_fp==NULL) return NDO_ERROR; /* write the timestamp */ gettimeofday(¤t_time,NULL); fprintf(ndo2db_debug_file_fp,"[%lu.%06lu] [%03d.%d] [pid=%lu] ",current_time.tv_sec,current_time.tv_usec,level,verbosity,(unsigned long)getpid()); /* write the data */ va_start(ap,fmt); vfprintf(ndo2db_debug_file_fp,fmt,ap); va_end(ap); /* flush, so we don't have problems tailing or when fork()ing */ fflush(ndo2db_debug_file_fp); /* if file has grown beyond max, rotate it */ if((unsigned long)ftell(ndo2db_debug_file_fp)>ndo2db_max_debug_file_size && ndo2db_max_debug_file_size>0L){ /* close the file */ ndo2db_close_debug_log(); /* rotate the log file */ asprintf(&temp_path,"%s.old",ndo2db_debug_file); if(temp_path){ /* unlink the old debug file */ unlink(temp_path); /* rotate the debug file */ my_rename(ndo2db_debug_file,temp_path); /* free memory */ my_free(temp_path); } /* open a new file */ ndo2db_open_debug_log(); } return NDO_OK; } ndoutils-1.4b9/src/dbhandlers.c0000644000175100017510000051366311271523207016625 0ustar baeckerhbaeckerh/*************************************************************** * DBHANDLERS.C - Data handler routines for NDO2DB daemon * * Copyright (c) 2009 Nagios Core Development Team and Community Contributors * Copyright (c) 2005-2009 Ethan Galstad * * Last Modified: 07-11-2009 * **************************************************************/ /* include our project's header files */ #include "../include/config.h" #include "../include/common.h" #include "../include/io.h" #include "../include/utils.h" #include "../include/protoapi.h" #include "../include/ndo2db.h" #include "../include/db.h" #include "../include/dbhandlers.h" /* Nagios header files */ #ifdef BUILD_NAGIOS_2X #include "../include/nagios-2x/nagios.h" #include "../include/nagios-2x/broker.h" #include "../include/nagios-2x/comments.h" #endif #ifdef BUILD_NAGIOS_3X #include "../include/nagios-3x/nagios.h" #include "../include/nagios-3x/broker.h" #include "../include/nagios-3x/comments.h" #endif extern int errno; extern char *ndo2db_db_tablenames[NDO2DB_MAX_DBTABLES]; /****************************************************************************/ /* OBJECT ROUTINES */ /****************************************************************************/ int ndo2db_get_object_id(ndo2db_idi *idi, int object_type, char *n1, char *n2, unsigned long *object_id){ int result=NDO_OK; int x = 0; unsigned long cached_object_id=0L; int found_object=NDO_FALSE; char *name1=NULL; char *name2=NULL; char *buf=NULL; char *buf1=NULL; char *buf2=NULL; char *es[2]; /* make sure empty strings are set to null */ name1=n1; name2=n2; if(name1 && !strcmp(name1,"")) name1=NULL; if(name2 && !strcmp(name2,"")) name2=NULL; /* null names mean no object id */ if(name1==NULL && name2==NULL){ *object_id=0L; return NDO_OK; } /* see if the object already exists in cached lookup table */ if(ndo2db_get_cached_object_id(idi,object_type,name1,name2,&cached_object_id)==NDO_OK){ *object_id=cached_object_id; return NDO_OK; } if(name1==NULL){ es[0]=NULL; if(asprintf(&buf1,"name1 IS NULL")==-1) buf1=NULL; } else{ es[0]=ndo2db_db_escape_string(idi,name1); /* HINT: HB 10/27/2009 * BINARY operator is just a MySQL special to provide case sensitive queries * Think about it in the future if not only MySQL is supported */ if(asprintf(&buf1,"BINARY name1='%s'",es[0])==-1) buf1=NULL; } if(name2==NULL){ es[1]=NULL; if(asprintf(&buf2,"name2 IS NULL")==-1) buf2=NULL; } else{ es[1]=ndo2db_db_escape_string(idi,name2); /* HINT: HB 10/27/2009 * BINARY operator is just a MySQL special to provide case sensitive queries * Think about it in the future if not only MySQL is supported */ if(asprintf(&buf2,"BINARY name2='%s'",es[1])==-1) buf2=NULL; } if(asprintf(&buf,"SELECT * FROM %s WHERE instance_id='%lu' AND objecttype_id='%d' AND %s AND %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_OBJECTS] ,idi->dbinfo.instance_id ,object_type ,buf1 ,buf2 )==-1) buf=NULL; if((result=ndo2db_db_query(idi,buf))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.mysql_result=mysql_store_result(&idi->dbinfo.mysql_conn); if((idi->dbinfo.mysql_row=mysql_fetch_row(idi->dbinfo.mysql_result))!=NULL){ ndo2db_convert_string_to_unsignedlong(idi->dbinfo.mysql_row[0],object_id); found_object=NDO_TRUE; } mysql_free_result(idi->dbinfo.mysql_result); idi->dbinfo.mysql_result=NULL; #endif break; default: break; } } free(buf); /* free memory */ free(buf1); free(buf2); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); if(found_object==NDO_FALSE) result=NDO_ERROR; return result; } int ndo2db_get_object_id_with_insert(ndo2db_idi *idi, int object_type, char *n1, char *n2, unsigned long *object_id){ int x = 0; int result=NDO_OK; char *buf=NULL; char *buf1=NULL; char *buf2=NULL; char *name1=NULL; char *name2=NULL; char *es[2]; /* make sure empty strings are set to null */ name1=n1; name2=n2; if(name1 && !strcmp(name1,"")) name1=NULL; if(name2 && !strcmp(name2,"")) name2=NULL; /* null names mean no object id */ if(name1==NULL && name2==NULL){ *object_id=0L; return NDO_OK; } /* object already exists */ if((result=ndo2db_get_object_id(idi,object_type,name1,name2,object_id))==NDO_OK) return NDO_OK; if(name1!=NULL){ es[0]=ndo2db_db_escape_string(idi,name1); if(asprintf(&buf1,", name1='%s'",es[0])==-1) buf1=NULL; } else es[0]=NULL; if(name2!=NULL){ es[1]=ndo2db_db_escape_string(idi,name2); if(asprintf(&buf2,", name2='%s'",es[1])==-1) buf2=NULL; } else es[1]=NULL; if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', objecttype_id='%d' %s %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_OBJECTS] ,idi->dbinfo.instance_id ,object_type ,(buf1==NULL)?"":buf1 ,(buf2==NULL)?"":buf2 )==-1) buf=NULL; if((result=ndo2db_db_query(idi,buf))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL *object_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); /* cache object id for later lookups */ ndo2db_add_cached_object_id(idi,object_type,name1,name2,*object_id); /* free memory */ free(buf1); free(buf2); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return result; } int ndo2db_get_cached_object_ids(ndo2db_idi *idi){ int result=NDO_OK; unsigned long object_id=0L; int objecttype_id=0; char *buf=NULL; /* find all the object definitions we already have */ if(asprintf(&buf,"SELECT object_id, objecttype_id, name1, name2 FROM %s WHERE instance_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_OBJECTS] ,idi->dbinfo.instance_id )==-1) buf=NULL; if((result=ndo2db_db_query(idi,buf))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.mysql_result=mysql_store_result(&idi->dbinfo.mysql_conn); while((idi->dbinfo.mysql_row=mysql_fetch_row(idi->dbinfo.mysql_result))!=NULL){ ndo2db_convert_string_to_unsignedlong(idi->dbinfo.mysql_row[0],&object_id); ndo2db_convert_string_to_int(idi->dbinfo.mysql_row[1],&objecttype_id); /* add object to cached list */ ndo2db_add_cached_object_id(idi,objecttype_id,idi->dbinfo.mysql_row[2],idi->dbinfo.mysql_row[3],object_id); } mysql_free_result(idi->dbinfo.mysql_result); idi->dbinfo.mysql_result=NULL; #endif break; default: break; } } free(buf); return result; } int ndo2db_get_cached_object_id(ndo2db_idi *idi, int object_type, char *name1, char *name2, unsigned long *object_id){ int result=NDO_ERROR; int hashslot=0; int compare=0; ndo2db_dbobject *temp_object=NULL; int y=0; hashslot=ndo2db_object_hashfunc(name1,name2,NDO2DB_OBJECT_HASHSLOTS); #ifdef NDO2DB_DEBUG_CACHING printf("OBJECT LOOKUP: type=%d, name1=%s, name2=%s\n",object_type,(name1==NULL)?"NULL":name1,(name2==NULL)?"NULL":name2); #endif if(idi->dbinfo.object_hashlist==NULL) return NDO_ERROR; for(temp_object=idi->dbinfo.object_hashlist[hashslot],y=0;temp_object!=NULL;temp_object=temp_object->nexthash,y++){ #ifdef NDO2DB_DEBUG_CACHING printf("OBJECT LOOKUP LOOPING [%d][%d]: type=%d, id=%lu, name1=%s, name2=%s\n",hashslot,y,temp_object->object_type,temp_object->object_id,(temp_object->name1==NULL)?"NULL":temp_object->name1,(temp_object->name2==NULL)?"NULL":temp_object->name2); #endif compare=ndo2db_compare_object_hashdata(temp_object->name1,temp_object->name2,name1,name2); if(compare==0 && temp_object->object_type==object_type) break; } /* we have a match! */ if(temp_object && (ndo2db_compare_object_hashdata(temp_object->name1,temp_object->name2,name1,name2)==0) && temp_object->object_type==object_type){ #ifdef NDO2DB_DEBUG_CACHING printf("OBJECT CACHE HIT [%d][%d]: type=%d, id=%lu, name1=%s, name2=%s\n",hashslot,y,object_type,temp_object->object_id,(name1==NULL)?"NULL":name1,(name2==NULL)?"NULL":name2); #endif *object_id=temp_object->object_id; result=NDO_OK; } #ifdef NDO2DB_DEBUG_CACHING else{ printf("OBJECT CACHE MISS: type=%d, name1=%s, name2=%s\n",object_type,(name1==NULL)?"NULL":name1,(name2==NULL)?"NULL":name2); } #endif return result; } int ndo2db_add_cached_object_id(ndo2db_idi *idi, int object_type, char *n1, char *n2, unsigned long object_id){ int result=NDO_OK; ndo2db_dbobject *temp_object=NULL; ndo2db_dbobject *lastpointer=NULL; ndo2db_dbobject *new_object=NULL; int x=0; int y=0; int hashslot=0; int compare=0; char *name1=NULL; char *name2=NULL; /* make sure empty strings are set to null */ name1=n1; name2=n2; if(name1 && !strcmp(name1,"")) name1=NULL; if(name2 && !strcmp(name2,"")) name2=NULL; /* null names mean no object id, so don't cache */ if(name1==NULL && name2==NULL){ return NDO_OK; } #ifdef NDO2DB_DEBUG_CACHING printf("OBJECT CACHE ADD: type=%d, id=%lu, name1=%s, name2=%s\n",object_type,object_id,(name1==NULL)?"NULL":name1,(name2==NULL)?"NULL":name2); #endif /* initialize hash list if necessary */ if(idi->dbinfo.object_hashlist==NULL){ idi->dbinfo.object_hashlist=(ndo2db_dbobject **)malloc(sizeof(ndo2db_dbobject *)*NDO2DB_OBJECT_HASHSLOTS); if(idi->dbinfo.object_hashlist==NULL) return NDO_ERROR; for(x=0;xdbinfo.object_hashlist[x]=NULL; } /* allocate and populate new object */ if((new_object=(ndo2db_dbobject *)malloc(sizeof(ndo2db_dbobject)))==NULL) return NDO_ERROR; new_object->object_type=object_type; new_object->object_id=object_id; new_object->name1=NULL; if(name1) new_object->name1=strdup(name1); new_object->name2=NULL; if(name2) new_object->name2=strdup(name2); hashslot=ndo2db_object_hashfunc(new_object->name1,new_object->name2,NDO2DB_OBJECT_HASHSLOTS); lastpointer=NULL; for(temp_object=idi->dbinfo.object_hashlist[hashslot],y=0;temp_object!=NULL;temp_object=temp_object->nexthash,y++){ compare=ndo2db_compare_object_hashdata(temp_object->name1,temp_object->name2,new_object->name1,new_object->name2); if(compare<0) break; lastpointer=temp_object; } if(lastpointer) lastpointer->nexthash=new_object; else idi->dbinfo.object_hashlist[hashslot]=new_object; new_object->nexthash=temp_object; return result; } int ndo2db_object_hashfunc(const char *name1,const char *name2,int hashslots){ unsigned int i,result; result=0; if(name1) for(i=0;idbinfo.object_hashlist){ for(x=0;xdbinfo.object_hashlist[x];temp_object!=NULL;temp_object=next_object){ next_object=temp_object->nexthash; free(temp_object->name1); free(temp_object->name2); free(temp_object); } } free(idi->dbinfo.object_hashlist); idi->dbinfo.object_hashlist=NULL; } return NDO_OK; } int ndo2db_set_all_objects_as_inactive(ndo2db_idi *idi){ int result=NDO_OK; char *buf=NULL; /* mark all objects as being inactive */ if(asprintf(&buf,"UPDATE %s SET is_active='0' WHERE instance_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_OBJECTS] ,idi->dbinfo.instance_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); return result; } int ndo2db_set_object_as_active(ndo2db_idi *idi, int object_type, unsigned long object_id){ int result=NDO_OK; char *buf=NULL; /* mark the object as being active */ if(asprintf(&buf,"UPDATE %s SET is_active='1' WHERE instance_id='%lu' AND objecttype_id='%d' AND object_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_OBJECTS] ,idi->dbinfo.instance_id ,object_type ,object_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); return result; } /****************************************************************************/ /* ARCHIVED LOG DATA HANDLER */ /****************************************************************************/ int ndo2db_handle_logentry(ndo2db_idi *idi){ char *ptr=NULL; char *buf=NULL; char *es[1]; time_t etime=0L; char *ts[1]; unsigned long type=0L; int result=NDO_OK; int duplicate_record=NDO_FALSE; int len=0; int x=0; if(idi==NULL) return NDO_ERROR; /* break log entry in pieces */ if((ptr=strtok(idi->buffered_input[NDO_DATA_LOGENTRY],"]"))==NULL) return NDO_ERROR; if((ndo2db_convert_string_to_unsignedlong(ptr+1,(unsigned long *)&etime))==NDO_ERROR) return NDO_ERROR; ts[0]=ndo2db_db_timet_to_sql(idi,etime); if((ptr=strtok(NULL,"\x0"))==NULL) return NDO_ERROR; es[0]=ndo2db_db_escape_string(idi,(ptr+1)); /* strip newline chars from end */ len=strlen(es[0]); for(x=len-1;x>=0;x--){ if(es[0][x]=='\n') es[0][x]='\x0'; else break; } /* what type of log entry is this? */ type=0; /* make sure we aren't importing a duplicate log entry... */ if(asprintf(&buf,"SELECT * FROM %s WHERE instance_id='%lu' AND logentry_time=%s AND logentry_data='%s'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_LOGENTRIES] ,idi->dbinfo.instance_id ,ts[0] ,es[0] )==-1) buf=NULL; if((result=ndo2db_db_query(idi,buf))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.mysql_result=mysql_store_result(&idi->dbinfo.mysql_conn); if((idi->dbinfo.mysql_row=mysql_fetch_row(idi->dbinfo.mysql_result))!=NULL) duplicate_record=NDO_TRUE; mysql_free_result(idi->dbinfo.mysql_result); idi->dbinfo.mysql_result=NULL; #endif break; default: break; } } free(buf); /*if(duplicate_record==NDO_TRUE && idi->last_logentry_time!=etime){*/ /*if(duplicate_record==NDO_TRUE && strcmp((es[0]==NULL)?"":es[0],idi->dbinfo.last_logentry_data)){*/ if(duplicate_record==NDO_TRUE){ #ifdef NDO2DB_DEBUG printf("IGNORING DUPLICATE LOG RECORD!\n"); #endif return NDO_OK; } /* save entry to db */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', logentry_time=%s, entry_time=%s, entry_time_usec='0', logentry_type='%lu', logentry_data='%s', realtime_data='0', inferred_data_extracted='0'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_LOGENTRIES] ,idi->dbinfo.instance_id ,ts[0] ,ts[0] ,type ,(es[0]==NULL)?"":es[0] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); /* record timestamp of last log entry */ idi->dbinfo.last_logentry_time=etime; /* save last log entry (for detecting duplicates) */ if(idi->dbinfo.last_logentry_data) free(idi->dbinfo.last_logentry_data); idi->dbinfo.last_logentry_data=strdup((es[0]==NULL)?"":es[0]); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); /* TODO - further processing of log entry to expand archived data... */ return result; } /****************************************************************************/ /* REALTIME DATA HANDLERS */ /****************************************************************************/ int ndo2db_handle_processdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long process_id; int result=NDO_OK; char *ts[1]; char *es[3]; int x=0; char *buf=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_PROCESSID],&process_id); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_PROGRAMNAME]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_PROGRAMVERSION]); es[2]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_PROGRAMDATE]); /* save entry to db */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', event_type='%d', event_time=%s, event_time_usec='%lu', process_id='%lu', program_name='%s', program_version='%s', program_date='%s'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_PROCESSEVENTS] ,idi->dbinfo.instance_id ,type ,ts[0] ,tstamp.tv_usec ,process_id ,es[0] ,es[1] ,es[2] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); /* MORE PROCESSING.... */ /* if process is starting up, clearstatus data, event queue, etc. */ if(type==NEBTYPE_PROCESS_PRELAUNCH && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ /* clear realtime data */ ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_PROGRAMSTATUS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTSTATUS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICESTATUS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTSTATUS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTQUEUE]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_COMMENTS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SCHEDULEDDOWNTIME]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_RUNTIMEVARIABLES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CUSTOMVARIABLESTATUS]); /* clear config data */ ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONFIGFILES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONFIGFILEVARIABLES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CUSTOMVARIABLES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_COMMANDS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEPERIODS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEPERIODTIMERANGES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTGROUPS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTGROUPMEMBERS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTGROUPS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTGROUPMEMBERS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEGROUPS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEGROUPMEMBERS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTESCALATIONS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTESCALATIONCONTACTS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEESCALATIONS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEESCALATIONCONTACTS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTDEPENDENCIES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEDEPENDENCIES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTADDRESSES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTNOTIFICATIONCOMMANDS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTPARENTHOSTS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTCONTACTS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICES]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICECONTACTS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICECONTACTGROUPS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTCONTACTGROUPS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTESCALATIONCONTACTGROUPS]); ndo2db_db_clear_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEESCALATIONCONTACTGROUPS]); /* flag all objects as being inactive */ ndo2db_set_all_objects_as_inactive(idi); #ifdef BAD_IDEA /* record a fake log entry to indicate that Nagios is starting - this normally occurs during the module's "blackout period" */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', logentry_time=%s, logentry_type='%lu', logentry_data='Nagios %s starting... (PID=%lu)'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_LOGENTRIES] ,idi->dbinfo.instance_id ,ts[0] ,NSLOG_PROCESS_INFO ,es[1] ,process_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); #endif } /* if process is shutting down or restarting, update process status data */ if((type==NEBTYPE_PROCESS_SHUTDOWN || type==NEBTYPE_PROCESS_RESTART) && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ if(asprintf(&buf,"UPDATE %s SET program_end_time=%s, is_currently_running='0' WHERE instance_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_PROGRAMSTATUS] ,ts[0] ,idi->dbinfo.instance_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_timedeventdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; int event_type=0; unsigned long run_time=0L; int recurring_event=0; unsigned long object_id=0L; int result=NDO_OK; char *ts[2]; int x=0; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EVENTTYPE],&event_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RECURRING],&recurring_event); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_RUNTIME],&run_time); /* skip sleep events.... */ if(type==NEBTYPE_TIMEDEVENT_SLEEP){ /* we could do some maintenance here if we wanted.... */ return NDO_OK; } ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,run_time); /* get the object id (if applicable) */ if(event_type==EVENT_SERVICE_CHECK || (event_type==EVENT_SCHEDULED_DOWNTIME && idi->buffered_input[NDO_DATA_SERVICE]!=NULL && strcmp(idi->buffered_input[NDO_DATA_SERVICE],""))) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); if(event_type==EVENT_HOST_CHECK || (event_type==EVENT_SCHEDULED_DOWNTIME && (idi->buffered_input[NDO_DATA_SERVICE]==NULL || !strcmp(idi->buffered_input[NDO_DATA_SERVICE],"")))) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* HISTORICAL TIMED EVENTS */ /* save a record of timed events that get added */ if(type==NEBTYPE_TIMEDEVENT_ADD){ /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', event_type='%d', queued_time=%s, queued_time_usec='%lu', scheduled_time=%s, recurring_event='%d', object_id='%lu'" ,idi->dbinfo.instance_id ,event_type ,ts[0] ,tstamp.tv_usec ,ts[1] ,recurring_event ,object_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save a record of timed events that get executed.... */ if(type==NEBTYPE_TIMEDEVENT_EXECUTE){ /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', event_type='%d', event_time=%s, event_time_usec='%lu', scheduled_time=%s, recurring_event='%d', object_id='%lu'" ,idi->dbinfo.instance_id ,event_type ,ts[0] ,tstamp.tv_usec ,ts[1] ,recurring_event ,object_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save a record of timed events that get removed.... */ if(type==NEBTYPE_TIMEDEVENT_REMOVE){ /* save entry to db */ if(asprintf(&buf,"UPDATE %s SET deletion_time=%s, deletion_time_usec='%lu' WHERE instance_id='%lu' AND event_type='%d' AND scheduled_time=%s AND recurring_event='%d' AND object_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTS] ,ts[0] ,tstamp.tv_usec ,idi->dbinfo.instance_id ,event_type ,ts[1] ,recurring_event ,object_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* CURRENT TIMED EVENTS */ /* remove (probably) expired events from the queue if client just connected */ if(idi->dbinfo.clean_event_queue==NDO_TRUE && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ idi->dbinfo.clean_event_queue=NDO_FALSE; /* clear old entries from db */ if(asprintf(&buf,"DELETE FROM %s WHERE instance_id='%lu' AND scheduled_time<=%s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTQUEUE] ,idi->dbinfo.instance_id ,ts[0] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* ADD QUEUED TIMED EVENTS */ if(type==NEBTYPE_TIMEDEVENT_ADD && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ /* save entry to db */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', event_type='%d', queued_time=%s, queued_time_usec='%lu', scheduled_time=%s, recurring_event='%d', object_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTQUEUE] ,idi->dbinfo.instance_id ,event_type ,ts[0] ,tstamp.tv_usec ,ts[1] ,recurring_event ,object_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* REMOVE QUEUED TIMED EVENTS */ if((type==NEBTYPE_TIMEDEVENT_REMOVE || type==NEBTYPE_TIMEDEVENT_EXECUTE) && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ /* clear entry from db */ if(asprintf(&buf,"DELETE FROM %s WHERE instance_id='%lu' AND event_type='%d' AND scheduled_time=%s AND recurring_event='%d' AND object_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTQUEUE] ,idi->dbinfo.instance_id ,event_type ,ts[1] ,recurring_event ,object_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); /* if we are executing a low-priority event, remove older events from the queue, as we know they've already been executed */ /* THIS IS A HACK! It shouldn't be necessary, but for some reason it is... Otherwise not all events are removed from the queue. :-( */ if(type==NEBTYPE_TIMEDEVENT_EXECUTE && (event_type==EVENT_SERVICE_CHECK || event_type==EVENT_HOST_CHECK)){ /* clear entries from db */ if(asprintf(&buf,"DELETE FROM %s WHERE instance_id='%lu' AND scheduled_time<%s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTQUEUE] ,idi->dbinfo.instance_id ,ts[1] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } } /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); return NDO_OK; } int ndo2db_handle_logdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; time_t etime=0L; unsigned long letype=0L; int result=NDO_OK; char *ts[2]; char *es[1]; char *buf=NULL; int len=0; int x=0; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert data */ result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LOGENTRYTYPE],&letype); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LOGENTRYTIME],(unsigned long *)&etime); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,etime); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_LOGENTRY]); /* strip newline chars from end */ len=strlen(es[0]); for(x=len-1;x>=0;x--){ if(es[0][x]=='\n') es[0][x]='\x0'; else break; } /* save entry to db */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', logentry_time=%s, entry_time=%s, entry_time_usec='%lu', logentry_type='%lu', logentry_data='%s', realtime_data='1', inferred_data_extracted='1'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_LOGENTRIES] ,idi->dbinfo.instance_id ,ts[1] ,ts[0] ,tstamp.tv_usec ,letype ,es[0] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_systemcommanddata(ndo2db_idi *idi){ int x = 0; int type,flags,attr; struct timeval tstamp; struct timeval start_time; struct timeval end_time; int timeout=0; int early_timeout=0; double execution_time=0.0; int return_code=0; char *ts[2]; char *es[3]; char *buf=NULL; char *buf1=NULL; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* covert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_TIMEOUT],&timeout); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EARLYTIMEOUT],&early_timeout); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RETURNCODE],&return_code); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_EXECUTIONTIME],&execution_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_STARTTIME],&start_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_ENDTIME],&end_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDLINE]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); es[2]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_LONGOUTPUT]); ts[0]=ndo2db_db_timet_to_sql(idi,start_time.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,end_time.tv_sec); /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', start_time=%s, start_time_usec='%lu', end_time=%s, end_time_usec='%lu', command_line='%s', timeout='%d', early_timeout='%d', execution_time='%lf', return_code='%d', output='%s', long_output='%s'" ,idi->dbinfo.instance_id ,ts[0] ,start_time.tv_usec ,ts[1] ,end_time.tv_usec ,es[0] ,timeout ,early_timeout ,execution_time ,return_code ,es[1] ,es[2] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SYSTEMCOMMANDS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_eventhandlerdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; char *ts[2]; char *es[4]; int x=0; int eventhandler_type=0; int state=0; int state_type=0; struct timeval start_time; struct timeval end_time; int timeout=0; int early_timeout=0; double execution_time=0.0; int return_code=0; unsigned long object_id=0L; unsigned long command_id=0L; char *buf=NULL; char *buf1=NULL; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* covert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EVENTHANDLERTYPE],&eventhandler_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATE],&state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATETYPE],&state_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_TIMEOUT],&timeout); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EARLYTIMEOUT],&early_timeout); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RETURNCODE],&return_code); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_EXECUTIONTIME],&execution_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_STARTTIME],&start_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_ENDTIME],&end_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDARGS]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDLINE]); es[2]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); es[3]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_LONGOUTPUT]); ts[0]=ndo2db_db_timet_to_sql(idi,start_time.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,end_time.tv_sec); /* get the object id */ if(eventhandler_type==SERVICE_EVENTHANDLER || eventhandler_type==GLOBAL_SERVICE_EVENTHANDLER) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); else result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* get the command id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,idi->buffered_input[NDO_DATA_COMMANDNAME],NULL,&command_id); /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', eventhandler_type='%d', object_id='%lu', state='%d', state_type='%d', start_time=%s, start_time_usec='%lu', end_time=%s, end_time_usec='%lu', command_object_id='%lu', command_args='%s', command_line='%s', timeout='%d', early_timeout='%d', execution_time='%lf', return_code='%d', output='%s', long_output='%s'" ,idi->dbinfo.instance_id ,eventhandler_type ,object_id ,state ,state_type ,ts[0] ,start_time.tv_usec ,ts[1] ,end_time.tv_usec ,command_id ,es[0] ,es[1] ,timeout ,early_timeout ,execution_time ,return_code ,es[2] ,es[3] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_EVENTHANDLERS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_notificationdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; int notification_type=0; int notification_reason=0; unsigned long object_id=0L; struct timeval start_time; struct timeval end_time; int state=0; int escalated=0; int contacts_notified=0; int result=NDO_OK; char *ts[2]; char *es[2]; int x=0; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFICATIONTYPE],¬ification_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFICATIONREASON],¬ification_reason); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATE],&state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ESCALATED],&escalated); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CONTACTSNOTIFIED],&contacts_notified); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_STARTTIME],&start_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_ENDTIME],&end_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); ts[0]=ndo2db_db_timet_to_sql(idi,start_time.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,end_time.tv_sec); /* get the object id */ if(notification_type==SERVICE_NOTIFICATION) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); if(notification_type==HOST_NOTIFICATION) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', notification_type='%d', notification_reason='%d', start_time=%s, start_time_usec='%lu', end_time=%s, end_time_usec='%lu', object_id='%lu', state='%d', output='%s', long_output='%s', escalated='%d', contacts_notified='%d'" ,idi->dbinfo.instance_id ,notification_type ,notification_reason ,ts[0] ,start_time.tv_usec ,ts[1] ,end_time.tv_usec ,object_id ,state ,es[0] ,es[1] ,escalated ,contacts_notified )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_NOTIFICATIONS] ,buf ,buf )==-1) buf1=NULL; /* run the query */ result=ndo2db_db_query(idi,buf1); /* save the notification id for later use... */ if(type==NEBTYPE_NOTIFICATION_START) idi->dbinfo.last_notification_id=0L; if(result==NDO_OK && type==NEBTYPE_NOTIFICATION_START){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.last_notification_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_contactnotificationdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long contact_id=0L; struct timeval start_time; struct timeval end_time; int result=NDO_OK; char *ts[2]; int x=0; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_STARTTIME],&start_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_ENDTIME],&end_time); ts[0]=ndo2db_db_timet_to_sql(idi,start_time.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,end_time.tv_sec); /* get the contact id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_CONTACT,idi->buffered_input[NDO_DATA_CONTACTNAME],NULL,&contact_id); /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', notification_id='%lu', start_time=%s, start_time_usec='%lu', end_time=%s, end_time_usec='%lu', contact_object_id='%lu'" ,idi->dbinfo.instance_id ,idi->dbinfo.last_notification_id ,ts[0] ,start_time.tv_usec ,ts[1] ,end_time.tv_usec ,contact_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTNOTIFICATIONS] ,buf ,buf )==-1) buf1=NULL; /* run the query */ result=ndo2db_db_query(idi,buf1); /* save the contact notification id for later use... */ if(type==NEBTYPE_CONTACTNOTIFICATION_START) idi->dbinfo.last_contact_notification_id=0L; if(result==NDO_OK && type==NEBTYPE_CONTACTNOTIFICATION_START){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL idi->dbinfo.last_contact_notification_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); return NDO_OK; } int ndo2db_handle_contactnotificationmethoddata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long command_id=0L; struct timeval start_time; struct timeval end_time; int result=NDO_OK; char *ts[2]; char *es[1]; int x=0; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_STARTTIME],&start_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_ENDTIME],&end_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDARGS]); ts[0]=ndo2db_db_timet_to_sql(idi,start_time.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,end_time.tv_sec); /* get the command id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,idi->buffered_input[NDO_DATA_COMMANDNAME],NULL,&command_id); /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', contactnotification_id='%lu', start_time=%s, start_time_usec='%lu', end_time=%s, end_time_usec='%lu', command_object_id='%lu', command_args='%s'" ,idi->dbinfo.instance_id ,idi->dbinfo.last_contact_notification_id ,ts[0] ,start_time.tv_usec ,ts[1] ,end_time.tv_usec ,command_id ,es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTNOTIFICATIONMETHODS] ,buf ,buf )==-1) buf1=NULL; /* run the query */ result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_servicecheckdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; char *ts[2]; char *es[5]; int check_type=0; struct timeval start_time; struct timeval end_time; int current_check_attempt=0; int max_check_attempts=0; int state=0; int state_type=0; int timeout=0; int early_timeout=0; double execution_time=0.0; double latency=0.0; int return_code=0; unsigned long object_id=0L; unsigned long command_id=0L; char *buf=NULL; char *buf1=NULL; int x=0; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* only process some types of service checks... */ if(type!=NEBTYPE_SERVICECHECK_INITIATE && type!=NEBTYPE_SERVICECHECK_PROCESSED) return NDO_OK; #ifdef BUILD_NAGIOS_3X /* skip precheck events - they aren't useful to us */ if(type==NEBTYPE_SERVICECHECK_ASYNC_PRECHECK) return NDO_OK; #endif /* covert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CHECKTYPE],&check_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTCHECKATTEMPT],¤t_check_attempt); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_MAXCHECKATTEMPTS],&max_check_attempts); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATE],&state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATETYPE],&state_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_TIMEOUT],&timeout); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EARLYTIMEOUT],&early_timeout); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RETURNCODE],&return_code); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_EXECUTIONTIME],&execution_time); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_LATENCY],&latency); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_STARTTIME],&start_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_ENDTIME],&end_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDARGS]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDLINE]); es[2]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); es[3]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_LONGOUTPUT]); es[4]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_PERFDATA]); ts[0]=ndo2db_db_timet_to_sql(idi,start_time.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,end_time.tv_sec); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); /* get the command id */ if(idi->buffered_input[NDO_DATA_COMMANDNAME]!=NULL && strcmp(idi->buffered_input[NDO_DATA_COMMANDNAME],"")) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,idi->buffered_input[NDO_DATA_COMMANDNAME],NULL,&command_id); else command_id=0L; /* save entry to db */ if(asprintf(&buf1,"instance_id='%lu', service_object_id='%lu', check_type='%d', current_check_attempt='%d', max_check_attempts='%d', state='%d', state_type='%d', start_time=%s, start_time_usec='%lu', end_time=%s, end_time_usec='%lu', timeout='%d', early_timeout='%d', execution_time='%lf', latency='%lf', return_code='%d', output='%s', long_output='%s', perfdata='%s'" ,idi->dbinfo.instance_id ,object_id ,check_type ,current_check_attempt ,max_check_attempts ,state ,state_type ,ts[0] ,start_time.tv_usec ,ts[1] ,end_time.tv_usec ,timeout ,early_timeout ,execution_time ,latency ,return_code ,es[2] ,es[3] ,es[4] )==-1) buf1=NULL; if(asprintf(&buf,"INSERT INTO %s SET %s, command_object_id='%lu', command_args='%s', command_line='%s' ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICECHECKS] ,buf1 ,command_id ,es[0] ,es[1] ,buf1 )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_hostcheckdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; char *ts[2]; char *es[5]; int check_type=0; int is_raw_check=0; struct timeval start_time; struct timeval end_time; int current_check_attempt=0; int max_check_attempts=0; int state=0; int state_type=0; int timeout=0; int early_timeout=0; double execution_time=0.0; double latency=0.0; int return_code=0; unsigned long object_id=0L; unsigned long command_id=0L; char *buf=NULL; char *buf1=NULL; int x=0; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* only process finished host checks... */ /* if(type!=NEBTYPE_HOSTCHECK_PROCESSED) return NDO_OK; */ #ifdef BUILD_NAGIOS_3X /* skip precheck events - they aren't useful to us */ if(type==NEBTYPE_HOSTCHECK_ASYNC_PRECHECK || type==NEBTYPE_HOSTCHECK_SYNC_PRECHECK) return NDO_OK; #endif /* covert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CHECKTYPE],&check_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTCHECKATTEMPT],¤t_check_attempt); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_MAXCHECKATTEMPTS],&max_check_attempts); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATE],&state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATETYPE],&state_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_TIMEOUT],&timeout); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EARLYTIMEOUT],&early_timeout); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RETURNCODE],&return_code); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_EXECUTIONTIME],&execution_time); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_LATENCY],&latency); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_STARTTIME],&start_time); result=ndo2db_convert_string_to_timeval(idi->buffered_input[NDO_DATA_ENDTIME],&end_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDARGS]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDLINE]); es[2]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); es[3]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_LONGOUTPUT]); es[4]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_PERFDATA]); ts[0]=ndo2db_db_timet_to_sql(idi,start_time.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,end_time.tv_sec); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* get the command id */ if(idi->buffered_input[NDO_DATA_COMMANDNAME]!=NULL && strcmp(idi->buffered_input[NDO_DATA_COMMANDNAME],"")) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,idi->buffered_input[NDO_DATA_COMMANDNAME],NULL,&command_id); else command_id=0L; /* is this a raw check? */ if(type==NEBTYPE_HOSTCHECK_RAW_START || type==NEBTYPE_HOSTCHECK_RAW_END) is_raw_check=1; else is_raw_check=0; /* save entry to db */ if(asprintf(&buf1,"instance_id='%lu', host_object_id='%lu', check_type='%d', is_raw_check='%d', current_check_attempt='%d', max_check_attempts='%d', state='%d', state_type='%d', start_time=%s, start_time_usec='%lu', end_time=%s, end_time_usec='%lu', timeout='%d', early_timeout='%d', execution_time='%lf', latency='%lf', return_code='%d', output='%s', long_output='%s', perfdata='%s'" ,idi->dbinfo.instance_id ,object_id ,check_type ,is_raw_check ,current_check_attempt ,max_check_attempts ,state ,state_type ,ts[0] ,start_time.tv_usec ,ts[1] ,end_time.tv_usec ,timeout ,early_timeout ,execution_time ,latency ,return_code ,es[2] ,es[3] ,es[4] )==-1) buf1=NULL; if(asprintf(&buf,"INSERT INTO %s SET %s, command_object_id='%lu', command_args='%s', command_line='%s' ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTCHECKS] ,buf1 ,command_id ,es[0] ,es[1] ,buf1 )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_commentdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; int comment_type=0; int entry_type=0; unsigned long object_id=0L; unsigned long comment_time=0L; unsigned long internal_comment_id=0L; int is_persistent=0; int comment_source=0; int expires=0; unsigned long expire_time=0L; int result=NDO_OK; char *ts[3]; char *es[2]; int x=0; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_COMMENTTYPE],&comment_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ENTRYTYPE],&entry_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PERSISTENT],&is_persistent); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SOURCE],&comment_source); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EXPIRES],&expires); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_COMMENTID],&internal_comment_id); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_ENTRYTIME],&comment_time); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_EXPIRATIONTIME],&expire_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_AUTHORNAME]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMENT]); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,comment_time); ts[2]=ndo2db_db_timet_to_sql(idi,expire_time); /* get the object id */ if(comment_type==SERVICE_COMMENT) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); if(comment_type==HOST_COMMENT) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* ADD HISTORICAL COMMENTS */ /* save a record of comments that get added (or get loaded and weren't previously recorded).... */ if(type==NEBTYPE_COMMENT_ADD || type==NEBTYPE_COMMENT_LOAD){ /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', comment_type='%d', entry_type='%d', object_id='%lu', comment_time=%s, internal_comment_id='%lu', author_name='%s', comment_data='%s', is_persistent='%d', comment_source='%d', expires='%d', expiration_time=%s" ,idi->dbinfo.instance_id ,comment_type ,entry_type ,object_id ,ts[1] ,internal_comment_id ,es[0] ,es[1] ,is_persistent ,comment_source ,expires ,ts[2] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s, entry_time=%s, entry_time_usec='%lu' ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_COMMENTHISTORY] ,buf ,ts[0] ,tstamp.tv_usec ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* UPDATE HISTORICAL COMMENTS */ /* mark records that have been deleted */ if(type==NEBTYPE_COMMENT_DELETE){ /* update db entry */ if(asprintf(&buf,"UPDATE %s SET deletion_time=%s, deletion_time_usec='%lu' WHERE instance_id='%lu' AND comment_time=%s AND internal_comment_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_COMMENTHISTORY] ,ts[0] ,tstamp.tv_usec ,idi->dbinfo.instance_id ,ts[1] ,internal_comment_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* ADD CURRENT COMMENTS */ if((type==NEBTYPE_COMMENT_ADD || type==NEBTYPE_COMMENT_LOAD) && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', comment_type='%d', entry_type='%d', object_id='%lu', comment_time=%s, internal_comment_id='%lu', author_name='%s', comment_data='%s', is_persistent='%d', comment_source='%d', expires='%d', expiration_time=%s" ,idi->dbinfo.instance_id ,comment_type ,entry_type ,object_id ,ts[1] ,internal_comment_id ,es[0] ,es[1] ,is_persistent ,comment_source ,expires ,ts[2] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s, entry_time=%s, entry_time_usec='%lu' ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_COMMENTS] ,buf ,ts[0] ,tstamp.tv_usec ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* REMOVE CURRENT COMMENTS */ if(type==NEBTYPE_COMMENT_DELETE && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ /* clear entry from db */ if(asprintf(&buf,"DELETE FROM %s WHERE instance_id='%lu' AND comment_time=%s AND internal_comment_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_COMMENTS] ,idi->dbinfo.instance_id ,ts[1] ,internal_comment_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_downtimedata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; int downtime_type=0; int fixed=0; unsigned long duration=0L; unsigned long internal_downtime_id=0L; unsigned long triggered_by=0L; unsigned long entry_time=0L; unsigned long start_time=0L; unsigned long end_time=0L; unsigned long object_id=0L; int result=NDO_OK; char *ts[4]; char *es[2]; int x=0; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_DOWNTIMETYPE],&downtime_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FIXED],&fixed); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_DURATION],&duration); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_DOWNTIMEID],&internal_downtime_id); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_TRIGGEREDBY],&triggered_by); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_ENTRYTIME],&entry_time); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_STARTTIME],&start_time); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_ENDTIME],&end_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_AUTHORNAME]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMENT]); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,entry_time); ts[2]=ndo2db_db_timet_to_sql(idi,start_time); ts[3]=ndo2db_db_timet_to_sql(idi,end_time); /* get the object id */ if(downtime_type==SERVICE_DOWNTIME) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); if(downtime_type==HOST_DOWNTIME) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* HISTORICAL DOWNTIME */ /* save a record of scheduled downtime that gets added (or gets loaded and wasn't previously recorded).... */ if(type==NEBTYPE_DOWNTIME_ADD || type==NEBTYPE_DOWNTIME_LOAD){ /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', downtime_type='%d', object_id='%lu', entry_time=%s, author_name='%s', comment_data='%s', internal_downtime_id='%lu', triggered_by_id='%lu', is_fixed='%d', duration='%lu', scheduled_start_time=%s, scheduled_end_time=%s" ,idi->dbinfo.instance_id ,downtime_type ,object_id ,ts[1] ,es[0] ,es[1] ,internal_downtime_id ,triggered_by ,fixed ,duration ,ts[2] ,ts[3] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_DOWNTIMEHISTORY] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save a record of scheduled downtime that starts */ if(type==NEBTYPE_DOWNTIME_START){ /* save entry to db */ if(asprintf(&buf,"UPDATE %s SET actual_start_time=%s, actual_start_time_usec='%lu', was_started='%d' WHERE instance_id='%lu' AND downtime_type='%d' AND object_id='%lu' AND entry_time=%s AND scheduled_start_time=%s AND scheduled_end_time=%s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_DOWNTIMEHISTORY] ,ts[0] ,tstamp.tv_usec ,1 ,idi->dbinfo.instance_id ,downtime_type ,object_id ,ts[1] ,ts[2] ,ts[3] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* save a record of scheduled downtime that ends */ if(type==NEBTYPE_DOWNTIME_STOP){ /* save entry to db */ if(asprintf(&buf,"UPDATE %s SET actual_end_time=%s, actual_end_time_usec='%lu', was_cancelled='%d' WHERE instance_id='%lu' AND downtime_type='%d' AND object_id='%lu' AND entry_time=%s AND scheduled_start_time=%s AND scheduled_end_time=%s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_DOWNTIMEHISTORY] ,ts[0] ,tstamp.tv_usec ,(attr==NEBATTR_DOWNTIME_STOP_CANCELLED)?1:0 ,idi->dbinfo.instance_id ,downtime_type ,object_id ,ts[1] ,ts[2] ,ts[3] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* CURRENT DOWNTIME */ /* save a record of scheduled downtime that gets added (or gets loaded and wasn't previously recorded).... */ if((type==NEBTYPE_DOWNTIME_ADD || type==NEBTYPE_DOWNTIME_LOAD) && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', downtime_type='%d', object_id='%lu', entry_time=%s, author_name='%s', comment_data='%s', internal_downtime_id='%lu', triggered_by_id='%lu', is_fixed='%d', duration='%lu', scheduled_start_time=%s, scheduled_end_time=%s" ,idi->dbinfo.instance_id ,downtime_type ,object_id ,ts[1] ,es[0] ,es[1] ,internal_downtime_id ,triggered_by ,fixed ,duration ,ts[2] ,ts[3] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SCHEDULEDDOWNTIME] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save a record of scheduled downtime that starts */ if(type==NEBTYPE_DOWNTIME_START && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ /* save entry to db */ if(asprintf(&buf,"UPDATE %s SET actual_start_time=%s, actual_start_time_usec='%lu', was_started='%d' WHERE instance_id='%lu' AND downtime_type='%d' AND object_id='%lu' AND entry_time=%s AND scheduled_start_time=%s AND scheduled_end_time=%s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SCHEDULEDDOWNTIME] ,ts[0] ,tstamp.tv_usec ,1 ,idi->dbinfo.instance_id ,downtime_type ,object_id ,ts[1] ,ts[2] ,ts[3] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* remove completed or deleted downtime */ if((type==NEBTYPE_DOWNTIME_STOP || type==NEBTYPE_DOWNTIME_DELETE) && tstamp.tv_sec>=idi->dbinfo.latest_realtime_data_time){ /* save entry to db */ if(asprintf(&buf,"DELETE FROM %s WHERE instance_id='%lu' AND downtime_type='%d' AND object_id='%lu' AND entry_time=%s AND scheduled_start_time=%s AND scheduled_end_time=%s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SCHEDULEDDOWNTIME] ,idi->dbinfo.instance_id ,downtime_type ,object_id ,ts[1] ,ts[2] ,ts[3] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); } /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_flappingdata(ndo2db_idi *idi){ int x = 0; int type,flags,attr; struct timeval tstamp; int flapping_type=0; unsigned long object_id=0L; double percent_state_change=0.0; double low_threshold=0.0; double high_threshold=0.0; unsigned long comment_time=0L; unsigned long internal_comment_id=0L; int result=NDO_OK; char *ts[2]; char *buf=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPPINGTYPE],&flapping_type); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_PERCENTSTATECHANGE],&percent_state_change); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_LOWTHRESHOLD],&low_threshold); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_HIGHTHRESHOLD],&high_threshold); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_COMMENTTIME],&comment_time); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_COMMENTID],&internal_comment_id); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,comment_time); /* get the object id (if applicable) */ if(flapping_type==SERVICE_FLAPPING) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); if(flapping_type==HOST_FLAPPING) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* save entry to db */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', event_time=%s, event_time_usec='%lu', event_type='%d', reason_type='%d', flapping_type='%d', object_id='%lu', percent_state_change='%lf', low_threshold='%lf', high_threshold='%lf', comment_time=%s, internal_comment_id='%lu'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_FLAPPINGHISTORY] ,idi->dbinfo.instance_id ,ts[0] ,tstamp.tv_usec ,type ,attr ,flapping_type ,object_id ,percent_state_change ,low_threshold ,high_threshold ,ts[1] ,internal_comment_id )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); return NDO_OK; } int ndo2db_handle_programstatusdata(ndo2db_idi *idi){ int x = 0; int type,flags,attr; struct timeval tstamp; unsigned long program_start_time=0L; unsigned long process_id=0L; int daemon_mode=0; unsigned long last_command_check=0L; unsigned long last_log_rotation=0L; int notifications_enabled=0; int active_service_checks_enabled=0; int passive_service_checks_enabled=0; int active_host_checks_enabled=0; int passive_host_checks_enabled=0; int event_handlers_enabled=0; int flap_detection_enabled=0; int failure_prediction_enabled=0; int process_performance_data=0; int obsess_over_hosts=0; int obsess_over_services=0; unsigned long modified_host_attributes=0L; unsigned long modified_service_attributes=0L; char *ts[4]; char *es[2]; char *buf=NULL; char *buf1=NULL; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_sec < idi->dbinfo.latest_realtime_data_time) return NDO_OK; /* covert vars */ result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_PROGRAMSTARTTIME],&program_start_time); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_PROCESSID],&process_id); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_DAEMONMODE],&daemon_mode); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTCOMMANDCHECK],&last_command_check); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTLOGROTATION],&last_log_rotation); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFICATIONSENABLED],¬ifications_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACTIVESERVICECHECKSENABLED],&active_service_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PASSIVESERVICECHECKSENABLED],&passive_service_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACTIVEHOSTCHECKSENABLED],&active_host_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PASSIVEHOSTCHECKSENABLED],&passive_host_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EVENTHANDLERSENABLED],&event_handlers_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONENABLED],&flap_detection_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILUREPREDICTIONENABLED],&failure_prediction_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PROCESSPERFORMANCEDATA],&process_performance_data); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_OBSESSOVERHOSTS],&obsess_over_hosts); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_OBSESSOVERSERVICES],&obsess_over_services); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_MODIFIEDHOSTATTRIBUTES],&modified_host_attributes); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_MODIFIEDSERVICEATTRIBUTES],&modified_service_attributes); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_GLOBALHOSTEVENTHANDLER]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_GLOBALSERVICEEVENTHANDLER]); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,program_start_time); ts[2]=ndo2db_db_timet_to_sql(idi,last_command_check); ts[3]=ndo2db_db_timet_to_sql(idi,last_log_rotation); /* generate query string */ if(asprintf(&buf1,"instance_id='%lu', status_update_time=%s, program_start_time=%s, is_currently_running='1', process_id='%lu', daemon_mode='%d', last_command_check=%s, last_log_rotation=%s, notifications_enabled='%d', active_service_checks_enabled='%d', passive_service_checks_enabled='%d', active_host_checks_enabled='%d', passive_host_checks_enabled='%d', event_handlers_enabled='%d', flap_detection_enabled='%d', failure_prediction_enabled='%d', process_performance_data='%d', obsess_over_hosts='%d', obsess_over_services='%d', modified_host_attributes='%lu', modified_service_attributes='%lu', global_host_event_handler='%s', global_service_event_handler='%s'" ,idi->dbinfo.instance_id ,ts[0] ,ts[1] ,process_id ,daemon_mode ,ts[2] ,ts[3] ,notifications_enabled ,active_service_checks_enabled ,passive_service_checks_enabled ,active_host_checks_enabled ,passive_host_checks_enabled ,event_handlers_enabled ,flap_detection_enabled ,failure_prediction_enabled ,process_performance_data ,obsess_over_hosts ,obsess_over_services ,modified_host_attributes ,modified_service_attributes ,es[0] ,es[1] )==-1) buf1=NULL; if(asprintf(&buf,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_PROGRAMSTATUS] ,buf1 ,buf1 )==-1) buf=NULL; /* save entry to db */ result=ndo2db_db_query(idi,buf); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_hoststatusdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long last_check=0L; unsigned long next_check=0L; unsigned long last_state_change=0L; unsigned long last_hard_state_change=0L; unsigned long last_time_up=0L; unsigned long last_time_down=0L; unsigned long last_time_unreachable=0L; unsigned long last_notification=0L; unsigned long next_notification=0L; unsigned long modified_host_attributes=0L; double percent_state_change=0.0; double latency=0.0; double execution_time=0.0; int current_state=0; int has_been_checked=0; int should_be_scheduled=0; int current_check_attempt=0; int max_check_attempts=0; int check_type=0; int last_hard_state=0; int state_type=0; int no_more_notifications=0; int notifications_enabled=0; int problem_has_been_acknowledged=0; int acknowledgement_type=0; int current_notification_number=0; int passive_checks_enabled=0; int active_checks_enabled=0; int event_handler_enabled; int flap_detection_enabled=0; int is_flapping=0; int scheduled_downtime_depth=0; int failure_prediction_enabled=0; int process_performance_data; int obsess_over_host=0; double normal_check_interval=0.0; double retry_check_interval=0.0; char *ts[10]; char *es[5]; char *buf=NULL; char *buf1=NULL; unsigned long object_id=0L; unsigned long check_timeperiod_object_id=0L; int x=0; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_sec < idi->dbinfo.latest_realtime_data_time) return NDO_OK; /* covert vars */ result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTHOSTCHECK],&last_check); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_NEXTHOSTCHECK],&next_check); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTSTATECHANGE],&last_state_change); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTHARDSTATECHANGE],&last_hard_state_change); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTTIMEUP],&last_time_up); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTTIMEDOWN],&last_time_down); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTTIMEUNREACHABLE],&last_time_unreachable); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTHOSTNOTIFICATION],&last_notification); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_NEXTHOSTNOTIFICATION],&next_notification); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_MODIFIEDHOSTATTRIBUTES],&modified_host_attributes); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_PERCENTSTATECHANGE],&percent_state_change); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_LATENCY],&latency); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_EXECUTIONTIME],&execution_time); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTSTATE],¤t_state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HASBEENCHECKED],&has_been_checked); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SHOULDBESCHEDULED],&should_be_scheduled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTCHECKATTEMPT],¤t_check_attempt); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_MAXCHECKATTEMPTS],&max_check_attempts); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CHECKTYPE],&check_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_LASTHARDSTATE],&last_hard_state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATETYPE],&state_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOMORENOTIFICATIONS],&no_more_notifications); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFICATIONSENABLED],¬ifications_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PROBLEMHASBEENACKNOWLEDGED],&problem_has_been_acknowledged); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACKNOWLEDGEMENTTYPE],&acknowledgement_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTNOTIFICATIONNUMBER],¤t_notification_number); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PASSIVEHOSTCHECKSENABLED],&passive_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACTIVEHOSTCHECKSENABLED],&active_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EVENTHANDLERENABLED],&event_handler_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONENABLED],&flap_detection_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ISFLAPPING],&is_flapping); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SCHEDULEDDOWNTIMEDEPTH],&scheduled_downtime_depth); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILUREPREDICTIONENABLED],&failure_prediction_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PROCESSPERFORMANCEDATA],&process_performance_data); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_OBSESSOVERHOST],&obsess_over_host); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_NORMALCHECKINTERVAL],&normal_check_interval); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_RETRYCHECKINTERVAL],&retry_check_interval); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_LONGOUTPUT]); es[2]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_PERFDATA]); es[3]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_EVENTHANDLER]); es[4]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_CHECKCOMMAND]); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,last_check); ts[2]=ndo2db_db_timet_to_sql(idi,next_check); ts[3]=ndo2db_db_timet_to_sql(idi,last_state_change); ts[4]=ndo2db_db_timet_to_sql(idi,last_hard_state_change); ts[5]=ndo2db_db_timet_to_sql(idi,last_time_up); ts[6]=ndo2db_db_timet_to_sql(idi,last_time_down); ts[7]=ndo2db_db_timet_to_sql(idi,last_time_unreachable); ts[8]=ndo2db_db_timet_to_sql(idi,last_notification); ts[9]=ndo2db_db_timet_to_sql(idi,next_notification); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_HOSTCHECKPERIOD],NULL,&check_timeperiod_object_id); /* generate query string */ if(asprintf(&buf1,"instance_id='%lu', host_object_id='%lu', status_update_time=%s, output='%s', long_output='%s', perfdata='%s', current_state='%d', has_been_checked='%d', should_be_scheduled='%d', current_check_attempt='%d', max_check_attempts='%d', last_check=%s, next_check=%s, check_type='%d', last_state_change=%s, last_hard_state_change=%s, last_hard_state='%d', last_time_up=%s, last_time_down=%s, last_time_unreachable=%s, state_type='%d', last_notification=%s, next_notification=%s, no_more_notifications='%d', notifications_enabled='%d', problem_has_been_acknowledged='%d', acknowledgement_type='%d', current_notification_number='%d', passive_checks_enabled='%d', active_checks_enabled='%d', event_handler_enabled='%d', flap_detection_enabled='%d', is_flapping='%d', percent_state_change='%lf', latency='%lf', execution_time='%lf', scheduled_downtime_depth='%d', failure_prediction_enabled='%d', process_performance_data='%d', obsess_over_host='%d', modified_host_attributes='%lu', event_handler='%s', check_command='%s', normal_check_interval='%lf', retry_check_interval='%lf', check_timeperiod_object_id='%lu'" ,idi->dbinfo.instance_id ,object_id ,ts[0] ,es[0] ,es[1] ,es[2] ,current_state ,has_been_checked ,should_be_scheduled ,current_check_attempt ,max_check_attempts ,ts[1] ,ts[2] ,check_type ,ts[3] ,ts[4] ,last_hard_state ,ts[5] ,ts[6] ,ts[7] ,state_type ,ts[8] ,ts[9] ,no_more_notifications ,notifications_enabled ,problem_has_been_acknowledged ,acknowledgement_type ,current_notification_number ,passive_checks_enabled ,active_checks_enabled ,event_handler_enabled ,flap_detection_enabled ,is_flapping ,percent_state_change ,latency ,execution_time ,scheduled_downtime_depth ,failure_prediction_enabled ,process_performance_data ,obsess_over_host ,modified_host_attributes ,es[3] ,es[4] ,normal_check_interval ,retry_check_interval ,check_timeperiod_object_id )==-1) buf1=NULL; if(asprintf(&buf,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTSTATUS] ,buf1 ,buf1 )==-1) buf=NULL; /* save entry to db */ result=ndo2db_db_query(idi,buf); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); /* save custom variables to db */ result=ndo2db_save_custom_variables(idi,NDO2DB_DBTABLE_CUSTOMVARIABLESTATUS,object_id,ts[0]); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); return NDO_OK; } int ndo2db_handle_servicestatusdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long last_check=0L; unsigned long next_check=0L; unsigned long last_state_change=0L; unsigned long last_hard_state_change=0L; unsigned long last_time_ok=0L; unsigned long last_time_warning=0L; unsigned long last_time_unknown=0L; unsigned long last_time_critical=0L; unsigned long last_notification=0L; unsigned long next_notification=0L; unsigned long modified_service_attributes=0L; double percent_state_change=0.0; double latency=0.0; double execution_time=0.0; int current_state=0; int has_been_checked=0; int should_be_scheduled=0; int current_check_attempt=0; int max_check_attempts=0; int check_type=0; int last_hard_state=0; int state_type=0; int no_more_notifications=0; int notifications_enabled=0; int problem_has_been_acknowledged=0; int acknowledgement_type=0; int current_notification_number=0; int passive_checks_enabled=0; int active_checks_enabled=0; int event_handler_enabled; int flap_detection_enabled=0; int is_flapping=0; int scheduled_downtime_depth=0; int failure_prediction_enabled=0; int process_performance_data; int obsess_over_service=0; double normal_check_interval=0.0; double retry_check_interval=0.0; char *ts[11]; char *es[5]; char *buf=NULL; char *buf1=NULL; unsigned long object_id=0L; unsigned long check_timeperiod_object_id=0L; int x=0; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_sec < idi->dbinfo.latest_realtime_data_time) return NDO_OK; /* covert vars */ result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTSERVICECHECK],&last_check); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_NEXTSERVICECHECK],&next_check); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTSTATECHANGE],&last_state_change); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTHARDSTATECHANGE],&last_hard_state_change); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTTIMEOK],&last_time_ok); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTTIMEWARNING],&last_time_warning); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTTIMEUNKNOWN],&last_time_unknown); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTTIMECRITICAL],&last_time_critical); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTSERVICENOTIFICATION],&last_notification); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_NEXTSERVICENOTIFICATION],&next_notification); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_MODIFIEDSERVICEATTRIBUTES],&modified_service_attributes); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_PERCENTSTATECHANGE],&percent_state_change); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_LATENCY],&latency); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_EXECUTIONTIME],&execution_time); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTSTATE],¤t_state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HASBEENCHECKED],&has_been_checked); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SHOULDBESCHEDULED],&should_be_scheduled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTCHECKATTEMPT],¤t_check_attempt); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_MAXCHECKATTEMPTS],&max_check_attempts); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CHECKTYPE],&check_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_LASTHARDSTATE],&last_hard_state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATETYPE],&state_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOMORENOTIFICATIONS],&no_more_notifications); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFICATIONSENABLED],¬ifications_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PROBLEMHASBEENACKNOWLEDGED],&problem_has_been_acknowledged); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACKNOWLEDGEMENTTYPE],&acknowledgement_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTNOTIFICATIONNUMBER],¤t_notification_number); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PASSIVESERVICECHECKSENABLED],&passive_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACTIVESERVICECHECKSENABLED],&active_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_EVENTHANDLERENABLED],&event_handler_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONENABLED],&flap_detection_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ISFLAPPING],&is_flapping); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SCHEDULEDDOWNTIMEDEPTH],&scheduled_downtime_depth); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILUREPREDICTIONENABLED],&failure_prediction_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PROCESSPERFORMANCEDATA],&process_performance_data); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_OBSESSOVERSERVICE],&obsess_over_service); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_NORMALCHECKINTERVAL],&normal_check_interval); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_RETRYCHECKINTERVAL],&retry_check_interval); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_LONGOUTPUT]); es[2]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_PERFDATA]); es[3]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_EVENTHANDLER]); es[4]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_CHECKCOMMAND]); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,last_check); ts[2]=ndo2db_db_timet_to_sql(idi,next_check); ts[3]=ndo2db_db_timet_to_sql(idi,last_state_change); ts[4]=ndo2db_db_timet_to_sql(idi,last_hard_state_change); ts[5]=ndo2db_db_timet_to_sql(idi,last_time_ok); ts[6]=ndo2db_db_timet_to_sql(idi,last_time_warning); ts[7]=ndo2db_db_timet_to_sql(idi,last_time_unknown); ts[8]=ndo2db_db_timet_to_sql(idi,last_time_critical); ts[9]=ndo2db_db_timet_to_sql(idi,last_notification); ts[10]=ndo2db_db_timet_to_sql(idi,next_notification); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_SERVICECHECKPERIOD],NULL,&check_timeperiod_object_id); /* generate query string */ if(asprintf(&buf1,"instance_id='%lu', service_object_id='%lu', status_update_time=%s, output='%s', long_output='%s', perfdata='%s', current_state='%d', has_been_checked='%d', should_be_scheduled='%d', current_check_attempt='%d', max_check_attempts='%d', last_check=%s, next_check=%s, check_type='%d', last_state_change=%s, last_hard_state_change=%s, last_hard_state='%d', last_time_ok=%s, last_time_warning=%s, last_time_unknown=%s, last_time_critical=%s, state_type='%d', last_notification=%s, next_notification=%s, no_more_notifications='%d', notifications_enabled='%d', problem_has_been_acknowledged='%d', acknowledgement_type='%d', current_notification_number='%d', passive_checks_enabled='%d', active_checks_enabled='%d', event_handler_enabled='%d', flap_detection_enabled='%d', is_flapping='%d', percent_state_change='%lf', latency='%lf', execution_time='%lf', scheduled_downtime_depth='%d', failure_prediction_enabled='%d', process_performance_data='%d', obsess_over_service='%d', modified_service_attributes='%lu', event_handler='%s', check_command='%s', normal_check_interval='%lf', retry_check_interval='%lf', check_timeperiod_object_id='%lu'" ,idi->dbinfo.instance_id ,object_id ,ts[0] ,es[0] ,es[1] ,es[2] ,current_state ,has_been_checked ,should_be_scheduled ,current_check_attempt ,max_check_attempts ,ts[1] ,ts[2] ,check_type ,ts[3] ,ts[4] ,last_hard_state ,ts[5] ,ts[6] ,ts[7] ,ts[8] ,state_type ,ts[9] ,ts[10] ,no_more_notifications ,notifications_enabled ,problem_has_been_acknowledged ,acknowledgement_type ,current_notification_number ,passive_checks_enabled ,active_checks_enabled ,event_handler_enabled ,flap_detection_enabled ,is_flapping ,percent_state_change ,latency ,execution_time ,scheduled_downtime_depth ,failure_prediction_enabled ,process_performance_data ,obsess_over_service ,modified_service_attributes ,es[3] ,es[4] ,normal_check_interval ,retry_check_interval ,check_timeperiod_object_id )==-1) buf1=NULL; if(asprintf(&buf,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICESTATUS] ,buf1 ,buf1 )==-1) buf=NULL; /* save entry to db */ result=ndo2db_db_query(idi,buf); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); /* save custom variables to db */ result=ndo2db_save_custom_variables(idi,NDO2DB_DBTABLE_CUSTOMVARIABLESTATUS,object_id,ts[0]); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); return NDO_OK; } int ndo2db_handle_contactstatusdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long last_host_notification=0L; unsigned long last_service_notification=0L; unsigned long modified_attributes=0L; unsigned long modified_host_attributes=0L; unsigned long modified_service_attributes=0L; int host_notifications_enabled=0; int service_notifications_enabled=0; char *ts[3]; char *buf=NULL; char *buf1=NULL; unsigned long object_id=0L; int x=0; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_sec < idi->dbinfo.latest_realtime_data_time) return NDO_OK; /* covert vars */ result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTHOSTNOTIFICATION],&last_host_notification); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_LASTSERVICENOTIFICATION],&last_service_notification); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_MODIFIEDCONTACTATTRIBUTES],&modified_attributes); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_MODIFIEDHOSTATTRIBUTES],&modified_host_attributes); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_MODIFIEDSERVICEATTRIBUTES],&modified_service_attributes); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTNOTIFICATIONSENABLED],&host_notifications_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICENOTIFICATIONSENABLED],&service_notifications_enabled); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); ts[1]=ndo2db_db_timet_to_sql(idi,last_host_notification); ts[2]=ndo2db_db_timet_to_sql(idi,last_service_notification); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_CONTACT,idi->buffered_input[NDO_DATA_CONTACTNAME],NULL,&object_id); /* generate query string */ if(asprintf(&buf1,"instance_id='%lu', contact_object_id='%lu', status_update_time=%s, host_notifications_enabled='%d', service_notifications_enabled='%d', last_host_notification=%s, last_service_notification=%s, modified_attributes='%lu', modified_host_attributes='%lu', modified_service_attributes='%lu'" ,idi->dbinfo.instance_id ,object_id ,ts[0] ,host_notifications_enabled ,service_notifications_enabled ,ts[1] ,ts[2] ,modified_attributes ,modified_host_attributes ,modified_service_attributes )==-1) buf1=NULL; if(asprintf(&buf,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTSTATUS] ,buf1 ,buf1 )==-1) buf=NULL; /* save entry to db */ result=ndo2db_db_query(idi,buf); free(buf); free(buf1); /* save custom variables to db */ result=ndo2db_save_custom_variables(idi,NDO2DB_DBTABLE_CUSTOMVARIABLESTATUS,object_id,ts[0]); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); return NDO_OK; } int ndo2db_handle_adaptiveprogramdata(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; /* IGNORED */ return NDO_OK; } int ndo2db_handle_adaptivehostdata(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; /* IGNORED */ return NDO_OK; } int ndo2db_handle_adaptiveservicedata(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; /* IGNORED */ return NDO_OK; } int ndo2db_handle_adaptivecontactdata(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; /* IGNORED */ return NDO_OK; } int ndo2db_handle_externalcommanddata(ndo2db_idi *idi){ int x = 0; int type,flags,attr; struct timeval tstamp; char *ts=NULL; char *es[2]; int command_type=0; unsigned long entry_time=0L; char *buf=NULL; int result=NDO_OK; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* only handle start events */ if(type!=NEBTYPE_EXTERNALCOMMAND_START) return NDO_OK; /* covert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_COMMANDTYPE],&command_type); result=ndo2db_convert_string_to_unsignedlong(idi->buffered_input[NDO_DATA_ENTRYTIME],&entry_time); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDSTRING]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDARGS]); ts=ndo2db_db_timet_to_sql(idi,entry_time); /* save entry to db */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', command_type='%d', entry_time=%s, command_name='%s', command_args='%s'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_EXTERNALCOMMANDS] ,idi->dbinfo.instance_id ,command_type ,ts ,es[0] ,es[1] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); free(ts); return NDO_OK; } int ndo2db_handle_aggregatedstatusdata(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; /* IGNORED */ return NDO_OK; } int ndo2db_handle_retentiondata(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; /* IGNORED */ return NDO_OK; } int ndo2db_handle_acknowledgementdata(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; int acknowledgement_type=0; int state=0; int is_sticky=0; int persistent_comment=0; int notify_contacts=0; unsigned long object_id=0L; int result=NDO_OK; char *ts[1]; char *es[2]; int x=0; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACKNOWLEDGEMENTTYPE],&acknowledgement_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATE],&state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STICKY],&is_sticky); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PERSISTENT],&persistent_comment); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYCONTACTS],¬ify_contacts); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_AUTHORNAME]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMENT]); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); /* get the object id */ if(acknowledgement_type==SERVICE_ACKNOWLEDGEMENT) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); if(acknowledgement_type==HOST_ACKNOWLEDGEMENT) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* save entry to db */ if(asprintf(&buf,"instance_id='%lu', entry_time=%s, entry_time_usec='%lu', acknowledgement_type='%d', object_id='%lu', state='%d', author_name='%s', comment_data='%s', is_sticky='%d', persistent_comment='%d', notify_contacts='%d'" ,idi->dbinfo.instance_id ,ts[0] ,tstamp.tv_usec ,acknowledgement_type ,object_id ,state ,es[0] ,es[1] ,is_sticky ,persistent_comment ,notify_contacts )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_ACKNOWLEDGEMENTS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } int ndo2db_handle_statechangedata(ndo2db_idi *idi){ int x = 0; int type,flags,attr; struct timeval tstamp; int statechange_type=0; int state_change_occurred=0; int state=0; int state_type=0; int current_attempt=0; int max_attempts=0; int last_state=-1; int last_hard_state=-1; unsigned long object_id=0L; int result=NDO_OK; char *ts[1]; char *es[2]; char *buf=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* only process completed state changes */ if(type!=NEBTYPE_STATECHANGE_END) return NDO_OK; /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATECHANGETYPE],&statechange_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATECHANGE],&state_change_occurred); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATE],&state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STATETYPE],&state_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CURRENTCHECKATTEMPT],¤t_attempt); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_MAXCHECKATTEMPTS],&max_attempts); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_LASTHARDSTATE],&last_hard_state); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_LASTSTATE],&last_state); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_OUTPUT]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_LONGOUTPUT]); ts[0]=ndo2db_db_timet_to_sql(idi,tstamp.tv_sec); /* get the object id */ if(statechange_type==SERVICE_STATECHANGE) result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOST],idi->buffered_input[NDO_DATA_SERVICE],&object_id); else result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOST],NULL,&object_id); /* save entry to db */ if(asprintf(&buf,"INSERT INTO %s SET instance_id='%lu', state_time=%s, state_time_usec='%lu', object_id='%lu', state_change='%d', state='%d', state_type='%d', current_check_attempt='%d', max_check_attempts='%d', last_state='%d', last_hard_state='%d', output='%s', long_output='%s'" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_STATEHISTORY] ,idi->dbinfo.instance_id ,ts[0] ,tstamp.tv_usec ,object_id ,state_change_occurred ,state ,state_type ,current_attempt ,max_attempts ,last_state ,last_hard_state ,es[0] ,es[1] )==-1) buf=NULL; result=ndo2db_db_query(idi,buf); free(buf); /* free memory */ for (x = 0; x < NAGIOS_SIZEOF_ARRAY(ts); x++) free(ts[x]); for (x = 0; x < NAGIOS_SIZEOF_ARRAY(es); x++) free(es[x]); return NDO_OK; } /****************************************************************************/ /* VARIABLE DATA HANDLERS */ /****************************************************************************/ int ndo2db_handle_configfilevariables(ndo2db_idi *idi, int configfile_type){ int type,flags,attr; struct timeval tstamp; unsigned long configfile_id=0L; int result=NDO_OK; char *es[3]; int x=0; char *buf=NULL; char *buf1=NULL; char *varname=NULL; char *varvalue=NULL; ndo2db_mbuf mbuf; ndo2db_log_debug_info(NDO2DB_DEBUGL_SQL,0,"HANDLE_CONFIGFILEVARS [1]\n"); if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); ndo2db_log_debug_info(NDO2DB_DEBUGL_SQL,0,"HANDLE_CONFIGFILEVARS [2]\n"); ndo2db_log_debug_info(NDO2DB_DEBUGL_SQL,0,"TSTAMP: %lu LATEST: %lu\n",tstamp.tv_sec,idi->dbinfo.latest_realtime_data_time); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; ndo2db_log_debug_info(NDO2DB_DEBUGL_SQL,0,"HANDLE_CONFIGFILEVARS [3]\n"); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_CONFIGFILENAME]); /* add config file to db */ if(asprintf(&buf,"instance_id='%lu', configfile_type='%d', configfile_path='%s'" ,idi->dbinfo.instance_id ,configfile_type ,es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONFIGFILES] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL configfile_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); free(es[0]); /* save config file variables to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONFIGFILEVARIABLE]; for(x=0;xdbinfo.instance_id ,configfile_id ,es[1] ,es[2] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONFIGFILEVARIABLES] ,buf )==-1) buf1=NULL; #ifdef REMOVED_10182007 if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONFIGFILEVARIABLES] ,buf ,buf )==-1) buf1=NULL; #endif result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); free(es[1]); free(es[2]); } return NDO_OK; } int ndo2db_handle_configvariables(ndo2db_idi *idi){ if(idi==NULL) return NDO_ERROR; return NDO_OK; } int ndo2db_handle_runtimevariables(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; int result=NDO_OK; char *es[2]; int x=0; char *buf=NULL; char *buf1=NULL; char *varname=NULL; char *varvalue=NULL; ndo2db_mbuf mbuf; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; /* save config file variables to db */ mbuf=idi->mbuf[NDO2DB_MBUF_RUNTIMEVARIABLE]; for(x=0;xdbinfo.instance_id ,es[0] ,es[1] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_RUNTIMEVARIABLES] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); free(es[0]); free(es[1]); } return NDO_OK; } /****************************************************************************/ /* OBJECT DEFINITION DATA HANDLERS */ /****************************************************************************/ int ndo2db_handle_configdumpstart(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; int result=NDO_OK; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* set config dump type */ if(idi->buffered_input[NDO_DATA_CONFIGDUMPTYPE]!=NULL && !strcmp(idi->buffered_input[NDO_DATA_CONFIGDUMPTYPE],NDO_API_CONFIGDUMP_RETAINED)) idi->current_object_config_type=1; else idi->current_object_config_type=0; return NDO_OK; } int ndo2db_handle_configdumpend(ndo2db_idi *idi){ return NDO_OK; } int ndo2db_handle_hostdefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long check_timeperiod_id=0L; unsigned long notification_timeperiod_id=0L; unsigned long check_command_id=0L; unsigned long eventhandler_command_id=0L; double check_interval=0.0; double retry_interval=0.0; int max_check_attempts=0; double first_notification_delay=0.0; double notification_interval=0.0; int notify_on_down=0; int notify_on_unreachable=0; int notify_on_recovery=0; int notify_on_flapping=0; int notify_on_downtime=0; int stalk_on_up=0; int stalk_on_down=0; int stalk_on_unreachable=0; int flap_detection_enabled=0; int flap_detection_on_up=0; int flap_detection_on_down=0; int flap_detection_on_unreachable=0; int process_performance_data=0; int freshness_checks_enabled=0; int freshness_threshold=0; int passive_checks_enabled=0; int event_handler_enabled=0; int active_checks_enabled=0; int retain_status_information=0; int retain_nonstatus_information=0; int notifications_enabled=0; int obsess_over_host=0; int failure_prediction_enabled=0; double low_flap_threshold=0.0; double high_flap_threshold=0.0; int have_2d_coords=0; int x_2d=0; int y_2d=0; int have_3d_coords=0; double x_3d=0.0; double y_3d=0.0; double z_3d=0.0; unsigned long host_id=0L; unsigned long member_id=0L; int result=NDO_OK; char *es[13]; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; char *cmdptr=NULL; char *argptr=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; /* convert vars */ result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_HOSTCHECKINTERVAL],&check_interval); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_HOSTRETRYINTERVAL],&retry_interval); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTMAXCHECKATTEMPTS],&max_check_attempts); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_FIRSTNOTIFICATIONDELAY],&first_notification_delay); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_HOSTNOTIFICATIONINTERVAL],¬ification_interval); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTDOWN],¬ify_on_down); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTUNREACHABLE],¬ify_on_unreachable); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTRECOVERY],¬ify_on_recovery); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTFLAPPING],¬ify_on_flapping); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTDOWNTIME],¬ify_on_downtime); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STALKHOSTONUP],&stalk_on_up); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STALKHOSTONDOWN],&stalk_on_down); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STALKHOSTONUNREACHABLE],&stalk_on_unreachable); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTFLAPDETECTIONENABLED],&flap_detection_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONONUP],&flap_detection_on_up); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONONDOWN],&flap_detection_on_down); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONONUNREACHABLE],&flap_detection_on_unreachable); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PROCESSHOSTPERFORMANCEDATA],&process_performance_data); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTFRESHNESSCHECKSENABLED],&freshness_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTFRESHNESSTHRESHOLD],&freshness_threshold); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PASSIVEHOSTCHECKSENABLED],&passive_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTEVENTHANDLERENABLED],&event_handler_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACTIVEHOSTCHECKSENABLED],&active_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RETAINHOSTSTATUSINFORMATION],&retain_status_information); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RETAINHOSTNONSTATUSINFORMATION],&retain_nonstatus_information); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTNOTIFICATIONSENABLED],¬ifications_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_OBSESSOVERHOST],&obsess_over_host); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTFAILUREPREDICTIONENABLED],&failure_prediction_enabled); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_LOWHOSTFLAPTHRESHOLD],&low_flap_threshold); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_HIGHHOSTFLAPTHRESHOLD],&high_flap_threshold); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HAVE2DCOORDS],&have_2d_coords); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_X2D],&x_2d); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_Y3D],&y_2d); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HAVE3DCOORDS],&have_3d_coords); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_X3D],&x_3d); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_Y3D],&y_3d); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_Z3D],&z_3d); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_HOSTADDRESS]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_HOSTFAILUREPREDICTIONOPTIONS]); /* get the check command */ cmdptr=strtok(idi->buffered_input[NDO_DATA_HOSTCHECKCOMMAND],"!"); argptr=strtok(NULL,"\x0"); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,cmdptr,NULL,&check_command_id); es[2]=ndo2db_db_escape_string(idi,argptr); /* get the event handler command */ cmdptr=strtok(idi->buffered_input[NDO_DATA_HOSTEVENTHANDLER],"!"); argptr=strtok(NULL,"\x0"); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,cmdptr,NULL,&eventhandler_command_id); es[3]=ndo2db_db_escape_string(idi,argptr); es[4]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_NOTES]); es[5]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_NOTESURL]); es[6]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_ACTIONURL]); es[7]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_ICONIMAGE]); es[8]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_ICONIMAGEALT]); es[9]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_VRMLIMAGE]); es[10]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_STATUSMAPIMAGE]); es[11]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_DISPLAYNAME]); es[12]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_HOSTALIAS]); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOSTNAME],NULL,&object_id); /* flag the object as being active */ ndo2db_set_object_as_active(idi,NDO2DB_OBJECTTYPE_HOST,object_id); /* get the timeperiod ids */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_HOSTCHECKPERIOD],NULL,&check_timeperiod_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_HOSTNOTIFICATIONPERIOD],NULL,¬ification_timeperiod_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', host_object_id='%lu', alias='%s', display_name='%s', address='%s', check_command_object_id='%lu', check_command_args='%s', eventhandler_command_object_id='%lu', eventhandler_command_args='%s', check_timeperiod_object_id='%lu', notification_timeperiod_object_id='%lu', failure_prediction_options='%s', check_interval='%lf', retry_interval='%lf', max_check_attempts='%d', first_notification_delay='%lf', notification_interval='%lf', notify_on_down='%d', notify_on_unreachable='%d', notify_on_recovery='%d', notify_on_flapping='%d', notify_on_downtime='%d', stalk_on_up='%d', stalk_on_down='%d', stalk_on_unreachable='%d', flap_detection_enabled='%d', flap_detection_on_up='%d', flap_detection_on_down='%d', flap_detection_on_unreachable='%d', low_flap_threshold='%lf', high_flap_threshold='%lf', process_performance_data='%d', freshness_checks_enabled='%d', freshness_threshold='%d', passive_checks_enabled='%d', event_handler_enabled='%d', active_checks_enabled='%d', retain_status_information='%d', retain_nonstatus_information='%d', notifications_enabled='%d', obsess_over_host='%d', failure_prediction_enabled='%d', notes='%s', notes_url='%s', action_url='%s', icon_image='%s', icon_image_alt='%s', vrml_image='%s', statusmap_image='%s', have_2d_coords='%d', x_2d='%d', y_2d='%d', have_3d_coords='%d', x_3d='%lf', y_3d='%lf', z_3d='%lf'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,(es[12]==NULL)?"":es[12] ,(es[11]==NULL)?"":es[11] ,(es[0]==NULL)?"":es[0] ,check_command_id ,(es[2]==NULL)?"":es[2] ,eventhandler_command_id ,(es[3]==NULL)?"":es[3] ,check_timeperiod_id ,notification_timeperiod_id ,(es[1]==NULL)?"":es[1] ,check_interval ,retry_interval ,max_check_attempts ,first_notification_delay ,notification_interval ,notify_on_down ,notify_on_unreachable ,notify_on_recovery ,notify_on_flapping ,notify_on_downtime ,stalk_on_up ,stalk_on_down ,stalk_on_unreachable ,flap_detection_enabled ,flap_detection_on_up ,flap_detection_on_down ,flap_detection_on_unreachable ,low_flap_threshold ,high_flap_threshold ,process_performance_data ,freshness_checks_enabled ,freshness_threshold ,passive_checks_enabled ,event_handler_enabled ,active_checks_enabled ,retain_status_information ,retain_nonstatus_information ,notifications_enabled ,obsess_over_host ,failure_prediction_enabled ,(es[4]==NULL)?"":es[4] ,(es[5]==NULL)?"":es[5] ,(es[6]==NULL)?"":es[6] ,(es[7]==NULL)?"":es[7] ,(es[8]==NULL)?"":es[8] ,(es[9]==NULL)?"":es[9] ,(es[10]==NULL)?"":es[10] ,have_2d_coords ,x_2d ,y_2d ,have_3d_coords ,x_3d ,y_3d ,z_3d )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTS] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL host_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); for(x=0;x<13;x++) free(es[x]); /* save parent hosts to db */ mbuf=idi->mbuf[NDO2DB_MBUF_PARENTHOST]; for(x=0;xdbinfo.instance_id ,host_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTPARENTHOSTS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save contact groups to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACTGROUP]; for(x=0;xdbinfo.instance_id ,host_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTCONTACTGROUPS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save contacts to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACT]; for(x=0;xdbinfo.instance_id ,host_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTCONTACTS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save custom variables to db */ result=ndo2db_save_custom_variables(idi,NDO2DB_DBTABLE_CUSTOMVARIABLES,object_id,NULL); return NDO_OK; } int ndo2db_handle_hostgroupdefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long group_id=0L; unsigned long member_id=0L; int result=NDO_OK; char *es[1]; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_HOSTGROUPALIAS]); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOSTGROUP,idi->buffered_input[NDO_DATA_HOSTGROUPNAME],NULL,&object_id); /* flag the object as being active */ ndo2db_set_object_as_active(idi,NDO2DB_OBJECTTYPE_HOSTGROUP,object_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', hostgroup_object_id='%lu', alias='%s'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTGROUPS] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL group_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); free(es[0]); /* save hostgroup members to db */ mbuf=idi->mbuf[NDO2DB_MBUF_HOSTGROUPMEMBER]; for(x=0;xdbinfo.instance_id ,group_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTGROUPMEMBERS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } return NDO_OK; } int ndo2db_handle_servicedefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long host_id=0L; unsigned long check_timeperiod_id=0L; unsigned long notification_timeperiod_id=0L; unsigned long check_command_id=0L; unsigned long eventhandler_command_id=0L; double check_interval=0.0; double retry_interval=0.0; int max_check_attempts=0; double first_notification_delay=0.0; double notification_interval=0.0; int notify_on_warning=0; int notify_on_unknown=0; int notify_on_critical=0; int notify_on_recovery=0; int notify_on_flapping=0; int notify_on_downtime=0; int stalk_on_ok=0; int stalk_on_warning=0; int stalk_on_unknown=0; int stalk_on_critical=0; int is_volatile=0; int flap_detection_enabled=0; int flap_detection_on_ok=0; int flap_detection_on_warning=0; int flap_detection_on_unknown=0; int flap_detection_on_critical=0; int process_performance_data=0; int freshness_checks_enabled=0; int freshness_threshold=0; int passive_checks_enabled=0; int event_handler_enabled=0; int active_checks_enabled=0; int retain_status_information=0; int retain_nonstatus_information=0; int notifications_enabled=0; int obsess_over_service=0; int failure_prediction_enabled=0; double low_flap_threshold=0.0; double high_flap_threshold=0.0; unsigned long service_id=0L; unsigned long member_id=0L; int result=NDO_OK; char *es[9]; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; char *cmdptr=NULL; char *argptr=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; /* convert vars */ result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_SERVICECHECKINTERVAL],&check_interval); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_SERVICERETRYINTERVAL],&retry_interval); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_MAXSERVICECHECKATTEMPTS],&max_check_attempts); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_FIRSTNOTIFICATIONDELAY],&first_notification_delay); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_SERVICENOTIFICATIONINTERVAL],¬ification_interval); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICEWARNING],¬ify_on_warning); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICEUNKNOWN],¬ify_on_unknown); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICECRITICAL],¬ify_on_critical); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICERECOVERY],¬ify_on_recovery); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICEFLAPPING],¬ify_on_flapping); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICEDOWNTIME],¬ify_on_downtime); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STALKSERVICEONOK],&stalk_on_ok); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STALKSERVICEONWARNING],&stalk_on_warning); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STALKSERVICEONUNKNOWN],&stalk_on_unknown); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_STALKSERVICEONCRITICAL],&stalk_on_critical); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICEISVOLATILE],&is_volatile); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICEFLAPDETECTIONENABLED],&flap_detection_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONONOK],&flap_detection_on_ok); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONONWARNING],&flap_detection_on_warning); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONONUNKNOWN],&flap_detection_on_unknown); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FLAPDETECTIONONCRITICAL],&flap_detection_on_critical); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PROCESSSERVICEPERFORMANCEDATA],&process_performance_data); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICEFRESHNESSCHECKSENABLED],&freshness_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICEFRESHNESSTHRESHOLD],&freshness_threshold); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_PASSIVESERVICECHECKSENABLED],&passive_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICEEVENTHANDLERENABLED],&event_handler_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ACTIVESERVICECHECKSENABLED],&active_checks_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RETAINSERVICESTATUSINFORMATION],&retain_status_information); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_RETAINSERVICENONSTATUSINFORMATION],&retain_nonstatus_information); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICENOTIFICATIONSENABLED],¬ifications_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_OBSESSOVERSERVICE],&obsess_over_service); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICEFAILUREPREDICTIONENABLED],&failure_prediction_enabled); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_LOWSERVICEFLAPTHRESHOLD],&low_flap_threshold); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_HIGHSERVICEFLAPTHRESHOLD],&high_flap_threshold); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_SERVICEFAILUREPREDICTIONOPTIONS]); /* get the check command */ cmdptr=strtok(idi->buffered_input[NDO_DATA_SERVICECHECKCOMMAND],"!"); argptr=strtok(NULL,"\x0"); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,cmdptr,NULL,&check_command_id); es[1]=ndo2db_db_escape_string(idi,argptr); /* get the event handler command */ cmdptr=strtok(idi->buffered_input[NDO_DATA_SERVICEEVENTHANDLER],"!"); argptr=strtok(NULL,"\x0"); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,cmdptr,NULL,&eventhandler_command_id); es[2]=ndo2db_db_escape_string(idi,argptr); es[3]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_NOTES]); es[4]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_NOTESURL]); es[5]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_ACTIONURL]); es[6]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_ICONIMAGE]); es[7]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_ICONIMAGEALT]); es[8]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_DISPLAYNAME]); /* get the object ids */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOSTNAME],idi->buffered_input[NDO_DATA_SERVICEDESCRIPTION],&object_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOSTNAME],NULL,&host_id); /* flag the object as being active */ ndo2db_set_object_as_active(idi,NDO2DB_OBJECTTYPE_SERVICE,object_id); /* get the timeperiod ids */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_SERVICECHECKPERIOD],NULL,&check_timeperiod_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_SERVICENOTIFICATIONPERIOD],NULL,¬ification_timeperiod_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', host_object_id='%lu', service_object_id='%lu', display_name='%s', check_command_object_id='%lu', check_command_args='%s', eventhandler_command_object_id='%lu', eventhandler_command_args='%s', check_timeperiod_object_id='%lu', notification_timeperiod_object_id='%lu', failure_prediction_options='%s', check_interval='%lf', retry_interval='%lf', max_check_attempts='%d', first_notification_delay='%lf', notification_interval='%lf', notify_on_warning='%d', notify_on_unknown='%d', notify_on_critical='%d', notify_on_recovery='%d', notify_on_flapping='%d', notify_on_downtime='%d', stalk_on_ok='%d', stalk_on_warning='%d', stalk_on_unknown='%d', stalk_on_critical='%d', is_volatile='%d', flap_detection_enabled='%d', flap_detection_on_ok='%d', flap_detection_on_warning='%d', flap_detection_on_unknown='%d', flap_detection_on_critical='%d', low_flap_threshold='%lf', high_flap_threshold='%lf', process_performance_data='%d', freshness_checks_enabled='%d', freshness_threshold='%d', passive_checks_enabled='%d', event_handler_enabled='%d', active_checks_enabled='%d', retain_status_information='%d', retain_nonstatus_information='%d', notifications_enabled='%d', obsess_over_service='%d', failure_prediction_enabled='%d', notes='%s', notes_url='%s', action_url='%s', icon_image='%s', icon_image_alt='%s'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,host_id ,object_id ,(es[8]==NULL)?"":es[8] ,check_command_id ,(es[1]==NULL)?"":es[1] ,eventhandler_command_id ,(es[2]==NULL)?"":es[2] ,check_timeperiod_id ,notification_timeperiod_id ,(es[0]==NULL)?"":es[0] ,check_interval ,retry_interval ,max_check_attempts ,first_notification_delay ,notification_interval ,notify_on_warning ,notify_on_unknown ,notify_on_critical ,notify_on_recovery ,notify_on_flapping ,notify_on_downtime ,stalk_on_ok ,stalk_on_warning ,stalk_on_unknown ,stalk_on_critical ,is_volatile ,flap_detection_enabled ,flap_detection_on_ok ,flap_detection_on_warning ,flap_detection_on_unknown ,flap_detection_on_critical ,low_flap_threshold ,high_flap_threshold ,process_performance_data ,freshness_checks_enabled ,freshness_threshold ,passive_checks_enabled ,event_handler_enabled ,active_checks_enabled ,retain_status_information ,retain_nonstatus_information ,notifications_enabled ,obsess_over_service ,failure_prediction_enabled ,(es[3]==NULL)?"":es[3] ,(es[4]==NULL)?"":es[4] ,(es[5]==NULL)?"":es[5] ,(es[6]==NULL)?"":es[6] ,(es[7]==NULL)?"":es[7] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICES] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL service_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); for(x=0;x<9;x++) free(es[x]); /* save contact groups to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACTGROUP]; for(x=0;xdbinfo.instance_id ,service_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICECONTACTGROUPS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save contacts to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACT]; for(x=0;xdbinfo.instance_id ,service_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICECONTACTS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save custom variables to db */ result=ndo2db_save_custom_variables(idi,NDO2DB_DBTABLE_CUSTOMVARIABLES,object_id,NULL); return NDO_OK; } int ndo2db_handle_servicegroupdefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long group_id=0L; unsigned long member_id=0L; int result=NDO_OK; char *es[1]; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; char *hptr=NULL; char *sptr=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_SERVICEGROUPALIAS]); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICEGROUP,idi->buffered_input[NDO_DATA_SERVICEGROUPNAME],NULL,&object_id); /* flag the object as being active */ ndo2db_set_object_as_active(idi,NDO2DB_OBJECTTYPE_SERVICEGROUP,object_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', servicegroup_object_id='%lu', alias='%s'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEGROUPS] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL group_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); free(es[0]); /* save members to db */ mbuf=idi->mbuf[NDO2DB_MBUF_SERVICEGROUPMEMBER]; for(x=0;xdbinfo.instance_id ,group_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEGROUPMEMBERS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } return NDO_OK; } int ndo2db_handle_hostdependencydefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long dependent_object_id=0L; unsigned long timeperiod_object_id=0L; int dependency_type=0; int inherits_parent=0; int fail_on_up=0; int fail_on_down=0; int fail_on_unreachable=0; int result=NDO_OK; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_DEPENDENCYTYPE],&dependency_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_INHERITSPARENT],&inherits_parent); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILONUP],&fail_on_up); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILONDOWN],&fail_on_down); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILONUNREACHABLE],&fail_on_unreachable); /* get the object ids */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOSTNAME],NULL,&object_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_DEPENDENTHOSTNAME],NULL,&dependent_object_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_DEPENDENCYPERIOD],NULL,&timeperiod_object_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', host_object_id='%lu', dependent_host_object_id='%lu', dependency_type='%d', inherits_parent='%d', timeperiod_object_id='%lu', fail_on_up='%d', fail_on_down='%d', fail_on_unreachable='%d'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,dependent_object_id ,dependency_type ,inherits_parent ,timeperiod_object_id ,fail_on_up ,fail_on_down ,fail_on_unreachable )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTDEPENDENCIES] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); return NDO_OK; } int ndo2db_handle_servicedependencydefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long dependent_object_id=0L; unsigned long timeperiod_object_id=0L; int dependency_type=0; int inherits_parent=0; int fail_on_ok=0; int fail_on_warning=0; int fail_on_unknown=0; int fail_on_critical=0; int result=NDO_OK; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_DEPENDENCYTYPE],&dependency_type); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_INHERITSPARENT],&inherits_parent); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILONOK],&fail_on_ok); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILONWARNING],&fail_on_warning); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILONUNKNOWN],&fail_on_unknown); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FAILONCRITICAL],&fail_on_critical); /* get the object ids */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOSTNAME],idi->buffered_input[NDO_DATA_SERVICEDESCRIPTION],&object_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_DEPENDENTHOSTNAME],idi->buffered_input[NDO_DATA_DEPENDENTSERVICEDESCRIPTION],&dependent_object_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_DEPENDENCYPERIOD],NULL,&timeperiod_object_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', service_object_id='%lu', dependent_service_object_id='%lu', dependency_type='%d', inherits_parent='%d', timeperiod_object_id='%lu', fail_on_ok='%d', fail_on_warning='%d', fail_on_unknown='%d', fail_on_critical='%d'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,dependent_object_id ,dependency_type ,inherits_parent ,timeperiod_object_id ,fail_on_ok ,fail_on_warning ,fail_on_unknown ,fail_on_critical )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEDEPENDENCIES] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); return NDO_OK; } int ndo2db_handle_hostescalationdefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long timeperiod_id=0L; unsigned long escalation_id=0L; unsigned long member_id=0L; int first_notification=0; int last_notification=0; double notification_interval=0.0; int escalate_recovery=0; int escalate_down=0; int escalate_unreachable=0; int result=NDO_OK; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FIRSTNOTIFICATION],&first_notification); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_LASTNOTIFICATION],&last_notification); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_NOTIFICATIONINTERVAL],¬ification_interval); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ESCALATEONRECOVERY],&escalate_recovery); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ESCALATEONDOWN],&escalate_down); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ESCALATEONUNREACHABLE],&escalate_unreachable); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_HOST,idi->buffered_input[NDO_DATA_HOSTNAME],NULL,&object_id); /* get the timeperiod id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_ESCALATIONPERIOD],NULL,&timeperiod_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', host_object_id='%lu', timeperiod_object_id='%lu', first_notification='%d', last_notification='%d', notification_interval='%lf', escalate_on_recovery='%d', escalate_on_down='%d', escalate_on_unreachable='%d'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,timeperiod_id ,first_notification ,last_notification ,notification_interval ,escalate_recovery ,escalate_down ,escalate_unreachable )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTESCALATIONS] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL escalation_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); /* save contact groups to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACTGROUP]; for(x=0;xdbinfo.instance_id ,escalation_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTESCALATIONCONTACTGROUPS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save contacts to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACT]; for(x=0;xdbinfo.instance_id ,escalation_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTESCALATIONCONTACTS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } return NDO_OK; } int ndo2db_handle_serviceescalationdefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long timeperiod_id=0L; unsigned long escalation_id=0L; unsigned long member_id=0L; int first_notification=0; int last_notification=0; double notification_interval=0.0; int escalate_recovery=0; int escalate_warning=0; int escalate_unknown=0; int escalate_critical=0; int result=NDO_OK; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_FIRSTNOTIFICATION],&first_notification); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_LASTNOTIFICATION],&last_notification); result=ndo2db_convert_string_to_double(idi->buffered_input[NDO_DATA_NOTIFICATIONINTERVAL],¬ification_interval); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ESCALATEONRECOVERY],&escalate_recovery); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ESCALATEONWARNING],&escalate_warning); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ESCALATEONUNKNOWN],&escalate_unknown); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_ESCALATEONCRITICAL],&escalate_critical); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_SERVICE,idi->buffered_input[NDO_DATA_HOSTNAME],idi->buffered_input[NDO_DATA_SERVICEDESCRIPTION],&object_id); /* get the timeperiod id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_ESCALATIONPERIOD],NULL,&timeperiod_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', service_object_id='%lu', timeperiod_object_id='%lu', first_notification='%d', last_notification='%d', notification_interval='%lf', escalate_on_recovery='%d', escalate_on_warning='%d', escalate_on_unknown='%d', escalate_on_critical='%d'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,timeperiod_id ,first_notification ,last_notification ,notification_interval ,escalate_recovery ,escalate_warning ,escalate_unknown ,escalate_critical )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEESCALATIONS] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL escalation_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); /* save contact groups to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACTGROUP]; for(x=0;xdbinfo.instance_id ,escalation_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEESCALATIONCONTACTGROUPS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } /* save contacts to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACT]; for(x=0;xdbinfo.instance_id ,escalation_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICEESCALATIONCONTACTS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } return NDO_OK; } int ndo2db_handle_commanddefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; int result=NDO_OK; char *es[1]; int x=0; char *buf=NULL; char *buf1=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_COMMANDLINE]); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_COMMAND,idi->buffered_input[NDO_DATA_COMMANDNAME],NULL,&object_id); /* flag the object as being active */ ndo2db_set_object_as_active(idi,NDO2DB_OBJECTTYPE_COMMAND,object_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', object_id='%lu', config_type='%d', command_line='%s'" ,idi->dbinfo.instance_id ,object_id ,idi->current_object_config_type ,es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_COMMANDS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); for(x=0;x<1;x++) free(es[x]); return NDO_OK; } int ndo2db_handle_timeperiodefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long timeperiod_id=0L; char *dayptr=NULL; char *startptr=NULL; char *endptr=NULL; int day=0; unsigned long start_sec=0L; unsigned long end_sec=0L; int result=NDO_OK; char *es[1]; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_TIMEPERIODALIAS]); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_TIMEPERIODNAME],NULL,&object_id); /* flag the object as being active */ ndo2db_set_object_as_active(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,object_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', timeperiod_object_id='%lu', alias='%s'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEPERIODS] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL timeperiod_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); free(es[0]); /* save timeranges to db */ mbuf=idi->mbuf[NDO2DB_MBUF_TIMERANGE]; for(x=0;xdbinfo.instance_id ,timeperiod_id ,day ,start_sec ,end_sec )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEPERIODTIMERANGES] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } return NDO_OK; } int ndo2db_handle_contactdefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long contact_id=0L; unsigned long host_timeperiod_id=0L; unsigned long service_timeperiod_id=0L; int host_notifications_enabled=0; int service_notifications_enabled=0; int can_submit_commands=0; int notify_service_recovery=0; int notify_service_warning=0; int notify_service_unknown=0; int notify_service_critical=0; int notify_service_flapping=0; int notify_service_downtime=0; int notify_host_recovery=0; int notify_host_down=0; int notify_host_unreachable=0; int notify_host_flapping=0; int notify_host_downtime=0; unsigned long command_id=0L; int result=NDO_OK; char *es[3]; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; char *numptr=NULL; char *addressptr=NULL; int address_number=0; char *cmdptr=NULL; char *argptr=NULL; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; /* convert vars */ result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_HOSTNOTIFICATIONSENABLED],&host_notifications_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_SERVICENOTIFICATIONSENABLED],&service_notifications_enabled); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_CANSUBMITCOMMANDS],&can_submit_commands); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICEWARNING],¬ify_service_warning); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICEUNKNOWN],¬ify_service_unknown); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICECRITICAL],¬ify_service_critical); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICERECOVERY],¬ify_service_recovery); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICEFLAPPING],¬ify_service_flapping); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYSERVICEDOWNTIME],¬ify_service_downtime); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTDOWN],¬ify_host_down); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTUNREACHABLE],¬ify_host_unreachable); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTRECOVERY],¬ify_host_recovery); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTFLAPPING],¬ify_host_flapping); result=ndo2db_convert_string_to_int(idi->buffered_input[NDO_DATA_NOTIFYHOSTDOWNTIME],¬ify_host_downtime); es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_CONTACTALIAS]); es[1]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_EMAILADDRESS]); es[2]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_PAGERADDRESS]); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_CONTACT,idi->buffered_input[NDO_DATA_CONTACTNAME],NULL,&contact_id); /* get the timeperiod ids */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_HOSTNOTIFICATIONPERIOD],NULL,&host_timeperiod_id); result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_TIMEPERIOD,idi->buffered_input[NDO_DATA_SERVICENOTIFICATIONPERIOD],NULL,&service_timeperiod_id); /* flag the object as being active */ ndo2db_set_object_as_active(idi,NDO2DB_OBJECTTYPE_CONTACT,contact_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', contact_object_id='%lu', alias='%s', email_address='%s', pager_address='%s', host_timeperiod_object_id='%lu', service_timeperiod_object_id='%lu', host_notifications_enabled='%d', service_notifications_enabled='%d', can_submit_commands='%d', notify_service_recovery='%d', notify_service_warning='%d', notify_service_unknown='%d', notify_service_critical='%d', notify_service_flapping='%d', notify_service_downtime='%d', notify_host_recovery='%d', notify_host_down='%d', notify_host_unreachable='%d', notify_host_flapping='%d', notify_host_downtime='%d'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,contact_id ,es[0] ,es[1] ,es[2] ,host_timeperiod_id ,service_timeperiod_id ,host_notifications_enabled ,service_notifications_enabled ,can_submit_commands ,notify_service_recovery ,notify_service_warning ,notify_service_unknown ,notify_service_critical ,notify_service_flapping ,notify_service_downtime ,notify_host_recovery ,notify_host_down ,notify_host_unreachable ,notify_host_flapping ,notify_host_downtime )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTS] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL contact_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); for(x=0;x<3;x++) free(es[x]); /* save addresses to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACTADDRESS]; for(x=0;xdbinfo.instance_id ,contact_id ,address_number ,es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTADDRESSES] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); free(es[0]); } /* save host notification commands to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACTADDRESS]; for(x=0;xdbinfo.instance_id ,contact_id ,HOST_NOTIFICATION ,command_id ,(es[0]==NULL)?"":es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTNOTIFICATIONCOMMANDS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); free(es[0]); } /* save service notification commands to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACTADDRESS]; for(x=0;xdbinfo.instance_id ,contact_id ,SERVICE_NOTIFICATION ,command_id ,(es[0]==NULL)?"":es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTNOTIFICATIONCOMMANDS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); free(es[0]); } /* save custom variables to db */ result=ndo2db_save_custom_variables(idi,NDO2DB_DBTABLE_CUSTOMVARIABLES,contact_id,NULL); return NDO_OK; } int ndo2db_handle_contactgroupdefinition(ndo2db_idi *idi){ int type,flags,attr; struct timeval tstamp; unsigned long object_id=0L; unsigned long group_id=0L; unsigned long member_id=0L; int result=NDO_OK; char *es[1]; int x=0; char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; if(idi==NULL) return NDO_ERROR; /* convert timestamp, etc */ result=ndo2db_convert_standard_data_elements(idi,&type,&flags,&attr,&tstamp); /* don't store old data */ if(tstamp.tv_secdbinfo.latest_realtime_data_time) return NDO_OK; es[0]=ndo2db_db_escape_string(idi,idi->buffered_input[NDO_DATA_CONTACTGROUPALIAS]); /* get the object id */ result=ndo2db_get_object_id_with_insert(idi,NDO2DB_OBJECTTYPE_CONTACTGROUP,idi->buffered_input[NDO_DATA_CONTACTGROUPNAME],NULL,&object_id); /* flag the object as being active */ ndo2db_set_object_as_active(idi,NDO2DB_OBJECTTYPE_CONTACTGROUP,object_id); /* add definition to db */ if(asprintf(&buf,"instance_id='%lu', config_type='%d', contactgroup_object_id='%lu', alias='%s'" ,idi->dbinfo.instance_id ,idi->current_object_config_type ,object_id ,es[0] )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTGROUPS] ,buf ,buf )==-1) buf1=NULL; if((result=ndo2db_db_query(idi,buf1))==NDO_OK){ switch(idi->dbinfo.server_type){ case NDO2DB_DBSERVER_MYSQL: #ifdef USE_MYSQL group_id=mysql_insert_id(&idi->dbinfo.mysql_conn); #endif break; default: break; } } free(buf); free(buf1); free(es[0]); /* save contact group members to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CONTACTGROUPMEMBER]; for(x=0;xdbinfo.instance_id ,group_id ,member_id )==-1) buf=NULL; if(asprintf(&buf1,"INSERT INTO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[NDO2DB_DBTABLE_CONTACTGROUPMEMBERS] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } return NDO_OK; } int ndo2db_save_custom_variables(ndo2db_idi *idi,int table_idx, int o_id, char *ts ){ char *buf=NULL; char *buf1=NULL; ndo2db_mbuf mbuf; char *es[1]; char *ptr1=NULL; char *ptr2=NULL; char *ptr3=NULL; int result=NDO_OK; int has_been_modified=0; int x=0; /* save custom variables to db */ mbuf=idi->mbuf[NDO2DB_MBUF_CUSTOMVARIABLE]; for(x=0;xdbinfo.instance_id ,o_id ,idi->current_object_config_type ,has_been_modified ,(es[0]==NULL)?"":es[0] ,(es[1]==NULL)?"":es[1] )==-1) buf=NULL; } if (table_idx==NDO2DB_DBTABLE_CUSTOMVARIABLESTATUS) { if(asprintf(&buf,"instance_id='%d', object_id='%lu',status_update_time=%s, has_been_modified='%d', varname='%s', varvalue='%s'" ,idi->dbinfo.instance_id ,o_id ,(ts==NULL)?"NULL":ts ,has_been_modified ,(es[0]==NULL)?"":es[0] ,(es[1]==NULL)?"":es[1] )==-1) buf=NULL; } free(es[0]); free(es[1]); if(asprintf(&buf1,"INSERT INtO %s SET %s ON DUPLICATE KEY UPDATE %s" ,ndo2db_db_tablenames[table_idx] ,buf ,buf )==-1) buf1=NULL; result=ndo2db_db_query(idi,buf1); free(buf); free(buf1); } return result; } ndoutils-1.4b9/src/ndomod.c0000644000175100017510000041322711271525175016000 0ustar baeckerhbaeckerh/***************************************************************************** * * NDOMOD.C - Nagios Data Output Event Broker Module * * Copyright (c) 2009 Nagios Core Development Team and Community Contributors * Copyright (c) 2005-2009 Ethan Galstad * * First Written: 05-19-2005 * Last Modified: 10-27-2009 * *****************************************************************************/ /* include our project's header files */ #include "../include/common.h" #include "../include/io.h" #include "../include/utils.h" #include "../include/protoapi.h" #include "../include/ndomod.h" /* include (minimum required) event broker header files */ #ifdef BUILD_NAGIOS_2X #include "../include/nagios-2x/nebstructs.h" #include "../include/nagios-2x/nebmodules.h" #include "../include/nagios-2x/nebcallbacks.h" #include "../include/nagios-2x/broker.h" #endif #ifdef BUILD_NAGIOS_3X #include "../include/nagios-3x/nebstructs.h" #include "../include/nagios-3x/nebmodules.h" #include "../include/nagios-3x/nebcallbacks.h" #include "../include/nagios-3x/broker.h" #endif /* include other Nagios header files for access to functions, data structs, etc. */ #ifdef BUILD_NAGIOS_2X #include "../include/nagios-2x/common.h" #include "../include/nagios-2x/nagios.h" #include "../include/nagios-2x/downtime.h" #include "../include/nagios-2x/comments.h" #endif #ifdef BUILD_NAGIOS_3X #include "../include/nagios-3x/common.h" #include "../include/nagios-3x/nagios.h" #include "../include/nagios-3x/downtime.h" #include "../include/nagios-3x/comments.h" #include "../include/nagios-3x/macros.h" #endif /* specify event broker API version (required) */ NEB_API_VERSION(CURRENT_NEB_API_VERSION) #define NDOMOD_VERSION "1.4b9" #define NDOMOD_NAME "NDOMOD" #define NDOMOD_DATE "10-27-2009" void *ndomod_module_handle=NULL; char *ndomod_instance_name=NULL; char *ndomod_buffer_file=NULL; char *ndomod_sink_name=NULL; int ndomod_sink_type=NDO_SINK_UNIXSOCKET; int ndomod_sink_tcp_port=NDO_DEFAULT_TCP_PORT; int ndomod_sink_is_open=NDO_FALSE; int ndomod_sink_previously_open=NDO_FALSE; int ndomod_sink_fd=-1; time_t ndomod_sink_last_reconnect_attempt=0L; time_t ndomod_sink_last_reconnect_warning=0L; unsigned long ndomod_sink_connect_attempt=0L; unsigned long ndomod_sink_reconnect_interval=15; unsigned long ndomod_sink_reconnect_warning_interval=900; unsigned long ndomod_sink_rotation_interval=3600; char *ndomod_sink_rotation_command=NULL; int ndomod_sink_rotation_timeout=60; int ndomod_allow_sink_activity=NDO_TRUE; unsigned long ndomod_process_options=NDOMOD_PROCESS_EVERYTHING; int ndomod_config_output_options=NDOMOD_CONFIG_DUMP_ALL; unsigned long ndomod_sink_buffer_slots=5000; ndomod_sink_buffer sinkbuf; extern int errno; /**** NAGIOS VARIABLES ****/ extern command *command_list; extern timeperiod *timeperiod_list; extern contact *contact_list; extern contactgroup *contactgroup_list; extern host *host_list; extern hostgroup *hostgroup_list; extern service *service_list; extern servicegroup *servicegroup_list; extern hostescalation *hostescalation_list; extern serviceescalation *serviceescalation_list; extern hostdependency *hostdependency_list; extern servicedependency *servicedependency_list; #ifdef BUILD_NAGIOS_2X extern hostextinfo *hostextinfo_list; extern serviceextinfo *serviceextinfo_list; #endif extern char *config_file; extern sched_info scheduling_info; extern char *global_host_event_handler; extern char *global_service_event_handler; extern int __nagios_object_structure_version; extern int use_ssl; #define DEBUG_NDO 1 /* this function gets called when the module is loaded by the event broker */ int nebmodule_init(int flags, char *args, void *handle){ char temp_buffer[NDOMOD_MAX_BUFLEN]; /* save our handle */ ndomod_module_handle=handle; /* log module info to the Nagios log file */ snprintf(temp_buffer,sizeof(temp_buffer)-1,"ndomod: %s %s (%s) Copyright (c) 2009 Nagios Core Development Team and Community Contributors",NDOMOD_NAME,NDOMOD_VERSION,NDOMOD_DATE); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); /* check Nagios object structure version */ if(ndomod_check_nagios_object_version()==NDO_ERROR) return -1; /* process arguments */ if(ndomod_process_module_args(args)==NDO_ERROR){ ndomod_write_to_logs("ndomod: An error occurred while attempting to process module arguments.",NSLOG_INFO_MESSAGE); return -1; } /* do some initialization stuff... */ if(ndomod_init()==NDO_ERROR){ ndomod_write_to_logs("ndomod: An error occurred while attempting to initialize.",NSLOG_INFO_MESSAGE); return -1; } return 0; } /* this function gets called when the module is unloaded by the event broker */ int nebmodule_deinit(int flags, int reason){ char temp_buffer[NDOMOD_MAX_BUFLEN]; /* do some shutdown stuff... */ ndomod_deinit(); /* log a message to the Nagios log file */ snprintf(temp_buffer,sizeof(temp_buffer)-1,"ndomod: Shutdown complete.\n"); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); return 0; } /****************************************************************************/ /* INIT/DEINIT FUNCTIONS */ /****************************************************************************/ /* checks to make sure Nagios object version matches what we know about */ int ndomod_check_nagios_object_version(void){ char temp_buffer[NDOMOD_MAX_BUFLEN]; if(__nagios_object_structure_version!=CURRENT_OBJECT_STRUCTURE_VERSION){ snprintf(temp_buffer,sizeof(temp_buffer)-1,"ndomod: I've been compiled with support for revision %d of the internal Nagios object structures, but the Nagios daemon is currently using revision %d. I'm going to unload so I don't cause any problems...\n",CURRENT_OBJECT_STRUCTURE_VERSION,__nagios_object_structure_version); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); return NDO_ERROR; } return NDO_OK; } /* performs some initialization stuff */ int ndomod_init(void){ char temp_buffer[NDOMOD_MAX_BUFLEN]; time_t current_time; /* initialize some vars (needed for restarts of daemon - why, if the module gets reloaded ???) */ ndomod_sink_is_open=NDO_FALSE; ndomod_sink_previously_open=NDO_FALSE; ndomod_sink_fd=-1; ndomod_sink_last_reconnect_attempt=0L; ndomod_sink_last_reconnect_warning=0L; ndomod_allow_sink_activity=NDO_TRUE; /* initialize data sink buffer */ ndomod_sink_buffer_init(&sinkbuf,ndomod_sink_buffer_slots); /* read unprocessed data from buffer file */ ndomod_load_unprocessed_data(ndomod_buffer_file); /* open data sink and say hello */ /* 05/04/06 - modified to flush buffer items that may have been read in from file */ ndomod_write_to_sink("\n",NDO_FALSE,NDO_TRUE); /* register callbacks */ if(ndomod_register_callbacks()==NDO_ERROR) return NDO_ERROR; if(ndomod_sink_type==NDO_SINK_FILE){ /* make sure we have a rotation command defined... */ if(ndomod_sink_rotation_command==NULL){ /* log an error message to the Nagios log file */ snprintf(temp_buffer,sizeof(temp_buffer)-1,"ndomod: Warning - No file rotation command defined.\n"); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); } /* schedule a file rotation event */ else{ time(¤t_time); #ifdef BUILD_NAGIOS_2X schedule_new_event(EVENT_USER_FUNCTION,TRUE,current_time+ndomod_sink_rotation_interval,TRUE,ndomod_sink_rotation_interval,NULL,TRUE,(void *)ndomod_rotate_sink_file,NULL); #else schedule_new_event(EVENT_USER_FUNCTION,TRUE,current_time+ndomod_sink_rotation_interval,TRUE,ndomod_sink_rotation_interval,NULL,TRUE,(void *)ndomod_rotate_sink_file,NULL,0); #endif } } return NDO_OK; } /* performs some shutdown stuff */ int ndomod_deinit(void){ /* deregister callbacks */ ndomod_deregister_callbacks(); /* save unprocessed data to buffer file */ ndomod_save_unprocessed_data(ndomod_buffer_file); /* clear sink buffer */ ndomod_sink_buffer_deinit(&sinkbuf); /* close data sink */ ndomod_goodbye_sink(); ndomod_close_sink(); return NDO_OK; } /****************************************************************************/ /* CONFIG FUNCTIONS */ /****************************************************************************/ /* process arguments that were passed to the module at startup */ int ndomod_process_module_args(char *args){ char *ptr=NULL; char **arglist=NULL; char **newarglist=NULL; int argcount=0; int memblocks=64; int arg=0; if(args==NULL) return NDO_OK; /* get all the var/val argument pairs */ /* allocate some memory */ if((arglist=(char **)malloc(memblocks*sizeof(char **)))==NULL) return NDO_ERROR; /* process all args */ ptr=strtok(args,","); while(ptr){ /* save the argument */ arglist[argcount++]=strdup(ptr); /* allocate more memory if needed */ if(!(argcount%memblocks)){ if((newarglist=(char **)realloc(arglist,(argcount+memblocks)*sizeof(char **)))==NULL){ for(arg=0;arg(unsigned long)ndomod_sink_last_reconnect_attempt){ result=ndomod_open_sink(); ndomod_sink_last_reconnect_attempt=current_time; ndomod_sink_connect_attempt++; /* sink was (re)opened... */ if(result==NDO_OK){ if(reconnect==NDO_TRUE){ asprintf(&temp_buffer,"ndomod: Successfully reconnected to data sink! %lu items lost, %lu queued items to flush.",sinkbuf.overflow,sinkbuf.items); ndomod_hello_sink(TRUE,TRUE); } else{ if(sinkbuf.overflow==0L) asprintf(&temp_buffer,"ndomod: Successfully connected to data sink. %lu queued items to flush.",sinkbuf.items); else asprintf(&temp_buffer,"ndomod: Successfully connected to data sink. %lu items lost, %lu queued items to flush.",sinkbuf.overflow,sinkbuf.items); ndomod_hello_sink(FALSE,FALSE); } ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); free(temp_buffer); temp_buffer=NULL; /* reset sink overflow */ sinkbuf.overflow=0L; } /* sink could not be (re)opened... */ else{ if((unsigned long)((unsigned long)current_time-ndomod_sink_reconnect_warning_interval)>(unsigned long)ndomod_sink_last_reconnect_warning){ if(reconnect==NDO_TRUE) asprintf(&temp_buffer,"ndomod: Still unable to reconnect to data sink. %lu items lost, %lu queued items to flush.",sinkbuf.overflow,sinkbuf.items); else if(ndomod_sink_connect_attempt==1) asprintf(&temp_buffer,"ndomod: Could not open data sink! I'll keep trying, but some output may get lost..."); else asprintf(&temp_buffer,"ndomod: Still unable to connect to data sink. %lu items lost, %lu queued items to flush.",sinkbuf.overflow,sinkbuf.items); ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); free(temp_buffer); temp_buffer=NULL; ndomod_sink_last_reconnect_warning=current_time; } } } } /* we weren't able to (re)connect */ if(ndomod_sink_is_open==NDO_FALSE){ /***** BUFFER OUTPUT FOR LATER *****/ if(buffer_write==NDO_TRUE) ndomod_sink_buffer_push(&sinkbuf,buf); return NDO_ERROR; } /***** FLUSH BUFFERED DATA FIRST *****/ if(flush_buffer==NDO_TRUE && (items_to_flush=ndomod_sink_buffer_items(&sinkbuf))>0){ while(ndomod_sink_buffer_items(&sinkbuf)>0){ /* get next item from buffer */ sbuf=ndomod_sink_buffer_peek(&sinkbuf); buflen=strlen(sbuf); result=ndo_sink_write(ndomod_sink_fd,sbuf,buflen); /* an error occurred... */ if(result<0){ /* sink problem! */ if(errno!=EAGAIN){ /* close the sink */ ndomod_close_sink(); asprintf(&temp_buffer,"ndomod: Error writing to data sink! Some output may get lost. %lu queued items to flush.",sinkbuf.items); ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); free(temp_buffer); temp_buffer=NULL; time(¤t_time); ndomod_sink_last_reconnect_attempt=current_time; ndomod_sink_last_reconnect_warning=current_time; } /***** BUFFER ORIGINAL OUTPUT FOR LATER *****/ if(buffer_write==NDO_TRUE) ndomod_sink_buffer_push(&sinkbuf,buf); return NDO_ERROR; } /* buffer was written okay, so remove it from buffer */ ndomod_sink_buffer_pop(&sinkbuf); } asprintf(&temp_buffer,"ndomod: Successfully flushed %lu queued items to data sink.",items_to_flush); ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); free(temp_buffer); temp_buffer=NULL; } /***** WRITE ORIGINAL DATA *****/ /* write the data */ buflen=strlen(buf); result=ndo_sink_write(ndomod_sink_fd,buf,buflen); /* an error occurred... */ if(result<0){ /* sink problem! */ if(errno!=EAGAIN){ /* close the sink */ ndomod_close_sink(); time(¤t_time); ndomod_sink_last_reconnect_attempt=current_time; ndomod_sink_last_reconnect_warning=current_time; asprintf(&temp_buffer,"ndomod: Error writing to data sink! Some output may get lost..."); ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); free(temp_buffer); asprintf(&temp_buffer,"ndomod: Please check remote ndo2db log, database connection or SSL Parameters"); ndomod_write_to_logs(temp_buffer,NSLOG_INFO_MESSAGE); free(temp_buffer); temp_buffer=NULL; } /***** BUFFER OUTPUT FOR LATER *****/ if(buffer_write==NDO_TRUE) ndomod_sink_buffer_push(&sinkbuf,buf); return NDO_ERROR; } return NDO_OK; } /* save unprocessed data to buffer file */ int ndomod_save_unprocessed_data(char *f){ FILE *fp=NULL; char *buf=NULL; char *ebuf=NULL; /* no file */ if(f==NULL) return NDO_OK; /* open the file for writing */ if((fp=fopen(f,"w"))==NULL) return NDO_ERROR; /* save all buffered items */ while(ndomod_sink_buffer_items(&sinkbuf)>0){ /* get next item from buffer */ buf=ndomod_sink_buffer_pop(&sinkbuf); /* escape the string */ ebuf=ndo_escape_buffer(buf); /* write string to file */ fputs(ebuf,fp); fputs("\n",fp); /* free memory */ free(buf); buf=NULL; free(ebuf); ebuf=NULL; } fclose(fp); return NDO_OK; } /* load unprocessed data from buffer file */ int ndomod_load_unprocessed_data(char *f){ ndo_mmapfile *thefile=NULL; char *ebuf=NULL; char *buf=NULL; /* open the file */ if((thefile=ndo_mmap_fopen(f))==NULL) return NDO_ERROR; /* process each line of the file */ while((ebuf=ndo_mmap_fgets(thefile))){ /* unescape string */ buf=ndo_unescape_buffer(ebuf); /* save the data to the sink buffer */ ndomod_sink_buffer_push(&sinkbuf,buf); /* free memory */ free(ebuf); } /* close the file */ ndo_mmap_fclose(thefile); /* remove the file so we don't process it again in the future */ unlink(f); return NDO_OK; } /* initializes sink buffer */ int ndomod_sink_buffer_init(ndomod_sink_buffer *sbuf,unsigned long maxitems){ unsigned long x; if(sbuf==NULL || maxitems<=0) return NDO_ERROR; /* allocate memory for the buffer */ if((sbuf->buffer=(char **)malloc(sizeof(char *)*maxitems))){ for(x=0;xbuffer[x]=NULL; } sbuf->size=0L; sbuf->head=0L; sbuf->tail=0L; sbuf->items=0L; sbuf->maxitems=maxitems; sbuf->overflow=0L; return NDO_OK; } /* deinitializes sink buffer */ int ndomod_sink_buffer_deinit(ndomod_sink_buffer *sbuf){ unsigned long x; if(sbuf==NULL) return NDO_ERROR; /* free any allocated memory */ for(x=0;xmaxitems;x++) free(sbuf->buffer[x]); free(sbuf->buffer); sbuf->buffer=NULL; return NDO_OK; } /* buffers output */ int ndomod_sink_buffer_push(ndomod_sink_buffer *sbuf,char *buf){ if(sbuf==NULL || buf==NULL) return NDO_ERROR; /* no space to store buffer */ if(sbuf->buffer==NULL || sbuf->items==sbuf->maxitems){ sbuf->overflow++; return NDO_ERROR; } /* store buffer */ sbuf->buffer[sbuf->head]=strdup(buf); sbuf->head=(sbuf->head+1)%sbuf->maxitems; sbuf->items++; return NDO_OK; } /* gets and removes next item from buffer */ char *ndomod_sink_buffer_pop(ndomod_sink_buffer *sbuf){ char *buf=NULL; if(sbuf==NULL) return NULL; if(sbuf->buffer==NULL) return NULL; if(sbuf->items==0) return NULL; /* remove item from buffer */ buf=sbuf->buffer[sbuf->tail]; sbuf->buffer[sbuf->tail]=NULL; sbuf->tail=(sbuf->tail+1)%sbuf->maxitems; sbuf->items--; return buf; } /* gets next items from buffer */ char *ndomod_sink_buffer_peek(ndomod_sink_buffer *sbuf){ char *buf=NULL; if(sbuf==NULL) return NULL; if(sbuf->buffer==NULL) return NULL; buf=sbuf->buffer[sbuf->tail]; return buf; } /* returns number of items buffered */ int ndomod_sink_buffer_items(ndomod_sink_buffer *sbuf){ if(sbuf==NULL) return 0; else return sbuf->items; } /* gets number of items lost due to buffer overflow */ unsigned long ndomod_sink_buffer_get_overflow(ndomod_sink_buffer *sbuf){ if(sbuf==NULL) return 0; else return sbuf->overflow; } /* sets number of items lost due to buffer overflow */ int ndomod_sink_buffer_set_overflow(ndomod_sink_buffer *sbuf, unsigned long num){ if(sbuf==NULL) return 0; else sbuf->overflow=num; return sbuf->overflow; } /****************************************************************************/ /* CALLBACK FUNCTIONS */ /****************************************************************************/ /* registers for callbacks */ int ndomod_register_callbacks(void){ int priority=0; int result=NDO_OK; if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_PROCESS_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_TIMED_EVENT_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_LOG_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_SYSTEM_COMMAND_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_EVENT_HANDLER_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_NOTIFICATION_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_SERVICE_CHECK_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_HOST_CHECK_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_COMMENT_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_DOWNTIME_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_FLAPPING_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_PROGRAM_STATUS_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_HOST_STATUS_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_SERVICE_STATUS_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_ADAPTIVE_PROGRAM_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_ADAPTIVE_HOST_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_ADAPTIVE_SERVICE_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_EXTERNAL_COMMAND_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_AGGREGATED_STATUS_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_RETENTION_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_CONTACT_NOTIFICATION_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_ACKNOWLEDGEMENT_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_STATE_CHANGE_DATA,ndomod_module_handle,priority,ndomod_broker_data); #ifdef BUILD_NAGIOS_3X if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_CONTACT_STATUS_DATA,ndomod_module_handle,priority,ndomod_broker_data); if(result==NDO_OK) result=neb_register_callback(NEBCALLBACK_ADAPTIVE_CONTACT_DATA,ndomod_module_handle,priority,ndomod_broker_data); #endif return result; } /* deregisters callbacks */ int ndomod_deregister_callbacks(void){ neb_deregister_callback(NEBCALLBACK_PROCESS_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_TIMED_EVENT_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_LOG_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_SYSTEM_COMMAND_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_EVENT_HANDLER_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_NOTIFICATION_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_SERVICE_CHECK_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_HOST_CHECK_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_COMMENT_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_DOWNTIME_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_FLAPPING_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_PROGRAM_STATUS_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_HOST_STATUS_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_SERVICE_STATUS_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_ADAPTIVE_PROGRAM_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_ADAPTIVE_HOST_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_ADAPTIVE_SERVICE_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_EXTERNAL_COMMAND_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_AGGREGATED_STATUS_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_RETENTION_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_CONTACT_NOTIFICATION_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_ACKNOWLEDGEMENT_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_STATE_CHANGE_DATA,ndomod_broker_data); #ifdef BUILD_NAGIOS_3X neb_deregister_callback(NEBCALLBACK_CONTACT_STATUS_DATA,ndomod_broker_data); neb_deregister_callback(NEBCALLBACK_ADAPTIVE_CONTACT_DATA,ndomod_broker_data); #endif return NDO_OK; } /* handles brokered event data */ int ndomod_broker_data(int event_type, void *data){ char temp_buffer[NDOMOD_MAX_BUFLEN]; ndo_dbuf dbuf; int write_to_sink=NDO_TRUE; host *temp_host=NULL; service *temp_service=NULL; #ifdef BUILD_NAGIOS_3X contact *temp_contact=NULL; #endif char *es[9]; int x=0; scheduled_downtime *temp_downtime=NULL; comment *temp_comment=NULL; nebstruct_process_data *procdata=NULL; nebstruct_timed_event_data *eventdata=NULL; nebstruct_log_data *logdata=NULL; nebstruct_system_command_data *cmddata=NULL; nebstruct_event_handler_data *ehanddata=NULL; nebstruct_notification_data *notdata=NULL; nebstruct_service_check_data *scdata=NULL; nebstruct_host_check_data *hcdata=NULL; nebstruct_comment_data *comdata=NULL; nebstruct_downtime_data *downdata=NULL; nebstruct_flapping_data *flapdata=NULL; nebstruct_program_status_data *psdata=NULL; nebstruct_host_status_data *hsdata=NULL; nebstruct_service_status_data *ssdata=NULL; nebstruct_adaptive_program_data *apdata=NULL; nebstruct_adaptive_host_data *ahdata=NULL; nebstruct_adaptive_service_data *asdata=NULL; nebstruct_external_command_data *ecdata=NULL; nebstruct_aggregated_status_data *agsdata=NULL; nebstruct_retention_data *rdata=NULL; nebstruct_contact_notification_data *cnotdata=NULL; nebstruct_contact_notification_method_data *cnotmdata=NULL; nebstruct_acknowledgement_data *ackdata=NULL; nebstruct_statechange_data *schangedata=NULL; #ifdef BUILD_NAGIOS_3X nebstruct_contact_status_data *csdata=NULL; nebstruct_adaptive_contact_data *acdata=NULL; #endif double retry_interval=0.0; int last_state=-1; int last_hard_state=-1; #ifdef BUILD_NAGIOS_3X customvariablesmember *temp_customvar=NULL; #endif if(data==NULL) return 0; /* should we handle this type of data? */ switch(event_type){ case NEBCALLBACK_PROCESS_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_PROCESS_DATA)) return 0; break; case NEBCALLBACK_TIMED_EVENT_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_TIMED_EVENT_DATA)) return 0; break; case NEBCALLBACK_LOG_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_LOG_DATA)) return 0; break; case NEBCALLBACK_SYSTEM_COMMAND_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_SYSTEM_COMMAND_DATA)) return 0; break; case NEBCALLBACK_EVENT_HANDLER_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_EVENT_HANDLER_DATA)) return 0; break; case NEBCALLBACK_NOTIFICATION_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_NOTIFICATION_DATA)) return 0; break; case NEBCALLBACK_SERVICE_CHECK_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_SERVICE_CHECK_DATA)) return 0; break; case NEBCALLBACK_HOST_CHECK_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_HOST_CHECK_DATA)) return 0; break; case NEBCALLBACK_COMMENT_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_COMMENT_DATA)) return 0; break; case NEBCALLBACK_DOWNTIME_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_DOWNTIME_DATA)) return 0; break; case NEBCALLBACK_FLAPPING_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_FLAPPING_DATA)) return 0; break; case NEBCALLBACK_PROGRAM_STATUS_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_PROGRAM_STATUS_DATA)) return 0; break; case NEBCALLBACK_HOST_STATUS_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_HOST_STATUS_DATA)) return 0; break; case NEBCALLBACK_SERVICE_STATUS_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_SERVICE_STATUS_DATA)) return 0; break; #ifdef BUILD_NAGIOS_3X case NEBCALLBACK_CONTACT_STATUS_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_CONTACT_STATUS_DATA)) return 0; break; #endif case NEBCALLBACK_ADAPTIVE_PROGRAM_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_ADAPTIVE_PROGRAM_DATA)) return 0; break; case NEBCALLBACK_ADAPTIVE_HOST_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_ADAPTIVE_HOST_DATA)) return 0; break; case NEBCALLBACK_ADAPTIVE_SERVICE_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_ADAPTIVE_SERVICE_DATA)) return 0; break; #ifdef BUILD_NAGIOS_3X case NEBCALLBACK_ADAPTIVE_CONTACT_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_ADAPTIVE_CONTACT_DATA)) return 0; break; #endif case NEBCALLBACK_EXTERNAL_COMMAND_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_EXTERNAL_COMMAND_DATA)) return 0; break; case NEBCALLBACK_AGGREGATED_STATUS_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_AGGREGATED_STATUS_DATA)) return 0; break; case NEBCALLBACK_RETENTION_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_RETENTION_DATA)) return 0; break; case NEBCALLBACK_CONTACT_NOTIFICATION_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_NOTIFICATION_DATA)) return 0; break; case NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_NOTIFICATION_DATA)) return 0; break; case NEBCALLBACK_ACKNOWLEDGEMENT_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_ACKNOWLEDGEMENT_DATA)) return 0; break; case NEBCALLBACK_STATE_CHANGE_DATA: if(!(ndomod_process_options & NDOMOD_PROCESS_STATECHANGE_DATA)) return 0; break; default: break; } /* initialize escaped buffers */ for(x=0;x<8;x++) es[x]=NULL; /* initialize dynamic buffer (2KB chunk size) */ ndo_dbuf_init(&dbuf,2048); /* handle the event */ switch(event_type){ case NEBCALLBACK_PROCESS_DATA: procdata=(nebstruct_process_data *)data; snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%lu\n%d\n\n" ,NDO_API_PROCESSDATA ,NDO_DATA_TYPE ,procdata->type ,NDO_DATA_FLAGS ,procdata->flags ,NDO_DATA_ATTRIBUTES ,procdata->attr ,NDO_DATA_TIMESTAMP ,procdata->timestamp.tv_sec ,procdata->timestamp.tv_usec ,NDO_DATA_PROGRAMNAME ,"Nagios" ,NDO_DATA_PROGRAMVERSION ,get_program_version() ,NDO_DATA_PROGRAMDATE ,get_program_modification_date() ,NDO_DATA_PROCESSID ,(unsigned long)getpid() ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_TIMED_EVENT_DATA: eventdata=(nebstruct_timed_event_data *)data; switch(eventdata->event_type){ case EVENT_SERVICE_CHECK: temp_service=(service *)eventdata->event_data; es[0]=ndo_escape_buffer(temp_service->host_name); es[1]=ndo_escape_buffer(temp_service->description); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%d\n%d=%lu\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_TIMEDEVENTDATA ,NDO_DATA_TYPE ,eventdata->type ,NDO_DATA_FLAGS ,eventdata->flags ,NDO_DATA_ATTRIBUTES ,eventdata->attr ,NDO_DATA_TIMESTAMP ,eventdata->timestamp.tv_sec ,eventdata->timestamp.tv_usec ,NDO_DATA_EVENTTYPE ,eventdata->event_type ,NDO_DATA_RECURRING ,eventdata->recurring ,NDO_DATA_RUNTIME ,(unsigned long)eventdata->run_time ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_API_ENDDATA ); break; case EVENT_HOST_CHECK: temp_host=(host *)eventdata->event_data; es[0]=ndo_escape_buffer(temp_host->name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%d\n%d=%lu\n%d=%s\n%d\n\n" ,NDO_API_TIMEDEVENTDATA ,NDO_DATA_TYPE ,eventdata->type ,NDO_DATA_FLAGS ,eventdata->flags ,NDO_DATA_ATTRIBUTES ,eventdata->attr ,NDO_DATA_TIMESTAMP ,eventdata->timestamp.tv_sec ,eventdata->timestamp.tv_usec ,NDO_DATA_EVENTTYPE ,eventdata->event_type ,NDO_DATA_RECURRING ,eventdata->recurring ,NDO_DATA_RUNTIME ,(unsigned long)eventdata->run_time ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_API_ENDDATA ); break; case EVENT_SCHEDULED_DOWNTIME: temp_downtime=find_downtime(ANY_DOWNTIME,(unsigned long)eventdata->event_data); if(temp_downtime!=NULL){ es[0]=ndo_escape_buffer(temp_downtime->host_name); es[1]=ndo_escape_buffer(temp_downtime->service_description); } snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%d\n%d=%lu\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_TIMEDEVENTDATA ,NDO_DATA_TYPE ,eventdata->type ,NDO_DATA_FLAGS ,eventdata->flags ,NDO_DATA_ATTRIBUTES ,eventdata->attr ,NDO_DATA_TIMESTAMP ,eventdata->timestamp.tv_sec ,eventdata->timestamp.tv_usec ,NDO_DATA_EVENTTYPE ,eventdata->event_type ,NDO_DATA_RECURRING ,eventdata->recurring ,NDO_DATA_RUNTIME ,(unsigned long)eventdata->run_time ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_API_ENDDATA ); break; default: snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%d\n%d=%lu\n%d\n\n" ,NDO_API_TIMEDEVENTDATA ,NDO_DATA_TYPE ,eventdata->type ,NDO_DATA_FLAGS ,eventdata->flags ,NDO_DATA_ATTRIBUTES ,eventdata->attr ,NDO_DATA_TIMESTAMP ,eventdata->timestamp.tv_sec ,eventdata->timestamp.tv_usec ,NDO_DATA_EVENTTYPE ,eventdata->event_type ,NDO_DATA_RECURRING ,eventdata->recurring ,NDO_DATA_RUNTIME ,(unsigned long)eventdata->run_time ,NDO_API_ENDDATA ); break; } temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_LOG_DATA: logdata=(nebstruct_log_data *)data; snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%lu\n%d=%d\n%d=%s\n%d\n\n" ,NDO_API_LOGDATA ,NDO_DATA_TYPE ,logdata->type ,NDO_DATA_FLAGS ,logdata->flags ,NDO_DATA_ATTRIBUTES ,logdata->attr ,NDO_DATA_TIMESTAMP ,logdata->timestamp.tv_sec ,logdata->timestamp.tv_usec ,NDO_DATA_LOGENTRYTIME ,logdata->entry_time ,NDO_DATA_LOGENTRYTYPE ,logdata->data_type ,NDO_DATA_LOGENTRY ,logdata->data ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_SYSTEM_COMMAND_DATA: cmddata=(nebstruct_system_command_data *)data; es[0]=ndo_escape_buffer(cmddata->command_line); es[1]=ndo_escape_buffer(cmddata->output); es[2]=ndo_escape_buffer(cmddata->output); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%ld.%ld\n%d=%ld.%ld\n%d=%d\n%d=%s\n%d=%d\n%d=%.5lf\n%d=%d\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_SYSTEMCOMMANDDATA ,NDO_DATA_TYPE ,cmddata->type ,NDO_DATA_FLAGS ,cmddata->flags ,NDO_DATA_ATTRIBUTES ,cmddata->attr ,NDO_DATA_TIMESTAMP ,cmddata->timestamp.tv_sec ,cmddata->timestamp.tv_usec ,NDO_DATA_STARTTIME ,cmddata->start_time.tv_sec ,cmddata->start_time.tv_usec ,NDO_DATA_ENDTIME ,cmddata->end_time.tv_sec ,cmddata->end_time.tv_usec ,NDO_DATA_TIMEOUT ,cmddata->timeout ,NDO_DATA_COMMANDLINE ,(es[0]==NULL)?"":es[0] ,NDO_DATA_EARLYTIMEOUT ,cmddata->early_timeout ,NDO_DATA_EXECUTIONTIME ,cmddata->execution_time ,NDO_DATA_RETURNCODE ,cmddata->return_code ,NDO_DATA_OUTPUT ,(es[1]==NULL)?"":es[1] ,NDO_DATA_LONGOUTPUT ,(es[2]==NULL)?"":es[2] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_EVENT_HANDLER_DATA: ehanddata=(nebstruct_event_handler_data *)data; es[0]=ndo_escape_buffer(ehanddata->host_name); es[1]=ndo_escape_buffer(ehanddata->service_description); es[2]=ndo_escape_buffer(ehanddata->command_name); es[3]=ndo_escape_buffer(ehanddata->command_args); es[4]=ndo_escape_buffer(ehanddata->command_line); es[5]=ndo_escape_buffer(ehanddata->output); /* Preparing if eventhandler will have long_output in the future */ es[6]=ndo_escape_buffer(ehanddata->output); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%ld.%ld\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%.5lf\n%d=%d\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_EVENTHANDLERDATA ,NDO_DATA_TYPE ,ehanddata->type ,NDO_DATA_FLAGS ,ehanddata->flags ,NDO_DATA_ATTRIBUTES ,ehanddata->attr ,NDO_DATA_TIMESTAMP ,ehanddata->timestamp.tv_sec ,ehanddata->timestamp.tv_usec ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_STATETYPE ,ehanddata->state_type ,NDO_DATA_STATE ,ehanddata->state ,NDO_DATA_STARTTIME ,ehanddata->start_time.tv_sec ,ehanddata->start_time.tv_usec ,NDO_DATA_ENDTIME ,ehanddata->end_time.tv_sec ,ehanddata->end_time.tv_usec ,NDO_DATA_TIMEOUT ,ehanddata->timeout ,NDO_DATA_COMMANDNAME ,(es[2]==NULL)?"":es[2] ,NDO_DATA_COMMANDARGS ,(es[3]==NULL)?"":es[3] ,NDO_DATA_COMMANDLINE ,(es[4]==NULL)?"":es[4] ,NDO_DATA_EARLYTIMEOUT ,ehanddata->early_timeout ,NDO_DATA_EXECUTIONTIME ,ehanddata->execution_time ,NDO_DATA_RETURNCODE ,ehanddata->return_code ,NDO_DATA_OUTPUT ,(es[5]==NULL)?"":es[5] ,NDO_DATA_LONGOUTPUT ,(es[6]==NULL)?"":es[6] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_NOTIFICATION_DATA: notdata=(nebstruct_notification_data *)data; es[0]=ndo_escape_buffer(notdata->host_name); es[1]=ndo_escape_buffer(notdata->service_description); es[2]=ndo_escape_buffer(notdata->output); /* Preparing if notifications will have long_output in the future */ es[3]=ndo_escape_buffer(notdata->output); es[4]=ndo_escape_buffer(notdata->ack_author); es[5]=ndo_escape_buffer(notdata->ack_data); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%ld.%ld\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d\n\n" ,NDO_API_NOTIFICATIONDATA ,NDO_DATA_TYPE ,notdata->type ,NDO_DATA_FLAGS ,notdata->flags ,NDO_DATA_ATTRIBUTES ,notdata->attr ,NDO_DATA_TIMESTAMP ,notdata->timestamp.tv_sec ,notdata->timestamp.tv_usec ,NDO_DATA_NOTIFICATIONTYPE ,notdata->notification_type ,NDO_DATA_STARTTIME ,notdata->start_time.tv_sec ,notdata->start_time.tv_usec ,NDO_DATA_ENDTIME ,notdata->end_time.tv_sec ,notdata->end_time.tv_usec ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_NOTIFICATIONREASON ,notdata->reason_type ,NDO_DATA_STATE ,notdata->state ,NDO_DATA_OUTPUT ,(es[2]==NULL)?"":es[2] ,NDO_DATA_LONGOUTPUT ,(es[3]==NULL)?"":es[3] ,NDO_DATA_ACKAUTHOR ,(es[4]==NULL)?"":es[4] ,NDO_DATA_ACKDATA ,(es[5]==NULL)?"":es[5] ,NDO_DATA_ESCALATED ,notdata->escalated ,NDO_DATA_CONTACTSNOTIFIED ,notdata->contacts_notified ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_SERVICE_CHECK_DATA: scdata=(nebstruct_service_check_data *)data; es[0]=ndo_escape_buffer(scdata->host_name); es[1]=ndo_escape_buffer(scdata->service_description); es[2]=ndo_escape_buffer(scdata->command_name); es[3]=ndo_escape_buffer(scdata->command_args); es[4]=ndo_escape_buffer(scdata->command_line); es[5]=ndo_escape_buffer(scdata->output); #ifdef BUILD_NAGIOS_3X es[6]=ndo_escape_buffer(scdata->long_output); #endif es[7]=ndo_escape_buffer(scdata->perf_data); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d=%ld.%ld\n%d=%ld.%ld\n%d=%d\n%d=%.5lf\n%d=%.5lf\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_SERVICECHECKDATA ,NDO_DATA_TYPE ,scdata->type ,NDO_DATA_FLAGS ,scdata->flags ,NDO_DATA_ATTRIBUTES ,scdata->attr ,NDO_DATA_TIMESTAMP ,scdata->timestamp.tv_sec ,scdata->timestamp.tv_usec ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_CHECKTYPE ,scdata->check_type ,NDO_DATA_CURRENTCHECKATTEMPT ,scdata->current_attempt ,NDO_DATA_MAXCHECKATTEMPTS ,scdata->max_attempts ,NDO_DATA_STATETYPE ,scdata->state_type ,NDO_DATA_STATE ,scdata->state ,NDO_DATA_TIMEOUT ,scdata->timeout ,NDO_DATA_COMMANDNAME ,(es[2]==NULL)?"":es[2] ,NDO_DATA_COMMANDARGS ,(es[3]==NULL)?"":es[3] ,NDO_DATA_COMMANDLINE ,(es[4]==NULL)?"":es[4] ,NDO_DATA_STARTTIME ,scdata->start_time.tv_sec ,scdata->start_time.tv_usec ,NDO_DATA_ENDTIME ,scdata->end_time.tv_sec ,scdata->end_time.tv_usec ,NDO_DATA_EARLYTIMEOUT ,scdata->early_timeout ,NDO_DATA_EXECUTIONTIME ,scdata->execution_time ,NDO_DATA_LATENCY ,scdata->latency ,NDO_DATA_RETURNCODE ,scdata->return_code ,NDO_DATA_OUTPUT ,(es[5]==NULL)?"":es[5] ,NDO_DATA_LONGOUTPUT ,(es[6]==NULL)?"":es[6] ,NDO_DATA_PERFDATA ,(es[7]==NULL)?"":es[7] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_HOST_CHECK_DATA: hcdata=(nebstruct_host_check_data *)data; es[0]=ndo_escape_buffer(hcdata->host_name); es[1]=ndo_escape_buffer(hcdata->command_name); es[2]=ndo_escape_buffer(hcdata->command_args); es[3]=ndo_escape_buffer(hcdata->command_line); es[4]=ndo_escape_buffer(hcdata->output); #ifdef BUILD_NAGIOS_3X es[5]=ndo_escape_buffer(hcdata->long_output); #endif es[6]=ndo_escape_buffer(hcdata->perf_data); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d=%ld.%ld\n%d=%ld.%ld\n%d=%d\n%d=%.5lf\n%d=%.5lf\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_HOSTCHECKDATA ,NDO_DATA_TYPE ,hcdata->type ,NDO_DATA_FLAGS ,hcdata->flags ,NDO_DATA_ATTRIBUTES ,hcdata->attr ,NDO_DATA_TIMESTAMP ,hcdata->timestamp.tv_sec ,hcdata->timestamp.tv_usec ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_CHECKTYPE ,hcdata->check_type ,NDO_DATA_CURRENTCHECKATTEMPT ,hcdata->current_attempt ,NDO_DATA_MAXCHECKATTEMPTS ,hcdata->max_attempts ,NDO_DATA_STATETYPE ,hcdata->state_type ,NDO_DATA_STATE ,hcdata->state ,NDO_DATA_TIMEOUT ,hcdata->timeout ,NDO_DATA_COMMANDNAME ,(es[1]==NULL)?"":es[1] ,NDO_DATA_COMMANDARGS ,(es[2]==NULL)?"":es[2] ,NDO_DATA_COMMANDLINE ,(es[3]==NULL)?"":es[3] ,NDO_DATA_STARTTIME ,hcdata->start_time.tv_sec ,hcdata->start_time.tv_usec ,NDO_DATA_ENDTIME ,hcdata->end_time.tv_sec ,hcdata->end_time.tv_usec ,NDO_DATA_EARLYTIMEOUT ,hcdata->early_timeout ,NDO_DATA_EXECUTIONTIME ,hcdata->execution_time ,NDO_DATA_LATENCY ,hcdata->latency ,NDO_DATA_RETURNCODE ,hcdata->return_code ,NDO_DATA_OUTPUT ,(es[4]==NULL)?"":es[4] ,NDO_DATA_LONGOUTPUT ,(es[5]==NULL)?"":es[5] ,NDO_DATA_PERFDATA ,(es[6]==NULL)?"":es[6] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_COMMENT_DATA: comdata=(nebstruct_comment_data *)data; es[0]=ndo_escape_buffer(comdata->host_name); es[1]=ndo_escape_buffer(comdata->service_description); es[2]=ndo_escape_buffer(comdata->author_name); es[3]=ndo_escape_buffer(comdata->comment_data); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%s\n%d=%s\n%d=%lu\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lu\n%d=%lu\n%d\n\n" ,NDO_API_COMMENTDATA ,NDO_DATA_TYPE ,comdata->type ,NDO_DATA_FLAGS ,comdata->flags ,NDO_DATA_ATTRIBUTES ,comdata->attr ,NDO_DATA_TIMESTAMP ,comdata->timestamp.tv_sec ,comdata->timestamp.tv_usec ,NDO_DATA_COMMENTTYPE ,comdata->comment_type ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_ENTRYTIME ,(unsigned long)comdata->entry_time ,NDO_DATA_AUTHORNAME ,(es[2]==NULL)?"":es[2] ,NDO_DATA_COMMENT ,(es[3]==NULL)?"":es[3] ,NDO_DATA_PERSISTENT ,comdata->persistent ,NDO_DATA_SOURCE ,comdata->source ,NDO_DATA_ENTRYTYPE ,comdata->entry_type ,NDO_DATA_EXPIRES ,comdata->expires ,NDO_DATA_EXPIRATIONTIME ,(unsigned long)comdata->expire_time ,NDO_DATA_COMMENTID ,comdata->comment_id ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_DOWNTIME_DATA: downdata=(nebstruct_downtime_data *)data; es[0]=ndo_escape_buffer(downdata->host_name); es[1]=ndo_escape_buffer(downdata->service_description); es[2]=ndo_escape_buffer(downdata->author_name); es[3]=ndo_escape_buffer(downdata->comment_data); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%s\n%d=%s\n%d=%lu\n%d=%s\n%d=%s\n%d=%lu\n%d=%lu\n%d=%d\n%d=%lu\n%d=%lu\n%d=%lu\n%d\n\n" ,NDO_API_DOWNTIMEDATA ,NDO_DATA_TYPE ,downdata->type ,NDO_DATA_FLAGS ,downdata->flags ,NDO_DATA_ATTRIBUTES ,downdata->attr ,NDO_DATA_TIMESTAMP ,downdata->timestamp.tv_sec ,downdata->timestamp.tv_usec ,NDO_DATA_DOWNTIMETYPE ,downdata->downtime_type ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_ENTRYTIME ,downdata->entry_time ,NDO_DATA_AUTHORNAME ,(es[2]==NULL)?"":es[2] ,NDO_DATA_COMMENT ,(es[3]==NULL)?"":es[3] ,NDO_DATA_STARTTIME ,(unsigned long)downdata->start_time ,NDO_DATA_ENDTIME ,(unsigned long)downdata->end_time ,NDO_DATA_FIXED ,downdata->fixed ,NDO_DATA_DURATION ,(unsigned long)downdata->duration ,NDO_DATA_TRIGGEREDBY ,(unsigned long)downdata->triggered_by ,NDO_DATA_DOWNTIMEID ,(unsigned long)downdata->downtime_id ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_FLAPPING_DATA: flapdata=(nebstruct_flapping_data *)data; es[0]=ndo_escape_buffer(flapdata->host_name); es[1]=ndo_escape_buffer(flapdata->service_description); if(flapdata->flapping_type==HOST_FLAPPING) temp_comment=find_host_comment(flapdata->comment_id); else temp_comment=find_service_comment(flapdata->comment_id); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%s\n%d=%s\n%d=%.5lf\n%d=%.5lf\n%d=%.5lf\n%d=%lu\n%d=%lu\n%d\n\n" ,NDO_API_FLAPPINGDATA ,NDO_DATA_TYPE ,flapdata->type ,NDO_DATA_FLAGS ,flapdata->flags ,NDO_DATA_ATTRIBUTES ,flapdata->attr ,NDO_DATA_TIMESTAMP ,flapdata->timestamp.tv_sec ,flapdata->timestamp.tv_usec ,NDO_DATA_FLAPPINGTYPE ,flapdata->flapping_type ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_PERCENTSTATECHANGE ,flapdata->percent_change ,NDO_DATA_HIGHTHRESHOLD ,flapdata->high_threshold ,NDO_DATA_LOWTHRESHOLD ,flapdata->low_threshold ,NDO_DATA_COMMENTTIME ,(temp_comment==NULL)?0L:(unsigned long)temp_comment->entry_time ,NDO_DATA_COMMENTID ,flapdata->comment_id ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_PROGRAM_STATUS_DATA: psdata=(nebstruct_program_status_data *)data; es[0]=ndo_escape_buffer(psdata->global_host_event_handler); es[1]=ndo_escape_buffer(psdata->global_service_event_handler); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%lu\n%d=%d\n%d=%d\n%d=%lu\n%d=%lu\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lu\n%d=%lu\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_PROGRAMSTATUSDATA ,NDO_DATA_TYPE ,psdata->type ,NDO_DATA_FLAGS ,psdata->flags ,NDO_DATA_ATTRIBUTES ,psdata->attr ,NDO_DATA_TIMESTAMP ,psdata->timestamp.tv_sec ,psdata->timestamp.tv_usec ,NDO_DATA_PROGRAMSTARTTIME ,(unsigned long)psdata->program_start ,NDO_DATA_PROCESSID ,psdata->pid ,NDO_DATA_DAEMONMODE ,psdata->daemon_mode ,NDO_DATA_LASTCOMMANDCHECK ,(unsigned long)psdata->last_command_check ,NDO_DATA_LASTLOGROTATION ,(unsigned long)psdata->last_log_rotation ,NDO_DATA_NOTIFICATIONSENABLED ,psdata->notifications_enabled ,NDO_DATA_ACTIVESERVICECHECKSENABLED ,psdata->active_service_checks_enabled ,NDO_DATA_PASSIVESERVICECHECKSENABLED ,psdata->passive_service_checks_enabled ,NDO_DATA_ACTIVEHOSTCHECKSENABLED ,psdata->active_host_checks_enabled ,NDO_DATA_PASSIVEHOSTCHECKSENABLED ,psdata->passive_host_checks_enabled ,NDO_DATA_EVENTHANDLERSENABLED ,psdata->event_handlers_enabled ,NDO_DATA_FLAPDETECTIONENABLED ,psdata->flap_detection_enabled ,NDO_DATA_FAILUREPREDICTIONENABLED ,psdata->failure_prediction_enabled ,NDO_DATA_PROCESSPERFORMANCEDATA ,psdata->process_performance_data ,NDO_DATA_OBSESSOVERHOSTS ,psdata->obsess_over_hosts ,NDO_DATA_OBSESSOVERSERVICES ,psdata->obsess_over_services ,NDO_DATA_MODIFIEDHOSTATTRIBUTES ,psdata->modified_host_attributes ,NDO_DATA_MODIFIEDSERVICEATTRIBUTES ,psdata->modified_service_attributes ,NDO_DATA_GLOBALHOSTEVENTHANDLER ,(es[0]==NULL)?"":es[0] ,NDO_DATA_GLOBALSERVICEEVENTHANDLER ,(es[1]==NULL)?"":es[1] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_HOST_STATUS_DATA: hsdata=(nebstruct_host_status_data *)data; if((temp_host=(host *)hsdata->object_ptr)==NULL){ ndo_dbuf_free(&dbuf); return 0; } es[0]=ndo_escape_buffer(temp_host->name); es[1]=ndo_escape_buffer(temp_host->plugin_output); #ifdef BUILD_NAGIOS_3X es[2]=ndo_escape_buffer(temp_host->long_plugin_output); #endif es[3]=ndo_escape_buffer(temp_host->perf_data); es[4]=ndo_escape_buffer(temp_host->event_handler); es[5]=ndo_escape_buffer(temp_host->host_check_command); es[6]=ndo_escape_buffer(temp_host->check_period); #ifdef BUILD_NAGIOS_3X retry_interval=temp_host->retry_interval; #endif #ifdef BUILD_NAGIOS_2X retry_interval=0.0; #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lu\n%d=%lu\n%d=%d\n%d=%lu\n%d=%lu\n%d=%d\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%d\n%d=%lu\n%d=%lu\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%.5lf\n%d=%.5lf\n%d=%.5lf\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lu\n%d=%s\n%d=%s\n%d=%lf\n%d=%lf\n%d=%s\n" ,NDO_API_HOSTSTATUSDATA ,NDO_DATA_TYPE ,hsdata->type ,NDO_DATA_FLAGS ,hsdata->flags ,NDO_DATA_ATTRIBUTES ,hsdata->attr ,NDO_DATA_TIMESTAMP ,hsdata->timestamp.tv_sec ,hsdata->timestamp.tv_usec ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_OUTPUT ,(es[1]==NULL)?"":es[1] ,NDO_DATA_LONGOUTPUT ,(es[2]==NULL)?"":es[2] ,NDO_DATA_PERFDATA ,(es[3]==NULL)?"":es[3] ,NDO_DATA_CURRENTSTATE ,temp_host->current_state ,NDO_DATA_HASBEENCHECKED ,temp_host->has_been_checked ,NDO_DATA_SHOULDBESCHEDULED ,temp_host->should_be_scheduled ,NDO_DATA_CURRENTCHECKATTEMPT ,temp_host->current_attempt ,NDO_DATA_MAXCHECKATTEMPTS ,temp_host->max_attempts ,NDO_DATA_LASTHOSTCHECK ,(unsigned long)temp_host->last_check ,NDO_DATA_NEXTHOSTCHECK ,(unsigned long)temp_host->next_check ,NDO_DATA_CHECKTYPE ,temp_host->check_type ,NDO_DATA_LASTSTATECHANGE ,(unsigned long)temp_host->last_state_change ,NDO_DATA_LASTHARDSTATECHANGE ,(unsigned long)temp_host->last_hard_state_change ,NDO_DATA_LASTHARDSTATE ,temp_host->last_hard_state ,NDO_DATA_LASTTIMEUP ,(unsigned long)temp_host->last_time_up ,NDO_DATA_LASTTIMEDOWN ,(unsigned long)temp_host->last_time_down ,NDO_DATA_LASTTIMEUNREACHABLE ,(unsigned long)temp_host->last_time_unreachable ,NDO_DATA_STATETYPE ,temp_host->state_type ,NDO_DATA_LASTHOSTNOTIFICATION ,(unsigned long)temp_host->last_host_notification ,NDO_DATA_NEXTHOSTNOTIFICATION ,(unsigned long)temp_host->next_host_notification ,NDO_DATA_NOMORENOTIFICATIONS ,temp_host->no_more_notifications ,NDO_DATA_NOTIFICATIONSENABLED ,temp_host->notifications_enabled ,NDO_DATA_PROBLEMHASBEENACKNOWLEDGED ,temp_host->problem_has_been_acknowledged ,NDO_DATA_ACKNOWLEDGEMENTTYPE ,temp_host->acknowledgement_type ,NDO_DATA_CURRENTNOTIFICATIONNUMBER ,temp_host->current_notification_number ,NDO_DATA_PASSIVEHOSTCHECKSENABLED ,temp_host->accept_passive_host_checks ,NDO_DATA_EVENTHANDLERENABLED ,temp_host->event_handler_enabled ,NDO_DATA_ACTIVEHOSTCHECKSENABLED ,temp_host->checks_enabled ,NDO_DATA_FLAPDETECTIONENABLED ,temp_host->flap_detection_enabled ,NDO_DATA_ISFLAPPING ,temp_host->is_flapping ,NDO_DATA_PERCENTSTATECHANGE ,temp_host->percent_state_change ,NDO_DATA_LATENCY ,temp_host->latency ,NDO_DATA_EXECUTIONTIME ,temp_host->execution_time ,NDO_DATA_SCHEDULEDDOWNTIMEDEPTH ,temp_host->scheduled_downtime_depth ,NDO_DATA_FAILUREPREDICTIONENABLED ,temp_host->failure_prediction_enabled ,NDO_DATA_PROCESSPERFORMANCEDATA ,temp_host->process_performance_data ,NDO_DATA_OBSESSOVERHOST ,temp_host->obsess_over_host ,NDO_DATA_MODIFIEDHOSTATTRIBUTES ,temp_host->modified_attributes ,NDO_DATA_EVENTHANDLER ,(es[4]==NULL)?"":es[4] ,NDO_DATA_CHECKCOMMAND ,(es[5]==NULL)?"":es[5] ,NDO_DATA_NORMALCHECKINTERVAL ,(double)temp_host->check_interval ,NDO_DATA_RETRYCHECKINTERVAL ,(double)retry_interval ,NDO_DATA_HOSTCHECKPERIOD ,(es[6]==NULL)?"":es[6] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); #ifdef BUILD_NAGIOS_3X /* dump customvars */ for(temp_customvar=temp_host->custom_variables;temp_customvar!=NULL;temp_customvar=temp_customvar->next){ for(x=0;x<2;x++){ free(es[x]); es[x]=NULL; } es[0]=ndo_escape_buffer(temp_customvar->variable_name); es[1]=ndo_escape_buffer(temp_customvar->variable_value); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s:%d:%s\n" ,NDO_DATA_CUSTOMVARIABLE ,(es[0]==NULL)?"":es[0] ,temp_customvar->has_been_modified ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); } #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_SERVICE_STATUS_DATA: ssdata=(nebstruct_service_status_data *)data; if((temp_service=(service *)ssdata->object_ptr)==NULL){ ndo_dbuf_free(&dbuf); return 0; } es[0]=ndo_escape_buffer(temp_service->host_name); es[1]=ndo_escape_buffer(temp_service->description); es[2]=ndo_escape_buffer(temp_service->plugin_output); #ifdef BUILD_NAGIOS_3X es[3]=ndo_escape_buffer(temp_service->long_plugin_output); #endif es[4]=ndo_escape_buffer(temp_service->perf_data); es[5]=ndo_escape_buffer(temp_service->event_handler); es[6]=ndo_escape_buffer(temp_service->service_check_command); es[7]=ndo_escape_buffer(temp_service->check_period); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lu\n%d=%lu\n%d=%d\n%d=%lu\n%d=%lu\n%d=%d\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%d\n%d=%lu\n%d=%lu\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%.5lf\n%d=%.5lf\n%d=%.5lf\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lu\n%d=%s\n%d=%s\n%d=%lf\n%d=%lf\n%d=%s\n" ,NDO_API_SERVICESTATUSDATA ,NDO_DATA_TYPE ,ssdata->type ,NDO_DATA_FLAGS ,ssdata->flags ,NDO_DATA_ATTRIBUTES ,ssdata->attr ,NDO_DATA_TIMESTAMP ,ssdata->timestamp.tv_sec ,ssdata->timestamp.tv_usec ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_OUTPUT ,(es[2]==NULL)?"":es[2] ,NDO_DATA_LONGOUTPUT ,(es[3]==NULL)?"":es[3] ,NDO_DATA_PERFDATA ,(es[4]==NULL)?"":es[4] ,NDO_DATA_CURRENTSTATE ,temp_service->current_state ,NDO_DATA_HASBEENCHECKED ,temp_service->has_been_checked ,NDO_DATA_SHOULDBESCHEDULED ,temp_service->should_be_scheduled ,NDO_DATA_CURRENTCHECKATTEMPT ,temp_service->current_attempt ,NDO_DATA_MAXCHECKATTEMPTS ,temp_service->max_attempts ,NDO_DATA_LASTSERVICECHECK ,(unsigned long)temp_service->last_check ,NDO_DATA_NEXTSERVICECHECK ,(unsigned long)temp_service->next_check ,NDO_DATA_CHECKTYPE ,temp_service->check_type ,NDO_DATA_LASTSTATECHANGE ,(unsigned long)temp_service->last_state_change ,NDO_DATA_LASTHARDSTATECHANGE ,(unsigned long)temp_service->last_hard_state_change ,NDO_DATA_LASTHARDSTATE ,temp_service->last_hard_state ,NDO_DATA_LASTTIMEOK ,(unsigned long)temp_service->last_time_ok ,NDO_DATA_LASTTIMEWARNING ,(unsigned long)temp_service->last_time_warning ,NDO_DATA_LASTTIMEUNKNOWN ,(unsigned long)temp_service->last_time_unknown ,NDO_DATA_LASTTIMECRITICAL ,(unsigned long)temp_service->last_time_critical ,NDO_DATA_STATETYPE ,temp_service->state_type ,NDO_DATA_LASTSERVICENOTIFICATION ,(unsigned long)temp_service->last_notification ,NDO_DATA_NEXTSERVICENOTIFICATION ,(unsigned long)temp_service->next_notification ,NDO_DATA_NOMORENOTIFICATIONS ,temp_service->no_more_notifications ,NDO_DATA_NOTIFICATIONSENABLED ,temp_service->notifications_enabled ,NDO_DATA_PROBLEMHASBEENACKNOWLEDGED ,temp_service->problem_has_been_acknowledged ,NDO_DATA_ACKNOWLEDGEMENTTYPE ,temp_service->acknowledgement_type ,NDO_DATA_CURRENTNOTIFICATIONNUMBER ,temp_service->current_notification_number ,NDO_DATA_PASSIVESERVICECHECKSENABLED ,temp_service->accept_passive_service_checks ,NDO_DATA_EVENTHANDLERENABLED ,temp_service->event_handler_enabled ,NDO_DATA_ACTIVESERVICECHECKSENABLED ,temp_service->checks_enabled ,NDO_DATA_FLAPDETECTIONENABLED ,temp_service->flap_detection_enabled ,NDO_DATA_ISFLAPPING ,temp_service->is_flapping ,NDO_DATA_PERCENTSTATECHANGE ,temp_service->percent_state_change ,NDO_DATA_LATENCY ,temp_service->latency ,NDO_DATA_EXECUTIONTIME ,temp_service->execution_time ,NDO_DATA_SCHEDULEDDOWNTIMEDEPTH ,temp_service->scheduled_downtime_depth ,NDO_DATA_FAILUREPREDICTIONENABLED ,temp_service->failure_prediction_enabled ,NDO_DATA_PROCESSPERFORMANCEDATA ,temp_service->process_performance_data ,NDO_DATA_OBSESSOVERSERVICE ,temp_service->obsess_over_service ,NDO_DATA_MODIFIEDSERVICEATTRIBUTES ,temp_service->modified_attributes ,NDO_DATA_EVENTHANDLER ,(es[5]==NULL)?"":es[5] ,NDO_DATA_CHECKCOMMAND ,(es[6]==NULL)?"":es[6] ,NDO_DATA_NORMALCHECKINTERVAL ,(double)temp_service->check_interval ,NDO_DATA_RETRYCHECKINTERVAL ,(double)temp_service->retry_interval ,NDO_DATA_SERVICECHECKPERIOD ,(es[7]==NULL)?"":es[7] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); #ifdef BUILD_NAGIOS_3X /* dump customvars */ for(temp_customvar=temp_service->custom_variables;temp_customvar!=NULL;temp_customvar=temp_customvar->next){ for(x=0;x<2;x++){ free(es[x]); es[x]=NULL; } es[0]=ndo_escape_buffer(temp_customvar->variable_name); es[1]=ndo_escape_buffer(temp_customvar->variable_value); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s:%d:%s\n" ,NDO_DATA_CUSTOMVARIABLE ,(es[0]==NULL)?"":es[0] ,temp_customvar->has_been_modified ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); } #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; #ifdef BUILD_NAGIOS_3X case NEBCALLBACK_CONTACT_STATUS_DATA: csdata=(nebstruct_contact_status_data *)data; if((temp_contact=(contact *)csdata->object_ptr)==NULL){ ndo_dbuf_free(&dbuf); return 0; } es[0]=ndo_escape_buffer(temp_contact->name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%s\n%d=%d\n%d=%d\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%lu\n" ,NDO_API_CONTACTSTATUSDATA ,NDO_DATA_TYPE ,csdata->type ,NDO_DATA_FLAGS ,csdata->flags ,NDO_DATA_ATTRIBUTES ,csdata->attr ,NDO_DATA_TIMESTAMP ,csdata->timestamp.tv_sec ,csdata->timestamp.tv_usec ,NDO_DATA_CONTACTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_HOSTNOTIFICATIONSENABLED ,temp_contact->host_notifications_enabled ,NDO_DATA_SERVICENOTIFICATIONSENABLED ,temp_contact->service_notifications_enabled ,NDO_DATA_LASTHOSTNOTIFICATION ,temp_contact->last_host_notification ,NDO_DATA_LASTSERVICENOTIFICATION ,temp_contact->last_service_notification ,NDO_DATA_MODIFIEDCONTACTATTRIBUTES ,temp_contact->modified_attributes ,NDO_DATA_MODIFIEDHOSTATTRIBUTES ,temp_contact->modified_host_attributes ,NDO_DATA_MODIFIEDSERVICEATTRIBUTES ,temp_contact->modified_service_attributes ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); /* dump customvars */ for(temp_customvar=temp_contact->custom_variables;temp_customvar!=NULL;temp_customvar=temp_customvar->next){ for(x=0;x<2;x++){ free(es[x]); es[x]=NULL; } es[0]=ndo_escape_buffer(temp_customvar->variable_name); es[1]=ndo_escape_buffer(temp_customvar->variable_value); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s:%d:%s\n" ,NDO_DATA_CUSTOMVARIABLE ,(es[0]==NULL)?"":es[0] ,temp_customvar->has_been_modified ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); } snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; #endif case NEBCALLBACK_ADAPTIVE_PROGRAM_DATA: apdata=(nebstruct_adaptive_program_data *)data; es[0]=ndo_escape_buffer(global_host_event_handler); es[1]=ndo_escape_buffer(global_service_event_handler); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_ADAPTIVEPROGRAMDATA ,NDO_DATA_TYPE,apdata->type ,NDO_DATA_FLAGS ,apdata->flags ,NDO_DATA_ATTRIBUTES ,apdata->attr ,NDO_DATA_TIMESTAMP ,apdata->timestamp.tv_sec ,apdata->timestamp.tv_usec ,NDO_DATA_COMMANDTYPE ,apdata->command_type ,NDO_DATA_MODIFIEDHOSTATTRIBUTE ,apdata->modified_host_attribute ,NDO_DATA_MODIFIEDHOSTATTRIBUTES ,apdata->modified_host_attributes ,NDO_DATA_MODIFIEDSERVICEATTRIBUTE ,apdata->modified_service_attribute ,NDO_DATA_MODIFIEDSERVICEATTRIBUTES ,apdata->modified_service_attributes ,NDO_DATA_GLOBALHOSTEVENTHANDLER ,(es[0]==NULL)?"":es[0] ,NDO_DATA_GLOBALSERVICEEVENTHANDLER ,(es[1]==NULL)?"":es[1] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_ADAPTIVE_HOST_DATA: ahdata=(nebstruct_adaptive_host_data *)data; if((temp_host=(host *)ahdata->object_ptr)==NULL){ ndo_dbuf_free(&dbuf); return 0; } #ifdef BUILD_NAGIOS_2X retry_interval=0.0; #endif #ifdef BUILD_NAGIOS_3X retry_interval=temp_host->retry_interval; #endif es[0]=ndo_escape_buffer(temp_host->name); es[1]=ndo_escape_buffer(temp_host->event_handler); es[2]=ndo_escape_buffer(temp_host->host_check_command); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%lu\n%d=%lu\n%d=%s\n%d=%s\n%d=%s\n%d=%lf\n%d=%lf\n%d=%d\n%d\n\n" ,NDO_API_ADAPTIVEHOSTDATA ,NDO_DATA_TYPE ,ahdata->type ,NDO_DATA_FLAGS ,ahdata->flags ,NDO_DATA_ATTRIBUTES ,ahdata->attr ,NDO_DATA_TIMESTAMP ,ahdata->timestamp.tv_sec ,ahdata->timestamp.tv_usec ,NDO_DATA_COMMANDTYPE ,ahdata->command_type ,NDO_DATA_MODIFIEDHOSTATTRIBUTE ,ahdata->modified_attribute ,NDO_DATA_MODIFIEDHOSTATTRIBUTES ,ahdata->modified_attributes ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_EVENTHANDLER ,(es[1]==NULL)?"":es[1] ,NDO_DATA_CHECKCOMMAND ,(es[2]==NULL)?"":es[2] ,NDO_DATA_NORMALCHECKINTERVAL ,(double)temp_host->check_interval ,NDO_DATA_RETRYCHECKINTERVAL ,retry_interval ,NDO_DATA_MAXCHECKATTEMPTS ,temp_host->max_attempts ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_ADAPTIVE_SERVICE_DATA: asdata=(nebstruct_adaptive_service_data *)data; if((temp_service=(service *)asdata->object_ptr)==NULL){ ndo_dbuf_free(&dbuf); return 0; } es[0]=ndo_escape_buffer(temp_service->host_name); es[1]=ndo_escape_buffer(temp_service->description); es[2]=ndo_escape_buffer(temp_service->event_handler); es[3]=ndo_escape_buffer(temp_service->service_check_command); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%lu\n%d=%lu\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%lf\n%d=%lf\n%d=%d\n%d\n\n" ,NDO_API_ADAPTIVESERVICEDATA ,NDO_DATA_TYPE ,asdata->type ,NDO_DATA_FLAGS ,asdata->flags ,NDO_DATA_ATTRIBUTES ,asdata->attr ,NDO_DATA_TIMESTAMP ,asdata->timestamp.tv_sec ,asdata->timestamp.tv_usec ,NDO_DATA_COMMANDTYPE ,asdata->command_type ,NDO_DATA_MODIFIEDSERVICEATTRIBUTE ,asdata->modified_attribute ,NDO_DATA_MODIFIEDSERVICEATTRIBUTES ,asdata->modified_attributes ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_EVENTHANDLER ,(es[2]==NULL)?"":es[2] ,NDO_DATA_CHECKCOMMAND ,(es[3]==NULL)?"":es[3] ,NDO_DATA_NORMALCHECKINTERVAL ,(double)temp_service->check_interval ,NDO_DATA_RETRYCHECKINTERVAL ,(double)temp_service->retry_interval ,NDO_DATA_MAXCHECKATTEMPTS ,temp_service->max_attempts ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; #ifdef BUILD_NAGIOS_3X case NEBCALLBACK_ADAPTIVE_CONTACT_DATA: acdata=(nebstruct_adaptive_contact_data *)data; if((temp_contact=(contact *)acdata->object_ptr)==NULL){ ndo_dbuf_free(&dbuf); return 0; } es[0]=ndo_escape_buffer(temp_contact->name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%lu\n%d=%s\n%d=%d\n%d=%d\n%d\n\n" ,NDO_API_ADAPTIVECONTACTDATA ,NDO_DATA_TYPE ,acdata->type ,NDO_DATA_FLAGS ,acdata->flags ,NDO_DATA_ATTRIBUTES ,acdata->attr ,NDO_DATA_TIMESTAMP ,acdata->timestamp.tv_sec ,acdata->timestamp.tv_usec ,NDO_DATA_COMMANDTYPE ,acdata->command_type ,NDO_DATA_MODIFIEDCONTACTATTRIBUTE ,acdata->modified_attribute ,NDO_DATA_MODIFIEDCONTACTATTRIBUTES ,acdata->modified_attributes ,NDO_DATA_MODIFIEDHOSTATTRIBUTE ,acdata->modified_host_attribute ,NDO_DATA_MODIFIEDHOSTATTRIBUTES ,acdata->modified_host_attributes ,NDO_DATA_MODIFIEDSERVICEATTRIBUTE ,acdata->modified_service_attribute ,NDO_DATA_MODIFIEDSERVICEATTRIBUTES ,acdata->modified_service_attributes ,NDO_DATA_CONTACTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_HOSTNOTIFICATIONSENABLED ,temp_contact->host_notifications_enabled ,NDO_DATA_SERVICENOTIFICATIONSENABLED ,temp_contact->service_notifications_enabled ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; #endif case NEBCALLBACK_EXTERNAL_COMMAND_DATA: ecdata=(nebstruct_external_command_data *)data; es[0]=ndo_escape_buffer(ecdata->command_string); es[1]=ndo_escape_buffer(ecdata->command_args); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%lu\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_EXTERNALCOMMANDDATA ,NDO_DATA_TYPE ,ecdata->type ,NDO_DATA_FLAGS ,ecdata->flags ,NDO_DATA_ATTRIBUTES ,ecdata->attr ,NDO_DATA_TIMESTAMP ,ecdata->timestamp.tv_sec ,ecdata->timestamp.tv_usec ,NDO_DATA_COMMANDTYPE ,ecdata->command_type ,NDO_DATA_ENTRYTIME ,(unsigned long)ecdata->entry_time ,NDO_DATA_COMMANDSTRING ,(es[0]==NULL)?"":es[0] ,NDO_DATA_COMMANDARGS ,(es[1]==NULL)?"":es[1] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_AGGREGATED_STATUS_DATA: agsdata=(nebstruct_aggregated_status_data *)data; snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d\n\n" ,NDO_API_AGGREGATEDSTATUSDATA ,NDO_DATA_TYPE ,agsdata->type ,NDO_DATA_FLAGS ,agsdata->flags ,NDO_DATA_ATTRIBUTES ,agsdata->attr ,NDO_DATA_TIMESTAMP ,agsdata->timestamp.tv_sec ,agsdata->timestamp.tv_usec ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_RETENTION_DATA: rdata=(nebstruct_retention_data *)data; snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d\n\n" ,NDO_API_RETENTIONDATA ,NDO_DATA_TYPE ,rdata->type ,NDO_DATA_FLAGS ,rdata->flags ,NDO_DATA_ATTRIBUTES ,rdata->attr ,NDO_DATA_TIMESTAMP ,rdata->timestamp.tv_sec ,rdata->timestamp.tv_usec ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_CONTACT_NOTIFICATION_DATA: cnotdata=(nebstruct_contact_notification_data *)data; es[0]=ndo_escape_buffer(cnotdata->host_name); es[1]=ndo_escape_buffer(cnotdata->service_description); es[2]=ndo_escape_buffer(cnotdata->output); /* Preparing long output for the future */ es[3]=ndo_escape_buffer(cnotdata->output); /* Preparing for long_output in the future */ es[4]=ndo_escape_buffer(cnotdata->output); es[5]=ndo_escape_buffer(cnotdata->ack_author); es[6]=ndo_escape_buffer(cnotdata->ack_data); es[7]=ndo_escape_buffer(cnotdata->contact_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%ld.%ld\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_CONTACTNOTIFICATIONDATA ,NDO_DATA_TYPE ,cnotdata->type ,NDO_DATA_FLAGS ,cnotdata->flags ,NDO_DATA_ATTRIBUTES ,cnotdata->attr ,NDO_DATA_TIMESTAMP ,cnotdata->timestamp.tv_sec ,cnotdata->timestamp.tv_usec ,NDO_DATA_NOTIFICATIONTYPE ,cnotdata->notification_type ,NDO_DATA_STARTTIME ,cnotdata->start_time.tv_sec ,cnotdata->start_time.tv_usec ,NDO_DATA_ENDTIME ,cnotdata->end_time.tv_sec ,cnotdata->end_time.tv_usec ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_CONTACTNAME ,(es[5]==NULL)?"":es[5] ,NDO_DATA_NOTIFICATIONREASON ,cnotdata->reason_type ,NDO_DATA_STATE ,cnotdata->state ,NDO_DATA_OUTPUT ,(es[2]==NULL)?"":es[2] ,NDO_DATA_LONGOUTPUT ,(es[3]==NULL)?"":es[3] ,NDO_DATA_OUTPUT ,(es[4]==NULL)?"":es[4] ,NDO_DATA_ACKAUTHOR ,(es[5]==NULL)?"":es[5] ,NDO_DATA_ACKDATA ,(es[6]==NULL)?"":es[6] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA: cnotmdata=(nebstruct_contact_notification_method_data *)data; es[0]=ndo_escape_buffer(cnotmdata->host_name); es[1]=ndo_escape_buffer(cnotmdata->service_description); es[2]=ndo_escape_buffer(cnotmdata->output); es[3]=ndo_escape_buffer(cnotmdata->ack_author); es[4]=ndo_escape_buffer(cnotmdata->ack_data); es[5]=ndo_escape_buffer(cnotmdata->contact_name); es[6]=ndo_escape_buffer(cnotmdata->command_name); es[7]=ndo_escape_buffer(cnotmdata->command_args); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%ld.%ld\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_CONTACTNOTIFICATIONMETHODDATA ,NDO_DATA_TYPE ,cnotmdata->type ,NDO_DATA_FLAGS ,cnotmdata->flags ,NDO_DATA_ATTRIBUTES ,cnotmdata->attr ,NDO_DATA_TIMESTAMP ,cnotmdata->timestamp.tv_sec ,cnotmdata->timestamp.tv_usec ,NDO_DATA_NOTIFICATIONTYPE ,cnotmdata->notification_type ,NDO_DATA_STARTTIME ,cnotmdata->start_time.tv_sec ,cnotmdata->start_time.tv_usec ,NDO_DATA_ENDTIME ,cnotmdata->end_time.tv_sec ,cnotmdata->end_time.tv_usec ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_CONTACTNAME ,(es[5]==NULL)?"":es[5] ,NDO_DATA_COMMANDNAME ,(es[6]==NULL)?"":es[6] ,NDO_DATA_COMMANDARGS ,(es[7]==NULL)?"":es[7] ,NDO_DATA_NOTIFICATIONREASON ,cnotmdata->reason_type ,NDO_DATA_STATE ,cnotmdata->state ,NDO_DATA_OUTPUT ,(es[2]==NULL)?"":es[2] ,NDO_DATA_ACKAUTHOR ,(es[3]==NULL)?"":es[3] ,NDO_DATA_ACKDATA ,(es[4]==NULL)?"":es[4] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_ACKNOWLEDGEMENT_DATA: ackdata=(nebstruct_acknowledgement_data *)data; es[0]=ndo_escape_buffer(ackdata->host_name); es[1]=ndo_escape_buffer(ackdata->service_description); es[2]=ndo_escape_buffer(ackdata->author_name); es[3]=ndo_escape_buffer(ackdata->comment_data); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d\n\n" ,NDO_API_ACKNOWLEDGEMENTDATA ,NDO_DATA_TYPE ,ackdata->type ,NDO_DATA_FLAGS ,ackdata->flags ,NDO_DATA_ATTRIBUTES ,ackdata->attr ,NDO_DATA_TIMESTAMP ,ackdata->timestamp.tv_sec ,ackdata->timestamp.tv_usec ,NDO_DATA_ACKNOWLEDGEMENTTYPE ,ackdata->acknowledgement_type ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_AUTHORNAME ,(es[2]==NULL)?"":es[2] ,NDO_DATA_COMMENT ,(es[3]==NULL)?"":es[3] ,NDO_DATA_STATE ,ackdata->state ,NDO_DATA_STICKY ,ackdata->is_sticky ,NDO_DATA_PERSISTENT ,ackdata->persistent_comment ,NDO_DATA_NOTIFYCONTACTS ,ackdata->notify_contacts ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; case NEBCALLBACK_STATE_CHANGE_DATA: schangedata=(nebstruct_statechange_data *)data; #ifdef BUILD_NAGIOS_2X /* find host/service and get last state info */ if(schangedata->service_description==NULL){ if((temp_host=find_host(schangedata->host_name))==NULL){ ndo_dbuf_free(&dbuf); return 0; } } else{ if((temp_service=find_service(schangedata->host_name,schangedata->service_description))==NULL){ ndo_dbuf_free(&dbuf); return 0; } last_state=temp_service->last_state; last_hard_state=temp_service->last_hard_state; } #else /* get the last state info */ if(schangedata->service_description==NULL){ if((temp_host=(host *)schangedata->object_ptr)==NULL){ ndo_dbuf_free(&dbuf); return 0; } last_state=temp_host->last_state; last_state=temp_host->last_hard_state; } else{ if((temp_service=(service *)schangedata->object_ptr)==NULL){ ndo_dbuf_free(&dbuf); return 0; } last_state=temp_service->last_state; last_hard_state=temp_service->last_hard_state; } #endif es[0]=ndo_escape_buffer(schangedata->host_name); es[1]=ndo_escape_buffer(schangedata->service_description); es[2]=ndo_escape_buffer(schangedata->output); /* Preparing for long_output in the future */ es[3]=ndo_escape_buffer(schangedata->output); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%d\n%d=%d\n%d=%d\n%d=%ld.%ld\n%d=%d\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_STATECHANGEDATA ,NDO_DATA_TYPE ,schangedata->type ,NDO_DATA_FLAGS ,schangedata->flags ,NDO_DATA_ATTRIBUTES ,schangedata->attr ,NDO_DATA_TIMESTAMP ,schangedata->timestamp.tv_sec ,schangedata->timestamp.tv_usec ,NDO_DATA_STATECHANGETYPE ,schangedata->statechange_type ,NDO_DATA_HOST ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICE ,(es[1]==NULL)?"":es[1] ,NDO_DATA_STATECHANGE ,TRUE ,NDO_DATA_STATE ,schangedata->state ,NDO_DATA_STATETYPE ,schangedata->state_type ,NDO_DATA_CURRENTCHECKATTEMPT ,schangedata->current_attempt ,NDO_DATA_MAXCHECKATTEMPTS ,schangedata->max_attempts ,NDO_DATA_LASTSTATE ,last_state ,NDO_DATA_LASTHARDSTATE ,last_hard_state ,NDO_DATA_OUTPUT ,es[2] ,NDO_DATA_LONGOUTPUT ,es[3] ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); break; default: ndo_dbuf_free(&dbuf); return 0; break; } /* free escaped buffers */ for(x=0;x<8;x++){ free(es[x]); es[x]=NULL; } /* write data to sink */ if(write_to_sink==NDO_TRUE) ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); /* free dynamic buffer */ ndo_dbuf_free(&dbuf); /* POST PROCESSING... */ switch(event_type){ case NEBCALLBACK_PROCESS_DATA: procdata=(nebstruct_process_data *)data; /* process has passed pre-launch config verification, so dump original config */ if(procdata->type==NEBTYPE_PROCESS_START){ ndomod_write_config_files(); ndomod_write_config(NDOMOD_CONFIG_DUMP_ORIGINAL); } /* process is starting the event loop, so dump runtime vars */ if(procdata->type==NEBTYPE_PROCESS_EVENTLOOPSTART){ ndomod_write_runtime_variables(); } break; case NEBCALLBACK_RETENTION_DATA: rdata=(nebstruct_retention_data *)data; /* retained config was just read, so dump it */ if(rdata->type==NEBTYPE_RETENTIONDATA_ENDLOAD) ndomod_write_config(NDOMOD_CONFIG_DUMP_RETAINED); break; default: break; } return 0; } /****************************************************************************/ /* CONFIG OUTPUT FUNCTIONS */ /****************************************************************************/ /* dumps all configuration data to sink */ int ndomod_write_config(int config_type){ char temp_buffer[NDOMOD_MAX_BUFLEN]; struct timeval now; int result; if(!(ndomod_config_output_options & config_type)) return NDO_OK; gettimeofday(&now,NULL); /* record start of config dump */ snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n\n%d:\n%d=%s\n%d=%ld.%ld\n%d\n\n" ,NDO_API_STARTCONFIGDUMP ,NDO_DATA_CONFIGDUMPTYPE ,(config_type==NDOMOD_CONFIG_DUMP_ORIGINAL)?NDO_API_CONFIGDUMP_ORIGINAL:NDO_API_CONFIGDUMP_RETAINED ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndomod_write_to_sink(temp_buffer,NDO_TRUE,NDO_TRUE); /* dump object config info */ result=ndomod_write_object_config(config_type); if(result!=NDO_OK) return result; /* record end of config dump */ snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n\n%d:\n%d=%ld.%ld\n%d\n\n" ,NDO_API_ENDCONFIGDUMP ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndomod_write_to_sink(temp_buffer,NDO_TRUE,NDO_TRUE); return result; } #define OBJECTCONFIG_ES_ITEMS 15 /* dumps object configuration data to sink */ int ndomod_write_object_config(int config_type){ char temp_buffer[NDOMOD_MAX_BUFLEN]; ndo_dbuf dbuf; struct timeval now; int x=0; char *es[OBJECTCONFIG_ES_ITEMS]; command *temp_command=NULL; timeperiod *temp_timeperiod=NULL; timerange *temp_timerange=NULL; contact *temp_contact=NULL; commandsmember *temp_commandsmember=NULL; contactgroup *temp_contactgroup=NULL; host *temp_host=NULL; hostsmember *temp_hostsmember=NULL; contactgroupsmember *temp_contactgroupsmember=NULL; hostgroup *temp_hostgroup=NULL; service *temp_service=NULL; servicegroup *temp_servicegroup=NULL; hostescalation *temp_hostescalation=NULL; serviceescalation *temp_serviceescalation=NULL; hostdependency *temp_hostdependency=NULL; servicedependency *temp_servicedependency=NULL; #ifdef BUILD_NAGIOS_2X hostextinfo *temp_hostextinfo=NULL; serviceextinfo *temp_serviceextinfo=NULL; contactgroupmember *temp_contactgroupmember=NULL; hostgroupmember *temp_hostgroupmember=NULL; servicegroupmember *temp_servicegroupmember=NULL; #endif int have_2d_coords=FALSE; int x_2d=0; int y_2d=0; int have_3d_coords=FALSE; double x_3d=0.0; double y_3d=0.0; double z_3d=0.0; double first_notification_delay=0.0; double retry_interval=0.0; int notify_on_host_downtime=0; int notify_on_service_downtime=0; int host_notifications_enabled=0; int service_notifications_enabled=0; int can_submit_commands=0; int flap_detection_on_up=0; int flap_detection_on_down=0; int flap_detection_on_unreachable=0; int flap_detection_on_ok=0; int flap_detection_on_warning=0; int flap_detection_on_unknown=0; int flap_detection_on_critical=0; #ifdef BUILD_NAGIOS_3X customvariablesmember *temp_customvar=NULL; contactsmember *temp_contactsmember=NULL; servicesmember *temp_servicesmember=NULL; #endif if(!(ndomod_process_options & NDOMOD_PROCESS_OBJECT_CONFIG_DATA)) return NDO_OK; if(!(ndomod_config_output_options & config_type)) return NDO_OK; /* get current time */ gettimeofday(&now,NULL); /* initialize dynamic buffer (2KB chunk size) */ ndo_dbuf_init(&dbuf,2048); /* initialize buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_command->name); es[1]=ndo_escape_buffer(temp_command->command_line); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d\n\n" ,NDO_API_COMMANDDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_COMMANDNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_COMMANDLINE ,(es[1]==NULL)?"":es[1] ,NDO_API_ENDDATA ); /* write data to sink */ temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndomod_write_to_sink(temp_buffer,NDO_TRUE,NDO_TRUE); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_timeperiod->name); es[1]=ndo_escape_buffer(temp_timeperiod->alias); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n" ,NDO_API_TIMEPERIODDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_TIMEPERIODNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_TIMEPERIODALIAS ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); /* dump timeranges for each day */ for(x=0;x<7;x++){ for(temp_timerange=temp_timeperiod->days[x];temp_timerange!=NULL;temp_timerange=temp_timerange->next){ snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%d:%lu-%lu\n" ,NDO_DATA_TIMERANGE ,x ,temp_timerange->range_start ,temp_timerange->range_end ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); } } snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_contact->name); es[1]=ndo_escape_buffer(temp_contact->alias); es[2]=ndo_escape_buffer(temp_contact->email); es[3]=ndo_escape_buffer(temp_contact->pager); es[4]=ndo_escape_buffer(temp_contact->host_notification_period); es[5]=ndo_escape_buffer(temp_contact->service_notification_period); #ifdef BUILD_NAGIOS_3X notify_on_service_downtime=temp_contact->notify_on_service_downtime; notify_on_host_downtime=temp_contact->notify_on_host_downtime; host_notifications_enabled=temp_contact->host_notifications_enabled; service_notifications_enabled=temp_contact->service_notifications_enabled; can_submit_commands=temp_contact->can_submit_commands; #endif #ifdef BUILD_NAGIOS_2X notify_on_service_downtime=0; notify_on_host_downtime=0; host_notifications_enabled=1; service_notifications_enabled=1; can_submit_commands=1; #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n" ,NDO_API_CONTACTDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_CONTACTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_CONTACTALIAS ,(es[1]==NULL)?"":es[1] ,NDO_DATA_EMAILADDRESS ,(es[2]==NULL)?"":es[2] ,NDO_DATA_PAGERADDRESS ,(es[3]==NULL)?"":es[3] ,NDO_DATA_HOSTNOTIFICATIONPERIOD ,(es[4]==NULL)?"":es[4] ,NDO_DATA_SERVICENOTIFICATIONPERIOD ,(es[5]==NULL)?"":es[5] ,NDO_DATA_SERVICENOTIFICATIONSENABLED ,service_notifications_enabled ,NDO_DATA_HOSTNOTIFICATIONSENABLED ,host_notifications_enabled ,NDO_DATA_CANSUBMITCOMMANDS ,can_submit_commands ,NDO_DATA_NOTIFYSERVICEUNKNOWN ,temp_contact->notify_on_service_unknown ,NDO_DATA_NOTIFYSERVICEWARNING ,temp_contact->notify_on_service_warning ,NDO_DATA_NOTIFYSERVICECRITICAL ,temp_contact->notify_on_service_critical ,NDO_DATA_NOTIFYSERVICERECOVERY ,temp_contact->notify_on_service_recovery ,NDO_DATA_NOTIFYSERVICEFLAPPING ,temp_contact->notify_on_service_flapping ,NDO_DATA_NOTIFYSERVICEDOWNTIME ,notify_on_service_downtime ,NDO_DATA_NOTIFYHOSTDOWN ,temp_contact->notify_on_host_down ,NDO_DATA_NOTIFYHOSTUNREACHABLE ,temp_contact->notify_on_host_unreachable ,NDO_DATA_NOTIFYHOSTRECOVERY ,temp_contact->notify_on_host_recovery ,NDO_DATA_NOTIFYHOSTFLAPPING ,temp_contact->notify_on_host_flapping ,NDO_DATA_NOTIFYHOSTDOWNTIME ,notify_on_host_downtime ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; /* dump addresses for each contact */ for(x=0;xaddress[x]); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%d:%s\n" ,NDO_DATA_CONTACTADDRESS ,x+1 ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } /* dump host notification commands for each contact */ for(temp_commandsmember=temp_contact->host_notification_commands;temp_commandsmember!=NULL;temp_commandsmember=temp_commandsmember->next){ es[0]=ndo_escape_buffer(temp_commandsmember->command); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_HOSTNOTIFICATIONCOMMAND ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } /* dump service notification commands for each contact */ for(temp_commandsmember=temp_contact->service_notification_commands;temp_commandsmember!=NULL;temp_commandsmember=temp_commandsmember->next){ es[0]=ndo_escape_buffer(temp_commandsmember->command); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_SERVICENOTIFICATIONCOMMAND ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } #ifdef BUILD_NAGIOS_3X /* dump customvars */ for(temp_customvar=temp_contact->custom_variables;temp_customvar!=NULL;temp_customvar=temp_customvar->next){ es[0]=ndo_escape_buffer(temp_customvar->variable_name); es[1]=ndo_escape_buffer(temp_customvar->variable_value); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s:%d:%s\n" ,NDO_DATA_CUSTOMVARIABLE ,(es[0]==NULL)?"":es[0] ,temp_customvar->has_been_modified ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); for(x=0;x<2;x++){ free(es[x]); es[x]=NULL; } } #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_contactgroup->group_name); es[1]=ndo_escape_buffer(temp_contactgroup->alias); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n" ,NDO_API_CONTACTGROUPDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_CONTACTGROUPNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_CONTACTGROUPALIAS ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; /* dump members for each contactgroup */ #ifdef BUILD_NAGIOS_2X for(temp_contactgroupmember=temp_contactgroup->members;temp_contactgroupmember!=NULL;temp_contactgroupmember=temp_contactgroupmember->next) #else for(temp_contactsmember=temp_contactgroup->members;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next) #endif { #ifdef BUILD_NAGIOS_2X es[0]=ndo_escape_buffer(temp_contactgroupmember->contact_name); #else es[0]=ndo_escape_buffer(temp_contactsmember->contact_name); #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACTGROUPMEMBER ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_host->name); es[1]=ndo_escape_buffer(temp_host->alias); es[2]=ndo_escape_buffer(temp_host->address); es[3]=ndo_escape_buffer(temp_host->host_check_command); es[4]=ndo_escape_buffer(temp_host->event_handler); es[5]=ndo_escape_buffer(temp_host->notification_period); es[6]=ndo_escape_buffer(temp_host->check_period); es[7]=ndo_escape_buffer(temp_host->failure_prediction_options); #ifdef BUILD_NAGIOS_3X es[7]=ndo_escape_buffer(temp_host->notes); es[8]=ndo_escape_buffer(temp_host->notes_url); es[9]=ndo_escape_buffer(temp_host->action_url); es[10]=ndo_escape_buffer(temp_host->icon_image); es[11]=ndo_escape_buffer(temp_host->icon_image_alt); es[12]=ndo_escape_buffer(temp_host->vrml_image); es[13]=ndo_escape_buffer(temp_host->statusmap_image); have_2d_coords=temp_host->have_2d_coords; x_2d=temp_host->x_2d; y_2d=temp_host->y_2d; have_3d_coords=temp_host->have_3d_coords; x_3d=temp_host->x_3d; y_3d=temp_host->y_3d; z_3d=temp_host->z_3d; first_notification_delay=temp_host->first_notification_delay; retry_interval=temp_host->retry_interval; notify_on_host_downtime=temp_host->notify_on_downtime; flap_detection_on_up=temp_host->flap_detection_on_up; flap_detection_on_down=temp_host->flap_detection_on_down; flap_detection_on_unreachable=temp_host->flap_detection_on_unreachable; es[14]=ndo_escape_buffer(temp_host->display_name); #endif #ifdef BUILD_NAGIOS_2X if((temp_hostextinfo=find_hostextinfo(temp_host->name))!=NULL){ es[7]=ndo_escape_buffer(temp_hostextinfo->notes); es[8]=ndo_escape_buffer(temp_hostextinfo->notes_url); es[9]=ndo_escape_buffer(temp_hostextinfo->action_url); es[10]=ndo_escape_buffer(temp_hostextinfo->icon_image); es[11]=ndo_escape_buffer(temp_hostextinfo->icon_image_alt); es[12]=ndo_escape_buffer(temp_hostextinfo->vrml_image); es[13]=ndo_escape_buffer(temp_hostextinfo->statusmap_image); have_2d_coords=temp_hostextinfo->have_2d_coords; x_2d=temp_hostextinfo->x_2d; y_2d=temp_hostextinfo->y_2d; have_3d_coords=temp_hostextinfo->have_3d_coords; x_3d=temp_hostextinfo->x_3d; y_3d=temp_hostextinfo->y_3d; z_3d=temp_hostextinfo->z_3d; } else{ es[7]=NULL; es[8]=NULL; es[9]=NULL; es[10]=NULL; es[11]=NULL; es[12]=NULL; es[13]=NULL; have_2d_coords=FALSE; x_2d=0; y_2d=0; have_3d_coords=FALSE; x_3d=0.0; y_3d=0.0; z_3d=0.0; } first_notification_delay=0.0; retry_interval=0.0; notify_on_host_downtime=0; flap_detection_on_up=1; flap_detection_on_down=1; flap_detection_on_unreachable=1; es[14]=ndo_escape_buffer(temp_host->name); #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%lf\n%d=%lf\n%d=%d\n%d=%lf\n%d=%lf\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lf\n%d=%lf\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lf\n%d=%lf\n%d=%lf\n" ,NDO_API_HOSTDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_HOSTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_DISPLAYNAME ,(es[14]==NULL)?"":es[14] ,NDO_DATA_HOSTALIAS ,(es[1]==NULL)?"":es[1] ,NDO_DATA_HOSTADDRESS ,(es[2]==NULL)?"":es[2] ,NDO_DATA_HOSTCHECKCOMMAND ,(es[3]==NULL)?"":es[3] ,NDO_DATA_HOSTEVENTHANDLER ,(es[4]==NULL)?"":es[4] ,NDO_DATA_HOSTNOTIFICATIONPERIOD ,(es[5]==NULL)?"":es[5] ,NDO_DATA_HOSTCHECKPERIOD ,(es[6]==NULL)?"":es[6] ,NDO_DATA_HOSTFAILUREPREDICTIONOPTIONS ,(es[7]==NULL)?"":es[7] ,NDO_DATA_HOSTCHECKINTERVAL ,(double)temp_host->check_interval ,NDO_DATA_HOSTRETRYINTERVAL ,(double)retry_interval ,NDO_DATA_HOSTMAXCHECKATTEMPTS ,temp_host->max_attempts ,NDO_DATA_FIRSTNOTIFICATIONDELAY ,first_notification_delay ,NDO_DATA_HOSTNOTIFICATIONINTERVAL ,(double)temp_host->notification_interval ,NDO_DATA_NOTIFYHOSTDOWN ,temp_host->notify_on_down ,NDO_DATA_NOTIFYHOSTUNREACHABLE ,temp_host->notify_on_unreachable ,NDO_DATA_NOTIFYHOSTRECOVERY ,temp_host->notify_on_recovery ,NDO_DATA_NOTIFYHOSTFLAPPING ,temp_host->notify_on_flapping ,NDO_DATA_NOTIFYHOSTDOWNTIME ,notify_on_host_downtime ,NDO_DATA_HOSTFLAPDETECTIONENABLED ,temp_host->flap_detection_enabled ,NDO_DATA_FLAPDETECTIONONUP ,flap_detection_on_up ,NDO_DATA_FLAPDETECTIONONDOWN ,flap_detection_on_down ,NDO_DATA_FLAPDETECTIONONUNREACHABLE ,flap_detection_on_unreachable ,NDO_DATA_LOWHOSTFLAPTHRESHOLD ,temp_host->low_flap_threshold ,NDO_DATA_HIGHHOSTFLAPTHRESHOLD ,temp_host->high_flap_threshold ,NDO_DATA_STALKHOSTONUP ,temp_host->stalk_on_up ,NDO_DATA_STALKHOSTONDOWN ,temp_host->stalk_on_down ,NDO_DATA_STALKHOSTONUNREACHABLE ,temp_host->stalk_on_unreachable ,NDO_DATA_HOSTFRESHNESSCHECKSENABLED ,temp_host->check_freshness ,NDO_DATA_HOSTFRESHNESSTHRESHOLD ,temp_host->freshness_threshold ,NDO_DATA_PROCESSHOSTPERFORMANCEDATA ,temp_host->process_performance_data ,NDO_DATA_ACTIVEHOSTCHECKSENABLED ,temp_host->checks_enabled ,NDO_DATA_PASSIVEHOSTCHECKSENABLED ,temp_host->accept_passive_host_checks ,NDO_DATA_HOSTEVENTHANDLERENABLED ,temp_host->event_handler_enabled ,NDO_DATA_RETAINHOSTSTATUSINFORMATION ,temp_host->retain_status_information ,NDO_DATA_RETAINHOSTNONSTATUSINFORMATION ,temp_host->retain_nonstatus_information ,NDO_DATA_HOSTNOTIFICATIONSENABLED ,temp_host->notifications_enabled ,NDO_DATA_HOSTFAILUREPREDICTIONENABLED ,temp_host->failure_prediction_enabled ,NDO_DATA_OBSESSOVERHOST ,temp_host->obsess_over_host ,NDO_DATA_NOTES ,(es[7]==NULL)?"":es[7] ,NDO_DATA_NOTESURL ,(es[8]==NULL)?"":es[8] ,NDO_DATA_ACTIONURL ,(es[9]==NULL)?"":es[9] ,NDO_DATA_ICONIMAGE ,(es[10]==NULL)?"":es[10] ,NDO_DATA_ICONIMAGEALT ,(es[11]==NULL)?"":es[11] ,NDO_DATA_VRMLIMAGE ,(es[12]==NULL)?"":es[12] ,NDO_DATA_STATUSMAPIMAGE ,(es[13]==NULL)?"":es[13] ,NDO_DATA_HAVE2DCOORDS ,have_2d_coords ,NDO_DATA_X2D ,x_2d ,NDO_DATA_Y2D ,y_2d ,NDO_DATA_HAVE3DCOORDS ,have_3d_coords ,NDO_DATA_X3D ,x_3d ,NDO_DATA_Y3D ,y_3d ,NDO_DATA_Z3D ,z_3d ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; /* dump parent hosts */ for(temp_hostsmember=temp_host->parent_hosts;temp_hostsmember!=NULL;temp_hostsmember=temp_hostsmember->next){ es[0]=ndo_escape_buffer(temp_hostsmember->host_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_PARENTHOST ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } /* dump contactgroups */ for(temp_contactgroupsmember=temp_host->contact_groups;temp_contactgroupsmember!=NULL;temp_contactgroupsmember=temp_contactgroupsmember->next){ es[0]=ndo_escape_buffer(temp_contactgroupsmember->group_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACTGROUP ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } /* dump individual contacts (not supported in Nagios 2.x) */ #ifndef BUILD_NAGIOS_2X for(temp_contactsmember=temp_host->contacts;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){ es[0]=ndo_escape_buffer(temp_contactsmember->contact_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACT ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } #endif #ifdef BUILD_NAGIOS_3X /* dump customvars */ for(temp_customvar=temp_host->custom_variables;temp_customvar!=NULL;temp_customvar=temp_customvar->next){ es[0]=ndo_escape_buffer(temp_customvar->variable_name); es[1]=ndo_escape_buffer(temp_customvar->variable_value); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s:%d:%s\n" ,NDO_DATA_CUSTOMVARIABLE ,(es[0]==NULL)?"":es[0] ,temp_customvar->has_been_modified ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); for(x=0;x<2;x++){ free(es[x]); es[x]=NULL; } } #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_hostgroup->group_name); es[1]=ndo_escape_buffer(temp_hostgroup->alias); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n" ,NDO_API_HOSTGROUPDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_HOSTGROUPNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_HOSTGROUPALIAS ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; /* dump members for each hostgroup */ #ifdef BUILD_NAGIOS_2X for(temp_hostgroupmember=temp_hostgroup->members;temp_hostgroupmember!=NULL;temp_hostgroupmember=temp_hostgroupmember->next) #else for(temp_hostsmember=temp_hostgroup->members;temp_hostsmember!=NULL;temp_hostsmember=temp_hostsmember->next) #endif { #ifdef BUILD_NAGIOS_2X es[0]=ndo_escape_buffer(temp_hostgroupmember->host_name); #else es[0]=ndo_escape_buffer(temp_hostsmember->host_name); #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_HOSTGROUPMEMBER ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_service->host_name); es[1]=ndo_escape_buffer(temp_service->description); es[2]=ndo_escape_buffer(temp_service->service_check_command); es[3]=ndo_escape_buffer(temp_service->event_handler); es[4]=ndo_escape_buffer(temp_service->notification_period); es[5]=ndo_escape_buffer(temp_service->check_period); es[6]=ndo_escape_buffer(temp_service->failure_prediction_options); #ifdef BUILD_NAGIOS_3X es[7]=ndo_escape_buffer(temp_service->notes); es[8]=ndo_escape_buffer(temp_service->notes_url); es[9]=ndo_escape_buffer(temp_service->action_url); es[10]=ndo_escape_buffer(temp_service->icon_image); es[11]=ndo_escape_buffer(temp_service->icon_image_alt); first_notification_delay=temp_service->first_notification_delay; notify_on_service_downtime=temp_service->notify_on_downtime; flap_detection_on_ok=temp_service->flap_detection_on_ok; flap_detection_on_warning=temp_service->flap_detection_on_warning; flap_detection_on_unknown=temp_service->flap_detection_on_unknown; flap_detection_on_critical=temp_service->flap_detection_on_critical; es[12]=ndo_escape_buffer(temp_service->display_name); #endif #ifdef BUILD_NAGIOS_2X if((temp_serviceextinfo=find_serviceextinfo(temp_service->host_name,temp_service->description))!=NULL){ es[7]=ndo_escape_buffer(temp_serviceextinfo->notes); es[8]=ndo_escape_buffer(temp_serviceextinfo->notes_url); es[9]=ndo_escape_buffer(temp_serviceextinfo->action_url); es[10]=ndo_escape_buffer(temp_serviceextinfo->icon_image); es[11]=ndo_escape_buffer(temp_serviceextinfo->icon_image_alt); } else{ es[7]=NULL; es[8]=NULL; es[9]=NULL; es[10]=NULL; es[11]=NULL; } first_notification_delay=0.0; notify_on_service_downtime=0; flap_detection_on_ok=1; flap_detection_on_warning=1; flap_detection_on_unknown=1; flap_detection_on_critical=1; es[12]=ndo_escape_buffer(temp_service->description); #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%lf\n%d=%lf\n%d=%d\n%d=%lf\n%d=%lf\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%lf\n%d=%lf\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n" ,NDO_API_SERVICEDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_HOSTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_DISPLAYNAME ,(es[12]==NULL)?"":es[12] ,NDO_DATA_SERVICEDESCRIPTION ,(es[1]==NULL)?"":es[1] ,NDO_DATA_SERVICECHECKCOMMAND ,(es[2]==NULL)?"":es[2] ,NDO_DATA_SERVICEEVENTHANDLER ,(es[3]==NULL)?"":es[3] ,NDO_DATA_SERVICENOTIFICATIONPERIOD ,(es[4]==NULL)?"":es[4] ,NDO_DATA_SERVICECHECKPERIOD ,(es[5]==NULL)?"":es[5] ,NDO_DATA_SERVICEFAILUREPREDICTIONOPTIONS ,(es[6]==NULL)?"":es[6] ,NDO_DATA_SERVICECHECKINTERVAL ,(double)temp_service->check_interval ,NDO_DATA_SERVICERETRYINTERVAL ,(double)temp_service->retry_interval ,NDO_DATA_MAXSERVICECHECKATTEMPTS ,temp_service->max_attempts ,NDO_DATA_FIRSTNOTIFICATIONDELAY ,first_notification_delay ,NDO_DATA_SERVICENOTIFICATIONINTERVAL ,(double)temp_service->notification_interval ,NDO_DATA_NOTIFYSERVICEUNKNOWN ,temp_service->notify_on_unknown ,NDO_DATA_NOTIFYSERVICEWARNING ,temp_service->notify_on_warning ,NDO_DATA_NOTIFYSERVICECRITICAL ,temp_service->notify_on_critical ,NDO_DATA_NOTIFYSERVICERECOVERY ,temp_service->notify_on_recovery ,NDO_DATA_NOTIFYSERVICEFLAPPING ,temp_service->notify_on_flapping ,NDO_DATA_NOTIFYSERVICEDOWNTIME ,notify_on_service_downtime ,NDO_DATA_STALKSERVICEONOK ,temp_service->stalk_on_ok ,NDO_DATA_STALKSERVICEONWARNING ,temp_service->stalk_on_warning ,NDO_DATA_STALKSERVICEONUNKNOWN ,temp_service->stalk_on_unknown ,NDO_DATA_STALKSERVICEONCRITICAL ,temp_service->stalk_on_critical ,NDO_DATA_SERVICEISVOLATILE ,temp_service->is_volatile ,NDO_DATA_SERVICEFLAPDETECTIONENABLED ,temp_service->flap_detection_enabled ,NDO_DATA_FLAPDETECTIONONOK ,flap_detection_on_ok ,NDO_DATA_FLAPDETECTIONONWARNING ,flap_detection_on_warning ,NDO_DATA_FLAPDETECTIONONUNKNOWN ,flap_detection_on_unknown ,NDO_DATA_FLAPDETECTIONONCRITICAL ,flap_detection_on_critical ,NDO_DATA_LOWSERVICEFLAPTHRESHOLD ,temp_service->low_flap_threshold ,NDO_DATA_HIGHSERVICEFLAPTHRESHOLD ,temp_service->high_flap_threshold ,NDO_DATA_PROCESSSERVICEPERFORMANCEDATA ,temp_service->process_performance_data ,NDO_DATA_SERVICEFRESHNESSCHECKSENABLED ,temp_service->check_freshness ,NDO_DATA_SERVICEFRESHNESSTHRESHOLD ,temp_service->freshness_threshold ,NDO_DATA_PASSIVESERVICECHECKSENABLED ,temp_service->accept_passive_service_checks ,NDO_DATA_SERVICEEVENTHANDLERENABLED ,temp_service->event_handler_enabled ,NDO_DATA_ACTIVESERVICECHECKSENABLED ,temp_service->checks_enabled ,NDO_DATA_RETAINSERVICESTATUSINFORMATION ,temp_service->retain_status_information ,NDO_DATA_RETAINSERVICENONSTATUSINFORMATION ,temp_service->retain_nonstatus_information ,NDO_DATA_SERVICENOTIFICATIONSENABLED ,temp_service->notifications_enabled ,NDO_DATA_OBSESSOVERSERVICE ,temp_service->obsess_over_service ,NDO_DATA_SERVICEFAILUREPREDICTIONENABLED ,temp_service->failure_prediction_enabled ,NDO_DATA_NOTES ,(es[7]==NULL)?"":es[7] ,NDO_DATA_NOTESURL ,(es[8]==NULL)?"":es[8] ,NDO_DATA_ACTIONURL ,(es[9]==NULL)?"":es[9] ,NDO_DATA_ICONIMAGE ,(es[10]==NULL)?"":es[10] ,NDO_DATA_ICONIMAGEALT ,(es[11]==NULL)?"":es[11] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; /* dump contactgroups */ for(temp_contactgroupsmember=temp_service->contact_groups;temp_contactgroupsmember!=NULL;temp_contactgroupsmember=temp_contactgroupsmember->next){ es[0]=ndo_escape_buffer(temp_contactgroupsmember->group_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACTGROUP ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } /* dump individual contacts (not supported in Nagios 2.x) */ #ifndef BUILD_NAGIOS_2X for(temp_contactsmember=temp_service->contacts;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){ es[0]=ndo_escape_buffer(temp_contactsmember->contact_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACT ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } #endif #ifdef BUILD_NAGIOS_3X /* dump customvars */ for(temp_customvar=temp_service->custom_variables;temp_customvar!=NULL;temp_customvar=temp_customvar->next){ es[0]=ndo_escape_buffer(temp_customvar->variable_name); es[1]=ndo_escape_buffer(temp_customvar->variable_value); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s:%d:%s\n" ,NDO_DATA_CUSTOMVARIABLE ,(es[0]==NULL)?"":es[0] ,temp_customvar->has_been_modified ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); for(x=0;x<2;x++){ free(es[x]); es[x]=NULL; } } #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_servicegroup->group_name); es[1]=ndo_escape_buffer(temp_servicegroup->alias); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n" ,NDO_API_SERVICEGROUPDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_SERVICEGROUPNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICEGROUPALIAS ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); free(es[1]); es[0]=NULL; es[1]=NULL; /* dump members for each servicegroup */ #ifdef BUILD_NAGIOS_2X for(temp_servicegroupmember=temp_servicegroup->members;temp_servicegroupmember!=NULL;temp_servicegroupmember=temp_servicegroupmember->next) #else for(temp_servicesmember=temp_servicegroup->members;temp_servicesmember!=NULL;temp_servicesmember=temp_servicesmember->next) #endif { #ifdef BUILD_NAGIOS_2X es[0]=ndo_escape_buffer(temp_servicegroupmember->host_name); es[1]=ndo_escape_buffer(temp_servicegroupmember->service_description); #else es[0]=ndo_escape_buffer(temp_servicesmember->host_name); es[1]=ndo_escape_buffer(temp_servicesmember->service_description); #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s;%s\n" ,NDO_DATA_SERVICEGROUPMEMBER ,(es[0]==NULL)?"":es[0] ,(es[1]==NULL)?"":es[1] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); free(es[1]); es[0]=NULL; es[1]=NULL; } snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_hostescalation->host_name); es[1]=ndo_escape_buffer(temp_hostescalation->escalation_period); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%lf\n%d=%d\n%d=%d\n%d=%d\n" ,NDO_API_HOSTESCALATIONDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_HOSTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_ESCALATIONPERIOD ,(es[1]==NULL)?"":es[1] ,NDO_DATA_FIRSTNOTIFICATION ,temp_hostescalation->first_notification ,NDO_DATA_LASTNOTIFICATION ,temp_hostescalation->last_notification ,NDO_DATA_NOTIFICATIONINTERVAL ,(double)temp_hostescalation->notification_interval ,NDO_DATA_ESCALATEONRECOVERY ,temp_hostescalation->escalate_on_recovery ,NDO_DATA_ESCALATEONDOWN ,temp_hostescalation->escalate_on_down ,NDO_DATA_ESCALATEONUNREACHABLE ,temp_hostescalation->escalate_on_unreachable ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; /* dump contactgroups */ for(temp_contactgroupsmember=temp_hostescalation->contact_groups;temp_contactgroupsmember!=NULL;temp_contactgroupsmember=temp_contactgroupsmember->next){ es[0]=ndo_escape_buffer(temp_contactgroupsmember->group_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACTGROUP ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } /* dump individual contacts (not supported in Nagios 2.x) */ #ifndef BUILD_NAGIOS_2X for(temp_contactsmember=temp_hostescalation->contacts;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){ es[0]=ndo_escape_buffer(temp_contactsmember->contact_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACT ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_serviceescalation->host_name); es[1]=ndo_escape_buffer(temp_serviceescalation->description); es[2]=ndo_escape_buffer(temp_serviceescalation->escalation_period); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%lf\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n" ,NDO_API_SERVICEESCALATIONDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_HOSTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICEDESCRIPTION ,(es[1]==NULL)?"":es[1] ,NDO_DATA_ESCALATIONPERIOD ,(es[2]==NULL)?"":es[2] ,NDO_DATA_FIRSTNOTIFICATION ,temp_serviceescalation->first_notification ,NDO_DATA_LASTNOTIFICATION ,temp_serviceescalation->last_notification ,NDO_DATA_NOTIFICATIONINTERVAL ,(double)temp_serviceescalation->notification_interval ,NDO_DATA_ESCALATEONRECOVERY ,temp_serviceescalation->escalate_on_recovery ,NDO_DATA_ESCALATEONWARNING ,temp_serviceescalation->escalate_on_warning ,NDO_DATA_ESCALATEONUNKNOWN ,temp_serviceescalation->escalate_on_unknown ,NDO_DATA_ESCALATEONCRITICAL ,temp_serviceescalation->escalate_on_critical ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; /* dump contactgroups */ for(temp_contactgroupsmember=temp_serviceescalation->contact_groups;temp_contactgroupsmember!=NULL;temp_contactgroupsmember=temp_contactgroupsmember->next){ es[0]=ndo_escape_buffer(temp_contactgroupsmember->group_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACTGROUP ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } /* dump individual contacts (not supported in Nagios 2.x) */ #ifndef BUILD_NAGIOS_2X for(temp_contactsmember=temp_serviceescalation->contacts;temp_contactsmember!=NULL;temp_contactsmember=temp_contactsmember->next){ es[0]=ndo_escape_buffer(temp_contactsmember->contact_name); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d=%s\n" ,NDO_DATA_CONTACT ,(es[0]==NULL)?"":es[0] ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); free(es[0]); es[0]=NULL; } #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_hostdependency->host_name); es[1]=ndo_escape_buffer(temp_hostdependency->dependent_host_name); #ifdef BUILD_NAGIOS_3X es[2]=ndo_escape_buffer(temp_hostdependency->dependency_period); #endif #ifdef BUILD_NAGIOS_2X es[2]=NULL; #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n" ,NDO_API_HOSTDEPENDENCYDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_HOSTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_DEPENDENTHOSTNAME ,(es[1]==NULL)?"":es[1] ,NDO_DATA_DEPENDENCYTYPE ,temp_hostdependency->dependency_type ,NDO_DATA_INHERITSPARENT ,temp_hostdependency->inherits_parent ,NDO_DATA_DEPENDENCYPERIOD ,(es[2]==NULL)?"":es[2] ,NDO_DATA_FAILONUP ,temp_hostdependency->fail_on_up ,NDO_DATA_FAILONDOWN ,temp_hostdependency->fail_on_down ,NDO_DATA_FAILONUNREACHABLE ,temp_hostdependency->fail_on_unreachable ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xnext){ es[0]=ndo_escape_buffer(temp_servicedependency->host_name); es[1]=ndo_escape_buffer(temp_servicedependency->service_description); es[2]=ndo_escape_buffer(temp_servicedependency->dependent_host_name); es[3]=ndo_escape_buffer(temp_servicedependency->dependent_service_description); #ifdef BUILD_NAGIOS_3X es[4]=ndo_escape_buffer(temp_servicedependency->dependency_period); #endif #ifdef BUILD_NAGIOS_2X es[4]=NULL; #endif snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"\n%d:\n%d=%ld.%ld\n%d=%s\n%d=%s\n%d=%s\n%d=%s\n%d=%d\n%d=%d\n%d=%s\n%d=%d\n%d=%d\n%d=%d\n%d=%d\n" ,NDO_API_SERVICEDEPENDENCYDEFINITION ,NDO_DATA_TIMESTAMP ,now.tv_sec ,now.tv_usec ,NDO_DATA_HOSTNAME ,(es[0]==NULL)?"":es[0] ,NDO_DATA_SERVICEDESCRIPTION ,(es[1]==NULL)?"":es[1] ,NDO_DATA_DEPENDENTHOSTNAME ,(es[2]==NULL)?"":es[2] ,NDO_DATA_DEPENDENTSERVICEDESCRIPTION ,(es[3]==NULL)?"":es[3] ,NDO_DATA_DEPENDENCYTYPE ,temp_servicedependency->dependency_type ,NDO_DATA_INHERITSPARENT ,temp_servicedependency->inherits_parent ,NDO_DATA_DEPENDENCYPERIOD ,(es[4]==NULL)?"":es[4] ,NDO_DATA_FAILONOK ,temp_servicedependency->fail_on_ok ,NDO_DATA_FAILONWARNING ,temp_servicedependency->fail_on_warning ,NDO_DATA_FAILONUNKNOWN ,temp_servicedependency->fail_on_unknown ,NDO_DATA_FAILONCRITICAL ,temp_servicedependency->fail_on_critical ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); snprintf(temp_buffer,sizeof(temp_buffer)-1 ,"%d\n\n" ,NDO_API_ENDDATA ); temp_buffer[sizeof(temp_buffer)-1]='\x0'; ndo_dbuf_strcat(&dbuf,temp_buffer); ndomod_write_to_sink(dbuf.buf,NDO_TRUE,NDO_TRUE); ndo_dbuf_free(&dbuf); } /* free buffers */ for(x=0;xbuf=NULL; db->used_size=0L; db->allocated_size=0L; db->chunk_size=chunk_size; return NDO_OK; } /* frees a dynamic buffer */ int ndo_dbuf_free(ndo_dbuf *db){ if(db==NULL) return NDO_ERROR; if(db->buf!=NULL) free(db->buf); db->buf=NULL; db->used_size=0L; db->allocated_size=0L; return NDO_OK; } /* dynamically expands a string */ int ndo_dbuf_strcat(ndo_dbuf *db, char *buf){ char *newbuf=NULL; unsigned long buflen=0L; unsigned long new_size=0L; unsigned long memory_needed=0L; if(db==NULL || buf==NULL) return NDO_ERROR; /* how much memory should we allocate (if any)? */ buflen=strlen(buf); new_size=db->used_size+buflen+1; /* we need more memory */ if(db->allocated_sizechunk_size)+1)*db->chunk_size); /* allocate memory to store old and new string */ if((newbuf=(char *)realloc((void *)db->buf,(size_t)memory_needed))==NULL) return NDO_ERROR; /* update buffer pointer */ db->buf=newbuf; /* update allocated size */ db->allocated_size=memory_needed; /* terminate buffer */ db->buf[db->used_size]='\x0'; } /* append the new string */ strcat(db->buf,buf); /* update size allocated */ db->used_size+=buflen; return NDO_OK; } /******************************************************************/ /************************* FILE FUNCTIONS *************************/ /******************************************************************/ /* renames a file - works across filesystems (Mike Wiacek) */ int my_rename(char *source, char *dest){ char buffer[1024]={0}; int rename_result=0; int source_fd=-1; int dest_fd=-1; int bytes_read=0; /* make sure we have something */ if(source==NULL || dest==NULL) return -1; /* first see if we can rename file with standard function */ rename_result=rename(source,dest); /* handle any errors... */ if(rename_result==-1){ /* an error occurred because the source and dest files are on different filesystems */ if(errno==EXDEV){ /* open destination file for writing */ if((dest_fd=open(dest,O_WRONLY|O_TRUNC|O_CREAT|O_APPEND,0644))>0){ /* open source file for reading */ if((source_fd=open(source,O_RDONLY,0644))>0){ while((bytes_read=read(source_fd,buffer,sizeof(buffer)))>0) write(dest_fd,buffer,bytes_read); close(source_fd); close(dest_fd); /* delete the original file */ unlink(source); /* reset result since we successfully copied file */ rename_result=0; } else{ close(dest_fd); return rename_result; } } } else{ return rename_result; } } return rename_result; } /******************************************************************/ /************************ STRING FUNCTIONS ************************/ /******************************************************************/ /* strip newline, carriage return, and tab characters from beginning and end of a string */ void ndomod_strip(char *buffer){ register int x=0; register int y=0; register int z=0; if(buffer==NULL || buffer[0]=='\x0') return; /* strip end of string */ y=(int)strlen(buffer); for(x=y-1;x>=0;x--){ if(buffer[x]==' ' || buffer[x]=='\n' || buffer[x]=='\r' || buffer[x]=='\t' || buffer[x]==13) buffer[x]='\x0'; else break; } /* save last position for later... */ z=x; /* strip beginning of string (by shifting) */ for(x=0;;x++){ if(buffer[x]==' ' || buffer[x]=='\n' || buffer[x]=='\r' || buffer[x]=='\t' || buffer[x]==13) continue; else break; } if(x>0){ /* new length of the string after we stripped the end */ y=z+1; /* shift chars towards beginning of string to remove leading whitespace */ for(z=x;zpath=strdup(filename);*/ new_mmapfile->path=NULL; new_mmapfile->fd=fd; new_mmapfile->file_size=(unsigned long)(statbuf.st_size); new_mmapfile->current_position=0L; new_mmapfile->current_line=0L; new_mmapfile->mmap_buf=mmap_buf; return new_mmapfile; } /* close a file originally opened via mmap() */ int ndo_mmap_fclose(ndo_mmapfile *temp_mmapfile){ if(temp_mmapfile==NULL) return NDO_ERROR; /* un-mmap() the file */ munmap(temp_mmapfile->mmap_buf,temp_mmapfile->file_size); /* close the file */ close(temp_mmapfile->fd); /* free memory */ if(temp_mmapfile->path!=NULL) free(temp_mmapfile->path); free(temp_mmapfile); return NDO_OK; } /* gets one line of input from an mmap()'ed file */ char *ndo_mmap_fgets(ndo_mmapfile *temp_mmapfile){ char *buf=NULL; unsigned long x=0L; int len=0; if(temp_mmapfile==NULL) return NULL; /* we've reached the end of the file */ if(temp_mmapfile->current_position>=temp_mmapfile->file_size) return NULL; /* find the end of the string (or buffer) */ for(x=temp_mmapfile->current_position;xfile_size;x++){ if(*((char *)(temp_mmapfile->mmap_buf)+x)=='\n'){ x++; break; } } /* calculate length of line we just read */ len=(int)(x-temp_mmapfile->current_position); /* allocate memory for the new line */ if((buf=(char *)malloc(len+1))==NULL) return NULL; /* copy string to newly allocated memory and terminate the string */ memcpy(buf,((char *)(temp_mmapfile->mmap_buf)+temp_mmapfile->current_position),len); buf[len]='\x0'; /* update the current position */ temp_mmapfile->current_position=x; /* increment the current line */ temp_mmapfile->current_line++; return buf; } /**************************************************************/ /****** SOCKET FUNCTIONS **************************************/ /**************************************************************/ /* opens data sink */ int ndo_sink_open(char *name, int fd, int type, int port, int flags, int *nfd){ struct sockaddr_un server_address_u; struct sockaddr_in server_address_i; struct hostent *hp=NULL; mode_t mode=S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; int newfd=0; int rc=0; /* use file */ if(type==NDO_SINK_FILE){ if((newfd=open(name,flags,mode))==-1) return NDO_ERROR; } /* use existing file descriptor */ else if(type==NDO_SINK_FD){ if(fd<0) return NDO_ERROR; else newfd=fd; } /* we are sending output to a unix domain socket */ else if(type==NDO_SINK_UNIXSOCKET){ if(name==NULL) return NDO_ERROR; /* create a socket */ if(!(newfd=socket(PF_UNIX,SOCK_STREAM,0))) return NDO_ERROR; /* copy the socket address/path */ strncpy(server_address_u.sun_path,name,sizeof(server_address_u.sun_path)); server_address_u.sun_family=AF_UNIX; /* connect to the socket */ if((connect(newfd,(struct sockaddr *)&server_address_u,SUN_LEN(&server_address_u)))){ close(newfd); return NDO_ERROR; } } /* we are sending output to a TCP socket */ else if(type==NDO_SINK_TCPSOCKET){ if(name==NULL) return NDO_ERROR; #ifdef HAVE_SSL if(use_ssl==NDO_TRUE){ SSL_library_init(); SSLeay_add_ssl_algorithms(); meth=SSLv23_client_method(); SSL_load_error_strings(); if((ctx=SSL_CTX_new(meth))==NULL){ printf("NDOUtils: Error - could not create SSL context.\n"); return NDO_ERROR; } /* ADDED 01/19/2004 */ /* use only TLSv1 protocol */ SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3); } #endif /* clear the address */ bzero((char *)&server_address_i,sizeof(server_address_i)); /* try to bypass using a DNS lookup if this is just an IP address */ if(!ndo_inet_aton(name,&server_address_i.sin_addr)){ /* else do a DNS lookup */ if((hp=gethostbyname((const char *)name))==NULL) return NDO_ERROR; memcpy(&server_address_i.sin_addr,hp->h_addr,hp->h_length); } /* create a socket */ if(!(newfd=socket(PF_INET,SOCK_STREAM,0))) return NDO_ERROR; /* copy the host/ip address and port */ server_address_i.sin_family=AF_INET; server_address_i.sin_port=htons(port); /* connect to the socket */ if((connect(newfd,(struct sockaddr *)&server_address_i,sizeof(server_address_i)))){ close(newfd); return NDO_ERROR; } #ifdef HAVE_SSL if(use_ssl==NDO_TRUE){ if((ssl=SSL_new(ctx))!=NULL){ SSL_CTX_set_cipher_list(ctx,"ADH"); SSL_set_fd(ssl,newfd); if((rc=SSL_connect(ssl))!=1){ printf("Error - Could not complete SSL handshake.\n"); SSL_CTX_free(ctx); close(newfd); return NDO_ERROR; } } else { printf("NDOUtils: Error - Could not create SSL connection structure.\n"); return NDO_ERROR; } } #endif } /* unknown sink type */ else return NDO_ERROR; /* save the new file descriptor */ *nfd=newfd; return NDO_OK; } /* writes to data sink */ int ndo_sink_write(int fd, char *buf, int buflen){ int tbytes=0; int result=0; if(buf==NULL) return NDO_ERROR; if(buflen<=0) return 0; while(tbytes=parts+3) return (0); *pp++=val; c=*++cp; } else break; } /* Check for trailing characters */ if(c!='\0' && (!isascii((int)c) || !isspace((int)c))) return (0); /* Concoct the address according to the number of parts specified */ n=pp-parts+1; switch(n){ case 0: return (0); /* initial nondigit */ case 1: /* a -- 32 bits */ break; case 2: /* a.b -- 8.24 bits */ if(val>0xffffff) return (0); val|=parts[0]<<24; break; case 3: /* a.b.c -- 8.8.16 bits */ if(val>0xffff) return (0); val|=(parts[0]<< 24) | (parts[1]<<16); break; case 4: /* a.b.c.d -- 8.8.8.8 bits */ if(val>0xff) return (0); val|=(parts[0]<<24) | (parts[1]<<16) | (parts[2]<<8); break; } if(addr) addr->s_addr=htonl(val); return (1); } /******************************************************************/ /************************ STRING FUNCTIONS ************************/ /******************************************************************/ /* strip newline and carriage return characters from end of a string */ void ndo_strip_buffer(char *buffer){ register int x; register int y; if(buffer==NULL || buffer[0]=='\x0') return; /* strip end of string */ y=(int)strlen(buffer); for(x=y-1;x>=0;x--){ if(buffer[x]=='\n' || buffer[x]=='\r' || buffer[x]==13) buffer[x]='\x0'; else break; } return; } /* escape special characters in string */ char *ndo_escape_buffer(char *buffer){ char *newbuf; register int x=0; register int y=0; register int len=0; if(buffer==NULL) return NULL; /* allocate memory for escaped string */ if((newbuf=(char *)malloc((strlen(buffer)*2)+1))==NULL) return NULL; /* initialize string */ newbuf[0]='\x0'; len=(int)strlen(buffer); for(x=0;x\n",argv[0]); printf("\n"); printf("Creates a UNIX domain socket with name , waits for a\n"); printf("client to connect and then prints all received data to stdout.\n"); printf("Only one client connection is processed at any given time.\n"); exit(1); } /* initialize signal handling */ signal(SIGQUIT,sighandler); signal(SIGTERM,sighandler); signal(SIGINT,sighandler); socketname=strdup(argv[1]); if(socketname==NULL){ perror("Could not dup socket name"); exit(1); } /* create a socket */ if(!(sd=socket(AF_UNIX,SOCK_STREAM,0))){ perror("Cannot create socket"); exit(1); } /* bind the socket */ strncpy(server_address.sun_path,socketname,sizeof(server_address.sun_path)); server_address.sun_family=AF_UNIX; if((bind(sd,(struct sockaddr *)&server_address,SUN_LEN(&server_address)))){ perror("Could not bind socket"); exit(1); } /* listen for connections */ if((listen(sd,1))){ perror("Cannot listen on socket"); cleanup_socket(sd,socketname); exit(1); } client_address_length=(socklen_t)sizeof(client_address); /* accept connections... */ while(1){ if((new_sd=accept(sd,(struct sockaddr *)&client_address,(socklen_t *)&client_address_length))<0){ perror("Accept error"); cleanup_socket(sd,socketname); exit(1); } #ifdef HANDLE_MULTI /* fork... */ pid=fork(); switch(pid){ case -1: perror("Fork error"); cleanup_socket(sd,socketname); exit(1); break; case 0: /* print all data from socket to the screen */ while((read(new_sd,buf,sizeof(buf)))){ printf("%c",buf[0]); } exit(0); break; default: close(new_sd); break; } #else /* print all data from socket to the screen */ while((read(new_sd,buf,sizeof(buf)))){ printf("%c",buf[0]); } close(new_sd); #endif } /* cleanup after ourselves */ cleanup_socket(sd,socketname); return 0; } int cleanup_socket(int s, char *f){ /* close the socket */ shutdown(s,2); close(s); /* unlink the file */ unlink(f); return 0; } void sighandler(int sig){ /* close the socket */ shutdown(sd,2); close(sd); /* unlink the file */ unlink(socketname); exit(0); return; } ndoutils-1.4b9/src/file2sock.c0000644000175100017510000001245511271525175016377 0ustar baeckerhbaeckerh/*************************************************************** * FILE2SOCK.c - File to Socket Dump Utility * * Copyright (c) 2009 Nagios Core Development Team and Community Contributors * Copyright (c) 20052-2009 Ethan Galstad * License: GPL v2 * * First Written: 05-13-2005 * Last Modified: 10-27-2009 * **************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/io.h" #define FILE2SOCK_VERSION "1.4b9" #define FILE2SOCK_NAME "FILE2SOCK" #define FILE2SOCK_DATE "10-27-2009" int process_arguments(int,char **); char *source_name=NULL; char *dest_name=NULL; int socket_type=NDO_SINK_UNIXSOCKET; int tcp_port=0; int show_version=NDO_FALSE; int show_license=NDO_FALSE; int show_help=NDO_FALSE; int main(int argc, char **argv){ int sd=0; int fd=0; char ch[511]; /* Matches ndo2db read buffer size */ int result=0; int nbytesread,n,i; char *p; result=process_arguments(argc,argv); if(result!=NDO_OK || show_help==NDO_TRUE || show_license==NDO_TRUE || show_version==NDO_TRUE){ if(result!=NDO_OK) printf("Incorrect command line arguments supplied\n"); printf("\n"); printf("%s %s\n",FILE2SOCK_NAME,FILE2SOCK_VERSION); printf("Copyright (c) 2009 Nagios Core Development Team and Community Contributors\n"); printf("Copyright (c) 2005-2007 Ethan Galstad\n"); printf("Last Modified: %s\n",FILE2SOCK_DATE); printf("License: GPL v2\n"); printf("\n"); printf("Sends the contents of a file to a TCP or UNIX domain socket. The contents of\n"); printf("the file are sent in their original format - no conversion, encapsulation, or\n"); printf("other processing is done before sending the contents to the destination socket.\n"); printf("\n"); printf("Usage: %s -s -d [-t ] [-p ]\n",argv[0]); printf("\n"); printf(" = Name of the file to read from. Use '-' to read from stdin.\n"); printf(" = If destination is a TCP socket, the address/hostname to connect to.\n"); printf(" If destination is a Unix domain socket, the path to the socket.\n"); printf(" = Specifies the type of destination socket. Valid values include:\n"); printf(" tcp\n"); printf(" unix (default)\n"); printf(" = Port number to connect to if destination is TCP socket.\n"); printf("\n"); exit(1); } /* open the source file for reading */ if(!strcmp(source_name,"-")) fd=STDIN_FILENO; else if((fd=open(source_name,O_RDONLY))==-1){ perror("Unable to open source file for reading"); exit(1); } /* open data sink */ if(ndo_sink_open(dest_name,sd,socket_type,tcp_port,0,&sd)==NDO_ERROR){ perror("Cannot open destination socket"); close(fd); exit(1); } /* we're reading from stdin... */ #ifdef USE_SENDFILE if(fd==STDIN_FILENO){ #endif while((nbytesread = read(fd,&ch,sizeof(ch))) > 0){ p = &ch[0]; n = nbytesread; while (n > 0) { i = write(sd, p, n); if(i < 0){ perror("Error while writing to destination socket"); result=1; goto breakout; } p += i; n -= i; } } breakout: #ifdef USE_SENDFILE } /* we're reading from a standard file... */ else{ /* get file size info */ if(fstat(fd,&stat_buf)==-1){ perror("fstat() error"); result=1; } /* send the file contents to the socket */ else if(sendfile(sd,fd,&offset,stat_buf.st_size)==-1){ perror("sendfile() error"); result=1; } } #endif /* close the data sink */ ndo_sink_flush(sd); ndo_sink_close(sd); /* close the source file */ close(fd); return result; } /* process command line arguments */ int process_arguments(int argc, char **argv){ char optchars[32]; int c=1; #ifdef HAVE_GETOPT_H int option_index=0; static struct option long_options[]={ {"source", required_argument, 0, 's'}, {"dest", required_argument, 0, 'd'}, {"type", required_argument, 0, 't'}, {"port", required_argument, 0, 'p'}, {"help", no_argument, 0, 'h'}, {"license", no_argument, 0, 'l'}, {"version", no_argument, 0, 'V'}, {0, 0, 0, 0} }; #endif /* no options were supplied */ if(argc<2){ show_help=NDO_TRUE; return NDO_OK; } snprintf(optchars,sizeof(optchars),"s:d:t:p:hlV"); while(1){ #ifdef HAVE_GETOPT_H c=getopt_long(argc,argv,optchars,long_options,&option_index); #else c=getopt(argc,argv,optchars); #endif if(c==-1 || c==EOF) break; /* process all arguments */ switch(c){ case '?': case 'h': show_help=NDO_TRUE; break; case 'V': show_version=NDO_TRUE; break; case 'l': show_license=NDO_TRUE; break; case 't': if(!strcmp(optarg,"tcp")) socket_type=NDO_SINK_TCPSOCKET; else if(!strcmp(optarg,"unix")) socket_type=NDO_SINK_UNIXSOCKET; else return NDO_ERROR; break; case 'p': tcp_port=atoi(optarg); if(tcp_port<=0) return NDO_ERROR; break; case 's': source_name=strdup(optarg); break; case 'd': dest_name=strdup(optarg); break; default: return NDO_ERROR; break; } } /* make sure required args were supplied */ if((source_name==NULL || dest_name==NULL) && show_help==NDO_FALSE && show_version==NDO_FALSE && show_license==NDO_FALSE) return NDO_ERROR; return NDO_OK; } ndoutils-1.4b9/src/log2ndo.c0000644000175100017510000001517411271525175016063 0ustar baeckerhbaeckerh/*************************************************************** * LOG2NDO.C - Sends archived logs files to NDO2DB daemon * * Copyright (c) 2009 Nagios Core Development Team and Community Contributors * Copyright (c) 2005-2009 Ethan Galstad * * Last Modified: 10-27-2009 * **************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/io.h" #include "../include/protoapi.h" #define LOG2NDO_VERSION "1.4b9" #define LOG2NDO_NAME "LOG2NDO" #define LOG2NDO_DATE "10-27-2009" int process_arguments(int,char **); char *source_name=NULL; char *dest_name=NULL; char *instance_name=NULL; int socket_type=NDO_SINK_UNIXSOCKET; int tcp_port=0; int show_version=NDO_FALSE; int show_license=NDO_FALSE; int show_help=NDO_FALSE; int main(int argc, char **argv){ ndo_mmapfile *thefile=NULL; char *connection_type=NULL; char *input=NULL; char *input2=NULL; int sd=2; char tempbuf[1024]; int result=0; result=process_arguments(argc,argv); if(result!=NDO_OK || show_help==NDO_TRUE || show_license==NDO_TRUE || show_version==NDO_TRUE){ if(result!=NDO_OK) printf("Incorrect command line arguments supplied\n"); printf("\n"); printf("%s %s\n",LOG2NDO_NAME,LOG2NDO_VERSION); printf("Copyright (c) 2009 Nagios Core Development Team and Community Contributors\n"); printf("Copyright (c) 2005-2007 Ethan Galstad\n"); printf("Last Mofieid: %s\n",LOG2NDO_DATE); printf("License: GPL v2\n"); printf("\n"); printf("Sends the contents of an archived Nagios or NetSaint log file to STDOUT,\n"); printf("a TCP socket, or a Unix domain socket in a format that is understood by the\n"); printf("NDO2DB daemon.\n"); printf("\n"); printf("Usage: %s -s -d -i [-t ] [-p ]\n",argv[0]); printf("\n"); printf(" = Name of the Nagios/NetSaint log file to read from.\n"); printf(" = If destination is a TCP socket, the address/hostname to connect to.\n"); printf(" If destination is a Unix domain socket, the path to the socket.\n"); printf(" If destination is STDOUT (for redirection, etc), a single dash (-).\n"); printf(" = Specifies the type of destination socket. Valid values include:\n"); printf(" tcp\n"); printf(" unix (default)\n"); printf(" = Port number to connect to if destination is TCP socket.\n"); printf("\n"); exit(1); } /* send output to STDOUT rather than a socket */ if(!strcmp(dest_name,"-")){ sd=STDOUT_FILENO; socket_type=NDO_SINK_FD; } /* open the file for reading */ if((thefile=ndo_mmap_fopen(source_name))==NULL){ perror("Unable to open source file for reading"); exit(1); } /* open the destination */ if(ndo_sink_open(dest_name,sd,socket_type,tcp_port,0,&sd)==NDO_ERROR){ ndo_mmap_fclose(thefile); exit(1); } /***** SEND HEADER INFORMATION *****/ /* get the connection type string */ if(socket_type==NDO_SINK_FD || socket_type==NDO_SINK_FILE) connection_type=NDO_API_CONNECTION_FILE; else if(socket_type==NDO_SINK_TCPSOCKET) connection_type=NDO_API_CONNECTION_TCPSOCKET; else connection_type=NDO_API_CONNECTION_UNIXSOCKET; snprintf(tempbuf,sizeof(tempbuf)-1 ,"%s\n%s: %d\n%s: %s\n%s: %s\n%s: %lu\n%s: %s\n%s: %s\n%s: %s\n%s: %s\n%s\n\n" ,NDO_API_HELLO ,NDO_API_PROTOCOL ,NDO_API_PROTOVERSION ,NDO_API_AGENT ,LOG2NDO_NAME ,NDO_API_AGENTVERSION ,LOG2NDO_VERSION ,NDO_API_STARTTIME ,(unsigned long)time(NULL) ,NDO_API_DISPOSITION ,NDO_API_DISPOSITION_ARCHIVED ,NDO_API_CONNECTION ,connection_type ,NDO_API_CONNECTTYPE ,NDO_API_CONNECTTYPE_INITIAL ,NDO_API_INSTANCENAME ,(instance_name==NULL)?"default":instance_name ,NDO_API_STARTDATADUMP ); tempbuf[sizeof(tempbuf)-1]='\x0'; ndo_sink_write(sd,tempbuf,strlen(tempbuf)); /***** SEND THE LOG CONTENTS *****/ while((input=ndo_mmap_fgets(thefile))){ /* strip and escape log entry */ ndo_strip_buffer(input); if((input2=ndo_escape_buffer(input))==NULL){ free(input); input2=NULL; continue; } /* write log entry header */ snprintf(tempbuf,sizeof(tempbuf)-1 ,"%d:\n%d=%s\n%d\n\n" ,NDO_API_LOGENTRY ,NDO_DATA_LOGENTRY ,input2 ,NDO_API_ENDDATA ); tempbuf[sizeof(tempbuf)-1]='\x0'; ndo_sink_write(sd,tempbuf,strlen(tempbuf)); /* free allocated memory */ free(input); free(input2); input=NULL; input2=NULL; } /***** SAY GOODBYE *****/ snprintf(tempbuf,sizeof(tempbuf)-1,"\n%d\n%s: %lu\n%s\n" ,NDO_API_ENDDATADUMP ,NDO_API_ENDTIME ,(unsigned long)time(NULL) ,NDO_API_GOODBYE ); tempbuf[sizeof(tempbuf)-1]='\x0'; ndo_sink_write(sd,tempbuf,strlen(tempbuf)); /* close the destination */ ndo_sink_flush(sd); ndo_sink_close(sd); /* close the file */ ndo_mmap_fclose(thefile); return 0; } /* process command line arguments */ int process_arguments(int argc, char **argv){ char optchars[32]; int c=1; #ifdef HAVE_GETOPT_H int option_index=0; static struct option long_options[]={ {"source", required_argument, 0, 's'}, {"dest", required_argument, 0, 'd'}, {"instance", required_argument, 0, 'i'}, {"type", required_argument, 0, 't'}, {"port", required_argument, 0, 'p'}, {"help", no_argument, 0, 'h'}, {"license", no_argument, 0, 'l'}, {"version", no_argument, 0, 'V'}, {0, 0, 0, 0} }; #endif /* no options were supplied */ if(argc<2){ show_help=NDO_TRUE; return NDO_OK; } snprintf(optchars,sizeof(optchars),"s:d:i:t:p:hlV"); while(1){ #ifdef HAVE_GETOPT_H c=getopt_long(argc,argv,optchars,long_options,&option_index); #else c=getopt(argc,argv,optchars); #endif if(c==-1 || c==EOF) break; /* process all arguments */ switch(c){ case '?': case 'h': show_help=NDO_TRUE; break; case 'V': show_version=NDO_TRUE; break; case 'l': show_license=NDO_TRUE; break; case 't': if(!strcmp(optarg,"tcp")) socket_type=NDO_SINK_TCPSOCKET; else if(!strcmp(optarg,"unix")) socket_type=NDO_SINK_UNIXSOCKET; else return NDO_ERROR; break; case 'p': tcp_port=atoi(optarg); if(tcp_port<=0) return NDO_ERROR; break; case 's': source_name=strdup(optarg); break; case 'd': dest_name=strdup(optarg); break; case 'i': instance_name=strdup(optarg); break; default: return NDO_ERROR; break; } } /* make sure required args were supplied */ if((source_name==NULL || dest_name==NULL || instance_name==NULL) && show_help==NDO_FALSE && show_version==NDO_FALSE && show_license==NDO_FALSE) return NDO_ERROR; return NDO_OK; } ndoutils-1.4b9/UPGRADING0000644000175100017510000000124010606734615015016 0ustar baeckerhbaeckerh------------- UPGRADE NOTES ------------- You will most likely need to upgrade the database schema when upgrading to new releases of the NDOUtils addon. You can do these easily by using the 'upgradedb' script in the db/ subdirectory as follows: cd db ./upgradedb You'll need to specify the database name, host, password, and username when using the upgrade script. Upgrading from the 1.3 or 1.3.1 releases: * The default table prefixed has changed from 'ndo_' to 'nagios_' * Several changes have been made to the DB structure * Use the mysql-upgrade-1.3.sql script in the db/ directory to upgrade your old DB to the new structure (back it up first!). ndoutils-1.4b9/m4/0000755000175100017510000000000011227320616014066 5ustar baeckerhbaeckerhndoutils-1.4b9/m4/np_mysqlclient.m40000644000175100017510000000523510746407743017412 0ustar baeckerhbaeckerh# np_mysqlclient.m4 dnl Copyright (C) 2007 Nagios Plugins Team dnl This file is free software; the Nagios Plugin Team dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Test for mysql availability using mysql_config dnl Uses --with-mysql= yes(autodetection - default) | no | path dnl Sets 4 variables: dnl with_mysql = path/to/mysql_config (if found and can compile mysqlclient) or "no" dnl np_mysql_include = flags for include, from mysql_config --include (will be guessed as $with_mysql/include if --include not found) dnl np_mysql_libs = flags for libs, from mysql_config --libs dnl np_mysql_cflags = flags for cflags, from mysql_config --cflags dnl Also sets in config.h: dnl HAVE_MYSQLCLIENT dnl Copile your code with: dnl $(CC) $(np_mysql_include) code.c $(np_mysql_libs) AC_DEFUN([np_mysqlclient], [ AC_ARG_WITH(mysql, AS_HELP_STRING([--with-mysql=DIR], [Locates mysql libraries. Expects DIR/bin/mysql_config. Default to search for mysql_config in PATH]), with_mysql=$withval, with_mysql=yes) if test "x$with_mysql" != "xno" ; then if test "x$with_mysql" = "xyes" ; then AC_PATH_PROG(np_mysql_config, mysql_config) else if test -x $with_mysql/bin/mysql_config ; then np_mysql_config="$with_mysql/bin/mysql_config" fi fi if test -z "$np_mysql_config"; then with_mysql="no" else np_mysql_include="`$np_mysql_config --include`" # Mysql 3 does not support --include. --cflags should be sufficient if test $? -ne 0; then np_mysql_include="-I$with_mysql/include" # Guessed location fi np_mysql_libs="`$np_mysql_config --libs`" np_mysql_cflags="`$np_mysql_config --cflags`" dnl Test a mysql_init. Some systems have mysql_config, but no headers _savedcppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $np_mysql_include" dnl Putting $np_mysql_libs as other libraries ensures that all mysql dependencies are linked in dnl Although -lmysqlclient is duplicated, it is not a problem AC_CHECK_LIB([mysqlclient], [mysql_init], [ with_mysql=$np_mysql_config AC_DEFINE(HAVE_MYSQLCLIENT, 1, [Defined if mysqlclient is found and can compile]) ], [with_mysql=no], [$np_mysql_libs]) CPPFLAGS=$_savedcppflags fi fi ]) dnl Will take $1, find last occurrance of -LDIR and add DIR to LD_RUN_PATH AC_DEFUN([np_add_to_runpath], [ dnl Need [[ ]] so autoconf gives us just one set np_libdir=`echo "$1" | sed -e 's/.*-L\([[^ ]]*\) .*/\1/'` if test "x$np_libdir" != x ; then LD_RUN_PATH="${np_libdir}${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi ]) ndoutils-1.4b9/Changelog0000644000175100017510000001555611271522554015400 0ustar baeckerhbaeckerh================= NDO Utils History ================= Note: Consider this addon to be experimental. Memory leaks and segfaults are to be expected until the code stabilizes, so beware of using it in production environments. 1.4b9 - ??/??/2009 ------------------ NOTE: ** Requires Nagios 2.7 or higher, or Nagios 3.0b6 or higher - Improved writes from file2sock to ndo2db by matching buffer sizes (Opsera Ltd) - Add in 4 missing tables from clearout process during prelaunch (Opsera Ltd) - Fix for Solaris 10 which gets an EINTR on accept for the 2nd file2sock call (Opsera Ltd) - Fix for not retrying read on 'EAGAIN' and 'EINTR' soft errors (Opsera Ltd) - Improve error info by showing failed MySQL query in syslog (Opsera Ltd) - Move database connections/disconnections syslog detail to DEBUG from INFO (Opsera Ltd) - Allow externalcommands table to be trimmed with a specific time limit (Opsera Ltd) - Support SSL encryption between the communication partners - Support for long performance data - Added installation procedure with "make install" or "make fullinstall" - Fix missing output fields in hostcheck and servicecheck tables - Workaround small NDOMOD Buffers to handle more than 4k chars (tracker id 21) - Fix unescape of strings containing tabstops - Fix case insensitive behavior in NDOUtils (tracker id 66) HINT: Now NDOUtils handles renaming objects like Nagios itself. localhost is not like LoCaLhOsT - they are two different objects 1.4b8 - 07/16/2009 ------------------ NOTE: ** Requires Nagios 2.7 or higher, or Nagios 3.0b6 or higher - Added additional error messages during failed startup - Better MySQL library detection (Ton Voon, Herbert Straub, and Nagios Plugin Team) - Removed Postgres options to configure script, as it is not yet supported - Compiler flag fix for building on GNU/kFreeBSD systems (Hendrik Frenzel) - Added lock_file option - Fix debug file permission race (Lars Michelsen) - More error reporting if debug file can not be opened - Fix wait for childs on SIGCHLD - Added long_output support - Fix missing SIGTERM forwarding to childs - Fix fmt specifier in ndo2db_daemonize() - Escape custom values in 'customvariablestatus' and 'customvariables' - Fix ndomod doesn't execute rotate_command propperly - Fix several compiler warnings - Rewrite ndo2db init script, install it with 'make install-init' 1.4b7 - 10/31/2007 ----------------- NOTE: ** Requires Nagios 2.7 or higher, or Nagios 3.0b6 - Makefile fixes for compilation flags - Fix for bug where service check table always had same start/end time - Added sample init script for SLES (Bruno Quintais) - Added --with-ndo2db-user and --with-ndo2db-group configure script options - Fix for configfilevariables table not holding multiple entries for various variables - Changed/added indexes on various DB tables - Added some very basic debug file capabilities (not complete yet) - Fix for handling (backwards) system time changes - Fix for missing SUN_LEN definition and strtof() functions on Solaris 8 (Christian Masopust) - Fix for segfault when importing duplicate log file entries (Hendrik Frenzel) - Updated to support latest Nagios 3.x code (3.0b6) 1.4b6 - 09/27/2007 ----------------- NOTE: ** Requires Nagios 2.7 or higher, or Nagios 3.0b4 - Updated to support latest Nagios 3.x code (3.0b4) - Added source OpenOffice docs in addition to PDFs - Fix for segfault while processing host status/event information 1.4b5 - 08/29/2007 ----------------- NOTE: ** Requires Nagios 2.7 or higher, or Nagios 3.0b2 - Reintroduced contactgroup associations with host, service, and escalation definitions - Adjustments for data structure changes made in Nagios 3.0b2 - Fix for missing math libraries during compilation (Dominic Settele) - Changed MySQL db table types from MyISAM to InnoDB - Updated to latest Nagios 3.x include files (3.0b2) 1.4b4 - 06/19/2007 ----------------- NOTE: ** Requires Nagios 2.7 or higher, or Nagios 3.0a5 - Added note about needing 'event_broker_options=-1' in Nagios config file - Updated to latest Nagios 3.x include files (3.0a5) 1.4b3 - 04/10/2007 ------------------ NOTE: ** Requires Nagios 2.7 or higher, or Nagios 3.0a3 - Added missing 'alias' field to hosts table - Fixed problems with marking old, non-existant objects as inactive - Fixed bug where host and service objects were not being marked active - Fixed minor SQL errors - Added DB upgrade and installation script (Ton Voon/Altinity) - Updated to latest Nagios 3.x include files (3.0a3) 1.4b2 - 01/19/2007 ------------------ - Makefile fixes for compiling ndomod event broker module - Fixes for Nagios 2.7 and latest Nagios 3 alpha code for scheduled downtime changes - Fixes for problems with DB indexes in 'host_contacts', 'service_contacts', 'hostescalation_contacts', and 'serviceescalation_contacts' tables - Added missing host_object_id field to 'services' table - Added sample SQL queries for fetching data (look in the db/queries subdirectory) 1.4b1 - 01/07/2007 ------------------ - Added ability to drop privileges (see the ndo2db_user and ndb2db_group config file options) - Unprocessed event data is now stored in the buffer_file file before the NDMOMOD module shuts down. On startup, the module will read the contents of this file and send the contents to the NDO2DB daemon for processing. - Better detection of MySQL libraries (default path) - Removed 'should_be_drawn' field from hostextinfo table - Merged extended info definitions with host/service definitions - Added new fields from Nagios 3.x, updated to latest Nagios 3.x include files - Added stub routines for adaptive contact data - Fixed several memory leaks - Documentation on database structures 1.3.1 - 02/25/2006 ------------------ - Fixes segfaults with empty log entries and missing db prefix - Synchronized version numbers of all utilities to 1.3.1 - New update-version script 1.3 - 02/12/2006 ---------------- - Removed 'ndo_' prefix from default database structure - Updated config.sub and config.guess to latest versions from CVS - Configure script fixes - Added missing 'address' field to hosts table - Different version of NDOMOD and NDO2DB are now created for Nagios 2.x and Nagios 3.x - Memory leak fixes - Misc bug fixes 1.2 - 01/10/2006 ---------------- - Changed most protocol strings to integers for better efficiency - Added check for client/server protocol version - Added support for TCP sockets - Added INETD support to NDO2DB daemon - Fixed bug with processing of contact notification methods - Fixed bug with processing of live log data - Changes to MySQL table structures - Added some initial documentation (PDF) 1.1 - 12/27/2005 ---------------- - Changes to MySQL table structures - Added support for both original and retained object configurations - Added checks for Nagios object structure compatability - Changed syslog() message types from LOG_DAEMON to LOG_USER - Updated Nagios 2.0 include files 1.0 - 12/23/2005 ---------------- - First public release for comments ndoutils-1.4b9/README0000644000175100017510000001455710613152604014440 0ustar baeckerhbaeckerh---------- NDO README ---------- *************** !! IMPORTANT !! *************** This code is still an alpha/beta quality, so expect problems if you intend to use it. Make sure that you aren't using it with your only production installation of Nagios, or it could take down the Nagios process if the NDOMOD module segfaults. Nagios could segfault silently and you might never know that Nagios crashed... **************** ABOUT THIS ADDON **************** The NDOUTILS (Nagios Data Output Utils) addon allows you to move status and event information from Nagios to a database for later retrieval and processing. This addon consists of several parts. Here are the most interesting ones... 1. The NDOMOD event broker module. This module is intended to be loaded by the Nagios process at runtime. Its only role is to dump all events and data from Nagios to a TCP socket or a regular file or Unix domain socket on the local filesystem somewhere. If you want realtime transfer of data to MySQL, dump the data to a TCP or Unix domain socket. If you want delayed transfer of data into MySQL (i.e. you need to transfer the data to another host first), dump the data to a regular file. 2. The NDO2DB daemon. This standalone daemon reads input (that was produced by the NDOMOD broker module) from a TCP or Unix domain socket, parses that data, and then dumps it into one or more MySQL databases. The daemon is capable of handling multiple client connections simultaneously, so you can have multiple instances of the NDOMOD module writing to the same TCP or Unix domain socket at the same time. 3. The FILE2SOCK utility. This simple utility reads data from a standard file and dumps it to either a TCP or a Unix domain socket. This is useful if you are having the NDOMOD module write to a standard file that you later want to send to the NDO2DB daemon. If the module and the daemon are running on different machines, you can periodically use SSH to transfer the file from the monitoring machine to the machine running the NDO2DB daemon, and then use the FILE2SOCK utility to send the contents of that file to the TCP socket or Unix domain socket that the NDO2DB daemon is reading. 4. The LOG2NDO utility. This utility is used for importing historical log archives from NetSaint and Nagios and sending them to the NDO2DB daemon. It takes a single log file as its input and can output data to either a TCP socket, a Unix domain socket or standard output. ********************** COMPILING INSTRUCTIONS ********************** Use the following commands to compile the NDO broker module, NDO2DB daemon, and additional utilities: ./configure make If the configure script is unable to locate your MySQL or PostgreSQL development libraries, you may need to help it out by using the --with-mysql-lib or --with-pgsql-lib options. Here's an example: ./configure --with-mysql-lib=/usr/lib/mysql ***************************** INITIALIZING THE SQL DATABASE ***************************** Before you start using the NDO utilities, you should create the database where you will be storing all Nagios-related information. NOTE: As of 02/12/2006, only MySQL databases are supported. PostgreSQL support will likely be added in the future. 1. Create a database for storing the data (e.g. 'nagios') 2. Create a username/password that has at least the following privileges for the database: SELECT, INSERT, UPDATE, DELETE 3. Run the DB installation script in the db/ subdirectory of the NDO distribution to create the necessary tables in the database. cd db ./installdb 4. Make sure the database name, prefix, and username/password you just created and setup match the variable specified in the NDO2DB config file (see below). *********************************** INSTALLING THE NDOMOD BROKER MODULE *********************************** NOTE: There are two different versions of the NDOMOD module that get compiled, so make sure you use the module that matches the version of Nagios you are running, and adjust the directions given below to fit the name of the module version you're using. ndomod-2x.o = NDOMOD module for Nagios 2.x ndomod-3x.o = NDOMOD module for Nagios 3.x (unstable) 1. Copy the compiled NDOMOD module to your Nagios installation: cp src/ndomod-2x.o /usr/local/nagios/bin/ndomod.o The command above assumes that you are using Nagios 2.x, and thus are installing the 2.x version of the NDOMOD module. 2. Copy the sample NDOMOD config file to your Nagios installation after modifying it to suit your needs: cp config/ndomod.cfg /usr/local/nagios/etc 3. Add a line similiar to the following to the *main* Nagios config file (usually /usr/local/nagios/etc/nagios.cfg): broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg The config directive above will cause Nagios to load the NDOMOD event broker the next time it starts. Of course, this requres that you compiled Nagios with support for the event broker in the first place. :-) 4. Make sure you have a line similar to the following in the *main* Nagios config file (usually /usr/local/nagios/etc/nagios.cfg): event_broker_options=-1 That directive will cause the Nagios daemon to send data to the NDOMOD module. Without that option, NDOMOD won't get any information. **************************** INSTALLING THE NDO2DB DAEMON **************************** NOTE: There are two different versions of the NDO2DB daemon that get compiled, so make sure you use the daemon that matches the version of Nagios you are running, and adjust the directions given below to fit the name of the daemon you're using. ndo2db-2x.o = NDO2DB daemon for Nagios 2.x ndo2db-3x.o = NDO2DB daemon for Nagios 3.x 1. Copy the compiled NDO2DB daemon to your Nagios installation: cp src/ndo2db-2x /usr/local/nagios/bin/ndo2db The command above assumes that you are using Nagios 2.x, and thus are installing the 2.x version of the NDO2DB daemon. 2. Copy the sample NDO2DB config file to your Nagios installation after modifying it to suit your needs (pay attention to the DB config settings). cp config/ndo2db.cfg /usr/local/nagios/etc 3. Start the daemon running! An init script will be developed soon... /usr/local/nagios/bin/ndo2db -c /usr/local/nagios/etc/ndo2db.cfg ndoutils-1.4b9/THANKS0000644000175100017510000000067111253701322014461 0ustar baeckerhbaeckerh======= THANKS! ======= The success of this software has been due to the fantastic community members that support it and provide bug reports, patches, and great ideas. Here are a few of the many individuals that have contributed in various ways. --- Bernhard Reutner-Fischer Duncan Ferguson Jean Gabes Lars Michelsen Matthieu Kermagoret Sascha Runschke Sébastien Aperghis-Tramoni Stéphane Urbanovski Tilo Renz Ton Voon Wolfgang Powisch ndoutils-1.4b9/install-sh0000755000175100017510000001272110550310744015554 0ustar baeckerhbaeckerh#! /bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 ndoutils-1.4b9/db/0000755000175100017510000000000011271525175014141 5ustar baeckerhbaeckerhndoutils-1.4b9/db/prepsql0000755000175100017510000000031210566226013015544 0ustar baeckerhbaeckerh#!/bin/sh # Strip charset from db dump, so it defaults to user's # Suggested by Ton Voon/Altinity perl -pi -e 's/DEFAULT CHARSET=ascii //' mysql.sql perl -pi -e 's/ DEFAULT CHARSET=ascii//' mysql.sql ndoutils-1.4b9/db/mysql-mods-1.4b5.sql0000644000175100017510000001401010665307312017507 0ustar baeckerhbaeckerh-- BEGIN 1.4b5 MODS -- -- Table structure for table `nagios_host_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_host_contactgroups` ( `host_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_contactgroup_id`), UNIQUE KEY `instance_id` (`host_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalation_contactgroups` ( `hostescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`hostescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host escalation contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_service_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_service_contactgroups` ( `service_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`service_contactgroup_id`), UNIQUE KEY `instance_id` (`service_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalation_contactgroups` ( `serviceescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `serviceescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`serviceescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`serviceescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service escalation contact groups'; -- -------------------------------------------------------- ALTER TABLE `nagios_acknowledgements` TYPE = innodb; ALTER TABLE `nagios_commands` TYPE = innodb; ALTER TABLE `nagios_commenthistory` TYPE = innodb; ALTER TABLE `nagios_comments` TYPE = innodb; ALTER TABLE `nagios_configfiles` TYPE = innodb; ALTER TABLE `nagios_configfilevariables` TYPE = innodb; ALTER TABLE `nagios_conninfo` TYPE = innodb; ALTER TABLE `nagios_contact_addresses` TYPE = innodb; ALTER TABLE `nagios_contact_notificationcommands` TYPE = innodb; ALTER TABLE `nagios_contactgroup_members` TYPE = innodb; ALTER TABLE `nagios_contactgroups` TYPE = innodb; ALTER TABLE `nagios_contactnotificationmethods` TYPE = innodb; ALTER TABLE `nagios_contactnotifications` TYPE = innodb; ALTER TABLE `nagios_contacts` TYPE = innodb; ALTER TABLE `nagios_contactstatus` TYPE = innodb; ALTER TABLE `nagios_customvariables` TYPE = innodb; ALTER TABLE `nagios_customvariablestatus` TYPE = innodb; ALTER TABLE `nagios_dbversion` TYPE = innodb; ALTER TABLE `nagios_downtimehistory` TYPE = innodb; ALTER TABLE `nagios_eventhandlers` TYPE = innodb; ALTER TABLE `nagios_externalcommands` TYPE = innodb; ALTER TABLE `nagios_flappinghistory` TYPE = innodb; ALTER TABLE `nagios_host_contactgroups` TYPE = innodb; ALTER TABLE `nagios_host_contacts` TYPE = innodb; ALTER TABLE `nagios_host_parenthosts` TYPE = innodb; ALTER TABLE `nagios_hostchecks` TYPE = innodb; ALTER TABLE `nagios_hostdependencies` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_hostescalations` TYPE = innodb; ALTER TABLE `nagios_hostgroup_members` TYPE = innodb; ALTER TABLE `nagios_hostgroups` TYPE = innodb; ALTER TABLE `nagios_hosts` TYPE = innodb; ALTER TABLE `nagios_hoststatus` TYPE = innodb; ALTER TABLE `nagios_instances` TYPE = innodb; ALTER TABLE `nagios_logentries` TYPE = innodb; ALTER TABLE `nagios_notifications` TYPE = innodb; ALTER TABLE `nagios_objects` TYPE = innodb; ALTER TABLE `nagios_processevents` TYPE = innodb; ALTER TABLE `nagios_programstatus` TYPE = innodb; ALTER TABLE `nagios_runtimevariables` TYPE = innodb; ALTER TABLE `nagios_scheduleddowntime` TYPE = innodb; ALTER TABLE `nagios_service_contactgroups` TYPE = innodb; ALTER TABLE `nagios_service_contacts` TYPE = innodb; ALTER TABLE `nagios_servicechecks` TYPE = innodb; ALTER TABLE `nagios_servicedependencies` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_serviceescalations` TYPE = innodb; ALTER TABLE `nagios_servicegroup_members` TYPE = innodb; ALTER TABLE `nagios_servicegroups` TYPE = innodb; ALTER TABLE `nagios_services` TYPE = innodb; ALTER TABLE `nagios_servicestatus` TYPE = innodb; ALTER TABLE `nagios_statehistory` TYPE = innodb; ALTER TABLE `nagios_systemcommands` TYPE = innodb; ALTER TABLE `nagios_timedeventqueue` TYPE = innodb; ALTER TABLE `nagios_timedevents` TYPE = innodb; ALTER TABLE `nagios_timeperiod_timeranges` TYPE = innodb; ALTER TABLE `nagios_timeperiods` TYPE = innodb; ALTER TABLE `nagios_statehistory` ADD `last_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `max_check_attempts` , ADD `last_hard_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `last_state` ; -- END 1.4b5 MODS ndoutils-1.4b9/db/mysql-upgrade-1.4b8.sql0000644000175100017510000000213611267536772020222 0ustar baeckerhbaeckerhALTER TABLE `nagios_hostchecks` ADD COLUMN `long_output` TEXT NOT NULL default '' AFTER `output`; ALTER TABLE `nagios_hoststatus` ADD COLUMN `long_output` TEXT NOT NULL default '' AFTER `output`; ALTER TABLE `nagios_servicechecks` ADD COLUMN `long_output` TEXT NOT NULL default '' AFTER `output`; ALTER TABLE `nagios_servicestatus` ADD COLUMN `long_output` TEXT NOT NULL default '' AFTER `output`; ALTER TABLE `nagios_statehistory` ADD COLUMN `long_output` TEXT NOT NULL default '' AFTER `output`; ALTER TABLE `nagios_eventhandlers` ADD COLUMN `long_output` TEXT NOT NULL default '' AFTER `output`; ALTER TABLE `nagios_systemcommands` ADD COLUMN `long_output` TEXT NOT NULL default '' AFTER `output`; ALTER TABLE `nagios_notifications` ADD COLUMN `long_output` TEXT NOT NULL default '' AFTER `output`; ALTER TABLE `nagios`.`nagios_hostchecks` MODIFY COLUMN `perfdata` TEXT NULL; ALTER TABLE `nagios`.`nagios_hoststatus` MODIFY COLUMN `perfdata` TEXT NULL; ALTER TABLE `nagios`.`nagios_servicechecks` MODIFY COLUMN `perfdata` TEXT NULL; ALTER TABLE `nagios`.`nagios_servicestatus` MODIFY COLUMN `perfdata` TEXT NULL; ndoutils-1.4b9/db/mysql-upgrade-1.4b1.sql0000644000175100017510000002772610712143240020201 0ustar baeckerhbaeckerhALTER TABLE `nagios_host_contacts` DROP INDEX `instance_id`; ALTER TABLE `nagios_host_contacts` ADD UNIQUE ( `instance_id` , `host_id` , `contact_object_id` ); ALTER TABLE `nagios_service_contacts` DROP INDEX `instance_id`; ALTER TABLE `nagios_service_contacts` ADD UNIQUE ( `instance_id` , `service_id` , `contact_object_id` ); ALTER TABLE `nagios_hostescalation_contacts` DROP INDEX `instance_id` ; ALTER TABLE `nagios_hostescalation_contacts` ADD UNIQUE ( `instance_id` , `hostescalation_id` , `contact_object_id` ); ALTER TABLE `nagios_serviceescalation_contacts` DROP INDEX `instance_id` ; ALTER TABLE `nagios_serviceescalation_contacts` ADD UNIQUE ( `instance_id` , `serviceescalation_id` , `contact_object_id` ); ALTER TABLE `nagios_services` ADD `host_object_id` INT NOT NULL AFTER `config_type` ; -- Start of mods from 1.4b3 -- ALTER TABLE `nagios_hosts` ADD `alias` VARCHAR( 64 ) NOT NULL AFTER `host_object_id` ; -- End of mods from 1.4b3 -- -- BEGIN 1.4b5 MODS -- -- Table structure for table `nagios_host_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_host_contactgroups` ( `host_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_contactgroup_id`), UNIQUE KEY `instance_id` (`host_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalation_contactgroups` ( `hostescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`hostescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host escalation contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_service_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_service_contactgroups` ( `service_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`service_contactgroup_id`), UNIQUE KEY `instance_id` (`service_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalation_contactgroups` ( `serviceescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `serviceescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`serviceescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`serviceescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service escalation contact groups'; -- -------------------------------------------------------- ALTER TABLE `nagios_acknowledgements` TYPE = innodb; ALTER TABLE `nagios_commands` TYPE = innodb; ALTER TABLE `nagios_commenthistory` TYPE = innodb; ALTER TABLE `nagios_comments` TYPE = innodb; ALTER TABLE `nagios_configfiles` TYPE = innodb; ALTER TABLE `nagios_configfilevariables` TYPE = innodb; ALTER TABLE `nagios_conninfo` TYPE = innodb; ALTER TABLE `nagios_contact_addresses` TYPE = innodb; ALTER TABLE `nagios_contact_notificationcommands` TYPE = innodb; ALTER TABLE `nagios_contactgroup_members` TYPE = innodb; ALTER TABLE `nagios_contactgroups` TYPE = innodb; ALTER TABLE `nagios_contactnotificationmethods` TYPE = innodb; ALTER TABLE `nagios_contactnotifications` TYPE = innodb; ALTER TABLE `nagios_contacts` TYPE = innodb; ALTER TABLE `nagios_contactstatus` TYPE = innodb; ALTER TABLE `nagios_customvariables` TYPE = innodb; ALTER TABLE `nagios_customvariablestatus` TYPE = innodb; ALTER TABLE `nagios_dbversion` TYPE = innodb; ALTER TABLE `nagios_downtimehistory` TYPE = innodb; ALTER TABLE `nagios_eventhandlers` TYPE = innodb; ALTER TABLE `nagios_externalcommands` TYPE = innodb; ALTER TABLE `nagios_flappinghistory` TYPE = innodb; ALTER TABLE `nagios_host_contactgroups` TYPE = innodb; ALTER TABLE `nagios_host_contacts` TYPE = innodb; ALTER TABLE `nagios_host_parenthosts` TYPE = innodb; ALTER TABLE `nagios_hostchecks` TYPE = innodb; ALTER TABLE `nagios_hostdependencies` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_hostescalations` TYPE = innodb; ALTER TABLE `nagios_hostgroup_members` TYPE = innodb; ALTER TABLE `nagios_hostgroups` TYPE = innodb; ALTER TABLE `nagios_hosts` TYPE = innodb; ALTER TABLE `nagios_hoststatus` TYPE = innodb; ALTER TABLE `nagios_instances` TYPE = innodb; ALTER TABLE `nagios_logentries` TYPE = innodb; ALTER TABLE `nagios_notifications` TYPE = innodb; ALTER TABLE `nagios_objects` TYPE = innodb; ALTER TABLE `nagios_processevents` TYPE = innodb; ALTER TABLE `nagios_programstatus` TYPE = innodb; ALTER TABLE `nagios_runtimevariables` TYPE = innodb; ALTER TABLE `nagios_scheduleddowntime` TYPE = innodb; ALTER TABLE `nagios_service_contactgroups` TYPE = innodb; ALTER TABLE `nagios_service_contacts` TYPE = innodb; ALTER TABLE `nagios_servicechecks` TYPE = innodb; ALTER TABLE `nagios_servicedependencies` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_serviceescalations` TYPE = innodb; ALTER TABLE `nagios_servicegroup_members` TYPE = innodb; ALTER TABLE `nagios_servicegroups` TYPE = innodb; ALTER TABLE `nagios_services` TYPE = innodb; ALTER TABLE `nagios_servicestatus` TYPE = innodb; ALTER TABLE `nagios_statehistory` TYPE = innodb; ALTER TABLE `nagios_systemcommands` TYPE = innodb; ALTER TABLE `nagios_timedeventqueue` TYPE = innodb; ALTER TABLE `nagios_timedevents` TYPE = innodb; ALTER TABLE `nagios_timeperiod_timeranges` TYPE = innodb; ALTER TABLE `nagios_timeperiods` TYPE = innodb; ALTER TABLE `nagios_statehistory` ADD `last_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `max_check_attempts` , ADD `last_hard_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `last_state` ; -- END 1.4b5 MODS -- BEGIN 1.4b7 MODS ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ALTER TABLE `nagios_configfilevariables` ADD INDEX ( `instance_id` , `configfile_id` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` , `service_object_id` ) ; ALTER TABLE `nagios_processevents` ADD INDEX ( `instance_id` , `event_type` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` , `host_object_id` ) ; ALTER TABLE `nagios_flappinghistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_customvariablestatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_contactstatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_conninfo` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_acknowledgements` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_objects` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `logentry_time` ) ; ALTER TABLE `nagios_commenthistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_comments` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_downtimehistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_externalcommands` CHANGE `command_args` `command_args` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_logentries` CHANGE `logentry_data` `logentry_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_scheduleddowntime` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_statehistory` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_processevents` ADD INDEX ( `event_time` , `event_time_usec` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `state_time` , `state_time_usec` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time_usec` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `entry_time` ) ; -- END 1.4b7 MODS ndoutils-1.4b9/db/mysql-mods-1.4b8.sql0000644000175100017510000000666211127706766017542 0ustar baeckerhbaeckerh; 05/03/08 ALTER TABLE `nagios_hosts` ADD INDEX ( `host_object_id` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `status_update_time` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `check_type` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_state_change` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `percent_state_change` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `latency` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `execution_time` ); ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ); ALTER TABLE `nagios_services` ADD INDEX ( `service_object_id` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `status_update_time` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `check_type` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `state_type` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_state_change` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `percent_state_change` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `latency` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `execution_time` ); ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ); ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ); ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ); ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ); ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `object_id` ); ALTER TABLE `nagios_timedevents` DROP INDEX `instance_id` ; ALTER TABLE `nagios_timedevents` ADD INDEX ( `instance_id` ); ALTER TABLE `nagios_timedevents` ADD INDEX ( `event_type` ); ALTER TABLE `nagios_timedevents` ADD INDEX ( `scheduled_time` ); ALTER TABLE `nagios_timedevents` ADD INDEX ( `object_id` ); ALTER TABLE `nagios_systemcommands` DROP INDEX `instance_id`; ALTER TABLE `nagios_systemcommands` ADD INDEX ( `instance_id` ); ALTER TABLE `nagios_servicechecks` DROP INDEX `instance_id`; ALTER TABLE `nagios_servicechecks` ADD INDEX ( `instance_id` ); ALTER TABLE `nagios_servicechecks` ADD INDEX ( `service_object_id` ); ALTER TABLE `nagios_servicechecks` ADD INDEX ( `start_time` ); ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ndoutils-1.4b9/db/mysql-upgrade-1.4b4.sql0000644000175100017510000002601710712143241020175 0ustar baeckerhbaeckerh-- BEGIN 1.4b5 MODS -- -- Table structure for table `nagios_host_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_host_contactgroups` ( `host_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_contactgroup_id`), UNIQUE KEY `instance_id` (`host_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalation_contactgroups` ( `hostescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`hostescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host escalation contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_service_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_service_contactgroups` ( `service_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`service_contactgroup_id`), UNIQUE KEY `instance_id` (`service_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalation_contactgroups` ( `serviceescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `serviceescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`serviceescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`serviceescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service escalation contact groups'; -- -------------------------------------------------------- ALTER TABLE `nagios_acknowledgements` TYPE = innodb; ALTER TABLE `nagios_commands` TYPE = innodb; ALTER TABLE `nagios_commenthistory` TYPE = innodb; ALTER TABLE `nagios_comments` TYPE = innodb; ALTER TABLE `nagios_configfiles` TYPE = innodb; ALTER TABLE `nagios_configfilevariables` TYPE = innodb; ALTER TABLE `nagios_conninfo` TYPE = innodb; ALTER TABLE `nagios_contact_addresses` TYPE = innodb; ALTER TABLE `nagios_contact_notificationcommands` TYPE = innodb; ALTER TABLE `nagios_contactgroup_members` TYPE = innodb; ALTER TABLE `nagios_contactgroups` TYPE = innodb; ALTER TABLE `nagios_contactnotificationmethods` TYPE = innodb; ALTER TABLE `nagios_contactnotifications` TYPE = innodb; ALTER TABLE `nagios_contacts` TYPE = innodb; ALTER TABLE `nagios_contactstatus` TYPE = innodb; ALTER TABLE `nagios_customvariables` TYPE = innodb; ALTER TABLE `nagios_customvariablestatus` TYPE = innodb; ALTER TABLE `nagios_dbversion` TYPE = innodb; ALTER TABLE `nagios_downtimehistory` TYPE = innodb; ALTER TABLE `nagios_eventhandlers` TYPE = innodb; ALTER TABLE `nagios_externalcommands` TYPE = innodb; ALTER TABLE `nagios_flappinghistory` TYPE = innodb; ALTER TABLE `nagios_host_contactgroups` TYPE = innodb; ALTER TABLE `nagios_host_contacts` TYPE = innodb; ALTER TABLE `nagios_host_parenthosts` TYPE = innodb; ALTER TABLE `nagios_hostchecks` TYPE = innodb; ALTER TABLE `nagios_hostdependencies` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_hostescalations` TYPE = innodb; ALTER TABLE `nagios_hostgroup_members` TYPE = innodb; ALTER TABLE `nagios_hostgroups` TYPE = innodb; ALTER TABLE `nagios_hosts` TYPE = innodb; ALTER TABLE `nagios_hoststatus` TYPE = innodb; ALTER TABLE `nagios_instances` TYPE = innodb; ALTER TABLE `nagios_logentries` TYPE = innodb; ALTER TABLE `nagios_notifications` TYPE = innodb; ALTER TABLE `nagios_objects` TYPE = innodb; ALTER TABLE `nagios_processevents` TYPE = innodb; ALTER TABLE `nagios_programstatus` TYPE = innodb; ALTER TABLE `nagios_runtimevariables` TYPE = innodb; ALTER TABLE `nagios_scheduleddowntime` TYPE = innodb; ALTER TABLE `nagios_service_contactgroups` TYPE = innodb; ALTER TABLE `nagios_service_contacts` TYPE = innodb; ALTER TABLE `nagios_servicechecks` TYPE = innodb; ALTER TABLE `nagios_servicedependencies` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_serviceescalations` TYPE = innodb; ALTER TABLE `nagios_servicegroup_members` TYPE = innodb; ALTER TABLE `nagios_servicegroups` TYPE = innodb; ALTER TABLE `nagios_services` TYPE = innodb; ALTER TABLE `nagios_servicestatus` TYPE = innodb; ALTER TABLE `nagios_statehistory` TYPE = innodb; ALTER TABLE `nagios_systemcommands` TYPE = innodb; ALTER TABLE `nagios_timedeventqueue` TYPE = innodb; ALTER TABLE `nagios_timedevents` TYPE = innodb; ALTER TABLE `nagios_timeperiod_timeranges` TYPE = innodb; ALTER TABLE `nagios_timeperiods` TYPE = innodb; ALTER TABLE `nagios_statehistory` ADD `last_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `max_check_attempts` , ADD `last_hard_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `last_state` ; -- END 1.4b5 MODS -- BEGIN 1.4b7 MODS ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ALTER TABLE `nagios_configfilevariables` ADD INDEX ( `instance_id` , `configfile_id` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` , `service_object_id` ) ; ALTER TABLE `nagios_processevents` ADD INDEX ( `instance_id` , `event_type` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` , `host_object_id` ) ; ALTER TABLE `nagios_flappinghistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_customvariablestatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_contactstatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_conninfo` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_acknowledgements` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_objects` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `logentry_time` ) ; ALTER TABLE `nagios_commenthistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_comments` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_downtimehistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_externalcommands` CHANGE `command_args` `command_args` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_logentries` CHANGE `logentry_data` `logentry_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_scheduleddowntime` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_statehistory` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_processevents` ADD INDEX ( `event_time` , `event_time_usec` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `state_time` , `state_time_usec` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time_usec` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `entry_time` ) ; -- END 1.4b7 MODS ndoutils-1.4b9/db/mysql-upgrade-1.4b5.sql0000644000175100017510000001200710712143241020170 0ustar baeckerhbaeckerh-- BEGIN 1.4b7 MODS ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ALTER TABLE `nagios_configfilevariables` ADD INDEX ( `instance_id` , `configfile_id` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` , `service_object_id` ) ; ALTER TABLE `nagios_processevents` ADD INDEX ( `instance_id` , `event_type` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` , `host_object_id` ) ; ALTER TABLE `nagios_flappinghistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_customvariablestatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_contactstatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_conninfo` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_acknowledgements` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_objects` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `logentry_time` ) ; ALTER TABLE `nagios_commenthistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_comments` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_downtimehistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_externalcommands` CHANGE `command_args` `command_args` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_logentries` CHANGE `logentry_data` `logentry_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_scheduleddowntime` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_statehistory` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_processevents` ADD INDEX ( `event_time` , `event_time_usec` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `state_time` , `state_time_usec` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time_usec` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `entry_time` ) ; -- END 1.4b7 MODS ndoutils-1.4b9/db/mysql-upgrade-1.4b6.sql0000644000175100017510000001200710712143241020171 0ustar baeckerhbaeckerh-- BEGIN 1.4b7 MODS ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ALTER TABLE `nagios_configfilevariables` ADD INDEX ( `instance_id` , `configfile_id` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` , `service_object_id` ) ; ALTER TABLE `nagios_processevents` ADD INDEX ( `instance_id` , `event_type` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` , `host_object_id` ) ; ALTER TABLE `nagios_flappinghistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_customvariablestatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_contactstatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_conninfo` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_acknowledgements` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_objects` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `logentry_time` ) ; ALTER TABLE `nagios_commenthistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_comments` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_downtimehistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_externalcommands` CHANGE `command_args` `command_args` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_logentries` CHANGE `logentry_data` `logentry_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_scheduleddowntime` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_statehistory` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_processevents` ADD INDEX ( `event_time` , `event_time_usec` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `state_time` , `state_time_usec` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time_usec` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `entry_time` ) ; -- END 1.4b7 MODS ndoutils-1.4b9/db/upgradedb0000755000175100017510000000514611271525175016032 0ustar baeckerhbaeckerh#!/usr/bin/perl # # SYNTAX: my $usage = "upgradedb -u user -p password -h hostname -d database"; # # DESCRIPTION: # Runs upgrade scripts in this directory based on current level of database # Options as mysql's for authentication # # COPYRIGHT: # Copyright (C) 2005 Altinity Limited # Copyright is freely given to Ethan Galstad if included in the NDOUtils distribution # # LICENCE: # GNU GPLv2 # # Last Updated: 08/02/2007 # use strict; use FindBin qw($Bin); use Getopt::Std; use DBI; sub usage { print $usage,$/,"\t",$_[0],$/; exit 1; } my $opts = {}; getopts("u:p:h:d:", $opts) or usage "Bad options"; my $database = $opts->{d} || usage "Must specify a database"; my $hostname = $opts->{h} || "localhost"; my $username = $opts->{u} || usage "Must specify a username"; my $password = $opts->{p}; usage "Must specify a password" unless defined $password; # Could be blank # Connect to database my $dbh = DBI->connect("DBI:mysql:database=$database;host=$hostname", $username, $password, { RaiseError => 1 }, ) or die "Cannot connect to database"; # Create version table if it doesn't exist eval { $dbh->do("SELECT * FROM nagios_dbversion LIMIT 1") }; if ($@) { print "*** Creating table nagios_dbversion",$/; $dbh->do("CREATE TABLE nagios_dbversion (name VARCHAR(10) NOT NULL, version VARCHAR(10) NOT NULL);"); }; # Get current database version my $version; my $thisversion="1.4b9"; my $lastversion="1.4b9"; my $legacyversion="1.4b9"; $version = $dbh->selectrow_array("SELECT version FROM nagios_dbversion WHERE name='ndoutils'"); if ($version eq "") { # Assume last legacy release (didn't have version table) print "*** Assuming version $legacyversion of nodutils installed",$/; $dbh->do("INSERT nagios_dbversion SET name='ndoutils', version='$legacyversion';"); $version = $legacyversion }; print "Current database version: $version",$/; if ($version eq $thisversion){ print "Database already upgraded.",$/; exit 0; } # Read upgrade script in the directory containing this script my $file="mysql-upgrade-$version.sql"; if (-e $file){ print "** DB upgrade required for $thisversion",$/; print " Using $file for upgrade...",$/; my $p = "-p$password" if $password; # Not required if password is blank system("mysql -u $username $p -D$database -h$hostname < $file") == 0 or die "Upgrade from $file failed"; print "** Upgrade to $thisversion complete",$/; } else{ print "** No update script found for version $version - assuming none are required.",$/; print "** Upgrade to $thisversion complete",$/; } # Update db version record $dbh->do("UPDATE nagios_dbversion SET version='$thisversion' WHERE name='ndoutils';"); ndoutils-1.4b9/db/mysql-mods-1.4b7.sql0000644000175100017510000001200710712143240017504 0ustar baeckerhbaeckerh-- BEGIN 1.4b7 MODS ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ALTER TABLE `nagios_configfilevariables` ADD INDEX ( `instance_id` , `configfile_id` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` , `service_object_id` ) ; ALTER TABLE `nagios_processevents` ADD INDEX ( `instance_id` , `event_type` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` , `host_object_id` ) ; ALTER TABLE `nagios_flappinghistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_customvariablestatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_contactstatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_conninfo` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_acknowledgements` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_objects` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `logentry_time` ) ; ALTER TABLE `nagios_commenthistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_comments` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_downtimehistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_externalcommands` CHANGE `command_args` `command_args` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_logentries` CHANGE `logentry_data` `logentry_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_scheduleddowntime` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_statehistory` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_processevents` ADD INDEX ( `event_time` , `event_time_usec` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `state_time` , `state_time_usec` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time_usec` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `entry_time` ) ; -- END 1.4b7 MODS ndoutils-1.4b9/db/mysql-upgrade-1.4b2.sql0000644000175100017510000002615010712143241020171 0ustar baeckerhbaeckerhALTER TABLE `nagios_hosts` ADD `alias` VARCHAR( 64 ) NOT NULL AFTER `host_object_id` ; -- BEGIN 1.4b5 MODS -- -- Table structure for table `nagios_host_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_host_contactgroups` ( `host_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_contactgroup_id`), UNIQUE KEY `instance_id` (`host_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalation_contactgroups` ( `hostescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`hostescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host escalation contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_service_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_service_contactgroups` ( `service_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`service_contactgroup_id`), UNIQUE KEY `instance_id` (`service_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalation_contactgroups` ( `serviceescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `serviceescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`serviceescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`serviceescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service escalation contact groups'; -- -------------------------------------------------------- ALTER TABLE `nagios_acknowledgements` TYPE = innodb; ALTER TABLE `nagios_commands` TYPE = innodb; ALTER TABLE `nagios_commenthistory` TYPE = innodb; ALTER TABLE `nagios_comments` TYPE = innodb; ALTER TABLE `nagios_configfiles` TYPE = innodb; ALTER TABLE `nagios_configfilevariables` TYPE = innodb; ALTER TABLE `nagios_conninfo` TYPE = innodb; ALTER TABLE `nagios_contact_addresses` TYPE = innodb; ALTER TABLE `nagios_contact_notificationcommands` TYPE = innodb; ALTER TABLE `nagios_contactgroup_members` TYPE = innodb; ALTER TABLE `nagios_contactgroups` TYPE = innodb; ALTER TABLE `nagios_contactnotificationmethods` TYPE = innodb; ALTER TABLE `nagios_contactnotifications` TYPE = innodb; ALTER TABLE `nagios_contacts` TYPE = innodb; ALTER TABLE `nagios_contactstatus` TYPE = innodb; ALTER TABLE `nagios_customvariables` TYPE = innodb; ALTER TABLE `nagios_customvariablestatus` TYPE = innodb; ALTER TABLE `nagios_dbversion` TYPE = innodb; ALTER TABLE `nagios_downtimehistory` TYPE = innodb; ALTER TABLE `nagios_eventhandlers` TYPE = innodb; ALTER TABLE `nagios_externalcommands` TYPE = innodb; ALTER TABLE `nagios_flappinghistory` TYPE = innodb; ALTER TABLE `nagios_host_contactgroups` TYPE = innodb; ALTER TABLE `nagios_host_contacts` TYPE = innodb; ALTER TABLE `nagios_host_parenthosts` TYPE = innodb; ALTER TABLE `nagios_hostchecks` TYPE = innodb; ALTER TABLE `nagios_hostdependencies` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_hostescalations` TYPE = innodb; ALTER TABLE `nagios_hostgroup_members` TYPE = innodb; ALTER TABLE `nagios_hostgroups` TYPE = innodb; ALTER TABLE `nagios_hosts` TYPE = innodb; ALTER TABLE `nagios_hoststatus` TYPE = innodb; ALTER TABLE `nagios_instances` TYPE = innodb; ALTER TABLE `nagios_logentries` TYPE = innodb; ALTER TABLE `nagios_notifications` TYPE = innodb; ALTER TABLE `nagios_objects` TYPE = innodb; ALTER TABLE `nagios_processevents` TYPE = innodb; ALTER TABLE `nagios_programstatus` TYPE = innodb; ALTER TABLE `nagios_runtimevariables` TYPE = innodb; ALTER TABLE `nagios_scheduleddowntime` TYPE = innodb; ALTER TABLE `nagios_service_contactgroups` TYPE = innodb; ALTER TABLE `nagios_service_contacts` TYPE = innodb; ALTER TABLE `nagios_servicechecks` TYPE = innodb; ALTER TABLE `nagios_servicedependencies` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_serviceescalations` TYPE = innodb; ALTER TABLE `nagios_servicegroup_members` TYPE = innodb; ALTER TABLE `nagios_servicegroups` TYPE = innodb; ALTER TABLE `nagios_services` TYPE = innodb; ALTER TABLE `nagios_servicestatus` TYPE = innodb; ALTER TABLE `nagios_statehistory` TYPE = innodb; ALTER TABLE `nagios_systemcommands` TYPE = innodb; ALTER TABLE `nagios_timedeventqueue` TYPE = innodb; ALTER TABLE `nagios_timedevents` TYPE = innodb; ALTER TABLE `nagios_timeperiod_timeranges` TYPE = innodb; ALTER TABLE `nagios_timeperiods` TYPE = innodb; ALTER TABLE `nagios_statehistory` ADD `last_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `max_check_attempts` , ADD `last_hard_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `last_state` ; -- END 1.4b5 MODS -- BEGIN 1.4b7 MODS ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ALTER TABLE `nagios_configfilevariables` ADD INDEX ( `instance_id` , `configfile_id` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` , `service_object_id` ) ; ALTER TABLE `nagios_processevents` ADD INDEX ( `instance_id` , `event_type` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` , `host_object_id` ) ; ALTER TABLE `nagios_flappinghistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_customvariablestatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_contactstatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_conninfo` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_acknowledgements` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_objects` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `logentry_time` ) ; ALTER TABLE `nagios_commenthistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_comments` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_downtimehistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_externalcommands` CHANGE `command_args` `command_args` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_logentries` CHANGE `logentry_data` `logentry_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_scheduleddowntime` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_statehistory` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_processevents` ADD INDEX ( `event_time` , `event_time_usec` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `state_time` , `state_time_usec` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time_usec` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `entry_time` ) ; -- END 1.4b7 MODS ndoutils-1.4b9/db/README0000644000175100017510000000140210566226013015011 0ustar baeckerhbaeckerh================ DATABASE SCRIPTS ================ Here you'll find scripts to create the necessary database tables for MySQL and PostgreSQL servers. The queries/ subdirectory contains some example SQL queries for fetching data from the DB tables. File Name Description --------------------- ------------------------------------------------------------------------- mysql.sql Use this when you install the NDOUtils addon for the first time. It will create all the necessary tables for you. upgradedb Script that automates the DB upgrade process. Use this when upgrading! mysql-upgrade-*.sql Raw SQL scripts for upgrading from a previous release. Please use the upgradedb script (above) to upgrade your DB structure, rather than these scripts directly. ndoutils-1.4b9/db/mysql.sql0000644000175100017510000017341011267536772016047 0ustar baeckerhbaeckerh-- phpMyAdmin SQL Dump -- version 2.11.8.1 -- http://www.phpmyadmin.net -- Host: localhost -- Generation Time: Jan 03, 2009 at 09:24 AM -- Server version: 5.0.45 -- PHP Version: 5.2.6 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- Database: `nagios` -- -- -------------------------------------------------------- -- -- Table structure for table `nagios_acknowledgements` -- CREATE TABLE IF NOT EXISTS `nagios_acknowledgements` ( `acknowledgement_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `entry_time` datetime NOT NULL default '0000-00-00 00:00:00', `entry_time_usec` int(11) NOT NULL default '0', `acknowledgement_type` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `state` smallint(6) NOT NULL default '0', `author_name` varchar(64) character set latin1 NOT NULL default '', `comment_data` varchar(255) character set latin1 NOT NULL default '', `is_sticky` smallint(6) NOT NULL default '0', `persistent_comment` smallint(6) NOT NULL default '0', `notify_contacts` smallint(6) NOT NULL default '0', PRIMARY KEY (`acknowledgement_id`) ) ENGINE=MyISAM COMMENT='Current and historical host and service acknowledgements'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_commands` -- CREATE TABLE IF NOT EXISTS `nagios_commands` ( `command_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `command_line` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`command_id`), UNIQUE KEY `instance_id` (`instance_id`,`object_id`,`config_type`) ) ENGINE=MyISAM COMMENT='Command definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_commenthistory` -- CREATE TABLE IF NOT EXISTS `nagios_commenthistory` ( `commenthistory_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `entry_time` datetime NOT NULL default '0000-00-00 00:00:00', `entry_time_usec` int(11) NOT NULL default '0', `comment_type` smallint(6) NOT NULL default '0', `entry_type` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `comment_time` datetime NOT NULL default '0000-00-00 00:00:00', `internal_comment_id` int(11) NOT NULL default '0', `author_name` varchar(64) character set latin1 NOT NULL default '', `comment_data` varchar(255) character set latin1 NOT NULL default '', `is_persistent` smallint(6) NOT NULL default '0', `comment_source` smallint(6) NOT NULL default '0', `expires` smallint(6) NOT NULL default '0', `expiration_time` datetime NOT NULL default '0000-00-00 00:00:00', `deletion_time` datetime NOT NULL default '0000-00-00 00:00:00', `deletion_time_usec` int(11) NOT NULL default '0', PRIMARY KEY (`commenthistory_id`), UNIQUE KEY `instance_id` (`instance_id`,`comment_time`,`internal_comment_id`) ) ENGINE=MyISAM COMMENT='Historical host and service comments'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_comments` -- CREATE TABLE IF NOT EXISTS `nagios_comments` ( `comment_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `entry_time` datetime NOT NULL default '0000-00-00 00:00:00', `entry_time_usec` int(11) NOT NULL default '0', `comment_type` smallint(6) NOT NULL default '0', `entry_type` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `comment_time` datetime NOT NULL default '0000-00-00 00:00:00', `internal_comment_id` int(11) NOT NULL default '0', `author_name` varchar(64) character set latin1 NOT NULL default '', `comment_data` varchar(255) character set latin1 NOT NULL default '', `is_persistent` smallint(6) NOT NULL default '0', `comment_source` smallint(6) NOT NULL default '0', `expires` smallint(6) NOT NULL default '0', `expiration_time` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`comment_id`), UNIQUE KEY `instance_id` (`instance_id`,`comment_time`,`internal_comment_id`) ) ENGINE=MyISAM ; -- -------------------------------------------------------- -- -- Table structure for table `nagios_configfiles` -- CREATE TABLE IF NOT EXISTS `nagios_configfiles` ( `configfile_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `configfile_type` smallint(6) NOT NULL default '0', `configfile_path` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`configfile_id`), UNIQUE KEY `instance_id` (`instance_id`,`configfile_type`,`configfile_path`) ) ENGINE=MyISAM COMMENT='Configuration files'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_configfilevariables` -- CREATE TABLE IF NOT EXISTS `nagios_configfilevariables` ( `configfilevariable_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `configfile_id` int(11) NOT NULL default '0', `varname` varchar(64) character set latin1 NOT NULL default '', `varvalue` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`configfilevariable_id`) ) ENGINE=MyISAM COMMENT='Configuration file variables'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_conninfo` -- CREATE TABLE IF NOT EXISTS `nagios_conninfo` ( `conninfo_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `agent_name` varchar(32) character set latin1 NOT NULL default '', `agent_version` varchar(8) character set latin1 NOT NULL default '', `disposition` varchar(16) character set latin1 NOT NULL default '', `connect_source` varchar(16) character set latin1 NOT NULL default '', `connect_type` varchar(16) character set latin1 NOT NULL default '', `connect_time` datetime NOT NULL default '0000-00-00 00:00:00', `disconnect_time` datetime NOT NULL default '0000-00-00 00:00:00', `last_checkin_time` datetime NOT NULL default '0000-00-00 00:00:00', `data_start_time` datetime NOT NULL default '0000-00-00 00:00:00', `data_end_time` datetime NOT NULL default '0000-00-00 00:00:00', `bytes_processed` int(11) NOT NULL default '0', `lines_processed` int(11) NOT NULL default '0', `entries_processed` int(11) NOT NULL default '0', PRIMARY KEY (`conninfo_id`) ) ENGINE=MyISAM COMMENT='NDO2DB daemon connection information'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_contactgroups` ( `contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', `alias` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`contactgroup_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`contactgroup_object_id`) ) ENGINE=MyISAM COMMENT='Contactgroup definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_contactgroup_members` -- CREATE TABLE IF NOT EXISTS `nagios_contactgroup_members` ( `contactgroup_member_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `contactgroup_id` int(11) NOT NULL default '0', `contact_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`contactgroup_member_id`), UNIQUE KEY `instance_id` (`contactgroup_id`,`contact_object_id`) ) ENGINE=MyISAM COMMENT='Contactgroup members'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_contactnotificationmethods` -- CREATE TABLE IF NOT EXISTS `nagios_contactnotificationmethods` ( `contactnotificationmethod_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `contactnotification_id` int(11) NOT NULL default '0', `start_time` datetime NOT NULL default '0000-00-00 00:00:00', `start_time_usec` int(11) NOT NULL default '0', `end_time` datetime NOT NULL default '0000-00-00 00:00:00', `end_time_usec` int(11) NOT NULL default '0', `command_object_id` int(11) NOT NULL default '0', `command_args` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`contactnotificationmethod_id`), UNIQUE KEY `instance_id` (`instance_id`,`contactnotification_id`,`start_time`,`start_time_usec`) ) ENGINE=MyISAM COMMENT='Historical record of contact notification methods'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_contactnotifications` -- CREATE TABLE IF NOT EXISTS `nagios_contactnotifications` ( `contactnotification_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `notification_id` int(11) NOT NULL default '0', `contact_object_id` int(11) NOT NULL default '0', `start_time` datetime NOT NULL default '0000-00-00 00:00:00', `start_time_usec` int(11) NOT NULL default '0', `end_time` datetime NOT NULL default '0000-00-00 00:00:00', `end_time_usec` int(11) NOT NULL default '0', PRIMARY KEY (`contactnotification_id`), UNIQUE KEY `instance_id` (`instance_id`,`contact_object_id`,`start_time`,`start_time_usec`) ) ENGINE=MyISAM COMMENT='Historical record of contact notifications'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_contacts` -- CREATE TABLE IF NOT EXISTS `nagios_contacts` ( `contact_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `contact_object_id` int(11) NOT NULL default '0', `alias` varchar(64) character set latin1 NOT NULL default '', `email_address` varchar(255) character set latin1 NOT NULL default '', `pager_address` varchar(64) character set latin1 NOT NULL default '', `host_timeperiod_object_id` int(11) NOT NULL default '0', `service_timeperiod_object_id` int(11) NOT NULL default '0', `host_notifications_enabled` smallint(6) NOT NULL default '0', `service_notifications_enabled` smallint(6) NOT NULL default '0', `can_submit_commands` smallint(6) NOT NULL default '0', `notify_service_recovery` smallint(6) NOT NULL default '0', `notify_service_warning` smallint(6) NOT NULL default '0', `notify_service_unknown` smallint(6) NOT NULL default '0', `notify_service_critical` smallint(6) NOT NULL default '0', `notify_service_flapping` smallint(6) NOT NULL default '0', `notify_service_downtime` smallint(6) NOT NULL default '0', `notify_host_recovery` smallint(6) NOT NULL default '0', `notify_host_down` smallint(6) NOT NULL default '0', `notify_host_unreachable` smallint(6) NOT NULL default '0', `notify_host_flapping` smallint(6) NOT NULL default '0', `notify_host_downtime` smallint(6) NOT NULL default '0', PRIMARY KEY (`contact_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`contact_object_id`) ) ENGINE=MyISAM COMMENT='Contact definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_contactstatus` -- CREATE TABLE IF NOT EXISTS `nagios_contactstatus` ( `contactstatus_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `contact_object_id` int(11) NOT NULL default '0', `status_update_time` datetime NOT NULL default '0000-00-00 00:00:00', `host_notifications_enabled` smallint(6) NOT NULL default '0', `service_notifications_enabled` smallint(6) NOT NULL default '0', `last_host_notification` datetime NOT NULL default '0000-00-00 00:00:00', `last_service_notification` datetime NOT NULL default '0000-00-00 00:00:00', `modified_attributes` int(11) NOT NULL default '0', `modified_host_attributes` int(11) NOT NULL default '0', `modified_service_attributes` int(11) NOT NULL default '0', PRIMARY KEY (`contactstatus_id`), UNIQUE KEY `contact_object_id` (`contact_object_id`) ) ENGINE=MyISAM COMMENT='Contact status'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_contact_addresses` -- CREATE TABLE IF NOT EXISTS `nagios_contact_addresses` ( `contact_address_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `contact_id` int(11) NOT NULL default '0', `address_number` smallint(6) NOT NULL default '0', `address` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`contact_address_id`), UNIQUE KEY `contact_id` (`contact_id`,`address_number`) ) ENGINE=MyISAM COMMENT='Contact addresses'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_contact_notificationcommands` -- CREATE TABLE IF NOT EXISTS `nagios_contact_notificationcommands` ( `contact_notificationcommand_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `contact_id` int(11) NOT NULL default '0', `notification_type` smallint(6) NOT NULL default '0', `command_object_id` int(11) NOT NULL default '0', `command_args` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`contact_notificationcommand_id`), UNIQUE KEY `contact_id` (`contact_id`,`notification_type`,`command_object_id`,`command_args`) ) ENGINE=MyISAM COMMENT='Contact host and service notification commands'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_customvariables` -- CREATE TABLE IF NOT EXISTS `nagios_customvariables` ( `customvariable_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `has_been_modified` smallint(6) NOT NULL default '0', `varname` varchar(255) character set latin1 NOT NULL default '', `varvalue` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`customvariable_id`), UNIQUE KEY `object_id_2` (`object_id`,`config_type`,`varname`), KEY `varname` (`varname`) ) ENGINE=MyISAM COMMENT='Custom variables'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_customvariablestatus` -- CREATE TABLE IF NOT EXISTS `nagios_customvariablestatus` ( `customvariablestatus_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `status_update_time` datetime NOT NULL default '0000-00-00 00:00:00', `has_been_modified` smallint(6) NOT NULL default '0', `varname` varchar(255) character set latin1 NOT NULL default '', `varvalue` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`customvariablestatus_id`), UNIQUE KEY `object_id_2` (`object_id`,`varname`), KEY `varname` (`varname`) ) ENGINE=MyISAM COMMENT='Custom variable status information'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_dbversion` -- CREATE TABLE IF NOT EXISTS `nagios_dbversion` ( `name` varchar(10) character set latin1 NOT NULL default '', `version` varchar(10) character set latin1 NOT NULL default '' ) ENGINE=MyISAM; -- -------------------------------------------------------- -- -- Table structure for table `nagios_downtimehistory` -- CREATE TABLE IF NOT EXISTS `nagios_downtimehistory` ( `downtimehistory_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `downtime_type` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `entry_time` datetime NOT NULL default '0000-00-00 00:00:00', `author_name` varchar(64) character set latin1 NOT NULL default '', `comment_data` varchar(255) character set latin1 NOT NULL default '', `internal_downtime_id` int(11) NOT NULL default '0', `triggered_by_id` int(11) NOT NULL default '0', `is_fixed` smallint(6) NOT NULL default '0', `duration` smallint(6) NOT NULL default '0', `scheduled_start_time` datetime NOT NULL default '0000-00-00 00:00:00', `scheduled_end_time` datetime NOT NULL default '0000-00-00 00:00:00', `was_started` smallint(6) NOT NULL default '0', `actual_start_time` datetime NOT NULL default '0000-00-00 00:00:00', `actual_start_time_usec` int(11) NOT NULL default '0', `actual_end_time` datetime NOT NULL default '0000-00-00 00:00:00', `actual_end_time_usec` int(11) NOT NULL default '0', `was_cancelled` smallint(6) NOT NULL default '0', PRIMARY KEY (`downtimehistory_id`), UNIQUE KEY `instance_id` (`instance_id`,`object_id`,`entry_time`,`internal_downtime_id`) ) ENGINE=MyISAM COMMENT='Historical scheduled host and service downtime'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_eventhandlers` -- CREATE TABLE IF NOT EXISTS `nagios_eventhandlers` ( `eventhandler_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `eventhandler_type` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `state` smallint(6) NOT NULL default '0', `state_type` smallint(6) NOT NULL default '0', `start_time` datetime NOT NULL default '0000-00-00 00:00:00', `start_time_usec` int(11) NOT NULL default '0', `end_time` datetime NOT NULL default '0000-00-00 00:00:00', `end_time_usec` int(11) NOT NULL default '0', `command_object_id` int(11) NOT NULL default '0', `command_args` varchar(255) character set latin1 NOT NULL default '', `command_line` varchar(255) character set latin1 NOT NULL default '', `timeout` smallint(6) NOT NULL default '0', `early_timeout` smallint(6) NOT NULL default '0', `execution_time` double NOT NULL default '0', `return_code` smallint(6) NOT NULL default '0', `output` varchar(255) character set latin1 NOT NULL default '', `long_output` TEXT NOT NULL default '', PRIMARY KEY (`eventhandler_id`), UNIQUE KEY `instance_id` (`instance_id`,`object_id`,`start_time`,`start_time_usec`) ) ENGINE=MyISAM COMMENT='Historical host and service event handlers'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_externalcommands` -- CREATE TABLE IF NOT EXISTS `nagios_externalcommands` ( `externalcommand_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `entry_time` datetime NOT NULL default '0000-00-00 00:00:00', `command_type` smallint(6) NOT NULL default '0', `command_name` varchar(128) character set latin1 NOT NULL default '', `command_args` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`externalcommand_id`) ) ENGINE=MyISAM COMMENT='Historical record of processed external commands'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_flappinghistory` -- CREATE TABLE IF NOT EXISTS `nagios_flappinghistory` ( `flappinghistory_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `event_time` datetime NOT NULL default '0000-00-00 00:00:00', `event_time_usec` int(11) NOT NULL default '0', `event_type` smallint(6) NOT NULL default '0', `reason_type` smallint(6) NOT NULL default '0', `flapping_type` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `percent_state_change` double NOT NULL default '0', `low_threshold` double NOT NULL default '0', `high_threshold` double NOT NULL default '0', `comment_time` datetime NOT NULL default '0000-00-00 00:00:00', `internal_comment_id` int(11) NOT NULL default '0', PRIMARY KEY (`flappinghistory_id`) ) ENGINE=MyISAM COMMENT='Current and historical record of host and service flapping'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostchecks` -- CREATE TABLE IF NOT EXISTS `nagios_hostchecks` ( `hostcheck_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_object_id` int(11) NOT NULL default '0', `check_type` smallint(6) NOT NULL default '0', `is_raw_check` smallint(6) NOT NULL default '0', `current_check_attempt` smallint(6) NOT NULL default '0', `max_check_attempts` smallint(6) NOT NULL default '0', `state` smallint(6) NOT NULL default '0', `state_type` smallint(6) NOT NULL default '0', `start_time` datetime NOT NULL default '0000-00-00 00:00:00', `start_time_usec` int(11) NOT NULL default '0', `end_time` datetime NOT NULL default '0000-00-00 00:00:00', `end_time_usec` int(11) NOT NULL default '0', `command_object_id` int(11) NOT NULL default '0', `command_args` varchar(255) character set latin1 NOT NULL default '', `command_line` varchar(255) character set latin1 NOT NULL default '', `timeout` smallint(6) NOT NULL default '0', `early_timeout` smallint(6) NOT NULL default '0', `execution_time` double NOT NULL default '0', `latency` double NOT NULL default '0', `return_code` smallint(6) NOT NULL default '0', `output` varchar(255) character set latin1 NOT NULL default '', `long_output` TEXT NOT NULL default '', `perfdata` TEXT character set latin1 NOT NULL default '', PRIMARY KEY (`hostcheck_id`), UNIQUE KEY `instance_id` (`instance_id`,`host_object_id`,`start_time`,`start_time_usec`) ) ENGINE=MyISAM COMMENT='Historical host checks'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostdependencies` -- CREATE TABLE IF NOT EXISTS `nagios_hostdependencies` ( `hostdependency_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `host_object_id` int(11) NOT NULL default '0', `dependent_host_object_id` int(11) NOT NULL default '0', `dependency_type` smallint(6) NOT NULL default '0', `inherits_parent` smallint(6) NOT NULL default '0', `timeperiod_object_id` int(11) NOT NULL default '0', `fail_on_up` smallint(6) NOT NULL default '0', `fail_on_down` smallint(6) NOT NULL default '0', `fail_on_unreachable` smallint(6) NOT NULL default '0', PRIMARY KEY (`hostdependency_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`host_object_id`,`dependent_host_object_id`,`dependency_type`,`inherits_parent`,`fail_on_up`,`fail_on_down`,`fail_on_unreachable`) ) ENGINE=MyISAM COMMENT='Host dependency definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalations` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalations` ( `hostescalation_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `host_object_id` int(11) NOT NULL default '0', `timeperiod_object_id` int(11) NOT NULL default '0', `first_notification` smallint(6) NOT NULL default '0', `last_notification` smallint(6) NOT NULL default '0', `notification_interval` double NOT NULL default '0', `escalate_on_recovery` smallint(6) NOT NULL default '0', `escalate_on_down` smallint(6) NOT NULL default '0', `escalate_on_unreachable` smallint(6) NOT NULL default '0', PRIMARY KEY (`hostescalation_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`host_object_id`,`timeperiod_object_id`,`first_notification`,`last_notification`) ) ENGINE=MyISAM COMMENT='Host escalation definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalation_contactgroups` ( `hostescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`hostescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM COMMENT='Host escalation contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalation_contacts` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalation_contacts` ( `hostescalation_contact_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostescalation_id` int(11) NOT NULL default '0', `contact_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostescalation_contact_id`), UNIQUE KEY `instance_id` (`instance_id`,`hostescalation_id`,`contact_object_id`) ) ENGINE=MyISAM ; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostgroups` -- CREATE TABLE IF NOT EXISTS `nagios_hostgroups` ( `hostgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `hostgroup_object_id` int(11) NOT NULL default '0', `alias` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`hostgroup_id`), UNIQUE KEY `instance_id` (`instance_id`,`hostgroup_object_id`) ) ENGINE=MyISAM COMMENT='Hostgroup definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostgroup_members` -- CREATE TABLE IF NOT EXISTS `nagios_hostgroup_members` ( `hostgroup_member_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostgroup_id` int(11) NOT NULL default '0', `host_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostgroup_member_id`), UNIQUE KEY `instance_id` (`hostgroup_id`,`host_object_id`) ) ENGINE=MyISAM COMMENT='Hostgroup members'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hosts` -- CREATE TABLE IF NOT EXISTS `nagios_hosts` ( `host_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `host_object_id` int(11) NOT NULL default '0', `alias` varchar(64) character set latin1 NOT NULL default '', `display_name` varchar(64) character set latin1 NOT NULL default '', `address` varchar(128) character set latin1 NOT NULL default '', `check_command_object_id` int(11) NOT NULL default '0', `check_command_args` varchar(255) character set latin1 NOT NULL default '', `eventhandler_command_object_id` int(11) NOT NULL default '0', `eventhandler_command_args` varchar(255) character set latin1 NOT NULL default '', `notification_timeperiod_object_id` int(11) NOT NULL default '0', `check_timeperiod_object_id` int(11) NOT NULL default '0', `failure_prediction_options` varchar(64) character set latin1 NOT NULL default '', `check_interval` double NOT NULL default '0', `retry_interval` double NOT NULL default '0', `max_check_attempts` smallint(6) NOT NULL default '0', `first_notification_delay` double NOT NULL default '0', `notification_interval` double NOT NULL default '0', `notify_on_down` smallint(6) NOT NULL default '0', `notify_on_unreachable` smallint(6) NOT NULL default '0', `notify_on_recovery` smallint(6) NOT NULL default '0', `notify_on_flapping` smallint(6) NOT NULL default '0', `notify_on_downtime` smallint(6) NOT NULL default '0', `stalk_on_up` smallint(6) NOT NULL default '0', `stalk_on_down` smallint(6) NOT NULL default '0', `stalk_on_unreachable` smallint(6) NOT NULL default '0', `flap_detection_enabled` smallint(6) NOT NULL default '0', `flap_detection_on_up` smallint(6) NOT NULL default '0', `flap_detection_on_down` smallint(6) NOT NULL default '0', `flap_detection_on_unreachable` smallint(6) NOT NULL default '0', `low_flap_threshold` double NOT NULL default '0', `high_flap_threshold` double NOT NULL default '0', `process_performance_data` smallint(6) NOT NULL default '0', `freshness_checks_enabled` smallint(6) NOT NULL default '0', `freshness_threshold` smallint(6) NOT NULL default '0', `passive_checks_enabled` smallint(6) NOT NULL default '0', `event_handler_enabled` smallint(6) NOT NULL default '0', `active_checks_enabled` smallint(6) NOT NULL default '0', `retain_status_information` smallint(6) NOT NULL default '0', `retain_nonstatus_information` smallint(6) NOT NULL default '0', `notifications_enabled` smallint(6) NOT NULL default '0', `obsess_over_host` smallint(6) NOT NULL default '0', `failure_prediction_enabled` smallint(6) NOT NULL default '0', `notes` varchar(255) character set latin1 NOT NULL default '', `notes_url` varchar(255) character set latin1 NOT NULL default '', `action_url` varchar(255) character set latin1 NOT NULL default '', `icon_image` varchar(255) character set latin1 NOT NULL default '', `icon_image_alt` varchar(255) character set latin1 NOT NULL default '', `vrml_image` varchar(255) character set latin1 NOT NULL default '', `statusmap_image` varchar(255) character set latin1 NOT NULL default '', `have_2d_coords` smallint(6) NOT NULL default '0', `x_2d` smallint(6) NOT NULL default '0', `y_2d` smallint(6) NOT NULL default '0', `have_3d_coords` smallint(6) NOT NULL default '0', `x_3d` double NOT NULL default '0', `y_3d` double NOT NULL default '0', `z_3d` double NOT NULL default '0', PRIMARY KEY (`host_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`host_object_id`), KEY `host_object_id` (`host_object_id`) ) ENGINE=MyISAM COMMENT='Host definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hoststatus` -- CREATE TABLE IF NOT EXISTS `nagios_hoststatus` ( `hoststatus_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_object_id` int(11) NOT NULL default '0', `status_update_time` datetime NOT NULL default '0000-00-00 00:00:00', `output` varchar(255) character set latin1 NOT NULL default '', `long_output` TEXT NOT NULL default '', `perfdata` TEXT character set latin1 NOT NULL default '', `current_state` smallint(6) NOT NULL default '0', `has_been_checked` smallint(6) NOT NULL default '0', `should_be_scheduled` smallint(6) NOT NULL default '0', `current_check_attempt` smallint(6) NOT NULL default '0', `max_check_attempts` smallint(6) NOT NULL default '0', `last_check` datetime NOT NULL default '0000-00-00 00:00:00', `next_check` datetime NOT NULL default '0000-00-00 00:00:00', `check_type` smallint(6) NOT NULL default '0', `last_state_change` datetime NOT NULL default '0000-00-00 00:00:00', `last_hard_state_change` datetime NOT NULL default '0000-00-00 00:00:00', `last_hard_state` smallint(6) NOT NULL default '0', `last_time_up` datetime NOT NULL default '0000-00-00 00:00:00', `last_time_down` datetime NOT NULL default '0000-00-00 00:00:00', `last_time_unreachable` datetime NOT NULL default '0000-00-00 00:00:00', `state_type` smallint(6) NOT NULL default '0', `last_notification` datetime NOT NULL default '0000-00-00 00:00:00', `next_notification` datetime NOT NULL default '0000-00-00 00:00:00', `no_more_notifications` smallint(6) NOT NULL default '0', `notifications_enabled` smallint(6) NOT NULL default '0', `problem_has_been_acknowledged` smallint(6) NOT NULL default '0', `acknowledgement_type` smallint(6) NOT NULL default '0', `current_notification_number` smallint(6) NOT NULL default '0', `passive_checks_enabled` smallint(6) NOT NULL default '0', `active_checks_enabled` smallint(6) NOT NULL default '0', `event_handler_enabled` smallint(6) NOT NULL default '0', `flap_detection_enabled` smallint(6) NOT NULL default '0', `is_flapping` smallint(6) NOT NULL default '0', `percent_state_change` double NOT NULL default '0', `latency` double NOT NULL default '0', `execution_time` double NOT NULL default '0', `scheduled_downtime_depth` smallint(6) NOT NULL default '0', `failure_prediction_enabled` smallint(6) NOT NULL default '0', `process_performance_data` smallint(6) NOT NULL default '0', `obsess_over_host` smallint(6) NOT NULL default '0', `modified_host_attributes` int(11) NOT NULL default '0', `event_handler` varchar(255) character set latin1 NOT NULL default '', `check_command` varchar(255) character set latin1 NOT NULL default '', `normal_check_interval` double NOT NULL default '0', `retry_check_interval` double NOT NULL default '0', `check_timeperiod_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hoststatus_id`), UNIQUE KEY `object_id` (`host_object_id`), KEY `instance_id` (`instance_id`), KEY `status_update_time` (`status_update_time`), KEY `current_state` (`current_state`), KEY `check_type` (`check_type`), KEY `state_type` (`state_type`), KEY `last_state_change` (`last_state_change`), KEY `notifications_enabled` (`notifications_enabled`), KEY `problem_has_been_acknowledged` (`problem_has_been_acknowledged`), KEY `active_checks_enabled` (`active_checks_enabled`), KEY `passive_checks_enabled` (`passive_checks_enabled`), KEY `event_handler_enabled` (`event_handler_enabled`), KEY `flap_detection_enabled` (`flap_detection_enabled`), KEY `is_flapping` (`is_flapping`), KEY `percent_state_change` (`percent_state_change`), KEY `latency` (`latency`), KEY `execution_time` (`execution_time`), KEY `scheduled_downtime_depth` (`scheduled_downtime_depth`) ) ENGINE=MyISAM COMMENT='Current host status information'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_host_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_host_contactgroups` ( `host_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_contactgroup_id`), UNIQUE KEY `instance_id` (`host_id`,`contactgroup_object_id`) ) ENGINE=MyISAM COMMENT='Host contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_host_contacts` -- CREATE TABLE IF NOT EXISTS `nagios_host_contacts` ( `host_contact_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `contact_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_contact_id`), UNIQUE KEY `instance_id` (`instance_id`,`host_id`,`contact_object_id`) ) ENGINE=MyISAM ; -- -------------------------------------------------------- -- -- Table structure for table `nagios_host_parenthosts` -- CREATE TABLE IF NOT EXISTS `nagios_host_parenthosts` ( `host_parenthost_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `parent_host_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_parenthost_id`), UNIQUE KEY `instance_id` (`host_id`,`parent_host_object_id`) ) ENGINE=MyISAM COMMENT='Parent hosts'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_instances` -- CREATE TABLE IF NOT EXISTS `nagios_instances` ( `instance_id` smallint(6) NOT NULL auto_increment, `instance_name` varchar(64) character set latin1 NOT NULL default '', `instance_description` varchar(128) character set latin1 NOT NULL default '', PRIMARY KEY (`instance_id`) ) ENGINE=MyISAM COMMENT='Location names of various Nagios installations'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_logentries` -- CREATE TABLE IF NOT EXISTS `nagios_logentries` ( `logentry_id` int(11) NOT NULL auto_increment, `instance_id` int(11) NOT NULL default '0', `logentry_time` datetime NOT NULL default '0000-00-00 00:00:00', `entry_time` datetime NOT NULL default '0000-00-00 00:00:00', `entry_time_usec` int(11) NOT NULL default '0', `logentry_type` int(11) NOT NULL default '0', `logentry_data` varchar(255) character set latin1 NOT NULL default '', `realtime_data` smallint(6) NOT NULL default '0', `inferred_data_extracted` smallint(6) NOT NULL default '0', PRIMARY KEY (`logentry_id`) ) ENGINE=MyISAM COMMENT='Historical record of log entries'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_notifications` -- CREATE TABLE IF NOT EXISTS `nagios_notifications` ( `notification_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `notification_type` smallint(6) NOT NULL default '0', `notification_reason` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `start_time` datetime NOT NULL default '0000-00-00 00:00:00', `start_time_usec` int(11) NOT NULL default '0', `end_time` datetime NOT NULL default '0000-00-00 00:00:00', `end_time_usec` int(11) NOT NULL default '0', `state` smallint(6) NOT NULL default '0', `output` varchar(255) character set latin1 NOT NULL default '', `long_output` TEXT NOT NULL default '', `escalated` smallint(6) NOT NULL default '0', `contacts_notified` smallint(6) NOT NULL default '0', PRIMARY KEY (`notification_id`), UNIQUE KEY `instance_id` (`instance_id`,`object_id`,`start_time`,`start_time_usec`) ) ENGINE=MyISAM COMMENT='Historical record of host and service notifications'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_objects` -- CREATE TABLE IF NOT EXISTS `nagios_objects` ( `object_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `objecttype_id` smallint(6) NOT NULL default '0', `name1` varchar(128) character set latin1 NOT NULL default '', `name2` varchar(128) character set latin1 default NULL, `is_active` smallint(6) NOT NULL default '0', PRIMARY KEY (`object_id`), KEY `objecttype_id` (`objecttype_id`,`name1`,`name2`) ) ENGINE=MyISAM COMMENT='Current and historical objects of all kinds'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_processevents` -- CREATE TABLE IF NOT EXISTS `nagios_processevents` ( `processevent_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `event_type` smallint(6) NOT NULL default '0', `event_time` datetime NOT NULL default '0000-00-00 00:00:00', `event_time_usec` int(11) NOT NULL default '0', `process_id` int(11) NOT NULL default '0', `program_name` varchar(16) character set latin1 NOT NULL default '', `program_version` varchar(20) character set latin1 NOT NULL default '', `program_date` varchar(10) character set latin1 NOT NULL default '', PRIMARY KEY (`processevent_id`) ) ENGINE=MyISAM COMMENT='Historical Nagios process events'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_programstatus` -- CREATE TABLE IF NOT EXISTS `nagios_programstatus` ( `programstatus_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `status_update_time` datetime NOT NULL default '0000-00-00 00:00:00', `program_start_time` datetime NOT NULL default '0000-00-00 00:00:00', `program_end_time` datetime NOT NULL default '0000-00-00 00:00:00', `is_currently_running` smallint(6) NOT NULL default '0', `process_id` int(11) NOT NULL default '0', `daemon_mode` smallint(6) NOT NULL default '0', `last_command_check` datetime NOT NULL default '0000-00-00 00:00:00', `last_log_rotation` datetime NOT NULL default '0000-00-00 00:00:00', `notifications_enabled` smallint(6) NOT NULL default '0', `active_service_checks_enabled` smallint(6) NOT NULL default '0', `passive_service_checks_enabled` smallint(6) NOT NULL default '0', `active_host_checks_enabled` smallint(6) NOT NULL default '0', `passive_host_checks_enabled` smallint(6) NOT NULL default '0', `event_handlers_enabled` smallint(6) NOT NULL default '0', `flap_detection_enabled` smallint(6) NOT NULL default '0', `failure_prediction_enabled` smallint(6) NOT NULL default '0', `process_performance_data` smallint(6) NOT NULL default '0', `obsess_over_hosts` smallint(6) NOT NULL default '0', `obsess_over_services` smallint(6) NOT NULL default '0', `modified_host_attributes` int(11) NOT NULL default '0', `modified_service_attributes` int(11) NOT NULL default '0', `global_host_event_handler` varchar(255) character set latin1 NOT NULL default '', `global_service_event_handler` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`programstatus_id`), UNIQUE KEY `instance_id` (`instance_id`) ) ENGINE=MyISAM COMMENT='Current program status information'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_runtimevariables` -- CREATE TABLE IF NOT EXISTS `nagios_runtimevariables` ( `runtimevariable_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `varname` varchar(64) character set latin1 NOT NULL default '', `varvalue` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`runtimevariable_id`), UNIQUE KEY `instance_id` (`instance_id`,`varname`) ) ENGINE=MyISAM COMMENT='Runtime variables from the Nagios daemon'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_scheduleddowntime` -- CREATE TABLE IF NOT EXISTS `nagios_scheduleddowntime` ( `scheduleddowntime_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `downtime_type` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `entry_time` datetime NOT NULL default '0000-00-00 00:00:00', `author_name` varchar(64) character set latin1 NOT NULL default '', `comment_data` varchar(255) character set latin1 NOT NULL default '', `internal_downtime_id` int(11) NOT NULL default '0', `triggered_by_id` int(11) NOT NULL default '0', `is_fixed` smallint(6) NOT NULL default '0', `duration` smallint(6) NOT NULL default '0', `scheduled_start_time` datetime NOT NULL default '0000-00-00 00:00:00', `scheduled_end_time` datetime NOT NULL default '0000-00-00 00:00:00', `was_started` smallint(6) NOT NULL default '0', `actual_start_time` datetime NOT NULL default '0000-00-00 00:00:00', `actual_start_time_usec` int(11) NOT NULL default '0', PRIMARY KEY (`scheduleddowntime_id`), UNIQUE KEY `instance_id` (`instance_id`,`object_id`,`entry_time`,`internal_downtime_id`) ) ENGINE=MyISAM COMMENT='Current scheduled host and service downtime'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_servicechecks` -- CREATE TABLE IF NOT EXISTS `nagios_servicechecks` ( `servicecheck_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_object_id` int(11) NOT NULL default '0', `check_type` smallint(6) NOT NULL default '0', `current_check_attempt` smallint(6) NOT NULL default '0', `max_check_attempts` smallint(6) NOT NULL default '0', `state` smallint(6) NOT NULL default '0', `state_type` smallint(6) NOT NULL default '0', `start_time` datetime NOT NULL default '0000-00-00 00:00:00', `start_time_usec` int(11) NOT NULL default '0', `end_time` datetime NOT NULL default '0000-00-00 00:00:00', `end_time_usec` int(11) NOT NULL default '0', `command_object_id` int(11) NOT NULL default '0', `command_args` varchar(255) character set latin1 NOT NULL default '', `command_line` varchar(255) character set latin1 NOT NULL default '', `timeout` smallint(6) NOT NULL default '0', `early_timeout` smallint(6) NOT NULL default '0', `execution_time` double NOT NULL default '0', `latency` double NOT NULL default '0', `return_code` smallint(6) NOT NULL default '0', `output` varchar(255) character set latin1 NOT NULL default '', `long_output` TEXT NOT NULL default '', `perfdata` TEXT character set latin1 NOT NULL default '', PRIMARY KEY (`servicecheck_id`), KEY `instance_id` (`instance_id`), KEY `service_object_id` (`service_object_id`), KEY `start_time` (`start_time`) ) ENGINE=MyISAM COMMENT='Historical service checks'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_servicedependencies` -- CREATE TABLE IF NOT EXISTS `nagios_servicedependencies` ( `servicedependency_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `service_object_id` int(11) NOT NULL default '0', `dependent_service_object_id` int(11) NOT NULL default '0', `dependency_type` smallint(6) NOT NULL default '0', `inherits_parent` smallint(6) NOT NULL default '0', `timeperiod_object_id` int(11) NOT NULL default '0', `fail_on_ok` smallint(6) NOT NULL default '0', `fail_on_warning` smallint(6) NOT NULL default '0', `fail_on_unknown` smallint(6) NOT NULL default '0', `fail_on_critical` smallint(6) NOT NULL default '0', PRIMARY KEY (`servicedependency_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`service_object_id`,`dependent_service_object_id`,`dependency_type`,`inherits_parent`,`fail_on_ok`,`fail_on_warning`,`fail_on_unknown`,`fail_on_critical`) ) ENGINE=MyISAM COMMENT='Service dependency definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalations` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalations` ( `serviceescalation_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `service_object_id` int(11) NOT NULL default '0', `timeperiod_object_id` int(11) NOT NULL default '0', `first_notification` smallint(6) NOT NULL default '0', `last_notification` smallint(6) NOT NULL default '0', `notification_interval` double NOT NULL default '0', `escalate_on_recovery` smallint(6) NOT NULL default '0', `escalate_on_warning` smallint(6) NOT NULL default '0', `escalate_on_unknown` smallint(6) NOT NULL default '0', `escalate_on_critical` smallint(6) NOT NULL default '0', PRIMARY KEY (`serviceescalation_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`service_object_id`,`timeperiod_object_id`,`first_notification`,`last_notification`) ) ENGINE=MyISAM COMMENT='Service escalation definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalation_contactgroups` ( `serviceescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `serviceescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`serviceescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`serviceescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM COMMENT='Service escalation contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalation_contacts` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalation_contacts` ( `serviceescalation_contact_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `serviceescalation_id` int(11) NOT NULL default '0', `contact_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`serviceescalation_contact_id`), UNIQUE KEY `instance_id` (`instance_id`,`serviceescalation_id`,`contact_object_id`) ) ENGINE=MyISAM ; -- -------------------------------------------------------- -- -- Table structure for table `nagios_servicegroups` -- CREATE TABLE IF NOT EXISTS `nagios_servicegroups` ( `servicegroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `servicegroup_object_id` int(11) NOT NULL default '0', `alias` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`servicegroup_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`servicegroup_object_id`) ) ENGINE=MyISAM COMMENT='Servicegroup definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_servicegroup_members` -- CREATE TABLE IF NOT EXISTS `nagios_servicegroup_members` ( `servicegroup_member_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `servicegroup_id` int(11) NOT NULL default '0', `service_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`servicegroup_member_id`), UNIQUE KEY `instance_id` (`servicegroup_id`,`service_object_id`) ) ENGINE=MyISAM COMMENT='Servicegroup members'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_services` -- CREATE TABLE IF NOT EXISTS `nagios_services` ( `service_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `host_object_id` int(11) NOT NULL default '0', `service_object_id` int(11) NOT NULL default '0', `display_name` varchar(64) character set latin1 NOT NULL default '', `check_command_object_id` int(11) NOT NULL default '0', `check_command_args` varchar(255) character set latin1 NOT NULL default '', `eventhandler_command_object_id` int(11) NOT NULL default '0', `eventhandler_command_args` varchar(255) character set latin1 NOT NULL default '', `notification_timeperiod_object_id` int(11) NOT NULL default '0', `check_timeperiod_object_id` int(11) NOT NULL default '0', `failure_prediction_options` varchar(64) character set latin1 NOT NULL default '', `check_interval` double NOT NULL default '0', `retry_interval` double NOT NULL default '0', `max_check_attempts` smallint(6) NOT NULL default '0', `first_notification_delay` double NOT NULL default '0', `notification_interval` double NOT NULL default '0', `notify_on_warning` smallint(6) NOT NULL default '0', `notify_on_unknown` smallint(6) NOT NULL default '0', `notify_on_critical` smallint(6) NOT NULL default '0', `notify_on_recovery` smallint(6) NOT NULL default '0', `notify_on_flapping` smallint(6) NOT NULL default '0', `notify_on_downtime` smallint(6) NOT NULL default '0', `stalk_on_ok` smallint(6) NOT NULL default '0', `stalk_on_warning` smallint(6) NOT NULL default '0', `stalk_on_unknown` smallint(6) NOT NULL default '0', `stalk_on_critical` smallint(6) NOT NULL default '0', `is_volatile` smallint(6) NOT NULL default '0', `flap_detection_enabled` smallint(6) NOT NULL default '0', `flap_detection_on_ok` smallint(6) NOT NULL default '0', `flap_detection_on_warning` smallint(6) NOT NULL default '0', `flap_detection_on_unknown` smallint(6) NOT NULL default '0', `flap_detection_on_critical` smallint(6) NOT NULL default '0', `low_flap_threshold` double NOT NULL default '0', `high_flap_threshold` double NOT NULL default '0', `process_performance_data` smallint(6) NOT NULL default '0', `freshness_checks_enabled` smallint(6) NOT NULL default '0', `freshness_threshold` smallint(6) NOT NULL default '0', `passive_checks_enabled` smallint(6) NOT NULL default '0', `event_handler_enabled` smallint(6) NOT NULL default '0', `active_checks_enabled` smallint(6) NOT NULL default '0', `retain_status_information` smallint(6) NOT NULL default '0', `retain_nonstatus_information` smallint(6) NOT NULL default '0', `notifications_enabled` smallint(6) NOT NULL default '0', `obsess_over_service` smallint(6) NOT NULL default '0', `failure_prediction_enabled` smallint(6) NOT NULL default '0', `notes` varchar(255) character set latin1 NOT NULL default '', `notes_url` varchar(255) character set latin1 NOT NULL default '', `action_url` varchar(255) character set latin1 NOT NULL default '', `icon_image` varchar(255) character set latin1 NOT NULL default '', `icon_image_alt` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`service_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`service_object_id`), KEY `service_object_id` (`service_object_id`) ) ENGINE=MyISAM COMMENT='Service definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_servicestatus` -- CREATE TABLE IF NOT EXISTS `nagios_servicestatus` ( `servicestatus_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_object_id` int(11) NOT NULL default '0', `status_update_time` datetime NOT NULL default '0000-00-00 00:00:00', `output` varchar(255) character set latin1 NOT NULL default '', `long_output` TEXT NOT NULL default '', `perfdata` TEXT character set latin1 NOT NULL default '', `current_state` smallint(6) NOT NULL default '0', `has_been_checked` smallint(6) NOT NULL default '0', `should_be_scheduled` smallint(6) NOT NULL default '0', `current_check_attempt` smallint(6) NOT NULL default '0', `max_check_attempts` smallint(6) NOT NULL default '0', `last_check` datetime NOT NULL default '0000-00-00 00:00:00', `next_check` datetime NOT NULL default '0000-00-00 00:00:00', `check_type` smallint(6) NOT NULL default '0', `last_state_change` datetime NOT NULL default '0000-00-00 00:00:00', `last_hard_state_change` datetime NOT NULL default '0000-00-00 00:00:00', `last_hard_state` smallint(6) NOT NULL default '0', `last_time_ok` datetime NOT NULL default '0000-00-00 00:00:00', `last_time_warning` datetime NOT NULL default '0000-00-00 00:00:00', `last_time_unknown` datetime NOT NULL default '0000-00-00 00:00:00', `last_time_critical` datetime NOT NULL default '0000-00-00 00:00:00', `state_type` smallint(6) NOT NULL default '0', `last_notification` datetime NOT NULL default '0000-00-00 00:00:00', `next_notification` datetime NOT NULL default '0000-00-00 00:00:00', `no_more_notifications` smallint(6) NOT NULL default '0', `notifications_enabled` smallint(6) NOT NULL default '0', `problem_has_been_acknowledged` smallint(6) NOT NULL default '0', `acknowledgement_type` smallint(6) NOT NULL default '0', `current_notification_number` smallint(6) NOT NULL default '0', `passive_checks_enabled` smallint(6) NOT NULL default '0', `active_checks_enabled` smallint(6) NOT NULL default '0', `event_handler_enabled` smallint(6) NOT NULL default '0', `flap_detection_enabled` smallint(6) NOT NULL default '0', `is_flapping` smallint(6) NOT NULL default '0', `percent_state_change` double NOT NULL default '0', `latency` double NOT NULL default '0', `execution_time` double NOT NULL default '0', `scheduled_downtime_depth` smallint(6) NOT NULL default '0', `failure_prediction_enabled` smallint(6) NOT NULL default '0', `process_performance_data` smallint(6) NOT NULL default '0', `obsess_over_service` smallint(6) NOT NULL default '0', `modified_service_attributes` int(11) NOT NULL default '0', `event_handler` varchar(255) character set latin1 NOT NULL default '', `check_command` varchar(255) character set latin1 NOT NULL default '', `normal_check_interval` double NOT NULL default '0', `retry_check_interval` double NOT NULL default '0', `check_timeperiod_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`servicestatus_id`), UNIQUE KEY `object_id` (`service_object_id`), KEY `instance_id` (`instance_id`), KEY `status_update_time` (`status_update_time`), KEY `current_state` (`current_state`), KEY `check_type` (`check_type`), KEY `state_type` (`state_type`), KEY `last_state_change` (`last_state_change`), KEY `notifications_enabled` (`notifications_enabled`), KEY `problem_has_been_acknowledged` (`problem_has_been_acknowledged`), KEY `active_checks_enabled` (`active_checks_enabled`), KEY `passive_checks_enabled` (`passive_checks_enabled`), KEY `event_handler_enabled` (`event_handler_enabled`), KEY `flap_detection_enabled` (`flap_detection_enabled`), KEY `is_flapping` (`is_flapping`), KEY `percent_state_change` (`percent_state_change`), KEY `latency` (`latency`), KEY `execution_time` (`execution_time`), KEY `scheduled_downtime_depth` (`scheduled_downtime_depth`) ) ENGINE=MyISAM COMMENT='Current service status information'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_service_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_service_contactgroups` ( `service_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`service_contactgroup_id`), UNIQUE KEY `instance_id` (`service_id`,`contactgroup_object_id`) ) ENGINE=MyISAM COMMENT='Service contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_service_contacts` -- CREATE TABLE IF NOT EXISTS `nagios_service_contacts` ( `service_contact_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_id` int(11) NOT NULL default '0', `contact_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`service_contact_id`), UNIQUE KEY `instance_id` (`instance_id`,`service_id`,`contact_object_id`) ) ENGINE=MyISAM ; -- -------------------------------------------------------- -- -- Table structure for table `nagios_statehistory` -- CREATE TABLE IF NOT EXISTS `nagios_statehistory` ( `statehistory_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `state_time` datetime NOT NULL default '0000-00-00 00:00:00', `state_time_usec` int(11) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `state_change` smallint(6) NOT NULL default '0', `state` smallint(6) NOT NULL default '0', `state_type` smallint(6) NOT NULL default '0', `current_check_attempt` smallint(6) NOT NULL default '0', `max_check_attempts` smallint(6) NOT NULL default '0', `last_state` smallint(6) NOT NULL default '-1', `last_hard_state` smallint(6) NOT NULL default '-1', `output` varchar(255) character set latin1 NOT NULL default '', `long_output` TEXT NOT NULL default '', PRIMARY KEY (`statehistory_id`) ) ENGINE=MyISAM COMMENT='Historical host and service state changes'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_systemcommands` -- CREATE TABLE IF NOT EXISTS `nagios_systemcommands` ( `systemcommand_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `start_time` datetime NOT NULL default '0000-00-00 00:00:00', `start_time_usec` int(11) NOT NULL default '0', `end_time` datetime NOT NULL default '0000-00-00 00:00:00', `end_time_usec` int(11) NOT NULL default '0', `command_line` varchar(255) character set latin1 NOT NULL default '', `timeout` smallint(6) NOT NULL default '0', `early_timeout` smallint(6) NOT NULL default '0', `execution_time` double NOT NULL default '0', `return_code` smallint(6) NOT NULL default '0', `output` varchar(255) character set latin1 NOT NULL default '', `long_output` TEXT NOT NULL default '', PRIMARY KEY (`systemcommand_id`), KEY `instance_id` (`instance_id`), KEY `start_time` (`start_time`) ) ENGINE=MyISAM COMMENT='Historical system commands that are executed'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_timedeventqueue` -- CREATE TABLE IF NOT EXISTS `nagios_timedeventqueue` ( `timedeventqueue_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `event_type` smallint(6) NOT NULL default '0', `queued_time` datetime NOT NULL default '0000-00-00 00:00:00', `queued_time_usec` int(11) NOT NULL default '0', `scheduled_time` datetime NOT NULL default '0000-00-00 00:00:00', `recurring_event` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', PRIMARY KEY (`timedeventqueue_id`), KEY `instance_id` (`instance_id`), KEY `event_type` (`event_type`), KEY `scheduled_time` (`scheduled_time`), KEY `object_id` (`object_id`) ) ENGINE=MyISAM COMMENT='Current Nagios event queue'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_timedevents` -- CREATE TABLE IF NOT EXISTS `nagios_timedevents` ( `timedevent_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `event_type` smallint(6) NOT NULL default '0', `queued_time` datetime NOT NULL default '0000-00-00 00:00:00', `queued_time_usec` int(11) NOT NULL default '0', `event_time` datetime NOT NULL default '0000-00-00 00:00:00', `event_time_usec` int(11) NOT NULL default '0', `scheduled_time` datetime NOT NULL default '0000-00-00 00:00:00', `recurring_event` smallint(6) NOT NULL default '0', `object_id` int(11) NOT NULL default '0', `deletion_time` datetime NOT NULL default '0000-00-00 00:00:00', `deletion_time_usec` int(11) NOT NULL default '0', PRIMARY KEY (`timedevent_id`), KEY `instance_id` (`instance_id`), KEY `event_type` (`event_type`), KEY `scheduled_time` (`scheduled_time`), KEY `object_id` (`object_id`) ) ENGINE=MyISAM COMMENT='Historical events from the Nagios event queue'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_timeperiods` -- CREATE TABLE IF NOT EXISTS `nagios_timeperiods` ( `timeperiod_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `config_type` smallint(6) NOT NULL default '0', `timeperiod_object_id` int(11) NOT NULL default '0', `alias` varchar(255) character set latin1 NOT NULL default '', PRIMARY KEY (`timeperiod_id`), UNIQUE KEY `instance_id` (`instance_id`,`config_type`,`timeperiod_object_id`) ) ENGINE=MyISAM COMMENT='Timeperiod definitions'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_timeperiod_timeranges` -- CREATE TABLE IF NOT EXISTS `nagios_timeperiod_timeranges` ( `timeperiod_timerange_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `timeperiod_id` int(11) NOT NULL default '0', `day` smallint(6) NOT NULL default '0', `start_sec` int(11) NOT NULL default '0', `end_sec` int(11) NOT NULL default '0', PRIMARY KEY (`timeperiod_timerange_id`), UNIQUE KEY `instance_id` (`timeperiod_id`,`day`,`start_sec`,`end_sec`) ) ENGINE=MyISAM COMMENT='Timeperiod definitions'; ndoutils-1.4b9/db/mysql-upgrade-1.4b3.sql0000644000175100017510000002601710712143241020174 0ustar baeckerhbaeckerh-- BEGIN 1.4b5 MODS -- -- Table structure for table `nagios_host_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_host_contactgroups` ( `host_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_contactgroup_id`), UNIQUE KEY `instance_id` (`host_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalation_contactgroups` ( `hostescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`hostescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host escalation contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_service_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_service_contactgroups` ( `service_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`service_contactgroup_id`), UNIQUE KEY `instance_id` (`service_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalation_contactgroups` ( `serviceescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `serviceescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`serviceescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`serviceescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service escalation contact groups'; -- -------------------------------------------------------- ALTER TABLE `nagios_acknowledgements` TYPE = innodb; ALTER TABLE `nagios_commands` TYPE = innodb; ALTER TABLE `nagios_commenthistory` TYPE = innodb; ALTER TABLE `nagios_comments` TYPE = innodb; ALTER TABLE `nagios_configfiles` TYPE = innodb; ALTER TABLE `nagios_configfilevariables` TYPE = innodb; ALTER TABLE `nagios_conninfo` TYPE = innodb; ALTER TABLE `nagios_contact_addresses` TYPE = innodb; ALTER TABLE `nagios_contact_notificationcommands` TYPE = innodb; ALTER TABLE `nagios_contactgroup_members` TYPE = innodb; ALTER TABLE `nagios_contactgroups` TYPE = innodb; ALTER TABLE `nagios_contactnotificationmethods` TYPE = innodb; ALTER TABLE `nagios_contactnotifications` TYPE = innodb; ALTER TABLE `nagios_contacts` TYPE = innodb; ALTER TABLE `nagios_contactstatus` TYPE = innodb; ALTER TABLE `nagios_customvariables` TYPE = innodb; ALTER TABLE `nagios_customvariablestatus` TYPE = innodb; ALTER TABLE `nagios_dbversion` TYPE = innodb; ALTER TABLE `nagios_downtimehistory` TYPE = innodb; ALTER TABLE `nagios_eventhandlers` TYPE = innodb; ALTER TABLE `nagios_externalcommands` TYPE = innodb; ALTER TABLE `nagios_flappinghistory` TYPE = innodb; ALTER TABLE `nagios_host_contactgroups` TYPE = innodb; ALTER TABLE `nagios_host_contacts` TYPE = innodb; ALTER TABLE `nagios_host_parenthosts` TYPE = innodb; ALTER TABLE `nagios_hostchecks` TYPE = innodb; ALTER TABLE `nagios_hostdependencies` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_hostescalations` TYPE = innodb; ALTER TABLE `nagios_hostgroup_members` TYPE = innodb; ALTER TABLE `nagios_hostgroups` TYPE = innodb; ALTER TABLE `nagios_hosts` TYPE = innodb; ALTER TABLE `nagios_hoststatus` TYPE = innodb; ALTER TABLE `nagios_instances` TYPE = innodb; ALTER TABLE `nagios_logentries` TYPE = innodb; ALTER TABLE `nagios_notifications` TYPE = innodb; ALTER TABLE `nagios_objects` TYPE = innodb; ALTER TABLE `nagios_processevents` TYPE = innodb; ALTER TABLE `nagios_programstatus` TYPE = innodb; ALTER TABLE `nagios_runtimevariables` TYPE = innodb; ALTER TABLE `nagios_scheduleddowntime` TYPE = innodb; ALTER TABLE `nagios_service_contactgroups` TYPE = innodb; ALTER TABLE `nagios_service_contacts` TYPE = innodb; ALTER TABLE `nagios_servicechecks` TYPE = innodb; ALTER TABLE `nagios_servicedependencies` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_serviceescalations` TYPE = innodb; ALTER TABLE `nagios_servicegroup_members` TYPE = innodb; ALTER TABLE `nagios_servicegroups` TYPE = innodb; ALTER TABLE `nagios_services` TYPE = innodb; ALTER TABLE `nagios_servicestatus` TYPE = innodb; ALTER TABLE `nagios_statehistory` TYPE = innodb; ALTER TABLE `nagios_systemcommands` TYPE = innodb; ALTER TABLE `nagios_timedeventqueue` TYPE = innodb; ALTER TABLE `nagios_timedevents` TYPE = innodb; ALTER TABLE `nagios_timeperiod_timeranges` TYPE = innodb; ALTER TABLE `nagios_timeperiods` TYPE = innodb; ALTER TABLE `nagios_statehistory` ADD `last_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `max_check_attempts` , ADD `last_hard_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `last_state` ; -- END 1.4b5 MODS -- BEGIN 1.4b7 MODS ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ALTER TABLE `nagios_configfilevariables` ADD INDEX ( `instance_id` , `configfile_id` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` , `service_object_id` ) ; ALTER TABLE `nagios_processevents` ADD INDEX ( `instance_id` , `event_type` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` , `host_object_id` ) ; ALTER TABLE `nagios_flappinghistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_customvariablestatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_contactstatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_conninfo` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_acknowledgements` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_objects` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `logentry_time` ) ; ALTER TABLE `nagios_commenthistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_comments` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_downtimehistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_externalcommands` CHANGE `command_args` `command_args` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_logentries` CHANGE `logentry_data` `logentry_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_scheduleddowntime` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_statehistory` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_processevents` ADD INDEX ( `event_time` , `event_time_usec` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `state_time` , `state_time_usec` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time_usec` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `entry_time` ) ; -- END 1.4b7 MODS ndoutils-1.4b9/db/mysql-upgrade-1.3.sql0000644000175100017510000005774210712143240017756 0ustar baeckerhbaeckerhALTER TABLE `ndo_conninfo` CHANGE `instance_id` `instance_id` SMALLINT NOT NULL DEFAULT '0' ; ALTER TABLE `ndo_services` ADD `notes` VARCHAR( 255 ) NOT NULL , ADD `notes_url` VARCHAR( 255 ) NOT NULL , ADD `action_url` VARCHAR( 255 ) NOT NULL , ADD `icon_image` VARCHAR( 255 ) NOT NULL , ADD `icon_image_alt` VARCHAR( 255 ) NOT NULL ; DROP TABLE `ndo_serviceextinfo` ; ALTER TABLE `ndo_hosts` ADD `notes` VARCHAR( 255 ) NOT NULL , ADD `notes_url` VARCHAR( 255 ) NOT NULL , ADD `action_url` VARCHAR( 255 ) NOT NULL , ADD `icon_image` VARCHAR( 255 ) NOT NULL , ADD `icon_image_alt` VARCHAR( 255 ) NOT NULL , ADD `vrml_image` VARCHAR( 255 ) NOT NULL , ADD `statusmap_image` VARCHAR( 255 ) NOT NULL , ADD `have_2d_coords` SMALLINT NOT NULL , ADD `x_2d` SMALLINT NOT NULL , ADD `y_2d` SMALLINT NOT NULL , ADD `have_3d_coords` SMALLINT NOT NULL , ADD `x_3d` DOUBLE NOT NULL , ADD `y_3d` DOUBLE NOT NULL , ADD `z_3d` DOUBLE NOT NULL ; DROP TABLE `ndo_hostextinfo`; ALTER TABLE `ndo_hostescalations` CHANGE `notification_interval` `notification_interval` DOUBLE NOT NULL DEFAULT '0' ; ALTER TABLE `ndo_serviceescalations` CHANGE `notification_interval` `notification_interval` DOUBLE NOT NULL DEFAULT '0' ; ALTER TABLE `ndo_services` DROP `parallelize_check` ; ALTER TABLE `ndo_services` CHANGE `check_interval` `check_interval` DOUBLE NOT NULL DEFAULT '0', CHANGE `retry_interval` `retry_interval` DOUBLE NOT NULL DEFAULT '0', CHANGE `notification_interval` `notification_interval` DOUBLE NOT NULL DEFAULT '0' ; ALTER TABLE `ndo_hosts` CHANGE `check_interval` `check_interval` DOUBLE NOT NULL DEFAULT '0', CHANGE `notification_interval` `notification_interval` DOUBLE NOT NULL DEFAULT '0' ; ALTER TABLE `ndo_hoststatus` CHANGE `normal_check_interval` `normal_check_interval` DOUBLE NOT NULL DEFAULT '0', CHANGE `retry_check_interval` `retry_check_interval` DOUBLE NOT NULL DEFAULT '0' ; ALTER TABLE `ndo_servicestatus` CHANGE `normal_check_interval` `normal_check_interval` DOUBLE NOT NULL DEFAULT '0', CHANGE `retry_check_interval` `retry_check_interval` DOUBLE NOT NULL DEFAULT '0' ; ALTER TABLE `ndo_services` ADD `first_notification_delay` DOUBLE NOT NULL AFTER `max_check_attempts` ; ALTER TABLE `ndo_hosts` ADD `first_notification_delay` DOUBLE NOT NULL AFTER `max_check_attempts` ; ALTER TABLE `ndo_hosts` ADD `notify_on_downtime` SMALLINT NOT NULL AFTER `notify_on_flapping` ; ALTER TABLE `ndo_services` ADD `notify_on_downtime` SMALLINT NOT NULL AFTER `notify_on_flapping` ; ALTER TABLE `ndo_contacts` ADD `host_notifications_enabled` SMALLINT NOT NULL AFTER `service_timeperiod_object_id` , ADD `service_notifications_enabled` SMALLINT NOT NULL AFTER `host_notifications_enabled` , ADD `can_submit_commands` SMALLINT NOT NULL AFTER `service_notifications_enabled` ; ALTER TABLE `ndo_contacts` ADD `notify_host_downtime` SMALLINT NOT NULL AFTER `notify_host_flapping` ; ALTER TABLE `ndo_contacts` ADD `notify_service_downtime` SMALLINT NOT NULL AFTER `notify_service_flapping` ; ALTER TABLE `ndo_hosts` ADD `retry_interval` DOUBLE NOT NULL AFTER `check_interval` ; ALTER TABLE `ndo_hosts` ADD `flap_detection_on_up` SMALLINT NOT NULL AFTER `flap_detection_enabled` , ADD `flap_detection_on_down` SMALLINT NOT NULL AFTER `flap_detection_on_up` , ADD `flap_detection_on_unreachable` SMALLINT NOT NULL AFTER `flap_detection_on_down` ; ALTER TABLE `ndo_services` ADD `flap_detection_on_ok` SMALLINT NOT NULL AFTER `flap_detection_enabled` , ADD `flap_detection_on_warning` SMALLINT NOT NULL AFTER `flap_detection_on_ok` , ADD `flap_detection_on_unknown` SMALLINT NOT NULL AFTER `flap_detection_on_warning` , ADD `flap_detection_on_critical` SMALLINT NOT NULL AFTER `flap_detection_on_unknown` ; ALTER TABLE `ndo_services` ADD `display_name` VARCHAR( 64 ) NOT NULL AFTER `service_object_id` ; ALTER TABLE `ndo_hosts` ADD `display_name` VARCHAR( 64 ) NOT NULL AFTER `host_object_id` ; ALTER TABLE `ndo_servicestatus` ADD `check_timeperiod_object_id` INT NOT NULL ; ALTER TABLE `ndo_hoststatus` ADD `check_timeperiod_object_id` INT NOT NULL ; ALTER TABLE `ndo_servicedependencies` ADD `timeperiod_object_id` INT NOT NULL AFTER `inherits_parent` ; ALTER TABLE `ndo_hostdependencies` ADD `timeperiod_object_id` INT NOT NULL AFTER `inherits_parent` ; CREATE TABLE `ndo_contactstatus` ( `contactstatus_id` INT NOT NULL AUTO_INCREMENT , `instance_id` SMALLINT NOT NULL , `contact_object_id` INT NOT NULL , `status_update_time` DATETIME NOT NULL , `host_notifications_enabled` SMALLINT NOT NULL , `service_notifications_enabled` SMALLINT NOT NULL , `last_host_notification` DATETIME NOT NULL , `last_service_notification` DATETIME NOT NULL , `modified_attributes` INT NOT NULL , `modified_host_attributes` INT NOT NULL , `modified_service_attributes` INT NOT NULL , PRIMARY KEY ( `contactstatus_id` ) , UNIQUE ( `contact_object_id` ) ) TYPE = MYISAM COMMENT = 'Contact status'; CREATE TABLE `ndo_customvariables` ( `customvariable_id` INT NOT NULL AUTO_INCREMENT , `instance_id` SMALLINT NOT NULL , `object_id` INT NOT NULL , `config_type` SMALLINT NOT NULL , `has_been_modified` SMALLINT NOT NULL , `varname` VARCHAR( 255 ) NOT NULL , `varvalue` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `customvariable_id` ) ) TYPE = MYISAM COMMENT = 'Custom variables'; DROP TABLE `ndo_customobjectvariables` ; CREATE TABLE `ndo_customvariablestatus` ( `customvariablestatus_id` INT NOT NULL AUTO_INCREMENT , `instance_id` SMALLINT NOT NULL , `object_id` INT NOT NULL , `status_update_time` DATETIME NOT NULL , `has_been_modified` SMALLINT NOT NULL , `varname` VARCHAR( 255 ) NOT NULL , `varvalue` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `customvariablestatus_id` ) ) TYPE = MYISAM COMMENT = 'Custom variable status information'; ALTER TABLE `ndo_customvariablestatus` ADD UNIQUE ( `object_id` , `varname` ); ALTER TABLE `ndo_customvariablestatus` ADD INDEX ( `object_id` ) ; ALTER TABLE `ndo_customvariablestatus` ADD INDEX ( `varname` ) ; ALTER TABLE `ndo_customvariables` ADD INDEX ( `object_id` ) ; ALTER TABLE `ndo_customvariables` ADD INDEX ( `varname` ) ; ALTER TABLE `ndo_customvariables` ADD UNIQUE ( `object_id` , `config_type` , `varname` ); DROP TABLE `ndo_serviceescalation_contactgroups`; CREATE TABLE `nagios_serviceescalation_contacts` ( `serviceescalation_contact_id` INT NOT NULL AUTO_INCREMENT , `instance_id` SMALLINT NOT NULL , `serviceescalation_id` INT NOT NULL , `contact_object_id` INT NOT NULL , PRIMARY KEY ( `serviceescalation_contact_id` ) , UNIQUE ( `instance_id` ) ) TYPE = MYISAM ; DROP TABLE `ndo_hostescalation_contactgroups`; CREATE TABLE `nagios_hostescalation_contacts` ( `hostescalation_contact_id` INT NOT NULL AUTO_INCREMENT , `instance_id` SMALLINT NOT NULL , `hostescalation_id` INT NOT NULL , `contact_object_id` INT NOT NULL , PRIMARY KEY ( `hostescalation_contact_id` ) , UNIQUE ( `instance_id` ) ) TYPE = MYISAM ; DROP TABLE `ndo_host_contactgroups`; CREATE TABLE `nagios_host_contacts` ( `host_contact_id` INT NOT NULL AUTO_INCREMENT , `instance_id` SMALLINT NOT NULL , `host_id` INT NOT NULL , `contact_object_id` INT NOT NULL , PRIMARY KEY ( `host_contact_id` ) , UNIQUE ( `instance_id` ) ) TYPE = MYISAM ; DROP TABLE `ndo_service_contactgroups`; CREATE TABLE `nagios_service_contacts` ( `service_contact_id` INT NOT NULL AUTO_INCREMENT , `instance_id` SMALLINT NOT NULL , `service_id` INT NOT NULL , `contact_object_id` INT NOT NULL , PRIMARY KEY ( `service_contact_id` ) , UNIQUE ( `instance_id` ) ) TYPE = MYISAM ; ALTER TABLE `ndo_acknowledgements` RENAME `nagios_acknowledgements` ; ALTER TABLE `ndo_commands` RENAME `nagios_commands` ; ALTER TABLE `ndo_commenthistory` RENAME `nagios_commenthistory` ; ALTER TABLE `ndo_comments` RENAME `nagios_comments` ; ALTER TABLE `ndo_configfiles` RENAME `nagios_configfiles` ; ALTER TABLE `ndo_configfilevariables` RENAME `nagios_configfilevariables` ; ALTER TABLE `ndo_conninfo` RENAME `nagios_conninfo` ; ALTER TABLE `ndo_contact_addresses` RENAME `nagios_contact_addresses` ; ALTER TABLE `ndo_contact_notificationcommands` RENAME `nagios_contact_notificationcommands` ; ALTER TABLE `ndo_contactgroup_members` RENAME `nagios_contactgroup_members` ; ALTER TABLE `ndo_contactgroups` RENAME `nagios_contactgroups` ; ALTER TABLE `ndo_contactnotificationmethods` RENAME `nagios_contactnotificationmethods` ; ALTER TABLE `ndo_contactnotifications` RENAME `nagios_contactnotifications` ; ALTER TABLE `ndo_contacts` RENAME `nagios_contacts` ; ALTER TABLE `ndo_contactstatus` RENAME `nagios_contactstatus` ; ALTER TABLE `ndo_customvariables` RENAME `nagios_customvariables` ; ALTER TABLE `ndo_customvariablestatus` RENAME `nagios_customvariablestatus` ; ALTER TABLE `ndo_downtimehistory` RENAME `nagios_downtimehistory` ; ALTER TABLE `ndo_eventhandlers` RENAME `nagios_eventhandlers` ; ALTER TABLE `ndo_externalcommands` RENAME `nagios_externalcommands` ; ALTER TABLE `ndo_flappinghistory` RENAME `nagios_flappinghistory` ; ALTER TABLE `ndo_host_parenthosts` RENAME `nagios_host_parenthosts` ; ALTER TABLE `ndo_hostchecks` RENAME `nagios_hostchecks` ; ALTER TABLE `ndo_hostdependencies` RENAME `nagios_hostdependencies` ; ALTER TABLE `ndo_hostescalations` RENAME `nagios_hostescalations` ; ALTER TABLE `ndo_hostgroup_members` RENAME `nagios_hostgroup_members` ; ALTER TABLE `ndo_hostgroups` RENAME `nagios_hostgroups` ; ALTER TABLE `ndo_hosts` RENAME `nagios_hosts` ; ALTER TABLE `ndo_hoststatus` RENAME `nagios_hoststatus` ; ALTER TABLE `ndo_instances` RENAME `nagios_instances` ; ALTER TABLE `ndo_logentries` RENAME `nagios_logentries` ; ALTER TABLE `ndo_notifications` RENAME `nagios_notifications` ; ALTER TABLE `ndo_objects` RENAME `nagios_objects` ; ALTER TABLE `ndo_processevents` RENAME `nagios_processevents` ; ALTER TABLE `ndo_programstatus` RENAME `nagios_programstatus` ; ALTER TABLE `ndo_runtimevariables` RENAME `nagios_runtimevariables` ; ALTER TABLE `ndo_scheduleddowntime` RENAME `nagios_scheduleddowntime` ; ALTER TABLE `ndo_servicechecks` RENAME `nagios_servicechecks` ; ALTER TABLE `ndo_servicedependencies` RENAME `nagios_servicedependencies` ; ALTER TABLE `ndo_serviceescalations` RENAME `nagios_serviceescalations` ; ALTER TABLE `ndo_servicegroup_members` RENAME `nagios_servicegroup_members` ; ALTER TABLE `ndo_servicegroups` RENAME `nagios_servicegroups` ; ALTER TABLE `ndo_services` RENAME `nagios_services` ; ALTER TABLE `ndo_servicestatus` RENAME `nagios_servicestatus` ; ALTER TABLE `ndo_statehistory` RENAME `nagios_statehistory` ; ALTER TABLE `ndo_systemcommands` RENAME `nagios_systemcommands` ; ALTER TABLE `ndo_timedeventqueue` RENAME `nagios_timedeventqueue` ; ALTER TABLE `ndo_timedevents` RENAME `nagios_timedevents` ; ALTER TABLE `ndo_timeperiod_timeranges` RENAME `nagios_timeperiod_timeranges` ; ALTER TABLE `ndo_timeperiods` RENAME `nagios_timeperiods` ; ALTER TABLE `nagios_processevents` CHANGE `program_version` `program_version` VARCHAR( 20 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL; ALTER TABLE `nagios_statehistory` CHANGE `max_attempts` `max_check_attempts` SMALLINT( 6 ) NOT NULL DEFAULT '0'; ALTER TABLE `nagios_statehistory` CHANGE `current_attempt` `current_check_attempt` SMALLINT( 6 ) NOT NULL DEFAULT '0'; ALTER TABLE `nagios_contactstatus` ENGINE=MyISAM COMMENT='Contact status'; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Contact status' ALTER TABLE `nagios_customvariables` DROP INDEX `object_id`; # was INDEX (`object_id`) ALTER TABLE `nagios_customvariables` ENGINE=MyISAM COMMENT='Custom variables'; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Custom variables' ALTER TABLE `nagios_customvariablestatus` DROP INDEX `object_id_2`; # was INDEX (`object_id`) ALTER TABLE `nagios_customvariablestatus` ADD INDEX `object_id_2` (`object_id`,`varname`); ALTER TABLE `nagios_customvariablestatus` DROP INDEX `object_id`; # was INDEX (`object_id`,`varname`) ALTER TABLE `nagios_customvariablestatus` ENGINE=MyISAM COMMENT='Custom variable status information'; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Custom variable status information' ALTER TABLE `nagios_host_contacts` ENGINE=MyISAM DEFAULT CHARSET=ascii; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE `nagios_hostescalation_contacts` ENGINE=MyISAM DEFAULT CHARSET=ascii; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE `nagios_service_contacts` ENGINE=MyISAM DEFAULT CHARSET=ascii; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE `nagios_serviceescalation_contacts` ENGINE=MyISAM DEFAULT CHARSET=ascii; # was ENGINE=MyISAM DEFAULT CHARSET=latin1 ALTER TABLE `nagios_customvariables` CHANGE `varname` `varname` VARCHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL , CHANGE `varvalue` `varvalue` VARCHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL; ALTER TABLE `nagios_customvariablestatus` CHANGE `varname` `varname` VARCHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL , CHANGE `varvalue` `varvalue` VARCHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_services` ADD `host_object_id` INT( 11 ) NOT NULL DEFAULT '0' AFTER `config_type` ; -- Start of mods from 1.4b3 -- ALTER TABLE `nagios_hosts` ADD `alias` VARCHAR( 64 ) NOT NULL AFTER `host_object_id` ; -- End of mods from 1.4b3 -- -- BEGIN 1.4b5 MODS -- -- Table structure for table `nagios_host_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_host_contactgroups` ( `host_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `host_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`host_contactgroup_id`), UNIQUE KEY `instance_id` (`host_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_hostescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_hostescalation_contactgroups` ( `hostescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `hostescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`hostescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`hostescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Host escalation contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_service_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_service_contactgroups` ( `service_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `service_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`service_contactgroup_id`), UNIQUE KEY `instance_id` (`service_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service contact groups'; -- -------------------------------------------------------- -- -- Table structure for table `nagios_serviceescalation_contactgroups` -- CREATE TABLE IF NOT EXISTS `nagios_serviceescalation_contactgroups` ( `serviceescalation_contactgroup_id` int(11) NOT NULL auto_increment, `instance_id` smallint(6) NOT NULL default '0', `serviceescalation_id` int(11) NOT NULL default '0', `contactgroup_object_id` int(11) NOT NULL default '0', PRIMARY KEY (`serviceescalation_contactgroup_id`), UNIQUE KEY `instance_id` (`serviceescalation_id`,`contactgroup_object_id`) ) ENGINE=MyISAM DEFAULT CHARSET=ascii COMMENT='Service escalation contact groups'; -- -------------------------------------------------------- ALTER TABLE `nagios_acknowledgements` TYPE = innodb; ALTER TABLE `nagios_commands` TYPE = innodb; ALTER TABLE `nagios_commenthistory` TYPE = innodb; ALTER TABLE `nagios_comments` TYPE = innodb; ALTER TABLE `nagios_configfiles` TYPE = innodb; ALTER TABLE `nagios_configfilevariables` TYPE = innodb; ALTER TABLE `nagios_conninfo` TYPE = innodb; ALTER TABLE `nagios_contact_addresses` TYPE = innodb; ALTER TABLE `nagios_contact_notificationcommands` TYPE = innodb; ALTER TABLE `nagios_contactgroup_members` TYPE = innodb; ALTER TABLE `nagios_contactgroups` TYPE = innodb; ALTER TABLE `nagios_contactnotificationmethods` TYPE = innodb; ALTER TABLE `nagios_contactnotifications` TYPE = innodb; ALTER TABLE `nagios_contacts` TYPE = innodb; ALTER TABLE `nagios_contactstatus` TYPE = innodb; ALTER TABLE `nagios_customvariables` TYPE = innodb; ALTER TABLE `nagios_customvariablestatus` TYPE = innodb; ALTER TABLE `nagios_dbversion` TYPE = innodb; ALTER TABLE `nagios_downtimehistory` TYPE = innodb; ALTER TABLE `nagios_eventhandlers` TYPE = innodb; ALTER TABLE `nagios_externalcommands` TYPE = innodb; ALTER TABLE `nagios_flappinghistory` TYPE = innodb; ALTER TABLE `nagios_host_contactgroups` TYPE = innodb; ALTER TABLE `nagios_host_contacts` TYPE = innodb; ALTER TABLE `nagios_host_parenthosts` TYPE = innodb; ALTER TABLE `nagios_hostchecks` TYPE = innodb; ALTER TABLE `nagios_hostdependencies` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_hostescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_hostescalations` TYPE = innodb; ALTER TABLE `nagios_hostgroup_members` TYPE = innodb; ALTER TABLE `nagios_hostgroups` TYPE = innodb; ALTER TABLE `nagios_hosts` TYPE = innodb; ALTER TABLE `nagios_hoststatus` TYPE = innodb; ALTER TABLE `nagios_instances` TYPE = innodb; ALTER TABLE `nagios_logentries` TYPE = innodb; ALTER TABLE `nagios_notifications` TYPE = innodb; ALTER TABLE `nagios_objects` TYPE = innodb; ALTER TABLE `nagios_processevents` TYPE = innodb; ALTER TABLE `nagios_programstatus` TYPE = innodb; ALTER TABLE `nagios_runtimevariables` TYPE = innodb; ALTER TABLE `nagios_scheduleddowntime` TYPE = innodb; ALTER TABLE `nagios_service_contactgroups` TYPE = innodb; ALTER TABLE `nagios_service_contacts` TYPE = innodb; ALTER TABLE `nagios_servicechecks` TYPE = innodb; ALTER TABLE `nagios_servicedependencies` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contactgroups` TYPE = innodb; ALTER TABLE `nagios_serviceescalation_contacts` TYPE = innodb; ALTER TABLE `nagios_serviceescalations` TYPE = innodb; ALTER TABLE `nagios_servicegroup_members` TYPE = innodb; ALTER TABLE `nagios_servicegroups` TYPE = innodb; ALTER TABLE `nagios_services` TYPE = innodb; ALTER TABLE `nagios_servicestatus` TYPE = innodb; ALTER TABLE `nagios_statehistory` TYPE = innodb; ALTER TABLE `nagios_systemcommands` TYPE = innodb; ALTER TABLE `nagios_timedeventqueue` TYPE = innodb; ALTER TABLE `nagios_timedevents` TYPE = innodb; ALTER TABLE `nagios_timeperiod_timeranges` TYPE = innodb; ALTER TABLE `nagios_timeperiods` TYPE = innodb; ALTER TABLE `nagios_statehistory` ADD `last_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `max_check_attempts` , ADD `last_hard_state` SMALLINT DEFAULT '-1' NOT NULL AFTER `last_state` ; -- END 1.4b5 MODS -- BEGIN 1.4b7 MODS ALTER TABLE `nagios_configfilevariables` DROP INDEX `instance_id`; ALTER TABLE `nagios_configfilevariables` ADD INDEX ( `instance_id` , `configfile_id` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `instance_id` , `service_object_id` ) ; ALTER TABLE `nagios_processevents` ADD INDEX ( `instance_id` , `event_type` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `instance_id` , `host_object_id` ) ; ALTER TABLE `nagios_flappinghistory` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_customvariablestatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_contactstatus` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_conninfo` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_acknowledgements` ADD INDEX ( `instance_id` , `object_id` ) ; ALTER TABLE `nagios_objects` ADD INDEX ( `instance_id` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `logentry_time` ) ; ALTER TABLE `nagios_commenthistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_comments` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_downtimehistory` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_externalcommands` CHANGE `command_args` `command_args` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hostchecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_hoststatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_logentries` CHANGE `logentry_data` `logentry_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_scheduleddowntime` CHANGE `comment_data` `comment_data` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicechecks` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_servicestatus` CHANGE `perfdata` `perfdata` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_statehistory` CHANGE `output` `output` TEXT CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL ; ALTER TABLE `nagios_processevents` ADD INDEX ( `event_time` , `event_time_usec` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `state_type` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_hoststatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `current_state` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `last_check` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `notifications_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `problem_has_been_acknowledged` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `passive_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `active_checks_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `event_handler_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `flap_detection_enabled` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `is_flapping` ) ; ALTER TABLE `nagios_servicestatus` ADD INDEX ( `scheduled_downtime_depth` ) ; ALTER TABLE `nagios_statehistory` ADD INDEX ( `state_time` , `state_time_usec` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `event_type` ) ; ALTER TABLE `nagios_timedeventqueue` ADD INDEX ( `scheduled_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time` ) ; ALTER TABLE `nagios_logentries` ADD INDEX ( `entry_time_usec` ) ; ALTER TABLE `nagios_externalcommands` ADD INDEX ( `entry_time` ) ; -- END 1.4b7 MODS ndoutils-1.4b9/db/installdb0000755000175100017510000000344111271525175016045 0ustar baeckerhbaeckerh#!/usr/bin/perl # # SYNTAX: my $usage = "installdb -u user -p password -h hostname -d database"; # # DESCRIPTION: # Runs installation script in this directory # Options as mysql's for authentication # # COPYRIGHT: # Copyright (C) 2005 Altinity Limited # Copyright is freely given to Ethan Galstad if included in the NDOUtils distribution # # LICENCE: # GNU GPLv2 # # Last Updated: 03/21/2007 # use strict; use FindBin qw($Bin); use Getopt::Std; use DBI; sub usage { print $usage,$/,"\t",$_[0],$/; exit 1; } my $opts = {}; getopts("u:p:h:d:", $opts) or usage "Bad options"; my $database = $opts->{d} || usage "Must specify a database"; my $hostname = $opts->{h} || "localhost"; my $username = $opts->{u} || usage "Must specify a username"; my $password = $opts->{p}; usage "Must specify a password" unless defined $password; # Could be blank # Connect to database my $dbh = DBI->connect("DBI:mysql:database=$database;host=$hostname", $username, $password, { RaiseError => 1 }, ) or die "Cannot connect to database"; # Current database version my $thisversion="1.4b9"; # Create version table if it doesn't exist eval { $dbh->do("SELECT * FROM nagios_dbversion LIMIT 1") }; if ($@) { my $file="mysql.sql"; if (-e $file){ print "** Creating tables for version $thisversion",$/; print " Using $file for installation...",$/; my $p = "-p$password" if $password; # Not required if password is blank system("mysql -u $username $p -D$database -h$hostname < $file") == 0 or die "Installation from $file failed"; } else{ die "No installation script found!"; } print "** Updating table nagios_dbversion",$/; $dbh->do("INSERT nagios_dbversion SET name='ndoutils', version='$thisversion';"); print "Done!",$/; } else { print "*** Database already installed",$/; exit 0; }; ndoutils-1.4b9/db/queries/0000755000175100017510000000000011227320614015606 5ustar baeckerhbaeckerhndoutils-1.4b9/db/queries/servicegroup_membership.sql0000644000175100017510000000156010554225543023270 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_servicegroups.servicegroup_id ,nagios_servicegroups.servicegroup_object_id ,obj1.name1 AS servicegroup_name ,nagios_servicegroups.alias AS servicegroup_alias ,nagios_services.service_object_id ,obj2.name1 AS host_name ,obj2.name2 AS service_description FROM `nagios_servicegroups` INNER JOIN nagios_servicegroup_members ON nagios_servicegroups.servicegroup_id=nagios_servicegroup_members.servicegroup_id INNER JOIN nagios_services ON nagios_servicegroup_members.service_object_id=nagios_services.service_object_id INNER JOIN nagios_objects as obj1 ON nagios_servicegroups.servicegroup_object_id=obj1.object_id INNER JOIN nagios_objects as obj2 ON nagios_servicegroup_members.service_object_id=obj2.object_id INNER JOIN nagios_instances ON nagios_servicegroups.instance_id=nagios_instances.instance_idndoutils-1.4b9/db/queries/state_history.sql0000644000175100017510000000070210554225543021236 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_statehistory.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_statehistory.* FROM `nagios_statehistory` LEFT JOIN nagios_objects as obj1 ON nagios_statehistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_statehistory.instance_id=nagios_instances.instance_id ORDER BY state_time DESC, state_time_usec DESC ndoutils-1.4b9/db/queries/downtime_history.sql0000644000175100017510000000102310554225537021744 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_downtimehistory.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_downtimehistory.* FROM `nagios_downtimehistory` LEFT JOIN nagios_objects as obj1 ON nagios_downtimehistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_downtimehistory.instance_id=nagios_instances.instance_id ORDER BY scheduled_start_time DESC, actual_start_time DESC, actual_start_time_usec DESC, downtimehistory_id DESC ndoutils-1.4b9/db/queries/contact_notification_methods.sql0000644000175100017510000000240410554225537024265 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_notifications.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,obj2.name1 AS contact_name ,nagios_contactnotifications.start_time AS notification_start_time ,nagios_contactnotifications.start_time_usec AS notification_start_time_usec ,nagios_contactnotifications.end_time AS notification_end_time ,nagios_contactnotifications.end_time_usec AS notification_end_time_usec ,obj3.name1 AS notification_command_name ,nagios_contactnotificationmethods.* FROM `nagios_contactnotificationmethods` JOIN nagios_contactnotifications ON nagios_contactnotificationmethods.contactnotification_id=nagios_contactnotifications.contactnotification_id JOIN nagios_notifications ON nagios_contactnotifications.notification_id=nagios_notifications.notification_id LEFT JOIN nagios_objects as obj1 ON nagios_notifications.object_id=obj1.object_id LEFT JOIN nagios_objects as obj2 ON nagios_contactnotifications.contact_object_id=obj2.object_id LEFT JOIN nagios_objects as obj3 ON nagios_contactnotificationmethods.command_object_id=obj3.object_id LEFT JOIN nagios_instances ON nagios_notifications.instance_id=nagios_instances.instance_id ORDER BY start_time DESC, start_time_usec DESC ndoutils-1.4b9/db/queries/service_comments.sql0000644000175100017510000000071010554225542021700 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_comments.object_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_comments.* FROM `nagios_comments` LEFT JOIN nagios_objects as obj1 ON nagios_comments.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_comments.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='2' ORDER BY entry_time DESC, entry_time_usec DESC, comment_id DESC ndoutils-1.4b9/db/queries/service_event_handlers.sql0000644000175100017510000000074610554225543023066 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_eventhandlers.object_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_eventhandlers.* FROM `nagios_eventhandlers` LEFT JOIN nagios_objects as obj1 ON nagios_eventhandlers.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_eventhandlers.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='2' ORDER BY start_time DESC, start_time_usec DESC, eventhandler_id DESC ndoutils-1.4b9/db/queries/comments.sql0000644000175100017510000000067710554225537020200 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_comments.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_comments.* FROM `nagios_comments` LEFT JOIN nagios_objects as obj1 ON nagios_comments.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_comments.instance_id=nagios_instances.instance_id ORDER BY entry_time DESC, entry_time_usec DESC, comment_id DESC ndoutils-1.4b9/db/queries/service_downtime_history.sql0000644000175100017510000000103410554225543023463 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_downtimehistory.object_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_downtimehistory.* FROM `nagios_downtimehistory` LEFT JOIN nagios_objects as obj1 ON nagios_downtimehistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_downtimehistory.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='2' ORDER BY scheduled_start_time DESC, actual_start_time DESC, actual_start_time_usec DESC, downtimehistory_id DESC ndoutils-1.4b9/db/queries/service_notifications.sql0000644000175100017510000000074310554225543022733 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_notifications.object_id AS service_object_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_notifications.* FROM `nagios_notifications` LEFT JOIN nagios_objects as obj1 ON nagios_notifications.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_notifications.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='2' ORDER BY start_time DESC, start_time_usec DESCndoutils-1.4b9/db/queries/host_downtime_history.sql0000644000175100017510000000077110554225542023006 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_downtimehistory.object_id ,obj1.name1 AS host_name ,nagios_downtimehistory.* FROM `nagios_downtimehistory` LEFT JOIN nagios_objects as obj1 ON nagios_downtimehistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_downtimehistory.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='1' ORDER BY scheduled_start_time DESC, actual_start_time DESC, actual_start_time_usec DESC, downtimehistory_id DESC ndoutils-1.4b9/db/queries/services.sql0000644000175100017510000000076110554225543020165 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_services.host_object_id ,obj1.name1 AS host_name ,nagios_services.service_object_id ,obj1.name2 AS service_description FROM `nagios_services` LEFT JOIN nagios_objects as obj1 ON nagios_services.service_object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_services.instance_id=nagios_instances.instance_id WHERE nagios_services.config_type='1' ORDER BY instance_name ASC, host_name ASC, service_description ASC ndoutils-1.4b9/db/queries/scheduled_downtime.sql0000644000175100017510000000075210554225542022207 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_scheduleddowntime.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_scheduleddowntime.* FROM `nagios_scheduleddowntime` LEFT JOIN nagios_objects as obj1 ON nagios_scheduleddowntime.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_scheduleddowntime.instance_id=nagios_instances.instance_id ORDER BY scheduled_start_time DESC, scheduleddowntime_id DESC ndoutils-1.4b9/db/queries/host_state_history.sql0000644000175100017510000000065010554225542022274 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_statehistory.object_id ,obj1.name1 AS host_name ,nagios_statehistory.* FROM `nagios_statehistory` LEFT JOIN nagios_objects as obj1 ON nagios_statehistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_statehistory.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='1' ORDER BY state_time DESC, state_time_usec DESC ndoutils-1.4b9/db/queries/timed_event_queue.sql0000644000175100017510000000105610554225543022047 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_timedeventqueue.event_type ,nagios_timedeventqueue.scheduled_time ,nagios_timedeventqueue.recurring_event ,obj1.objecttype_id ,nagios_timedeventqueue.object_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description FROM `nagios_timedeventqueue` LEFT JOIN nagios_objects as obj1 ON nagios_timedeventqueue.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_timedeventqueue.instance_id=nagios_instances.instance_id ORDER BY scheduled_time ASC, timedeventqueue_id ASC ndoutils-1.4b9/db/queries/comment_history.sql0000644000175100017510000000074410554225537021571 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_commenthistory.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_commenthistory.* FROM `nagios_commenthistory` LEFT JOIN nagios_objects as obj1 ON nagios_commenthistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_commenthistory.instance_id=nagios_instances.instance_id ORDER BY entry_time DESC, entry_time_usec DESC, commenthistory_id DESC ndoutils-1.4b9/db/queries/host_comments.sql0000644000175100017510000000064510554225542021224 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_comments.object_id ,obj1.name1 AS host_name ,nagios_comments.* FROM `nagios_comments` LEFT JOIN nagios_objects as obj1 ON nagios_comments.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_comments.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='1' ORDER BY entry_time DESC, entry_time_usec DESC, comment_id DESC ndoutils-1.4b9/db/queries/host_event_handlers.sql0000644000175100017510000000070310554225542022373 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_eventhandlers.object_id ,obj1.name1 AS host_name ,nagios_eventhandlers.* FROM `nagios_eventhandlers` LEFT JOIN nagios_objects as obj1 ON nagios_eventhandlers.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_eventhandlers.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='1' ORDER BY start_time DESC, start_time_usec DESC, eventhandler_id DESC ndoutils-1.4b9/db/queries/event_handlers.sql0000644000175100017510000000073510554225542021343 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_eventhandlers.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_eventhandlers.* FROM `nagios_eventhandlers` LEFT JOIN nagios_objects as obj1 ON nagios_eventhandlers.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_eventhandlers.instance_id=nagios_instances.instance_id ORDER BY start_time DESC, start_time_usec DESC, eventhandler_id DESC ndoutils-1.4b9/db/queries/contact_notifications.sql0000644000175100017510000000130010554225537022717 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_notifications.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,obj2.name1 AS contact_name ,nagios_contactnotifications.* FROM `nagios_contactnotifications` JOIN nagios_notifications ON nagios_contactnotifications.notification_id=nagios_notifications.notification_id LEFT JOIN nagios_objects as obj1 ON nagios_notifications.object_id=obj1.object_id LEFT JOIN nagios_objects as obj2 ON nagios_contactnotifications.contact_object_id=obj2.object_id LEFT JOIN nagios_instances ON nagios_notifications.instance_id=nagios_instances.instance_id ORDER BY start_time DESC, start_time_usec DESC ndoutils-1.4b9/db/queries/host_flapping_history.sql0000644000175100017510000000072010554225542022752 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_flappinghistory.object_id ,obj1.name1 AS host_name ,nagios_flappinghistory.* FROM `nagios_flappinghistory` LEFT JOIN nagios_objects as obj1 ON nagios_flappinghistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_flappinghistory.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='1' ORDER BY event_time DESC, event_time_usec DESC, flappinghistory_id DESC ndoutils-1.4b9/db/queries/service_status.sql0000644000175100017510000000116710554225543021406 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_services.host_object_id ,obj1.name1 AS host_name ,nagios_services.service_object_id ,obj1.name2 AS service_description ,nagios_servicestatus.* FROM `nagios_servicestatus` LEFT JOIN nagios_objects as obj1 ON nagios_servicestatus.service_object_id=obj1.object_id LEFT JOIN nagios_services ON nagios_servicestatus.service_object_id=nagios_services.service_object_id LEFT JOIN nagios_instances ON nagios_services.instance_id=nagios_instances.instance_id WHERE nagios_services.config_type='1' ORDER BY instance_name ASC, host_name ASC, service_description ASCndoutils-1.4b9/db/queries/host_notifications.sql0000644000175100017510000000067510554225542022253 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_notifications.object_id AS host_object_id ,obj1.name1 AS host_name ,nagios_notifications.* FROM `nagios_notifications` LEFT JOIN nagios_objects as obj1 ON nagios_notifications.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_notifications.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='1' ORDER BY start_time DESC, start_time_usec DESCndoutils-1.4b9/db/queries/notifications.sql0000644000175100017510000000070710554225542021212 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_notifications.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_notifications.* FROM `nagios_notifications` LEFT JOIN nagios_objects as obj1 ON nagios_notifications.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_notifications.instance_id=nagios_instances.instance_id ORDER BY start_time DESC, start_time_usec DESC ndoutils-1.4b9/db/queries/contacts.sql0000644000175100017510000000063310554225537020161 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_contacts.contact_object_id ,obj1.name1 AS contact_name FROM `nagios_contacts` LEFT JOIN nagios_objects as obj1 ON nagios_contacts.contact_object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_contacts.instance_id=nagios_instances.instance_id WHERE nagios_contacts.config_type='1' ORDER BY instance_name ASC, contact_name ASC ndoutils-1.4b9/db/queries/contactgroup_membership.sql0000644000175100017510000000152010554225537023262 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_contactgroups.contactgroup_id ,nagios_contactgroups.contactgroup_object_id ,obj1.name1 AS contactgroup_name ,nagios_contactgroups.alias AS contactgroup_alias ,nagios_contacts.contact_object_id ,obj2.name1 AS contact_name FROM `nagios_contactgroups` INNER JOIN nagios_contactgroup_members ON nagios_contactgroups.contactgroup_id=nagios_contactgroup_members.contactgroup_id INNER JOIN nagios_contacts ON nagios_contactgroup_members.contact_object_id=nagios_contacts.contact_object_id INNER JOIN nagios_objects as obj1 ON nagios_contactgroups.contactgroup_object_id=obj1.object_id INNER JOIN nagios_objects as obj2 ON nagios_contactgroup_members.contact_object_id=obj2.object_id INNER JOIN nagios_instances ON nagios_contactgroups.instance_id=nagios_instances.instance_idndoutils-1.4b9/db/queries/flapping_history.sql0000644000175100017510000000075210554225542021722 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_flappinghistory.object_id ,obj1.objecttype_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_flappinghistory.* FROM `nagios_flappinghistory` LEFT JOIN nagios_objects as obj1 ON nagios_flappinghistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_flappinghistory.instance_id=nagios_instances.instance_id ORDER BY event_time DESC, event_time_usec DESC, flappinghistory_id DESC ndoutils-1.4b9/db/queries/service_flapping_history.sql0000644000175100017510000000076310554225543023445 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_flappinghistory.object_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_flappinghistory.* FROM `nagios_flappinghistory` LEFT JOIN nagios_objects as obj1 ON nagios_flappinghistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_flappinghistory.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='2' ORDER BY event_time DESC, event_time_usec DESC, flappinghistory_id DESC ndoutils-1.4b9/db/queries/timed_events.sql0000644000175100017510000000115710554225543021030 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_timedevents.event_type ,nagios_timedevents.scheduled_time ,nagios_timedevents.event_time ,nagios_timedevents.event_time_usec ,nagios_timedevents.recurring_event ,obj1.objecttype_id ,nagios_timedevents.object_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description FROM `nagios_timedevents` LEFT JOIN nagios_objects as obj1 ON nagios_timedevents.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_timedevents.instance_id=nagios_instances.instance_id WHERE scheduled_time < NOW() ORDER BY scheduled_time DESC, timedevent_id DESC ndoutils-1.4b9/db/queries/service_state_history.sql0000644000175100017510000000071310554225543022760 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_statehistory.object_id ,obj1.name1 AS host_name ,obj1.name2 AS service_description ,nagios_statehistory.* FROM `nagios_statehistory` LEFT JOIN nagios_objects as obj1 ON nagios_statehistory.object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_statehistory.instance_id=nagios_instances.instance_id WHERE obj1.objecttype_id='2' ORDER BY state_time DESC, state_time_usec DESC ndoutils-1.4b9/db/queries/hostgroup_membership.sql0000644000175100017510000000140210554225542022577 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_hostgroups.hostgroup_id ,nagios_hostgroups.hostgroup_object_id ,obj1.name1 AS hostgroup_name ,nagios_hostgroups.alias AS hostgroup_alias ,nagios_hosts.host_object_id ,obj2.name1 AS host_name FROM `nagios_hostgroups` INNER JOIN nagios_hostgroup_members ON nagios_hostgroups.hostgroup_id=nagios_hostgroup_members.hostgroup_id INNER JOIN nagios_hosts ON nagios_hostgroup_members.host_object_id=nagios_hosts.host_object_id INNER JOIN nagios_objects as obj1 ON nagios_hostgroups.hostgroup_object_id=obj1.object_id INNER JOIN nagios_objects as obj2 ON nagios_hostgroup_members.host_object_id=obj2.object_id INNER JOIN nagios_instances ON nagios_hostgroups.instance_id=nagios_instances.instance_idndoutils-1.4b9/db/queries/hosts.sql0000644000175100017510000000060010554225542017471 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_hosts.host_object_id ,obj1.name1 AS host_name FROM `nagios_hosts` LEFT JOIN nagios_objects as obj1 ON nagios_hosts.host_object_id=obj1.object_id LEFT JOIN nagios_instances ON nagios_hosts.instance_id=nagios_instances.instance_id WHERE nagios_hosts.config_type='1' ORDER BY instance_name ASC, host_name ASC ndoutils-1.4b9/db/queries/contact_status.sql0000644000175100017510000000104110554225537021373 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_contacts.contact_object_id ,obj1.name1 AS contact_name ,nagios_contactstatus.* FROM `nagios_contactstatus` LEFT JOIN nagios_objects as obj1 ON nagios_contactstatus.contact_object_id=obj1.object_id LEFT JOIN nagios_contacts ON nagios_contactstatus.contact_object_id=nagios_contacts.contact_object_id LEFT JOIN nagios_instances ON nagios_contacts.instance_id=nagios_instances.instance_id WHERE nagios_contacts.config_type='1' ORDER BY instance_name ASC, contact_name ASCndoutils-1.4b9/db/queries/host_status.sql0000644000175100017510000000076410554225542020724 0ustar baeckerhbaeckerhSELECT nagios_instances.instance_id ,nagios_instances.instance_name ,nagios_hosts.host_object_id ,obj1.name1 AS host_name ,nagios_hoststatus.* FROM `nagios_hoststatus` LEFT JOIN nagios_objects as obj1 ON nagios_hoststatus.host_object_id=obj1.object_id LEFT JOIN nagios_hosts ON nagios_hoststatus.host_object_id=nagios_hosts.host_object_id LEFT JOIN nagios_instances ON nagios_hosts.instance_id=nagios_instances.instance_id WHERE nagios_hosts.config_type='1' ORDER BY instance_name ASC, host_name ASCndoutils-1.4b9/include/0000755000175100017510000000000011267536772015211 5ustar baeckerhbaeckerhndoutils-1.4b9/include/utils.h0000644000175100017510000000135410746404655016520 0ustar baeckerhbaeckerh/************************************************************************ * * UTILS.H - NDO utilities header file * Copyright (c) 2005-2008 Ethan Galstad * Last Modified: 01-25-2008 * ************************************************************************/ #ifndef _NDO_UTILS_H #define _NDO_UTILS_H /* my_free has been freed from bondage as a function */ #define my_free(ptr) { if(ptr) { free(ptr); ptr = NULL; } } typedef struct ndo_dbuf_struct{ char *buf; unsigned long used_size; unsigned long allocated_size; unsigned long chunk_size; }ndo_dbuf; int ndo_dbuf_init(ndo_dbuf *,int); int ndo_dbuf_free(ndo_dbuf *); int ndo_dbuf_strcat(ndo_dbuf *,char *); int my_rename(char *,char *); void ndomod_strip(char *); #endif ndoutils-1.4b9/include/common.h0000644000175100017510000000063710550310752016636 0ustar baeckerhbaeckerh/************************************************************************ * * COMMON.H - NDBXT Protocol Definition * Copyright (c) 2005 Ethan Galstad * Last Modified: 05-19-2005 * ************************************************************************/ #ifndef _NDO_COMMON_H #define _NDO_COMMON_H #define NDO_TRUE 1 #define NDO_FALSE 0 #define NDO_ERROR -1 #define NDO_OK 0 #endif ndoutils-1.4b9/include/dbhandlers.h0000644000175100017510000000655711226046620017464 0ustar baeckerhbaeckerh/************************************************************************ * * DBHANDLERS.H - NDO2DB DB Handler Include File * Copyright (c) 2005-2006 Ethan Galstad * Last Modified: 07-11-2009 * ************************************************************************/ #ifndef _NDO2DB_DBHANDLERS_H #define _NDO2DB_DBHANDLERS_H #include "ndo2db.h" #define NAGIOS_SIZEOF_ARRAY(var) (sizeof(var)/sizeof(var[0])) int ndo2db_get_object_id(ndo2db_idi *,int,char *,char *,unsigned long *); int ndo2db_get_object_id_with_insert(ndo2db_idi *,int,char *,char *,unsigned long *); int ndo2db_get_cached_object_ids(ndo2db_idi *); int ndo2db_get_cached_object_id(ndo2db_idi *,int,char *,char *,unsigned long *); int ndo2db_add_cached_object_id(ndo2db_idi *,int,char *,char *,unsigned long); int ndo2db_free_cached_object_ids(ndo2db_idi *); int ndo2db_object_hashfunc(const char *,const char *,int); int ndo2db_compare_object_hashdata(const char *,const char *,const char *,const char *); int ndo2db_set_all_objects_as_inactive(ndo2db_idi *); int ndo2db_set_object_as_active(ndo2db_idi *,int,unsigned long); int ndo2db_handle_logentry(ndo2db_idi *); int ndo2db_handle_processdata(ndo2db_idi *); int ndo2db_handle_timedeventdata(ndo2db_idi *); int ndo2db_handle_logdata(ndo2db_idi *); int ndo2db_handle_systemcommanddata(ndo2db_idi *); int ndo2db_handle_eventhandlerdata(ndo2db_idi *); int ndo2db_handle_notificationdata(ndo2db_idi *); int ndo2db_handle_contactnotificationdata(ndo2db_idi *); int ndo2db_handle_contactnotificationmethoddata(ndo2db_idi *); int ndo2db_handle_servicecheckdata(ndo2db_idi *); int ndo2db_handle_hostcheckdata(ndo2db_idi *); int ndo2db_handle_commentdata(ndo2db_idi *); int ndo2db_handle_downtimedata(ndo2db_idi *); int ndo2db_handle_flappingdata(ndo2db_idi *); int ndo2db_handle_programstatusdata(ndo2db_idi *); int ndo2db_handle_hoststatusdata(ndo2db_idi *); int ndo2db_handle_servicestatusdata(ndo2db_idi *); int ndo2db_handle_contactstatusdata(ndo2db_idi *); int ndo2db_handle_adaptiveprogramdata(ndo2db_idi *); int ndo2db_handle_adaptivehostdata(ndo2db_idi *); int ndo2db_handle_adaptiveservicedata(ndo2db_idi *); int ndo2db_handle_adaptivecontactdata(ndo2db_idi *); int ndo2db_handle_externalcommanddata(ndo2db_idi *); int ndo2db_handle_aggregatedstatusdata(ndo2db_idi *); int ndo2db_handle_retentiondata(ndo2db_idi *); int ndo2db_handle_acknowledgementdata(ndo2db_idi *); int ndo2db_handle_statechangedata(ndo2db_idi *); int ndo2db_handle_configfilevariables(ndo2db_idi *,int); int ndo2db_handle_configvariables(ndo2db_idi *); int ndo2db_handle_runtimevariables(ndo2db_idi *); int ndo2db_handle_configdumpstart(ndo2db_idi *); int ndo2db_handle_configdumpend(ndo2db_idi *); int ndo2db_handle_hostdefinition(ndo2db_idi *); int ndo2db_handle_hostgroupdefinition(ndo2db_idi *); int ndo2db_handle_servicedefinition(ndo2db_idi *); int ndo2db_handle_servicegroupdefinition(ndo2db_idi *); int ndo2db_handle_hostdependencydefinition(ndo2db_idi *); int ndo2db_handle_servicedependencydefinition(ndo2db_idi *); int ndo2db_handle_hostescalationdefinition(ndo2db_idi *); int ndo2db_handle_serviceescalationdefinition(ndo2db_idi *); int ndo2db_handle_commanddefinition(ndo2db_idi *); int ndo2db_handle_timeperiodefinition(ndo2db_idi *); int ndo2db_handle_contactdefinition(ndo2db_idi *); int ndo2db_handle_contactgroupdefinition(ndo2db_idi *); int ndo2db_save_custom_variables(ndo2db_idi *,int, int, char *); #endif ndoutils-1.4b9/include/protoapi.h0000644000175100017510000004746211222731454017215 0ustar baeckerhbaeckerh/************************************************************************ * * PROTOAPI.H - NDO Protocol Definition * Copyright (c) 2005-2006 Ethan Galstad * Last Modified: 09-27-2006 * ************************************************************************/ #ifndef _NDO_PROTOAPI_H #define _NDO_PROTOAPI_H /****************** PROTOCOL VERSION ***************/ #define NDO_API_PROTOVERSION 2 /****************** CONTROL STRINGS ****************/ #define NDO_API_NONE "" #define NDO_API_HELLO "HELLO" #define NDO_API_GOODBYE "GOODBYE" #define NDO_API_PROTOCOL "PROTOCOL" #define NDO_API_AGENT "AGENT" #define NDO_API_AGENTVERSION "AGENTVERSION" #define NDO_API_DISPOSITION "DISPOSITION" /* archived or realtime */ #define NDO_API_CONNECTION "CONNECTION" /* immediate or deferred */ #define NDO_API_CONNECTTYPE "CONNECTTYPE" /* initial or reconnection */ #define NDO_API_DISPOSITION_ARCHIVED "ARCHIVED" #define NDO_API_DISPOSITION_REALTIME "REALTIME" #define NDO_API_CONNECTION_FILE "FILE" #define NDO_API_CONNECTION_UNIXSOCKET "UNIXSOCKET" #define NDO_API_CONNECTION_TCPSOCKET "TCPSOCKET" #define NDO_API_CONNECTTYPE_INITIAL "INITIAL" #define NDO_API_CONNECTTYPE_RECONNECT "RECONNECT" #define NDO_API_STARTDATADUMP "STARTDATADUMP" #define NDO_API_STARTTIME "STARTTIME" #define NDO_API_ENDTIME "ENDTIME" #define NDO_API_CONFIGDUMP_ORIGINAL "ORIGINAL" #define NDO_API_CONFIGDUMP_RETAINED "RETAINED" #define NDO_API_INSTANCENAME "INSTANCENAME" #define NDO_API_STARTCONFIGDUMP 900 #define NDO_API_ENDCONFIGDUMP 901 #define NDO_API_ENDDATA 999 #define NDO_API_ENDDATADUMP 1000 /******************** DATA TYPES *******************/ #define NDO_API_LOGENTRY 100 #define NDO_API_PROCESSDATA 200 #define NDO_API_TIMEDEVENTDATA 201 #define NDO_API_LOGDATA 202 #define NDO_API_SYSTEMCOMMANDDATA 203 #define NDO_API_EVENTHANDLERDATA 204 #define NDO_API_NOTIFICATIONDATA 205 #define NDO_API_SERVICECHECKDATA 206 #define NDO_API_HOSTCHECKDATA 207 #define NDO_API_COMMENTDATA 208 #define NDO_API_DOWNTIMEDATA 209 #define NDO_API_FLAPPINGDATA 210 #define NDO_API_PROGRAMSTATUSDATA 211 #define NDO_API_HOSTSTATUSDATA 212 #define NDO_API_SERVICESTATUSDATA 213 #define NDO_API_ADAPTIVEPROGRAMDATA 214 #define NDO_API_ADAPTIVEHOSTDATA 215 #define NDO_API_ADAPTIVESERVICEDATA 216 #define NDO_API_EXTERNALCOMMANDDATA 217 #define NDO_API_AGGREGATEDSTATUSDATA 218 #define NDO_API_RETENTIONDATA 219 #define NDO_API_CONTACTNOTIFICATIONDATA 220 #define NDO_API_CONTACTNOTIFICATIONMETHODDATA 221 #define NDO_API_ACKNOWLEDGEMENTDATA 222 #define NDO_API_STATECHANGEDATA 223 #define NDO_API_CONTACTSTATUSDATA 224 #define NDO_API_ADAPTIVECONTACTDATA 225 #define NDO_API_MAINCONFIGFILEVARIABLES 300 #define NDO_API_RESOURCECONFIGFILEVARIABLES 301 #define NDO_API_CONFIGVARIABLES 302 #define NDO_API_RUNTIMEVARIABLES 303 #define NDO_API_HOSTDEFINITION 400 #define NDO_API_HOSTGROUPDEFINITION 401 #define NDO_API_SERVICEDEFINITION 402 #define NDO_API_SERVICEGROUPDEFINITION 403 #define NDO_API_HOSTDEPENDENCYDEFINITION 404 #define NDO_API_SERVICEDEPENDENCYDEFINITION 405 #define NDO_API_HOSTESCALATIONDEFINITION 406 #define NDO_API_SERVICEESCALATIONDEFINITION 407 #define NDO_API_COMMANDDEFINITION 408 #define NDO_API_TIMEPERIODDEFINITION 409 #define NDO_API_CONTACTDEFINITION 410 #define NDO_API_CONTACTGROUPDEFINITION 411 #define NDO_API_HOSTEXTINFODEFINITION 412 /* no longer used */ #define NDO_API_SERVICEEXTINFODEFINITION 413 /* no longer used */ /************** COMMON DATA ATTRIBUTES **************/ #define NDO_MAX_DATA_TYPES 266 #define NDO_DATA_NONE 0 #define NDO_DATA_TYPE 1 #define NDO_DATA_FLAGS 2 #define NDO_DATA_ATTRIBUTES 3 #define NDO_DATA_TIMESTAMP 4 /*************** LIVE DATA ATTRIBUTES ***************/ #define NDO_DATA_ACKAUTHOR 5 #define NDO_DATA_ACKDATA 6 #define NDO_DATA_ACKNOWLEDGEMENTTYPE 7 #define NDO_DATA_ACTIVEHOSTCHECKSENABLED 8 #define NDO_DATA_ACTIVESERVICECHECKSENABLED 9 #define NDO_DATA_AUTHORNAME 10 #define NDO_DATA_CHECKCOMMAND 11 #define NDO_DATA_CHECKTYPE 12 #define NDO_DATA_COMMANDARGS 13 #define NDO_DATA_COMMANDLINE 14 #define NDO_DATA_COMMANDSTRING 15 #define NDO_DATA_COMMANDTYPE 16 #define NDO_DATA_COMMENT 17 #define NDO_DATA_COMMENTID 18 #define NDO_DATA_COMMENTTIME 19 #define NDO_DATA_COMMENTTYPE 20 #define NDO_DATA_CONFIGFILENAME 21 #define NDO_DATA_CONFIGFILEVARIABLE 22 #define NDO_DATA_CONFIGVARIABLE 23 #define NDO_DATA_CONTACTSNOTIFIED 24 #define NDO_DATA_CURRENTCHECKATTEMPT 25 #define NDO_DATA_CURRENTNOTIFICATIONNUMBER 26 #define NDO_DATA_CURRENTSTATE 27 #define NDO_DATA_DAEMONMODE 28 #define NDO_DATA_DOWNTIMEID 29 #define NDO_DATA_DOWNTIMETYPE 30 #define NDO_DATA_DURATION 31 #define NDO_DATA_EARLYTIMEOUT 32 #define NDO_DATA_ENDTIME 33 #define NDO_DATA_ENTRYTIME 34 #define NDO_DATA_ENTRYTYPE 35 #define NDO_DATA_ESCALATED 36 #define NDO_DATA_EVENTHANDLER 37 #define NDO_DATA_EVENTHANDLERENABLED 38 #define NDO_DATA_EVENTHANDLERSENABLED 39 #define NDO_DATA_EVENTHANDLERTYPE 40 #define NDO_DATA_EVENTTYPE 41 #define NDO_DATA_EXECUTIONTIME 42 #define NDO_DATA_EXPIRATIONTIME 43 #define NDO_DATA_EXPIRES 44 #define NDO_DATA_FAILUREPREDICTIONENABLED 45 #define NDO_DATA_FIXED 46 #define NDO_DATA_FLAPDETECTIONENABLED 47 #define NDO_DATA_FLAPPINGTYPE 48 #define NDO_DATA_GLOBALHOSTEVENTHANDLER 49 #define NDO_DATA_GLOBALSERVICEEVENTHANDLER 50 #define NDO_DATA_HASBEENCHECKED 51 #define NDO_DATA_HIGHTHRESHOLD 52 #define NDO_DATA_HOST 53 #define NDO_DATA_ISFLAPPING 54 #define NDO_DATA_LASTCOMMANDCHECK 55 #define NDO_DATA_LASTHARDSTATE 56 #define NDO_DATA_LASTHARDSTATECHANGE 57 #define NDO_DATA_LASTHOSTCHECK 58 #define NDO_DATA_LASTHOSTNOTIFICATION 59 #define NDO_DATA_LASTLOGROTATION 60 #define NDO_DATA_LASTSERVICECHECK 61 #define NDO_DATA_LASTSERVICENOTIFICATION 62 #define NDO_DATA_LASTSTATECHANGE 63 #define NDO_DATA_LASTTIMECRITICAL 64 #define NDO_DATA_LASTTIMEDOWN 65 #define NDO_DATA_LASTTIMEOK 66 #define NDO_DATA_LASTTIMEUNKNOWN 67 #define NDO_DATA_LASTTIMEUNREACHABLE 68 #define NDO_DATA_LASTTIMEUP 69 #define NDO_DATA_LASTTIMEWARNING 70 #define NDO_DATA_LATENCY 71 #define NDO_DATA_LOGENTRY 72 #define NDO_DATA_LOGENTRYTIME 73 #define NDO_DATA_LOGENTRYTYPE 74 #define NDO_DATA_LOWTHRESHOLD 75 #define NDO_DATA_MAXCHECKATTEMPTS 76 #define NDO_DATA_MODIFIEDHOSTATTRIBUTE 77 #define NDO_DATA_MODIFIEDHOSTATTRIBUTES 78 #define NDO_DATA_MODIFIEDSERVICEATTRIBUTE 79 #define NDO_DATA_MODIFIEDSERVICEATTRIBUTES 80 #define NDO_DATA_NEXTHOSTCHECK 81 #define NDO_DATA_NEXTHOSTNOTIFICATION 82 #define NDO_DATA_NEXTSERVICECHECK 83 #define NDO_DATA_NEXTSERVICENOTIFICATION 84 #define NDO_DATA_NOMORENOTIFICATIONS 85 #define NDO_DATA_NORMALCHECKINTERVAL 86 #define NDO_DATA_NOTIFICATIONREASON 87 #define NDO_DATA_NOTIFICATIONSENABLED 88 #define NDO_DATA_NOTIFICATIONTYPE 89 #define NDO_DATA_NOTIFYCONTACTS 90 #define NDO_DATA_OBSESSOVERHOST 91 #define NDO_DATA_OBSESSOVERHOSTS 92 #define NDO_DATA_OBSESSOVERSERVICE 93 #define NDO_DATA_OBSESSOVERSERVICES 94 #define NDO_DATA_OUTPUT 95 #define NDO_DATA_PASSIVEHOSTCHECKSENABLED 96 #define NDO_DATA_PASSIVESERVICECHECKSENABLED 97 #define NDO_DATA_PERCENTSTATECHANGE 98 #define NDO_DATA_PERFDATA 99 #define NDO_DATA_PERSISTENT 100 #define NDO_DATA_PROBLEMHASBEENACKNOWLEDGED 101 #define NDO_DATA_PROCESSID 102 #define NDO_DATA_PROCESSPERFORMANCEDATA 103 #define NDO_DATA_PROGRAMDATE 104 #define NDO_DATA_PROGRAMNAME 105 #define NDO_DATA_PROGRAMSTARTTIME 106 #define NDO_DATA_PROGRAMVERSION 107 #define NDO_DATA_RECURRING 108 #define NDO_DATA_RETRYCHECKINTERVAL 109 #define NDO_DATA_RETURNCODE 110 #define NDO_DATA_RUNTIME 111 #define NDO_DATA_RUNTIMEVARIABLE 112 #define NDO_DATA_SCHEDULEDDOWNTIMEDEPTH 113 #define NDO_DATA_SERVICE 114 #define NDO_DATA_SHOULDBESCHEDULED 115 #define NDO_DATA_SOURCE 116 #define NDO_DATA_STARTTIME 117 #define NDO_DATA_STATE 118 #define NDO_DATA_STATECHANGE 119 #define NDO_DATA_STATECHANGETYPE 120 #define NDO_DATA_STATETYPE 121 #define NDO_DATA_STICKY 122 #define NDO_DATA_TIMEOUT 123 #define NDO_DATA_TRIGGEREDBY 124 #define NDO_DATA_LONGOUTPUT 125 /*********** OBJECT CONFIG DATA ATTRIBUTES **********/ #define NDO_DATA_ACTIONURL 126 #define NDO_DATA_COMMANDNAME 127 #define NDO_DATA_CONTACTADDRESS 128 #define NDO_DATA_CONTACTALIAS 129 #define NDO_DATA_CONTACTGROUP 130 #define NDO_DATA_CONTACTGROUPALIAS 131 #define NDO_DATA_CONTACTGROUPMEMBER 132 #define NDO_DATA_CONTACTGROUPNAME 133 #define NDO_DATA_CONTACTNAME 134 #define NDO_DATA_DEPENDENCYTYPE 135 #define NDO_DATA_DEPENDENTHOSTNAME 136 #define NDO_DATA_DEPENDENTSERVICEDESCRIPTION 137 #define NDO_DATA_EMAILADDRESS 138 #define NDO_DATA_ESCALATEONCRITICAL 139 #define NDO_DATA_ESCALATEONDOWN 140 #define NDO_DATA_ESCALATEONRECOVERY 141 #define NDO_DATA_ESCALATEONUNKNOWN 142 #define NDO_DATA_ESCALATEONUNREACHABLE 143 #define NDO_DATA_ESCALATEONWARNING 144 #define NDO_DATA_ESCALATIONPERIOD 145 #define NDO_DATA_FAILONCRITICAL 146 #define NDO_DATA_FAILONDOWN 147 #define NDO_DATA_FAILONOK 148 #define NDO_DATA_FAILONUNKNOWN 149 #define NDO_DATA_FAILONUNREACHABLE 150 #define NDO_DATA_FAILONUP 151 #define NDO_DATA_FAILONWARNING 152 #define NDO_DATA_FIRSTNOTIFICATION 153 #define NDO_DATA_HAVE2DCOORDS 154 #define NDO_DATA_HAVE3DCOORDS 155 #define NDO_DATA_HIGHHOSTFLAPTHRESHOLD 156 #define NDO_DATA_HIGHSERVICEFLAPTHRESHOLD 157 #define NDO_DATA_HOSTADDRESS 158 #define NDO_DATA_HOSTALIAS 159 #define NDO_DATA_HOSTCHECKCOMMAND 160 #define NDO_DATA_HOSTCHECKINTERVAL 161 #define NDO_DATA_HOSTCHECKPERIOD 162 #define NDO_DATA_HOSTEVENTHANDLER 163 #define NDO_DATA_HOSTEVENTHANDLERENABLED 164 #define NDO_DATA_HOSTFAILUREPREDICTIONENABLED 165 #define NDO_DATA_HOSTFAILUREPREDICTIONOPTIONS 166 #define NDO_DATA_HOSTFLAPDETECTIONENABLED 167 #define NDO_DATA_HOSTFRESHNESSCHECKSENABLED 168 #define NDO_DATA_HOSTFRESHNESSTHRESHOLD 169 #define NDO_DATA_HOSTGROUPALIAS 170 #define NDO_DATA_HOSTGROUPMEMBER 171 #define NDO_DATA_HOSTGROUPNAME 172 #define NDO_DATA_HOSTMAXCHECKATTEMPTS 173 #define NDO_DATA_HOSTNAME 174 #define NDO_DATA_HOSTNOTIFICATIONCOMMAND 175 #define NDO_DATA_HOSTNOTIFICATIONINTERVAL 176 #define NDO_DATA_HOSTNOTIFICATIONPERIOD 177 #define NDO_DATA_HOSTNOTIFICATIONSENABLED 178 #define NDO_DATA_ICONIMAGE 179 #define NDO_DATA_ICONIMAGEALT 180 #define NDO_DATA_INHERITSPARENT 181 #define NDO_DATA_LASTNOTIFICATION 182 #define NDO_DATA_LOWHOSTFLAPTHRESHOLD 183 #define NDO_DATA_LOWSERVICEFLAPTHRESHOLD 184 #define NDO_DATA_MAXSERVICECHECKATTEMPTS 185 #define NDO_DATA_NOTES 186 #define NDO_DATA_NOTESURL 187 #define NDO_DATA_NOTIFICATIONINTERVAL 188 #define NDO_DATA_NOTIFYHOSTDOWN 189 #define NDO_DATA_NOTIFYHOSTFLAPPING 190 #define NDO_DATA_NOTIFYHOSTRECOVERY 191 #define NDO_DATA_NOTIFYHOSTUNREACHABLE 192 #define NDO_DATA_NOTIFYSERVICECRITICAL 193 #define NDO_DATA_NOTIFYSERVICEFLAPPING 194 #define NDO_DATA_NOTIFYSERVICERECOVERY 195 #define NDO_DATA_NOTIFYSERVICEUNKNOWN 196 #define NDO_DATA_NOTIFYSERVICEWARNING 197 #define NDO_DATA_PAGERADDRESS 198 #define NDO_DATA_PARALLELIZESERVICECHECK 199 /* no longer used */ #define NDO_DATA_PARENTHOST 200 #define NDO_DATA_PROCESSHOSTPERFORMANCEDATA 201 #define NDO_DATA_PROCESSSERVICEPERFORMANCEDATA 202 #define NDO_DATA_RETAINHOSTNONSTATUSINFORMATION 203 #define NDO_DATA_RETAINHOSTSTATUSINFORMATION 204 #define NDO_DATA_RETAINSERVICENONSTATUSINFORMATION 205 #define NDO_DATA_RETAINSERVICESTATUSINFORMATION 206 #define NDO_DATA_SERVICECHECKCOMMAND 207 #define NDO_DATA_SERVICECHECKINTERVAL 208 #define NDO_DATA_SERVICECHECKPERIOD 209 #define NDO_DATA_SERVICEDESCRIPTION 210 #define NDO_DATA_SERVICEEVENTHANDLER 211 #define NDO_DATA_SERVICEEVENTHANDLERENABLED 212 #define NDO_DATA_SERVICEFAILUREPREDICTIONENABLED 213 #define NDO_DATA_SERVICEFAILUREPREDICTIONOPTIONS 214 #define NDO_DATA_SERVICEFLAPDETECTIONENABLED 215 #define NDO_DATA_SERVICEFRESHNESSCHECKSENABLED 216 #define NDO_DATA_SERVICEFRESHNESSTHRESHOLD 217 #define NDO_DATA_SERVICEGROUPALIAS 218 #define NDO_DATA_SERVICEGROUPMEMBER 219 #define NDO_DATA_SERVICEGROUPNAME 220 #define NDO_DATA_SERVICEISVOLATILE 221 #define NDO_DATA_SERVICENOTIFICATIONCOMMAND 222 #define NDO_DATA_SERVICENOTIFICATIONINTERVAL 223 #define NDO_DATA_SERVICENOTIFICATIONPERIOD 224 #define NDO_DATA_SERVICENOTIFICATIONSENABLED 225 #define NDO_DATA_SERVICERETRYINTERVAL 226 #define NDO_DATA_SHOULDBEDRAWN 227 /* no longer used */ #define NDO_DATA_STALKHOSTONDOWN 228 #define NDO_DATA_STALKHOSTONUNREACHABLE 229 #define NDO_DATA_STALKHOSTONUP 230 #define NDO_DATA_STALKSERVICEONCRITICAL 231 #define NDO_DATA_STALKSERVICEONOK 232 #define NDO_DATA_STALKSERVICEONUNKNOWN 233 #define NDO_DATA_STALKSERVICEONWARNING 234 #define NDO_DATA_STATUSMAPIMAGE 235 #define NDO_DATA_TIMEPERIODALIAS 236 #define NDO_DATA_TIMEPERIODNAME 237 #define NDO_DATA_TIMERANGE 238 #define NDO_DATA_VRMLIMAGE 239 #define NDO_DATA_X2D 240 #define NDO_DATA_X3D 241 #define NDO_DATA_Y2D 242 #define NDO_DATA_Y3D 243 #define NDO_DATA_Z3D 244 #define NDO_DATA_CONFIGDUMPTYPE 245 #define NDO_DATA_FIRSTNOTIFICATIONDELAY 246 #define NDO_DATA_HOSTRETRYINTERVAL 247 #define NDO_DATA_NOTIFYHOSTDOWNTIME 248 #define NDO_DATA_NOTIFYSERVICEDOWNTIME 249 #define NDO_DATA_CANSUBMITCOMMANDS 250 #define NDO_DATA_FLAPDETECTIONONUP 251 #define NDO_DATA_FLAPDETECTIONONDOWN 252 #define NDO_DATA_FLAPDETECTIONONUNREACHABLE 253 #define NDO_DATA_FLAPDETECTIONONOK 254 #define NDO_DATA_FLAPDETECTIONONWARNING 255 #define NDO_DATA_FLAPDETECTIONONUNKNOWN 256 #define NDO_DATA_FLAPDETECTIONONCRITICAL 257 #define NDO_DATA_DISPLAYNAME 258 #define NDO_DATA_DEPENDENCYPERIOD 259 #define NDO_DATA_MODIFIEDCONTACTATTRIBUTE 260 /* LIVE DATA */ #define NDO_DATA_MODIFIEDCONTACTATTRIBUTES 261 /* LIVE DATA */ #define NDO_DATA_CUSTOMVARIABLE 262 #define NDO_DATA_HASBEENMODIFIED 263 #define NDO_DATA_CONTACT 264 #define NDO_DATA_LASTSTATE 265 #endif ndoutils-1.4b9/include/db.h0000644000175100017510000001411611253701323015727 0ustar baeckerhbaeckerh/************************************************************************ * * DB.H - NDO Database Include File * Copyright (c) 2005-2006 Ethan Galstad * Last Modified: 07-11-2009 * ************************************************************************/ #ifndef _NDO2DB_DB_H #define _NDO2DB_DB_H #include "config.h" #include "ndo2db.h" typedef struct ndo2db_dbconfig_struct{ int server_type; int port; char *host; char *username; char *password; char *dbname; char *dbprefix; unsigned long max_timedevents_age; unsigned long max_systemcommands_age; unsigned long max_servicechecks_age; unsigned long max_hostchecks_age; unsigned long max_eventhandlers_age; unsigned long max_externalcommands_age; }ndo2db_dbconfig; /*************** DB server types ***************/ #define NDO2DB_DBTABLE_INSTANCES 0 #define NDO2DB_DBTABLE_CONNINFO 1 #define NDO2DB_DBTABLE_OBJECTS 2 #define NDO2DB_DBTABLE_OBJECTTYPES 3 #define NDO2DB_DBTABLE_LOGENTRIES 4 #define NDO2DB_DBTABLE_SYSTEMCOMMANDS 5 #define NDO2DB_DBTABLE_EVENTHANDLERS 6 #define NDO2DB_DBTABLE_SERVICECHECKS 7 #define NDO2DB_DBTABLE_HOSTCHECKS 8 #define NDO2DB_DBTABLE_PROGRAMSTATUS 9 #define NDO2DB_DBTABLE_EXTERNALCOMMANDS 10 #define NDO2DB_DBTABLE_SERVICESTATUS 11 #define NDO2DB_DBTABLE_HOSTSTATUS 12 #define NDO2DB_DBTABLE_PROCESSEVENTS 13 #define NDO2DB_DBTABLE_TIMEDEVENTS 14 #define NDO2DB_DBTABLE_TIMEDEVENTQUEUE 15 #define NDO2DB_DBTABLE_FLAPPINGHISTORY 16 #define NDO2DB_DBTABLE_COMMENTHISTORY 17 #define NDO2DB_DBTABLE_COMMENTS 18 #define NDO2DB_DBTABLE_NOTIFICATIONS 19 #define NDO2DB_DBTABLE_CONTACTNOTIFICATIONS 20 #define NDO2DB_DBTABLE_CONTACTNOTIFICATIONMETHODS 21 #define NDO2DB_DBTABLE_ACKNOWLEDGEMENTS 22 #define NDO2DB_DBTABLE_STATEHISTORY 23 #define NDO2DB_DBTABLE_DOWNTIMEHISTORY 24 #define NDO2DB_DBTABLE_SCHEDULEDDOWNTIME 25 #define NDO2DB_DBTABLE_CONFIGFILES 26 #define NDO2DB_DBTABLE_CONFIGFILEVARIABLES 27 #define NDO2DB_DBTABLE_RUNTIMEVARIABLES 28 #define NDO2DB_DBTABLE_CONTACTSTATUS 29 #define NDO2DB_DBTABLE_CUSTOMVARIABLESTATUS 30 #define NDO2DB_DBTABLE_RESERVED31 31 #define NDO2DB_DBTABLE_RESERVED32 32 #define NDO2DB_DBTABLE_RESERVED33 33 #define NDO2DB_DBTABLE_RESERVED34 34 #define NDO2DB_DBTABLE_RESERVED35 35 #define NDO2DB_DBTABLE_RESERVED36 36 #define NDO2DB_DBTABLE_RESERVED37 37 #define NDO2DB_DBTABLE_RESERVED38 38 #define NDO2DB_DBTABLE_RESERVED39 39 #define NDO2DB_DBTABLE_COMMANDS 40 #define NDO2DB_DBTABLE_TIMEPERIODS 41 #define NDO2DB_DBTABLE_TIMEPERIODTIMERANGES 42 #define NDO2DB_DBTABLE_CONTACTGROUPS 43 #define NDO2DB_DBTABLE_CONTACTGROUPMEMBERS 44 #define NDO2DB_DBTABLE_HOSTGROUPS 45 #define NDO2DB_DBTABLE_HOSTGROUPMEMBERS 46 #define NDO2DB_DBTABLE_SERVICEGROUPS 47 #define NDO2DB_DBTABLE_SERVICEGROUPMEMBERS 48 #define NDO2DB_DBTABLE_HOSTESCALATIONS 49 #define NDO2DB_DBTABLE_HOSTESCALATIONCONTACTS 50 #define NDO2DB_DBTABLE_SERVICEESCALATIONS 51 #define NDO2DB_DBTABLE_SERVICEESCALATIONCONTACTS 52 #define NDO2DB_DBTABLE_HOSTDEPENDENCIES 53 #define NDO2DB_DBTABLE_SERVICEDEPENDENCIES 54 #define NDO2DB_DBTABLE_CONTACTS 55 #define NDO2DB_DBTABLE_CONTACTADDRESSES 56 #define NDO2DB_DBTABLE_CONTACTNOTIFICATIONCOMMANDS 57 #define NDO2DB_DBTABLE_HOSTS 58 #define NDO2DB_DBTABLE_HOSTPARENTHOSTS 59 #define NDO2DB_DBTABLE_HOSTCONTACTS 60 #define NDO2DB_DBTABLE_SERVICES 61 #define NDO2DB_DBTABLE_SERVICECONTACTS 62 #define NDO2DB_DBTABLE_CUSTOMVARIABLES 63 #define NDO2DB_DBTABLE_HOSTCONTACTGROUPS 64 #define NDO2DB_DBTABLE_SERVICECONTACTGROUPS 65 #define NDO2DB_DBTABLE_HOSTESCALATIONCONTACTGROUPS 66 #define NDO2DB_DBTABLE_SERVICEESCALATIONCONTACTGROUPS 67 #define NDO2DB_MAX_DBTABLES 68 /**************** Object types *****************/ #define NDO2DB_OBJECTTYPE_HOST 1 #define NDO2DB_OBJECTTYPE_SERVICE 2 #define NDO2DB_OBJECTTYPE_HOSTGROUP 3 #define NDO2DB_OBJECTTYPE_SERVICEGROUP 4 #define NDO2DB_OBJECTTYPE_HOSTESCALATION 5 #define NDO2DB_OBJECTTYPE_SERVICEESCALATION 6 #define NDO2DB_OBJECTTYPE_HOSTDEPENDENCY 7 #define NDO2DB_OBJECTTYPE_SERVICEDEPENDENCY 8 #define NDO2DB_OBJECTTYPE_TIMEPERIOD 9 #define NDO2DB_OBJECTTYPE_CONTACT 10 #define NDO2DB_OBJECTTYPE_CONTACTGROUP 11 #define NDO2DB_OBJECTTYPE_COMMAND 12 int ndo2db_db_init(ndo2db_idi *); int ndo2db_db_deinit(ndo2db_idi *); int ndo2db_db_connect(ndo2db_idi *); int ndo2db_db_disconnect(ndo2db_idi *); int ndo2db_db_hello(ndo2db_idi *); int ndo2db_db_goodbye(ndo2db_idi *); int ndo2db_db_checkin(ndo2db_idi *); char *ndo2db_db_escape_string(ndo2db_idi *,char *); char *ndo2db_db_timet_to_sql(ndo2db_idi *,time_t); char *ndo2db_db_sql_to_timet(ndo2db_idi *,char *); int ndo2db_db_query(ndo2db_idi *,char *); int ndo2db_db_free_query(ndo2db_idi *); int ndo2db_handle_db_error(ndo2db_idi *,int); int ndo2db_db_clear_table(ndo2db_idi *,char *); int ndo2db_db_get_latest_data_time(ndo2db_idi *,char *,char *,unsigned long *); int ndo2db_db_perform_maintenance(ndo2db_idi *); int ndo2db_db_trim_data_table(ndo2db_idi *,char *,char *,unsigned long); extern int ndo2db_log_debug_info(int, int, const char *, ...); #endif ndoutils-1.4b9/include/getheaders0000755000175100017510000000127310566132257017244 0ustar baeckerhbaeckerh#!/bin/sh ################################################################################# # Used by Ethan to grab the latest copy of Nagios include files # # NOTES: # - configure scripts must be run on Nagios CVS repos before this can be done # - config.h files are emptied, so it won't interefere with the local config.h # generated for this project ################################################################################# # Get Nagios 3.x headers cp --reply=yes ~/code/cvs/nagios/include/*.h nagios-3x echo "/* empty */" > nagios-3x/config.h # Get Nagios 2.x headers cp --reply=yes ~/code/cvs/nagios-2x/nagios/include/*.h nagios-2x echo "/* empty */" > nagios-2x/config.h ndoutils-1.4b9/include/ndo2db.h0000644000175100017510000002126611253701323016516 0ustar baeckerhbaeckerh/************************************************************************ * * NDO2DB.H - NDO2DB Include File * Copyright (c) 2005-2007 Ethan Galstad * Last Modified: 07-11-2009 * ************************************************************************/ #ifndef _NDO2DB_NDO2DB_H #define _NDO2DB_NDO2DB_H #include "config.h" #include "utils.h" /*************** mbuf definitions *************/ #define NDO2DB_MBUF_CONTACTGROUP 0 #define NDO2DB_MBUF_CONTACTGROUPMEMBER 1 #define NDO2DB_MBUF_SERVICEGROUPMEMBER 2 #define NDO2DB_MBUF_HOSTGROUPMEMBER 3 #define NDO2DB_MBUF_SERVICENOTIFICATIONCOMMAND 4 #define NDO2DB_MBUF_HOSTNOTIFICATIONCOMMAND 5 #define NDO2DB_MBUF_CONTACTADDRESS 6 #define NDO2DB_MBUF_TIMERANGE 7 #define NDO2DB_MBUF_PARENTHOST 8 #define NDO2DB_MBUF_CONFIGFILEVARIABLE 9 #define NDO2DB_MBUF_CONFIGVARIABLE 10 #define NDO2DB_MBUF_RUNTIMEVARIABLE 11 #define NDO2DB_MBUF_CUSTOMVARIABLE 12 #define NDO2DB_MBUF_CONTACT 13 #define NDO2DB_MAX_MBUF_ITEMS 14 /***************** structures *****************/ typedef struct ndo2db_mbuf_struct{ int used_lines; int allocated_lines; char **buffer; }ndo2db_mbuf; typedef struct ndo2db_dbobject_struct{ char *name1; char *name2; int object_type; unsigned long object_id; struct ndo2db_dbobject_struct *nexthash; }ndo2db_dbobject; typedef struct ndo2db_dbconninfo_struct{ int server_type; int connected; int error; #ifdef USE_MYSQL MYSQL mysql_conn; MYSQL_RES *mysql_result; MYSQL_ROW mysql_row; #endif #ifdef USE_PGSQL PGconn *pgsql_conn; PGresult *pgsql_result; #endif unsigned long instance_id; unsigned long conninfo_id; time_t latest_program_status_time; time_t latest_host_status_time; time_t latest_service_status_time; time_t latest_contact_status_time; time_t latest_queued_event_time; time_t latest_realtime_data_time; time_t latest_comment_time; int clean_event_queue; unsigned long last_notification_id; unsigned long last_contact_notification_id; unsigned long max_timedevents_age; unsigned long max_systemcommands_age; unsigned long max_servicechecks_age; unsigned long max_hostchecks_age; unsigned long max_eventhandlers_age; unsigned long max_externalcommands_age; time_t last_table_trim_time; time_t last_logentry_time; char *last_logentry_data; ndo2db_dbobject **object_hashlist; }ndo2db_dbconninfo; typedef struct ndo2db_input_data_info_struct{ int protocol_version; int disconnect_client; int ignore_client_data; char *instance_name; char *agent_name; char *agent_version; char *disposition; char *connect_source; char *connect_type; int current_input_section; int current_input_data; unsigned long bytes_processed; unsigned long lines_processed; unsigned long entries_processed; unsigned long data_start_time; unsigned long data_end_time; int current_object_config_type; char **buffered_input; ndo2db_mbuf mbuf[NDO2DB_MAX_MBUF_ITEMS]; ndo2db_dbconninfo dbinfo; }ndo2db_idi; /*************** DB server types ***************/ #define NDO2DB_DBSERVER_NONE 0 #define NDO2DB_DBSERVER_MYSQL 1 #define NDO2DB_DBSERVER_PGSQL 2 /*************** misc definitions **************/ #define NDO2DB_INPUT_BUFFER 1024 #define NDO2DB_OBJECT_HASHSLOTS 1024 /*********** types of input sections ***********/ #define NDO2DB_INPUT_SECTION_NONE 0 #define NDO2DB_INPUT_SECTION_HEADER 1 #define NDO2DB_INPUT_SECTION_FOOTER 2 #define NDO2DB_INPUT_SECTION_DATA 3 /************* types of input data *************/ #define NDO2DB_INPUT_DATA_NONE 0 #define NDO2DB_INPUT_DATA_CONFIGDUMPSTART 1 #define NDO2DB_INPUT_DATA_CONFIGDUMPEND 2 #define NDO2DB_INPUT_DATA_LOGENTRY 10 #define NDO2DB_INPUT_DATA_PROCESSDATA 20 #define NDO2DB_INPUT_DATA_TIMEDEVENTDATA 21 #define NDO2DB_INPUT_DATA_LOGDATA 22 #define NDO2DB_INPUT_DATA_SYSTEMCOMMANDDATA 23 #define NDO2DB_INPUT_DATA_EVENTHANDLERDATA 24 #define NDO2DB_INPUT_DATA_NOTIFICATIONDATA 25 #define NDO2DB_INPUT_DATA_SERVICECHECKDATA 26 #define NDO2DB_INPUT_DATA_HOSTCHECKDATA 27 #define NDO2DB_INPUT_DATA_COMMENTDATA 28 #define NDO2DB_INPUT_DATA_DOWNTIMEDATA 29 #define NDO2DB_INPUT_DATA_FLAPPINGDATA 30 #define NDO2DB_INPUT_DATA_PROGRAMSTATUSDATA 31 #define NDO2DB_INPUT_DATA_HOSTSTATUSDATA 32 #define NDO2DB_INPUT_DATA_SERVICESTATUSDATA 33 #define NDO2DB_INPUT_DATA_ADAPTIVEPROGRAMDATA 34 #define NDO2DB_INPUT_DATA_ADAPTIVEHOSTDATA 35 #define NDO2DB_INPUT_DATA_ADAPTIVESERVICEDATA 36 #define NDO2DB_INPUT_DATA_EXTERNALCOMMANDDATA 37 #define NDO2DB_INPUT_DATA_AGGREGATEDSTATUSDATA 38 #define NDO2DB_INPUT_DATA_RETENTIONDATA 39 #define NDO2DB_INPUT_DATA_CONTACTNOTIFICATIONDATA 40 #define NDO2DB_INPUT_DATA_CONTACTNOTIFICATIONMETHODDATA 41 #define NDO2DB_INPUT_DATA_ACKNOWLEDGEMENTDATA 42 #define NDO2DB_INPUT_DATA_STATECHANGEDATA 43 #define NDO2DB_INPUT_DATA_CONTACTSTATUSDATA 44 #define NDO2DB_INPUT_DATA_ADAPTIVECONTACTDATA 45 #define NDO2DB_INPUT_DATA_MAINCONFIGFILEVARIABLES 50 #define NDO2DB_INPUT_DATA_RESOURCECONFIGFILEVARIABLES 51 #define NDO2DB_INPUT_DATA_CONFIGVARIABLES 52 #define NDO2DB_INPUT_DATA_RUNTIMEVARIABLES 53 #define NDO2DB_INPUT_DATA_HOSTDEFINITION 61 #define NDO2DB_INPUT_DATA_HOSTGROUPDEFINITION 62 #define NDO2DB_INPUT_DATA_SERVICEDEFINITION 63 #define NDO2DB_INPUT_DATA_SERVICEGROUPDEFINITION 64 #define NDO2DB_INPUT_DATA_HOSTDEPENDENCYDEFINITION 65 #define NDO2DB_INPUT_DATA_SERVICEDEPENDENCYDEFINITION 66 #define NDO2DB_INPUT_DATA_HOSTESCALATIONDEFINITION 67 #define NDO2DB_INPUT_DATA_SERVICEESCALATIONDEFINITION 68 #define NDO2DB_INPUT_DATA_COMMANDDEFINITION 69 #define NDO2DB_INPUT_DATA_TIMEPERIODDEFINITION 70 #define NDO2DB_INPUT_DATA_CONTACTDEFINITION 71 #define NDO2DB_INPUT_DATA_CONTACTGROUPDEFINITION 72 #define NDO2DB_INPUT_DATA_HOSTEXTINFODEFINITION 73 #define NDO2DB_INPUT_DATA_SERVICEEXTINFODEFINITION 74 /************* types of config data *************/ #define NDO2DB_CONFIGTYPE_ORIGINAL 0 #define NDO2DB_CONFIGTYPE_RETAINED 1 /***************** debugging levels *******************/ #define NDO2DB_DEBUGL_ALL -1 #define NDO2DB_DEBUGL_NONE 0 #define NDO2DB_DEBUGL_PROCESSINFO 1 #define NDO2DB_DEBUGL_SQL 2 #define NDO2DB_DEBUGV_BASIC 0 #define NDO2DB_DEBUGV_MORE 1 #define NDO2DB_DEBUGV_MOST 2 /***************** functions *******************/ int ndo2db_process_arguments(int,char **); int ndo2db_process_config_var(char *); int ndo2db_process_config_file(char *); int ndo2db_initialize_variables(void); int ndo2db_check_init_reqs(void); int ndo2db_drop_privileges(char *,char *); int ndo2db_daemonize(void); int ndo2db_cleanup_socket(void); void ndo2db_parent_sighandler(int); void ndo2db_child_sighandler(int); int ndo2db_free_program_memory(void); int ndo2db_free_input_memory(ndo2db_idi *); int ndo2db_free_connection_memory(ndo2db_idi *); int ndo2db_wait_for_connections(void); int ndo2db_handle_client_connection(int); int ndo2db_idi_init(ndo2db_idi *); int ndo2db_check_for_client_input(ndo2db_idi *,ndo_dbuf *); int ndo2db_handle_client_input(ndo2db_idi *,char *); int ndo2db_start_input_data(ndo2db_idi *); int ndo2db_end_input_data(ndo2db_idi *); int ndo2db_add_input_data_item(ndo2db_idi *,int,char *); int ndo2db_add_input_data_mbuf(ndo2db_idi *,int,int,char *); int ndo2db_convert_standard_data_elements(ndo2db_idi *,int *,int *,int *,struct timeval *); int ndo2db_convert_string_to_int(char *,int *); int ndo2db_convert_string_to_float(char *,float *); int ndo2db_convert_string_to_double(char *,double *); int ndo2db_convert_string_to_long(char *,long *); int ndo2db_convert_string_to_unsignedlong(char *,unsigned long *); int ndo2db_convert_string_to_timeval(char *,struct timeval *); int ndo2db_open_debug_log(void); int ndo2db_close_debug_log(void); #endif ndoutils-1.4b9/include/nagios-2x/0000755000175100017510000000000011227320616017000 5ustar baeckerhbaeckerhndoutils-1.4b9/include/nagios-2x/epn_nagios.h0000644000175100017510000000157610550310754021304 0ustar baeckerhbaeckerh/************************************************************************ * * Embedded Perl Header File * Last Modified: 12-08-2004 * ************************************************************************/ /******** BEGIN EMBEDDED PERL INTERPRETER DECLARATIONS ********/ #include #include #include #undef ctime /* don't need perl's threaded version */ #undef printf /* can't use perl's printf until initialized */ /* In perl.h (or friends) there is a macro that defines sighandler as Perl_sighandler, so we must #undef it so we can use our sighandler() function */ #undef sighandler /* and we don't need perl's reentrant versions */ #undef localtime #undef getpwnam #undef getgrnam #undef strerror #ifdef aTHX EXTERN_C void xs_init(pTHX); #else EXTERN_C void xs_init(void); #endif /******** END EMBEDDED PERL INTERPRETER DECLARATIONS ********/ ndoutils-1.4b9/include/nagios-2x/locations.h0000644000175100017510000000414510712143241021143 0ustar baeckerhbaeckerh/************************************************************************ * * Nagios Locations Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 03-24-2003 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #define DEFAULT_TEMP_FILE "/usr/local/nagios/var/tempfile" #define DEFAULT_STATUS_FILE "/usr/local/nagios/var/status.dat" #define DEFAULT_LOG_FILE "/usr/local/nagios/var/nagios.log" #define DEFAULT_LOG_ARCHIVE_PATH "/usr/local/nagios/var/archives/" #define DEFAULT_COMMENT_FILE "/usr/local/nagios/var/comments.dat" #define DEFAULT_DOWNTIME_FILE "/usr/local/nagios/var/downtime.dat" #define DEFAULT_RETENTION_FILE "/usr/local/nagios/var/retention.dat" #define DEFAULT_COMMAND_FILE "/usr/local/nagios/var/rw/nagios.cmd" #define DEFAULT_CONFIG_FILE "/usr/local/nagios/etc/nagios.cfg" #define DEFAULT_PHYSICAL_HTML_PATH "/usr/local/nagios/share" #define DEFAULT_URL_HTML_PATH "/nagios" #define DEFAULT_PHYSICAL_CGIBIN_PATH "/usr/local/nagios/sbin" #define DEFAULT_URL_CGIBIN_PATH "/nagios/cgi-bin" #define DEFAULT_CGI_CONFIG_FILE "/usr/local/nagios/etc/cgi.cfg" #define DEFAULT_LOCK_FILE "/usr/local/nagios/var/nagios.lock" #define DEFAULT_OBJECT_CACHE_FILE "/usr/local/nagios/var/objects.cache" #define DEFAULT_EVENT_BROKER_FILE "/usr/local/nagios/var/broker.socket" #define DEFAULT_P1_FILE "/usr/local/nagios/bin/p1.pl" /**** EMBEDDED PERL ****/ #define DEFAULT_AUTH_FILE "" /**** EMBEDDED PERL - IS THIS USED? ****/ ndoutils-1.4b9/include/nagios-2x/downtime.h0000644000175100017510000000676210550544426021017 0ustar baeckerhbaeckerh/***************************************************************************** * * DOWNTIME.H - Header file for scheduled downtime functions * * Copyright (c) 2001-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 01-08-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _DOWNTIME_H #define _DOWNTIME_H #include "config.h" #include "common.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif /* SCHEDULED_DOWNTIME_ENTRY structure */ typedef struct scheduled_downtime_struct{ int type; char *host_name; char *service_description; time_t entry_time; time_t start_time; time_t end_time; int fixed; unsigned long triggered_by; unsigned long duration; unsigned long downtime_id; char *author; char *comment; #ifdef NSCORE unsigned long comment_id; int is_in_effect; int start_flex_downtime; int incremented_pending_downtime; #endif struct scheduled_downtime_struct *next; }scheduled_downtime; #ifdef NSCORE int initialize_downtime_data(char *); /* initializes scheduled downtime data */ int cleanup_downtime_data(char *); /* cleans up scheduled downtime data */ int add_new_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *); int add_new_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *); int add_new_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *); int delete_host_downtime(unsigned long); int delete_service_downtime(unsigned long); int delete_downtime(int,unsigned long); int schedule_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *); int unschedule_downtime(int,unsigned long); int register_downtime(int,unsigned long); int handle_scheduled_downtime(scheduled_downtime *); int handle_scheduled_downtime_by_id(unsigned long); int check_pending_flex_host_downtime(host *); int check_pending_flex_service_downtime(service *); int check_for_expired_downtime(void); #endif #ifdef NSCGI int read_downtime_data(char *); #endif int add_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long); int add_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long); int add_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long); scheduled_downtime *find_downtime(int,unsigned long); scheduled_downtime *find_host_downtime(unsigned long); scheduled_downtime *find_service_downtime(unsigned long); void free_downtime_data(void); /* frees memory allocated to scheduled downtime list */ #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/common.h0000644000175100017510000003344410712143241020444 0ustar baeckerhbaeckerh/************************************************************************ * * Nagios Common Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 12-01-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #define PROGRAM_VERSION "2.10" #define PROGRAM_MODIFICATION_DATE "10-21-2007" /* daemon is thread safe */ #ifdef NSCORE #ifndef _REENTRANT #define _REENTRANT #endif #ifndef _THREAD_SAFE #define _THREAD_SAFE #endif #endif /* Experimental performance tweaks - use with caution */ #undef USE_MEMORY_PERFORMANCE_TWEAKS /***************************** COMMANDS *********************************/ #define CMD_NONE 0 #define CMD_ADD_HOST_COMMENT 1 #define CMD_DEL_HOST_COMMENT 2 #define CMD_ADD_SVC_COMMENT 3 #define CMD_DEL_SVC_COMMENT 4 #define CMD_ENABLE_SVC_CHECK 5 #define CMD_DISABLE_SVC_CHECK 6 #define CMD_SCHEDULE_SVC_CHECK 7 #define CMD_DELAY_SVC_NOTIFICATION 9 #define CMD_DELAY_HOST_NOTIFICATION 10 #define CMD_DISABLE_NOTIFICATIONS 11 #define CMD_ENABLE_NOTIFICATIONS 12 #define CMD_RESTART_PROCESS 13 #define CMD_SHUTDOWN_PROCESS 14 #define CMD_ENABLE_HOST_SVC_CHECKS 15 #define CMD_DISABLE_HOST_SVC_CHECKS 16 #define CMD_SCHEDULE_HOST_SVC_CHECKS 17 #define CMD_DELAY_HOST_SVC_NOTIFICATIONS 19 /* currently unimplemented */ #define CMD_DEL_ALL_HOST_COMMENTS 20 #define CMD_DEL_ALL_SVC_COMMENTS 21 #define CMD_ENABLE_SVC_NOTIFICATIONS 22 #define CMD_DISABLE_SVC_NOTIFICATIONS 23 #define CMD_ENABLE_HOST_NOTIFICATIONS 24 #define CMD_DISABLE_HOST_NOTIFICATIONS 25 #define CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST 26 #define CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST 27 #define CMD_ENABLE_HOST_SVC_NOTIFICATIONS 28 #define CMD_DISABLE_HOST_SVC_NOTIFICATIONS 29 #define CMD_PROCESS_SERVICE_CHECK_RESULT 30 #define CMD_SAVE_STATE_INFORMATION 31 #define CMD_READ_STATE_INFORMATION 32 #define CMD_ACKNOWLEDGE_HOST_PROBLEM 33 #define CMD_ACKNOWLEDGE_SVC_PROBLEM 34 #define CMD_START_EXECUTING_SVC_CHECKS 35 #define CMD_STOP_EXECUTING_SVC_CHECKS 36 #define CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS 37 #define CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS 38 #define CMD_ENABLE_PASSIVE_SVC_CHECKS 39 #define CMD_DISABLE_PASSIVE_SVC_CHECKS 40 #define CMD_ENABLE_EVENT_HANDLERS 41 #define CMD_DISABLE_EVENT_HANDLERS 42 #define CMD_ENABLE_HOST_EVENT_HANDLER 43 #define CMD_DISABLE_HOST_EVENT_HANDLER 44 #define CMD_ENABLE_SVC_EVENT_HANDLER 45 #define CMD_DISABLE_SVC_EVENT_HANDLER 46 #define CMD_ENABLE_HOST_CHECK 47 #define CMD_DISABLE_HOST_CHECK 48 #define CMD_START_OBSESSING_OVER_SVC_CHECKS 49 #define CMD_STOP_OBSESSING_OVER_SVC_CHECKS 50 #define CMD_REMOVE_HOST_ACKNOWLEDGEMENT 51 #define CMD_REMOVE_SVC_ACKNOWLEDGEMENT 52 #define CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS 53 #define CMD_SCHEDULE_FORCED_SVC_CHECK 54 #define CMD_SCHEDULE_HOST_DOWNTIME 55 #define CMD_SCHEDULE_SVC_DOWNTIME 56 #define CMD_ENABLE_HOST_FLAP_DETECTION 57 #define CMD_DISABLE_HOST_FLAP_DETECTION 58 #define CMD_ENABLE_SVC_FLAP_DETECTION 59 #define CMD_DISABLE_SVC_FLAP_DETECTION 60 #define CMD_ENABLE_FLAP_DETECTION 61 #define CMD_DISABLE_FLAP_DETECTION 62 #define CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS 63 #define CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS 64 #define CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS 65 #define CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS 66 #define CMD_ENABLE_HOSTGROUP_SVC_CHECKS 67 #define CMD_DISABLE_HOSTGROUP_SVC_CHECKS 68 #define CMD_CANCEL_HOST_DOWNTIME 69 /* not internally implemented */ #define CMD_CANCEL_SVC_DOWNTIME 70 /* not internally implemented */ #define CMD_CANCEL_ACTIVE_HOST_DOWNTIME 71 /* old - no longer used */ #define CMD_CANCEL_PENDING_HOST_DOWNTIME 72 /* old - no longer used */ #define CMD_CANCEL_ACTIVE_SVC_DOWNTIME 73 /* old - no longer used */ #define CMD_CANCEL_PENDING_SVC_DOWNTIME 74 /* old - no longer used */ #define CMD_CANCEL_ACTIVE_HOST_SVC_DOWNTIME 75 /* unimplemented */ #define CMD_CANCEL_PENDING_HOST_SVC_DOWNTIME 76 /* unimplemented */ #define CMD_FLUSH_PENDING_COMMANDS 77 #define CMD_DEL_HOST_DOWNTIME 78 #define CMD_DEL_SVC_DOWNTIME 79 #define CMD_ENABLE_FAILURE_PREDICTION 80 #define CMD_DISABLE_FAILURE_PREDICTION 81 #define CMD_ENABLE_PERFORMANCE_DATA 82 #define CMD_DISABLE_PERFORMANCE_DATA 83 #define CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME 84 #define CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME 85 #define CMD_SCHEDULE_HOST_SVC_DOWNTIME 86 #define CMD_PROCESS_HOST_CHECK_RESULT 87 #define CMD_START_EXECUTING_HOST_CHECKS 88 #define CMD_STOP_EXECUTING_HOST_CHECKS 89 #define CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS 90 #define CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS 91 #define CMD_ENABLE_PASSIVE_HOST_CHECKS 92 #define CMD_DISABLE_PASSIVE_HOST_CHECKS 93 #define CMD_START_OBSESSING_OVER_HOST_CHECKS 94 #define CMD_STOP_OBSESSING_OVER_HOST_CHECKS 95 #define CMD_SCHEDULE_HOST_CHECK 96 #define CMD_SCHEDULE_FORCED_HOST_CHECK 98 #define CMD_START_OBSESSING_OVER_SVC 99 #define CMD_STOP_OBSESSING_OVER_SVC 100 #define CMD_START_OBSESSING_OVER_HOST 101 #define CMD_STOP_OBSESSING_OVER_HOST 102 #define CMD_ENABLE_HOSTGROUP_HOST_CHECKS 103 #define CMD_DISABLE_HOSTGROUP_HOST_CHECKS 104 #define CMD_ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS 105 #define CMD_DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS 106 #define CMD_ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS 107 #define CMD_DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS 108 #define CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS 109 #define CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS 110 #define CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS 111 #define CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS 112 #define CMD_ENABLE_SERVICEGROUP_SVC_CHECKS 113 #define CMD_DISABLE_SERVICEGROUP_SVC_CHECKS 114 #define CMD_ENABLE_SERVICEGROUP_HOST_CHECKS 115 #define CMD_DISABLE_SERVICEGROUP_HOST_CHECKS 116 #define CMD_ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS 117 #define CMD_DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS 118 #define CMD_ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS 119 #define CMD_DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS 120 #define CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME 121 #define CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME 122 #define CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER 123 #define CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER 124 #define CMD_CHANGE_HOST_EVENT_HANDLER 125 #define CMD_CHANGE_SVC_EVENT_HANDLER 126 #define CMD_CHANGE_HOST_CHECK_COMMAND 127 #define CMD_CHANGE_SVC_CHECK_COMMAND 128 #define CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL 129 #define CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL 130 #define CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL 131 #define CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS 132 #define CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS 133 #define CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME 134 #define CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS 135 #define CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS 136 #define CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME 137 #define CMD_ENABLE_SERVICE_FRESHNESS_CHECKS 138 #define CMD_DISABLE_SERVICE_FRESHNESS_CHECKS 139 #define CMD_ENABLE_HOST_FRESHNESS_CHECKS 140 #define CMD_DISABLE_HOST_FRESHNESS_CHECKS 141 #define CMD_SET_HOST_NOTIFICATION_NUMBER 142 #define CMD_SET_SVC_NOTIFICATION_NUMBER 143 /************************ SERVICE CHECK TYPES ****************************/ #define SERVICE_CHECK_ACTIVE 0 /* Nagios performed the service check */ #define SERVICE_CHECK_PASSIVE 1 /* the service check result was submitted by an external source */ /************************** HOST CHECK TYPES *****************************/ #define HOST_CHECK_ACTIVE 0 /* Nagios performed the host check */ #define HOST_CHECK_PASSIVE 1 /* the host check result was submitted by an external source */ /************************ SERVICE STATE TYPES ****************************/ #define SOFT_STATE 0 #define HARD_STATE 1 /************************* SCHEDULED DOWNTIME TYPES **********************/ #define SERVICE_DOWNTIME 1 /* service downtime */ #define HOST_DOWNTIME 2 /* host downtime */ #define ANY_DOWNTIME 3 /* host or service downtime */ /************************** ACKNOWLEDGEMENT TYPES ************************/ #define HOST_ACKNOWLEDGEMENT 0 #define SERVICE_ACKNOWLEDGEMENT 1 #define ACKNOWLEDGEMENT_NONE 0 #define ACKNOWLEDGEMENT_NORMAL 1 #define ACKNOWLEDGEMENT_STICKY 2 /**************************** DEPENDENCY TYPES ***************************/ #define NOTIFICATION_DEPENDENCY 1 #define EXECUTION_DEPENDENCY 2 /**************************** PROGRAM MODES ******************************/ #define STANDBY_MODE 0 #define ACTIVE_MODE 1 /************************** LOG ROTATION MODES ***************************/ #define LOG_ROTATION_NONE 0 #define LOG_ROTATION_HOURLY 1 #define LOG_ROTATION_DAILY 2 #define LOG_ROTATION_WEEKLY 3 #define LOG_ROTATION_MONTHLY 4 /***************************** LOG VERSIONS ******************************/ #define LOG_VERSION_1 "1.0" #define LOG_VERSION_2 "2.0" /************************* GENERAL DEFINITIONS **************************/ #define OK 0 #define ERROR -2 /* value was changed from -1 so as to not interfere with STATUS_UNKNOWN plugin result */ #ifndef TRUE #define TRUE 1 #elif (TRUE!=1) #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #elif (FALSE!=0) #define FALSE 0 #endif /****************** HOST CONFIG FILE READING OPTIONS ********************/ #define READ_HOSTS 1 #define READ_HOSTGROUPS 2 #define READ_CONTACTS 4 #define READ_CONTACTGROUPS 8 #define READ_SERVICES 16 #define READ_COMMANDS 32 #define READ_TIMEPERIODS 64 #define READ_SERVICEESCALATIONS 128 #define READ_HOSTGROUPESCALATIONS 256 /* no longer implemented */ #define READ_SERVICEDEPENDENCIES 512 #define READ_HOSTDEPENDENCIES 1024 #define READ_HOSTESCALATIONS 2048 #define READ_HOSTEXTINFO 4096 #define READ_SERVICEEXTINFO 8192 #define READ_SERVICEGROUPS 16384 #define READ_ALL_OBJECT_DATA READ_HOSTS | READ_HOSTGROUPS | READ_CONTACTS | READ_CONTACTGROUPS | READ_SERVICES | READ_COMMANDS | READ_TIMEPERIODS | READ_SERVICEESCALATIONS | READ_SERVICEDEPENDENCIES | READ_HOSTDEPENDENCIES | READ_HOSTESCALATIONS | READ_HOSTEXTINFO | READ_SERVICEEXTINFO | READ_SERVICEGROUPS /************************** DATE/TIME TYPES *****************************/ #define LONG_DATE_TIME 0 #define SHORT_DATE_TIME 1 #define SHORT_DATE 2 #define SHORT_TIME 3 #define HTTP_DATE_TIME 4 /* time formatted for use in HTTP headers */ /**************************** DATE FORMATS ******************************/ #define DATE_FORMAT_US 0 /* U.S. (MM-DD-YYYY HH:MM:SS) */ #define DATE_FORMAT_EURO 1 /* European (DD-MM-YYYY HH:MM:SS) */ #define DATE_FORMAT_ISO8601 2 /* ISO8601 (YYYY-MM-DD HH:MM:SS) */ #define DATE_FORMAT_STRICT_ISO8601 3 /* ISO8601 (YYYY-MM-DDTHH:MM:SS) */ /************************** MISC DEFINITIONS ****************************/ #define MAX_FILENAME_LENGTH 256 /* max length of path/filename that Nagios will process */ #define MAX_INPUT_BUFFER 1024 /* size in bytes of max. input buffer (for reading files) */ #define MAX_COMMAND_BUFFER 8192 /* max length of raw or processed command line */ #define MAX_DATETIME_LENGTH 48 /************************* MODIFIED ATTRIBUTES **************************/ #define MODATTR_NONE 0 #define MODATTR_NOTIFICATIONS_ENABLED 1 #define MODATTR_ACTIVE_CHECKS_ENABLED 2 #define MODATTR_PASSIVE_CHECKS_ENABLED 4 #define MODATTR_EVENT_HANDLER_ENABLED 8 #define MODATTR_FLAP_DETECTION_ENABLED 16 #define MODATTR_FAILURE_PREDICTION_ENABLED 32 #define MODATTR_PERFORMANCE_DATA_ENABLED 64 #define MODATTR_OBSESSIVE_HANDLER_ENABLED 128 #define MODATTR_EVENT_HANDLER_COMMAND 256 #define MODATTR_CHECK_COMMAND 512 #define MODATTR_NORMAL_CHECK_INTERVAL 1024 #define MODATTR_RETRY_CHECK_INTERVAL 2048 #define MODATTR_MAX_CHECK_ATTEMPTS 4096 #define MODATTR_FRESHNESS_CHECKS_ENABLED 8192 ndoutils-1.4b9/include/nagios-2x/neberrors.h0000644000175100017510000000376410550310753021163 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBERRORS.H - Event broker errors * * Copyright (c) 2003-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-25-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBERRORS_H #define _NEBERRORS_H /***** GENERIC DEFINES *****/ #define NEB_OK 0 #define NEB_ERROR -1 #define NEB_TRUE 1 #define NEB_FALSE 0 /***** GENERIC ERRORS *****/ #define NEBERROR_NOMEM 100 /* memory could not be allocated */ /***** CALLBACK ERRORS *****/ #define NEBERROR_NOCALLBACKFUNC 200 /* no callback function was specified */ #define NEBERROR_NOCALLBACKLIST 201 /* callback list not initialized */ #define NEBERROR_CALLBACKBOUNDS 202 /* callback type was out of bounds */ #define NEBERROR_CALLBACKNOTFOUND 203 /* the callback could not be found */ #define NEBERROR_NOMODULEHANDLE 204 /* no module handle specified */ #define NEBERROR_BADMODULEHANDLE 205 /* bad module handle */ /***** MODULE ERRORS *****/ #define NEBERROR_NOMODULE 300 /* no module was specified */ /***** MODULE INFO ERRORS *****/ #define NEBERROR_MODINFOBOUNDS 400 /* module info index was out of bounds */ #endif ndoutils-1.4b9/include/nagios-2x/statusdata.h0000644000175100017510000001347210550310754021335 0ustar baeckerhbaeckerh/***************************************************************************** * * STATUSDATA.H - Header for external status data routines * * Copyright (c) 2000-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-25-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _STATUSDATA_H #define _STATUSDATA_H #ifdef NSCORE #include "objects.h" #endif #ifdef __cplusplus extern "C" { #endif #ifdef NSCGI #define READ_PROGRAM_STATUS 1 #define READ_HOST_STATUS 2 #define READ_SERVICE_STATUS 4 #define READ_ALL_STATUS_DATA READ_PROGRAM_STATUS | READ_HOST_STATUS | READ_SERVICE_STATUS /*************************** CHAINED HASH LIMITS ***************************/ #define SERVICESTATUS_HASHSLOTS 1024 #define HOSTSTATUS_HASHSLOTS 1024 /**************************** DATA STRUCTURES ******************************/ /* HOST STATUS structure */ typedef struct hoststatus_struct{ char *host_name; char *plugin_output; char *perf_data; int status; time_t last_update; int has_been_checked; int should_be_scheduled; int current_attempt; int max_attempts; time_t last_check; time_t next_check; int check_type; time_t last_state_change; time_t last_hard_state_change; int last_hard_state; time_t last_time_up; time_t last_time_down; time_t last_time_unreachable; int state_type; time_t last_notification; time_t next_notification; int no_more_notifications; int notifications_enabled; int problem_has_been_acknowledged; int acknowledgement_type; int current_notification_number; int accept_passive_host_checks; int event_handler_enabled; int checks_enabled; int flap_detection_enabled; int is_flapping; double percent_state_change; double latency; double execution_time; int scheduled_downtime_depth; int failure_prediction_enabled; int process_performance_data; int obsess_over_host; struct hoststatus_struct *next; struct hoststatus_struct *nexthash; }hoststatus; /* SERVICE STATUS structure */ typedef struct servicestatus_struct{ char *host_name; char *description; char *plugin_output; char *perf_data; int max_attempts; int current_attempt; int status; time_t last_update; int has_been_checked; int should_be_scheduled; time_t last_check; time_t next_check; int check_type; int checks_enabled; time_t last_state_change; time_t last_hard_state_change; int last_hard_state; time_t last_time_ok; time_t last_time_warning; time_t last_time_unknown; time_t last_time_critical; int state_type; time_t last_notification; time_t next_notification; int no_more_notifications; int notifications_enabled; int problem_has_been_acknowledged; int acknowledgement_type; int current_notification_number; int accept_passive_service_checks; int event_handler_enabled; int flap_detection_enabled; int is_flapping; double percent_state_change; double latency; double execution_time; int scheduled_downtime_depth; int failure_prediction_enabled; int process_performance_data; int obsess_over_service; struct servicestatus_struct *next; struct servicestatus_struct *nexthash; }servicestatus; /*************************** SERVICE STATES ***************************/ #define SERVICE_PENDING 1 #define SERVICE_OK 2 #define SERVICE_WARNING 4 #define SERVICE_UNKNOWN 8 #define SERVICE_CRITICAL 16 /**************************** HOST STATES ****************************/ #define HOST_PENDING 1 #define HOST_UP 2 #define HOST_DOWN 4 #define HOST_UNREACHABLE 8 /**************************** FUNCTIONS ******************************/ int read_status_data(char *,int); /* reads all status data */ int add_host_status(hoststatus *); /* adds a host status entry to the list in memory */ int add_service_status(servicestatus *); /* adds a service status entry to the list in memory */ int add_hoststatus_to_hashlist(hoststatus *); int add_servicestatus_to_hashlist(servicestatus *); servicestatus *find_servicestatus(char *,char *); /* finds status information for a specific service */ hoststatus *find_hoststatus(char *); /* finds status information for a specific host */ int get_servicestatus_count(char *,int); /* gets total number of services of a certain type for a specific host */ void free_status_data(void); /* free all memory allocated to status data */ #endif #ifdef NSCORE int initialize_status_data(char *); /* initializes status data at program start */ int update_all_status_data(void); /* updates all status data */ int cleanup_status_data(char *,int); /* cleans up status data at program termination */ int update_program_status(int); /* updates program status data */ int update_host_status(host *,int); /* updates host status data */ int update_service_status(service *,int); /* updates service status data */ #endif #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/comments.h0000644000175100017510000001153710550310753021004 0ustar baeckerhbaeckerh/***************************************************************************** * * COMMENTS.H - Header file for comment functions * * Last Modified: 12-15-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _COMMENTS_H #define _COMMENTS_H #include "config.h" #include "common.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif /**************************** COMMENT SOURCES ******************************/ #define COMMENTSOURCE_INTERNAL 0 #define COMMENTSOURCE_EXTERNAL 1 /***************************** COMMENT TYPES *******************************/ #define HOST_COMMENT 1 #define SERVICE_COMMENT 2 /****************************** ENTRY TYPES ********************************/ #define USER_COMMENT 1 #define DOWNTIME_COMMENT 2 #define FLAPPING_COMMENT 3 #define ACKNOWLEDGEMENT_COMMENT 4 /*************************** CHAINED HASH LIMITS ***************************/ #define COMMENT_HASHSLOTS 1024 /**************************** DATA STRUCTURES ******************************/ /* COMMENT structure */ typedef struct comment_struct{ int comment_type; int entry_type; unsigned long comment_id; int source; int persistent; time_t entry_time; int expires; time_t expire_time; char *host_name; char *service_description; char *author; char *comment_data; struct comment_struct *next; struct comment_struct *nexthash; }comment; #ifdef NSCORE int initialize_comment_data(char *); /* initializes comment data */ int cleanup_comment_data(char *); /* cleans up comment data */ int add_new_comment(int,int,char *,char *,time_t,char *,char *,int,int,int,time_t,unsigned long *); /* adds a new host or service comment */ int add_new_host_comment(int,char *,time_t,char *,char *,int,int,int,time_t,unsigned long *); /* adds a new host comment */ int add_new_service_comment(int,char *,char *,time_t,char *,char *,int,int,int,time_t,unsigned long *); /* adds a new service comment */ int delete_comment(int,unsigned long); /* deletes a host or service comment */ int delete_host_comment(unsigned long); /* deletes a host comment */ int delete_service_comment(unsigned long); /* deletes a service comment */ int delete_all_comments(int,char *,char *); /* deletes all comments for a particular host or service */ int delete_all_host_comments(char *); /* deletes all comments for a specific host */ int delete_all_service_comments(char *,char *); /* deletes all comments for a specific service */ int check_for_expired_comment(unsigned long); /* expires a comment */ #endif comment *find_comment(unsigned long,int); /* finds a specific comment */ comment *find_service_comment(unsigned long); /* finds a specific service comment */ comment *find_host_comment(unsigned long); /* finds a specific host comment */ comment *get_first_comment_by_host(char *); comment *get_next_comment_by_host(char *,comment *); int number_of_host_comments(char *); /* returns the number of comments associated with a particular host */ int number_of_service_comments(char *, char *); /* returns the number of comments associated with a particular service */ int read_comment_data(char *); /* reads all host and service comments */ int add_comment(int,int,char *,char *,time_t,char *,char *,unsigned long,int,int,time_t,int); /* adds a comment (host or service) */ int add_host_comment(int,char *,time_t,char *,char *,unsigned long,int,int,time_t,int); /* adds a host comment */ int add_service_comment(int,char *,char *,time_t,char *,char *,unsigned long,int,int,time_t,int); /* adds a service comment */ int add_comment_to_hashlist(comment *); void free_comment_data(void); /* frees memory allocated to the comment list */ #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/config.h0000644000175100017510000000001410566132257020420 0ustar baeckerhbaeckerh/* empty */ ndoutils-1.4b9/include/nagios-2x/snprintf.h0000644000175100017510000000016610550310754021017 0ustar baeckerhbaeckerh/* include/snprintf.h. Generated by configure. */ /* -*- C -*- */ #define HAVE_SNPRINTF 1 /* #undef NEED_VA_LIST */ ndoutils-1.4b9/include/nagios-2x/nagios.h0000644000175100017510000011645310606734617020455 0ustar baeckerhbaeckerh/************************************************************************ * * Nagios Main Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 01-08-2007 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef _NAGIOS_H #define _NAGIOS_H #include "config.h" #include "common.h" #include "locations.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif #define MAX_COMMAND_ARGUMENTS 32 /* maximum number of $ARGx$ macros */ #define MAX_USER_MACROS 256 /* maximum number of $USERx$ macros */ #define MAX_STATE_LENGTH 32 /* length definitions used in macros */ #define MAX_STATETYPE_LENGTH 24 #define MAX_CHECKTYPE_LENGTH 8 #define MAX_NOTIFICATIONTYPE_LENGTH 32 #define MAX_NOTIFICATIONNUMBER_LENGTH 8 #define MAX_ATTEMPT_LENGTH 8 #define MAX_TOTALS_LENGTH 8 #define MAX_EXECUTIONTIME_LENGTH 10 #define MAX_LATENCY_LENGTH 10 #define MAX_DURATION_LENGTH 17 #define MAX_DOWNTIME_LENGTH 3 #define MAX_STATEID_LENGTH 2 #define MAX_PERCENTCHANGE_LENGTH 8 #define MACRO_ENV_VAR_PREFIX "NAGIOS_" #define MACRO_X_COUNT 99 /* size of macro_x[] array */ #define MACRO_HOSTNAME 0 #define MACRO_HOSTALIAS 1 #define MACRO_HOSTADDRESS 2 #define MACRO_SERVICEDESC 3 #define MACRO_SERVICESTATE 4 #define MACRO_SERVICESTATEID 5 #define MACRO_SERVICEATTEMPT 6 #define MACRO_LONGDATETIME 7 #define MACRO_SHORTDATETIME 8 #define MACRO_DATE 9 #define MACRO_TIME 10 #define MACRO_TIMET 11 #define MACRO_LASTHOSTCHECK 12 #define MACRO_LASTSERVICECHECK 13 #define MACRO_LASTHOSTSTATECHANGE 14 #define MACRO_LASTSERVICESTATECHANGE 15 #define MACRO_HOSTOUTPUT 16 #define MACRO_SERVICEOUTPUT 17 #define MACRO_HOSTPERFDATA 18 #define MACRO_SERVICEPERFDATA 19 #define MACRO_CONTACTNAME 20 #define MACRO_CONTACTALIAS 21 #define MACRO_CONTACTEMAIL 22 #define MACRO_CONTACTPAGER 23 #define MACRO_ADMINEMAIL 24 #define MACRO_ADMINPAGER 25 #define MACRO_HOSTSTATE 26 #define MACRO_HOSTSTATEID 27 #define MACRO_HOSTATTEMPT 28 #define MACRO_NOTIFICATIONTYPE 29 #define MACRO_NOTIFICATIONNUMBER 30 #define MACRO_HOSTEXECUTIONTIME 31 #define MACRO_SERVICEEXECUTIONTIME 32 #define MACRO_HOSTLATENCY 33 #define MACRO_SERVICELATENCY 34 #define MACRO_HOSTDURATION 35 #define MACRO_SERVICEDURATION 36 #define MACRO_HOSTDURATIONSEC 37 #define MACRO_SERVICEDURATIONSEC 38 #define MACRO_HOSTDOWNTIME 39 #define MACRO_SERVICEDOWNTIME 40 #define MACRO_HOSTSTATETYPE 41 #define MACRO_SERVICESTATETYPE 42 #define MACRO_HOSTPERCENTCHANGE 43 #define MACRO_SERVICEPERCENTCHANGE 44 #define MACRO_HOSTGROUPNAME 45 #define MACRO_HOSTGROUPALIAS 46 #define MACRO_SERVICEGROUPNAME 47 #define MACRO_SERVICEGROUPALIAS 48 #define MACRO_HOSTACKAUTHOR 49 #define MACRO_HOSTACKCOMMENT 50 #define MACRO_SERVICEACKAUTHOR 51 #define MACRO_SERVICEACKCOMMENT 52 #define MACRO_LASTSERVICEOK 53 #define MACRO_LASTSERVICEWARNING 54 #define MACRO_LASTSERVICEUNKNOWN 55 #define MACRO_LASTSERVICECRITICAL 56 #define MACRO_LASTHOSTUP 57 #define MACRO_LASTHOSTDOWN 58 #define MACRO_LASTHOSTUNREACHABLE 59 #define MACRO_SERVICECHECKCOMMAND 60 #define MACRO_HOSTCHECKCOMMAND 61 #define MACRO_MAINCONFIGFILE 62 #define MACRO_STATUSDATAFILE 63 #define MACRO_COMMENTDATAFILE 64 #define MACRO_DOWNTIMEDATAFILE 65 #define MACRO_RETENTIONDATAFILE 66 #define MACRO_OBJECTCACHEFILE 67 #define MACRO_TEMPFILE 68 #define MACRO_LOGFILE 69 #define MACRO_RESOURCEFILE 70 #define MACRO_COMMANDFILE 71 #define MACRO_HOSTPERFDATAFILE 72 #define MACRO_SERVICEPERFDATAFILE 73 #define MACRO_HOSTACTIONURL 74 #define MACRO_HOSTNOTESURL 75 #define MACRO_HOSTNOTES 76 #define MACRO_SERVICEACTIONURL 77 #define MACRO_SERVICENOTESURL 78 #define MACRO_SERVICENOTES 79 #define MACRO_TOTALHOSTSUP 80 #define MACRO_TOTALHOSTSDOWN 81 #define MACRO_TOTALHOSTSUNREACHABLE 82 #define MACRO_TOTALHOSTSDOWNUNHANDLED 83 #define MACRO_TOTALHOSTSUNREACHABLEUNHANDLED 84 #define MACRO_TOTALHOSTPROBLEMS 85 #define MACRO_TOTALHOSTPROBLEMSUNHANDLED 86 #define MACRO_TOTALSERVICESOK 87 #define MACRO_TOTALSERVICESWARNING 88 #define MACRO_TOTALSERVICESCRITICAL 89 #define MACRO_TOTALSERVICESUNKNOWN 90 #define MACRO_TOTALSERVICESWARNINGUNHANDLED 91 #define MACRO_TOTALSERVICESCRITICALUNHANDLED 92 #define MACRO_TOTALSERVICESUNKNOWNUNHANDLED 93 #define MACRO_TOTALSERVICEPROBLEMS 94 #define MACRO_TOTALSERVICEPROBLEMSUNHANDLED 95 #define MACRO_PROCESSSTARTTIME 96 #define MACRO_HOSTCHECKTYPE 97 #define MACRO_SERVICECHECKTYPE 98 #define DEFAULT_LOG_LEVEL 1 /* log all events to main log file */ #define DEFAULT_USE_SYSLOG 1 /* log events to syslog? 1=yes, 0=no */ #define DEFAULT_SYSLOG_LEVEL 2 /* log only severe events to syslog */ #define DEFAULT_NOTIFICATION_LOGGING 1 /* log notification events? 1=yes, 0=no */ #define DEFAULT_INTER_CHECK_DELAY 5.0 /* seconds between initial service check scheduling */ #define DEFAULT_INTERLEAVE_FACTOR 1 /* default interleave to use when scheduling checks */ #define DEFAULT_SLEEP_TIME 0.5 /* seconds between event run checks */ #define DEFAULT_INTERVAL_LENGTH 60 /* seconds per interval unit for check scheduling */ #define DEFAULT_RETRY_INTERVAL 30 /* services are retried in 30 seconds if they're not OK */ #define DEFAULT_COMMAND_CHECK_INTERVAL -1 /* interval to check for external commands (default = as often as possible) */ #define DEFAULT_SERVICE_REAPER_INTERVAL 10 /* interval in seconds to reap service check results */ #define DEFAULT_MAX_REAPER_TIME 30 /* maximum number of seconds to spend reaping service checks before we break out for a while */ #define DEFAULT_MAX_PARALLEL_SERVICE_CHECKS 0 /* maximum number of service checks we can have running at any given time (0=unlimited) */ #define DEFAULT_RETENTION_UPDATE_INTERVAL 60 /* minutes between auto-save of retention data */ #define DEFAULT_RETENTION_SCHEDULING_HORIZON 900 /* max seconds between program restarts that we will preserve scheduling information */ #define DEFAULT_STATUS_UPDATE_INTERVAL 60 /* seconds between aggregated status data updates */ #define DEFAULT_FRESHNESS_CHECK_INTERVAL 60 /* seconds between service result freshness checks */ #define DEFAULT_AUTO_RESCHEDULING_INTERVAL 30 /* seconds between host and service check rescheduling events */ #define DEFAULT_AUTO_RESCHEDULING_WINDOW 180 /* window of time (in seconds) for which we should reschedule host and service checks */ #define DEFAULT_NOTIFICATION_TIMEOUT 30 /* max time in seconds to wait for notification commands to complete */ #define DEFAULT_EVENT_HANDLER_TIMEOUT 30 /* max time in seconds to wait for event handler commands to complete */ #define DEFAULT_HOST_CHECK_TIMEOUT 30 /* max time in seconds to wait for host check commands to complete */ #define DEFAULT_SERVICE_CHECK_TIMEOUT 60 /* max time in seconds to wait for service check commands to complete */ #define DEFAULT_OCSP_TIMEOUT 15 /* max time in seconds to wait for obsessive compulsive processing commands to complete */ #define DEFAULT_OCHP_TIMEOUT 15 /* max time in seconds to wait for obsessive compulsive processing commands to complete */ #define DEFAULT_PERFDATA_TIMEOUT 5 /* max time in seconds to wait for performance data commands to complete */ #define DEFAULT_TIME_CHANGE_THRESHOLD 900 /* compensate for time changes of more than 15 minutes */ #define DEFAULT_LOG_HOST_RETRIES 0 /* don't log host retries */ #define DEFAULT_LOG_SERVICE_RETRIES 0 /* don't log service retries */ #define DEFAULT_LOG_EVENT_HANDLERS 1 /* log event handlers */ #define DEFAULT_LOG_INITIAL_STATES 0 /* don't log initial service and host states */ #define DEFAULT_LOG_EXTERNAL_COMMANDS 1 /* log external commands */ #define DEFAULT_LOG_PASSIVE_CHECKS 1 /* log passive service checks */ #define DEFAULT_AGGRESSIVE_HOST_CHECKING 0 /* don't use "aggressive" host checking */ #define DEFAULT_CHECK_EXTERNAL_COMMANDS 0 /* don't check for external commands */ #define DEFAULT_CHECK_ORPHANED_SERVICES 1 /* don't check for orphaned services */ #define DEFAULT_ENABLE_FLAP_DETECTION 0 /* don't enable flap detection */ #define DEFAULT_PROCESS_PERFORMANCE_DATA 0 /* don't process performance data */ #define DEFAULT_CHECK_SERVICE_FRESHNESS 1 /* check service result freshness */ #define DEFAULT_CHECK_HOST_FRESHNESS 0 /* don't check host result freshness */ #define DEFAULT_AUTO_RESCHEDULE_CHECKS 0 /* don't auto-reschedule host and service checks */ #define DEFAULT_LOW_SERVICE_FLAP_THRESHOLD 20.0 /* low threshold for detection of service flapping */ #define DEFAULT_HIGH_SERVICE_FLAP_THRESHOLD 30.0 /* high threshold for detection of service flapping */ #define DEFAULT_LOW_HOST_FLAP_THRESHOLD 20.0 /* low threshold for detection of host flapping */ #define DEFAULT_HIGH_HOST_FLAP_THRESHOLD 30.0 /* high threshold for detection of host flapping */ #define DEFAULT_HOST_CHECK_SPREAD 30 /* max minutes to schedule all initial host checks */ #define DEFAULT_SERVICE_CHECK_SPREAD 30 /* max minutes to schedule all initial service checks */ /******************* LOGGING TYPES ********************/ #define NSLOG_RUNTIME_ERROR 1 #define NSLOG_RUNTIME_WARNING 2 #define NSLOG_VERIFICATION_ERROR 4 #define NSLOG_VERIFICATION_WARNING 8 #define NSLOG_CONFIG_ERROR 16 #define NSLOG_CONFIG_WARNING 32 #define NSLOG_PROCESS_INFO 64 #define NSLOG_EVENT_HANDLER 128 /*#define NSLOG_NOTIFICATION 256*/ /* NOT USED ANYMORE - CAN BE REUSED */ #define NSLOG_EXTERNAL_COMMAND 512 #define NSLOG_HOST_UP 1024 #define NSLOG_HOST_DOWN 2048 #define NSLOG_HOST_UNREACHABLE 4096 #define NSLOG_SERVICE_OK 8192 #define NSLOG_SERVICE_UNKNOWN 16384 #define NSLOG_SERVICE_WARNING 32768 #define NSLOG_SERVICE_CRITICAL 65536 #define NSLOG_PASSIVE_CHECK 131072 #define NSLOG_INFO_MESSAGE 262144 #define NSLOG_HOST_NOTIFICATION 524288 #define NSLOG_SERVICE_NOTIFICATION 1048576 /******************** HOST STATUS *********************/ #define HOST_UP 0 #define HOST_DOWN 1 #define HOST_UNREACHABLE 2 /******************* STATE LOGGING TYPES **************/ #define INITIAL_STATES 1 #define CURRENT_STATES 2 /************ SERVICE DEPENDENCY VALUES ***************/ #define DEPENDENCIES_OK 0 #define DEPENDENCIES_FAILED 1 /*********** ROUTE CHECK PROPAGATION TYPES ************/ #define PROPAGATE_TO_PARENT_HOSTS 1 #define PROPAGATE_TO_CHILD_HOSTS 2 /****************** SERVICE STATES ********************/ #define STATE_OK 0 #define STATE_WARNING 1 #define STATE_CRITICAL 2 #define STATE_UNKNOWN 3 /* changed from -1 on 02/24/2001 */ /****************** FLAPPING TYPES ********************/ #define HOST_FLAPPING 0 #define SERVICE_FLAPPING 1 /**************** NOTIFICATION TYPES ******************/ #define HOST_NOTIFICATION 0 #define SERVICE_NOTIFICATION 1 /************* NOTIFICATION REASON TYPES ***************/ #define NOTIFICATION_NORMAL 0 #define NOTIFICATION_ACKNOWLEDGEMENT 1 #define NOTIFICATION_FLAPPINGSTART 2 #define NOTIFICATION_FLAPPINGSTOP 3 /**************** EVENT HANDLER TYPES *****************/ #define HOST_EVENTHANDLER 0 #define SERVICE_EVENTHANDLER 1 #define GLOBAL_HOST_EVENTHANDLER 2 #define GLOBAL_SERVICE_EVENTHANDLER 3 /***************** STATE CHANGE TYPES *****************/ #define HOST_STATECHANGE 0 #define SERVICE_STATECHANGE 1 /******************* EVENT TYPES **********************/ #define EVENT_SERVICE_CHECK 0 /* active service check */ #define EVENT_COMMAND_CHECK 1 /* external command check */ #define EVENT_LOG_ROTATION 2 /* log file rotation */ #define EVENT_PROGRAM_SHUTDOWN 3 /* program shutdown */ #define EVENT_PROGRAM_RESTART 4 /* program restart */ #define EVENT_SERVICE_REAPER 5 /* reaps results from service checks */ #define EVENT_ORPHAN_CHECK 6 /* checks for orphaned service checks */ #define EVENT_RETENTION_SAVE 7 /* save (dump) retention data */ #define EVENT_STATUS_SAVE 8 /* save (dump) status data */ #define EVENT_SCHEDULED_DOWNTIME 9 /* scheduled host or service downtime */ #define EVENT_SFRESHNESS_CHECK 10 /* checks service result "freshness" */ #define EVENT_EXPIRE_DOWNTIME 11 /* checks for (and removes) expired scheduled downtime */ #define EVENT_HOST_CHECK 12 /* active host check */ #define EVENT_HFRESHNESS_CHECK 13 /* checks host result "freshness" */ #define EVENT_RESCHEDULE_CHECKS 14 /* adjust scheduling of host and service checks */ #define EVENT_EXPIRE_COMMENT 15 /* removes expired comments */ #define EVENT_SLEEP 98 /* asynchronous sleep event that occurs when event queues are empty */ #define EVENT_USER_FUNCTION 99 /* USER-defined function (modules) */ /******* INTER-CHECK DELAY CALCULATION TYPES **********/ #define ICD_NONE 0 /* no inter-check delay */ #define ICD_DUMB 1 /* dumb delay of 1 second */ #define ICD_SMART 2 /* smart delay */ #define ICD_USER 3 /* user-specified delay */ /******* INTERLEAVE FACTOR CALCULATION TYPES **********/ #define ILF_USER 0 /* user-specified interleave factor */ #define ILF_SMART 1 /* smart interleave */ /************** SERVICE CHECK OPTIONS *****************/ #define CHECK_OPTION_NONE 0 /* no check options */ #define CHECK_OPTION_FORCE_EXECUTION 1 /* force execution of a service check (ignores disabled services, invalid timeperiods) */ /************ SCHEDULED DOWNTIME TYPES ****************/ #define ACTIVE_DOWNTIME 0 /* active downtime - currently in effect */ #define PENDING_DOWNTIME 1 /* pending downtime - scheduled for the future */ /************* MACRO CLEANING OPTIONS *****************/ #define STRIP_ILLEGAL_MACRO_CHARS 1 #define ESCAPE_MACRO_CHARS 2 #define URL_ENCODE_MACRO_CHARS 4 /****************** DATA STRUCTURES *******************/ /* TIMED_EVENT structure */ typedef struct timed_event_struct{ int event_type; time_t run_time; int recurring; unsigned long event_interval; int compensate_for_time_change; void *timing_func; void *event_data; void *event_args; struct timed_event_struct *next; }timed_event; /* NOTIFY_LIST structure */ typedef struct notify_list_struct{ contact *contact; struct notify_list_struct *next; }notification; /* SERVICE_MESSAGE structure */ typedef struct service_message_struct{ char host_name[MAX_HOSTNAME_LENGTH]; /* host name */ char description[MAX_SERVICEDESC_LENGTH]; /* service description */ int return_code; /* plugin return code */ int exited_ok; /* did the plugin check return okay? */ int check_type; /* was this an active or passive service check? */ int parallelized; /* was this check run in parallel? */ struct timeval start_time; /* time the service check was initiated */ struct timeval finish_time; /* time the service check was completed */ int early_timeout; /* did the service check timeout? */ char output[MAX_PLUGINOUTPUT_LENGTH]; /* plugin output */ }service_message; /* SCHED_INFO structure */ typedef struct sched_info_struct{ int total_services; int total_scheduled_services; int total_hosts; int total_scheduled_hosts; double average_services_per_host; double average_scheduled_services_per_host; unsigned long service_check_interval_total; unsigned long host_check_interval_total; double average_service_check_interval; double average_host_check_interval; double average_service_inter_check_delay; double average_host_inter_check_delay; double service_inter_check_delay; double host_inter_check_delay; int service_interleave_factor; int max_service_check_spread; int max_host_check_spread; time_t first_service_check; time_t last_service_check; time_t first_host_check; time_t last_host_check; }sched_info; /* PASSIVE_CHECK_RESULT structure */ typedef struct passive_check_result_struct{ char *host_name; char *svc_description; int return_code; char *output; time_t check_time; struct passive_check_result_struct *next; }passive_check_result; /* CIRCULAR_BUFFER structure - used by worker threads */ typedef struct circular_buffer_struct{ void **buffer; int tail; int head; int items; int high; /* highest number of items that has ever been stored in buffer */ unsigned long overflow; pthread_mutex_t buffer_lock; }circular_buffer; /* MMAPFILE structure - used for reading files via mmap() */ typedef struct mmapfile_struct{ char *path; int mode; int fd; unsigned long file_size; unsigned long current_position; unsigned long current_line; void *mmap_buf; }mmapfile; /* slots in circular buffers */ #define DEFAULT_EXTERNAL_COMMAND_BUFFER_SLOTS 4096 #define DEFAULT_CHECK_RESULT_BUFFER_SLOTS 4096 /* worker threads */ #define TOTAL_WORKER_THREADS 2 #define COMMAND_WORKER_THREAD 0 #define SERVICE_WORKER_THREAD 1 /******************** FUNCTIONS **********************/ /**** Configuration Functions ****/ int read_main_config_file(char *); /* reads the main config file (nagios.cfg) */ int read_resource_file(char *); /* processes macros in resource file */ int read_all_object_data(char *); /* reads all object config data */ /**** Setup Functions ****/ int pre_flight_check(void); /* try and verify the configuration data */ void init_timing_loop(void); /* setup the initial scheduling queue */ void setup_sighandler(void); /* trap signals */ void reset_sighandler(void); /* reset signals to default action */ int daemon_init(void); /* switches to daemon mode */ int drop_privileges(char *,char *); /* drops privileges before startup */ void display_scheduling_info(void); /* displays service check scheduling information */ /**** IPC Functions ****/ int read_svc_message(service_message *); /* reads a service check message from the message pipe */ int write_svc_message(service_message *); /* writes a service check message to the message pipe */ int open_command_file(void); /* creates the external command file as a named pipe (FIFO) and opens it for reading */ int close_command_file(void); /* closes and deletes the external command file (FIFO) */ /**** Monitoring/Event Handler Functions ****/ int schedule_new_event(int,int,time_t,int,unsigned long,void *,int,void *,void *); /* schedules a new timed event */ void reschedule_event(timed_event *,timed_event **); /* reschedules an event */ int deschedule_event(int,int,void *,void *); /* removes an event from the schedule */ void add_event(timed_event *,timed_event **); /* adds an event to the execution queue */ void remove_event(timed_event *,timed_event **); /* remove an event from the execution queue */ int event_execution_loop(void); /* main monitoring/event handler loop */ int handle_timed_event(timed_event *); /* top level handler for timed events */ void run_service_check(service *); /* parallelized service check routine */ void reap_service_checks(void); /* handles results from service checks */ int check_service_dependencies(service *,int); /* checks service dependencies */ int check_host_dependencies(host *,int); /* checks host dependencies */ void check_for_orphaned_services(void); /* checks for orphaned services */ void check_service_result_freshness(void); /* checks the "freshness" of service check results */ void check_host_result_freshness(void); /* checks the "freshness" of host check results */ void adjust_check_scheduling(void); /* auto-adjusts scheduling of host and service checks */ int my_system(char *,int,int *,double *,char *,int); /* executes a command via popen(), but also protects against timeouts */ void compensate_for_system_time_change(unsigned long,unsigned long); /* attempts to compensate for a change in the system time */ void adjust_timestamp_for_time_change(time_t,time_t,unsigned long,time_t *); /* adjusts a timestamp variable for a system time change */ void resort_event_list(timed_event **); /* resorts event list by event run time for system time changes */ /**** Flap Detection Functions ****/ void check_for_service_flapping(service *,int); /* determines whether or not a service is "flapping" between states */ void check_for_host_flapping(host *,int); /* determines whether or not a host is "flapping" between states */ void set_service_flap(service *,double,double,double); /* handles a service that is flapping */ void clear_service_flap(service *,double,double,double); /* handles a service that has stopped flapping */ void set_host_flap(host *,double,double,double); /* handles a host that is flapping */ void clear_host_flap(host *,double,double,double); /* handles a host that has stopped flapping */ void enable_flap_detection_routines(void); /* enables flap detection on a program-wide basis */ void disable_flap_detection_routines(void); /* disables flap detection on a program-wide basis */ void enable_host_flap_detection(host *); /* enables flap detection for a particular host */ void disable_host_flap_detection(host *); /* disables flap detection for a particular host */ void enable_service_flap_detection(service *); /* enables flap detection for a particular service */ void disable_service_flap_detection(service *); /* disables flap detection for a particular service */ /**** Route/Host Check Functions ****/ int verify_route_to_host(host *,int); /* on-demand check of whether a host is up, down, or unreachable */ int run_scheduled_host_check(host *); /* runs a scheduled host check */ int check_host(host *,int,int); /* checks if a host is up or down */ int run_host_check(host *,int); /* runs a host check */ int handle_host_state(host *); /* top level host state handler */ /**** Event Handler Functions ****/ int obsessive_compulsive_service_check_processor(service *); /* distributed monitoring craziness... */ int obsessive_compulsive_host_check_processor(host *); /* distributed monitoring craziness... */ int handle_service_event(service *); /* top level service event logic */ int run_service_event_handler(service *); /* runs the event handler for a specific service */ int run_global_service_event_handler(service *); /* runs the global service event handler */ int handle_host_event(host *); /* top level host event logic */ int run_host_event_handler(host *); /* runs the event handler for a specific host */ int run_global_host_event_handler(host *); /* runs the global host event handler */ /**** Notification Functions ****/ int check_service_notification_viability(service *,int); /* checks viability of notifying all contacts about a service */ int is_valid_escalation_for_service_notification(service *,serviceescalation *); /* checks if an escalation entry is valid for a particular service notification */ int should_service_notification_be_escalated(service *); /* checks if a service notification should be escalated */ int service_notification(service *,int,char *,char *); /* notify all contacts about a service (problem or recovery) */ int check_contact_service_notification_viability(contact *,service *,int); /* checks viability of notifying a contact about a service */ int notify_contact_of_service(contact *,service *,int,char *,char *,int); /* notify a single contact about a service */ int check_host_notification_viability(host *,int); /* checks viability of notifying all contacts about a host */ int is_valid_host_escalation_for_host_notification(host *,hostescalation *); /* checks if an escalation entry is valid for a particular host notification */ int should_host_notification_be_escalated(host *); /* checks if a host notification should be escalated */ int host_notification(host *,int,char *,char *); /* notify all contacts about a host (problem or recovery) */ int check_contact_host_notification_viability(contact *,host *,int); /* checks viability of notifying a contact about a host */ int notify_contact_of_host(contact *,host *,int,char *,char *,int); /* notify a single contact about a host */ int create_notification_list_from_host(host *,int *); /* given a host, create list of contacts to be notified (remove duplicates) */ int create_notification_list_from_service(service *,int *); /* given a service, create list of contacts to be notified (remove duplicates) */ int add_notification(contact *); /* adds a notification instance */ notification * find_notification(char *); /* finds a notification object */ time_t get_next_host_notification_time(host *,time_t); /* calculates nex acceptable re-notification time for a host */ time_t get_next_service_notification_time(service *,time_t); /* calculates nex acceptable re-notification time for a service */ /**** Logging Functions ****/ int write_to_logs_and_console(char *,unsigned long,int); /* writes a string to screen and logs */ int write_to_console(char *); /* writes a string to screen */ int write_to_all_logs(char *,unsigned long); /* writes a string to main log file and syslog facility */ int write_to_all_logs_with_timestamp(char *,unsigned long,time_t *); /* writes a string to main log file and syslog facility */ int write_to_log(char *,unsigned long,time_t *); /* write a string to the main log file */ int write_to_syslog(char *,unsigned long); /* write a string to the syslog facility */ int log_service_event(service *); /* logs a service event */ int log_host_event(host *); /* logs a host event */ int log_host_states(int,time_t *); /* logs initial/current host states */ int log_service_states(int,time_t *); /* logs initial/current service states */ int rotate_log_file(time_t); /* rotates the main log file */ int write_log_file_info(time_t *); /* records log file/version info */ /**** Cleanup Functions ****/ void cleanup(void); /* cleanup after ourselves (before quitting or restarting) */ void free_memory(void); /* free memory allocated to all linked lists in memory */ int reset_variables(void); /* reset all global variables */ void free_notification_list(void); /* frees all memory allocated to the notification list */ /**** Hash Functions ****/ int hashfunc1(const char *name1, int hashslots); int hashfunc2(const char *name1, const char *name2, int hashslots); int compare_hashdata1(const char *,const char *); int compare_hashdata2(const char *,const char *,const char *,const char *); /**** Miscellaneous Functions ****/ void sighandler(int); /* handles signals */ void service_check_sighandler(int); /* handles timeouts when executing service checks */ void my_system_sighandler(int); /* handles timeouts when executing commands via my_system() */ void file_lock_sighandler(int); /* handles timeouts while waiting for file locks */ void strip(char *); /* strips whitespace from string */ char *my_strtok(char *,char *); /* my replacement for strtok() function (doesn't skip consecutive tokens) */ char *my_strsep(char **,const char *); /* Solaris doesn't have strsep(), so I took this from the glibc source code */ char *get_url_encoded_string(char *); /* URL encode a string */ int contains_illegal_object_chars(char *); /* tests whether or not an object name (host, service, etc.) contains illegal characters */ int my_rename(char *,char *); /* renames a file - works across filesystems */ void get_raw_command_line(char *,char *,int,int); /* given a raw command line, determine the actual command to run */ int check_time_against_period(time_t,char *); /* check to see if a specific time is covered by a time period */ void get_next_valid_time(time_t, time_t *,char *); /* get the next valid time in a time period */ void get_datetime_string(time_t *,char *,int,int); /* get a date/time string for use in output */ time_t get_next_log_rotation_time(void); /* determine the next time to schedule a log rotation */ int init_embedded_perl(char **); /* initialized embedded perl interpreter */ int deinit_embedded_perl(void); /* cleans up embedded perl */ /**** Macro Functions ****/ int process_macros(char *,char *,int,int); /* replace macros with their actual values */ char *clean_macro_chars(char *,int); /* cleans macros characters before insertion into output string */ int grab_service_macros(service *); /* updates the service macro data */ int grab_host_macros(host *); /* updates the host macro data */ int grab_contact_macros(contact *); /* updates the contact macro data */ int grab_datetime_macros(void); /* updates date/time macros */ int grab_summary_macros(contact *); /* updates summary macros */ int grab_on_demand_macro(char *); /* fetches an on-demand macro */ int grab_on_demand_host_macro(host *,char *); /* fetches an on-demand host macro */ int grab_on_demand_service_macro(service *,char *); /* fetches an on-demand service macro */ int clear_argv_macros(void); /* clear all argv macros used in commands */ int clear_volatile_macros(void); /* clear all "volatile" macros that change between service/host checks */ int clear_nonvolatile_macros(void); /* clear all "nonvolatile" macros which remain relatively constant */ /**** External Command Functions ****/ void check_for_external_commands(void); /* checks for any external commands */ void process_external_command(int,time_t,char *); /* process an external command */ int process_host_command(int,time_t,char *); /* process an external host command */ int process_hostgroup_command(int,time_t,char *); /* process an external hostgroup command */ int process_service_command(int,time_t,char *); /* process an external service command */ int process_servicegroup_command(int,time_t,char *); /* process an external servicegroup command */ /**** External Command Implementations ****/ int cmd_add_comment(int,time_t,char *); /* add a service or host comment */ int cmd_delete_comment(int,char *); /* delete a service or host comment */ int cmd_delete_all_comments(int,char *); /* delete all comments associated with a host or service */ int cmd_delay_notification(int,char *); /* delay a service or host notification */ int cmd_schedule_service_check(int,char *,int); /* schedule an immediate or delayed service check */ int cmd_schedule_check(int,char *); /* schedule an immediate or delayed host check */ int cmd_schedule_host_service_checks(int,char *,int); /* schedule an immediate or delayed checks of all services on a host */ int cmd_signal_process(int,char *); /* schedules a program shutdown or restart */ int cmd_process_service_check_result(int,time_t,char *); /* processes a passive service check */ int cmd_process_host_check_result(int,time_t,char *); /* processes a passive host check */ int cmd_acknowledge_problem(int,char *); /* acknowledges a host or service problem */ int cmd_remove_acknowledgement(int,char *); /* removes a host or service acknowledgement */ int cmd_schedule_downtime(int,time_t,char *); /* schedules host or service downtime */ int cmd_delete_downtime(int,char *); /* cancels active/pending host or service scheduled downtime */ int cmd_change_command(int,char *); /* changes host/svc command */ int cmd_change_check_interval(int,char *); /* changes host/svc check interval */ int cmd_change_max_attempts(int,char *); /* changes host/svc max attempts */ int process_passive_service_check(time_t,char *,char *,int,char *); int process_passive_host_check(time_t,char *,int,char *); /**** Internal Command Implementations ****/ void disable_service_checks(service *); /* disables a service check */ void enable_service_checks(service *); /* enables a service check */ void schedule_service_check(service *,time_t,int); /* schedules an immediate or delayed service check */ void schedule_host_check(host *,time_t,int); /* schedules an immediate or delayed host check */ void enable_all_notifications(void); /* enables notifications on a program-wide basis */ void disable_all_notifications(void); /* disables notifications on a program-wide basis */ void enable_service_notifications(service *); /* enables service notifications */ void disable_service_notifications(service *); /* disables service notifications */ void enable_host_notifications(host *); /* enables host notifications */ void disable_host_notifications(host *); /* disables host notifications */ void enable_and_propagate_notifications(host *,int,int,int,int); /* enables notifications for all hosts and services beyond a given host */ void disable_and_propagate_notifications(host *,int,int,int,int); /* disables notifications for all hosts and services beyond a given host */ void schedule_and_propagate_downtime(host *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long); /* schedules downtime for all hosts beyond a given host */ void acknowledge_host_problem(host *,char *,char *,int,int,int); /* acknowledges a host problem */ void acknowledge_service_problem(service *,char *,char *,int,int,int); /* acknowledges a service problem */ void remove_host_acknowledgement(host *); /* removes a host acknowledgement */ void remove_service_acknowledgement(service *); /* removes a service acknowledgement */ void start_executing_service_checks(void); /* starts executing service checks */ void stop_executing_service_checks(void); /* stops executing service checks */ void start_accepting_passive_service_checks(void); /* starts accepting passive service check results */ void stop_accepting_passive_service_checks(void); /* stops accepting passive service check results */ void enable_passive_service_checks(service *); /* enables passive service checks for a particular service */ void disable_passive_service_checks(service *); /* disables passive service checks for a particular service */ void start_using_event_handlers(void); /* enables event handlers on a program-wide basis */ void stop_using_event_handlers(void); /* disables event handlers on a program-wide basis */ void enable_service_event_handler(service *); /* enables the event handler for a particular service */ void disable_service_event_handler(service *); /* disables the event handler for a particular service */ void enable_host_event_handler(host *); /* enables the event handler for a particular host */ void disable_host_event_handler(host *); /* disables the event handler for a particular host */ void enable_host_checks(host *); /* enables checks of a particular host */ void disable_host_checks(host *); /* disables checks of a particular host */ void start_obsessing_over_service_checks(void); /* start obsessing about service check results */ void stop_obsessing_over_service_checks(void); /* stop obsessing about service check results */ void start_obsessing_over_host_checks(void); /* start obsessing about host check results */ void stop_obsessing_over_host_checks(void); /* stop obsessing about host check results */ void enable_service_freshness_checks(void); /* enable service freshness checks */ void disable_service_freshness_checks(void); /* disable service freshness checks */ void enable_host_freshness_checks(void); /* enable host freshness checks */ void disable_host_freshness_checks(void); /* disable host freshness checks */ void process_passive_service_checks(void); /* processes passive service check results */ void enable_all_failure_prediction(void); /* enables failure prediction on a program-wide basis */ void disable_all_failure_prediction(void); /* disables failure prediction on a program-wide basis */ void enable_performance_data(void); /* enables processing of performance data on a program-wide basis */ void disable_performance_data(void); /* disables processing of performance data on a program-wide basis */ void start_executing_host_checks(void); /* starts executing host checks */ void stop_executing_host_checks(void); /* stops executing host checks */ void start_accepting_passive_host_checks(void); /* starts accepting passive host check results */ void stop_accepting_passive_host_checks(void); /* stops accepting passive host check results */ void enable_passive_host_checks(host *); /* enables passive host checks for a particular host */ void disable_passive_host_checks(host *); /* disables passive host checks for a particular host */ void start_obsessing_over_service(service *); /* start obsessing about specific service check results */ void stop_obsessing_over_service(service *); /* stop obsessing about specific service check results */ void start_obsessing_over_host(host *); /* start obsessing about specific host check results */ void stop_obsessing_over_host(host *); /* stop obsessing about specific host check results */ void set_host_notification_number(host *,int); /* sets current notification number for a specific host */ void set_service_notification_number(service *,int); /* sets current notification number for a specific service */ int init_service_result_worker_thread(void); int shutdown_service_result_worker_thread(void); void * service_result_worker_thread(void *); void cleanup_service_result_worker_thread(void *); int init_command_file_worker_thread(void); int shutdown_command_file_worker_thread(void); void * command_file_worker_thread(void *); void cleanup_command_file_worker_thread(void *); int submit_external_command(char *,int *); int submit_raw_external_command(char *,time_t *,int *); char *get_program_version(void); char *get_program_modification_date(void); mmapfile *mmap_fopen(char *); /* open a file read-only via mmap() */ int mmap_fclose(mmapfile *); char *mmap_fgets(mmapfile *); char *mmap_fgets_multiline(mmapfile *); int init_macrox_names(void); int add_macrox_name(int,char *); int free_macrox_names(void); int set_all_macro_environment_vars(int); int set_macrox_environment_vars(int); int set_argv_macro_environment_vars(int); int set_macro_environment_var(char *,char *,int); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/getcgi.h0000644000175100017510000000066010550310754020415 0ustar baeckerhbaeckerh/****************************************************** * * GETCGI.H - Nagios CGI Input Routine Include File * * Last Modified: 11-25-2005 * *****************************************************/ #ifdef __cplusplus extern "C" { #endif char **getcgivars(void); void free_cgivars(char **); void unescape_cgi_input(char *); void sanitize_cgi_input(char **); unsigned char hex_to_char(char *); #ifdef __cplusplus } #endif ndoutils-1.4b9/include/nagios-2x/perfdata.h0000644000175100017510000000272510550310753020744 0ustar baeckerhbaeckerh/***************************************************************************** * * PERFDATA.H - Include file for performance data routines * * Copyright (c) 2001-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-25-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _PERFDATA_H #define _PERFDATA_H #include "objects.h" #ifdef __cplusplus extern "C" { #endif int initialize_performance_data(char *); /* initializes performance data */ int cleanup_performance_data(char *); /* cleans up performance data */ int update_host_performance_data(host *); /* updates host performance data */ int update_service_performance_data(service *); /* updates service performance data */ #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/broker.h0000644000175100017510000002340610550310753020441 0ustar baeckerhbaeckerh/***************************************************************************** * * BROKER.H - Event broker includes for Nagios * * Copyright (c) 2002-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 12-16-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _BROKER_H #define _BROKER_H #include "config.h" #include "nagios.h" #ifdef __cplusplus extern "C" { #endif /*************** EVENT BROKER OPTIONS *****************/ #define BROKER_NOTHING 0 #define BROKER_EVERYTHING 1048575 #define BROKER_PROGRAM_STATE 1 /* DONE */ #define BROKER_TIMED_EVENTS 2 /* DONE */ #define BROKER_SERVICE_CHECKS 4 /* DONE */ #define BROKER_HOST_CHECKS 8 /* DONE */ #define BROKER_EVENT_HANDLERS 16 /* DONE */ #define BROKER_LOGGED_DATA 32 /* DONE */ #define BROKER_NOTIFICATIONS 64 /* DONE */ #define BROKER_FLAPPING_DATA 128 /* DONE */ #define BROKER_COMMENT_DATA 256 /* DONE */ #define BROKER_DOWNTIME_DATA 512 /* DONE */ #define BROKER_SYSTEM_COMMANDS 1024 /* DONE */ #define BROKER_OCP_DATA 2048 /* DONE */ #define BROKER_STATUS_DATA 4096 /* DONE */ #define BROKER_ADAPTIVE_DATA 8192 /* DONE */ #define BROKER_EXTERNALCOMMAND_DATA 16384 /* DONE */ #define BROKER_RETENTION_DATA 32768 /* DONE */ #define BROKER_ACKNOWLEDGEMENT_DATA 65536 #define BROKER_STATECHANGE_DATA 131072 #define BROKER_RESERVED18 262144 #define BROKER_RESERVED19 524288 /****** EVENT TYPES ************************/ #define NEBTYPE_NONE 0 #define NEBTYPE_HELLO 1 #define NEBTYPE_GOODBYE 2 #define NEBTYPE_INFO 3 #define NEBTYPE_PROCESS_START 100 #define NEBTYPE_PROCESS_DAEMONIZE 101 #define NEBTYPE_PROCESS_RESTART 102 #define NEBTYPE_PROCESS_SHUTDOWN 103 #define NEBTYPE_PROCESS_PRELAUNCH 104 /* before objects are read or verified */ #define NEBTYPE_PROCESS_EVENTLOOPSTART 105 #define NEBTYPE_PROCESS_EVENTLOOPEND 106 #define NEBTYPE_TIMEDEVENT_ADD 200 #define NEBTYPE_TIMEDEVENT_REMOVE 201 #define NEBTYPE_TIMEDEVENT_EXECUTE 202 #define NEBTYPE_TIMEDEVENT_DELAY 203 /* NOT IMPLEMENTED */ #define NEBTYPE_TIMEDEVENT_SKIP 204 /* NOT IMPLEMENTED */ #define NEBTYPE_TIMEDEVENT_SLEEP 205 #define NEBTYPE_LOG_DATA 300 #define NEBTYPE_LOG_ROTATION 301 #define NEBTYPE_SYSTEM_COMMAND_START 400 #define NEBTYPE_SYSTEM_COMMAND_END 401 #define NEBTYPE_EVENTHANDLER_START 500 #define NEBTYPE_EVENTHANDLER_END 501 #define NEBTYPE_NOTIFICATION_START 600 #define NEBTYPE_NOTIFICATION_END 601 #define NEBTYPE_CONTACTNOTIFICATION_START 602 #define NEBTYPE_CONTACTNOTIFICATION_END 603 #define NEBTYPE_CONTACTNOTIFICATIONMETHOD_START 604 #define NEBTYPE_CONTACTNOTIFICATIONMETHOD_END 605 #define NEBTYPE_SERVICECHECK_INITIATE 700 #define NEBTYPE_SERVICECHECK_PROCESSED 701 #define NEBTYPE_SERVICECHECK_RAW_START 702 /* NOT IMPLEMENTED */ #define NEBTYPE_SERVICECHECK_RAW_END 703 /* NOT IMPLEMENTED */ #define NEBTYPE_HOSTCHECK_INITIATE 800 /* a check of the route to the host has been initiated */ #define NEBTYPE_HOSTCHECK_PROCESSED 801 /* the processed/final result of a host check */ #define NEBTYPE_HOSTCHECK_RAW_START 802 /* the start of a "raw" host check */ #define NEBTYPE_HOSTCHECK_RAW_END 803 /* a finished "raw" host check */ #define NEBTYPE_COMMENT_ADD 900 #define NEBTYPE_COMMENT_DELETE 901 #define NEBTYPE_COMMENT_LOAD 902 #define NEBTYPE_FLAPPING_START 1000 #define NEBTYPE_FLAPPING_STOP 1001 #define NEBTYPE_DOWNTIME_ADD 1100 #define NEBTYPE_DOWNTIME_DELETE 1101 #define NEBTYPE_DOWNTIME_LOAD 1102 #define NEBTYPE_DOWNTIME_START 1103 #define NEBTYPE_DOWNTIME_STOP 1104 #define NEBTYPE_PROGRAMSTATUS_UPDATE 1200 #define NEBTYPE_HOSTSTATUS_UPDATE 1201 #define NEBTYPE_SERVICESTATUS_UPDATE 1202 #define NEBTYPE_ADAPTIVEPROGRAM_UPDATE 1300 #define NEBTYPE_ADAPTIVEHOST_UPDATE 1301 #define NEBTYPE_ADAPTIVESERVICE_UPDATE 1302 #define NEBTYPE_EXTERNALCOMMAND_START 1400 #define NEBTYPE_EXTERNALCOMMAND_END 1401 #define NEBTYPE_AGGREGATEDSTATUS_STARTDUMP 1500 #define NEBTYPE_AGGREGATEDSTATUS_ENDDUMP 1501 #define NEBTYPE_RETENTIONDATA_STARTLOAD 1600 #define NEBTYPE_RETENTIONDATA_ENDLOAD 1601 #define NEBTYPE_RETENTIONDATA_STARTSAVE 1602 #define NEBTYPE_RETENTIONDATA_ENDSAVE 1603 #define NEBTYPE_ACKNOWLEDGEMENT_ADD 1700 #define NEBTYPE_ACKNOWLEDGEMENT_REMOVE 1701 /* NOT IMPLEMENTED */ #define NEBTYPE_ACKNOWLEDGEMENT_LOAD 1702 /* NOT IMPLEMENTED */ #define NEBTYPE_STATECHANGE_START 1800 /* NOT IMPLEMENTED */ #define NEBTYPE_STATECHANGE_END 1801 /****** EVENT FLAGS ************************/ #define NEBFLAG_NONE 0 #define NEBFLAG_PROCESS_INITIATED 1 /* event was initiated by Nagios process */ #define NEBFLAG_USER_INITIATED 2 /* event was initiated by a user request */ #define NEBFLAG_MODULE_INITIATED 3 /* event was initiated by an event broker module */ /****** EVENT ATTRIBUTES *******************/ #define NEBATTR_NONE 0 #define NEBATTR_SHUTDOWN_NORMAL 1 #define NEBATTR_SHUTDOWN_ABNORMAL 2 #define NEBATTR_RESTART_NORMAL 4 #define NEBATTR_RESTART_ABNORMAL 8 #define NEBATTR_FLAPPING_STOP_NORMAL 1 #define NEBATTR_FLAPPING_STOP_DISABLED 2 /* flapping stopped because flap detection was disabled */ #define NEBATTR_DOWNTIME_STOP_NORMAL 1 #define NEBATTR_DOWNTIME_STOP_CANCELLED 2 /****** EVENT BROKER FUNCTIONS *************/ #ifdef USE_EVENT_BROKER struct timeval get_broker_timestamp(struct timeval *); void broker_program_state(int,int,int,struct timeval *); void broker_timed_event(int,int,int,timed_event *event,struct timeval *); void broker_log_data(int,int,int,char *,unsigned long,time_t,struct timeval *); void broker_event_handler(int,int,int,int,void *,int,int,struct timeval,struct timeval,double,int,int,int,char *,char *,char *,struct timeval *); void broker_ocp_data(int,int,int,void *,int,int,double,int,int,struct timeval *); void broker_system_command(int,int,int,struct timeval,struct timeval,double,int,int,int,char *,char *,struct timeval *); void broker_host_check(int,int,int,host *,int,int,int,struct timeval,struct timeval,char *,double,double,int,int,int,char *,char *,char *,struct timeval *); void broker_service_check(int,int,int,service *,int,struct timeval,struct timeval,char *,double,double,int,int,int,char *,struct timeval *); void broker_comment_data(int,int,int,int,int,char *,char *,time_t,char *,char *,int,int,int,time_t,unsigned long,struct timeval *); void broker_downtime_data(int,int,int,int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long,struct timeval *); void broker_flapping_data(int,int,int,int,void *,double,double,double,struct timeval *); void broker_program_status(int,int,int,struct timeval *); void broker_host_status(int,int,int,host *,struct timeval *); void broker_service_status(int,int,int,service *,struct timeval *); void broker_notification_data(int,int,int,int,int,struct timeval,struct timeval,void *,char *,char *,int,int,struct timeval *); void broker_contact_notification_data(int,int,int,int,int,struct timeval,struct timeval,void *,contact *,char *,char *,int,struct timeval *); void broker_contact_notification_method_data(int,int,int,int,int,struct timeval,struct timeval,void *,contact *,char *,char *,char *,int,struct timeval *); void broker_adaptive_program_data(int,int,int,int,unsigned long,unsigned long,unsigned long,unsigned long,char *,char *,struct timeval *); void broker_adaptive_host_data(int,int,int,host *,int,unsigned long,unsigned long,struct timeval *); void broker_adaptive_service_data(int,int,int,service *,int,unsigned long,unsigned long,struct timeval *); void broker_external_command(int,int,int,int,time_t,char *,char *,struct timeval *); void broker_aggregated_status_data(int,int,int,struct timeval *); void broker_retention_data(int,int,int,struct timeval *); void broker_acknowledgement_data(int,int,int,int,void *,char *,char *,int,int,int,struct timeval *); void broker_statechange_data(int,int,int,int,void *,int,int,int,int,struct timeval *timestamp); #endif #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/nebcallbacks.h0000644000175100017510000000635210550544426021570 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBCALLBACKS.H - Include file for event broker modules * * Copyright (c) 2002-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 10-09-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBCALLBACKS_H #define _NEBCALLBACKS_H #include "config.h" #include "nebmodules.h" #ifdef __cplusplus extern "C" { #endif /***** CALLBACK TYPES *****/ #define NEBCALLBACK_NUMITEMS 31 /* total number of callback types we have */ #define NEBCALLBACK_RESERVED0 0 /* reserved for future use */ #define NEBCALLBACK_RESERVED1 1 #define NEBCALLBACK_RESERVED2 2 #define NEBCALLBACK_RESERVED3 3 #define NEBCALLBACK_RESERVED4 4 #define NEBCALLBACK_RAW_DATA 5 #define NEBCALLBACK_NEB_DATA 6 #define NEBCALLBACK_PROCESS_DATA 7 #define NEBCALLBACK_TIMED_EVENT_DATA 8 #define NEBCALLBACK_LOG_DATA 9 #define NEBCALLBACK_SYSTEM_COMMAND_DATA 10 #define NEBCALLBACK_EVENT_HANDLER_DATA 11 #define NEBCALLBACK_NOTIFICATION_DATA 12 #define NEBCALLBACK_SERVICE_CHECK_DATA 13 #define NEBCALLBACK_HOST_CHECK_DATA 14 #define NEBCALLBACK_COMMENT_DATA 15 #define NEBCALLBACK_DOWNTIME_DATA 16 #define NEBCALLBACK_FLAPPING_DATA 17 #define NEBCALLBACK_PROGRAM_STATUS_DATA 18 #define NEBCALLBACK_HOST_STATUS_DATA 19 #define NEBCALLBACK_SERVICE_STATUS_DATA 20 #define NEBCALLBACK_ADAPTIVE_PROGRAM_DATA 21 #define NEBCALLBACK_ADAPTIVE_HOST_DATA 22 #define NEBCALLBACK_ADAPTIVE_SERVICE_DATA 23 #define NEBCALLBACK_EXTERNAL_COMMAND_DATA 24 #define NEBCALLBACK_AGGREGATED_STATUS_DATA 25 #define NEBCALLBACK_RETENTION_DATA 26 #define NEBCALLBACK_CONTACT_NOTIFICATION_DATA 27 #define NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA 28 #define NEBCALLBACK_ACKNOWLEDGEMENT_DATA 29 #define NEBCALLBACK_STATE_CHANGE_DATA 30 /***** CALLBACK FUNCTIONS *****/ int neb_register_callback(int, void *, int, int (*callback_func)(int,void *)); int neb_deregister_callback(int, int (*callback_func)(int,void *)); int neb_deregister_module_callbacks(nebmodule *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/objects.h0000644000175100017510000006005510550544426020615 0ustar baeckerhbaeckerh/***************************************************************************** * * OBJECTS.H - Header file for object addition/search functions * * Copyright (c) 1999-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 03-21-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _OBJECTS_H #define _OBJECTS_H #include "config.h" #include "common.h" #ifdef __cplusplus extern "C" { #endif /*************** CURRENT OBJECT REVISION **************/ #define CURRENT_OBJECT_STRUCTURE_VERSION 2 /***************** OBJECT SIZE LIMITS *****************/ #define MAX_HOSTNAME_LENGTH 64 /* max. host name length */ #define MAX_SERVICEDESC_LENGTH 64 /* max. service description length */ #define MAX_PLUGINOUTPUT_LENGTH 332 /* max. length of plugin output */ #define MAX_STATE_HISTORY_ENTRIES 21 /* max number of old states to keep track of for flap detection */ #define MAX_CONTACT_ADDRESSES 6 /* max number of custom addresses a contact can have */ /***************** CHAINED HASH LIMITS ****************/ #define SERVICE_HASHSLOTS 1024 #define HOST_HASHSLOTS 1024 #define COMMAND_HASHSLOTS 256 #define TIMEPERIOD_HASHSLOTS 64 #define CONTACT_HASHSLOTS 128 #define CONTACTGROUP_HASHSLOTS 64 #define HOSTGROUP_HASHSLOTS 128 #define SERVICEGROUP_HASHSLOTS 128 #define HOSTEXTINFO_HASHSLOTS 1024 #define SERVICEEXTINFO_HASHSLOTS 1024 #define HOSTDEPENDENCY_HASHSLOTS 1024 #define SERVICEDEPENDENCY_HASHSLOTS 1024 #define HOSTESCALATION_HASHSLOTS 1024 #define SERVICEESCALATION_HASHSLOTS 1024 /****************** DATA STRUCTURES *******************/ /* TIMERANGE structure */ typedef struct timerange_struct{ unsigned long range_start; unsigned long range_end; struct timerange_struct *next; }timerange; /* TIMEPERIOD structure */ typedef struct timeperiod_struct{ char *name; char *alias; timerange *days[7]; struct timeperiod_struct *next; struct timeperiod_struct *nexthash; }timeperiod; /* CONTACTGROUPMEMBER structure */ typedef struct contactgroupmember_struct{ char *contact_name; struct contactgroupmember_struct *next; }contactgroupmember; /* CONTACTGROUP structure */ typedef struct contactgroup_struct{ char *group_name; char *alias; contactgroupmember *members; struct contactgroup_struct *next; struct contactgroup_struct *nexthash; }contactgroup; /* CONTACTGROUPSMEMBER structure */ typedef struct contactgroupsmember_struct{ char *group_name; struct contactgroupsmember_struct *next; }contactgroupsmember; /* HOSTSMEMBER structure */ typedef struct hostsmember_struct{ char *host_name; struct hostsmember_struct *next; }hostsmember; /* HOST structure */ typedef struct host_struct{ char *name; char *alias; char *address; hostsmember *parent_hosts; char *host_check_command; int check_interval; int max_attempts; char *event_handler; contactgroupsmember *contact_groups; int notification_interval; int notify_on_down; int notify_on_unreachable; int notify_on_recovery; int notify_on_flapping; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int stalk_on_up; int stalk_on_down; int stalk_on_unreachable; int check_freshness; int freshness_threshold; int process_performance_data; int checks_enabled; int accept_passive_host_checks; int event_handler_enabled; int retain_status_information; int retain_nonstatus_information; int failure_prediction_enabled; char *failure_prediction_options; int obsess_over_host; #ifdef NSCORE int problem_has_been_acknowledged; int acknowledgement_type; int check_type; int current_state; int last_state; int last_hard_state; char *plugin_output; char *perf_data; int state_type; int current_attempt; double latency; double execution_time; int check_options; int notifications_enabled; time_t last_host_notification; time_t next_host_notification; time_t next_check; int should_be_scheduled; time_t last_check; time_t last_state_change; time_t last_hard_state_change; time_t last_time_up; time_t last_time_down; time_t last_time_unreachable; int has_been_checked; int is_being_freshened; int notified_on_down; int notified_on_unreachable; int current_notification_number; int no_more_notifications; int check_flapping_recovery_notification; int scheduled_downtime_depth; int pending_flex_downtime; int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */ int state_history_index; time_t last_state_history_update; int is_flapping; unsigned long flapping_comment_id; double percent_state_change; int total_services; unsigned long total_service_check_interval; unsigned long modified_attributes; int circular_path_checked; int contains_circular_path; #endif struct host_struct *next; struct host_struct *nexthash; }host; /* HOSTGROUPMEMBER structure */ typedef struct hostgroupmember_struct{ char *host_name; struct hostgroupmember_struct *next; }hostgroupmember; /* HOSTGROUP structure */ typedef struct hostgroup_struct{ char *group_name; char *alias; hostgroupmember *members; struct hostgroup_struct *next; struct hostgroup_struct *nexthash; }hostgroup; /* SERVICEGROUPMEMBER structure */ typedef struct servicegroupmember_struct{ char *host_name; char *service_description; struct servicegroupmember_struct *next; }servicegroupmember; /* SERVICEGROUP structure */ typedef struct servicegroup_struct{ char *group_name; char *alias; servicegroupmember *members; struct servicegroup_struct *next; struct servicegroup_struct *nexthash; }servicegroup; /* COMMANDSMEMBER structure */ typedef struct commandsmember_struct{ char *command; struct commandsmember_struct *next; }commandsmember; /* CONTACT structure */ typedef struct contact_struct{ char *name; char *alias; char *email; char *pager; char *address[MAX_CONTACT_ADDRESSES]; commandsmember *host_notification_commands; commandsmember *service_notification_commands; int notify_on_service_unknown; int notify_on_service_warning; int notify_on_service_critical; int notify_on_service_recovery; int notify_on_service_flapping; int notify_on_host_down; int notify_on_host_unreachable; int notify_on_host_recovery; int notify_on_host_flapping; char *host_notification_period; char *service_notification_period; struct contact_struct *next; struct contact_struct *nexthash; }contact; /* SERVICE structure */ typedef struct service_struct{ char *host_name; char *description; char *service_check_command; char *event_handler; int check_interval; int retry_interval; int max_attempts; int parallelize; contactgroupsmember *contact_groups; int notification_interval; int notify_on_unknown; int notify_on_warning; int notify_on_critical; int notify_on_recovery; int notify_on_flapping; int stalk_on_ok; int stalk_on_warning; int stalk_on_unknown; int stalk_on_critical; int is_volatile; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int process_performance_data; int check_freshness; int freshness_threshold; int accept_passive_service_checks; int event_handler_enabled; int checks_enabled; int retain_status_information; int retain_nonstatus_information; int notifications_enabled; int obsess_over_service; int failure_prediction_enabled; char *failure_prediction_options; #ifdef NSCORE int problem_has_been_acknowledged; int acknowledgement_type; int host_problem_at_last_check; #ifdef REMOVED_041403 int no_recovery_notification; #endif int check_type; int current_state; int last_state; int last_hard_state; char *plugin_output; char *perf_data; int state_type; time_t next_check; int should_be_scheduled; time_t last_check; int current_attempt; time_t last_notification; time_t next_notification; int no_more_notifications; int check_flapping_recovery_notification; time_t last_state_change; time_t last_hard_state_change; time_t last_time_ok; time_t last_time_warning; time_t last_time_unknown; time_t last_time_critical; int has_been_checked; int is_being_freshened; int notified_on_unknown; int notified_on_warning; int notified_on_critical; int current_notification_number; double latency; double execution_time; int is_executing; int check_options; int scheduled_downtime_depth; int pending_flex_downtime; int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */ int state_history_index; int is_flapping; unsigned long flapping_comment_id; double percent_state_change; unsigned long modified_attributes; #endif struct service_struct *next; struct service_struct *nexthash; }service; /* COMMAND structure */ typedef struct command_struct{ char *name; char *command_line; struct command_struct *next; struct command_struct *nexthash; }command; /* SERVICE ESCALATION structure */ typedef struct serviceescalation_struct{ char *host_name; char *description; int first_notification; int last_notification; int notification_interval; char *escalation_period; int escalate_on_recovery; int escalate_on_warning; int escalate_on_unknown; int escalate_on_critical; contactgroupsmember *contact_groups; struct serviceescalation_struct *next; struct serviceescalation_struct *nexthash; }serviceescalation; /* SERVICE DEPENDENCY structure */ typedef struct servicedependency_struct{ int dependency_type; char *dependent_host_name; char *dependent_service_description; char *host_name; char *service_description; int inherits_parent; int fail_on_ok; int fail_on_warning; int fail_on_unknown; int fail_on_critical; int fail_on_pending; #ifdef NSCORE int circular_path_checked; int contains_circular_path; #endif struct servicedependency_struct *next; struct servicedependency_struct *nexthash; }servicedependency; /* HOST ESCALATION structure */ typedef struct hostescalation_struct{ char *host_name; int first_notification; int last_notification; int notification_interval; char *escalation_period; int escalate_on_recovery; int escalate_on_down; int escalate_on_unreachable; contactgroupsmember *contact_groups; struct hostescalation_struct *next; struct hostescalation_struct *nexthash; }hostescalation; /* HOST DEPENDENCY structure */ typedef struct hostdependency_struct{ int dependency_type; char *dependent_host_name; char *host_name; int inherits_parent; int fail_on_up; int fail_on_down; int fail_on_unreachable; int fail_on_pending; #ifdef NSCORE int circular_path_checked; int contains_circular_path; #endif struct hostdependency_struct *next; struct hostdependency_struct *nexthash; }hostdependency; /* EXTENDED HOST INFO structure */ typedef struct hostextinfo_struct{ char *host_name; char *notes; char *notes_url; char *action_url; char *icon_image; char *vrml_image; char *statusmap_image; char *icon_image_alt; int have_2d_coords; int x_2d; int y_2d; int have_3d_coords; double x_3d; double y_3d; double z_3d; int should_be_drawn; struct hostextinfo_struct *next; struct hostextinfo_struct *nexthash; }hostextinfo; /* EXTENDED SERVICE INFO structure */ typedef struct serviceextinfo_struct{ char *host_name; char *description; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; struct serviceextinfo_struct *next; struct serviceextinfo_struct *nexthash; }serviceextinfo; /****************** HASH STRUCTURES ********************/ typedef struct host_cursor_struct{ int host_hashchain_iterator; host *current_host_pointer; }host_cursor; /********************* FUNCTIONS **********************/ /**** DEBUG functions ****/ /* RMO: 9/25/01 Send debug output to stdout. Does nothing if 'level' is not enabled by a corresponding 'DEBUGn' define. Accepts format string (fmt) and variable-length arg list (as printf does). Prints to stdout and, if NSCGI environment, surrounded with HTML comment delimiters to be viewed through browser's 'view source' option. Use as: dbg_print((level,fmt,...)); [NOTE double parens] The macro def below causes dbg_print(()) calls to vaporize if none of the DEBUGn levels are defined. */ #if defined(DEBUG0) || defined(DEBUG1) || defined(DEBUG2) || defined(DEBUG3) || defined(DEBUG4) || defined(DEBUG5) || defined(DEBUG6) || defined(DEBUG7) || defined(DEBUG8) || defined(DEBUG9) || defined(DEBUG10) || defined(DEBUG11) #define dbg_print(args) dbg_print_x args #else #define dbg_print(args) #endif /**** Top-level input functions ****/ int read_object_config_data(char *,int,int); /* reads all external configuration data of specific types */ /**** Object Creation Functions ****/ contact *add_contact(char *,char *,char *,char *,char **,char *,char *,int,int,int,int,int,int,int,int,int); /* adds a contact definition */ commandsmember *add_service_notification_command_to_contact(contact *,char *); /* adds a service notification command to a contact definition */ commandsmember *add_host_notification_command_to_contact(contact *,char *); /* adds a host notification command to a contact definition */ host *add_host(char *,char *,char *,char *,int,int,int,int,int,int,int,char *,int,char *,int,int,char *,int,int,double,double,int,int,int,int,int,char *,int,int,int,int,int); /* adds a host definition */ hostsmember *add_parent_host_to_host(host *,char *); /* adds a parent host to a host definition */ contactgroupsmember *add_contactgroup_to_host(host *,char *); /* adds a contactgroup to a host definition */ timeperiod *add_timeperiod(char *,char *); /* adds a timeperiod definition */ timerange *add_timerange_to_timeperiod(timeperiod *,int,unsigned long,unsigned long); /* adds a timerange to a timeperiod definition */ hostgroup *add_hostgroup(char *,char *); /* adds a hostgroup definition */ hostgroupmember *add_host_to_hostgroup(hostgroup *, char *); /* adds a host to a hostgroup definition */ servicegroup *add_servicegroup(char *,char *); /* adds a servicegroup definition */ servicegroupmember *add_service_to_servicegroup(servicegroup *,char *,char *); /* adds a service to a servicegroup definition */ contactgroup *add_contactgroup(char *,char *); /* adds a contactgroup definition */ contactgroupmember *add_contact_to_contactgroup(contactgroup *,char *); /* adds a contact to a contact group definition */ command *add_command(char *,char *); /* adds a command definition */ service *add_service(char *,char *,char *,int,int,int,int,int,int,char *,int,int,int,int,int,int,int,char *,int,char *,int,int,double,double,int,int,int,int,int,int,char *,int,int,int,int,int); /* adds a service definition */ contactgroupsmember *add_contactgroup_to_service(service *,char *); /* adds a contact group to a service definition */ serviceescalation *add_serviceescalation(char *,char *,int,int,int,char *,int,int,int,int); /* adds a service escalation definition */ contactgroupsmember *add_contactgroup_to_serviceescalation(serviceescalation *,char *); /* adds a contact group to a service escalation definition */ servicedependency *add_service_dependency(char *,char *,char *,char *,int,int,int,int,int,int,int); /* adds a service dependency definition */ hostdependency *add_host_dependency(char *,char *,int,int,int,int,int,int); /* adds a host dependency definition */ hostescalation *add_hostescalation(char *,int,int,int,char *,int,int,int); /* adds a host escalation definition */ contactgroupsmember *add_contactgroup_to_hostescalation(hostescalation *,char *); /* adds a contact group to a host escalation definition */ hostextinfo *add_hostextinfo(char *,char *,char *,char *,char *,char *,char *,char *,int,int,double,double,double,int,int); /* adds an extended host info definition */ serviceextinfo *add_serviceextinfo(char *,char *,char *,char *,char *,char *,char *); /* add an extended service info definition */ /**** Object Hash Functions ****/ int add_host_to_hashlist(host *); int add_service_to_hashlist(service *); int add_command_to_hashlist(command *); int add_timeperiod_to_hashlist(timeperiod *); int add_contact_to_hashlist(contact *); int add_contactgroup_to_hashlist(contactgroup *); int add_hostgroup_to_hashlist(hostgroup *); int add_servicegroup_to_hashlist(servicegroup *); int add_hostdependency_to_hashlist(hostdependency *); int add_servicedependency_to_hashlist(servicedependency *); int add_hostescalation_to_hashlist(hostescalation *); int add_serviceescalation_to_hashlist(serviceescalation *); int add_hostextinfo_to_hashlist(hostextinfo *); int add_serviceextinfo_to_hashlist(serviceextinfo *); /**** Object Search Functions ****/ timeperiod * find_timeperiod(char *); /* finds a timeperiod object */ host * find_host(char *); /* finds a host object */ hostgroup * find_hostgroup(char *); /* finds a hostgroup object */ servicegroup * find_servicegroup(char *); /* finds a servicegroup object */ contact * find_contact(char *); /* finds a contact object */ contactgroup * find_contactgroup(char *); /* finds a contactgroup object */ contactgroupmember *find_contactgroupmember(char *,contactgroup *); /* finds a contactgroup member object */ command * find_command(char *); /* finds a command object */ service * find_service(char *,char *); /* finds a service object */ hostextinfo *find_hostextinfo(char *); /* find an extended host info object */ serviceextinfo *find_serviceextinfo(char *,char *); /* find an extended service info object */ /**** Object Traversal Functions ****/ void move_first_service(void); /* sets up the static memory area for get_next_service */ service *get_next_service(void); /* returns the next service, NULL at the end of the list */ int find_all_services_by_host(char *); /* sets up the static memory area for get_next_service_by_host */ service *get_next_service_by_host(void); /* returns the next service for the host, NULL at the end of the list */ void move_first_host(void); /* sets up the static memory area for get_next_host */ host *get_next_host(void); /* returns the next host, NULL at the end of the list */ void *get_host_cursor(void); /* allocate memory for the host cursor */ host *get_next_host_cursor(void *v_cursor); /* return the next host, NULL at the end of the list */ void free_host_cursor(void *cursor); /* free allocated cursor memory */ void *get_next_N(void **hashchain, int hashslots, int *iterator, void *current, void *next); hostescalation *get_first_hostescalation_by_host(char *); hostescalation *get_next_hostescalation_by_host(char *,hostescalation *); serviceescalation *get_first_serviceescalation_by_service(char *,char *); serviceescalation *get_next_serviceescalation_by_service(char *,char *,serviceescalation *); hostdependency *get_first_hostdependency_by_dependent_host(char *); hostdependency *get_next_hostdependency_by_dependent_host(char *,hostdependency *); servicedependency *get_first_servicedependency_by_dependent_service(char *,char *); servicedependency *get_next_servicedependency_by_dependent_service(char *,char *,servicedependency *); /**** Object Query Functions ****/ int is_host_immediate_child_of_host(host *,host *); /* checks if a host is an immediate child of another host */ int is_host_primary_immediate_child_of_host(host *,host *); /* checks if a host is an immediate child (and primary child) of another host */ int is_host_immediate_parent_of_host(host *,host *); /* checks if a host is an immediate child of another host */ int is_host_member_of_hostgroup(hostgroup *,host *); /* tests whether or not a host is a member of a specific hostgroup */ int is_host_member_of_servicegroup(servicegroup *,host *); /* tests whether or not a service is a member of a specific servicegroup */ int is_service_member_of_servicegroup(servicegroup *,service *); /* tests whether or not a service is a member of a specific servicegroup */ int is_contact_member_of_contactgroup(contactgroup *, contact *); /* tests whether or not a contact is a member of a specific contact group */ int is_contact_for_hostgroup(hostgroup *,contact *); /* tests whether or not a contact is a member of a specific hostgroup */ int is_contact_for_servicegroup(servicegroup *,contact *); /* tests whether or not a contact is a member of a specific servicegroup */ int is_contact_for_host(host *,contact *); /* tests whether or not a contact is a contact member for a specific host */ int is_escalated_contact_for_host(host *,contact *); /* checks whether or not a contact is an escalated contact for a specific host */ int is_contact_for_service(service *,contact *); /* tests whether or not a contact is a contact member for a specific service */ int is_escalated_contact_for_service(service *,contact *); /* checks whether or not a contact is an escalated contact for a specific service */ int is_host_immediate_parent_of_host(host *,host *); /* tests whether or not a host is an immediate parent of another host */ int number_of_immediate_child_hosts(host *); /* counts the number of immediate child hosts for a particular host */ int number_of_total_child_hosts(host *); /* counts the number of total child hosts for a particular host */ int number_of_immediate_parent_hosts(host *); /* counts the number of immediate parents hosts for a particular host */ int number_of_total_parent_hosts(host *); /* counts the number of total parents hosts for a particular host */ #ifdef NSCORE int check_for_circular_path(host *,host *); /* checks if a circular path exists for a given host */ int check_for_circular_servicedependency(servicedependency *,servicedependency *,int); /* checks if a circular dependency exists for a given service */ int check_for_circular_hostdependency(hostdependency *,hostdependency *,int); /* checks if a circular dependency exists for a given host */ #endif /**** Object Cleanup Functions ****/ int free_object_data(void); /* frees all allocated memory for the object definitions */ int free_extended_data(void); /* frees memory allocated to the extended host/service information */ #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/cgiauth.h0000644000175100017510000000411110550310754020572 0ustar baeckerhbaeckerh/***************************************************************************** * * CGIAUTH.H - Authorization utilities header file * * Last Modified: 11-24-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _AUTH_H #define _AUTH_H #include "common.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif typedef struct authdata_struct{ char *username; int authorized_for_all_hosts; int authorized_for_all_host_commands; int authorized_for_all_services; int authorized_for_all_service_commands; int authorized_for_system_information; int authorized_for_system_commands; int authorized_for_configuration_information; int authenticated; }authdata; int get_authentication_information(authdata *); /* gets current authentication information */ int is_authorized_for_host(host *,authdata *); int is_authorized_for_service(service *,authdata *); int is_authorized_for_all_hosts(authdata *); int is_authorized_for_all_services(authdata *); int is_authorized_for_system_information(authdata *); int is_authorized_for_system_commands(authdata *); int is_authorized_for_host_commands(host *,authdata *); int is_authorized_for_service_commands(service *,authdata *); int is_authorized_for_hostgroup(hostgroup *,authdata *); int is_authorized_for_servicegroup(servicegroup *,authdata *); int is_authorized_for_configuration_information(authdata *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/nebmods.h0000644000175100017510000000350110550310753020576 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBMODS.H - Include file for event broker modules * * Copyright (c) 2002-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-25-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBMODS_H #define _NEBMODS_H #include "config.h" #include "nebcallbacks.h" #include "nebmodules.h" #ifdef __cplusplus extern "C" { #endif /***** MODULE STRUCTURES *****/ /* NEB module callback list struct */ typedef struct nebcallback_struct{ void *callback_func; void *module_handle; int priority; struct nebcallback_struct *next; }nebcallback; /***** MODULE FUNCTIONS *****/ int neb_init_modules(void); int neb_deinit_modules(void); int neb_load_all_modules(void); int neb_load_module(nebmodule *); int neb_free_module_list(void); int neb_unload_all_modules(int,int); int neb_unload_module(nebmodule *,int,int); int neb_add_module(char *,char *,int); /***** CALLBACK FUNCTIONS *****/ int neb_init_callback_list(void); int neb_free_callback_list(void); int neb_make_callbacks(int,void *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/nebstructs.h0000644000175100017510000003055510550310753021354 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBSTRUCTS.H - Event broker includes for Nagios * * Copyright (c) 2003-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 12-17-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBSTRUCTS_H #define _NEBSTRUCTS_H #include "config.h" #include "objects.h" #include "nagios.h" #ifdef __cplusplus extern "C" { #endif /****** STRUCTURES *************************/ /* process data structure */ typedef struct nebstruct_process_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_process_data; /* timed event data structure */ typedef struct nebstruct_timed_event_struct{ int type; int flags; int attr; struct timeval timestamp; int event_type; int recurring; time_t run_time; void *event_data; }nebstruct_timed_event_data; /* log data structure */ typedef struct nebstruct_log_struct{ int type; int flags; int attr; struct timeval timestamp; time_t entry_time; int data_type; char *data; }nebstruct_log_data; /* system command structure */ typedef struct nebstruct_system_command_struct{ int type; int flags; int attr; struct timeval timestamp; struct timeval start_time; struct timeval end_time; int timeout; char *command_line; int early_timeout; double execution_time; int return_code; char *output; }nebstruct_system_command_data; /* event handler structure */ typedef struct nebstruct_event_handler_struct{ int type; int flags; int attr; struct timeval timestamp; int eventhandler_type; char *host_name; char *service_description; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; int return_code; char *output; }nebstruct_event_handler_data; /* host check structure */ typedef struct nebstruct_host_check_struct{ int type; int flags; int attr; struct timeval timestamp; char *host_name; int current_attempt; int check_type; int max_attempts; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; double latency; int return_code; char *output; char *perf_data; }nebstruct_host_check_data; /* service check structure */ typedef struct nebstruct_service_check_struct{ int type; int flags; int attr; struct timeval timestamp; char *host_name; char *service_description; int check_type; int current_attempt; int max_attempts; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; double latency; int return_code; char *output; char *perf_data; }nebstruct_service_check_data; /* comment data structure */ typedef struct nebstruct_comment_struct{ int type; int flags; int attr; struct timeval timestamp; int comment_type; char *host_name; char *service_description; time_t entry_time; char *author_name; char *comment_data; int persistent; int source; int entry_type; int expires; time_t expire_time; unsigned long comment_id; }nebstruct_comment_data; /* downtime data structure */ typedef struct nebstruct_downtime_struct{ int type; int flags; int attr; struct timeval timestamp; int downtime_type; char *host_name; char *service_description; time_t entry_time; char *author_name; char *comment_data; time_t start_time; time_t end_time; int fixed; unsigned long duration; unsigned long triggered_by; unsigned long downtime_id; }nebstruct_downtime_data; /* flapping data structure */ typedef struct nebstruct_flapping_struct{ int type; int flags; int attr; struct timeval timestamp; int flapping_type; char *host_name; char *service_description; double percent_change; double high_threshold; double low_threshold; unsigned long comment_id; }nebstruct_flapping_data; /* program status structure */ typedef struct nebstruct_program_status_struct{ int type; int flags; int attr; struct timeval timestamp; time_t program_start; int pid; int daemon_mode; time_t last_command_check; time_t last_log_rotation; int notifications_enabled; int active_service_checks_enabled; int passive_service_checks_enabled; int active_host_checks_enabled; int passive_host_checks_enabled; int event_handlers_enabled; int flap_detection_enabled; int failure_prediction_enabled; int process_performance_data; int obsess_over_hosts; int obsess_over_services; unsigned long modified_host_attributes; unsigned long modified_service_attributes; char *global_host_event_handler; char *global_service_event_handler; }nebstruct_program_status_data; /* host status structure */ typedef struct nebstruct_host_status_struct{ int type; int flags; int attr; struct timeval timestamp; void *object_ptr; }nebstruct_host_status_data; /* service status structure */ typedef struct nebstruct_service_status_struct{ int type; int flags; int attr; struct timeval timestamp; void *object_ptr; }nebstruct_service_status_data; /* notification data structure */ typedef struct nebstruct_notification_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; int contacts_notified; }nebstruct_notification_data; /* contact notification data structure */ typedef struct nebstruct_contact_notification_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; char *contact_name; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; }nebstruct_contact_notification_data; /* contact notification method data structure */ typedef struct nebstruct_contact_notification_method_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; char *contact_name; char *command_name; char *command_args; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; }nebstruct_contact_notification_method_data; /* adaptive program data structure */ typedef struct nebstruct_adaptive_program_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_host_attribute; unsigned long modified_host_attributes; unsigned long modified_service_attribute; unsigned long modified_service_attributes; char *global_host_event_handler; char *global_service_event_handler; }nebstruct_adaptive_program_data; /* adaptive host data structure */ typedef struct nebstruct_adaptive_host_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; void *object_ptr; }nebstruct_adaptive_host_data; /* adaptive service data structure */ typedef struct nebstruct_adaptive_service_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; void *object_ptr; }nebstruct_adaptive_service_data; /* external command data structure */ typedef struct nebstruct_external_command_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; time_t entry_time; char *command_string; char *command_args; }nebstruct_external_command_data; /* aggregated status data structure */ typedef struct nebstruct_aggregated_status_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_aggregated_status_data; /* retention data structure */ typedef struct nebstruct_retention_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_retention_data; /* acknowledgement structure */ typedef struct nebstruct_acknowledgement_struct{ int type; int flags; int attr; struct timeval timestamp; int acknowledgement_type; char *host_name; char *service_description; int state; char *author_name; char *comment_data; int is_sticky; int persistent_comment; int notify_contacts; }nebstruct_acknowledgement_data; /* state change structure */ typedef struct nebstruct_statechange_struct{ int type; int flags; int attr; struct timeval timestamp; int statechange_type; char *host_name; char *service_description; int state; int state_type; int current_attempt; int max_attempts; char *output; }nebstruct_statechange_data; #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/nebmodules.h0000644000175100017510000000562110550310752021310 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBMODULES.H - Include file for event broker modules * * Copyright (c) 2002-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 12-17-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBMODULES_H #define _NEBMODULES_H #ifdef __cplusplus extern "C" { #endif /***** MODULE VERSION INFORMATION *****/ #define NEB_API_VERSION(x) int __neb_api_version = x; #define CURRENT_NEB_API_VERSION 2 /***** MODULE INFORMATION *****/ #define NEBMODULE_MODINFO_NUMITEMS 6 #define NEBMODULE_MODINFO_TITLE 0 #define NEBMODULE_MODINFO_AUTHOR 1 #define NEBMODULE_MODINFO_COPYRIGHT 2 #define NEBMODULE_MODINFO_VERSION 3 #define NEBMODULE_MODINFO_LICENSE 4 #define NEBMODULE_MODINFO_DESC 5 /***** MODULE LOAD/UNLOAD OPTIONS *****/ #define NEBMODULE_NORMAL_LOAD 0 /* module is being loaded normally */ #define NEBMODULE_REQUEST_UNLOAD 0 /* request module to unload (but don't force it) */ #define NEBMODULE_FORCE_UNLOAD 1 /* force module to unload */ /***** MODULES UNLOAD REASONS *****/ #define NEBMODULE_NEB_SHUTDOWN 1 /* event broker is shutting down */ #define NEBMODULE_NEB_RESTART 2 /* event broker is restarting */ #define NEBMODULE_ERROR_NO_INIT 3 /* _module_init() function was not found in module */ #define NEBMODULE_ERROR_BAD_INIT 4 /* _module_init() function returned a bad code */ #define NEBMODULE_ERROR_API_VERSION 5 /* module version is incompatible with current api */ /***** MODULE STRUCTURES *****/ /* NEB module structure */ typedef struct nebmodule_struct{ char *filename; char *args; char *info[NEBMODULE_MODINFO_NUMITEMS]; int should_be_loaded; int is_currently_loaded; #ifdef USE_LTDL lt_dlhandle module_handle; lt_ptr init_func; lt_ptr deinit_func; #else void *module_handle; void *init_func; void *deinit_func; #endif #ifdef HAVE_PTHREAD_H pthread_t thread_id; #endif struct nebmodule_struct *next; }nebmodule; /***** MODULE FUNCTIONS *****/ int neb_set_module_info(void *,int,char *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/cgiutils.h0000644000175100017510000004224510712143241020776 0ustar baeckerhbaeckerh/* include/cgiutils.h. Generated by configure. */ /************************************************************************ * * CGIUTILS.H - Header file for common CGI functions * Copyright (c) 1999-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 10-21-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef _CGIUTILS_H #define _CGIUTILS_H #include "objects.h" #include "cgiauth.h" #ifdef __cplusplus extern "C" { #endif /* should we compile and use the statusmap CGI? */ #define USE_STATUSMAP 1 /* should we compile and use the statuswrl CGI? */ #define USE_STATUSWRL 1 /* should we compile and use the trends CGI? */ #define USE_TRENDS 1 /* should we compile and use the histogram CGI? */ #define USE_HISTOGRAM 1 /**************************** CGI REFRESH RATE ******************************/ #define DEFAULT_REFRESH_RATE 60 /* 60 second refresh rate for CGIs */ /******************************* CGI NAMES **********************************/ #define STATUS_CGI "status.cgi" #define STATUSMAP_CGI "statusmap.cgi" #define STATUSWORLD_CGI "statuswrl.cgi" #define COMMAND_CGI "cmd.cgi" #define EXTINFO_CGI "extinfo.cgi" #define SHOWLOG_CGI "showlog.cgi" #define NOTIFICATIONS_CGI "notifications.cgi" #define HISTORY_CGI "history.cgi" #define CONFIG_CGI "config.cgi" #define OUTAGES_CGI "outages.cgi" #define TRENDS_CGI "trends.cgi" #define AVAIL_CGI "avail.cgi" #define TAC_CGI "tac.cgi" #define STATUSWML_CGI "statuswml.cgi" #define TRACEROUTE_CGI "traceroute.cgi" #define HISTOGRAM_CGI "histogram.cgi" #define CHECKSANITY_CGI "checksanity.cgi" #define MINISTATUS_CGI "ministatus.cgi" #define SUMMARY_CGI "summary.cgi" /**************************** STYLE SHEET NAMES ******************************/ #define COMMON_CSS "common.css" #define SHOWLOG_CSS "showlog.css" #define STATUS_CSS "status.css" #define STATUSMAP_CSS "statusmap.css" #define COMMAND_CSS "cmd.css" #define EXTINFO_CSS "extinfo.css" #define NOTIFICATIONS_CSS "notifications.css" #define HISTORY_CSS "history.css" #define CONFIG_CSS "config.css" #define OUTAGES_CSS "outages.css" #define TRENDS_CSS "trends.css" #define AVAIL_CSS "avail.css" #define TAC_CSS "tac.css" #define HISTOGRAM_CSS "histogram.css" #define CHECKSANITY_CSS "checksanity.css" #define MINISTATUS_CSS "ministatus.css" #define SUMMARY_CSS "summary.css" /********************************* ICONS ************************************/ #define STATUS_ICON_WIDTH 20 #define STATUS_ICON_HEIGHT 20 #define INFO_ICON "info.png" #define INFO_ICON_ALT "Informational Message" #define START_ICON "start.gif" #define START_ICON_ALT "Program Start" #define STOP_ICON "stop.gif" #define STOP_ICON_ALT "Program End" #define RESTART_ICON "restart.gif" #define RESTART_ICON_ALT "Program Restart" #define OK_ICON "recovery.png" #define OK_ICON_ALT "Service Ok" #define CRITICAL_ICON "critical.png" #define CRITICAL_ICON_ALT "Service Critical" #define WARNING_ICON "warning.png" #define WARNING_ICON_ALT "Service Warning" #define UNKNOWN_ICON "unknown.png" #define UNKNOWN_ICON_ALT "Service Unknown" #define NOTIFICATION_ICON "notify.gif" #define NOTIFICATION_ICON_ALT "Service Notification" #define LOG_ROTATION_ICON "logrotate.png" #define LOG_ROTATION_ICON_ALT "Log Rotation" #define EXTERNAL_COMMAND_ICON "command.png" #define EXTERNAL_COMMAND_ICON_ALT "External Command" #define STATUS_DETAIL_ICON "status2.gif" #define STATUS_OVERVIEW_ICON "status.gif" #define STATUSMAP_ICON "status3.gif" #define STATUSWORLD_ICON "status4.gif" #define EXTINFO_ICON "extinfo.gif" #define HISTORY_ICON "history.gif" #define CONTACTGROUP_ICON "contactgroup.gif" #define TRENDS_ICON "trends.gif" #define DISABLED_ICON "disabled.gif" #define ENABLED_ICON "enabled.gif" #define PASSIVE_ONLY_ICON "passiveonly.gif" #define NOTIFICATIONS_DISABLED_ICON "ndisabled.gif" #define ACKNOWLEDGEMENT_ICON "ack.gif" #define REMOVE_ACKNOWLEDGEMENT_ICON "noack.gif" #define COMMENT_ICON "comment.gif" #define DELETE_ICON "delete.gif" #define DELAY_ICON "delay.gif" #define DOWNTIME_ICON "downtime.gif" #define PASSIVE_ICON "unknown.png" #define RIGHT_ARROW_ICON "right.gif" #define LEFT_ARROW_ICON "left.gif" #define UP_ARROW_ICON "up.gif" #define DOWN_ARROW_ICON "down.gif" #define FLAPPING_ICON "flapping.gif" #define SCHEDULED_DOWNTIME_ICON "downtime.gif" #define EMPTY_ICON "empty.gif" #define ACTIVE_ICON "active.gif" #define ACTIVE_ICON_ALT "Active Mode" #define STANDBY_ICON "standby.gif" #define STANDBY_ICON_ALT "Standby Mode" #define HOST_DOWN_ICON "critical.png" #define HOST_DOWN_ICON_ALT "Host Down" #define HOST_UNREACHABLE_ICON "critical.png" #define HOST_UNREACHABLE_ICON_ALT "Host Unreachable" #define HOST_UP_ICON "recovery.png" #define HOST_UP_ICON_ALT "Host Up" #define HOST_NOTIFICATION_ICON "notify.gif" #define HOST_NOTIFICATION_ICON_ALT "Host Notification" #define SERVICE_EVENT_ICON "serviceevent.gif" #define SERVICE_EVENT_ICON_ALT "Service Event Handler" #define HOST_EVENT_ICON "hostevent.gif" #define HOST_EVENT_ICON_ALT "Host Event Handler" #define THERM_OK_IMAGE "thermok.png" #define THERM_WARNING_IMAGE "thermwarn.png" #define THERM_CRITICAL_IMAGE "thermcrit.png" #define CONFIGURATION_ICON "config.gif" #define NOTES_ICON "notes.gif" #define ACTION_ICON "action.gif" #define DETAIL_ICON "detail.gif" #define PARENT_TRAVERSAL_ICON "parentup.gif" #define TAC_DISABLED_ICON "tacdisabled.png" #define TAC_ENABLED_ICON "tacenabled.png" #define ZOOM1_ICON "zoom1.gif" #define ZOOM2_ICON "zoom2.gif" #define CONTEXT_HELP_ICON1 "contexthelp1.gif" #define CONTEXT_HELP_ICON2 "contexthelp2.gif" /************************** PLUGIN RETURN VALUES ****************************/ #define STATE_OK 0 #define STATE_WARNING 1 #define STATE_CRITICAL 2 #define STATE_UNKNOWN 3 /* changed from -1 on 02/24/2001 */ /********************* EXTENDED INFO CGI DISPLAY TYPES *********************/ #define DISPLAY_PROCESS_INFO 0 #define DISPLAY_HOST_INFO 1 #define DISPLAY_SERVICE_INFO 2 #define DISPLAY_COMMENTS 3 #define DISPLAY_PERFORMANCE 4 #define DISPLAY_HOSTGROUP_INFO 5 #define DISPLAY_DOWNTIME 6 #define DISPLAY_SCHEDULING_QUEUE 7 #define DISPLAY_SERVICEGROUP_INFO 8 /************************ COMMAND CGI COMMAND MODES *************************/ #define CMDMODE_NONE 0 #define CMDMODE_REQUEST 1 #define CMDMODE_COMMIT 2 /******************** HOST AND SERVICE NOTIFICATION TYPES ******************/ #define NOTIFICATION_ALL 0 /* all service and host notifications */ #define NOTIFICATION_SERVICE_ALL 1 /* all types of service notifications */ #define NOTIFICATION_HOST_ALL 2 /* all types of host notifications */ #define NOTIFICATION_SERVICE_WARNING 4 #define NOTIFICATION_SERVICE_UNKNOWN 8 #define NOTIFICATION_SERVICE_CRITICAL 16 #define NOTIFICATION_SERVICE_RECOVERY 32 #define NOTIFICATION_HOST_DOWN 64 #define NOTIFICATION_HOST_UNREACHABLE 128 #define NOTIFICATION_HOST_RECOVERY 256 #define NOTIFICATION_SERVICE_ACK 512 #define NOTIFICATION_HOST_ACK 1024 #define NOTIFICATION_SERVICE_FLAP 2048 #define NOTIFICATION_HOST_FLAP 4096 /********************** HOST AND SERVICE ALERT TYPES **********************/ #define HISTORY_ALL 0 /* all service and host alert */ #define HISTORY_SERVICE_ALL 1 /* all types of service alerts */ #define HISTORY_HOST_ALL 2 /* all types of host alerts */ #define HISTORY_SERVICE_WARNING 4 #define HISTORY_SERVICE_UNKNOWN 8 #define HISTORY_SERVICE_CRITICAL 16 #define HISTORY_SERVICE_RECOVERY 32 #define HISTORY_HOST_DOWN 64 #define HISTORY_HOST_UNREACHABLE 128 #define HISTORY_HOST_RECOVERY 256 /****************************** SORT TYPES *******************************/ #define SORT_NONE 0 #define SORT_ASCENDING 1 #define SORT_DESCENDING 2 /***************************** SORT OPTIONS ******************************/ #define SORT_NOTHING 0 #define SORT_HOSTNAME 1 #define SORT_SERVICENAME 2 #define SORT_SERVICESTATUS 3 #define SORT_LASTCHECKTIME 4 #define SORT_CURRENTATTEMPT 5 #define SORT_STATEDURATION 6 #define SORT_NEXTCHECKTIME 7 #define SORT_HOSTSTATUS 8 /****************** HOST AND SERVICE FILTER PROPERTIES *******************/ #define HOST_SCHEDULED_DOWNTIME 1 #define HOST_NO_SCHEDULED_DOWNTIME 2 #define HOST_STATE_ACKNOWLEDGED 4 #define HOST_STATE_UNACKNOWLEDGED 8 #define HOST_CHECKS_DISABLED 16 #define HOST_CHECKS_ENABLED 32 #define HOST_EVENT_HANDLER_DISABLED 64 #define HOST_EVENT_HANDLER_ENABLED 128 #define HOST_FLAP_DETECTION_DISABLED 256 #define HOST_FLAP_DETECTION_ENABLED 512 #define HOST_IS_FLAPPING 1024 #define HOST_IS_NOT_FLAPPING 2048 #define HOST_NOTIFICATIONS_DISABLED 4096 #define HOST_NOTIFICATIONS_ENABLED 8192 #define HOST_PASSIVE_CHECKS_DISABLED 16384 #define HOST_PASSIVE_CHECKS_ENABLED 32768 #define HOST_PASSIVE_CHECK 65536 #define HOST_ACTIVE_CHECK 131072 #define SERVICE_SCHEDULED_DOWNTIME 1 #define SERVICE_NO_SCHEDULED_DOWNTIME 2 #define SERVICE_STATE_ACKNOWLEDGED 4 #define SERVICE_STATE_UNACKNOWLEDGED 8 #define SERVICE_CHECKS_DISABLED 16 #define SERVICE_CHECKS_ENABLED 32 #define SERVICE_EVENT_HANDLER_DISABLED 64 #define SERVICE_EVENT_HANDLER_ENABLED 128 #define SERVICE_FLAP_DETECTION_ENABLED 256 #define SERVICE_FLAP_DETECTION_DISABLED 512 #define SERVICE_IS_FLAPPING 1024 #define SERVICE_IS_NOT_FLAPPING 2048 #define SERVICE_NOTIFICATIONS_DISABLED 4096 #define SERVICE_NOTIFICATIONS_ENABLED 8192 #define SERVICE_PASSIVE_CHECKS_DISABLED 16384 #define SERVICE_PASSIVE_CHECKS_ENABLED 32768 #define SERVICE_PASSIVE_CHECK 65536 #define SERVICE_ACTIVE_CHECK 131072 /****************************** SSI TYPES ********************************/ #define SSI_HEADER 0 #define SSI_FOOTER 1 /************************ CONTEXT-SENSITIVE HELP *************************/ #define CONTEXTHELP_STATUS_DETAIL "A1" #define CONTEXTHELP_STATUS_HGOVERVIEW "A2" #define CONTEXTHELP_STATUS_HGSUMMARY "A3" #define CONTEXTHELP_STATUS_HGGRID "A4" #define CONTEXTHELP_STATUS_SVCPROBLEMS "A5" #define CONTEXTHELP_STATUS_HOST_DETAIL "A6" #define CONTEXTHELP_STATUS_HOSTPROBLEMS "A7" #define CONTEXTHELP_STATUS_SGOVERVIEW "A8" #define CONTEXTHELP_STATUS_SGSUMMARY "A9" #define CONTEXTHELP_STATUS_SGGRID "A10" #define CONTEXTHELP_TAC "B1" #define CONTEXTHELP_MAP "C1" #define CONTEXTHELP_LOG "D1" #define CONTEXTHELP_HISTORY "E1" #define CONTEXTHELP_NOTIFICATIONS "F1" #define CONTEXTHELP_TRENDS_MENU1 "G1" #define CONTEXTHELP_TRENDS_MENU2 "G2" #define CONTEXTHELP_TRENDS_MENU3 "G3" #define CONTEXTHELP_TRENDS_MENU4 "G4" #define CONTEXTHELP_TRENDS_HOST "G5" #define CONTEXTHELP_TRENDS_SERVICE "G6" #define CONTEXTHELP_AVAIL_MENU1 "H1" #define CONTEXTHELP_AVAIL_MENU2 "H2" #define CONTEXTHELP_AVAIL_MENU3 "H3" #define CONTEXTHELP_AVAIL_MENU4 "H4" #define CONTEXTHELP_AVAIL_MENU5 "H5" #define CONTEXTHELP_AVAIL_HOSTGROUP "H6" #define CONTEXTHELP_AVAIL_HOST "H7" #define CONTEXTHELP_AVAIL_SERVICE "H8" #define CONTEXTHELP_AVAIL_SERVICEGROUP "H9" #define CONTEXTHELP_EXT_HOST "I1" #define CONTEXTHELP_EXT_SERVICE "I2" #define CONTEXTHELP_EXT_HOSTGROUP "I3" #define CONTEXTHELP_EXT_PROCESS "I4" #define CONTEXTHELP_EXT_PERFORMANCE "I5" #define CONTEXTHELP_EXT_COMMENTS "I6" #define CONTEXTHELP_EXT_DOWNTIME "I7" #define CONTEXTHELP_EXT_QUEUE "I8" #define CONTEXTHELP_EXT_SERVICEGROUP "I9" #define CONTEXTHELP_CMD_INPUT "J1" #define CONTEXTHELP_CMD_COMMIT "J2" #define CONTEXTHELP_OUTAGES "K1" #define CONTEXTHELP_CONFIG_MENU "L1" #define CONTEXTHELP_CONFIG_HOSTS "L2" #define CONTEXTHELP_CONFIG_HOSTDEPENDENCIES "L3" #define CONTEXTHELP_CONFIG_HOSTESCALATIONS "L4" #define CONTEXTHELP_CONFIG_HOSTGROUPS "L5" #define CONTEXTHELP_CONFIG_HOSTGROUPESCALATIONS "L6" #define CONTEXTHELP_CONFIG_SERVICES "L7" #define CONTEXTHELP_CONFIG_SERVICEDEPENDENCIES "L8" #define CONTEXTHELP_CONFIG_SERVICEESCALATIONS "L9" #define CONTEXTHELP_CONFIG_CONTACTS "L10" #define CONTEXTHELP_CONFIG_CONTACTGROUPS "L11" #define CONTEXTHELP_CONFIG_TIMEPERIODS "L12" #define CONTEXTHELP_CONFIG_COMMANDS "L13" #define CONTEXTHELP_CONFIG_HOSTEXTINFO "L14" #define CONTEXTHELP_CONFIG_SERVICEEXTINFO "L15" #define CONTEXTHELP_CONFIG_SERVICEGROUPS "L16" #define CONTEXTHELP_HISTOGRAM_MENU1 "M1" #define CONTEXTHELP_HISTOGRAM_MENU2 "M2" #define CONTEXTHELP_HISTOGRAM_MENU3 "M3" #define CONTEXTHELP_HISTOGRAM_MENU4 "M4" #define CONTEXTHELP_HISTOGRAM_HOST "M5" #define CONTEXTHELP_HISTOGRAM_SERVICE "M6" #define CONTEXTHELP_SUMMARY_MENU "N1" #define CONTEXTHELP_SUMMARY_RECENT_ALERTS "N2" #define CONTEXTHELP_SUMMARY_ALERT_TOTALS "N3" #define CONTEXTHELP_SUMMARY_HOSTGROUP_ALERT_TOTALS "N4" #define CONTEXTHELP_SUMMARY_HOST_ALERT_TOTALS "N5" #define CONTEXTHELP_SUMMARY_SERVICE_ALERT_TOTALS "N6" #define CONTEXTHELP_SUMMARY_ALERT_PRODUCERS "N7" #define CONTEXTHELP_SUMMARY_SERVICEGROUP_ALERT_TOTALS "N8" /************************** LIFO RETURN CODES ****************************/ #define LIFO_OK 0 #define LIFO_ERROR_MEMORY 1 #define LIFO_ERROR_FILE 2 #define LIFO_ERROR_DATA 3 /*************************** DATA STRUCTURES *****************************/ /* LIFO data structure */ typedef struct lifo_struct{ char *data; struct lifo_struct *next; }lifo; /* MMAPFILE structure - used for reading files via mmap() */ typedef struct mmapfile_struct{ char *path; int mode; int fd; unsigned long file_size; unsigned long current_position; unsigned long current_line; void *mmap_buf; }mmapfile; /******************************** FUNCTIONS *******************************/ void reset_cgi_vars(void); void free_cgi_vars(void); void free_memory(void); char * get_cgi_config_location(void); /* gets location of the CGI config file to read */ char * get_cmd_file_location(void); /* gets location of external command file to write to */ int read_cgi_config_file(char *); int read_main_config_file(char *); int read_all_object_configuration_data(char *,int); int read_all_status_data(char *,int); int hashfunc1(const char *name1, int hashslots); int hashfunc2(const char *name1, const char *name2, int hashslots); int compare_hashdata1(const char *,const char *); int compare_hashdata2(const char *,const char *,const char *,const char *); void strip(char *); /* strips newlines, carriage returns, and spaces from end of buffer */ void sanitize_plugin_output(char *); /* strips HTML and bad characters from plugin output */ void get_time_string(time_t *,char *,int,int); /* gets a date/time string */ void get_interval_time_string(int,char *,int); /* gets a time string for an interval of time */ void get_expire_time_string(time_t *,char *,int); /* gets a date/time string in the format used for Expire: tags*/ char * my_strtok(char *,char *); /* replacement for strtok() function - doesn't skip multiple tokens */ char * my_strsep (char **, const char *); char * url_encode(char *); /* encodes a string in proper URL format */ char * html_encode(char *); /* encodes a string in HTML format (for what the user sees) */ char * strip_plugin_html(char *); /* strips dangerous HTML from plugin output */ void strip_html_brackets(char *); void get_time_breakdown(unsigned long,int *,int *,int *,int *); /* given total seconds, get days, hours, minutes, seconds */ void get_log_archive_to_use(int,char *,int); /* determines the name of the log archive to use */ void determine_log_rotation_times(int); int determine_archive_to_use_from_time(time_t); void print_extra_host_url(char *,char *); void print_extra_service_url(char *,char *,char *); void display_info_table(char *,int,authdata *); void display_nav_table(char *,int); void include_ssi_files(char *,int); /* include user-defined SSI footers/headers */ void include_ssi_file(char *); /* include user-defined SSI footer/header */ void cgi_config_file_error(char *); void main_config_file_error(char *); void object_data_error(void); void status_data_error(void); void display_context_help(char *); /* displays context-sensitive help window */ int read_file_into_lifo(char *); /* LIFO functions */ void free_lifo_memory(void); int push_lifo(char *); char *pop_lifo(void); mmapfile *mmap_fopen(char *); /* open a file read-only using mmap() */ int mmap_fclose(mmapfile *); char *mmap_fgets(mmapfile *); char *mmap_fgets_multiline(mmapfile *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-2x/sretention.h0000644000175100017510000000232110550310753021340 0ustar baeckerhbaeckerh/***************************************************************************** * * SRETENTION.H - Header for state retention routines * * Copyright (c) 1999-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-25-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifdef __cplusplus extern "C" { #endif int save_state_information(char *,int); /* saves all host and state information */ int read_initial_state_information(char *); /* reads in initial host and state information */ #ifdef __cplusplus } #endif ndoutils-1.4b9/include/ndomod.h0000644000175100017510000000765311267536772016655 0ustar baeckerhbaeckerh/************************************************************************ * * NDOMOD.H - NDO NEB Module Include File * Copyright (c) 2005-2006 Ethan Galstad * Last Modified: 05-25-2006 * ************************************************************************/ #ifndef _NDBXT_NDOMOD_H #define _NDBXT_NDOMOD_H /* this is needed for access to daemon's internal data */ #define NSCORE 1 typedef struct ndomod_sink_buffer_struct{ char **buffer; unsigned long size; unsigned long head; unsigned long tail; unsigned long items; unsigned long maxitems; unsigned long overflow; }ndomod_sink_buffer; #define NDOMOD_MAX_BUFLEN 16384 #define NDOMOD_PROCESS_PROCESS_DATA 1 #define NDOMOD_PROCESS_TIMED_EVENT_DATA 2 #define NDOMOD_PROCESS_LOG_DATA 4 #define NDOMOD_PROCESS_SYSTEM_COMMAND_DATA 8 #define NDOMOD_PROCESS_EVENT_HANDLER_DATA 16 #define NDOMOD_PROCESS_NOTIFICATION_DATA 32 #define NDOMOD_PROCESS_SERVICE_CHECK_DATA 64 #define NDOMOD_PROCESS_HOST_CHECK_DATA 128 #define NDOMOD_PROCESS_COMMENT_DATA 256 #define NDOMOD_PROCESS_DOWNTIME_DATA 512 #define NDOMOD_PROCESS_FLAPPING_DATA 1024 #define NDOMOD_PROCESS_PROGRAM_STATUS_DATA 2048 #define NDOMOD_PROCESS_HOST_STATUS_DATA 4096 #define NDOMOD_PROCESS_SERVICE_STATUS_DATA 8192 #define NDOMOD_PROCESS_ADAPTIVE_PROGRAM_DATA 16384 #define NDOMOD_PROCESS_ADAPTIVE_HOST_DATA 32768 #define NDOMOD_PROCESS_ADAPTIVE_SERVICE_DATA 65536 #define NDOMOD_PROCESS_EXTERNAL_COMMAND_DATA 131072 #define NDOMOD_PROCESS_OBJECT_CONFIG_DATA 262144 #define NDOMOD_PROCESS_MAIN_CONFIG_DATA 524288 #define NDOMOD_PROCESS_AGGREGATED_STATUS_DATA 1048576 #define NDOMOD_PROCESS_RETENTION_DATA 2097152 #define NDOMOD_PROCESS_ACKNOWLEDGEMENT_DATA 4194304 #define NDOMOD_PROCESS_STATECHANGE_DATA 8388608 #define NDOMOD_PROCESS_CONTACT_STATUS_DATA 16777216 #define NDOMOD_PROCESS_ADAPTIVE_CONTACT_DATA 33554432 #define NDOMOD_PROCESS_EVERYTHING 67108863 #define NDOMOD_CONFIG_DUMP_NONE 0 #define NDOMOD_CONFIG_DUMP_ORIGINAL 1 #define NDOMOD_CONFIG_DUMP_RETAINED 2 #define NDOMOD_CONFIG_DUMP_ALL 3 int nebmodule_init(int,char *,void *); int nebmodule_deinit(int,int); int ndomod_init(void); int ndomod_deinit(void); int ndomod_check_nagios_object_version(void); int ndomod_write_to_logs(char *,int); int ndomod_process_module_args(char *); int ndomod_process_config_var(char *); int ndomod_process_config_file(char *); int ndomod_open_sink(void); int ndomod_close_sink(void); int ndomod_write_to_sink(char *,int,int); int ndomod_rotate_sink_file(void *); int ndomod_hello_sink(int,int); int ndomod_goodbye_sink(void); int ndomod_sink_buffer_init(ndomod_sink_buffer *sbuf,unsigned long); int ndomod_sink_buffer_deinit(ndomod_sink_buffer *sbuf); int ndomod_sink_buffer_push(ndomod_sink_buffer *sbuf,char *); char *ndomod_sink_buffer_peek(ndomod_sink_buffer *sbuf); char *ndomod_sink_buffer_pop(ndomod_sink_buffer *sbuf); int ndomod_sink_buffer_items(ndomod_sink_buffer *sbuf); unsigned long ndomod_sink_buffer_get_overflow(ndomod_sink_buffer *sbuf); int ndomod_sink_buffer_set_overflow(ndomod_sink_buffer *sbuf,unsigned long); int ndomod_load_unprocessed_data(char *); int ndomod_save_unprocessed_data(char *); int ndomod_register_callbacks(void); int ndomod_deregister_callbacks(void); int ndomod_broker_data(int,void *); int ndomod_write_config(int); int ndomod_write_object_config(int); int ndomod_write_config_files(void); int ndomod_write_main_config_file(void); int ndomod_write_resource_config_files(void); int ndomod_write_resource_config_file(char *); int ndomod_write_runtime_variables(void); #endif ndoutils-1.4b9/include/io.h0000644000175100017510000000224210550310752015747 0ustar baeckerhbaeckerh/************************************************************************ * * IO.H - Common I/O Functions * Copyright (c) 2005 Ethan Galstad * Last Modified: 05-19-2005 * ************************************************************************/ #ifndef _NDO_IO_H #define _NDO_IO_H #include "config.h" #define NDO_SINK_FILE 0 #define NDO_SINK_FD 1 #define NDO_SINK_UNIXSOCKET 2 #define NDO_SINK_TCPSOCKET 3 #define NDO_DEFAULT_TCP_PORT 5668 /* MMAPFILE structure - used for reading files via mmap() */ typedef struct ndo_mmapfile_struct{ char *path; int mode; int fd; unsigned long file_size; unsigned long current_position; unsigned long current_line; void *mmap_buf; }ndo_mmapfile; ndo_mmapfile *ndo_mmap_fopen(char *); int ndo_mmap_fclose(ndo_mmapfile *); char *ndo_mmap_fgets(ndo_mmapfile *); int ndo_sink_open(char *,int,int,int,int,int *); int ndo_sink_write(int,char *,int); int ndo_sink_write_newline(int); int ndo_sink_flush(int); int ndo_sink_close(int); int ndo_inet_aton(register const char *,struct in_addr *); void ndo_strip_buffer(char *); char *ndo_escape_buffer(char *); char *ndo_unescape_buffer(char *); #endif ndoutils-1.4b9/include/nagios-3x/0000755000175100017510000000000011227320616017001 5ustar baeckerhbaeckerhndoutils-1.4b9/include/nagios-3x/epn_nagios.h0000644000175100017510000000157610550310754021305 0ustar baeckerhbaeckerh/************************************************************************ * * Embedded Perl Header File * Last Modified: 12-08-2004 * ************************************************************************/ /******** BEGIN EMBEDDED PERL INTERPRETER DECLARATIONS ********/ #include #include #include #undef ctime /* don't need perl's threaded version */ #undef printf /* can't use perl's printf until initialized */ /* In perl.h (or friends) there is a macro that defines sighandler as Perl_sighandler, so we must #undef it so we can use our sighandler() function */ #undef sighandler /* and we don't need perl's reentrant versions */ #undef localtime #undef getpwnam #undef getgrnam #undef strerror #ifdef aTHX EXTERN_C void xs_init(pTHX); #else EXTERN_C void xs_init(void); #endif /******** END EMBEDDED PERL INTERPRETER DECLARATIONS ********/ ndoutils-1.4b9/include/nagios-3x/locations.h0000644000175100017510000000461710636062307021160 0ustar baeckerhbaeckerh/************************************************************************ * * Nagios Locations Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 04-30-2007 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #define DEFAULT_TEMP_FILE "/usr/local/nagios/var/tempfile" #define DEFAULT_TEMP_PATH "/tmp" #define DEFAULT_CHECK_RESULT_PATH "/usr/local/nagios/var/spool/checkresults" #define DEFAULT_STATUS_FILE "/usr/local/nagios/var/status.dat" #define DEFAULT_LOG_FILE "/usr/local/nagios/var/nagios.log" #define DEFAULT_LOG_ARCHIVE_PATH "/usr/local/nagios/var/archives/" #define DEFAULT_DEBUG_FILE "/usr/local/nagios/var/nagios.debug" #define DEFAULT_COMMENT_FILE "/usr/local/nagios/var/comments.dat" #define DEFAULT_DOWNTIME_FILE "/usr/local/nagios/var/downtime.dat" #define DEFAULT_RETENTION_FILE "/usr/local/nagios/var/retention.dat" #define DEFAULT_COMMAND_FILE "/usr/local/nagios/var/rw/nagios.cmd" #define DEFAULT_CONFIG_FILE "/usr/local/nagios/etc/nagios.cfg" #define DEFAULT_PHYSICAL_HTML_PATH "/usr/local/nagios/share" #define DEFAULT_URL_HTML_PATH "/nagios" #define DEFAULT_PHYSICAL_CGIBIN_PATH "/usr/local/nagios/sbin" #define DEFAULT_URL_CGIBIN_PATH "/nagios/cgi-bin" #define DEFAULT_CGI_CONFIG_FILE "/usr/local/nagios/etc/cgi.cfg" #define DEFAULT_LOCK_FILE "/usr/local/nagios/var/nagios.lock" #define DEFAULT_OBJECT_CACHE_FILE "/usr/local/nagios/var/objects.cache" #define DEFAULT_PRECACHED_OBJECT_FILE "/usr/local/nagios/var/objects.precache" #define DEFAULT_EVENT_BROKER_FILE "/usr/local/nagios/var/broker.socket" #define DEFAULT_P1_FILE "/usr/local/nagios/bin/p1.pl" /**** EMBEDDED PERL ****/ #define DEFAULT_AUTH_FILE "" /**** EMBEDDED PERL - IS THIS USED? ****/ ndoutils-1.4b9/include/nagios-3x/downtime.h0000644000175100017510000000667310550544426021021 0ustar baeckerhbaeckerh/***************************************************************************** * * DOWNTIME.H - Header file for scheduled downtime functions * * Copyright (c) 2001-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-25-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _DOWNTIME_H #define _DOWNTIME_H #include "config.h" #include "common.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif /* SCHEDULED_DOWNTIME_ENTRY structure */ typedef struct scheduled_downtime_struct{ int type; char *host_name; char *service_description; time_t entry_time; time_t start_time; time_t end_time; int fixed; unsigned long triggered_by; unsigned long duration; unsigned long downtime_id; char *author; char *comment; #ifdef NSCORE unsigned long comment_id; int is_in_effect; int start_flex_downtime; int incremented_pending_downtime; #endif struct scheduled_downtime_struct *next; }scheduled_downtime; #ifdef NSCORE int initialize_downtime_data(char *); /* initializes scheduled downtime data */ int cleanup_downtime_data(char *); /* cleans up scheduled downtime data */ int add_new_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *); int add_new_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *); int add_new_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *); int delete_host_downtime(unsigned long); int delete_service_downtime(unsigned long); int delete_downtime(int,unsigned long); int schedule_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long *); int unschedule_downtime(int,unsigned long); int register_downtime(int,unsigned long); int handle_scheduled_downtime(scheduled_downtime *); int handle_scheduled_downtime_by_id(unsigned long); int check_pending_flex_host_downtime(host *); int check_pending_flex_service_downtime(service *); int check_for_expired_downtime(void); #endif int add_host_downtime(char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long); int add_service_downtime(char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long); int add_downtime(int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long); scheduled_downtime *find_downtime(int,unsigned long); scheduled_downtime *find_host_downtime(unsigned long); scheduled_downtime *find_service_downtime(unsigned long); void free_downtime_data(void); /* frees memory allocated to scheduled downtime list */ #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/macros.h0000644000175100017510000002436510712143241020443 0ustar baeckerhbaeckerh/************************************************************************ * * MACROS.H - Common macro functions * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 10-28-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef _MACROS_H #define _MACROS_H #include "config.h" #include "common.h" #include "objects.h" /****************** LENGTH LIMITATIONS ****************/ #define MAX_COMMAND_ARGUMENTS 32 /* maximum number of $ARGx$ macros */ /****************** MACRO DEFINITIONS *****************/ #define MACRO_ENV_VAR_PREFIX "NAGIOS_" #define MAX_USER_MACROS 256 /* maximum number of $USERx$ macros */ #define MACRO_X_COUNT 153 /* size of macro_x[] array */ #define MACRO_HOSTNAME 0 #define MACRO_HOSTALIAS 1 #define MACRO_HOSTADDRESS 2 #define MACRO_SERVICEDESC 3 #define MACRO_SERVICESTATE 4 #define MACRO_SERVICESTATEID 5 #define MACRO_SERVICEATTEMPT 6 #define MACRO_LONGDATETIME 7 #define MACRO_SHORTDATETIME 8 #define MACRO_DATE 9 #define MACRO_TIME 10 #define MACRO_TIMET 11 #define MACRO_LASTHOSTCHECK 12 #define MACRO_LASTSERVICECHECK 13 #define MACRO_LASTHOSTSTATECHANGE 14 #define MACRO_LASTSERVICESTATECHANGE 15 #define MACRO_HOSTOUTPUT 16 #define MACRO_SERVICEOUTPUT 17 #define MACRO_HOSTPERFDATA 18 #define MACRO_SERVICEPERFDATA 19 #define MACRO_CONTACTNAME 20 #define MACRO_CONTACTALIAS 21 #define MACRO_CONTACTEMAIL 22 #define MACRO_CONTACTPAGER 23 #define MACRO_ADMINEMAIL 24 #define MACRO_ADMINPAGER 25 #define MACRO_HOSTSTATE 26 #define MACRO_HOSTSTATEID 27 #define MACRO_HOSTATTEMPT 28 #define MACRO_NOTIFICATIONTYPE 29 #define MACRO_NOTIFICATIONNUMBER 30 /* deprecated - see HOSTNOTIFICATIONNUMBER and SERVICENOTIFICATIONNUMBER macros */ #define MACRO_HOSTEXECUTIONTIME 31 #define MACRO_SERVICEEXECUTIONTIME 32 #define MACRO_HOSTLATENCY 33 #define MACRO_SERVICELATENCY 34 #define MACRO_HOSTDURATION 35 #define MACRO_SERVICEDURATION 36 #define MACRO_HOSTDURATIONSEC 37 #define MACRO_SERVICEDURATIONSEC 38 #define MACRO_HOSTDOWNTIME 39 #define MACRO_SERVICEDOWNTIME 40 #define MACRO_HOSTSTATETYPE 41 #define MACRO_SERVICESTATETYPE 42 #define MACRO_HOSTPERCENTCHANGE 43 #define MACRO_SERVICEPERCENTCHANGE 44 #define MACRO_HOSTGROUPNAME 45 #define MACRO_HOSTGROUPALIAS 46 #define MACRO_SERVICEGROUPNAME 47 #define MACRO_SERVICEGROUPALIAS 48 #define MACRO_HOSTACKAUTHOR 49 #define MACRO_HOSTACKCOMMENT 50 #define MACRO_SERVICEACKAUTHOR 51 #define MACRO_SERVICEACKCOMMENT 52 #define MACRO_LASTSERVICEOK 53 #define MACRO_LASTSERVICEWARNING 54 #define MACRO_LASTSERVICEUNKNOWN 55 #define MACRO_LASTSERVICECRITICAL 56 #define MACRO_LASTHOSTUP 57 #define MACRO_LASTHOSTDOWN 58 #define MACRO_LASTHOSTUNREACHABLE 59 #define MACRO_SERVICECHECKCOMMAND 60 #define MACRO_HOSTCHECKCOMMAND 61 #define MACRO_MAINCONFIGFILE 62 #define MACRO_STATUSDATAFILE 63 #define MACRO_HOSTDISPLAYNAME 64 #define MACRO_SERVICEDISPLAYNAME 65 #define MACRO_RETENTIONDATAFILE 66 #define MACRO_OBJECTCACHEFILE 67 #define MACRO_TEMPFILE 68 #define MACRO_LOGFILE 69 #define MACRO_RESOURCEFILE 70 #define MACRO_COMMANDFILE 71 #define MACRO_HOSTPERFDATAFILE 72 #define MACRO_SERVICEPERFDATAFILE 73 #define MACRO_HOSTACTIONURL 74 #define MACRO_HOSTNOTESURL 75 #define MACRO_HOSTNOTES 76 #define MACRO_SERVICEACTIONURL 77 #define MACRO_SERVICENOTESURL 78 #define MACRO_SERVICENOTES 79 #define MACRO_TOTALHOSTSUP 80 #define MACRO_TOTALHOSTSDOWN 81 #define MACRO_TOTALHOSTSUNREACHABLE 82 #define MACRO_TOTALHOSTSDOWNUNHANDLED 83 #define MACRO_TOTALHOSTSUNREACHABLEUNHANDLED 84 #define MACRO_TOTALHOSTPROBLEMS 85 #define MACRO_TOTALHOSTPROBLEMSUNHANDLED 86 #define MACRO_TOTALSERVICESOK 87 #define MACRO_TOTALSERVICESWARNING 88 #define MACRO_TOTALSERVICESCRITICAL 89 #define MACRO_TOTALSERVICESUNKNOWN 90 #define MACRO_TOTALSERVICESWARNINGUNHANDLED 91 #define MACRO_TOTALSERVICESCRITICALUNHANDLED 92 #define MACRO_TOTALSERVICESUNKNOWNUNHANDLED 93 #define MACRO_TOTALSERVICEPROBLEMS 94 #define MACRO_TOTALSERVICEPROBLEMSUNHANDLED 95 #define MACRO_PROCESSSTARTTIME 96 #define MACRO_HOSTCHECKTYPE 97 #define MACRO_SERVICECHECKTYPE 98 #define MACRO_LONGHOSTOUTPUT 99 #define MACRO_LONGSERVICEOUTPUT 100 #define MACRO_TEMPPATH 101 #define MACRO_HOSTNOTIFICATIONNUMBER 102 #define MACRO_SERVICENOTIFICATIONNUMBER 103 #define MACRO_HOSTNOTIFICATIONID 104 #define MACRO_SERVICENOTIFICATIONID 105 #define MACRO_HOSTEVENTID 106 #define MACRO_LASTHOSTEVENTID 107 #define MACRO_SERVICEEVENTID 108 #define MACRO_LASTSERVICEEVENTID 109 #define MACRO_HOSTGROUPNAMES 110 #define MACRO_SERVICEGROUPNAMES 111 #define MACRO_HOSTACKAUTHORNAME 112 #define MACRO_HOSTACKAUTHORALIAS 113 #define MACRO_SERVICEACKAUTHORNAME 114 #define MACRO_SERVICEACKAUTHORALIAS 115 #define MACRO_MAXHOSTATTEMPTS 116 #define MACRO_MAXSERVICEATTEMPTS 117 #define MACRO_SERVICEISVOLATILE 118 #define MACRO_TOTALHOSTSERVICES 119 #define MACRO_TOTALHOSTSERVICESOK 120 #define MACRO_TOTALHOSTSERVICESWARNING 121 #define MACRO_TOTALHOSTSERVICESUNKNOWN 122 #define MACRO_TOTALHOSTSERVICESCRITICAL 123 #define MACRO_HOSTGROUPNOTES 124 #define MACRO_HOSTGROUPNOTESURL 125 #define MACRO_HOSTGROUPACTIONURL 126 #define MACRO_SERVICEGROUPNOTES 127 #define MACRO_SERVICEGROUPNOTESURL 128 #define MACRO_SERVICEGROUPACTIONURL 129 #define MACRO_HOSTGROUPMEMBERS 130 #define MACRO_SERVICEGROUPMEMBERS 131 #define MACRO_CONTACTGROUPNAME 132 #define MACRO_CONTACTGROUPALIAS 133 #define MACRO_CONTACTGROUPMEMBERS 134 #define MACRO_CONTACTGROUPNAMES 135 #define MACRO_NOTIFICATIONRECIPIENTS 136 #define MACRO_NOTIFICATIONISESCALATED 137 #define MACRO_NOTIFICATIONAUTHOR 138 #define MACRO_NOTIFICATIONAUTHORNAME 139 #define MACRO_NOTIFICATIONAUTHORALIAS 140 #define MACRO_NOTIFICATIONCOMMENT 141 #define MACRO_EVENTSTARTTIME 142 #define MACRO_HOSTPROBLEMID 143 #define MACRO_LASTHOSTPROBLEMID 144 #define MACRO_SERVICEPROBLEMID 145 #define MACRO_LASTSERVICEPROBLEMID 146 #define MACRO_ISVALIDTIME 147 #define MACRO_NEXTVALIDTIME 148 #define MACRO_LASTHOSTSTATE 149 #define MACRO_LASTHOSTSTATEID 150 #define MACRO_LASTSERVICESTATE 151 #define MACRO_LASTSERVICESTATEID 152 /************* MACRO CLEANING OPTIONS *****************/ #define STRIP_ILLEGAL_MACRO_CHARS 1 #define ESCAPE_MACRO_CHARS 2 #define URL_ENCODE_MACRO_CHARS 4 /****************** MACRO FUNCTIONS ******************/ int process_macros(char *,char **,int); /* replace macros with their actual values */ char *clean_macro_chars(char *,int); /* cleans macros characters before insertion into output string */ int grab_service_macros(service *); /* updates the service macro data */ int grab_host_macros(host *); /* updates the host macro data */ int grab_servicegroup_macros(servicegroup *); /* updates servicegroup macros */ int grab_hostgroup_macros(hostgroup *); /* updates hostgroup macros */ int grab_contact_macros(contact *); /* updates the contact macro data */ int grab_contactgroup_macros(contactgroup *); /* updates contactgroup macros */ int grab_datetime_macros(void); /* updates date/time macros */ int grab_on_demand_macro(char *); /* fetches an on-demand macro */ char *get_url_encoded_string(char *); /* URL encode a string */ int init_macros(void); int init_macrox_names(void); int add_macrox_name(int,char *); int free_macrox_names(void); int clear_argv_macros(void); int clear_volatile_macros(void); int clear_host_macros(void); int clear_service_macros(void); int clear_hostgroup_macros(void); int clear_servicegroup_macros(void); int clear_contact_macros(void); int clear_contactgroup_macros(void); int clear_summary_macros(void); int grab_macro_value(char *,char **,int *,int *); int grab_macrox_value(int,char *,char *,char **,int *); int grab_custom_macro_value(char *,char *,char *,char **); int grab_datetime_macro(int,char *,char *,char **); int grab_standard_host_macro(int,host *,char **,int *); int grab_standard_hostgroup_macro(int,hostgroup *,char **); int grab_standard_service_macro(int,service *,char **,int *); int grab_standard_servicegroup_macro(int,servicegroup *,char **); int grab_standard_contact_macro(int,contact *,char **); int grab_contact_address_macro(int,contact *,char **); int grab_standard_contactgroup_macro(int,contactgroup *,char **); int grab_custom_object_macro(char *,customvariablesmember *,char **); #ifdef NSCORE int set_all_macro_environment_vars(int); int set_macrox_environment_vars(int); int set_argv_macro_environment_vars(int); int set_custom_macro_environment_vars(int); int set_contact_address_environment_vars(int); int set_macro_environment_var(char *,char *,int); #endif #endif ndoutils-1.4b9/include/nagios-3x/common.h0000644000175100017510000004325310712143241020444 0ustar baeckerhbaeckerh/************************************************************************ * * Nagios Common Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 10-22-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #define PROGRAM_VERSION "3.0b5" #define PROGRAM_MODIFICATION_DATE "10-08-2007" /*#define DEBUG_CHECK_IPC 1 */ /*#define DEBUG_CHECK_IPC2 1*/ /* daemon is thread safe */ #ifdef NSCORE #ifndef _REENTRANT #define _REENTRANT #endif #ifndef _THREAD_SAFE #define _THREAD_SAFE #endif #endif /* Experimental performance tweaks - use with caution */ #undef USE_MEMORY_PERFORMANCE_TWEAKS /* my_free has been freed from bondage as a function */ #define my_free(ptr) { if(ptr) { free(ptr); ptr = NULL; } } /***************************** COMMANDS *********************************/ #define CMD_NONE 0 #define CMD_ADD_HOST_COMMENT 1 #define CMD_DEL_HOST_COMMENT 2 #define CMD_ADD_SVC_COMMENT 3 #define CMD_DEL_SVC_COMMENT 4 #define CMD_ENABLE_SVC_CHECK 5 #define CMD_DISABLE_SVC_CHECK 6 #define CMD_SCHEDULE_SVC_CHECK 7 #define CMD_DELAY_SVC_NOTIFICATION 9 #define CMD_DELAY_HOST_NOTIFICATION 10 #define CMD_DISABLE_NOTIFICATIONS 11 #define CMD_ENABLE_NOTIFICATIONS 12 #define CMD_RESTART_PROCESS 13 #define CMD_SHUTDOWN_PROCESS 14 #define CMD_ENABLE_HOST_SVC_CHECKS 15 #define CMD_DISABLE_HOST_SVC_CHECKS 16 #define CMD_SCHEDULE_HOST_SVC_CHECKS 17 #define CMD_DELAY_HOST_SVC_NOTIFICATIONS 19 /* currently unimplemented */ #define CMD_DEL_ALL_HOST_COMMENTS 20 #define CMD_DEL_ALL_SVC_COMMENTS 21 #define CMD_ENABLE_SVC_NOTIFICATIONS 22 #define CMD_DISABLE_SVC_NOTIFICATIONS 23 #define CMD_ENABLE_HOST_NOTIFICATIONS 24 #define CMD_DISABLE_HOST_NOTIFICATIONS 25 #define CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST 26 #define CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST 27 #define CMD_ENABLE_HOST_SVC_NOTIFICATIONS 28 #define CMD_DISABLE_HOST_SVC_NOTIFICATIONS 29 #define CMD_PROCESS_SERVICE_CHECK_RESULT 30 #define CMD_SAVE_STATE_INFORMATION 31 #define CMD_READ_STATE_INFORMATION 32 #define CMD_ACKNOWLEDGE_HOST_PROBLEM 33 #define CMD_ACKNOWLEDGE_SVC_PROBLEM 34 #define CMD_START_EXECUTING_SVC_CHECKS 35 #define CMD_STOP_EXECUTING_SVC_CHECKS 36 #define CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS 37 #define CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS 38 #define CMD_ENABLE_PASSIVE_SVC_CHECKS 39 #define CMD_DISABLE_PASSIVE_SVC_CHECKS 40 #define CMD_ENABLE_EVENT_HANDLERS 41 #define CMD_DISABLE_EVENT_HANDLERS 42 #define CMD_ENABLE_HOST_EVENT_HANDLER 43 #define CMD_DISABLE_HOST_EVENT_HANDLER 44 #define CMD_ENABLE_SVC_EVENT_HANDLER 45 #define CMD_DISABLE_SVC_EVENT_HANDLER 46 #define CMD_ENABLE_HOST_CHECK 47 #define CMD_DISABLE_HOST_CHECK 48 #define CMD_START_OBSESSING_OVER_SVC_CHECKS 49 #define CMD_STOP_OBSESSING_OVER_SVC_CHECKS 50 #define CMD_REMOVE_HOST_ACKNOWLEDGEMENT 51 #define CMD_REMOVE_SVC_ACKNOWLEDGEMENT 52 #define CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS 53 #define CMD_SCHEDULE_FORCED_SVC_CHECK 54 #define CMD_SCHEDULE_HOST_DOWNTIME 55 #define CMD_SCHEDULE_SVC_DOWNTIME 56 #define CMD_ENABLE_HOST_FLAP_DETECTION 57 #define CMD_DISABLE_HOST_FLAP_DETECTION 58 #define CMD_ENABLE_SVC_FLAP_DETECTION 59 #define CMD_DISABLE_SVC_FLAP_DETECTION 60 #define CMD_ENABLE_FLAP_DETECTION 61 #define CMD_DISABLE_FLAP_DETECTION 62 #define CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS 63 #define CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS 64 #define CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS 65 #define CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS 66 #define CMD_ENABLE_HOSTGROUP_SVC_CHECKS 67 #define CMD_DISABLE_HOSTGROUP_SVC_CHECKS 68 #define CMD_CANCEL_HOST_DOWNTIME 69 /* not internally implemented */ #define CMD_CANCEL_SVC_DOWNTIME 70 /* not internally implemented */ #define CMD_CANCEL_ACTIVE_HOST_DOWNTIME 71 /* old - no longer used */ #define CMD_CANCEL_PENDING_HOST_DOWNTIME 72 /* old - no longer used */ #define CMD_CANCEL_ACTIVE_SVC_DOWNTIME 73 /* old - no longer used */ #define CMD_CANCEL_PENDING_SVC_DOWNTIME 74 /* old - no longer used */ #define CMD_CANCEL_ACTIVE_HOST_SVC_DOWNTIME 75 /* unimplemented */ #define CMD_CANCEL_PENDING_HOST_SVC_DOWNTIME 76 /* unimplemented */ #define CMD_FLUSH_PENDING_COMMANDS 77 #define CMD_DEL_HOST_DOWNTIME 78 #define CMD_DEL_SVC_DOWNTIME 79 #define CMD_ENABLE_FAILURE_PREDICTION 80 #define CMD_DISABLE_FAILURE_PREDICTION 81 #define CMD_ENABLE_PERFORMANCE_DATA 82 #define CMD_DISABLE_PERFORMANCE_DATA 83 #define CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME 84 #define CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME 85 #define CMD_SCHEDULE_HOST_SVC_DOWNTIME 86 /* new commands in Nagios 2.x found below... */ #define CMD_PROCESS_HOST_CHECK_RESULT 87 #define CMD_START_EXECUTING_HOST_CHECKS 88 #define CMD_STOP_EXECUTING_HOST_CHECKS 89 #define CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS 90 #define CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS 91 #define CMD_ENABLE_PASSIVE_HOST_CHECKS 92 #define CMD_DISABLE_PASSIVE_HOST_CHECKS 93 #define CMD_START_OBSESSING_OVER_HOST_CHECKS 94 #define CMD_STOP_OBSESSING_OVER_HOST_CHECKS 95 #define CMD_SCHEDULE_HOST_CHECK 96 #define CMD_SCHEDULE_FORCED_HOST_CHECK 98 #define CMD_START_OBSESSING_OVER_SVC 99 #define CMD_STOP_OBSESSING_OVER_SVC 100 #define CMD_START_OBSESSING_OVER_HOST 101 #define CMD_STOP_OBSESSING_OVER_HOST 102 #define CMD_ENABLE_HOSTGROUP_HOST_CHECKS 103 #define CMD_DISABLE_HOSTGROUP_HOST_CHECKS 104 #define CMD_ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS 105 #define CMD_DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS 106 #define CMD_ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS 107 #define CMD_DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS 108 #define CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS 109 #define CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS 110 #define CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS 111 #define CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS 112 #define CMD_ENABLE_SERVICEGROUP_SVC_CHECKS 113 #define CMD_DISABLE_SERVICEGROUP_SVC_CHECKS 114 #define CMD_ENABLE_SERVICEGROUP_HOST_CHECKS 115 #define CMD_DISABLE_SERVICEGROUP_HOST_CHECKS 116 #define CMD_ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS 117 #define CMD_DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS 118 #define CMD_ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS 119 #define CMD_DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS 120 #define CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME 121 #define CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME 122 #define CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER 123 #define CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER 124 #define CMD_CHANGE_HOST_EVENT_HANDLER 125 #define CMD_CHANGE_SVC_EVENT_HANDLER 126 #define CMD_CHANGE_HOST_CHECK_COMMAND 127 #define CMD_CHANGE_SVC_CHECK_COMMAND 128 #define CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL 129 #define CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL 130 #define CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL 131 #define CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS 132 #define CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS 133 #define CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME 134 #define CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS 135 #define CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS 136 #define CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME 137 #define CMD_ENABLE_SERVICE_FRESHNESS_CHECKS 138 #define CMD_DISABLE_SERVICE_FRESHNESS_CHECKS 139 #define CMD_ENABLE_HOST_FRESHNESS_CHECKS 140 #define CMD_DISABLE_HOST_FRESHNESS_CHECKS 141 #define CMD_SET_HOST_NOTIFICATION_NUMBER 142 #define CMD_SET_SVC_NOTIFICATION_NUMBER 143 /* new commands in Nagios 3.x found below... */ #define CMD_CHANGE_HOST_CHECK_TIMEPERIOD 144 #define CMD_CHANGE_SVC_CHECK_TIMEPERIOD 145 #define CMD_PROCESS_FILE 146 #define CMD_CHANGE_CUSTOM_HOST_VAR 147 #define CMD_CHANGE_CUSTOM_SVC_VAR 148 #define CMD_CHANGE_CUSTOM_CONTACT_VAR 149 #define CMD_ENABLE_CONTACT_HOST_NOTIFICATIONS 150 #define CMD_DISABLE_CONTACT_HOST_NOTIFICATIONS 151 #define CMD_ENABLE_CONTACT_SVC_NOTIFICATIONS 152 #define CMD_DISABLE_CONTACT_SVC_NOTIFICATIONS 153 #define CMD_ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS 154 #define CMD_DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS 155 #define CMD_ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS 156 #define CMD_DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS 157 #define CMD_CHANGE_RETRY_HOST_CHECK_INTERVAL 158 #define CMD_SEND_CUSTOM_HOST_NOTIFICATION 159 #define CMD_SEND_CUSTOM_SVC_NOTIFICATION 160 #define CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD 161 #define CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD 162 #define CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD 163 #define CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD 164 #define CMD_CHANGE_HOST_MODATTR 165 #define CMD_CHANGE_SVC_MODATTR 166 #define CMD_CHANGE_CONTACT_MODATTR 167 #define CMD_CHANGE_CONTACT_MODHATTR 168 #define CMD_CHANGE_CONTACT_MODSATTR 169 /* custom command introduced in Nagios 3.x */ #define CMD_CUSTOM_COMMAND 999 /************************ SERVICE CHECK TYPES ****************************/ #define SERVICE_CHECK_ACTIVE 0 /* Nagios performed the service check */ #define SERVICE_CHECK_PASSIVE 1 /* the service check result was submitted by an external source */ /************************** HOST CHECK TYPES *****************************/ #define HOST_CHECK_ACTIVE 0 /* Nagios performed the host check */ #define HOST_CHECK_PASSIVE 1 /* the host check result was submitted by an external source */ /************************ SERVICE STATE TYPES ****************************/ #define SOFT_STATE 0 #define HARD_STATE 1 /************************* SCHEDULED DOWNTIME TYPES **********************/ #define SERVICE_DOWNTIME 1 /* service downtime */ #define HOST_DOWNTIME 2 /* host downtime */ #define ANY_DOWNTIME 3 /* host or service downtime */ /************************** NOTIFICATION OPTIONS *************************/ #define NOTIFICATION_OPTION_NONE 0 #define NOTIFICATION_OPTION_BROADCAST 1 #define NOTIFICATION_OPTION_FORCED 2 #define NOTIFICATION_OPTION_INCREMENT 4 /************************** ACKNOWLEDGEMENT TYPES ************************/ #define HOST_ACKNOWLEDGEMENT 0 #define SERVICE_ACKNOWLEDGEMENT 1 #define ACKNOWLEDGEMENT_NONE 0 #define ACKNOWLEDGEMENT_NORMAL 1 #define ACKNOWLEDGEMENT_STICKY 2 /**************************** DEPENDENCY TYPES ***************************/ #define NOTIFICATION_DEPENDENCY 1 #define EXECUTION_DEPENDENCY 2 /********************** HOST/SERVICE CHECK OPTIONS ***********************/ #define CHECK_OPTION_NONE 0 /* no check options */ #define CHECK_OPTION_FORCE_EXECUTION 1 /* force execution of a check (ignores disabled services/hosts, invalid timeperiods) */ #define CHECK_OPTION_FRESHNESS_CHECK 2 /* this is a freshness check */ #define CHECK_OPTION_ORPHAN_CHECK 4 /* this is an orphan check */ /**************************** PROGRAM MODES ******************************/ #define STANDBY_MODE 0 #define ACTIVE_MODE 1 /************************** LOG ROTATION MODES ***************************/ #define LOG_ROTATION_NONE 0 #define LOG_ROTATION_HOURLY 1 #define LOG_ROTATION_DAILY 2 #define LOG_ROTATION_WEEKLY 3 #define LOG_ROTATION_MONTHLY 4 /***************************** LOG VERSIONS ******************************/ #define LOG_VERSION_1 "1.0" #define LOG_VERSION_2 "2.0" /*************************** CHECK STATISTICS ****************************/ #define ACTIVE_SCHEDULED_SERVICE_CHECK_STATS 0 #define ACTIVE_ONDEMAND_SERVICE_CHECK_STATS 1 #define PASSIVE_SERVICE_CHECK_STATS 2 #define ACTIVE_SCHEDULED_HOST_CHECK_STATS 3 #define ACTIVE_ONDEMAND_HOST_CHECK_STATS 4 #define PASSIVE_HOST_CHECK_STATS 5 #define ACTIVE_CACHED_HOST_CHECK_STATS 6 #define ACTIVE_CACHED_SERVICE_CHECK_STATS 7 #define EXTERNAL_COMMAND_STATS 8 #define PARALLEL_HOST_CHECK_STATS 9 #define SERIAL_HOST_CHECK_STATS 10 #define MAX_CHECK_STATS_TYPES 11 /************************* GENERAL DEFINITIONS **************************/ #define OK 0 #define ERROR -2 /* value was changed from -1 so as to not interfere with STATUS_UNKNOWN plugin result */ #ifndef TRUE #define TRUE 1 #elif (TRUE!=1) #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #elif (FALSE!=0) #define FALSE 0 #endif /****************** HOST CONFIG FILE READING OPTIONS ********************/ #define READ_HOSTS 1 #define READ_HOSTGROUPS 2 #define READ_CONTACTS 4 #define READ_CONTACTGROUPS 8 #define READ_SERVICES 16 #define READ_COMMANDS 32 #define READ_TIMEPERIODS 64 #define READ_SERVICEESCALATIONS 128 #define READ_HOSTGROUPESCALATIONS 256 /* no longer implemented */ #define READ_SERVICEDEPENDENCIES 512 #define READ_HOSTDEPENDENCIES 1024 #define READ_HOSTESCALATIONS 2048 #define READ_HOSTEXTINFO 4096 #define READ_SERVICEEXTINFO 8192 #define READ_SERVICEGROUPS 16384 #define READ_ALL_OBJECT_DATA READ_HOSTS | READ_HOSTGROUPS | READ_CONTACTS | READ_CONTACTGROUPS | READ_SERVICES | READ_COMMANDS | READ_TIMEPERIODS | READ_SERVICEESCALATIONS | READ_SERVICEDEPENDENCIES | READ_HOSTDEPENDENCIES | READ_HOSTESCALATIONS | READ_HOSTEXTINFO | READ_SERVICEEXTINFO | READ_SERVICEGROUPS /************************** DATE RANGE TYPES ****************************/ #define DATERANGE_CALENDAR_DATE 0 /* 2008-12-25 */ #define DATERANGE_MONTH_DATE 1 /* july 4 (specific month) */ #define DATERANGE_MONTH_DAY 2 /* day 21 (generic month) */ #define DATERANGE_MONTH_WEEK_DAY 3 /* 3rd thursday (specific month) */ #define DATERANGE_WEEK_DAY 4 /* 3rd thursday (generic month) */ #define DATERANGE_TYPES 5 /************************** DATE/TIME TYPES *****************************/ #define LONG_DATE_TIME 0 #define SHORT_DATE_TIME 1 #define SHORT_DATE 2 #define SHORT_TIME 3 #define HTTP_DATE_TIME 4 /* time formatted for use in HTTP headers */ /**************************** DATE FORMATS ******************************/ #define DATE_FORMAT_US 0 /* U.S. (MM-DD-YYYY HH:MM:SS) */ #define DATE_FORMAT_EURO 1 /* European (DD-MM-YYYY HH:MM:SS) */ #define DATE_FORMAT_ISO8601 2 /* ISO8601 (YYYY-MM-DD HH:MM:SS) */ #define DATE_FORMAT_STRICT_ISO8601 3 /* ISO8601 (YYYY-MM-DDTHH:MM:SS) */ /************************** MISC DEFINITIONS ****************************/ #define MAX_FILENAME_LENGTH 256 /* max length of path/filename that Nagios will process */ #define MAX_INPUT_BUFFER 1024 /* size in bytes of max. input buffer (for reading files, misc stuff) */ #define MAX_COMMAND_BUFFER 8192 /* max length of raw or processed command line */ #define MAX_EXTERNAL_COMMAND_LENGTH 8192 /* max length of an external command */ #define MAX_DATETIME_LENGTH 48 /************************* MODIFIED ATTRIBUTES **************************/ #define MODATTR_NONE 0 #define MODATTR_NOTIFICATIONS_ENABLED 1 #define MODATTR_ACTIVE_CHECKS_ENABLED 2 #define MODATTR_PASSIVE_CHECKS_ENABLED 4 #define MODATTR_EVENT_HANDLER_ENABLED 8 #define MODATTR_FLAP_DETECTION_ENABLED 16 #define MODATTR_FAILURE_PREDICTION_ENABLED 32 #define MODATTR_PERFORMANCE_DATA_ENABLED 64 #define MODATTR_OBSESSIVE_HANDLER_ENABLED 128 #define MODATTR_EVENT_HANDLER_COMMAND 256 #define MODATTR_CHECK_COMMAND 512 #define MODATTR_NORMAL_CHECK_INTERVAL 1024 #define MODATTR_RETRY_CHECK_INTERVAL 2048 #define MODATTR_MAX_CHECK_ATTEMPTS 4096 #define MODATTR_FRESHNESS_CHECKS_ENABLED 8192 #define MODATTR_CHECK_TIMEPERIOD 16384 #define MODATTR_CUSTOM_VARIABLE 32768 #define MODATTR_NOTIFICATION_TIMEPERIOD 65536 ndoutils-1.4b9/include/nagios-3x/neberrors.h0000644000175100017510000000430410550310755021155 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBERRORS.H - Event broker errors * * Copyright (c) 2003-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 12-12-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBERRORS_H #define _NEBERRORS_H /***** GENERIC DEFINES *****/ #define NEB_OK 0 #define NEB_ERROR -1 #define NEB_TRUE 1 #define NEB_FALSE 0 /***** GENERIC ERRORS *****/ #define NEBERROR_NOMEM 100 /* memory could not be allocated */ /***** CALLBACK ERRORS *****/ #define NEBERROR_NOCALLBACKFUNC 200 /* no callback function was specified */ #define NEBERROR_NOCALLBACKLIST 201 /* callback list not initialized */ #define NEBERROR_CALLBACKBOUNDS 202 /* callback type was out of bounds */ #define NEBERROR_CALLBACKNOTFOUND 203 /* the callback could not be found */ #define NEBERROR_NOMODULEHANDLE 204 /* no module handle specified */ #define NEBERROR_BADMODULEHANDLE 205 /* bad module handle */ #define NEBERROR_CALLBACKOVERRIDE 206 /* module wants to override default Nagios handling of event */ #define NEBERROR_CALLBACKCANCEL 207 /* module wants to cancel callbacks to other modules */ /***** MODULE ERRORS *****/ #define NEBERROR_NOMODULE 300 /* no module was specified */ /***** MODULE INFO ERRORS *****/ #define NEBERROR_MODINFOBOUNDS 400 /* module info index was out of bounds */ #endif ndoutils-1.4b9/include/nagios-3x/statusdata.h0000644000175100017510000001407010712143241021324 0ustar baeckerhbaeckerh/***************************************************************************** * * STATUSDATA.H - Header for external status data routines * * Copyright (c) 2000-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 10-19-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _STATUSDATA_H #define _STATUSDATA_H #ifdef NSCORE #include "objects.h" #endif #ifdef __cplusplus extern "C" { #endif #ifdef NSCGI #define READ_PROGRAM_STATUS 1 #define READ_HOST_STATUS 2 #define READ_SERVICE_STATUS 4 #define READ_CONTACT_STATUS 8 #define READ_ALL_STATUS_DATA READ_PROGRAM_STATUS | READ_HOST_STATUS | READ_SERVICE_STATUS | READ_CONTACT_STATUS /*************************** CHAINED HASH LIMITS ***************************/ #define SERVICESTATUS_HASHSLOTS 1024 #define HOSTSTATUS_HASHSLOTS 1024 /**************************** DATA STRUCTURES ******************************/ /* HOST STATUS structure */ typedef struct hoststatus_struct{ char *host_name; char *plugin_output; char *long_plugin_output; char *perf_data; int status; time_t last_update; int has_been_checked; int should_be_scheduled; int current_attempt; int max_attempts; time_t last_check; time_t next_check; int check_options; int check_type; time_t last_state_change; time_t last_hard_state_change; int last_hard_state; time_t last_time_up; time_t last_time_down; time_t last_time_unreachable; int state_type; time_t last_notification; time_t next_notification; int no_more_notifications; int notifications_enabled; int problem_has_been_acknowledged; int acknowledgement_type; int current_notification_number; int accept_passive_host_checks; int event_handler_enabled; int checks_enabled; int flap_detection_enabled; int is_flapping; double percent_state_change; double latency; double execution_time; int scheduled_downtime_depth; int failure_prediction_enabled; int process_performance_data; int obsess_over_host; struct hoststatus_struct *next; struct hoststatus_struct *nexthash; }hoststatus; /* SERVICE STATUS structure */ typedef struct servicestatus_struct{ char *host_name; char *description; char *plugin_output; char *long_plugin_output; char *perf_data; int max_attempts; int current_attempt; int status; time_t last_update; int has_been_checked; int should_be_scheduled; time_t last_check; time_t next_check; int check_options; int check_type; int checks_enabled; time_t last_state_change; time_t last_hard_state_change; int last_hard_state; time_t last_time_ok; time_t last_time_warning; time_t last_time_unknown; time_t last_time_critical; int state_type; time_t last_notification; time_t next_notification; int no_more_notifications; int notifications_enabled; int problem_has_been_acknowledged; int acknowledgement_type; int current_notification_number; int accept_passive_service_checks; int event_handler_enabled; int flap_detection_enabled; int is_flapping; double percent_state_change; double latency; double execution_time; int scheduled_downtime_depth; int failure_prediction_enabled; int process_performance_data; int obsess_over_service; struct servicestatus_struct *next; struct servicestatus_struct *nexthash; }servicestatus; /*************************** SERVICE STATES ***************************/ #define SERVICE_PENDING 1 #define SERVICE_OK 2 #define SERVICE_WARNING 4 #define SERVICE_UNKNOWN 8 #define SERVICE_CRITICAL 16 /**************************** HOST STATES ****************************/ #define HOST_PENDING 1 #define HOST_UP 2 #define HOST_DOWN 4 #define HOST_UNREACHABLE 8 /**************************** FUNCTIONS ******************************/ int read_status_data(char *,int); /* reads all status data */ int add_host_status(hoststatus *); /* adds a host status entry to the list in memory */ int add_service_status(servicestatus *); /* adds a service status entry to the list in memory */ int add_hoststatus_to_hashlist(hoststatus *); int add_servicestatus_to_hashlist(servicestatus *); servicestatus *find_servicestatus(char *,char *); /* finds status information for a specific service */ hoststatus *find_hoststatus(char *); /* finds status information for a specific host */ int get_servicestatus_count(char *,int); /* gets total number of services of a certain type for a specific host */ void free_status_data(void); /* free all memory allocated to status data */ #endif #ifdef NSCORE int initialize_status_data(char *); /* initializes status data at program start */ int update_all_status_data(void); /* updates all status data */ int cleanup_status_data(char *,int); /* cleans up status data at program termination */ int update_program_status(int); /* updates program status data */ int update_host_status(host *,int); /* updates host status data */ int update_service_status(service *,int); /* updates service status data */ int update_contact_status(contact *,int); /* updates contact status data */ #endif #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/comments.h0000644000175100017510000001206710550310754021005 0ustar baeckerhbaeckerh/***************************************************************************** * * COMMENTS.H - Header file for comment functions * * Copyright (c) 1999-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 12-26-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _COMMENTS_H #define _COMMENTS_H #include "config.h" #include "common.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif /**************************** COMMENT SOURCES ******************************/ #define COMMENTSOURCE_INTERNAL 0 #define COMMENTSOURCE_EXTERNAL 1 /***************************** COMMENT TYPES *******************************/ #define HOST_COMMENT 1 #define SERVICE_COMMENT 2 /****************************** ENTRY TYPES ********************************/ #define USER_COMMENT 1 #define DOWNTIME_COMMENT 2 #define FLAPPING_COMMENT 3 #define ACKNOWLEDGEMENT_COMMENT 4 /*************************** CHAINED HASH LIMITS ***************************/ #define COMMENT_HASHSLOTS 1024 /**************************** DATA STRUCTURES ******************************/ /* COMMENT structure */ typedef struct comment_struct{ int comment_type; int entry_type; unsigned long comment_id; int source; int persistent; time_t entry_time; int expires; time_t expire_time; char *host_name; char *service_description; char *author; char *comment_data; struct comment_struct *next; struct comment_struct *nexthash; }comment; #ifdef NSCORE int initialize_comment_data(char *); /* initializes comment data */ int cleanup_comment_data(char *); /* cleans up comment data */ int add_new_comment(int,int,char *,char *,time_t,char *,char *,int,int,int,time_t,unsigned long *); /* adds a new host or service comment */ int add_new_host_comment(int,char *,time_t,char *,char *,int,int,int,time_t,unsigned long *); /* adds a new host comment */ int add_new_service_comment(int,char *,char *,time_t,char *,char *,int,int,int,time_t,unsigned long *); /* adds a new service comment */ int delete_comment(int,unsigned long); /* deletes a host or service comment */ int delete_host_comment(unsigned long); /* deletes a host comment */ int delete_service_comment(unsigned long); /* deletes a service comment */ int delete_all_comments(int,char *,char *); /* deletes all comments for a particular host or service */ int delete_all_host_comments(char *); /* deletes all comments for a specific host */ int delete_host_acknowledgement_comments(host *); /* deletes all non-persistent ack comments for a specific host */ int delete_all_service_comments(char *,char *); /* deletes all comments for a specific service */ int delete_service_acknowledgement_comments(service *); /* deletes all non-persistent ack comments for a specific service */ int check_for_expired_comment(unsigned long); /* expires a comment */ #endif comment *find_comment(unsigned long,int); /* finds a specific comment */ comment *find_service_comment(unsigned long); /* finds a specific service comment */ comment *find_host_comment(unsigned long); /* finds a specific host comment */ comment *get_first_comment_by_host(char *); comment *get_next_comment_by_host(char *,comment *); int number_of_host_comments(char *); /* returns the number of comments associated with a particular host */ int number_of_service_comments(char *, char *); /* returns the number of comments associated with a particular service */ int add_comment(int,int,char *,char *,time_t,char *,char *,unsigned long,int,int,time_t,int); /* adds a comment (host or service) */ int add_host_comment(int,char *,time_t,char *,char *,unsigned long,int,int,time_t,int); /* adds a host comment */ int add_service_comment(int,char *,char *,time_t,char *,char *,unsigned long,int,int,time_t,int); /* adds a service comment */ int add_comment_to_hashlist(comment *); void free_comment_data(void); /* frees memory allocated to the comment list */ #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/config.h0000644000175100017510000000001410566132257020421 0ustar baeckerhbaeckerh/* empty */ ndoutils-1.4b9/include/nagios-3x/snprintf.h0000644000175100017510000000017110550310756021016 0ustar baeckerhbaeckerh/* include/snprintf.h. Generated by configure. */ /* -*- C -*- */ /* #undef HAVE_SNPRINTF */ /* #undef NEED_VA_LIST */ ndoutils-1.4b9/include/nagios-3x/nagios.h0000644000175100017510000012407010712143241020431 0ustar baeckerhbaeckerh/************************************************************************ * * Nagios Main Header File * Written By: Ethan Galstad (nagios@nagios.org) * Last Modified: 10-19-2007 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef _NAGIOS_H #define _NAGIOS_H #ifndef __GNUC__ # define __attribute__(x) /* nothing */ #endif #include "config.h" #include "common.h" #include "locations.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif /************* MISC LENGTH/SIZE DEFINITIONS ***********/ /* NOTE: Plugin length is artificially capped at 8k to prevent runaway plugins from returning MBs/GBs of data back to Nagios. If you increase the 8k cap by modifying this value, make sure you also increase the value of MAX_EXTERNAL_COMMAND_LENGTH in common.h to allow for passive checks results received through the external command file. EG 10/19/07 */ #define MAX_PLUGIN_OUTPUT_LENGTH 8192 /* max length of plugin output (including perf data) */ /******************* DEFAULT VALUES *******************/ #define DEFAULT_LOG_LEVEL 1 /* log all events to main log file */ #define DEFAULT_USE_SYSLOG 1 /* log events to syslog? 1=yes, 0=no */ #define DEFAULT_SYSLOG_LEVEL 2 /* log only severe events to syslog */ #define DEFAULT_NOTIFICATION_LOGGING 1 /* log notification events? 1=yes, 0=no */ #define DEFAULT_INTER_CHECK_DELAY 5.0 /* seconds between initial service check scheduling */ #define DEFAULT_INTERLEAVE_FACTOR 1 /* default interleave to use when scheduling checks */ #define DEFAULT_SLEEP_TIME 0.5 /* seconds between event run checks */ #define DEFAULT_INTERVAL_LENGTH 60 /* seconds per interval unit for check scheduling */ #define DEFAULT_RETRY_INTERVAL 30 /* services are retried in 30 seconds if they're not OK */ #define DEFAULT_COMMAND_CHECK_INTERVAL -1 /* interval to check for external commands (default = as often as possible) */ #define DEFAULT_CHECK_REAPER_INTERVAL 10 /* interval in seconds to reap host and service check results */ #define DEFAULT_MAX_REAPER_TIME 30 /* maximum number of seconds to spend reaping service checks before we break out for a while */ #define DEFAULT_MAX_CHECK_RESULT_AGE 3600 /* maximum number of seconds that a check result file is considered to be valid */ #define DEFAULT_MAX_PARALLEL_SERVICE_CHECKS 0 /* maximum number of service checks we can have running at any given time (0=unlimited) */ #define DEFAULT_RETENTION_UPDATE_INTERVAL 60 /* minutes between auto-save of retention data */ #define DEFAULT_RETENTION_SCHEDULING_HORIZON 900 /* max seconds between program restarts that we will preserve scheduling information */ #define DEFAULT_STATUS_UPDATE_INTERVAL 60 /* seconds between aggregated status data updates */ #define DEFAULT_FRESHNESS_CHECK_INTERVAL 60 /* seconds between service result freshness checks */ #define DEFAULT_AUTO_RESCHEDULING_INTERVAL 30 /* seconds between host and service check rescheduling events */ #define DEFAULT_AUTO_RESCHEDULING_WINDOW 180 /* window of time (in seconds) for which we should reschedule host and service checks */ #define DEFAULT_ORPHAN_CHECK_INTERVAL 60 /* seconds between checks for orphaned hosts and services */ #define DEFAULT_NOTIFICATION_TIMEOUT 30 /* max time in seconds to wait for notification commands to complete */ #define DEFAULT_EVENT_HANDLER_TIMEOUT 30 /* max time in seconds to wait for event handler commands to complete */ #define DEFAULT_HOST_CHECK_TIMEOUT 30 /* max time in seconds to wait for host check commands to complete */ #define DEFAULT_SERVICE_CHECK_TIMEOUT 60 /* max time in seconds to wait for service check commands to complete */ #define DEFAULT_OCSP_TIMEOUT 15 /* max time in seconds to wait for obsessive compulsive processing commands to complete */ #define DEFAULT_OCHP_TIMEOUT 15 /* max time in seconds to wait for obsessive compulsive processing commands to complete */ #define DEFAULT_PERFDATA_TIMEOUT 5 /* max time in seconds to wait for performance data commands to complete */ #define DEFAULT_TIME_CHANGE_THRESHOLD 900 /* compensate for time changes of more than 15 minutes */ #define DEFAULT_LOG_HOST_RETRIES 0 /* don't log host retries */ #define DEFAULT_LOG_SERVICE_RETRIES 0 /* don't log service retries */ #define DEFAULT_LOG_EVENT_HANDLERS 1 /* log event handlers */ #define DEFAULT_LOG_INITIAL_STATES 0 /* don't log initial service and host states */ #define DEFAULT_LOG_EXTERNAL_COMMANDS 1 /* log external commands */ #define DEFAULT_LOG_PASSIVE_CHECKS 1 /* log passive service checks */ #define DEFAULT_DEBUG_LEVEL 0 /* don't log any debugging information */ #define DEFAULT_DEBUG_VERBOSITY 1 #define DEFAULT_MAX_DEBUG_FILE_SIZE 1000000 /* max size of debug log */ #define DEFAULT_AGGRESSIVE_HOST_CHECKING 0 /* don't use "aggressive" host checking */ #define DEFAULT_CHECK_EXTERNAL_COMMANDS 1 /* check for external commands */ #define DEFAULT_CHECK_ORPHANED_SERVICES 1 /* check for orphaned services */ #define DEFAULT_CHECK_ORPHANED_HOSTS 1 /* check for orphaned hosts */ #define DEFAULT_ENABLE_FLAP_DETECTION 0 /* don't enable flap detection */ #define DEFAULT_PROCESS_PERFORMANCE_DATA 0 /* don't process performance data */ #define DEFAULT_CHECK_SERVICE_FRESHNESS 1 /* check service result freshness */ #define DEFAULT_CHECK_HOST_FRESHNESS 0 /* don't check host result freshness */ #define DEFAULT_AUTO_RESCHEDULE_CHECKS 0 /* don't auto-reschedule host and service checks */ #define DEFAULT_TRANSLATE_PASSIVE_HOST_CHECKS 0 /* should we translate DOWN/UNREACHABLE passive host checks? */ #define DEFAULT_PASSIVE_HOST_CHECKS_SOFT 0 /* passive host checks are treated as HARD by default */ #define DEFAULT_LOW_SERVICE_FLAP_THRESHOLD 20.0 /* low threshold for detection of service flapping */ #define DEFAULT_HIGH_SERVICE_FLAP_THRESHOLD 30.0 /* high threshold for detection of service flapping */ #define DEFAULT_LOW_HOST_FLAP_THRESHOLD 20.0 /* low threshold for detection of host flapping */ #define DEFAULT_HIGH_HOST_FLAP_THRESHOLD 30.0 /* high threshold for detection of host flapping */ #define DEFAULT_HOST_CHECK_SPREAD 30 /* max minutes to schedule all initial host checks */ #define DEFAULT_SERVICE_CHECK_SPREAD 30 /* max minutes to schedule all initial service checks */ #define DEFAULT_CACHED_HOST_CHECK_HORIZON 15 /* max age in seconds that cached host checks can be used */ #define DEFAULT_CACHED_SERVICE_CHECK_HORIZON 15 /* max age in seconds that cached service checks can be used */ #define DEFAULT_ENABLE_PREDICTIVE_HOST_DEPENDENCY_CHECKS 1 /* should we use predictive host dependency checks? */ #define DEFAULT_ENABLE_PREDICTIVE_SERVICE_DEPENDENCY_CHECKS 1 /* should we use predictive service dependency checks? */ #define DEFAULT_USE_LARGE_INSTALLATION_TWEAKS 0 /* don't use tweaks for large Nagios installations */ #define DEFAULT_ENABLE_EMBEDDED_PERL 1 /* enable embedded Perl interpreter (if compiled in) */ #define DEFAULT_USE_EMBEDDED_PERL_IMPLICITLY 1 /* by default, embedded Perl is used for Perl plugins that don't explicitly disable it */ #define DEFAULT_ADDITIONAL_FRESHNESS_LATENCY 15 /* seconds to be added to freshness thresholds when automatically calculated by Nagios */ /******************* LOGGING TYPES ********************/ #define NSLOG_RUNTIME_ERROR 1 #define NSLOG_RUNTIME_WARNING 2 #define NSLOG_VERIFICATION_ERROR 4 #define NSLOG_VERIFICATION_WARNING 8 #define NSLOG_CONFIG_ERROR 16 #define NSLOG_CONFIG_WARNING 32 #define NSLOG_PROCESS_INFO 64 #define NSLOG_EVENT_HANDLER 128 /*#define NSLOG_NOTIFICATION 256*/ /* NOT USED ANYMORE - CAN BE REUSED */ #define NSLOG_EXTERNAL_COMMAND 512 #define NSLOG_HOST_UP 1024 #define NSLOG_HOST_DOWN 2048 #define NSLOG_HOST_UNREACHABLE 4096 #define NSLOG_SERVICE_OK 8192 #define NSLOG_SERVICE_UNKNOWN 16384 #define NSLOG_SERVICE_WARNING 32768 #define NSLOG_SERVICE_CRITICAL 65536 #define NSLOG_PASSIVE_CHECK 131072 #define NSLOG_INFO_MESSAGE 262144 #define NSLOG_HOST_NOTIFICATION 524288 #define NSLOG_SERVICE_NOTIFICATION 1048576 /***************** DEBUGGING LEVELS *******************/ #define DEBUGL_ALL -1 #define DEBUGL_NONE 0 #define DEBUGL_FUNCTIONS 1 #define DEBUGL_CONFIG 2 #define DEBUGL_PROCESS 4 #define DEBUGL_STATUSDATA 4 #define DEBUGL_RETENTIONDATA 4 #define DEBUGL_EVENTS 8 #define DEBUGL_CHECKS 16 #define DEBUGL_IPC 16 #define DEBUGL_FLAPPING 16 #define DEBUGL_EVENTHANDLERS 16 #define DEBUGL_PERFDATA 16 #define DEBUGL_NOTIFICATIONS 32 #define DEBUGL_EVENTBROKER 64 #define DEBUGL_EXTERNALCOMMANDS 128 #define DEBUGL_COMMANDS 256 #define DEBUGL_DOWNTIME 512 #define DEBUGL_COMMENTS 1024 #define DEBUGL_MACROS 2048 #define DEBUGV_BASIC 0 #define DEBUGV_MORE 1 #define DEBUGV_MOST 2 /******************** HOST STATUS *********************/ #define HOST_UP 0 #define HOST_DOWN 1 #define HOST_UNREACHABLE 2 /******************* STATE LOGGING TYPES **************/ #define INITIAL_STATES 1 #define CURRENT_STATES 2 /************ SERVICE DEPENDENCY VALUES ***************/ #define DEPENDENCIES_OK 0 #define DEPENDENCIES_FAILED 1 /*********** ROUTE CHECK PROPAGATION TYPES ************/ #define PROPAGATE_TO_PARENT_HOSTS 1 #define PROPAGATE_TO_CHILD_HOSTS 2 /****************** SERVICE STATES ********************/ #define STATE_OK 0 #define STATE_WARNING 1 #define STATE_CRITICAL 2 #define STATE_UNKNOWN 3 /* changed from -1 on 02/24/2001 */ /****************** FLAPPING TYPES ********************/ #define HOST_FLAPPING 0 #define SERVICE_FLAPPING 1 /**************** NOTIFICATION TYPES ******************/ #define HOST_NOTIFICATION 0 #define SERVICE_NOTIFICATION 1 /************* NOTIFICATION REASON TYPES ***************/ #define NOTIFICATION_NORMAL 0 #define NOTIFICATION_ACKNOWLEDGEMENT 1 #define NOTIFICATION_FLAPPINGSTART 2 #define NOTIFICATION_FLAPPINGSTOP 3 #define NOTIFICATION_FLAPPINGDISABLED 4 #define NOTIFICATION_DOWNTIMESTART 5 #define NOTIFICATION_DOWNTIMEEND 6 #define NOTIFICATION_DOWNTIMECANCELLED 7 #define NOTIFICATION_CUSTOM 99 /**************** EVENT HANDLER TYPES *****************/ #define HOST_EVENTHANDLER 0 #define SERVICE_EVENTHANDLER 1 #define GLOBAL_HOST_EVENTHANDLER 2 #define GLOBAL_SERVICE_EVENTHANDLER 3 /***************** STATE CHANGE TYPES *****************/ #define HOST_STATECHANGE 0 #define SERVICE_STATECHANGE 1 /***************** OBJECT CHECK TYPES *****************/ #define SERVICE_CHECK 0 #define HOST_CHECK 1 /******************* EVENT TYPES **********************/ #define EVENT_SERVICE_CHECK 0 /* active service check */ #define EVENT_COMMAND_CHECK 1 /* external command check */ #define EVENT_LOG_ROTATION 2 /* log file rotation */ #define EVENT_PROGRAM_SHUTDOWN 3 /* program shutdown */ #define EVENT_PROGRAM_RESTART 4 /* program restart */ #define EVENT_CHECK_REAPER 5 /* reaps results from host and service checks */ #define EVENT_ORPHAN_CHECK 6 /* checks for orphaned hosts and services */ #define EVENT_RETENTION_SAVE 7 /* save (dump) retention data */ #define EVENT_STATUS_SAVE 8 /* save (dump) status data */ #define EVENT_SCHEDULED_DOWNTIME 9 /* scheduled host or service downtime */ #define EVENT_SFRESHNESS_CHECK 10 /* checks service result "freshness" */ #define EVENT_EXPIRE_DOWNTIME 11 /* checks for (and removes) expired scheduled downtime */ #define EVENT_HOST_CHECK 12 /* active host check */ #define EVENT_HFRESHNESS_CHECK 13 /* checks host result "freshness" */ #define EVENT_RESCHEDULE_CHECKS 14 /* adjust scheduling of host and service checks */ #define EVENT_EXPIRE_COMMENT 15 /* removes expired comments */ #define EVENT_SLEEP 98 /* asynchronous sleep event that occurs when event queues are empty */ #define EVENT_USER_FUNCTION 99 /* USER-defined function (modules) */ /******* INTER-CHECK DELAY CALCULATION TYPES **********/ #define ICD_NONE 0 /* no inter-check delay */ #define ICD_DUMB 1 /* dumb delay of 1 second */ #define ICD_SMART 2 /* smart delay */ #define ICD_USER 3 /* user-specified delay */ /******* INTERLEAVE FACTOR CALCULATION TYPES **********/ #define ILF_USER 0 /* user-specified interleave factor */ #define ILF_SMART 1 /* smart interleave */ /************ SCHEDULED DOWNTIME TYPES ****************/ #define ACTIVE_DOWNTIME 0 /* active downtime - currently in effect */ #define PENDING_DOWNTIME 1 /* pending downtime - scheduled for the future */ /****************** DATA STRUCTURES *******************/ /* TIMED_EVENT structure */ typedef struct timed_event_struct{ int event_type; time_t run_time; int recurring; unsigned long event_interval; int compensate_for_time_change; void *timing_func; void *event_data; void *event_args; int event_options; struct timed_event_struct *next; struct timed_event_struct *prev; }timed_event; /* NOTIFY_LIST structure */ typedef struct notify_list_struct{ contact *contact; struct notify_list_struct *next; }notification; /* CHECK_RESULT structure */ typedef struct check_result_struct{ int object_check_type; /* is this a service or a host check? */ char *host_name; /* host name */ char *service_description; /* service description */ int check_type; /* was this an active or passive service check? */ int check_options; int scheduled_check; /* was this a scheduled or an on-demand check? */ int reschedule_check; /* should we reschedule the next check */ char *output_file; /* what file is the output stored in? */ FILE *output_file_fp; int output_file_fd; double latency; struct timeval start_time; /* time the service check was initiated */ struct timeval finish_time; /* time the service check was completed */ int early_timeout; /* did the service check timeout? */ int exited_ok; /* did the plugin check return okay? */ int return_code; /* plugin return code */ char *output; /* plugin output */ struct check_result_struct *next; }check_result; /* SCHED_INFO structure */ typedef struct sched_info_struct{ int total_services; int total_scheduled_services; int total_hosts; int total_scheduled_hosts; double average_services_per_host; double average_scheduled_services_per_host; unsigned long service_check_interval_total; unsigned long host_check_interval_total; double average_service_execution_time; double average_service_check_interval; double average_host_check_interval; double average_service_inter_check_delay; double average_host_inter_check_delay; double service_inter_check_delay; double host_inter_check_delay; int service_interleave_factor; int max_service_check_spread; int max_host_check_spread; time_t first_service_check; time_t last_service_check; time_t first_host_check; time_t last_host_check; }sched_info; /* PASSIVE_CHECK_RESULT structure */ typedef struct passive_check_result_struct{ int object_check_type; char *host_name; char *service_description; int return_code; char *output; time_t check_time; double latency; struct passive_check_result_struct *next; }passive_check_result; /* CIRCULAR_BUFFER structure - used by worker threads */ typedef struct circular_buffer_struct{ void **buffer; int tail; int head; int items; int high; /* highest number of items that has ever been stored in buffer */ unsigned long overflow; pthread_mutex_t buffer_lock; }circular_buffer; /* MMAPFILE structure - used for reading files via mmap() */ typedef struct mmapfile_struct{ char *path; int mode; int fd; unsigned long file_size; unsigned long current_position; unsigned long current_line; void *mmap_buf; }mmapfile; /* DBUF structure - dynamic string storage */ typedef struct dbuf_struct{ char *buf; unsigned long used_size; unsigned long allocated_size; unsigned long chunk_size; }dbuf; #define CHECK_STATS_BUCKETS 15 /* used for tracking host and service check statistics */ typedef struct check_stats_struct{ int current_bucket; int bucket[CHECK_STATS_BUCKETS]; int overflow_bucket; int minute_stats[3]; time_t last_update; }check_stats; /******************* THREAD STUFF ********************/ /* slots in circular buffers */ #define DEFAULT_EXTERNAL_COMMAND_BUFFER_SLOTS 4096 /* worker threads */ #define TOTAL_WORKER_THREADS 1 #define COMMAND_WORKER_THREAD 0 /******************** FUNCTIONS **********************/ /**** Configuration Functions ****/ int read_main_config_file(char *); /* reads the main config file (nagios.cfg) */ int read_resource_file(char *); /* processes macros in resource file */ int read_all_object_data(char *); /* reads all object config data */ /**** Setup Functions ****/ int pre_flight_check(void); /* try and verify the configuration data */ int pre_flight_object_check(int *,int *); /* verify object relationships and settings */ int pre_flight_circular_check(int *,int *); /* detects circular dependencies and paths */ void init_timing_loop(void); /* setup the initial scheduling queue */ void setup_sighandler(void); /* trap signals */ void reset_sighandler(void); /* reset signals to default action */ int daemon_init(void); /* switches to daemon mode */ int drop_privileges(char *,char *); /* drops privileges before startup */ void display_scheduling_info(void); /* displays service check scheduling information */ /**** IPC Functions ****/ int move_check_result_to_queue(char *); int process_check_result_queue(char *); int process_check_result_file(char *); int add_check_result_to_list(check_result *); check_result *read_check_result(void); /* reads a host/service check result from the list in memory */ int free_check_result_list(void); int init_check_result(check_result *); int free_check_result(check_result *); /* frees memory associated with a host/service check result */ int parse_check_output(char *,char **,char **,char **,int,int); int open_command_file(void); /* creates the external command file as a named pipe (FIFO) and opens it for reading */ int close_command_file(void); /* closes and deletes the external command file (FIFO) */ /**** Monitoring/Event Handler Functions ****/ int schedule_new_event(int,int,time_t,int,unsigned long,void *,int,void *,void *,int); /* schedules a new timed event */ void reschedule_event(timed_event *,timed_event **,timed_event **); /* reschedules an event */ void add_event(timed_event *,timed_event **,timed_event **); /* adds an event to the execution queue */ void remove_event(timed_event *,timed_event **,timed_event **); /* remove an event from the execution queue */ int event_execution_loop(void); /* main monitoring/event handler loop */ int handle_timed_event(timed_event *); /* top level handler for timed events */ int check_service_dependencies(service *,int); /* checks service dependencies */ int check_host_dependencies(host *,int); /* checks host dependencies */ void check_for_orphaned_services(void); /* checks for orphaned services */ void check_for_orphaned_hosts(void); /* checks for orphaned hosts */ void check_service_result_freshness(void); /* checks the "freshness" of service check results */ int is_service_result_fresh(service *,time_t,int); /* determines if a service's check results are fresh */ void check_host_result_freshness(void); /* checks the "freshness" of host check results */ int is_host_result_fresh(host *,time_t,int); /* determines if a host's check results are fresh */ void adjust_check_scheduling(void); /* auto-adjusts scheduling of host and service checks */ int my_system(char *,int,int *,double *,char **,int); /* executes a command via popen(), but also protects against timeouts */ void compensate_for_system_time_change(unsigned long,unsigned long); /* attempts to compensate for a change in the system time */ void adjust_timestamp_for_time_change(time_t,time_t,unsigned long,time_t *); /* adjusts a timestamp variable for a system time change */ void resort_event_list(timed_event **,timed_event **); /* resorts event list by event run time for system time changes */ /**** Flap Detection Functions ****/ void check_for_service_flapping(service *,int); /* determines whether or not a service is "flapping" between states */ void check_for_host_flapping(host *,int,int); /* determines whether or not a host is "flapping" between states */ void set_service_flap(service *,double,double,double); /* handles a service that is flapping */ void clear_service_flap(service *,double,double,double); /* handles a service that has stopped flapping */ void set_host_flap(host *,double,double,double); /* handles a host that is flapping */ void clear_host_flap(host *,double,double,double); /* handles a host that has stopped flapping */ void enable_flap_detection_routines(void); /* enables flap detection on a program-wide basis */ void disable_flap_detection_routines(void); /* disables flap detection on a program-wide basis */ void enable_host_flap_detection(host *); /* enables flap detection for a particular host */ void disable_host_flap_detection(host *); /* disables flap detection for a particular host */ void enable_service_flap_detection(service *); /* enables flap detection for a particular service */ void disable_service_flap_detection(service *); /* disables flap detection for a particular service */ void handle_host_flap_detection_disabled(host *); /* handles the details when flap detection is disabled globally or on a per-host basis */ void handle_service_flap_detection_disabled(service *); /* handles the details when flap detection is disabled globally or on a per-service basis */ /**** Route/Host Check Functions ****/ /**** Event Handler Functions ****/ int obsessive_compulsive_service_check_processor(service *); /* distributed monitoring craziness... */ int obsessive_compulsive_host_check_processor(host *); /* distributed monitoring craziness... */ int handle_service_event(service *); /* top level service event logic */ int run_service_event_handler(service *); /* runs the event handler for a specific service */ int run_global_service_event_handler(service *); /* runs the global service event handler */ int handle_host_event(host *); /* top level host event logic */ int run_host_event_handler(host *); /* runs the event handler for a specific host */ int run_global_host_event_handler(host *); /* runs the global host event handler */ /**** Notification Functions ****/ int check_service_notification_viability(service *,int,int); /* checks viability of notifying all contacts about a service */ int is_valid_escalation_for_service_notification(service *,serviceescalation *,int); /* checks if an escalation entry is valid for a particular service notification */ int should_service_notification_be_escalated(service *); /* checks if a service notification should be escalated */ int service_notification(service *,int,char *,char *,int); /* notify all contacts about a service (problem or recovery) */ int check_contact_service_notification_viability(contact *,service *,int,int); /* checks viability of notifying a contact about a service */ int notify_contact_of_service(contact *,service *,int,char *,char *,int,int); /* notify a single contact about a service */ int check_host_notification_viability(host *,int,int); /* checks viability of notifying all contacts about a host */ int is_valid_escalation_for_host_notification(host *,hostescalation *,int); /* checks if an escalation entry is valid for a particular host notification */ int should_host_notification_be_escalated(host *); /* checks if a host notification should be escalated */ int host_notification(host *,int,char *,char *,int); /* notify all contacts about a host (problem or recovery) */ int check_contact_host_notification_viability(contact *,host *,int,int); /* checks viability of notifying a contact about a host */ int notify_contact_of_host(contact *,host *,int,char *,char *,int,int); /* notify a single contact about a host */ int create_notification_list_from_host(host *,int,int *); /* given a host, create list of contacts to be notified (remove duplicates) */ int create_notification_list_from_service(service *,int,int *); /* given a service, create list of contacts to be notified (remove duplicates) */ int add_notification(contact *); /* adds a notification instance */ notification *find_notification(contact *); /* finds a notification object */ time_t get_next_host_notification_time(host *,time_t); /* calculates nex acceptable re-notification time for a host */ time_t get_next_service_notification_time(service *,time_t); /* calculates nex acceptable re-notification time for a service */ /**** Logging Functions ****/ void logit(int,int,const char *, ...) __attribute__((__format__(__printf__, 3, 4))); int write_to_logs_and_console(char *,unsigned long,int); /* writes a string to screen and logs */ int write_to_console(char *); /* writes a string to screen */ int write_to_all_logs(char *,unsigned long); /* writes a string to main log file and syslog facility */ int write_to_all_logs_with_timestamp(char *,unsigned long,time_t *); /* writes a string to main log file and syslog facility */ int write_to_log(char *,unsigned long,time_t *); /* write a string to the main log file */ int write_to_syslog(char *,unsigned long); /* write a string to the syslog facility */ int log_service_event(service *); /* logs a service event */ int log_host_event(host *); /* logs a host event */ int log_host_states(int,time_t *); /* logs initial/current host states */ int log_service_states(int,time_t *); /* logs initial/current service states */ int rotate_log_file(time_t); /* rotates the main log file */ int write_log_file_info(time_t *); /* records log file/version info */ int open_debug_log(void); int log_debug_info(int,int,const char *,...) __attribute__((__format__(__printf__, 3, 4))); int close_debug_log(void); /**** Cleanup Functions ****/ void cleanup(void); /* cleanup after ourselves (before quitting or restarting) */ void free_memory(void); /* free memory allocated to all linked lists in memory */ int reset_variables(void); /* reset all global variables */ void free_notification_list(void); /* frees all memory allocated to the notification list */ /**** Hash Functions ****/ int hashfunc(const char *name1, const char *name2, int hashslots); int compare_hashdata(const char *,const char *,const char *,const char *); /**** Miscellaneous Functions ****/ void sighandler(int); /* handles signals */ void service_check_sighandler(int); /* handles timeouts when executing service checks */ void host_check_sighandler(int); /* handles timeouts when executing host checks */ void my_system_sighandler(int); /* handles timeouts when executing commands via my_system() */ void file_lock_sighandler(int); /* handles timeouts while waiting for file locks */ void strip(char *); /* strips whitespace from string */ char *my_strtok(char *,char *); /* my replacement for strtok() function (doesn't skip consecutive tokens) */ char *my_strsep(char **,const char *); /* Solaris doesn't have strsep(), so I took this from the glibc source code */ #ifdef REMOVED_10182007 int my_free(void **); /* my wrapper for free() */ #endif int compare_strings(char *,char *); /* compares two strings for equality */ char *escape_newlines(char *); int contains_illegal_object_chars(char *); /* tests whether or not an object name (host, service, etc.) contains illegal characters */ int my_rename(char *,char *); /* renames a file - works across filesystems */ int get_raw_command_line(command *,char *,char **,int); /* given a raw command line, determine the actual command to run */ int check_time_against_period(time_t,timeperiod *); /* check to see if a specific time is covered by a time period */ int is_daterange_single_day(daterange *); time_t calculate_time_from_weekday_of_month(int,int,int,int); /* calculates midnight time of specific (3rd, last, etc.) weekday of a particular month */ time_t calculate_time_from_day_of_month(int,int,int); /* calculates midnight time of specific (1st, last, etc.) day of a particular month */ void get_next_valid_time(time_t, time_t *,timeperiod *); /* get the next valid time in a time period */ void get_datetime_string(time_t *,char *,int,int); /* get a date/time string for use in output */ void get_time_breakdown(unsigned long,int *,int *,int *, int *); time_t get_next_log_rotation_time(void); /* determine the next time to schedule a log rotation */ int init_embedded_perl(char **); /* initialized embedded perl interpreter */ int deinit_embedded_perl(void); /* cleans up embedded perl */ int file_uses_embedded_perl(char *); /* tests whether or not the embedded perl interpreter should be used on a file */ int dbuf_init(dbuf *,int); int dbuf_free(dbuf *); int dbuf_strcat(dbuf *,char *); /**** External Command Functions ****/ int check_for_external_commands(void); /* checks for any external commands */ int process_external_command1(char *); /* top-level external command processor */ int process_external_command2(int,time_t,char *); /* process an external command */ int process_external_commands_from_file(char *,int); /* process external commands in a file */ int process_host_command(int,time_t,char *); /* process an external host command */ int process_hostgroup_command(int,time_t,char *); /* process an external hostgroup command */ int process_service_command(int,time_t,char *); /* process an external service command */ int process_servicegroup_command(int,time_t,char *); /* process an external servicegroup command */ int process_contact_command(int,time_t,char *); /* process an external contact command */ int process_contactgroup_command(int,time_t,char *); /* process an external contactgroup command */ /**** External Command Implementations ****/ int cmd_add_comment(int,time_t,char *); /* add a service or host comment */ int cmd_delete_comment(int,char *); /* delete a service or host comment */ int cmd_delete_all_comments(int,char *); /* delete all comments associated with a host or service */ int cmd_delay_notification(int,char *); /* delay a service or host notification */ int cmd_schedule_service_check(int,char *,int); /* schedule an immediate or delayed service check */ int cmd_schedule_check(int,char *); /* schedule an immediate or delayed host check */ int cmd_schedule_host_service_checks(int,char *,int); /* schedule an immediate or delayed checks of all services on a host */ int cmd_signal_process(int,char *); /* schedules a program shutdown or restart */ int cmd_process_service_check_result(int,time_t,char *); /* processes a passive service check */ int cmd_process_host_check_result(int,time_t,char *); /* processes a passive host check */ int cmd_acknowledge_problem(int,char *); /* acknowledges a host or service problem */ int cmd_remove_acknowledgement(int,char *); /* removes a host or service acknowledgement */ int cmd_schedule_downtime(int,time_t,char *); /* schedules host or service downtime */ int cmd_delete_downtime(int,char *); /* cancels active/pending host or service scheduled downtime */ int cmd_change_object_int_var(int,char *); /* changes host/svc (int) variable */ int cmd_change_object_char_var(int,char *); /* changes host/svc (char) variable */ int cmd_change_object_custom_var(int,char *); /* changes host/svc custom variable */ int cmd_process_external_commands_from_file(int,char *); /* process external commands from a file */ int process_passive_service_check(time_t,char *,char *,int,char *); int process_passive_host_check(time_t,char *,int,char *); /**** Internal Command Implementations ****/ void disable_service_checks(service *); /* disables a service check */ void enable_service_checks(service *); /* enables a service check */ void schedule_service_check(service *,time_t,int); /* schedules an immediate or delayed service check */ void schedule_host_check(host *,time_t,int); /* schedules an immediate or delayed host check */ void enable_all_notifications(void); /* enables notifications on a program-wide basis */ void disable_all_notifications(void); /* disables notifications on a program-wide basis */ void enable_service_notifications(service *); /* enables service notifications */ void disable_service_notifications(service *); /* disables service notifications */ void enable_host_notifications(host *); /* enables host notifications */ void disable_host_notifications(host *); /* disables host notifications */ void enable_and_propagate_notifications(host *,int,int,int,int); /* enables notifications for all hosts and services beyond a given host */ void disable_and_propagate_notifications(host *,int,int,int,int); /* disables notifications for all hosts and services beyond a given host */ void schedule_and_propagate_downtime(host *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long); /* schedules downtime for all hosts beyond a given host */ void acknowledge_host_problem(host *,char *,char *,int,int,int); /* acknowledges a host problem */ void acknowledge_service_problem(service *,char *,char *,int,int,int); /* acknowledges a service problem */ void remove_host_acknowledgement(host *); /* removes a host acknowledgement */ void remove_service_acknowledgement(service *); /* removes a service acknowledgement */ void start_executing_service_checks(void); /* starts executing service checks */ void stop_executing_service_checks(void); /* stops executing service checks */ void start_accepting_passive_service_checks(void); /* starts accepting passive service check results */ void stop_accepting_passive_service_checks(void); /* stops accepting passive service check results */ void enable_passive_service_checks(service *); /* enables passive service checks for a particular service */ void disable_passive_service_checks(service *); /* disables passive service checks for a particular service */ void start_using_event_handlers(void); /* enables event handlers on a program-wide basis */ void stop_using_event_handlers(void); /* disables event handlers on a program-wide basis */ void enable_service_event_handler(service *); /* enables the event handler for a particular service */ void disable_service_event_handler(service *); /* disables the event handler for a particular service */ void enable_host_event_handler(host *); /* enables the event handler for a particular host */ void disable_host_event_handler(host *); /* disables the event handler for a particular host */ void enable_host_checks(host *); /* enables checks of a particular host */ void disable_host_checks(host *); /* disables checks of a particular host */ void start_obsessing_over_service_checks(void); /* start obsessing about service check results */ void stop_obsessing_over_service_checks(void); /* stop obsessing about service check results */ void start_obsessing_over_host_checks(void); /* start obsessing about host check results */ void stop_obsessing_over_host_checks(void); /* stop obsessing about host check results */ void enable_service_freshness_checks(void); /* enable service freshness checks */ void disable_service_freshness_checks(void); /* disable service freshness checks */ void enable_host_freshness_checks(void); /* enable host freshness checks */ void disable_host_freshness_checks(void); /* disable host freshness checks */ void process_passive_checks(void); /* processes passive host and service check results */ void enable_all_failure_prediction(void); /* enables failure prediction on a program-wide basis */ void disable_all_failure_prediction(void); /* disables failure prediction on a program-wide basis */ void enable_performance_data(void); /* enables processing of performance data on a program-wide basis */ void disable_performance_data(void); /* disables processing of performance data on a program-wide basis */ void start_executing_host_checks(void); /* starts executing host checks */ void stop_executing_host_checks(void); /* stops executing host checks */ void start_accepting_passive_host_checks(void); /* starts accepting passive host check results */ void stop_accepting_passive_host_checks(void); /* stops accepting passive host check results */ void enable_passive_host_checks(host *); /* enables passive host checks for a particular host */ void disable_passive_host_checks(host *); /* disables passive host checks for a particular host */ void start_obsessing_over_service(service *); /* start obsessing about specific service check results */ void stop_obsessing_over_service(service *); /* stop obsessing about specific service check results */ void start_obsessing_over_host(host *); /* start obsessing about specific host check results */ void stop_obsessing_over_host(host *); /* stop obsessing about specific host check results */ void set_host_notification_number(host *,int); /* sets current notification number for a specific host */ void set_service_notification_number(service *,int); /* sets current notification number for a specific service */ void enable_contact_host_notifications(contact *); /* enables host notifications for a specific contact */ void disable_contact_host_notifications(contact *); /* disables host notifications for a specific contact */ void enable_contact_service_notifications(contact *); /* enables service notifications for a specific contact */ void disable_contact_service_notifications(contact *); /* disables service notifications for a specific contact */ int init_check_result_worker_thread(void); int shutdown_check_result_worker_thread(void); void * check_result_worker_thread(void *); void cleanup_check_result_worker_thread(void *); int init_command_file_worker_thread(void); int shutdown_command_file_worker_thread(void); void * command_file_worker_thread(void *); void cleanup_command_file_worker_thread(void *); int submit_external_command(char *,int *); int submit_raw_external_command(char *,time_t *,int *); char *get_program_version(void); char *get_program_modification_date(void); mmapfile *mmap_fopen(char *); /* open a file read-only via mmap() */ int mmap_fclose(mmapfile *); char *mmap_fgets(mmapfile *); char *mmap_fgets_multiline(mmapfile *); /***** HOST CHECK FUNCTIONS FOR 2.X *****/ int handle_host_state(host *); /* top level host state handler */ /***** NEW HOST CHECK FUNCTIONS FOR 3.X *****/ int check_host_check_viability_3x(host *,int,int *,time_t *); int adjust_host_check_attempt_3x(host *,int); int determine_host_reachability(host *); int process_host_check_result_3x(host *,int,char *,int,int,int,unsigned long); int perform_on_demand_host_check_3x(host *,int *,int,int,unsigned long); int run_sync_host_check_3x(host *,int *,int,int,unsigned long); int execute_sync_host_check_3x(host *); int run_scheduled_host_check_3x(host *,int,double); int run_async_host_check_3x(host *,int,double,int,int,int *,time_t *); int handle_async_host_check_result_3x(host *,check_result *); /***** COMMON HOST CHECK FUNCTIONS FOR 2.X and 3.X *****/ int perform_on_demand_host_check(host *,int *,int,int,unsigned long); int perform_scheduled_host_check(host *,int,double); /***** COMMON FUNCTIONS *****/ int reap_check_results(void); /***** SERVICE CHECK FUNCTIONS *****/ int check_service_check_viability_3x(service *,int,int *,time_t *); int run_scheduled_service_check(service *,int,double); int run_async_service_check(service *,int,double,int,int,int *,time_t *); int handle_async_service_check_result(service *,check_result *); /***** CHECK STATISTICS FUNCTIONS *****/ int init_check_stats(void); int update_check_stats(int,time_t); int generate_check_stats(void); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/getcgi.h0000644000175100017510000000066010550310754020416 0ustar baeckerhbaeckerh/****************************************************** * * GETCGI.H - Nagios CGI Input Routine Include File * * Last Modified: 11-25-2005 * *****************************************************/ #ifdef __cplusplus extern "C" { #endif char **getcgivars(void); void free_cgivars(char **); void unescape_cgi_input(char *); void sanitize_cgi_input(char **); unsigned char hex_to_char(char *); #ifdef __cplusplus } #endif ndoutils-1.4b9/include/nagios-3x/perfdata.h0000644000175100017510000000272510550310756020750 0ustar baeckerhbaeckerh/***************************************************************************** * * PERFDATA.H - Include file for performance data routines * * Copyright (c) 2001-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-25-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _PERFDATA_H #define _PERFDATA_H #include "objects.h" #ifdef __cplusplus extern "C" { #endif int initialize_performance_data(char *); /* initializes performance data */ int cleanup_performance_data(char *); /* cleans up performance data */ int update_host_performance_data(host *); /* updates host performance data */ int update_service_performance_data(service *); /* updates service performance data */ #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/broker.h0000644000175100017510000002434210550310754020443 0ustar baeckerhbaeckerh/***************************************************************************** * * BROKER.H - Event broker includes for Nagios * * Copyright (c) 2002-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 12-12-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _BROKER_H #define _BROKER_H #include "config.h" #include "nagios.h" #ifdef __cplusplus extern "C" { #endif /*************** EVENT BROKER OPTIONS *****************/ #define BROKER_NOTHING 0 #define BROKER_EVERYTHING 1048575 #define BROKER_PROGRAM_STATE 1 /* DONE */ #define BROKER_TIMED_EVENTS 2 /* DONE */ #define BROKER_SERVICE_CHECKS 4 /* DONE */ #define BROKER_HOST_CHECKS 8 /* DONE */ #define BROKER_EVENT_HANDLERS 16 /* DONE */ #define BROKER_LOGGED_DATA 32 /* DONE */ #define BROKER_NOTIFICATIONS 64 /* DONE */ #define BROKER_FLAPPING_DATA 128 /* DONE */ #define BROKER_COMMENT_DATA 256 /* DONE */ #define BROKER_DOWNTIME_DATA 512 /* DONE */ #define BROKER_SYSTEM_COMMANDS 1024 /* DONE */ #define BROKER_OCP_DATA 2048 /* DONE */ #define BROKER_STATUS_DATA 4096 /* DONE */ #define BROKER_ADAPTIVE_DATA 8192 /* DONE */ #define BROKER_EXTERNALCOMMAND_DATA 16384 /* DONE */ #define BROKER_RETENTION_DATA 32768 /* DONE */ #define BROKER_ACKNOWLEDGEMENT_DATA 65536 #define BROKER_STATECHANGE_DATA 131072 #define BROKER_RESERVED18 262144 #define BROKER_RESERVED19 524288 /****** EVENT TYPES ************************/ #define NEBTYPE_NONE 0 #define NEBTYPE_HELLO 1 #define NEBTYPE_GOODBYE 2 #define NEBTYPE_INFO 3 #define NEBTYPE_PROCESS_START 100 #define NEBTYPE_PROCESS_DAEMONIZE 101 #define NEBTYPE_PROCESS_RESTART 102 #define NEBTYPE_PROCESS_SHUTDOWN 103 #define NEBTYPE_PROCESS_PRELAUNCH 104 /* before objects are read or verified */ #define NEBTYPE_PROCESS_EVENTLOOPSTART 105 #define NEBTYPE_PROCESS_EVENTLOOPEND 106 #define NEBTYPE_TIMEDEVENT_ADD 200 #define NEBTYPE_TIMEDEVENT_REMOVE 201 #define NEBTYPE_TIMEDEVENT_EXECUTE 202 #define NEBTYPE_TIMEDEVENT_DELAY 203 /* NOT IMPLEMENTED */ #define NEBTYPE_TIMEDEVENT_SKIP 204 /* NOT IMPLEMENTED */ #define NEBTYPE_TIMEDEVENT_SLEEP 205 #define NEBTYPE_LOG_DATA 300 #define NEBTYPE_LOG_ROTATION 301 #define NEBTYPE_SYSTEM_COMMAND_START 400 #define NEBTYPE_SYSTEM_COMMAND_END 401 #define NEBTYPE_EVENTHANDLER_START 500 #define NEBTYPE_EVENTHANDLER_END 501 #define NEBTYPE_NOTIFICATION_START 600 #define NEBTYPE_NOTIFICATION_END 601 #define NEBTYPE_CONTACTNOTIFICATION_START 602 #define NEBTYPE_CONTACTNOTIFICATION_END 603 #define NEBTYPE_CONTACTNOTIFICATIONMETHOD_START 604 #define NEBTYPE_CONTACTNOTIFICATIONMETHOD_END 605 #define NEBTYPE_SERVICECHECK_INITIATE 700 #define NEBTYPE_SERVICECHECK_PROCESSED 701 #define NEBTYPE_SERVICECHECK_RAW_START 702 /* NOT IMPLEMENTED */ #define NEBTYPE_SERVICECHECK_RAW_END 703 /* NOT IMPLEMENTED */ #define NEBTYPE_SERVICECHECK_ASYNC_PRECHECK 704 #define NEBTYPE_HOSTCHECK_INITIATE 800 /* a check of the route to the host has been initiated */ #define NEBTYPE_HOSTCHECK_PROCESSED 801 /* the processed/final result of a host check */ #define NEBTYPE_HOSTCHECK_RAW_START 802 /* the start of a "raw" host check */ #define NEBTYPE_HOSTCHECK_RAW_END 803 /* a finished "raw" host check */ #define NEBTYPE_HOSTCHECK_ASYNC_PRECHECK 804 #define NEBTYPE_HOSTCHECK_SYNC_PRECHECK 805 #define NEBTYPE_COMMENT_ADD 900 #define NEBTYPE_COMMENT_DELETE 901 #define NEBTYPE_COMMENT_LOAD 902 #define NEBTYPE_FLAPPING_START 1000 #define NEBTYPE_FLAPPING_STOP 1001 #define NEBTYPE_DOWNTIME_ADD 1100 #define NEBTYPE_DOWNTIME_DELETE 1101 #define NEBTYPE_DOWNTIME_LOAD 1102 #define NEBTYPE_DOWNTIME_START 1103 #define NEBTYPE_DOWNTIME_STOP 1104 #define NEBTYPE_PROGRAMSTATUS_UPDATE 1200 #define NEBTYPE_HOSTSTATUS_UPDATE 1201 #define NEBTYPE_SERVICESTATUS_UPDATE 1202 #define NEBTYPE_CONTACTSTATUS_UPDATE 1203 #define NEBTYPE_ADAPTIVEPROGRAM_UPDATE 1300 #define NEBTYPE_ADAPTIVEHOST_UPDATE 1301 #define NEBTYPE_ADAPTIVESERVICE_UPDATE 1302 #define NEBTYPE_ADAPTIVECONTACT_UPDATE 1303 #define NEBTYPE_EXTERNALCOMMAND_START 1400 #define NEBTYPE_EXTERNALCOMMAND_END 1401 #define NEBTYPE_AGGREGATEDSTATUS_STARTDUMP 1500 #define NEBTYPE_AGGREGATEDSTATUS_ENDDUMP 1501 #define NEBTYPE_RETENTIONDATA_STARTLOAD 1600 #define NEBTYPE_RETENTIONDATA_ENDLOAD 1601 #define NEBTYPE_RETENTIONDATA_STARTSAVE 1602 #define NEBTYPE_RETENTIONDATA_ENDSAVE 1603 #define NEBTYPE_ACKNOWLEDGEMENT_ADD 1700 #define NEBTYPE_ACKNOWLEDGEMENT_REMOVE 1701 /* NOT IMPLEMENTED */ #define NEBTYPE_ACKNOWLEDGEMENT_LOAD 1702 /* NOT IMPLEMENTED */ #define NEBTYPE_STATECHANGE_START 1800 /* NOT IMPLEMENTED */ #define NEBTYPE_STATECHANGE_END 1801 /****** EVENT FLAGS ************************/ #define NEBFLAG_NONE 0 #define NEBFLAG_PROCESS_INITIATED 1 /* event was initiated by Nagios process */ #define NEBFLAG_USER_INITIATED 2 /* event was initiated by a user request */ #define NEBFLAG_MODULE_INITIATED 3 /* event was initiated by an event broker module */ /****** EVENT ATTRIBUTES *******************/ #define NEBATTR_NONE 0 #define NEBATTR_SHUTDOWN_NORMAL 1 #define NEBATTR_SHUTDOWN_ABNORMAL 2 #define NEBATTR_RESTART_NORMAL 4 #define NEBATTR_RESTART_ABNORMAL 8 #define NEBATTR_FLAPPING_STOP_NORMAL 1 #define NEBATTR_FLAPPING_STOP_DISABLED 2 /* flapping stopped because flap detection was disabled */ #define NEBATTR_DOWNTIME_STOP_NORMAL 1 #define NEBATTR_DOWNTIME_STOP_CANCELLED 2 /****** EVENT BROKER FUNCTIONS *************/ #ifdef USE_EVENT_BROKER struct timeval get_broker_timestamp(struct timeval *); void broker_program_state(int,int,int,struct timeval *); void broker_timed_event(int,int,int,timed_event *,struct timeval *); void broker_log_data(int,int,int,char *,unsigned long,time_t,struct timeval *); void broker_event_handler(int,int,int,int,void *,int,int,struct timeval,struct timeval,double,int,int,int,char *,char *,char *,struct timeval *); void broker_ocp_data(int,int,int,void *,int,int,double,int,int,struct timeval *); void broker_system_command(int,int,int,struct timeval,struct timeval,double,int,int,int,char *,char *,struct timeval *); int broker_host_check(int,int,int,host *,int,int,int,struct timeval,struct timeval,char *,double,double,int,int,int,char *,char *,char *,char *,struct timeval *); int broker_service_check(int,int,int,service *,int,struct timeval,struct timeval,char *,double,double,int,int,int,char *,struct timeval *); void broker_comment_data(int,int,int,int,int,char *,char *,time_t,char *,char *,int,int,int,time_t,unsigned long,struct timeval *); void broker_downtime_data(int,int,int,int,char *,char *,time_t,char *,char *,time_t,time_t,int,unsigned long,unsigned long,unsigned long,struct timeval *); void broker_flapping_data(int,int,int,int,void *,double,double,double,struct timeval *); void broker_program_status(int,int,int,struct timeval *); void broker_host_status(int,int,int,host *,struct timeval *); void broker_service_status(int,int,int,service *,struct timeval *); void broker_contact_status(int,int,int,contact *,struct timeval *); void broker_notification_data(int,int,int,int,int,struct timeval,struct timeval,void *,char *,char *,int,int,struct timeval *); void broker_contact_notification_data(int,int,int,int,int,struct timeval,struct timeval,void *,contact *,char *,char *,int,struct timeval *); void broker_contact_notification_method_data(int,int,int,int,int,struct timeval,struct timeval,void *,contact *,char *,char *,char *,int,struct timeval *); void broker_adaptive_program_data(int,int,int,int,unsigned long,unsigned long,unsigned long,unsigned long,struct timeval *); void broker_adaptive_host_data(int,int,int,host *,int,unsigned long,unsigned long,struct timeval *); void broker_adaptive_service_data(int,int,int,service *,int,unsigned long,unsigned long,struct timeval *); void broker_adaptive_contact_data(int,int,int,contact *,int,unsigned long,unsigned long,unsigned long,unsigned long,unsigned long,unsigned long, struct timeval *); void broker_external_command(int,int,int,int,time_t,char *,char *,struct timeval *); void broker_aggregated_status_data(int,int,int,struct timeval *); void broker_retention_data(int,int,int,struct timeval *); void broker_acknowledgement_data(int,int,int,int,void *,char *,char *,int,int,int,struct timeval *); void broker_statechange_data(int,int,int,int,void *,int,int,int,int,struct timeval *); #endif #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/nebcallbacks.h0000644000175100017510000000661310550310755021565 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBCALLBACKS.H - Include file for event broker modules * * Copyright (c) 2002-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 01-06-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBCALLBACKS_H #define _NEBCALLBACKS_H #include "config.h" #include "nebmodules.h" #ifdef __cplusplus extern "C" { #endif /***** CALLBACK TYPES *****/ #define NEBCALLBACK_NUMITEMS 33 /* total number of callback types we have */ #define NEBCALLBACK_RESERVED0 0 /* reserved for future use */ #define NEBCALLBACK_RESERVED1 1 #define NEBCALLBACK_RESERVED2 2 #define NEBCALLBACK_RESERVED3 3 #define NEBCALLBACK_RESERVED4 4 #define NEBCALLBACK_RAW_DATA 5 #define NEBCALLBACK_NEB_DATA 6 #define NEBCALLBACK_PROCESS_DATA 7 #define NEBCALLBACK_TIMED_EVENT_DATA 8 #define NEBCALLBACK_LOG_DATA 9 #define NEBCALLBACK_SYSTEM_COMMAND_DATA 10 #define NEBCALLBACK_EVENT_HANDLER_DATA 11 #define NEBCALLBACK_NOTIFICATION_DATA 12 #define NEBCALLBACK_SERVICE_CHECK_DATA 13 #define NEBCALLBACK_HOST_CHECK_DATA 14 #define NEBCALLBACK_COMMENT_DATA 15 #define NEBCALLBACK_DOWNTIME_DATA 16 #define NEBCALLBACK_FLAPPING_DATA 17 #define NEBCALLBACK_PROGRAM_STATUS_DATA 18 #define NEBCALLBACK_HOST_STATUS_DATA 19 #define NEBCALLBACK_SERVICE_STATUS_DATA 20 #define NEBCALLBACK_ADAPTIVE_PROGRAM_DATA 21 #define NEBCALLBACK_ADAPTIVE_HOST_DATA 22 #define NEBCALLBACK_ADAPTIVE_SERVICE_DATA 23 #define NEBCALLBACK_EXTERNAL_COMMAND_DATA 24 #define NEBCALLBACK_AGGREGATED_STATUS_DATA 25 #define NEBCALLBACK_RETENTION_DATA 26 #define NEBCALLBACK_CONTACT_NOTIFICATION_DATA 27 #define NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA 28 #define NEBCALLBACK_ACKNOWLEDGEMENT_DATA 29 #define NEBCALLBACK_STATE_CHANGE_DATA 30 #define NEBCALLBACK_CONTACT_STATUS_DATA 31 #define NEBCALLBACK_ADAPTIVE_CONTACT_DATA 32 /***** CALLBACK FUNCTIONS *****/ int neb_register_callback(int callback_type, void *mod_handle, int priority, int (*callback_func)(int,void *)); int neb_deregister_callback(int callback_type, int (*callback_func)(int,void *)); int neb_deregister_module_callbacks(nebmodule *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/objects.h0000644000175100017510000006722210712143241020607 0ustar baeckerhbaeckerh/***************************************************************************** * * OBJECTS.H - Header file for object addition/search functions * * Copyright (c) 1999-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 10-22-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _OBJECTS_H #define _OBJECTS_H #include "config.h" #include "common.h" #ifdef __cplusplus extern "C" { #endif /*************** CURRENT OBJECT REVISION **************/ #define CURRENT_OBJECT_STRUCTURE_VERSION 307 /* increment when changes are made to data structures... */ /* Nagios 3 starts at 300, Nagios 4 at 400, etc. */ /***************** OBJECT SIZE LIMITS *****************/ #define MAX_STATE_HISTORY_ENTRIES 21 /* max number of old states to keep track of for flap detection */ #define MAX_CONTACT_ADDRESSES 6 /* max number of custom addresses a contact can have */ /***************** CHAINED HASH LIMITS ****************/ #define SERVICE_HASHSLOTS 4096 /* 09/24/07 increased from 1024 */ #define HOST_HASHSLOTS 1024 #define COMMAND_HASHSLOTS 256 #define TIMEPERIOD_HASHSLOTS 64 #define CONTACT_HASHSLOTS 128 #define CONTACTGROUP_HASHSLOTS 64 #define HOSTGROUP_HASHSLOTS 128 #define SERVICEGROUP_HASHSLOTS 128 #define HOSTDEPENDENCY_HASHSLOTS 1024 #define SERVICEDEPENDENCY_HASHSLOTS 2048 /* 09/24/07 increased frm 1024 */ #define HOSTESCALATION_HASHSLOTS 1024 #define SERVICEESCALATION_HASHSLOTS 1024 /****************** DATA STRUCTURES *******************/ typedef struct host_struct host; typedef struct service_struct service; typedef struct contact_struct contact; /* OBJECT LIST STRUCTURE */ typedef struct objectlist_struct{ void *object_ptr; struct objectlist_struct *next; }objectlist; /* TIMERANGE structure */ typedef struct timerange_struct{ unsigned long range_start; unsigned long range_end; struct timerange_struct *next; }timerange; /* DATERANGE structure */ typedef struct daterange_struct{ int type; int syear; /* start year */ int smon; /* start month */ int smday; /* start day of month (may 3rd, last day in feb) */ int swday; /* start day of week (thursday) */ int swday_offset; /* start weekday offset (3rd thursday, last monday in jan) */ int eyear; int emon; int emday; int ewday; int ewday_offset; int skip_interval; timerange *times; struct daterange_struct *next; }daterange; /* TIMEPERIODEXCLUSION structure */ typedef struct timeperiodexclusion_struct{ char *timeperiod_name; struct timeperiod_struct *timeperiod_ptr; struct timeperiodexclusion_struct *next; }timeperiodexclusion; /* TIMEPERIOD structure */ typedef struct timeperiod_struct{ char *name; char *alias; timerange *days[7]; daterange *exceptions[DATERANGE_TYPES]; timeperiodexclusion *exclusions; struct timeperiod_struct *next; struct timeperiod_struct *nexthash; }timeperiod; /* CONTACTSMEMBER structure */ typedef struct contactsmember_struct{ char *contact_name; #ifdef NSCORE contact *contact_ptr; #endif struct contactsmember_struct *next; }contactsmember; /* CONTACTGROUP structure */ typedef struct contactgroup_struct{ char *group_name; char *alias; contactsmember *members; struct contactgroup_struct *next; struct contactgroup_struct *nexthash; }contactgroup; /* CONTACTGROUPSMEMBER structure */ typedef struct contactgroupsmember_struct{ char *group_name; #ifdef NSCORE contactgroup *group_ptr; #endif struct contactgroupsmember_struct *next; }contactgroupsmember; /* CUSTOMVARIABLESMEMBER structure */ typedef struct customvariablesmember_struct{ char *variable_name; char *variable_value; int has_been_modified; struct customvariablesmember_struct *next; }customvariablesmember; /* COMMAND structure */ typedef struct command_struct{ char *name; char *command_line; struct command_struct *next; struct command_struct *nexthash; }command; /* COMMANDSMEMBER structure */ typedef struct commandsmember_struct{ char *command; #ifdef NSCORE command *command_ptr; #endif struct commandsmember_struct *next; }commandsmember; /* CONTACT structure */ struct contact_struct{ char *name; char *alias; char *email; char *pager; char *address[MAX_CONTACT_ADDRESSES]; commandsmember *host_notification_commands; commandsmember *service_notification_commands; int notify_on_service_unknown; int notify_on_service_warning; int notify_on_service_critical; int notify_on_service_recovery; int notify_on_service_flapping; int notify_on_service_downtime; int notify_on_host_down; int notify_on_host_unreachable; int notify_on_host_recovery; int notify_on_host_flapping; int notify_on_host_downtime; char *host_notification_period; char *service_notification_period; int host_notifications_enabled; int service_notifications_enabled; int can_submit_commands; int retain_status_information; int retain_nonstatus_information; customvariablesmember *custom_variables; #ifdef NSCORE time_t last_host_notification; time_t last_service_notification; unsigned long modified_attributes; unsigned long modified_host_attributes; unsigned long modified_service_attributes; timeperiod *host_notification_period_ptr; timeperiod *service_notification_period_ptr; objectlist *contactgroups_ptr; #endif struct contact_struct *next; struct contact_struct *nexthash; }; /* SERVICESMEMBER structure */ typedef struct servicesmember_struct{ char *host_name; char *service_description; #ifdef NSCORE service *service_ptr; #endif struct servicesmember_struct *next; }servicesmember; /* HOSTSMEMBER structure */ typedef struct hostsmember_struct{ char *host_name; #ifdef NSCORE host *host_ptr; #endif struct hostsmember_struct *next; }hostsmember; /* HOSTGROUP structure */ typedef struct hostgroup_struct{ char *group_name; char *alias; hostsmember *members; char *notes; char *notes_url; char *action_url; struct hostgroup_struct *next; struct hostgroup_struct *nexthash; }hostgroup; /* HOST structure */ struct host_struct{ char *name; char *display_name; char *alias; char *address; hostsmember *parent_hosts; hostsmember *child_hosts; servicesmember *services; char *host_check_command; int initial_state; double check_interval; double retry_interval; int max_attempts; char *event_handler; contactgroupsmember *contact_groups; contactsmember *contacts; double notification_interval; double first_notification_delay; int notify_on_down; int notify_on_unreachable; int notify_on_recovery; int notify_on_flapping; int notify_on_downtime; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int flap_detection_on_up; int flap_detection_on_down; int flap_detection_on_unreachable; int stalk_on_up; int stalk_on_down; int stalk_on_unreachable; int check_freshness; int freshness_threshold; int process_performance_data; int checks_enabled; int accept_passive_host_checks; int event_handler_enabled; int retain_status_information; int retain_nonstatus_information; int failure_prediction_enabled; char *failure_prediction_options; int obsess_over_host; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; char *vrml_image; char *statusmap_image; int have_2d_coords; int x_2d; int y_2d; int have_3d_coords; double x_3d; double y_3d; double z_3d; int should_be_drawn; customvariablesmember *custom_variables; #ifdef NSCORE int problem_has_been_acknowledged; int acknowledgement_type; int check_type; int current_state; int last_state; int last_hard_state; char *plugin_output; char *long_plugin_output; char *perf_data; int state_type; int current_attempt; unsigned long current_event_id; unsigned long last_event_id; unsigned long current_problem_id; unsigned long last_problem_id; double latency; double execution_time; int is_executing; int check_options; int notifications_enabled; time_t last_host_notification; time_t next_host_notification; time_t next_check; int should_be_scheduled; time_t last_check; time_t last_state_change; time_t last_hard_state_change; time_t last_time_up; time_t last_time_down; time_t last_time_unreachable; int has_been_checked; int is_being_freshened; int notified_on_down; int notified_on_unreachable; int current_notification_number; int no_more_notifications; unsigned long current_notification_id; int check_flapping_recovery_notification; int scheduled_downtime_depth; int pending_flex_downtime; int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */ int state_history_index; time_t last_state_history_update; int is_flapping; unsigned long flapping_comment_id; double percent_state_change; int total_services; unsigned long total_service_check_interval; unsigned long modified_attributes; int circular_path_checked; int contains_circular_path; command *event_handler_ptr; command *check_command_ptr; timeperiod *check_period_ptr; timeperiod *notification_period_ptr; objectlist *hostgroups_ptr; #endif struct host_struct *next; struct host_struct *nexthash; }; /* SERVICEGROUP structure */ typedef struct servicegroup_struct{ char *group_name; char *alias; servicesmember *members; char *notes; char *notes_url; char *action_url; struct servicegroup_struct *next; struct servicegroup_struct *nexthash; }servicegroup; /* SERVICE structure */ struct service_struct{ char *host_name; char *description; char *display_name; char *service_check_command; char *event_handler; int initial_state; double check_interval; double retry_interval; int max_attempts; int parallelize; contactgroupsmember *contact_groups; contactsmember *contacts; double notification_interval; double first_notification_delay; int notify_on_unknown; int notify_on_warning; int notify_on_critical; int notify_on_recovery; int notify_on_flapping; int notify_on_downtime; int stalk_on_ok; int stalk_on_warning; int stalk_on_unknown; int stalk_on_critical; int is_volatile; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int flap_detection_on_ok; int flap_detection_on_warning; int flap_detection_on_unknown; int flap_detection_on_critical; int process_performance_data; int check_freshness; int freshness_threshold; int accept_passive_service_checks; int event_handler_enabled; int checks_enabled; int retain_status_information; int retain_nonstatus_information; int notifications_enabled; int obsess_over_service; int failure_prediction_enabled; char *failure_prediction_options; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; customvariablesmember *custom_variables; #ifdef NSCORE int problem_has_been_acknowledged; int acknowledgement_type; int host_problem_at_last_check; int check_type; int current_state; int last_state; int last_hard_state; char *plugin_output; char *long_plugin_output; char *perf_data; int state_type; time_t next_check; int should_be_scheduled; time_t last_check; int current_attempt; unsigned long current_event_id; unsigned long last_event_id; unsigned long current_problem_id; unsigned long last_problem_id; time_t last_notification; time_t next_notification; int no_more_notifications; int check_flapping_recovery_notification; time_t last_state_change; time_t last_hard_state_change; time_t last_time_ok; time_t last_time_warning; time_t last_time_unknown; time_t last_time_critical; int has_been_checked; int is_being_freshened; int notified_on_unknown; int notified_on_warning; int notified_on_critical; int current_notification_number; unsigned long current_notification_id; double latency; double execution_time; int is_executing; int check_options; int scheduled_downtime_depth; int pending_flex_downtime; int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */ int state_history_index; int is_flapping; unsigned long flapping_comment_id; double percent_state_change; unsigned long modified_attributes; host *host_ptr; command *event_handler_ptr; char *event_handler_args; command *check_command_ptr; char *check_command_args; timeperiod *check_period_ptr; timeperiod *notification_period_ptr; objectlist *servicegroups_ptr; #endif struct service_struct *next; struct service_struct *nexthash; }; /* SERVICE ESCALATION structure */ typedef struct serviceescalation_struct{ char *host_name; char *description; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalate_on_recovery; int escalate_on_warning; int escalate_on_unknown; int escalate_on_critical; contactgroupsmember *contact_groups; contactsmember *contacts; #ifdef NSCORE service *service_ptr; timeperiod *escalation_period_ptr; #endif struct serviceescalation_struct *next; struct serviceescalation_struct *nexthash; }serviceescalation; /* SERVICE DEPENDENCY structure */ typedef struct servicedependency_struct{ int dependency_type; char *dependent_host_name; char *dependent_service_description; char *host_name; char *service_description; char *dependency_period; int inherits_parent; int fail_on_ok; int fail_on_warning; int fail_on_unknown; int fail_on_critical; int fail_on_pending; #ifdef NSCORE int circular_path_checked; int contains_circular_path; service *master_service_ptr; service *dependent_service_ptr; timeperiod *dependency_period_ptr; #endif struct servicedependency_struct *next; struct servicedependency_struct *nexthash; }servicedependency; /* HOST ESCALATION structure */ typedef struct hostescalation_struct{ char *host_name; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalate_on_recovery; int escalate_on_down; int escalate_on_unreachable; contactgroupsmember *contact_groups; contactsmember *contacts; #ifdef NSCORE host *host_ptr; timeperiod *escalation_period_ptr; #endif struct hostescalation_struct *next; struct hostescalation_struct *nexthash; }hostescalation; /* HOST DEPENDENCY structure */ typedef struct hostdependency_struct{ int dependency_type; char *dependent_host_name; char *host_name; char *dependency_period; int inherits_parent; int fail_on_up; int fail_on_down; int fail_on_unreachable; int fail_on_pending; #ifdef NSCORE int circular_path_checked; int contains_circular_path; host *master_host_ptr; host *dependent_host_ptr; timeperiod *dependency_period_ptr; #endif struct hostdependency_struct *next; struct hostdependency_struct *nexthash; }hostdependency; /****************** HASH STRUCTURES ********************/ typedef struct host_cursor_struct{ int host_hashchain_iterator; host *current_host_pointer; }host_cursor; /********************* FUNCTIONS **********************/ /**** Top-level input functions ****/ int read_object_config_data(char *,int,int,int); /* reads all external configuration data of specific types */ /**** Object Creation Functions ****/ contact *add_contact(char *,char *,char *,char *,char **,char *,char *,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int); /* adds a contact definition */ commandsmember *add_service_notification_command_to_contact(contact *,char *); /* adds a service notification command to a contact definition */ commandsmember *add_host_notification_command_to_contact(contact *,char *); /* adds a host notification command to a contact definition */ customvariablesmember *add_custom_variable_to_contact(contact *,char *,char *); /* adds a custom variable to a service definition */ host *add_host(char *,char *,char *,char *,char *,int,double,double,int,int,int,int,int,int,double,double,char *,int,char *,int,int,char *,int,int,double,double,int,int,int,int,int,int,int,int,char *,int,int,char *,char *,char *,char *,char *,char *,char *,int,int,int,double,double,double,int,int,int,int,int); /* adds a host definition */ hostsmember *add_parent_host_to_host(host *,char *); /* adds a parent host to a host definition */ hostsmember *add_child_link_to_host(host *,host *); /* adds a child host to a host definition */ contactgroupsmember *add_contactgroup_to_host(host *,char *); /* adds a contactgroup to a host definition */ contactsmember *add_contact_to_host(host *,char *); /* adds a contact to a host definition */ customvariablesmember *add_custom_variable_to_host(host *,char *,char *); /* adds a custom variable to a host definition */ timeperiod *add_timeperiod(char *,char *); /* adds a timeperiod definition */ timeperiodexclusion *add_exclusion_to_timeperiod(timeperiod *,char *); /* adds an exclusion to a timeperiod */ timerange *add_timerange_to_timeperiod(timeperiod *,int,unsigned long,unsigned long); /* adds a timerange to a timeperiod definition */ daterange *add_exception_to_timeperiod(timeperiod *,int,int,int,int,int,int,int,int,int,int,int,int); timerange *add_timerange_to_daterange(daterange *,unsigned long,unsigned long); hostgroup *add_hostgroup(char *,char *,char *,char *,char *); /* adds a hostgroup definition */ hostsmember *add_host_to_hostgroup(hostgroup *, char *); /* adds a host to a hostgroup definition */ servicegroup *add_servicegroup(char *,char *,char *,char *,char *); /* adds a servicegroup definition */ servicesmember *add_service_to_servicegroup(servicegroup *,char *,char *); /* adds a service to a servicegroup definition */ contactgroup *add_contactgroup(char *,char *); /* adds a contactgroup definition */ contactsmember *add_contact_to_contactgroup(contactgroup *,char *); /* adds a contact to a contact group definition */ command *add_command(char *,char *); /* adds a command definition */ service *add_service(char *,char *,char *,char *,int,int,int,int,double,double,double,double,char *,int,int,int,int,int,int,int,int,char *,int,char *,int,int,double,double,int,int,int,int,int,int,int,int,int,int,char *,int,int,char *,char *,char *,char *,char *,int,int,int); /* adds a service definition */ contactgroupsmember *add_contactgroup_to_service(service *,char *); /* adds a contact group to a service definition */ contactsmember *add_contact_to_service(service *,char *); /* adds a contact to a host definition */ serviceescalation *add_serviceescalation(char *,char *,int,int,double,char *,int,int,int,int); /* adds a service escalation definition */ contactgroupsmember *add_contactgroup_to_serviceescalation(serviceescalation *,char *); /* adds a contact group to a service escalation definition */ contactsmember *add_contact_to_serviceescalation(serviceescalation *,char *); /* adds a contact to a service escalation definition */ customvariablesmember *add_custom_variable_to_service(service *,char *,char *); /* adds a custom variable to a service definition */ servicedependency *add_service_dependency(char *,char *,char *,char *,int,int,int,int,int,int,int,char *); /* adds a service dependency definition */ hostdependency *add_host_dependency(char *,char *,int,int,int,int,int,int,char *); /* adds a host dependency definition */ hostescalation *add_hostescalation(char *,int,int,double,char *,int,int,int); /* adds a host escalation definition */ contactsmember *add_contact_to_hostescalation(hostescalation *,char *); /* adds a contact to a host escalation definition */ contactgroupsmember *add_contactgroup_to_hostescalation(hostescalation *,char *); /* adds a contact group to a host escalation definition */ contactsmember *add_contact_to_object(contactsmember **,char *); /* adds a contact to an object */ customvariablesmember *add_custom_variable_to_object(customvariablesmember **,char *,char *); /* adds a custom variable to an object */ /**** Object Hash Functions ****/ int add_host_to_hashlist(host *); int add_service_to_hashlist(service *); int add_command_to_hashlist(command *); int add_timeperiod_to_hashlist(timeperiod *); int add_contact_to_hashlist(contact *); int add_contactgroup_to_hashlist(contactgroup *); int add_hostgroup_to_hashlist(hostgroup *); int add_servicegroup_to_hashlist(servicegroup *); int add_hostdependency_to_hashlist(hostdependency *); int add_servicedependency_to_hashlist(servicedependency *); int add_hostescalation_to_hashlist(hostescalation *); int add_serviceescalation_to_hashlist(serviceescalation *); /**** Object Search Functions ****/ timeperiod * find_timeperiod(char *); /* finds a timeperiod object */ host * find_host(char *); /* finds a host object */ hostgroup * find_hostgroup(char *); /* finds a hostgroup object */ servicegroup * find_servicegroup(char *); /* finds a servicegroup object */ contact * find_contact(char *); /* finds a contact object */ contactgroup * find_contactgroup(char *); /* finds a contactgroup object */ command * find_command(char *); /* finds a command object */ service * find_service(char *,char *); /* finds a service object */ /**** Object Traversal Functions ****/ void move_first_service(void); /* sets up the static memory area for get_next_service */ service *get_next_service(void); /* returns the next service, NULL at the end of the list */ void move_first_host(void); /* sets up the static memory area for get_next_host */ host *get_next_host(void); /* returns the next host, NULL at the end of the list */ void *get_host_cursor(void); /* allocate memory for the host cursor */ host *get_next_host_cursor(void *v_cursor); /* return the next host, NULL at the end of the list */ void free_host_cursor(void *cursor); /* free allocated cursor memory */ void *get_next_N(void **hashchain, int hashslots, int *iterator, void *current, void *next); hostescalation *get_first_hostescalation_by_host(char *); hostescalation *get_next_hostescalation_by_host(char *,hostescalation *); serviceescalation *get_first_serviceescalation_by_service(char *,char *); serviceescalation *get_next_serviceescalation_by_service(char *,char *,serviceescalation *); hostdependency *get_first_hostdependency_by_dependent_host(char *); hostdependency *get_next_hostdependency_by_dependent_host(char *,hostdependency *); servicedependency *get_first_servicedependency_by_dependent_service(char *,char *); servicedependency *get_next_servicedependency_by_dependent_service(char *,char *,servicedependency *); #ifdef NSCORE int add_object_to_objectlist(objectlist **,void *); int free_objectlist(objectlist **); #endif /**** Object Query Functions ****/ int is_host_immediate_child_of_host(host *,host *); /* checks if a host is an immediate child of another host */ int is_host_primary_immediate_child_of_host(host *,host *); /* checks if a host is an immediate child (and primary child) of another host */ int is_host_immediate_parent_of_host(host *,host *); /* checks if a host is an immediate child of another host */ int is_host_member_of_hostgroup(hostgroup *,host *); /* tests whether or not a host is a member of a specific hostgroup */ int is_host_member_of_servicegroup(servicegroup *,host *); /* tests whether or not a service is a member of a specific servicegroup */ int is_service_member_of_servicegroup(servicegroup *,service *); /* tests whether or not a service is a member of a specific servicegroup */ int is_contact_member_of_contactgroup(contactgroup *, contact *); /* tests whether or not a contact is a member of a specific contact group */ int is_contact_for_hostgroup(hostgroup *,contact *); /* tests whether or not a contact is a member of a specific hostgroup */ int is_contact_for_servicegroup(servicegroup *,contact *); /* tests whether or not a contact is a member of a specific servicegroup */ int is_contact_for_host(host *,contact *); /* tests whether or not a contact is a contact member for a specific host */ int is_escalated_contact_for_host(host *,contact *); /* checks whether or not a contact is an escalated contact for a specific host */ int is_contact_for_service(service *,contact *); /* tests whether or not a contact is a contact member for a specific service */ int is_escalated_contact_for_service(service *,contact *); /* checks whether or not a contact is an escalated contact for a specific service */ int is_host_immediate_parent_of_host(host *,host *); /* tests whether or not a host is an immediate parent of another host */ int number_of_immediate_child_hosts(host *); /* counts the number of immediate child hosts for a particular host */ int number_of_total_child_hosts(host *); /* counts the number of total child hosts for a particular host */ int number_of_immediate_parent_hosts(host *); /* counts the number of immediate parents hosts for a particular host */ int number_of_total_parent_hosts(host *); /* counts the number of total parents hosts for a particular host */ #ifdef NSCORE int check_for_circular_host_path(host *,host *); /* checks if a circular path exists for a given host */ int check_for_circular_servicedependency_path(servicedependency *,servicedependency *,int); /* checks if a circular dependency exists for a given service */ int check_for_circular_hostdependency_path(hostdependency *,hostdependency *,int); /* checks if a circular dependency exists for a given host */ #endif /**** Object Cleanup Functions ****/ int free_object_data(void); /* frees all allocated memory for the object definitions */ #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/cgiauth.h0000644000175100017510000000411110550310754020573 0ustar baeckerhbaeckerh/***************************************************************************** * * CGIAUTH.H - Authorization utilities header file * * Last Modified: 11-24-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _AUTH_H #define _AUTH_H #include "common.h" #include "objects.h" #ifdef __cplusplus extern "C" { #endif typedef struct authdata_struct{ char *username; int authorized_for_all_hosts; int authorized_for_all_host_commands; int authorized_for_all_services; int authorized_for_all_service_commands; int authorized_for_system_information; int authorized_for_system_commands; int authorized_for_configuration_information; int authenticated; }authdata; int get_authentication_information(authdata *); /* gets current authentication information */ int is_authorized_for_host(host *,authdata *); int is_authorized_for_service(service *,authdata *); int is_authorized_for_all_hosts(authdata *); int is_authorized_for_all_services(authdata *); int is_authorized_for_system_information(authdata *); int is_authorized_for_system_commands(authdata *); int is_authorized_for_host_commands(host *,authdata *); int is_authorized_for_service_commands(service *,authdata *); int is_authorized_for_hostgroup(hostgroup *,authdata *); int is_authorized_for_servicegroup(servicegroup *,authdata *); int is_authorized_for_configuration_information(authdata *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/nebmods.h0000644000175100017510000000350110550310755020601 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBMODS.H - Include file for event broker modules * * Copyright (c) 2002-2005 Ethan Galstad (nagios@nagios.org) * Last Modified: 11-25-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBMODS_H #define _NEBMODS_H #include "config.h" #include "nebcallbacks.h" #include "nebmodules.h" #ifdef __cplusplus extern "C" { #endif /***** MODULE STRUCTURES *****/ /* NEB module callback list struct */ typedef struct nebcallback_struct{ void *callback_func; void *module_handle; int priority; struct nebcallback_struct *next; }nebcallback; /***** MODULE FUNCTIONS *****/ int neb_init_modules(void); int neb_deinit_modules(void); int neb_load_all_modules(void); int neb_load_module(nebmodule *); int neb_free_module_list(void); int neb_unload_all_modules(int,int); int neb_unload_module(nebmodule *,int,int); int neb_add_module(char *,char *,int); /***** CALLBACK FUNCTIONS *****/ int neb_init_callback_list(void); int neb_free_callback_list(void); int neb_make_callbacks(int,void *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/nebstructs.h0000644000175100017510000003312410712143241021344 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBSTRUCTS.H - Event broker includes for Nagios * * Copyright (c) 2003-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 10-28-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBSTRUCTS_H #define _NEBSTRUCTS_H #include "config.h" #include "objects.h" #include "nagios.h" #ifdef __cplusplus extern "C" { #endif /****** STRUCTURES *************************/ /* process data structure */ typedef struct nebstruct_process_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_process_data; /* timed event data structure */ typedef struct nebstruct_timed_event_struct{ int type; int flags; int attr; struct timeval timestamp; int event_type; int recurring; time_t run_time; void *event_data; void *event_ptr; }nebstruct_timed_event_data; /* log data structure */ typedef struct nebstruct_log_struct{ int type; int flags; int attr; struct timeval timestamp; time_t entry_time; int data_type; char *data; }nebstruct_log_data; /* system command structure */ typedef struct nebstruct_system_command_struct{ int type; int flags; int attr; struct timeval timestamp; struct timeval start_time; struct timeval end_time; int timeout; char *command_line; int early_timeout; double execution_time; int return_code; char *output; }nebstruct_system_command_data; /* event handler structure */ typedef struct nebstruct_event_handler_struct{ int type; int flags; int attr; struct timeval timestamp; int eventhandler_type; char *host_name; char *service_description; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; int return_code; char *output; void *object_ptr; }nebstruct_event_handler_data; /* host check structure */ typedef struct nebstruct_host_check_struct{ int type; int flags; int attr; struct timeval timestamp; char *host_name; int current_attempt; int check_type; int max_attempts; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; double latency; int return_code; char *output; char *long_output; char *perf_data; void *object_ptr; }nebstruct_host_check_data; /* service check structure */ typedef struct nebstruct_service_check_struct{ int type; int flags; int attr; struct timeval timestamp; char *host_name; char *service_description; int check_type; int current_attempt; int max_attempts; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; double latency; int return_code; char *output; char *long_output; char *perf_data; void *object_ptr; }nebstruct_service_check_data; /* comment data structure */ typedef struct nebstruct_comment_struct{ int type; int flags; int attr; struct timeval timestamp; int comment_type; char *host_name; char *service_description; time_t entry_time; char *author_name; char *comment_data; int persistent; int source; int entry_type; int expires; time_t expire_time; unsigned long comment_id; void *object_ptr; /* not implemented yet */ }nebstruct_comment_data; /* downtime data structure */ typedef struct nebstruct_downtime_struct{ int type; int flags; int attr; struct timeval timestamp; int downtime_type; char *host_name; char *service_description; time_t entry_time; char *author_name; char *comment_data; time_t start_time; time_t end_time; int fixed; unsigned long duration; unsigned long triggered_by; unsigned long downtime_id; void *object_ptr; /* not implemented yet */ }nebstruct_downtime_data; /* flapping data structure */ typedef struct nebstruct_flapping_struct{ int type; int flags; int attr; struct timeval timestamp; int flapping_type; char *host_name; char *service_description; double percent_change; double high_threshold; double low_threshold; unsigned long comment_id; void *object_ptr; }nebstruct_flapping_data; /* program status structure */ typedef struct nebstruct_program_status_struct{ int type; int flags; int attr; struct timeval timestamp; time_t program_start; int pid; int daemon_mode; time_t last_command_check; time_t last_log_rotation; int notifications_enabled; int active_service_checks_enabled; int passive_service_checks_enabled; int active_host_checks_enabled; int passive_host_checks_enabled; int event_handlers_enabled; int flap_detection_enabled; int failure_prediction_enabled; int process_performance_data; int obsess_over_hosts; int obsess_over_services; unsigned long modified_host_attributes; unsigned long modified_service_attributes; char *global_host_event_handler; char *global_service_event_handler; }nebstruct_program_status_data; /* host status structure */ typedef struct nebstruct_host_status_struct{ int type; int flags; int attr; struct timeval timestamp; void *object_ptr; }nebstruct_host_status_data; /* service status structure */ typedef struct nebstruct_service_status_struct{ int type; int flags; int attr; struct timeval timestamp; void *object_ptr; }nebstruct_service_status_data; /* contact status structure */ typedef struct nebstruct_contact_status_struct{ int type; int flags; int attr; struct timeval timestamp; void *object_ptr; }nebstruct_contact_status_data; /* notification data structure */ typedef struct nebstruct_notification_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; int contacts_notified; void *object_ptr; }nebstruct_notification_data; /* contact notification data structure */ typedef struct nebstruct_contact_notification_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; char *contact_name; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; void *object_ptr; void *contact_ptr; }nebstruct_contact_notification_data; /* contact notification method data structure */ typedef struct nebstruct_contact_notification_method_struct{ int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; char *contact_name; char *command_name; char *command_args; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; void *object_ptr; void *contact_ptr; }nebstruct_contact_notification_method_data; /* adaptive program data structure */ typedef struct nebstruct_adaptive_program_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_host_attribute; unsigned long modified_host_attributes; unsigned long modified_service_attribute; unsigned long modified_service_attributes; }nebstruct_adaptive_program_data; /* adaptive host data structure */ typedef struct nebstruct_adaptive_host_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; void *object_ptr; }nebstruct_adaptive_host_data; /* adaptive service data structure */ typedef struct nebstruct_adaptive_service_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; void *object_ptr; }nebstruct_adaptive_service_data; /* adaptive contact data structure */ typedef struct nebstruct_adaptive_contact_data_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; unsigned long modified_host_attribute; unsigned long modified_host_attributes; unsigned long modified_service_attribute; unsigned long modified_service_attributes; void *object_ptr; }nebstruct_adaptive_contact_data; /* external command data structure */ typedef struct nebstruct_external_command_struct{ int type; int flags; int attr; struct timeval timestamp; int command_type; time_t entry_time; char *command_string; char *command_args; }nebstruct_external_command_data; /* aggregated status data structure */ typedef struct nebstruct_aggregated_status_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_aggregated_status_data; /* retention data structure */ typedef struct nebstruct_retention_struct{ int type; int flags; int attr; struct timeval timestamp; }nebstruct_retention_data; /* acknowledgement structure */ typedef struct nebstruct_acknowledgement_struct{ int type; int flags; int attr; struct timeval timestamp; int acknowledgement_type; char *host_name; char *service_description; int state; char *author_name; char *comment_data; int is_sticky; int persistent_comment; int notify_contacts; void *object_ptr; }nebstruct_acknowledgement_data; /* state change structure */ typedef struct nebstruct_statechange_struct{ int type; int flags; int attr; struct timeval timestamp; int statechange_type; char *host_name; char *service_description; int state; int state_type; int current_attempt; int max_attempts; char *output; void *object_ptr; }nebstruct_statechange_data; #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/nebmodules.h0000644000175100017510000000562110550310755021314 0ustar baeckerhbaeckerh/***************************************************************************** * * NEBMODULES.H - Include file for event broker modules * * Copyright (c) 2002-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 02-27-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef _NEBMODULES_H #define _NEBMODULES_H #ifdef __cplusplus extern "C" { #endif /***** MODULE VERSION INFORMATION *****/ #define NEB_API_VERSION(x) int __neb_api_version = x; #define CURRENT_NEB_API_VERSION 3 /***** MODULE INFORMATION *****/ #define NEBMODULE_MODINFO_NUMITEMS 6 #define NEBMODULE_MODINFO_TITLE 0 #define NEBMODULE_MODINFO_AUTHOR 1 #define NEBMODULE_MODINFO_COPYRIGHT 2 #define NEBMODULE_MODINFO_VERSION 3 #define NEBMODULE_MODINFO_LICENSE 4 #define NEBMODULE_MODINFO_DESC 5 /***** MODULE LOAD/UNLOAD OPTIONS *****/ #define NEBMODULE_NORMAL_LOAD 0 /* module is being loaded normally */ #define NEBMODULE_REQUEST_UNLOAD 0 /* request module to unload (but don't force it) */ #define NEBMODULE_FORCE_UNLOAD 1 /* force module to unload */ /***** MODULES UNLOAD REASONS *****/ #define NEBMODULE_NEB_SHUTDOWN 1 /* event broker is shutting down */ #define NEBMODULE_NEB_RESTART 2 /* event broker is restarting */ #define NEBMODULE_ERROR_NO_INIT 3 /* _module_init() function was not found in module */ #define NEBMODULE_ERROR_BAD_INIT 4 /* _module_init() function returned a bad code */ #define NEBMODULE_ERROR_API_VERSION 5 /* module version is incompatible with current api */ /***** MODULE STRUCTURES *****/ /* NEB module structure */ typedef struct nebmodule_struct{ char *filename; char *args; char *info[NEBMODULE_MODINFO_NUMITEMS]; int should_be_loaded; int is_currently_loaded; #ifdef USE_LTDL lt_dlhandle module_handle; lt_ptr init_func; lt_ptr deinit_func; #else void *module_handle; void *init_func; void *deinit_func; #endif #ifdef HAVE_PTHREAD_H pthread_t thread_id; #endif struct nebmodule_struct *next; }nebmodule; /***** MODULE FUNCTIONS *****/ int neb_set_module_info(void *,int,char *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/cgiutils.h0000644000175100017510000004331710712143241021000 0ustar baeckerhbaeckerh/* include/cgiutils.h. Generated by configure. */ /************************************************************************ * * CGIUTILS.H - Header file for common CGI functions * Copyright (c) 1999-2007 Ethan Galstad (nagios@nagios.org) * Last Modified: 10-18-2007 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef _CGIUTILS_H #define _CGIUTILS_H #include "objects.h" #include "cgiauth.h" #ifdef __cplusplus extern "C" { #endif /* should we compile and use the statusmap CGI? */ #define USE_STATUSMAP 1 /* should we compile and use the statuswrl CGI? */ #define USE_STATUSWRL 1 /* should we compile and use the trends CGI? */ #define USE_TRENDS 1 /* should we compile and use the histogram CGI? */ #define USE_HISTOGRAM 1 /**************************** CGI REFRESH RATE ******************************/ #define DEFAULT_REFRESH_RATE 60 /* 60 second refresh rate for CGIs */ /******************************* CGI NAMES **********************************/ #define STATUS_CGI "status.cgi" #define STATUSMAP_CGI "statusmap.cgi" #define STATUSWORLD_CGI "statuswrl.cgi" #define COMMAND_CGI "cmd.cgi" #define EXTINFO_CGI "extinfo.cgi" #define SHOWLOG_CGI "showlog.cgi" #define NOTIFICATIONS_CGI "notifications.cgi" #define HISTORY_CGI "history.cgi" #define CONFIG_CGI "config.cgi" #define OUTAGES_CGI "outages.cgi" #define TRENDS_CGI "trends.cgi" #define AVAIL_CGI "avail.cgi" #define TAC_CGI "tac.cgi" #define STATUSWML_CGI "statuswml.cgi" #define TRACEROUTE_CGI "traceroute.cgi" #define HISTOGRAM_CGI "histogram.cgi" #define CHECKSANITY_CGI "checksanity.cgi" #define MINISTATUS_CGI "ministatus.cgi" #define SUMMARY_CGI "summary.cgi" /**************************** STYLE SHEET NAMES ******************************/ #define COMMON_CSS "common.css" #define SHOWLOG_CSS "showlog.css" #define STATUS_CSS "status.css" #define STATUSMAP_CSS "statusmap.css" #define COMMAND_CSS "cmd.css" #define EXTINFO_CSS "extinfo.css" #define NOTIFICATIONS_CSS "notifications.css" #define HISTORY_CSS "history.css" #define CONFIG_CSS "config.css" #define OUTAGES_CSS "outages.css" #define TRENDS_CSS "trends.css" #define AVAIL_CSS "avail.css" #define TAC_CSS "tac.css" #define HISTOGRAM_CSS "histogram.css" #define CHECKSANITY_CSS "checksanity.css" #define MINISTATUS_CSS "ministatus.css" #define SUMMARY_CSS "summary.css" /********************************* ICONS ************************************/ #define STATUS_ICON_WIDTH 20 #define STATUS_ICON_HEIGHT 20 #define INFO_ICON "info.png" #define INFO_ICON_ALT "Informational Message" #define START_ICON "start.gif" #define START_ICON_ALT "Program Start" #define STOP_ICON "stop.gif" #define STOP_ICON_ALT "Program End" #define RESTART_ICON "restart.gif" #define RESTART_ICON_ALT "Program Restart" #define OK_ICON "recovery.png" #define OK_ICON_ALT "Service Ok" #define CRITICAL_ICON "critical.png" #define CRITICAL_ICON_ALT "Service Critical" #define WARNING_ICON "warning.png" #define WARNING_ICON_ALT "Service Warning" #define UNKNOWN_ICON "unknown.png" #define UNKNOWN_ICON_ALT "Service Unknown" #define NOTIFICATION_ICON "notify.gif" #define NOTIFICATION_ICON_ALT "Service Notification" #define LOG_ROTATION_ICON "logrotate.png" #define LOG_ROTATION_ICON_ALT "Log Rotation" #define EXTERNAL_COMMAND_ICON "command.png" #define EXTERNAL_COMMAND_ICON_ALT "External Command" #define STATUS_DETAIL_ICON "status2.gif" #define STATUS_OVERVIEW_ICON "status.gif" #define STATUSMAP_ICON "status3.gif" #define STATUSWORLD_ICON "status4.gif" #define EXTINFO_ICON "extinfo.gif" #define HISTORY_ICON "history.gif" #define CONTACTGROUP_ICON "contactgroup.gif" #define TRENDS_ICON "trends.gif" #define DISABLED_ICON "disabled.gif" #define ENABLED_ICON "enabled.gif" #define PASSIVE_ONLY_ICON "passiveonly.gif" #define NOTIFICATIONS_DISABLED_ICON "ndisabled.gif" #define ACKNOWLEDGEMENT_ICON "ack.gif" #define REMOVE_ACKNOWLEDGEMENT_ICON "noack.gif" #define COMMENT_ICON "comment.gif" #define DELETE_ICON "delete.gif" #define DELAY_ICON "delay.gif" #define DOWNTIME_ICON "downtime.gif" #define PASSIVE_ICON "passiveonly.gif" #define RIGHT_ARROW_ICON "right.gif" #define LEFT_ARROW_ICON "left.gif" #define UP_ARROW_ICON "up.gif" #define DOWN_ARROW_ICON "down.gif" #define FLAPPING_ICON "flapping.gif" #define SCHEDULED_DOWNTIME_ICON "downtime.gif" #define EMPTY_ICON "empty.gif" #define ACTIVE_ICON "active.gif" #define ACTIVE_ICON_ALT "Active Mode" #define STANDBY_ICON "standby.gif" #define STANDBY_ICON_ALT "Standby Mode" #define HOST_DOWN_ICON "critical.png" #define HOST_DOWN_ICON_ALT "Host Down" #define HOST_UNREACHABLE_ICON "critical.png" #define HOST_UNREACHABLE_ICON_ALT "Host Unreachable" #define HOST_UP_ICON "recovery.png" #define HOST_UP_ICON_ALT "Host Up" #define HOST_NOTIFICATION_ICON "notify.gif" #define HOST_NOTIFICATION_ICON_ALT "Host Notification" #define SERVICE_EVENT_ICON "serviceevent.gif" #define SERVICE_EVENT_ICON_ALT "Service Event Handler" #define HOST_EVENT_ICON "hostevent.gif" #define HOST_EVENT_ICON_ALT "Host Event Handler" #define THERM_OK_IMAGE "thermok.png" #define THERM_WARNING_IMAGE "thermwarn.png" #define THERM_CRITICAL_IMAGE "thermcrit.png" #define CONFIGURATION_ICON "config.gif" #define NOTES_ICON "notes.gif" #define ACTION_ICON "action.gif" #define DETAIL_ICON "detail.gif" #define PARENT_TRAVERSAL_ICON "parentup.gif" #define TAC_DISABLED_ICON "tacdisabled.png" #define TAC_ENABLED_ICON "tacenabled.png" #define ZOOM1_ICON "zoom1.gif" #define ZOOM2_ICON "zoom2.gif" #define CONTEXT_HELP_ICON1 "contexthelp1.gif" #define CONTEXT_HELP_ICON2 "contexthelp2.gif" #define SPLUNK_SMALL_WHITE_ICON "splunk1.gif" #define SPLUNK_SMALL_BLACK_ICON "splunk2.gif" /************************** PLUGIN RETURN VALUES ****************************/ #define STATE_OK 0 #define STATE_WARNING 1 #define STATE_CRITICAL 2 #define STATE_UNKNOWN 3 /* changed from -1 on 02/24/2001 */ /********************* EXTENDED INFO CGI DISPLAY TYPES *********************/ #define DISPLAY_PROCESS_INFO 0 #define DISPLAY_HOST_INFO 1 #define DISPLAY_SERVICE_INFO 2 #define DISPLAY_COMMENTS 3 #define DISPLAY_PERFORMANCE 4 #define DISPLAY_HOSTGROUP_INFO 5 #define DISPLAY_DOWNTIME 6 #define DISPLAY_SCHEDULING_QUEUE 7 #define DISPLAY_SERVICEGROUP_INFO 8 /************************ COMMAND CGI COMMAND MODES *************************/ #define CMDMODE_NONE 0 #define CMDMODE_REQUEST 1 #define CMDMODE_COMMIT 2 /******************** HOST AND SERVICE NOTIFICATION TYPES ******************/ #define NOTIFICATION_ALL 0 /* all service and host notifications */ #define NOTIFICATION_SERVICE_ALL 1 /* all types of service notifications */ #define NOTIFICATION_HOST_ALL 2 /* all types of host notifications */ #define NOTIFICATION_SERVICE_WARNING 4 #define NOTIFICATION_SERVICE_UNKNOWN 8 #define NOTIFICATION_SERVICE_CRITICAL 16 #define NOTIFICATION_SERVICE_RECOVERY 32 #define NOTIFICATION_HOST_DOWN 64 #define NOTIFICATION_HOST_UNREACHABLE 128 #define NOTIFICATION_HOST_RECOVERY 256 #define NOTIFICATION_SERVICE_ACK 512 #define NOTIFICATION_HOST_ACK 1024 #define NOTIFICATION_SERVICE_FLAP 2048 #define NOTIFICATION_HOST_FLAP 4096 #define NOTIFICATION_SERVICE_CUSTOM 8192 #define NOTIFICATION_HOST_CUSTOM 16384 /********************** HOST AND SERVICE ALERT TYPES **********************/ #define HISTORY_ALL 0 /* all service and host alert */ #define HISTORY_SERVICE_ALL 1 /* all types of service alerts */ #define HISTORY_HOST_ALL 2 /* all types of host alerts */ #define HISTORY_SERVICE_WARNING 4 #define HISTORY_SERVICE_UNKNOWN 8 #define HISTORY_SERVICE_CRITICAL 16 #define HISTORY_SERVICE_RECOVERY 32 #define HISTORY_HOST_DOWN 64 #define HISTORY_HOST_UNREACHABLE 128 #define HISTORY_HOST_RECOVERY 256 /****************************** SORT TYPES *******************************/ #define SORT_NONE 0 #define SORT_ASCENDING 1 #define SORT_DESCENDING 2 /***************************** SORT OPTIONS ******************************/ #define SORT_NOTHING 0 #define SORT_HOSTNAME 1 #define SORT_SERVICENAME 2 #define SORT_SERVICESTATUS 3 #define SORT_LASTCHECKTIME 4 #define SORT_CURRENTATTEMPT 5 #define SORT_STATEDURATION 6 #define SORT_NEXTCHECKTIME 7 #define SORT_HOSTSTATUS 8 /****************** HOST AND SERVICE FILTER PROPERTIES *******************/ #define HOST_SCHEDULED_DOWNTIME 1 #define HOST_NO_SCHEDULED_DOWNTIME 2 #define HOST_STATE_ACKNOWLEDGED 4 #define HOST_STATE_UNACKNOWLEDGED 8 #define HOST_CHECKS_DISABLED 16 #define HOST_CHECKS_ENABLED 32 #define HOST_EVENT_HANDLER_DISABLED 64 #define HOST_EVENT_HANDLER_ENABLED 128 #define HOST_FLAP_DETECTION_DISABLED 256 #define HOST_FLAP_DETECTION_ENABLED 512 #define HOST_IS_FLAPPING 1024 #define HOST_IS_NOT_FLAPPING 2048 #define HOST_NOTIFICATIONS_DISABLED 4096 #define HOST_NOTIFICATIONS_ENABLED 8192 #define HOST_PASSIVE_CHECKS_DISABLED 16384 #define HOST_PASSIVE_CHECKS_ENABLED 32768 #define HOST_PASSIVE_CHECK 65536 #define HOST_ACTIVE_CHECK 131072 #define HOST_HARD_STATE 262144 #define HOST_SOFT_STATE 524288 #define SERVICE_SCHEDULED_DOWNTIME 1 #define SERVICE_NO_SCHEDULED_DOWNTIME 2 #define SERVICE_STATE_ACKNOWLEDGED 4 #define SERVICE_STATE_UNACKNOWLEDGED 8 #define SERVICE_CHECKS_DISABLED 16 #define SERVICE_CHECKS_ENABLED 32 #define SERVICE_EVENT_HANDLER_DISABLED 64 #define SERVICE_EVENT_HANDLER_ENABLED 128 #define SERVICE_FLAP_DETECTION_ENABLED 256 #define SERVICE_FLAP_DETECTION_DISABLED 512 #define SERVICE_IS_FLAPPING 1024 #define SERVICE_IS_NOT_FLAPPING 2048 #define SERVICE_NOTIFICATIONS_DISABLED 4096 #define SERVICE_NOTIFICATIONS_ENABLED 8192 #define SERVICE_PASSIVE_CHECKS_DISABLED 16384 #define SERVICE_PASSIVE_CHECKS_ENABLED 32768 #define SERVICE_PASSIVE_CHECK 65536 #define SERVICE_ACTIVE_CHECK 131072 #define SERVICE_HARD_STATE 262144 #define SERVICE_SOFT_STATE 524288 /****************************** SSI TYPES ********************************/ #define SSI_HEADER 0 #define SSI_FOOTER 1 /************************ CONTEXT-SENSITIVE HELP *************************/ #define CONTEXTHELP_STATUS_DETAIL "A1" #define CONTEXTHELP_STATUS_HGOVERVIEW "A2" #define CONTEXTHELP_STATUS_HGSUMMARY "A3" #define CONTEXTHELP_STATUS_HGGRID "A4" #define CONTEXTHELP_STATUS_SVCPROBLEMS "A5" #define CONTEXTHELP_STATUS_HOST_DETAIL "A6" #define CONTEXTHELP_STATUS_HOSTPROBLEMS "A7" #define CONTEXTHELP_STATUS_SGOVERVIEW "A8" #define CONTEXTHELP_STATUS_SGSUMMARY "A9" #define CONTEXTHELP_STATUS_SGGRID "A10" #define CONTEXTHELP_TAC "B1" #define CONTEXTHELP_MAP "C1" #define CONTEXTHELP_LOG "D1" #define CONTEXTHELP_HISTORY "E1" #define CONTEXTHELP_NOTIFICATIONS "F1" #define CONTEXTHELP_TRENDS_MENU1 "G1" #define CONTEXTHELP_TRENDS_MENU2 "G2" #define CONTEXTHELP_TRENDS_MENU3 "G3" #define CONTEXTHELP_TRENDS_MENU4 "G4" #define CONTEXTHELP_TRENDS_HOST "G5" #define CONTEXTHELP_TRENDS_SERVICE "G6" #define CONTEXTHELP_AVAIL_MENU1 "H1" #define CONTEXTHELP_AVAIL_MENU2 "H2" #define CONTEXTHELP_AVAIL_MENU3 "H3" #define CONTEXTHELP_AVAIL_MENU4 "H4" #define CONTEXTHELP_AVAIL_MENU5 "H5" #define CONTEXTHELP_AVAIL_HOSTGROUP "H6" #define CONTEXTHELP_AVAIL_HOST "H7" #define CONTEXTHELP_AVAIL_SERVICE "H8" #define CONTEXTHELP_AVAIL_SERVICEGROUP "H9" #define CONTEXTHELP_EXT_HOST "I1" #define CONTEXTHELP_EXT_SERVICE "I2" #define CONTEXTHELP_EXT_HOSTGROUP "I3" #define CONTEXTHELP_EXT_PROCESS "I4" #define CONTEXTHELP_EXT_PERFORMANCE "I5" #define CONTEXTHELP_EXT_COMMENTS "I6" #define CONTEXTHELP_EXT_DOWNTIME "I7" #define CONTEXTHELP_EXT_QUEUE "I8" #define CONTEXTHELP_EXT_SERVICEGROUP "I9" #define CONTEXTHELP_CMD_INPUT "J1" #define CONTEXTHELP_CMD_COMMIT "J2" #define CONTEXTHELP_OUTAGES "K1" #define CONTEXTHELP_CONFIG_MENU "L1" #define CONTEXTHELP_CONFIG_HOSTS "L2" #define CONTEXTHELP_CONFIG_HOSTDEPENDENCIES "L3" #define CONTEXTHELP_CONFIG_HOSTESCALATIONS "L4" #define CONTEXTHELP_CONFIG_HOSTGROUPS "L5" #define CONTEXTHELP_CONFIG_HOSTGROUPESCALATIONS "L6" #define CONTEXTHELP_CONFIG_SERVICES "L7" #define CONTEXTHELP_CONFIG_SERVICEDEPENDENCIES "L8" #define CONTEXTHELP_CONFIG_SERVICEESCALATIONS "L9" #define CONTEXTHELP_CONFIG_CONTACTS "L10" #define CONTEXTHELP_CONFIG_CONTACTGROUPS "L11" #define CONTEXTHELP_CONFIG_TIMEPERIODS "L12" #define CONTEXTHELP_CONFIG_COMMANDS "L13" #define CONTEXTHELP_CONFIG_HOSTEXTINFO "L14" #define CONTEXTHELP_CONFIG_SERVICEEXTINFO "L15" #define CONTEXTHELP_CONFIG_SERVICEGROUPS "L16" #define CONTEXTHELP_HISTOGRAM_MENU1 "M1" #define CONTEXTHELP_HISTOGRAM_MENU2 "M2" #define CONTEXTHELP_HISTOGRAM_MENU3 "M3" #define CONTEXTHELP_HISTOGRAM_MENU4 "M4" #define CONTEXTHELP_HISTOGRAM_HOST "M5" #define CONTEXTHELP_HISTOGRAM_SERVICE "M6" #define CONTEXTHELP_SUMMARY_MENU "N1" #define CONTEXTHELP_SUMMARY_RECENT_ALERTS "N2" #define CONTEXTHELP_SUMMARY_ALERT_TOTALS "N3" #define CONTEXTHELP_SUMMARY_HOSTGROUP_ALERT_TOTALS "N4" #define CONTEXTHELP_SUMMARY_HOST_ALERT_TOTALS "N5" #define CONTEXTHELP_SUMMARY_SERVICE_ALERT_TOTALS "N6" #define CONTEXTHELP_SUMMARY_ALERT_PRODUCERS "N7" #define CONTEXTHELP_SUMMARY_SERVICEGROUP_ALERT_TOTALS "N8" /************************** LIFO RETURN CODES ****************************/ #define LIFO_OK 0 #define LIFO_ERROR_MEMORY 1 #define LIFO_ERROR_FILE 2 #define LIFO_ERROR_DATA 3 /*************************** DATA STRUCTURES *****************************/ /* LIFO data structure */ typedef struct lifo_struct{ char *data; struct lifo_struct *next; }lifo; /* MMAPFILE structure - used for reading files via mmap() */ typedef struct mmapfile_struct{ char *path; int mode; int fd; unsigned long file_size; unsigned long current_position; unsigned long current_line; void *mmap_buf; }mmapfile; /******************************** FUNCTIONS *******************************/ void reset_cgi_vars(void); void free_cgi_vars(void); void free_memory(void); char * get_cgi_config_location(void); /* gets location of the CGI config file to read */ char * get_cmd_file_location(void); /* gets location of external command file to write to */ int read_cgi_config_file(char *); int read_main_config_file(char *); int read_all_object_configuration_data(char *,int); int read_all_status_data(char *,int); int hashfunc(const char *name1, const char *name2, int hashslots); int compare_hashdata2(const char *,const char *,const char *,const char *); void strip(char *); /* strips newlines, carriage returns, and spaces from end of buffer */ char *unescape_newlines(char *); void sanitize_plugin_output(char *); /* strips HTML and bad characters from plugin output */ void strip_html_brackets(char *); /* strips > and < from string */ int process_macros(char *,char **,int); /* processes macros in a string */ void get_time_string(time_t *,char *,int,int); /* gets a date/time string */ void get_interval_time_string(double,char *,int); /* gets a time string for an interval of time */ void get_expire_time_string(time_t *,char *,int); /* gets a date/time string in the format used for Expire: tags*/ char * my_strtok(char *,char *); /* replacement for strtok() function - doesn't skip multiple tokens */ char * my_strsep (char **, const char *); #ifdef REMOVED_10182007 int my_free(void **); /* my wrapper for free() */ #endif char * url_encode(char *); /* encodes a string in proper URL format */ char * html_encode(char *,int); /* encodes a string in HTML format (for what the user sees) */ void get_time_breakdown(unsigned long,int *,int *,int *,int *); /* given total seconds, get days, hours, minutes, seconds */ void get_log_archive_to_use(int,char *,int); /* determines the name of the log archive to use */ void determine_log_rotation_times(int); int determine_archive_to_use_from_time(time_t); void print_extra_hostgroup_url(char *,char *); void print_extra_servicegroup_url(char *,char *); void display_info_table(char *,int,authdata *); void display_nav_table(char *,int); void display_splunk_host_url(host *); void display_splunk_service_url(service *); void display_splunk_generic_url(char *,int); void strip_splunk_query_terms(char *); void include_ssi_files(char *,int); /* include user-defined SSI footers/headers */ void include_ssi_file(char *); /* include user-defined SSI footer/header */ void cgi_config_file_error(char *); void main_config_file_error(char *); void object_data_error(void); void status_data_error(void); void display_context_help(char *); /* displays context-sensitive help window */ int read_file_into_lifo(char *); /* LIFO functions */ void free_lifo_memory(void); int push_lifo(char *); char *pop_lifo(void); mmapfile *mmap_fopen(char *); /* open a file read-only using mmap() */ int mmap_fclose(mmapfile *); char *mmap_fgets(mmapfile *); char *mmap_fgets_multiline(mmapfile *); #ifdef __cplusplus } #endif #endif ndoutils-1.4b9/include/nagios-3x/sretention.h0000644000175100017510000000243010550310756021345 0ustar baeckerhbaeckerh/***************************************************************************** * * SRETENTION.H - Header for state retention routines * * Copyright (c) 1999-2006 Ethan Galstad (nagios@nagios.org) * Last Modified: 02-28-2006 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifdef __cplusplus extern "C" { #endif int initialize_retention_data(char *); int cleanup_retention_data(char *); int save_state_information(int); /* saves all host and state information */ int read_initial_state_information(void); /* reads in initial host and state information */ #ifdef __cplusplus } #endif ndoutils-1.4b9/include/config.h.in0000644000175100017510000001101111253701323017203 0ustar baeckerhbaeckerh/************************************************************************ * * NDBXT Includes * Copyright (c) 2005-2007 Ethan Galstad * Last Modified: 10-19-2007 * ************************************************************************/ #ifndef _CONFIG_H #define _CONFIG_H #include #include #undef STDC_HEADERS #undef HAVE_STRDUP #undef HAVE_STRSTR #undef HAVE_STRTOUL #undef HAVE_INITGROUPS #undef HAVE_STRTOF #undef SIZEOF_INT #undef SIZEOF_SHORT #undef SIZEOF_LONG /* stupid stuff for u_int32_t */ #undef U_INT32_T_IS_USHORT #undef U_INT32_T_IS_UINT #undef U_INT32_T_IS_ULONG #undef U_INT32_T_IS_UINT32_T #ifdef U_INT32_T_IS_USHORT typedef unsigned short u_int32_t; #endif #ifdef U_INT32_T_IS_ULONG typedef unsigned long u_int32_t; #endif #ifdef U_INT32_T_IS_UINT typedef unsigned int u_int32_t; #endif #ifdef U_INT32_T_IS_UINT32_t typedef uint32_t u_int32_t; #endif /* stupid stuff for int32_t */ #undef INT32_T_IS_SHORT #undef INT32_T_IS_INT #undef INT32_T_IS_LONG #ifdef INT32_T_IS_USHORT typedef short int32_t; #endif #ifdef INT32_T_IS_ULONG typedef long int32_t; #endif #ifdef INT32_T_IS_UINT typedef int int32_t; #endif #define SOCKET_SIZE_TYPE "" #define GETGROUPS_T "" #define RETSIGTYPE "" #undef HAVE_GETOPT_H #ifdef HAVE_GETOPT_H #include #endif #undef HAVE_STRINGS_H #undef HAVE_STRING_H #ifdef HAVE_STRINGS_H #include #endif #ifdef HAVE_STRING_H #include #endif #undef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H #include #endif #undef HAVE_STDARG_H #ifdef HAVE_STDARG_H #include #endif #undef HAVE_SIGNAL_H #ifdef HAVE_SIGNAL_H #include #endif #undef HAVE_SYSLOG_H #ifdef HAVE_SYSLOG_H #include #endif #undef HAVE_SYS_STAT_H #ifdef HAVE_SYS_STAT_H #include #endif #undef HAVE_FCNTL_H #ifdef HAVE_FCNTL_H #include #endif #undef HAVE_SYS_SENDFILE_H #ifdef HAVE_SYS_SENDFILE_H #include #endif #undef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H #include #endif #undef HAVE_SYS_WAIT_H #ifdef HAVE_SYS_WAIT_H #include #endif #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif #undef HAVE_ERRNO_H #ifdef HAVE_ERRNO_H #include #endif #undef HAVE_SYS_MMAN_H #ifdef HAVE_SYS_MMAN_H #include #endif /* needed for the time_t structures we use later... */ #undef TIME_WITH_SYS_TIME #undef HAVE_SYS_TIME_H #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #undef HAVE_SYS_UN_H #ifdef HAVE_SYS_UN_H #include #endif #undef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H #include #endif /* Define to 'int' if does not define */ #undef socklen_t #undef HAVE_SOCKET_H #ifdef HAVE_SOCKET_H #include #endif /* Solaris 8 doesn't have SUN_LEN */ #undef HAVE_SUN_LEN #ifndef HAVE_SUN_LEN #define SUN_LEN(sunp) ((size_t)((struct sockaddr_un *)0)->sun_path + strlen((sunp)->sun_path)) #endif #undef HAVE_TCPD_H #ifdef HAVE_TCPD_H #include #endif #undef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H #include #endif #undef HAVE_ARPA_INET_H #ifdef HAVE_ARPA_INET_H #include #endif #undef HAVE_NETDB_H #ifdef HAVE_NETDB_H #include #endif #undef HAVE_CTYPE_H #ifdef HAVE_CTYPE_H #include #endif #undef HAVE_PWD_H #ifdef HAVE_PWD_H #include #endif #undef HAVE_GRP_H #ifdef HAVE_GRP_H #include #endif #undef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H #include #endif #undef HAVE_INTTYPES_H #undef HAVE_STDINT_H #ifdef HAVE_INTTYPES_H #include #else #ifdef HAVE_STDINT_H #include #endif #endif #undef HAVE_MATH_H #ifdef HAVE_MATH_H #include #endif #undef HAVE_FLOAT_H #ifdef HAVE_FLAT_H #include #endif #undef HAVE_LIMITS_H #ifdef HAVE_LIMITS_H #include #endif #undef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H #include #endif #undef HAVE_VALUES_H #ifdef HAVE_VALUES_H #include #endif #undef USE_MYSQL #undef HAVE_MYSQL #ifdef USE_MYSQL #define HAVE_MYSQL 1 #include #include #endif #undef USE_PGSQL #undef HAVE_PGSQL #ifdef USE_PGSQL #define HAVE_PGSQL 1 #include #endif #undef HAVE_SSL #ifdef HAVE_SSL #include #include #include #include #include #include #include #endif #endif ndoutils-1.4b9/update-version0000755000175100017510000000571611271525175016460 0ustar baeckerhbaeckerh#!/bin/sh # Get date (two formats) if [ -n "$2" ]; then LONGDATE=`date -d "$2" "+%B %d, %Y"` SHORTDATE=`date -d "$2" "+%m-%d-%Y"` else LONGDATE=`date "+%B %d, %Y"` SHORTDATE=`date "+%m-%d-%Y"` fi # Current version number CURRENTVERSION=1.4b9 # Last date LASTDATE=10-27-2009 if [ "x$1" = "x" ] then echo "Usage: $0 [revision date]" echo "" echo "Run this script with the name of the new version (i.e \"1.4\") to" echo "update version number and modification date in files." echo "Use the \"newdate\" argument if you want to keep the current version" echo "number and just update the modification date." echo "" echo "Current version=$CURRENTVERSION" echo "Current Modification date=$LASTDATE" echo "" exit 1 fi newversion=$1 if [ "x$newversion" = "xnewdate" ] then newversion=$CURRENTVERSION fi # Update version number and release date in source code perl -i -p -e "s/NDOMOD_VERSION \"[0-9].*\"/NDOMOD_VERSION \"$newversion\"/;" src/ndomod.c perl -i -p -e "s/NDOMOD_DATE \"[0-9].*\"/NDOMOD_DATE \"$SHORTDATE\"/;" src/ndomod.c perl -i -p -e "s/Last Modified: [0-9].*/Last Modified: $SHORTDATE/;" src/ndomod.c perl -i -p -e "s/NDO2DB_VERSION \"[0-9].*\"/NDO2DB_VERSION \"$newversion\"/;" src/ndo2db.c perl -i -p -e "s/NDO2DB_DATE \"[0-9].*\"/NDO2DB_DATE \"$SHORTDATE\"/;" src/ndo2db.c perl -i -p -e "s/Last Modified: [0-9].*/Last Modified: $SHORTDATE/;" src/ndo2db.c perl -i -p -e "s/LOG2NDO_VERSION \"[0-9].*\"/LOG2NDO_VERSION \"$newversion\"/;" src/log2ndo.c perl -i -p -e "s/LOG2NDO_DATE \"[0-9].*\"/LOG2NDO_DATE \"$SHORTDATE\"/;" src/log2ndo.c perl -i -p -e "s/Last Modified: [0-9].*/Last Modified: $SHORTDATE/;" src/log2ndo.c perl -i -p -e "s/FILE2SOCK_VERSION \"[0-9].*\"/FILE2SOCK_VERSION \"$newversion\"/;" src/file2sock.c perl -i -p -e "s/FILE2SOCK_DATE \"[0-9].*\"/FILE2SOCK_DATE \"$SHORTDATE\"/;" src/file2sock.c perl -i -p -e "s/Last Modified: [0-9].*/Last Modified: $SHORTDATE/;" src/file2sock.c perl -i -p -e "s/SOCKDEBUG_VERSION \"[0-9].*\"/SOCKDEBUG_VERSION \"$newversion\"/;" src/sockdebug.c perl -i -p -e "s/SOCKDEBUG_DATE \"[0-9].*\"/SOCKDEBUG_DATE \"$SHORTDATE\"/;" src/sockdebug.c perl -i -p -e "s/Last Modified: [0-9].*/Last Modified: $SHORTDATE/;" src/sockdebug.c perl -i -p -e "s/$thisversion=\"[0-9].*\";/$thisversion=\"$newversion\";/;" db/installdb perl -i -p -e "s/$thisversion=\"[0-9].*\";/$thisversion=\"$newversion\";/;" db/upgradedb # Update version number and release date in configure script and configure.in perl -i -p -e "s/PKG_VERSION=.*/PKG_VERSION=\"$newversion\"/;" configure perl -i -p -e "s/PKG_REL_DATE=.*\"/PKG_REL_DATE=\"$SHORTDATE\"/;" configure perl -i -p -e "s/PKG_VERSION=.*/PKG_VERSION=\"$newversion\"/;" configure.in perl -i -p -e "s/PKG_REL_DATE=.*\"/PKG_REL_DATE=\"$SHORTDATE\"/;" configure.in # Update this file with version number and last date perl -i -p -e "s/^CURRENTVERSION=.*/CURRENTVERSION=$newversion/;" update-version perl -i -p -e "s/^LASTDATE=.*/LASTDATE=$SHORTDATE/;" update-version ndoutils-1.4b9/daemon-init.in0000755000175100017510000001013511226072123016301 0ustar baeckerhbaeckerh#!/bin/sh # ### BEGIN INIT INFO # Provides: ndo2db # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Nagios NDO2DB Initscript # Description: Nagios Data Out Daemon ### END INIT INFO # chkconfig: 345 99 01 # # File : ndo2db # # Author : Jorge Sanchez Aymar (jsanchez@lanchile.cl) # # Changelog : # # 1999-07-09 Karl DeBisschop # - setup for autoconf # - add reload function # 1999-08-06 Ethan Galstad # - Added configuration info for use with RedHat's chkconfig tool # per Fran Boon's suggestion # 1999-08-13 Jim Popovitch # - added variable for nagios/var directory # - cd into nagios/var directory before creating tmp files on startup # 1999-08-16 Ethan Galstad # - Added test for rc.d directory as suggested by Karl DeBisschop # 2000-07-23 Karl DeBisschop # - Clean out redhat macros and other dependencies # 2003-01-11 Ethan Galstad # - Updated su syntax (Gary Miller) # 2009-07-11 Hendrik Bäcker # - Rewrite ndo2db init script, inspired by Sascha Runschke # # status_ndo2db () { pid_ndo2db if ps -p $Ndo2dbPID > /dev/null 2>&1; then return 0 else if test -f $Ndo2dbLockDir/$Ndo2dbLockFile; then return 2 else return 1 fi fi return 1 } printstatus_ndo2db() { if status_ndo2db $1 $2; then echo "$servicename (pid $Ndo2dbPID) is running..." elif test $? == 2; then echo "$servicename is not running but subsystem locked" else echo "$servicename is not running" fi } killproc_ndo2db () { kill $2 $Ndo2dbPID } pid_ndo2db () { if test ! -f $Ndo2dbRunFile; then return 1 fi Ndo2dbPID=`head -n 1 $Ndo2dbRunFile` return 0 } # Source function library # Solaris doesn't have an rc.d directory, so do a test first if [ -f /etc/rc.d/init.d/functions ]; then . /etc/rc.d/init.d/functions elif [ -f /etc/init.d/functions ]; then . /etc/init.d/functions fi servicename=ndo2db prefix=@prefix@ exec_prefix=${prefix} Ndo2dbBin=@bindir@/ndo2db Ndo2dbCfgFile=@sysconfdir@/ndo2db.cfg Ndo2dbVarDir=@localstatedir@ Ndo2dbRunFile=$Ndo2dbVarDir/ndo2db.lock Ndo2dbLockDir=/var/lock/subsys Ndo2dbLockFile=ndo2db Ndo2dbUser=nagios Ndo2dbGroup=nagios # Check that ndo2db exists. if [ ! -f $Ndo2dbBin ]; then echo "Executable file $Ndo2dbBin not found. Exiting." exit 1 fi # Check that ndo2db.cfg exists. if [ ! -f $Ndo2dbCfgFile ]; then echo "Configuration file $Ndo2dbCfgFile not found. Exiting." exit 1 fi # See how we were called. case "$1" in start) status_ndo2db if [ $? -eq 0 ]; then echo "$servicename already started..." exit 1 fi echo -n "Starting $servicename:" touch $Ndo2dbRunFile chown $Ndo2dbUser:$Ndo2dbGroup $Ndo2dbRunFile $Ndo2dbBin -c $Ndo2dbCfgFile if [ -d $Ndo2dbLockDir ]; then touch $Ndo2dbLockDir/$Ndo2dbLockFile; fi echo " done." exit 0 ;; stop) status_ndo2db if ! [ $? -eq 0 ]; then echo "$servicename was not running... could not stop" exit 1 fi echo -n "Stopping $servicename: " pid_ndo2db killproc_ndo2db ndo2db # now we have to wait for ndo2db to exit and remove its # own Ndo2dbRunFile, otherwise a following "start" could # happen, and then the exiting ndo2db will remove the # new Ndo2dbRunFile, allowing multiple ndo2db daemons # to (sooner or later) run - John Sellens #echo -n 'Waiting for ndo2db to exit .' for i in 1 2 3 4 5 6 7 8 9 10 ; do if status_ndo2db > /dev/null; then echo -n '.' sleep 1 else break fi done if status_ndo2db > /dev/null; then echo '' echo 'Warning - $servicename did not exit in a timely manner' else echo 'done.' fi rm -f $Ndo2dbStatusFile $Ndo2dbRunFile $Ndo2dbLockDir/$Ndo2dbLockFile $Ndo2dbCommandFile ;; status) printstatus_ndo2db ;; restart) $0 stop $0 start ;; *) echo "Usage: $servicename {start|stop|restart|status}" exit 1 ;; esac # End of this script ndoutils-1.4b9/make-tarball0000755000175100017510000000077111227337247016045 0ustar baeckerhbaeckerh#! /bin/sh if [ "x$1" = "x" ] then echo "Usage: $0 " exit 1 fi if test -e Makefile; then make distclean fi autoconf # Update version number and modification date in code ./update-version $1 PWDSAVE=`pwd` PACKAGE=ndoutils pushd .. if [ ! -d $PACKAGE-$1 ]; then ln -s `basename $PWDSAVE` $PACKAGE-$1 fi tar zhcvf $PACKAGE-$1.tar.gz --exclude RCS --exclude CVS --exclude ".git" --exclude autom4te.cache --exclude build-* --exclude *~ --exclude .\#* $PACKAGE-$1 #rm $PACKAGE-$1 popd ndoutils-1.4b9/TODO0000644000175100017510000000372610550310745014246 0ustar baeckerhbaeckerh-------- NDO TODO -------- Updated: 12/27/2005 There are still a number of things that need to be worked on with this project they include. 1. Change fields of type VARCHAR(255) to BLOBs. VARCHAR fields were easier for me to debug things as I was developing this addon, but several text fields can be longer than 255 chars. Nagios 3.0 will allow multi-line plugin output, so this is especially important for future compatability. 2. Creation of a data dictionary to clearly explain each field present in all the tables. Also, define different possible values (constants) for each numeric field. This will aid in the quick development of a new web interface based off the data. 3. Creation of a SOCKSPLIT utility. The NDO module will only write output to a single UNIX domain or TCP socket (this has been done to minimize the potential overhead within the Nagios daemon). Since it might be useful to have output from the NDO module written to multiple databases (this would require multiple instances of the NDO2DB daemon to be running), there needs to be a way to replicate the output of the NDO module to more than one output socket. The SOCKSPLIT utility will create a single UNIX domain socket and listen for an incoming connection request. Upon a client connecting, any output from the client will be sent to multiple (destination) UNIX domain sockets. An NDO2DB daemon can be listening on the other end of each destination socket. The SOCKSPLIT utility will incorporate some method of buffering data if one or more destination sockets are closed for a period of time. This should make things resistant to situations where, for instance, NDO2DB daemons are unavailable because they are being restarted. 4. Testing, testing, testing! This addon has not been testing extensively and likely contains a number of bugs. However, its a good start, so send me your comments and patches! ndoutils-1.4b9/configure0000755000175100017510000064033611271525175015477 0ustar baeckerhbaeckerh#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="src/ndo2db.c" ac_default_prefix=/usr/local/nagios # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA INSTALL PERL build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT SET_MAKE CPP GREP EGREP OTHERLIBS SOCKETLIBS LIBWRAPLIBS init_dir MOD_CFLAGS MOD_LDFLAGS np_mysql_config DBCFLAGS DBLDFLAGS DBLIBS ndo2db_user ndo2db_group INSTALL_OPTS HAVE_SSL LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-mysql enables MySQL database support --enable-ssl enables native SSL support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-init-dir= sets directory to place init script into --with-mysql=DIR Locates mysql libraries. Expects DIR/bin/mysql_config. Default to search for mysql_config in PATH --with-ndo2db-user= sets user name to run NDO2DB --with-ndo2db-group= sets group name to run NDO2DB --with-ssl=DIR sets location of the SSL installation --with-ssl-inc=DIR sets location of the SSL include files --with-ssl-lib=DIR sets location of the SSL libraries --with-kerberos-inc=DIR sets location of the Kerberos include files Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers include/config.h" cat >>confdefs.h <<\_ACEOF #define DEFAULT_NAGIOS_USER nagios _ACEOF cat >>confdefs.h <<\_ACEOF #define DEFAULT_NAGIOS_GROUP nagios _ACEOF PKG_NAME=ndoutils PKG_VERSION="1.4b9" PKG_HOME_URL="http://www.nagios.org/" PKG_REL_DATE="10-27-2009" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_PERL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { echo "$as_me:$LINENO: result: $PERL" >&5 echo "${ECHO_T}$PERL" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi { echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; } if test "${ac_cv_header_time+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_time=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 echo "${ECHO_T}$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then cat >>confdefs.h <<\_ACEOF #define TIME_WITH_SYS_TIME 1 _ACEOF fi { echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; } if test "${ac_cv_header_sys_wait_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_sys_wait_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_SYS_WAIT_H 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h ctype.h dirent.h dlfcn.h errno.h fcntl.h float.h getopt.h grp.h inttypes.h limits.h ltdl.h math.h netdb.h netinet/in.h pthread.h pwd.h regex.h signal.h socket.h stdarg.h stdint.h string.h strings.h sys/ipc.h sys/mman.h sys/msg.h sys/poll.h sys/resource.h sys/sendfile.h sys/socket.h sys/stat.h sys/time.h sys/timeb.h sys/types.h sys/un.h sys/wait.h syslog.h tcpd.h unistd.h values.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi { echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6; } if test "${ac_cv_struct_tm+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_struct_tm=time.h else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 echo "${ECHO_T}$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then cat >>confdefs.h <<\_ACEOF #define TM_IN_SYS_TIME 1 _ACEOF fi { echo "$as_me:$LINENO: checking for mode_t" >&5 echo $ECHO_N "checking for mode_t... $ECHO_C" >&6; } if test "${ac_cv_type_mode_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef mode_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_mode_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_mode_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5 echo "${ECHO_T}$ac_cv_type_mode_t" >&6; } if test $ac_cv_type_mode_t = yes; then : else cat >>confdefs.h <<_ACEOF #define mode_t int _ACEOF fi { echo "$as_me:$LINENO: checking for pid_t" >&5 echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; } if test "${ac_cv_type_pid_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef pid_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_pid_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 echo "${ECHO_T}$ac_cv_type_pid_t" >&6; } if test $ac_cv_type_pid_t = yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef size_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6; } if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { echo "$as_me:$LINENO: checking return type of signal handlers" >&5 echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; } if test "${ac_cv_type_signal+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_signal=int else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 echo "${ECHO_T}$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF { echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5 echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6; } if test "${ac_cv_type_uid_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5 echo "${ECHO_T}$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then cat >>confdefs.h <<\_ACEOF #define uid_t int _ACEOF cat >>confdefs.h <<\_ACEOF #define gid_t int _ACEOF fi { echo "$as_me:$LINENO: checking type of array argument to getgroups" >&5 echo $ECHO_N "checking type of array argument to getgroups... $ECHO_C" >&6; } if test "${ac_cv_type_getgroups+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_type_getgroups=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Thanks to Mike Rendell for this test. */ $ac_includes_default #define NGID 256 #undef MAX #define MAX(x, y) ((x) > (y) ? (x) : (y)) int main () { gid_t gidset[NGID]; int i, n; union { gid_t gval; long int lval; } val; val.lval = -1; for (i = 0; i < NGID; i++) gidset[i] = val.gval; n = getgroups (sizeof (gidset) / MAX (sizeof (int), sizeof (gid_t)) - 1, gidset); /* Exit non-zero if getgroups seems to require an array of ints. This happens when gid_t is short int but getgroups modifies an array of ints. */ return n > 0 && gidset[n] != val.gval; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_getgroups=gid_t else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_type_getgroups=int fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_type_getgroups = cross; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "getgroups.*int.*gid_t" >/dev/null 2>&1; then ac_cv_type_getgroups=gid_t else ac_cv_type_getgroups=int fi rm -f conftest* fi fi { echo "$as_me:$LINENO: result: $ac_cv_type_getgroups" >&5 echo "${ECHO_T}$ac_cv_type_getgroups" >&6; } cat >>confdefs.h <<_ACEOF #define GETGROUPS_T $ac_cv_type_getgroups _ACEOF { echo "$as_me:$LINENO: checking for int" >&5 echo $ECHO_N "checking for int... $ECHO_C" >&6; } if test "${ac_cv_type_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef int ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_int=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_int=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 echo "${ECHO_T}$ac_cv_type_int" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of int" >&5 echo $ECHO_N "checking size of int... $ECHO_C" >&6; } if test "${ac_cv_sizeof_int+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef int ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_int=$ac_lo;; '') if test "$ac_cv_type_int" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (int) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_int=0 fi ;; esac else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef int ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_int=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) if test "$ac_cv_type_int" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (int) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_int=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 echo "${ECHO_T}$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF { echo "$as_me:$LINENO: checking for short" >&5 echo $ECHO_N "checking for short... $ECHO_C" >&6; } if test "${ac_cv_type_short+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef short ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_short=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_short=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 echo "${ECHO_T}$ac_cv_type_short" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of short" >&5 echo $ECHO_N "checking size of short... $ECHO_C" >&6; } if test "${ac_cv_sizeof_short+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef short ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef short ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef short ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef short ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef short ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_short=$ac_lo;; '') if test "$ac_cv_type_short" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (short) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (short) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_short=0 fi ;; esac else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef short ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_short=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) if test "$ac_cv_type_short" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (short) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (short) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_short=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 echo "${ECHO_T}$ac_cv_sizeof_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF { echo "$as_me:$LINENO: checking for long" >&5 echo $ECHO_N "checking for long... $ECHO_C" >&6; } if test "${ac_cv_type_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_long=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 echo "${ECHO_T}$ac_cv_type_long" >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { echo "$as_me:$LINENO: checking size of long" >&5 echo $ECHO_N "checking size of long... $ECHO_C" >&6; } if test "${ac_cv_sizeof_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=0 ac_mid=0 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr $ac_mid + 1` if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=-1 ac_mid=-1 while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_lo=$ac_mid; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_hi=`expr '(' $ac_mid ')' - 1` if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi ac_mid=`expr 2 '*' $ac_mid` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; int main () { static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_hi=$ac_mid else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_lo=`expr '(' $ac_mid ')' + 1` fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in ?*) ac_cv_sizeof_long=$ac_lo;; '') if test "$ac_cv_type_long" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_long=0 fi ;; esac else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef long ac__type_sizeof_; static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (((long int) (sizeof (ac__type_sizeof_))) < 0) { long int i = longval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%ld\n", i); } else { unsigned long int i = ulongval (); if (i != ((long int) (sizeof (ac__type_sizeof_)))) return 1; fprintf (f, "%lu\n", i); } return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_sizeof_long=`cat conftest.val` else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) if test "$ac_cv_type_long" = yes; then { { echo "$as_me:$LINENO: error: cannot compute sizeof (long) See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute sizeof (long) See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } else ac_cv_sizeof_long=0 fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.val fi { echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 echo "${ECHO_T}$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF { echo "$as_me:$LINENO: checking for uint32_t" >&5 echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6; } if test "${ac_cv_type_uint32_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef uint32_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_uint32_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_uint32_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5 echo "${ECHO_T}$ac_cv_type_uint32_t" >&6; } if test $ac_cv_type_uint32_t = yes; then : else cat >>confdefs.h <<_ACEOF #define uint32_t unsigned int _ACEOF fi { echo "$as_me:$LINENO: checking for u_int32_t" >&5 echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6; } if test "${ac_cv_type_u_int32_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef u_int32_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_u_int32_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_u_int32_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5 echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6; } if test $ac_cv_type_u_int32_t = yes; then : else cat >>confdefs.h <<_ACEOF #define u_int32_t unsigned int _ACEOF fi if test "$ac_cv_type_u_int32_t" = no ; then if test "$ac_cv_type_u_int32_t" = yes ; then cat >>confdefs.h <<\_ACEOF #define U_INT32_T_IS_UINT32_T 1 _ACEOF else if test "$ac_cv_sizeof_int" = 4 ; then cat >>confdefs.h <<\_ACEOF #define U_INT32_T_IS_UINT 1 _ACEOF else if test "$ac_cv_sizeof_long" = 4 ; then cat >>confdefs.h <<\_ACEOF #define U_INT32_T_IS_ULONG 1 _ACEOF else if test "$ac_cv_sizeof_short" = 4 ; then cat >>confdefs.h <<\_ACEOF #define U_INT32_T_IS_USHORT 1 _ACEOF fi fi fi fi fi { echo "$as_me:$LINENO: checking for int32_t" >&5 echo $ECHO_N "checking for int32_t... $ECHO_C" >&6; } if test "${ac_cv_type_int32_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef int32_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_int32_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_int32_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 echo "${ECHO_T}$ac_cv_type_int32_t" >&6; } if test $ac_cv_type_int32_t = yes; then : else cat >>confdefs.h <<_ACEOF #define int32_t int _ACEOF fi if test "$ac_cv_type_int32_t" = no ; then if test "$ac_cv_sizeof_int" = 4 ; then cat >>confdefs.h <<\_ACEOF #define INT32_T_IS_UINT 1 _ACEOF else if test "$ac_cv_sizeof_long" = 4 ; then cat >>confdefs.h <<\_ACEOF #define INT32_T_IS_ULONG 1 _ACEOF else if test "$ac_cv_sizeof_short" = 4 ; then cat >>confdefs.h <<\_ACEOF #define INT32_T_IS_USHORT 1 _ACEOF fi fi fi fi for ac_func in getopt_long do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else { echo "$as_me:$LINENO: checking for getopt_long in -liberty" >&5 echo $ECHO_N "checking for getopt_long in -liberty... $ECHO_C" >&6; } if test "${ac_cv_lib_iberty_getopt_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liberty $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getopt_long (); int main () { return getopt_long (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_iberty_getopt_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_iberty_getopt_long=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_iberty_getopt_long" >&5 echo "${ECHO_T}$ac_cv_lib_iberty_getopt_long" >&6; } if test $ac_cv_lib_iberty_getopt_long = yes; then OTHERLIBS="$OTHERLIBS -liberty" fi fi done { echo "$as_me:$LINENO: checking for main in -lnsl" >&5 echo $ECHO_N "checking for main in -lnsl... $ECHO_C" >&6; } if test "${ac_cv_lib_nsl_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_nsl_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_nsl_main=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_main" >&5 echo "${ECHO_T}$ac_cv_lib_nsl_main" >&6; } if test $ac_cv_lib_nsl_main = yes; then SOCKETLIBS="$SOCKETLIBS -lnsl" fi { echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6; } if test "${ac_cv_lib_socket_socket+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_socket_socket=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_socket_socket=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6; } if test $ac_cv_lib_socket_socket = yes; then SOCKETLIBS="$SOCKETLIBS -lsocket" fi { echo "$as_me:$LINENO: checking for main in -lwrap" >&5 echo $ECHO_N "checking for main in -lwrap... $ECHO_C" >&6; } if test "${ac_cv_lib_wrap_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lwrap $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_wrap_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_wrap_main=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_wrap_main" >&5 echo "${ECHO_T}$ac_cv_lib_wrap_main" >&6; } if test $ac_cv_lib_wrap_main = yes; then LIBWRAPLIBS="$LIBWRAPLIBS -lwrap" cat >>confdefs.h <<\_ACEOF #define HAVE_LIBWRAP 1 _ACEOF fi for ac_func in strdup strstr strtoul initgroups strtof do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for type of socket size" >&5 echo $ECHO_N "checking for type of socket size... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { int a = send(1, (const void *)0, (size_t *) 0, (int *) 0); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define SOCKET_SIZE_TYPE size_t _ACEOF { echo "$as_me:$LINENO: result: size_t" >&5 echo "${ECHO_T}size_t" >&6; } else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >>confdefs.h <<\_ACEOF #define SOCKET_SIZE_TYPE int _ACEOF { echo "$as_me:$LINENO: result: int" >&5 echo "${ECHO_T}int" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { struct sockaddr_un su; int i = SUN_LEN(&su); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then cat >>confdefs.h <<\_ACEOF #define HAVE_SUN_LEN 1 _ACEOF else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext init_dir=/etc/rc.d/init.d if test -d /etc/rc.d/init.d; then init_dir="/etc/rc.d/init.d" elif test -d /usr/local/etc/rc.d; then init_dir="/usr/local/etc/rc.d" elif test -d /etc/rc.d; then init_dir="/etc/rc.d" elif test -d /etc/init.d; then init_dir="/etc/init.d" elif test -d /sbin/init.d; then init_dir="/sbin/init.d" fi # Check whether --with-init_dir was given. if test "${with_init_dir+set}" = set; then withval=$with_init_dir; init_dir=$withval fi { echo "$as_me:$LINENO: checking for linker flags for loadable modules" >&5 echo $ECHO_N "checking for linker flags for loadable modules... $ECHO_C" >&6; } case $host_os in solaris2*|sysv4*) MOD_LDFLAGS="-G" ;; aix4*|aix5*) #MOD_LDFLAGS="-G -bnoentry -bexpall" MOD_LDFLAGS="-G -bM:SRE -bnoentry -bexpall" ;; freebsd2*) # Non-ELF GNU linker MOD_LDFLAGS="-Bshareable" ;; darwin*) # Mach-O linker, a shared lib and a loadable # object file is not the same thing. MOD_LDFLAGS="-bundle -flat_namespace -undefined suppress" MOD_CFLAGS="$MOD_CFLAGS -fno-common" ;; linux* | k*bsd*-gnu*) # assume GNU linker and ELF MOD_LDFLAGS="-shared" MOD_CFLAGS="-fPIC" ;; *) # assume GNU linker and ELF MOD_LDFLAGS="-shared" ;; esac { echo "$as_me:$LINENO: result: $MOD_LDFLAGS" >&5 echo "${ECHO_T}$MOD_LDFLAGS" >&6; } USE_MYSQL=yes # Check whether --enable-mysql was given. if test "${enable_mysql+set}" = set; then enableval=$enable_mysql; fi if test x$enable_mysql = xno; then USE_MYSQL=no fi if test $USE_MYSQL = yes; then # Check whether --with-mysql was given. if test "${with_mysql+set}" = set; then withval=$with_mysql; with_mysql=$withval else with_mysql=yes fi if test "x$with_mysql" != "xno" ; then if test "x$with_mysql" = "xyes" ; then # Extract the first word of "mysql_config", so it can be a program name with args. set dummy mysql_config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_np_mysql_config+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $np_mysql_config in [\\/]* | ?:[\\/]*) ac_cv_path_np_mysql_config="$np_mysql_config" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_np_mysql_config="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi np_mysql_config=$ac_cv_path_np_mysql_config if test -n "$np_mysql_config"; then { echo "$as_me:$LINENO: result: $np_mysql_config" >&5 echo "${ECHO_T}$np_mysql_config" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi else if test -x $with_mysql/bin/mysql_config ; then np_mysql_config="$with_mysql/bin/mysql_config" fi fi if test -z "$np_mysql_config"; then with_mysql="no" else np_mysql_include="`$np_mysql_config --include`" # Mysql 3 does not support --include. --cflags should be sufficient if test $? -ne 0; then np_mysql_include="-I$with_mysql/include" # Guessed location fi np_mysql_libs="`$np_mysql_config --libs`" np_mysql_cflags="`$np_mysql_config --cflags`" _savedcppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $np_mysql_include" { echo "$as_me:$LINENO: checking for mysql_init in -lmysqlclient" >&5 echo $ECHO_N "checking for mysql_init in -lmysqlclient... $ECHO_C" >&6; } if test "${ac_cv_lib_mysqlclient_mysql_init+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmysqlclient $np_mysql_libs $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char mysql_init (); int main () { return mysql_init (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_mysqlclient_mysql_init=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_mysqlclient_mysql_init=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_mysqlclient_mysql_init" >&5 echo "${ECHO_T}$ac_cv_lib_mysqlclient_mysql_init" >&6; } if test $ac_cv_lib_mysqlclient_mysql_init = yes; then with_mysql=$np_mysql_config cat >>confdefs.h <<\_ACEOF #define HAVE_MYSQLCLIENT 1 _ACEOF else with_mysql=no fi CPPFLAGS=$_savedcppflags fi fi if test $with_mysql = "no" ; then echo "" echo "" echo "*** MySQL library could not be located... **************************" echo "" echo "You chose to compile NDOutils with MySQL support, but I was unable to" echo "locate the MySQL library on your system. If the library is" echo "installed, use the --with-mysql-lib argument to specify the" echo "location of the MySQL library." echo "installed, use the --with-mysql=DIR argument to specify the" echo "location of the MySQL library, We assume mysql_config is in DIR/dir" echo "NOTE: After you install the necessary libraries on your system:" echo " 1. Make sure /etc/ld.so.conf has an entry for the directory in" echo " which the MySQL libraries are installed." echo " 2. Run 'ldconfig' to update the run-time linker options." echo " 3. Run 'make devclean' in the NDBXT distribution to clean out" echo " any old references to your previous compile." echo " 4. Rerun the configure script." echo "" echo "TIP: Try the following...." echo " ./configure --with-mysql=/usr/lib/mysql" echo "" echo "********************************************************************" echo "" echo "" USE_MYSQL=no else echo "MySQL library and include file(s) were found!" cat >>confdefs.h <<_ACEOF #define USE_MYSQL 1 _ACEOF DBLIBS="$DBLIBS $np_mysql_libs" CFLAGS="$CFLAGS $np_mysql_include" fi fi save_LDFLAGS="$LDFLAGS" LDFLAGS="${LDFLAGS} ${DBLDFLAGS}" save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="${DBCFLAGS}" save_CFLAGS="$CFLAGS" CFLAGS="${DBCFLAGS}" LDFLAGS="$save_LDFLAGS" CPPFLAGS="$save_CPPFLAGS" CFLAGS="$save_CFLAGS" # Check whether --with-ndo2db_user was given. if test "${with_ndo2db_user+set}" = set; then withval=$with_ndo2db_user; ndo2db_user=$withval else ndo2db_user=nagios fi # Check whether --with-ndo2db_group was given. if test "${with_ndo2db_group+set}" = set; then withval=$with_ndo2db_group; ndo2db_group=$withval else ndo2db_group=nagios fi INSTALL_OPTS="-o $ndo2db_user -g $ndo2db_group" # Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then enableval=$enable_ssl; if test x$enableval = xyes; then check_for_ssl=yes else check_for_ssl=no fi else check_for_ssl=no fi ssl_dir= ssl_inc_dir= ssl_lib_dir= # Check whether --with-ssl was given. if test "${with_ssl+set}" = set; then withval=$with_ssl; ssl_dir=$withval fi # Check whether --with-ssl-inc was given. if test "${with_ssl_inc+set}" = set; then withval=$with_ssl_inc; ssl_inc_dir=$withval fi # Check whether --with-ssl-lib was given. if test "${with_ssl_lib+set}" = set; then withval=$with_ssl_lib; ssl_lib_dir=$withval fi # Check whether --with-kerberos-inc was given. if test "${with_kerberos_inc+set}" = set; then withval=$with_kerberos_inc; kerberos_inc_dir=$withval fi if test x$check_for_ssl = xyes; then { echo "$as_me:$LINENO: checking for SSL headers" >&5 echo $ECHO_N "checking for SSL headers... $ECHO_C" >&6; } found_ssl=no for dir in $ssl_inc_dir $ssl_dir /usr/local/openssl /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr /usr/freeware/lib/openssl; do ssldir="$dir" if test -f "$dir/include/openssl/ssl.h"; then found_ssl=yes CFLAGS="$CFLAGS -I$dir/include/openssl -I$ssldir/include" sslincdir="$dir/include/openssl" break fi if test -f "$dir/include/ssl.h"; then found_ssl=yes CFLAGS="$CFLAGS -I$dir/include" sslincdir="$dir/include" break fi if test -f "$dir/ssl.h"; then found_ssl=yes CFLAGS="$CFLAGS -I$dir" sslincdir="$dir" ssldir="$dir/.." break fi if test -f "$dir/openssl/ssl.h"; then found_ssl=yes CFLAGS="$CFLAGS -I$dir/openssl" sslincdir="$dir/openssl" ssldir="$dir/.." break fi done if test x_$found_ssl != x_yes; then { { echo "$as_me:$LINENO: error: Cannot find ssl headers" >&5 echo "$as_me: error: Cannot find ssl headers" >&2;} { (exit 1); exit 1; }; } else printf "SSL headers found in $ssldir\n"; { echo "$as_me:$LINENO: checking for SSL libraries" >&5 echo $ECHO_N "checking for SSL libraries... $ECHO_C" >&6; } found_ssl=no for dir in $ssl_lib_dir $ssl_dir /usr/lib64 /usr/lib /usr/local/lib /usr/lib/ssl /usr/ssl/lib /usr/openssl/lib /usr/pkg/lib /usr/freeware/lib/openssl; do ssllibdir="$dir" if test -f "$dir/libssl.so"; then found_ssl=yes break fi done if test x_$found_ssl != x_yes; then { { echo "$as_me:$LINENO: error: Cannot find ssl libraries" >&5 echo "$as_me: error: Cannot find ssl libraries" >&2;} { (exit 1); exit 1; }; } else printf "SSL libraries found in $ssllibdir\n"; LDFLAGS="$LDFLAGS -L$ssllibdir"; LIBS="$LIBS -lssl -lcrypto"; cat >>confdefs.h <<_ACEOF #define HAVE_SSL 1 _ACEOF echo "" echo "*** Generating DH Parameters for SSL/TLS ***" if test -f "$ssldir/sbin/openssl"; then sslbin=$ssldir/sbin/openssl else sslbin=$ssldir/bin/openssl fi # awk to strip off meta data at bottom of dhparam output $sslbin dhparam -C 512 | awk '/^-----/ {exit} {print}' > include/dh.h fi fi { echo "$as_me:$LINENO: checking for Kerberos include files" >&5 echo $ECHO_N "checking for Kerberos include files... $ECHO_C" >&6; } found_kerberos=no for dir in $kerberos_inc_dir /usr/kerberos/include; do kerbdir="$dir" if test -f "$dir/krb5.h"; then found_kerberos=yes CFLAGS="$CFLAGS -I$kerbdir" cat >>confdefs.h <<_ACEOF #define HAVE_KRB5_H 1 _ACEOF break fi done if test x_$found_kerberos != x_yes; then printf "could not find include files\n"; else printf "found Kerberos include files in $kerbdir\n"; fi fi ac_config_files="$ac_config_files Makefile src/Makefile docs/docbook/en-en/Makefile subst" test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "docs/docbook/en-en/Makefile") CONFIG_FILES="$CONFIG_FILES docs/docbook/en-en/Makefile" ;; "subst") CONFIG_FILES="$CONFIG_FILES subst" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim INSTALL!$INSTALL$ac_delim PERL!$PERL$ac_delim build!$build$ac_delim build_cpu!$build_cpu$ac_delim build_vendor!$build_vendor$ac_delim build_os!$build_os$ac_delim host!$host$ac_delim host_cpu!$host_cpu$ac_delim host_vendor!$host_vendor$ac_delim host_os!$host_os$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim SET_MAKE!$SET_MAKE$ac_delim CPP!$CPP$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim OTHERLIBS!$OTHERLIBS$ac_delim SOCKETLIBS!$SOCKETLIBS$ac_delim LIBWRAPLIBS!$LIBWRAPLIBS$ac_delim init_dir!$init_dir$ac_delim MOD_CFLAGS!$MOD_CFLAGS$ac_delim MOD_LDFLAGS!$MOD_LDFLAGS$ac_delim np_mysql_config!$np_mysql_config$ac_delim DBCFLAGS!$DBCFLAGS$ac_delim DBLDFLAGS!$DBLDFLAGS$ac_delim DBLIBS!$DBLIBS$ac_delim ndo2db_user!$ndo2db_user$ac_delim ndo2db_group!$ndo2db_group$ac_delim INSTALL_OPTS!$INSTALL_OPTS$ac_delim HAVE_SSL!$HAVE_SSL$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 77; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi $PERL subst daemon-init $PERL subst config/ndo2db.cfg-sample $PERL subst config/ndomod.cfg-sample $PERL subst config/nagios.cfg $PERL subst config/misccommands.cfg echo "" echo "" { echo "$as_me:$LINENO: result: *** Configuration summary for $PKG_NAME $PKG_VERSION $PKG_REL_DATE ***:" >&5 echo "${ECHO_T}*** Configuration summary for $PKG_NAME $PKG_VERSION $PKG_REL_DATE ***:" >&6; } echo "" echo " General Options:" echo " -------------------------" { echo "$as_me:$LINENO: result: NDO2DB user: $ndo2db_user" >&5 echo "${ECHO_T} NDO2DB user: $ndo2db_user" >&6; } { echo "$as_me:$LINENO: result: NDO2DB group: $ndo2db_group" >&5 echo "${ECHO_T} NDO2DB group: $ndo2db_group" >&6; } echo "" echo "" echo "Review the options above for accuracy. If they look okay," echo "type 'make' to compile the NDO utilities." echo "" ndoutils-1.4b9/.cvsignore0000644000175100017510000000015711253701322015545 0ustar baeckerhbaeckerhautom4te.cache Makefile config.log config.status daemon-init include/config.h include/dh.h src/Makefile subst ndoutils-1.4b9/Makefile.in0000644000175100017510000000324611253701322015614 0ustar baeckerhbaeckerh############################### # Makefile for NDO # # Last Modified: 09-06-2009 ############################### # Source code directories SRC_BASE=./src SRC_INCLUDE=./include SRC_CONFIG=./config prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ LIBEXECDIR=@libexecdir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ INIT_DIR=@init_dir@ INIT_OPTS=-o root -g root all: cd $(SRC_BASE) && $(MAKE) install: cd $(SRC_BASE) && $(MAKE) $@ @echo "" @echo "Main NDOUtils components installed" @echo "" install-config: $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CFGDIR) $(INSTALL) -b -m 664 $(INSTALL_OPTS) config/ndo2db.cfg-sample $(DESTDIR)$(CFGDIR) $(INSTALL) -b -m 664 $(INSTALL_OPTS) config/ndomod.cfg-sample $(DESTDIR)$(CFGDIR) @echo "" @echo "*** Config files installed ***" @echo "" @echo "Remember, these are *SAMPLE* config files. You'll need to rename" @echo "the files in order to use them." @echo "Please read the documentation to know what they are doing." @echo "" install-init: $(INSTALL) -m 755 $(INIT_OPTS) -d $(DESTDIR)$(INIT_DIR) $(INSTALL) -m 755 $(INIT_OPTS) daemon-init $(DESTDIR)$(INIT_DIR)/ndo2db fullinstall: install install-init install-config clean: cd $(SRC_BASE) && $(MAKE) $@ rm -f core rm -f *~ */*~ include/nagios-*/*~ distclean: clean cd $(SRC_BASE) && $(MAKE) $@ cd docs/docbook/en-en/ && $(MAKE) $@ rm -f config.log config.status config.cache rm -f $(SRC_INCLUDE)/dh.h $(SRC_INCLUDE)/config.h rm -f $(SRC_CONFIG)/ndo2db.cfg-sample $(SRC_CONFIG)/ndomod.cfg-sample $(SRC_CONFIG)/nagios.cfg $(SRC_CONFIG)/misccommands.cfg rm -f Makefile rm -f subst daemon-init devclean: distclean ndoutils-1.4b9/subst.in0000755000175100017510000000211111253701323015231 0ustar baeckerhbaeckerh#!/usr/bin/perl -w my ${exec_prefix}; my ${prefix}; my ${datarootdir}; ${prefix}="@prefix@"; ${exec_prefix}="@exec_prefix@"; ${datarootdir}="@datarootdir@"; while ($f = shift @ARGV) { if (-x "/bin/mktemp") { $TEMP = `/bin/mktemp $f.$$.XXXXXX`; die 'Cannot make temporary file $TEMP' if($?); chomp $TEMP; } else { $XXXXXX = rand; $TEMP = "$f.$$.$XXXXXX"; } open(IN,"<$f.in"); open(OUT,">$TEMP") || die 'Cannot make temporary file $TEMP'; while () { s|\@ndo2db_user\@|@ndo2db_user@|g; s|\@ndo2db_group\@|@ndo2db_group@|g; s|\@libexecdir\@|@libexecdir@|g; # put all --with-vars before directories s|\@localstatedir\@|@localstatedir@|g; s|\@sysconfdir\@|@sysconfdir@|g; s|\@datarootdir\@|@datarootdir@|g; s|\@datadir\@|@datadir@|g; s|\@sbindir\@|@sbindir@|g; s|\@bindir\@|@bindir@|g; s|\$\{exec_prefix\}|@exec_prefix@|g; # must be next to last s|\$\{prefix\}|@prefix@|g; # must be last s|\@prefix\@|@prefix@|g; print OUT $_; } close IN; close OUT; if ((! -e $f) || (`diff $f $TEMP`)) { `mv $TEMP $f`; } else { unlink $TEMP; } } ndoutils-1.4b9/.gitignore0000644000175100017510000000016311251020331015522 0ustar baeckerhbaeckerhautom4te.cache Makefile config.log config.status daemon-init include/config.h include/dh.h src/Makefile subst CVS/ ndoutils-1.4b9/config.guess0000755000175100017510000012555210550310745016100 0ustar baeckerhbaeckerh#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2006-01-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[345]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^LIBC/{s: ::g;p;}'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ndoutils-1.4b9/docs/0000755000175100017510000000000011253702163014476 5ustar baeckerhbaeckerhndoutils-1.4b9/docs/NDOUtils Documentation.pdf0000644000175100017510000110764510611427220021435 0ustar baeckerhbaeckerh%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xUۊ0 }\hV80@Aa[f_u&6C HGGұﮀ8>}Xwg)Bn 89Pۛ`K<}~pQg/}G.dl#<l>W./5d4 @6GY\lWh ^MVy hS3>Ah=cu҉J$\!ETwTwsb`"Yør:="A6FMU]B0aq];olJ`(XRȃk,XM I j*QڼH51Z7ShSXKMQX!N)TsOMycovo2wh880lN\cl\c󘤯w]{ն%o/m]qmۘ|*wA]1S~]`VRˤֹUyA),8YJ|73=Zmendstream endobj 3 0 obj 496 endobj 4 0 obj << /Type /XObject /Subtype /Image /Width 595 /Height 150 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 13579 >> stream JFIFC     C   S" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R*)dKمj?t6b)l#RM@ m+* )erה$s.0Vl劉hO xڄ%zMw0taE6= C~c_7v|TӴQE▩jׂyۀM%gngHF pu_?홬xwė^rb#b:1?M B62,W3zn2F pk="9eArk7 67s>c}E2D+ʰ4(((((((((((() -gxiM8КĽ5 yĿ߂#rQ0?oSY}֗evƎWjOcKѠsG<],jczƑZV=$l2 =Ή"uH']BSZ)p-GU,hJ( ( ( ( ( ( ( ( ( ( ( ( :5\Y[Yn$h3x~j;z7ͥ7TU8ݚo=Ki>=|[KX/t!4q$wQK00(Q[9⻁VH:Ѓ_ ]d=G ~$xn[φ, Ͳ C,>@X~~?S෇u,F96q+JQEf?ؗOYǘk\.35A E_wx0J(T`GZ{eg>r@Mky5Hd(?4Vcw(8 +Wxkb_?'|Fŭ#phѫ~p|] q?/o@EMOPgS}GVcד:υ%X*Lȍ*+>Nm"i͜~G_ Xю ~}WPEPEԁ@ E4:NBH*_΀E&AK@Q@Q@␸HZu]BeA[ȭ4%-(+6yS4gVEѡQQ@P_EPEPEPE(((C-3"uS@7}R}{'@Q ~T -Q@70迵왬LᨵJѤ~H&,z zl'ּ _g|@i<+ y C4"tIa3m h4/_FjYlg[7Sf[ ʙ}@$Va|mke{㟉SWŭ.75^EX ց2eIb'O7մ >Ii͐pLmIM{UosW-Wn{!d8Q?^.#/?\o%^IouylR؍3rw)BG^D YHidbK<0vff 8q@Q@>*/d* PPsHgMC|zo@:Q@Eb([KIPe9WFm]Bd7t~eτ5ky n :t7PtA5cW*-|}k[ k@-}Cd S?;:ҽ#GJ+#_1p5~"BF/:p?zuyws_^@gj힏Ku:D3Vįx́j[_?꺝ޝ\F \Pş?¿O*g¾L($K6ʃ_>+xI/%}8,kf.rI4iQ|rwzO̧ Wi4f#/R>G5q_T-Qow3_]*TQm̱2_jx'.m>; 3jdtZKeu9M}"Z5M;Qv,jߚuq }g[_J89]Fzuxn iBJjwſ'ÿ {Ċ>ao+Kb\ h'Zk>ϼeyf=ɠা RRR}Mkx[ wAvj95Fh('@Ao}p3W֚_mW~ M+|E]$֗)Am;풕+;coRpJG˟W姎~ j^6廼<\3u:g!Q__xG>/ӣd~Sbtm~F{y6F&+qҔ|ƀ?BjU$ԣ^m _jHXD€Ƹ ^l2 eX20j.S#h߷ǃf}/N*`+.iUӳȮ<5/BLjWI +WW_g>-ײ* g>,i6rj*}QE29VTVSzO+ 1|/e%D3noT؄n-[:ޟݺ@QOP SMoc:K"|_+ Irg|.x>5kO=rwOS@zLDJGj0&֟־*})0hGk̾t_SBXd I1Rs%w?W$F֗}1Ȳe9+7 ;%[<Xoe~'x&tyk(-PEPgߣ]# .sWl ~ϲHV,vm'k:TF-Qшb֛bڕv񌻜^ (ٶsnWvqڀ<_u(۽N￲;߆2>{%pWߋOp!_ݼm2Ȅ)"A[S . PVL%r4οls8s` dm3_SRE&@5?c;z!/)6%ώ|A4i]4Id =-gIs)5{?Zp?ٗ6<)K(v@N|>o\XJs=J0 G~:<)}kaj˒|.gbAʱr( YI/%χ"#8l۞C/?կYܤ`;q@W/W~v_1V0I[ҽbba@7񦢎>aN{їGƠkGJi_L)bk67"enz4S0GUv64dOG~"N$'ڀDt27qּXt3A:HS@?NOPpkI_&gi'H'_ea ~pK~0ϣiri IbĒM~OI\Z~y/WysƩ_T_Rh0]VAW hvMDm­}m燬."EP$ KB+K" q/M.Ųzm>[B}'"Ns@ v>P vZ~=z>Wx_wv}>Є6:tt"(#XtP( ( (Wjo< <\̶

R* rc_]!;k:YӬxz16X|'Ī*5/ sXLt1cP%>foª~9׆ITg+6CNyx M}@;K|ZS+WǾ(xPOʧ |w떝'&? iɠe?[ExWnx>YL<-aU~/2hm|]n1 ~Ki(&dWPknL@ȱWhXl~_ b=h6cnȬ޺2X|<~u~NNWW{g˟ uxk? vJ}KX^7bdn{EŔѷFR?JzmMm;J+G|_vJ5Y@,Ik:f@=k yc7_yge.n4ʃj; 7 ]\x2XbF8"Q  M B~J^LrKW9ZE*b E~1>jDrE~R[οi?)Dc8q*1Nihlou8_>*p?i)ᾢ_Wdǚ'O1pP:R`_I|J9 .Ek/]_KK{JO~.#QϿ)?;JTPI*+ Qnd(EM<e%Hr+k=;V4[Vxؖ-~u(:w}Dt>7f` aCM`m0^[F_#Pٮ\nJZIX1@Oi_m# o8j_7o^XWSwƾ P[ PGK[v z+N-uX[iT# _̷>(k~ [+!nNG.K!r@ 斲;Ep]E"(((|;z~~ܺ,R0O~x|x)j:t=gz/wR{cyyF"R^Z [4pCyk@W`+˝kNEկ~ xNž0Ѐ?]ҥufBT+s\kws w' q_)t@Q@{g4pQӌǜ~uuCӤ_@ѿ9O1,* z9/ES ~SO{yc5k$+$zk|%sx֚xRG @^,V/ě Tf¶wWq+'r潲'1`:?阮/4_ ouXwuݦFya@/-WN\}__G}F cODyl/AwG¿9iۊ⥬6alM#,EAS]Nn'y[j@\>ﮡh32r~h ͣ1_?M]C3p9ۋVP  e~VJ>zĺ "I*+Z?^Džomn`Yq@/ UP}82q־(e?<{g%kv)?1o|Gv4'qfNnn$,I LK@YKXvq qcfҿ";fS/Qɡ-c zXi! 歎k̿h=z]#-Ö"F6gKY66,8k\WNg gB8[p9 *[ui\ cw1@W'čBj1הWҿ'Ҿ';ULszP'ŭL`p&+kӾ|^][{yYXV xЂ2:W_z[A]"J|_px;FҤY4{񥦁9&Uv3_</S_Z~߶5;?f$|]4i i:mE)fvs |oFHV8۝6mac~|6~6C`$WpW('4;TyNiM;ޓ+*8Mio[9'4w3J^[{` QgpS袿(׋.e\+g(Ʊpv3K-XNV1+{o _N6I$sgE ͭL]A].-H(o-s2_ISՔ د(/<b{UKq~B>cv uBqv_uiD:}huzt1f+keMឝsb(( 'o£i/! rWyPh~hVKJTe8MTM.ChO[GԾ&}o g_QÍ1ҿc"xmeHI}klRl1(aZ(/ۃ{/n" 2ՕM#um2VKy:8WO ZU퇚rEDzqJ+RMq7լGﬥP?4]8_i<^Zt_`zm5/W,n^AȤY1$? &s/_z1𭕞ݥ#ºh#Sid<3+ǥ@O)rT_gDpvW4Rm&. r!"Ko4 CG*$ sإ]cAW|kxxH8$W^u>}m+߉gQ/?75oݼחRHX5ϱ'־+x+^Zgj/߰~;I%@?h|f%rM?.UOy?4Ēigsy.O 53~ޑ+}[PxX7̸֭60,%K!u͟(/,,mĪ~h\FѺ1"oxBLW,G+gw}sh`-=K־?boXNd&ja7%ʤ">poHǠQZt_Og$qc9+_JX.`]m6c ("A jG`PG 5kW VX@ ~/|I2km87Z`@Ƈ 󟏚#kuTn>SqW?GΞ5F 6=. QD+=͇J"?eKgLgV%ů=Cº;G5qMdg \|I8+j7ӬQZHtW|ԬuHu{fFnZ]kX7 xې-tUk9Ϋp |%"$Moyi"*1*kad0Ag"h"nJQր?FL1_Q|yIMjRIc)^qĶCih/ͽw~2/c-[%@嵤6iJ A~ s>hCh⪳g{-,.QאA[MMF[>U5\VX]xP%_Z4?7?i1xcӤvq,Ѕİƨ ߂~tWO`"$'F ۻZhmж=43P]{G4bE<E|CJ<3g1XVƮhQ j[\#τS+IsYǂ%(OWt/o:oR}_U*Uj0@ k) qO dQKgMx6®O:,cT"$ J}EsoE$Px ׌N/9 ͔^cw+ڱ1@>3dh=a2{ o%Ťw ?ݯz(O~QHar^á>Bzt9 (F8QPxOrut4P'r_G 4?PFm;@Ggn(kEAu:B1¨5ǿoEUw%2 }50yYc_?Φ>&-IOJt=sPH.|ƾ_Ư x$:+n, Ό95}5KHU2W޴Pң3&Gһ-7 vR)ǨU>dtz{M9UaqEEP$jTPEPEPEPʿ뿇 6#)ڿ~ |_a\q}.~? j.A~e {M,X@ 'u%mPޫx\}5M8U5&mݾG,_F_ 5]8SY`MPo ^qK}?[ {r%x{ S> stream x]n}7s. X5$ A&~(HjxJJӭ 6U"/EKK'?T>u_:}H9>(>?>uOluNjO zx=ؠއ?^e']wY?uI? IzJR 沧wJ1Yy|L"#O{<y'EbKKEz- ))ņRd)EQP,LNj-gB A%Z7\rZcIhZoh-wB~Ƕu45v|P$OTƹI~_|_r>Z? 'ߺ>e%rvW,Kpd.ReYk.s %V%f2KٝU-\sK5U+\3 eK}U-\s eEptd^ʭJqX%4{2x&d׭vk"F+,͕dl 2XqbUځ)O4.tfKL9x,:5v4wfc4dƞ1K)tzcGy;!5_Uqk|V J44W FRf#(SjK9xҤ pi4= 1ONi!oMn9+-SST6deNʹTP[P*BS06)sgm{h0kQUJz6{U=~<<@=E/lZLѪ|1%-pcC'h0_4T|oUJĎllJ-SyJ }UyRe6 )ۤk`f#'M8r:2X8Y1= /QlF*oq6:;dh\*!p@&-L>a92r-?ڄ6x#n*)Q- 4 Ɣ#31x8`4-h_OD׎Dd뀻 j ;֝}=+9,?ۦ%xXRٻo6Dh0{Ac9W E9Ӷ&aAjݽt$5b16ыhlѢ0 KK oa0CcanΙquA wĔ6A1AkzM:QWK"H4U5 Rok^RG-bT&A"|zmQEDCUI9(K**6U-׭{I[U[FE3jT(3BUˌE4mSEapo cL(\϶cjvjWCIbd fA%]HET_2ƹ1ܤgS*/*R秲qBO⛊<`AU":8ִ?N0Q4>LD=d++3f +/G" 90O-w62b+11%^[# v< :br"UQ;h6+aۏiJ607Nendstream endobj 7 0 obj 2571 endobj 9 0 obj << /Length 10 0 R /Filter /FlateDecode >> stream x][#~oPρxu+,iOw$Iv!df_G}j}GrI:{Mt4ۍօ a~)Jw|簉nS/}ݧni43av?Ύ矺SOֆLG\r.xp&2yDteld10}^W@˕#Qpt镖%J 9_.WlOg?s}uꗰ=87+87݌s3pn9 [ssˍ9w]Fx9䧰㉑?7Ȟ TDd~?;/ѪM8{ KV5 zrIȵZsr9cKB{k61.y rIȵZsrp akZb `kB K\5w `ȃx$s(teܵﱳ>KG= ^i~k@}裺)O ڑ/JW&J%31ePbR*J{t%Rrʍណ$10C b6NsMBΝsnJM)ϴ/U:S:B_h@b@J Y(֧ £ .o%0ڮ Lh"pt4+KHQp%3e^{חg,Z&Ky ӥrj{Tq /;g eJ+čT dܑb$+{̬>R&pJc*|| w " ] dBHb!x*^=@ Le]d@2-xSث䂹C#R9mqa؜X EaKL>^ a}X[Bڜ\,6YJ dIVn4s[BI3Gx1N]`[ou-t9}5A se;q_Ph#BT6ʂΘqb(n_`ma*ƭ(T7I8f"i:9 TMnU}K&.Go{va,Ls=$+% n4J"m)RSdW-20*&K m`LN SxJM.u-JP5iqxe1bSнZ(wU$rZ_|2疔i-#}TN FblȾ,g5m=o0ŦIDEՍ=5.;j@`ɥpp[5_ŕulP51Od]Ỳ پZF jX35 Pג͊-O:gk2}u w"={r>л>~욗`+L@4Qbݥ^;Ӓˑx ͭzo"NiF(Zqk v u[=X[@պlopBP~#$&l4El U1c4y2F0Bc#4yPdA peNJu VO4IHᨦ*`F4tхzVyZqFNetگ}Gj} ־Y([y㽾ʖ@4CLSJTQPդ鸳06!dA`j49zvȴb\ ( LY)PsٳWSpC.cf1l )VL~y*$ EA_(TXM}r,EUW:81#ah}/^'4 U[i |BgGh6MioU7uu)y9&ԍo4ݗėq.xWݏ󲚐Fo 7QX]@_[,bUӨtfԂeDM,ޤ7fM>,&G e(E_83LҠQ,H=Sg$bV6 R^ϔZރ>IqljzpA#("O1Z&X/Y=nv'[*\qewM Ay¾YƌO0:챇sN{;w \qpЄ \3XꝍڛB$΍e&S& mXqml~o8miI𥡱r/W If<APA6_8k !^ӋI9Tot=|Yk))D\LݘJ3 Ġħt*,]IlPDF> f^ /KFb1'ә)`^1 L"Vw q: ,[i֌~5'T6}p-'鞬f94]6^_GaM8»[[龜S,aOaG^篸:¹v_;mkiLƏ.mvendstream endobj 10 0 obj 2768 endobj 12 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 193 /BitsPerComponent 8 /Length 13 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream xOy)H" {f"8 *FkL DF (&P"5*D [-s%Xb:kO)xa|[:Qd~!gΐ||X g~|3;HRF;RiTxǦjs*8>kR8Зlȳ8w xGZ]Q;֏ؤQ5AqV/W{QIѕbs]BLIJ 1)Q 1!&%*!&ĤD%ĄbRbBLJTBLIJ 1)Q 1!&%!&Ĥl6+J>T-9IIjoojr|OV 1!&E֨WbRD C6pPBLIqhuuu 1!&EDr\~BLIvr5p:e#r/ݼ_2'ݐ'r~SAI!bp씙 F /:>,|ś{gyd"b^b҉Xmu"f@+{ ,lbjxç5ZHo #xy@}*hX!$P}F} !/&HCp5cPXT5$S)zMGqah_!TI0D!p_}6.bŸ>blقOQ"OaŨYvƞ94 1i48t5b~oC|("  ²*"9`E`8$kG 1ibM:)b5;P/LޙIм5-VbمN͢G΍<$Ĥ4qpjL##ג}F˟ܟs1\VCw<\ ”TUbUDfpqbؓ[y 3z1O2&>,Ʊ<,'NIC18tO dy~2sMڼwnp٠QEG>)EI>%ª99n7&Oa#a=iǞXmQʭpoc Iv3!h+8t51%!18t%Ą{pJ W+!&Y [L%bBltpJ ECWBL-bBlA4Е;M凞Rҩ)ر_UJ;;;[x*+!6b0 DSS#VpJ K18tU.ԍ9 gGb67U?1g3j:l!Чvj*M:;i{NRW!6Ce$8 hu;uN7 7Y,J(1 6O4{_<Քsޟ_@a9I: b\Q!sHpƫAl0\vat5lz| k!!B3;J(ѳ1Q!feVw9`xfb [ pEV"#8H`chtcc#pb7P4,Vwn0 1>vlh9"p48`h}L0ow%^aņ挟YHRPp84`8&>Pc=mdj##p}oO}#OEL 1$Ņp5AzOlӨi6e7}")h\EG}!5w'1|X 8A㯿}f68NYoc++;b33> ܙCYWM f-: 1JA|+.,rs_Ryδw}f ,$nb9U҈ 4εB$0]ю@г1]9|1 _@A*iĘ6 f,(ˌ˱/]Psaq(b!rNEȇO%NȷhzcM ءM CN:Yɒ}8vVJr;Q}+?,}  6Th)͓ElHA#lvNV+9sZ>21p sYg^|~Fȶe{9 ۽?@){cCQBiIgYQg8fW9*"u&C5G Zvu^!eNX,g%h+KD.mDKQbGbИę$ݵSeTRFq|_b3 kZւFUӫيMh;yKFBlVd5hDym_7u#ByX[SQbTFV+-pN?Eb3 KA^#u{f™b 3AS>ֿiN쳟9sZ(bTA#o*s6[oO~g9)ygpA#m4++nI88-\)_) 4PX+ܙ@ݽ󀳱Qi yR*A#}U({sEG{z{b…] i ~ЈY4ܽaiJ鈩rXq"Zվ{˃9sz WA4\rpt>jk68Z]]K7O?-/6Z|ඪ7X.pba/L]j\*]Loufl}ͱ4/S$5q<,SD.wfH/}&eP0` mo{Q kc5[jpe6PLhH}8ABhg[OQ.+0(ڋ 88\ LKRA#l͎6s.ePtCoX9 wx X쾞 H!D4m|t0]KOx,+R"l/Dp,;|!+BqF!ڮ˃/h=hpذ=!lr̎Bg (qNE9G_¹l(^D&++cYxF1;q21ѿ84<-!1ht@Ԑ01nYNʚ |-\Csm |r.ܬ*ΕS kЗVw!&Eѧ˜UEb%[0nc1*\)011i9hQеU36FΰbwiԸ/XBG9^>V󻄘d8hXHWèq_'W!@ bɂƄ$$&N&ШqggT*N 1i2F<k\&ĄEnl69XW(̑ 1!&Ȇ 1!&EÇϞ="fL 1) 6ԑ 1!&Eu|#bBL"t*ʈWbR,kNjUbhL 1) !DzbBLJZBLIJ 1)Q 1!&%*!&ĤD%ĄPľM7}I_EAh*j1)9 Eʕ $DW4?|^DVh&|9 8 [ₛ;rƩ{Q>W5*Y ]!M/{nb8  Xǭj[6d\`b`7 (͐GC2!Ck2^ ]Z,'=5'w ݸ[-ckiuO>Nbb=#d84cƍ`[Icߍ#;dSsP$v"D!:D;CN.S@~r&nO4dqEK KI(s14'|}1FkgO~ [m$c?t72"Fe8"w Rр+1W +,3\"rG<ܾz Ї;1räA{) E7Gq_:A[n w̐!WY"%m ykGBL) 1). 1!&%*!&ĤD%ĄbRbBLJTBLIJ 1)Q 1!&%*!&ĤD%ĄU\WR7l&/4zJi9kiooZ}'K$ͼ67yW/^-rR_i_iN+ls;݄3󀳱eMwRiNhtg@vww׫J.ժe 'n#hڈjՍOXu`qk6*[M{Kўw9?Z'%eD0vlqD֛بn P|u>|VڧSb*BG \.kiZ gcBmVD &O3 @i0IMN:}8> stream x_ו[c3ۖ: H Ǡ ^% N+!HctXN?;D6! /`0؈8<4FZS1~d'~[jvXXA]~{ֿ٤zٝ=)Q}!9)Tïfnmm%6]333B sjS2RqDpʐjJ\x' y0CjneH 4ȐRs+Cj8-L,{FI;rKO2S I΃+ tRo:^̔`7O!W ZkBss+"V+ZZ]][e?c٣8"jv]טa5r3Ҡx:qUqlE!uoPƛZT*7) Z\"LvwןĹ 8rxa! WiIik3Ҡ#G}9A-RD=Pƛ_YYE<[Vqu@j.ĺ+S3q 4(HsmX8!FD ƞg{KKXnÞYAj͐jJ2)< ugg_CLF Wl^(NJEbHGw;L3@Rc~Z?|"Dq~F3.)h([ɳݐK΅v`ʳ 1Ѓ٩+.T:\}#qPh/g;!5+,z뭷bSb ɐwFlNX777V3qV*%P5R94}6Μά5VVVvS5;&}S'||}N^Lz g:%^Ƌ0{?K$TŻicV+i0N!踜#qOߝB45`,%tcǎ&T=gD&5Ux'QF#AޠsR`dSI!w֘;M^ gnWW:'?)?>Re@6niw~>e2J늌&ÔIamP?Oqs9١>F~g硋 TѰ%SWJůp3 =&lξ'W/z#{_M9RL\]^~r!ro6WGRd8`|pt Gvv62S8T*`Y f+@giBR@ C!0A(j[(zW:77;\/̾]H*>ŕWpLix/.r uLtjwt")QtR]Ʌ esrsTԂup]o` (9ӹD"e]Q3>9撘ΑZwg>b$GTfJ'UDܷdxv߾C_xzFǾIq"uLDTySF舃W 2e2SC'Hݳ%St2cE*X%=io?u~8{U3ؘ K:'OV9iHڰެ$ƕl iφ8mY’)"RJ VT O(!uҐFygC X):!5N{dBx,6RՋTt2^v^y7!jnjHq9#.RJY’iR㱘J`:HbOz!L`Xf3G3af/ggSX%0iQ!uLcȐ%Tj`^[_e&0 Qv_0o(GYmWK{^4tZ!5N{d +Cj< R ulj06zĆ% iI6JbCbd"[3Z4;mS%,Bh<~w9X'ԩ1"iD#%,]!Ij|EVCHgJDd2T$`5R KX2Lht6|R 9њ%,L4 XQ`uuYhH5Gd2FWX QKw: \ipZZZzR)f5p?~/dJF`ŒrIbH5PJXBd u]ʹˎV*EZV|V+yęSP=FΧnM&UdJ4XѣGMO,bTCj>΄%r4swN^R2axΥpnRaP?)jUƶIMEw} aH 0Ct+% KjQ'xs Sbj !*jn2iǎ I4!5 SpvMg8UqV Uը! .^QyG6&!Eu' j3Aq&,aNXfat<ϟXZ.lWL6|n^7!5?t`n87bT}ky22n[ !5 677ǛoaÔXBhj)YR̐7M"aikk\~4 Sl`Tz6!5 9T K/xieJ7s:m{֩SE;Li!5 T Kǎ͜Z9rHq&S2!5ϊ*aĉ~iogS5u4 fH͹"IX-o4$ǖՊ_ICijdH 0Ci%B:K }+;Y}ۭ'.spʐjR̐j;aiDaͽA+ 2?|q񱕕+9AZ:~z$/>!45"O^=w \v~tǹst`˗~DǕ vuT5N1'_AUZ=5[cրNDJϺ#G,=4=E*V+:ݺDE}ΐj '7&Yz[V8!mvm{UbX<o\|ɢThRY%V "/矿ίp!(Dnw޹-`x_PPLKZK,,)>h(9nhUaa.[Y_)CZ[[6V;Y(HBF˗s{`m&Lb?˖a*Kr,{Ca"l Fj_~VvlVN"nr(6aI믔JȈͼu! c ψy'tLbɉNNʌA_5mHB s03;l>*82pn4DR _~r?bY]%_u ~vgE*O?n6Q?`:Tɓ޾E* R./&`S 8DT"`اx7DYP_f!ggQ=yT<=TZLA|g@A2 $9Hq|NL>yى(In z* 5b kMZa!]JU_7= 0Vf4M8Qp(-/:rH& y" RĞ\CUX"1,zKn. g EyJX(_ 38p0l_˼2iB*困ҹS>zҷW![t{ٝ .U ?"JMݐef̙3xwHJlZ פ7JlsSCӋTDvWx)!h`1nIԘ-H$,-//m}Ri>x|0VFI@b98lHOfU]-KZp*JXR XJ _ųgtodjBJCM.ZY*iBN&OIj3f!5N(RT͛7ˤI &V:/fCņ=g-VM(Oɛ{oJzqU\BgkHͧ^©777m< D*bu-Dܹ$#,(\Z:J~p}}*рmJWĵrܡ!5).R K_uq+XTQ܀B V+C'$ftN#IC (Jٺ"Y\;jme!5ZT$yOzrU6ܛ ,l1D,bī0_'ևndsoƯѰh X -T1#!Áͤ!Mz&Tp 2Dz`-‹cCj>-mHZj=?2V0}cvV!zE1iU(]rb9F$`CFRk'9P{ھ(O+;s֍򳏌s9q' "(=^ioR5I9;2.m0Fj0Tt,q'I[JzX"L,f~Ο?Y ~}Tm23MĞVғFV1Hre!<K 1(4I!5A*˟n|f2T^5ͼHj#k,MͲHF MUro$i:}i%=yq%9RHK#Ȑ`I!^G7~Hezr [IlkKXX.|2TGK_$F—QMUr q$% 8Ѿ<#^A*XA< pdU}?'Rc Ȑ`#w5݊ x^帪n_f\F(X,Ԭ@ R3DR!524l>_^sf RnE|!5qC@c,E !WiIik4RՐl&zPEjI*2FTRv!]rs6Hv]Yk.lG7D8l#1AtTz[jfݾpreee-Bd:!5 4DR]U67W*nW} Sօ'' fH͡}14TkuuPrP%kO_Cǐ-?A˾n%T=gD&ΡGF" SʐlT1iwXD8aZ)VsT677 Yz@ qQ j%&̅ml4t@Ȳ7 :S󔖖^#@785Pdfaޱ2`n8գ78HĪǻr!T8*L6v :sp< X7ː7; 1c h)$m!bfXt{ VWW%R + 1Ĥ19L#U{(C3iQ]Vm} tkt=2@MC:{CgR)CjސdW=^p]7|=۲UԮ\6)*ݫ'3eI!#|ܷҐ~9섭1rt5,) _}@Yr' UTH;YO#4sd޾T&luY=יFDgtp܊;oH|ꁐzP…3~:.oH&lzW߾TNNeI*0G= utpX3VQ!UyMnS +^:>>"RFw|IIL|3OT(SoD8֭!R}QX; En}u1 V.&-`T4Ri qC{Y5u&>Rᘒi0J+V~ʀ?4Ifw}A"\ {E|fI|@ eC* ްg:湍R}?hhJ]ZO.:-Δ"UZ`g*M U[[j:&T&843Kt(UK+v,у HNgnoo/,<< Re! ξ" d+\&|p9PLv(%r!Uˊ^RZK#F G539z'L|wyvMxXDlH5hH["PyBFin\1fwf?OOGҸth#% xgÐj PmMׇµRSC3ם$8ieaޭ>ҧxu.Gw%q&VkZȱFvVETAĞ,CUX%NII\ee$Qƒy@Le)(=++z;6}3̐[ٰXvZ.:vT+\TCNHKWu)RX$k HTRB!52cE*N N),nS%$<(,WY Cp0tI*ؐjkʐe{gggZ[kا)KT%Voʵ{T"Vn D 83?}Si~LXCRs+Cj-/?/{Vd9jUܤ'S:+C!dt:NPL׻ moJ=9.j jnk5hd$p8]Knmw Tɔ m6JEx qb<l$![.P7@kLg6E'#yZؑZKKH~g)Bh\FQDnW76{_ cqRTo3eZ$#U|bUmz?ɔmmm--ݚ?8ӹ4}fRTJ%hSObKFWhgST8d }2)-d2Md Ft.U*V+"R|`NmS:qғ@HF2LS 5!^+fgd[ d}7tW4Z,sw՛ ^SJ_dKYOF2L3~mn^!Ӹ +9LjdS;+ glxr_:&/h; ?34 gҒL!TzѤ]!z""Lq$XJvz޾}ĉ XHd$ShR)FB \d;;K]֢}LJSq+ XTHd$82cST{cb!3<ճAʈ6xq<}/A_^X8eH"A%#Ɣ!5b4v -{c BKJiz@}h073K֗TKF2E"Cj<6H$jEP(q넬ݑD7+ :}(߽ 0D'vh<ϖTKF2E%Cj<6HJ%2c>ppR8yht [اĐF%#"!5R845>k F2}aZyܙ0}n<%}d̝sω;QC%#UHjR-^y$7'IݐCKyokeu|'t}r8_jѕXL(b ՒLVH_ Wh%AzZYgD/RSZ"Hշ=H7}Plr[䄷ToI#B/vx@Z2)Ō~^KX9 f5 cAo$iwCj-)(ԾCO쎏~=x\,dM#Utٿua7ВB* USϹP:>Xud松RyGvOucx6 dS#UB딗b۰4!5 R>TBVCG}y*=HLcrx.sŋydjHRaJTYU:O/8KMRsh"n?_ J߭{F!Ut+GB-ދTKF2ůDW S\CUT{/RSZHeB$p{p0p b4逹\No  Q/:GN<$KF2%x$Bp:)7/fJ'I =H ΢4c_^sf RnTKF2%x:qUqlEXvjPvk ӁT*R\f+;8aTΐjʺ&T_KÇΔ"UZ`g*M <+g&tC(H4: ._~ΝX\Ȓ`AF&La? -U8^@Y2kkaTeJ!A_]Rq3J{ie?}ի0ztvqX} IxVҔ!ȐjJ&TVA*,a)}s(U$';aB9J|ѓsJk0I: ,}b0J˯ZG@,k+C]?XÌ=( 'Tɹm,5W/d_Vc--?H۲4.95HaCvIʩX 6R"UN; =QGu̽mƷ0T >ϟ:ȯNs. 9)ER}@RNCa$7C*;Wo]q RQg JML\wғ|zpJ6_rrxt'YBPpb-jixPC t(Rnr;#Sy= 0JOda ...jHM 4ȐUjr9thů:yG$ֲX0So`9cXM[~Fz CQR7=6iTSdHrT & s pTpkII"U"Vb j8>?ug-W{uq/a۝jH 4Ȑ wUM3& +ju<(\ca#^u$:>pS&fʛhz0 aTSdHTfj( PLځe" d( 0Ar|0 QK!#\)̵luғU(+M> stream x\n[7}7pecZn@ѴH^%P(vڠ<HA!瀵y8=)mJrF\+[PK" &H\XMbDL ($I-1K݌6Lcb7 I A3/2I0x#0K nG/B=?X.h]v4PSf$.#1QNM S%Ss1tiيPŅ$P%Hir HpomA@!U<6ꑱjj[QTmsiӓ}7v$;!_y^Tf|՗DFTw_8M7Ka'JZךX"$ f5 ACܜc-HۉYn&tvf23W'XOJ+]nakIJQk^rG#5bA=ҎY^Z2@D6%TBs~\.+#2YuRMx3KF Ad[enUO1E)Os%}A4󶕜M1F5i#ԝ'1hRL;Ny$KHg5-QiTC 8*9r.4 ;=Mڅ4T) oo~bɔO6orҥI^8iy5m7Vendstream endobj 17 0 obj 2148 endobj 19 0 obj << /Type /XObject /Subtype /Image /Width 729 /Height 310 /BitsPerComponent 8 /Length 20 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream xOl#W~ZlЉ㵙y'#B";3i@4 GL|p:>MAtC:BN2[ZG:6kV<"U*>bիW^{o{F#roLީȇ+߿sέ[2=͛7;>݁? "BWWZfIVh3wty5yu%c0Xy IH\F\f9(J:rF=$^51RjGJmN"EOc|Cmx" : 9==sOuqe")"hKFV~+zVRD+[kL֘^ljTEhk\x)BlE)i99ăCT::-!^o eRllmm---IC<(;HS0ͦV5se@uJuZj萝T"Pv NN@׫T*iI١@*PR.<r||bTghy>W+ᅱ{J/_}}KG!Xvq, hC GEZbI_^^T*8@^z=ˉt"DN V雛CB;vtg%a0t:t@Jyˀ9tݼh NwtN\z~||wZҤj1Y1S8moo(LwV@p恟)~yyRtݼPDlvhފ;<<;-E_]];! !ɰ9`",Eq/_ZsDa0[aٔ00Ԉh9R1 |2! qxx(tww7N d۷_,3]l{ym;s9::;-)"E>tۿj!EJЏ$Pr"HLw#CJR)3›=*2!e)qzz*Fv}}]JNg.:K^gA7vމ*3fS!A@ y_^^^:Rd4vj;;;y R)rzz~AN]x[9\h"HH(U; QdpP"HjyK+ESZ9@ E`vtJbR<3/sϕM@r"H)bUۤr%ݵ~Y˿,'!5Ʒ R)F V*U fQ}͌xlYץ~ug9MxNQ|EN*$ KjLyZ [c) Ϭ|'^O%G+4_Vpp~=lF?l9=PN*޺Ai'T>I5 ʬb y## x;*9ޘnUlm>e"(QSQ.'''!ØǨ kƷFGGe0^o^]u:{vk.GBq":JԔ(Q\Y7TZzxkJ <|޿ݍETb!-9kg^]9z9!E)B=_p2"߰HkW%/?s#ZB~V{@~h3 E NRDuӄJ^9*h rwe,]xDlTI?)B=_p2"=6nȵECӯK~7W%ɺE"+쑽&H][Y1էh ZW fRzd,EDE ߼]o`K84ajGT E}WxD!9}S[.k<)B=_p2"Tf_~J/?gm71L'o.-^̏ƍ'n#EIt]<>'sy~] E NRљ$>C)úi &+QRD]XU>*N:nd:byR`x2jua Ik9=ynS-H6 Rdjr"? HF_|~t9);1)٨?Y>gE[σl6{QL~Ut#ܾݪןvߒHA@d E&)iJԇQX+ s hm\+ H2xGD}jj+Dt:n˴ sm[V|{GGc ~CG{s] EY"S1`hnUWA- !6)ͨިGt8Mx!6e?tͱQ#vZp{SHZ=6 ]vՂfALM^R#0^s.̫RD1bv t:FU&zjgXOzAqzhNz%V]lt]9.)aɄ.c"E#oxmPl"2u)<_И-QI.9Kf>yDmmm5Jb>l^}y^]o^nl>Ֆeegyvk.ĉˍ cI̅m>L2]HAXoifVigY\eu4_}3PhQqu[jɾв"w^Uq/zlY 3ZNO?3zH$1,/WTx(e'@]rDjqXoi+;$ RdjB_92G'O76~KMX^1ٵڲXI]D[r"Q٭Զ]DH)hƙOqse L&^5~o}1 1ރ]"S3RѸwFm[[Gu8Δ>詧 5ןy{' mKE,tR4,I767Fڅ}7q[-|kld^ȼ/y=8);/dhݷ67_Ֆe3-p8ߣZ6 uz\yw(Yo~D)RG'شyEh`V]>!+bUd2颍"!!ռUe12*9$.訓$^9j}E`Hs[<"<9{!&ET`V-&x"OWD5S,ުTNQtYA䈔~/eY^(>/Q-Pكlh"WںN2rEQM@Ht ZRTR7]ksH5fYGNRk _ןT[H\EHt6}_Q# S^I.ysqp 1WݷB",exD`e}!`K"\ʼnμc kjpUHQuRHB^q RSKD 1oyx ExDgDͻeHD1raPWթgXELDUڽn_o~fa5Hl VjrYRdL38<+3s.#dޝ`"%"nj*Ei[J.b{.y5Vf]GB )R)r||vx^Q](yXiGtI),Rd!Hbq^Y;;pI""+++R fA慻wʵMvښ풍n#{fd뺤M9IVCȺ71!O{5W˩UMgTpk+[."E^RdRpϗ&jd4 -/'jsA D].A/TS^]n_+ߘ6Ƅ"z!*FZm۽^O>U$^|,o}R)2*]ýv%\ nSG1H0}kjjuw.'@6޸q#a:CS m n)LҡY!MU5(yqFEers湝 >iKHZceTuGAs1_Ӡ&ƖHieúYX_,o ݌HG&=qjpPdoڻaat]r]κNG^^eYannxܶ3ͺ=OMiD3O:rҸqCڢ%S%ksi78#^G u^NBJ~ӑY["ɥ!9)j6RRLlQcj6EPKd/8ݗbfR0Y^ݳFg%`țcMm/ rm5zv[L;IZְ^c&9i*7f]&F6:/E,잆Ju-&R J.k$AL!EpXo.6HKqb|FZ(@a Wga% Xq%LY7mAN7nӬ*\=FJP)b=D/Ц/+L*`p/u갻zfQeյ: E.#E K"%"Qi'h hˬ1e܃"&E7ԓ&E+O+9Jk$HȼJRd4~vՅ { ĠǂZFDrR)iJb_ u(M㥛HxFKWBL!EF &!iIx_$$ E"ˌ"|k,]'0{ee"֘v۾\`M>&`yjS#A\I6%^{+ʸIHFȘ E.Cr)vw7߸0̽{s!HI(E&E])舥S۷tW$T GY1sMw^3_!tz>I0%B6ٵ& )rIK[RDݝ;o_x?Ó "zER GwИ4j.7Ԕh͒Ut/Et.PbuL7ly)0 sWZ†)i2dPxy㍻FR=>3QRdjE\IlvYOK` E`ͽ3_{7V,??FUUWHh ~C$)g)3xQGxוaz]AwQQ9< ̥ےĸʉ$hN/ȽLӯثjߨ_)Zm#ny[[?cyE䰐X&E,*(4eM!EB вxhorMg%cYƮu}fALOMڽ"EI,Qw;"Q~ܫ=DY;c%u$v1]Y7d;J# R$!ֻzx&9mMm/}-ޒCWϟ"ڨy? AcjF^7P@ҕ""Bw'"AWVL+bN-XFcY[Wa>-W Rd"R"\^2U@|M2b/HqZIiSXaSsy)2]!]Y^3F{[f(-'''"B677_PXQ`C=@D ^$Rx[BOa$;cC΢(]4IHrbHF,Be4dTGGFѭzHLv( Tz;Ls+Kmi"^>^/Eޑ H-aݻQ` mn{{{uuړo_U4TTȯj9qdEE* s wfo$rB'Eo.y |0kt~k~-=Db}#AYwv1w~xZڢ#E4InwH"v KzOmo-gF{e`0vV+}R\>T x W@P`=2ڙh?Q9WuE)4=5~ݥ\&R$1g(_1`5$ͤkv">f#{f~Y5ARD:l~3at6!Yصn+gN@d&E֮^+ƕ+OK j$(EJNRDJkW%/?H.EtRw!L%'{)"úiBHT\2.gRw%c)c[/JkWu_mGoʯ,KbuDV\#{M(n"L2'Etl"B4-&Nd1MƬ!Euڑ<+1H`6AߕYK&uXP!q+EĤ)me%(ET`X#EIt)rI<"& $mʰnqJu3VY$$3"O|+LO^rp7wO%vXGzdFDr!HGNT>$ZQL`H0F{mw^Q 8@X/(ɥH/{mD3wxн %Em!Euh` ig8%IlF"EBK1G*E49,f;^)=fnևb;MqgmJ]MBwY2YED1_UGSU H1R:FWu.@(s!E{g>-Y EfǼHy_" E"9AR)#H@ E"9AR)#H@ E"9AR)#H@ E"9AH3,3]|?n>dIwfݻ'y'$b{ΝЇAr+r-9JՕ%L#aUEemmmiiI~/Tk׮zleeݻKlY:CoܸI%Y.Vq-=63we,&yegt@HE1RoW-U̜vVȺ˫5腒"JVh"ڂLhoqHʹRɄX0bX`DŽl ƻHO1n׳DmAdR횶u떞BmU$Xz QR$C:ꯡ"!*cUh>XNS*ELPD]TL:C<W4I}+lƮWfuΝ{mTK!܍+s)vȺ j4گat{PuK0{Ʈ]BhxMhJ0u Hֽ&Ћn;ļ0ħ3ꁑ,wnVAPѦA_bXX#X=}V+lV@)'A{ѴB A)W_~=utf+_ WըuuԐj ^vQbYIҖ ,kkD_fіл[I+~ԺRDe^hFSOI;Ζ)0@"Vf 9B~.x4Kb=2{s S;K˜͎E)bTj2#>rT3+Cj$00is]nR,X&xFk Q%2&ˎ*; ̔os6 v$9Eeoᵴu(CB"*,y$P ຆz9k-T^Y<zV!ZDt-?1Dr)2>7> stream xOheyendw{Nj$JSN4Ǣ *0ǤT0 "]cA&&D,2lB0M&ڹjE|;o}ܣs}>Ľ9W>~{m>zxQÇuA⬋]%Wv˝`E^>4OVwfggMjo߾yM ]khɾ\1OT]vw.P\֖K> L>h:~>ݮINPu q֭^l[ 6mB nYU\hqon;ŌfkiԦ5я!Nۻ^Z+{XR^߹s 4DނD& ̝(-Rz{=fSߚj+#?PsB9^ )g[t#=YLo~CZ˂][nvU&FB7/H6@lѼcrkbHRv]icp\[__06i49zH4kCAe@> j B(B WS:@z5$ʀЫ)}$AP^MA# B t2 j BIz5WSHЫ) G^MAe@> j B(B WS:@z5$ʀЫ)}$AP^MA# B t2 j BIz52_8QSTzj#[NAA#I5Bp}_[n`AeL7_oƉ7o?;$eaBo^[PГ}]v BI'_\۹}ڿ z@#W薇O>+wzhND{Z$ ]G߈_Dߝ/HߝsPn@#?m-w|MVo^_6k~YzVGS7~߾໣t}}b6׷_,sQ(tCa+ֺ}U+&mX)mZlm#`n BIL^o s6t۱/}g[R/PY}b~4wЭ+gm1ҧbh%ێ#J믾^AB/XKgV\׎]Zʾ R$$_ $ NB_ҢӒ1?ЂGm#O?OʭÓ/ENWBQE=KfX^w[x~=,[nu6g=ҮDe4ЂGU{Gr&{%ܨ_QW2mBVcLky+/7,}dWj?gyy{|^o5By;WVto%*ce7#t2%hDk1Rûn'.@9_fAoC[o^GГoS"#4W_dŤSw"՗B%waߝXO t2%h$)w~&޶4'?wnj#ޛB5H}MK^MRߝ䶵N)w+1u6zZCex,db2HuQ>׳>hF{|2'K*cYKtPsvvf Ǐj>ii%6,[2 C5V2ن>xgU#^>DAɽiCQ:@B_T9PU)IyB~˞-U:@BV,ges>dB.(ݩ~P!P>\.--eE^:@z5sssZhЫ) Ї=k4ݽra^MAe@>lll333GGGeGP^MA ZʀЫ)FkЫ) ˵z5WSz3nyB t2 j Bo m4O@P^MABriBz/AP^MAawwwrrrjjjooM!j B(B 􆰶&;5^MAe@^;huyB t2 j B~5' j B(B cyB t2H蓿 Qi}'>^\GR̿̍ǎ>6'殷ơ t /oQ\A xUhpttTXݰ?0,--MNNjlU@GTi:m?X ZB7NM!6^Al ,//}~~~ЍBs*"&/:]g5]'{/>,{1e۾ڵkBV>hL8@=U~>Ea$seooj_F&(.|MSƋ]@{Kv2Zsb}}]5dYna0h`333 0س>4@]0̰ӴFs F^vww'h677><紘j vX8==]XX͗h4gwwWvkPGGG333666>h 23,XC@.|h4+Af>ȁFs(34i4X Xg{{>d9VKu FmSX^^f|Ń ґHxV*o4?88X`a$ T N9FIZ: 34VCT:<V(ؔ $4BG0 -9==]\\w:B/WlV̾^!5 u2: V599OOJ^uQřv: ~{"4877w||\C9==ܜxndh_1H9@A%سHduZdshkBG0,{Wi44@wpFcY^ia˾=d|kk+inyA7k8]?eațR:::wpggG]_xrԳ sVZ eoo`%7:-;ͮM:sD˽^G}?bs2BGP Z|Ms93֌ĺ.._e9=]]WG57Rw򇇇%4"C'tkǡ DA Mѿ7wK''k[r|3ůޖONNrnLE?8` j BLJSI|y re𝝥awIooM~**HH|jjjaayTM] jʘoĉ?<|W?ʂymiiqjYI|wǏ.AUTT]u֪H6| ^C jʘ7t'x^{t66[[x\^[]կ_|A^M+'׵q,(}TQjͭ}q2E1{O<7 ^M7KxzA>Tgow{Z$mhv6,,No2VB7mb"۷^)7_᯾nlB~͵hi,fH2?:<̲=o 2VBw_7G8Z6,eb62;Mн^SoۦZ6 Z1]0ЂGjfco)G jX ] 6Y퇇F˹'ɽpM6KqӻIrMMo56?G3ߪ],?{)G jʸ 20eXyYKz nu;Bױ/EZz]'> ۿB5== ׾՗?)G j h'N4Z ]˸m/ݓ.>ɩd-}uuu{{䈚($O/-ͩ5J;}[33/)G j 2numaJMY{C7ܵl=apSV+++5`Aox, ]KLŹds9ݦܸ1]Ы))_o?<|Y\^kŝ#b]mk~Х ]֖BuȦ17oiccC 0`f?"g%ͯCx{*333Skko_<'#z5e<~ZWЫ)c"t= b;uY1ۭ_zzXbcY sP麗 ~Ԕ=MZ??`J|SS*zHvkkq(/}8u#v7^ 9T#t5N~Zǿmt+QeLK{U,sm(o~mk?ߗߗbW/)NR:7B+cn;S|m7_gsɫb'5kTZ333 @'2j ZK!PsKo%ޜ< _Yb5 >+mmmn@H/)䵲ҒZ-TUiҜ-E1S[Q۟IS4ٻx\޲]U[/)GT)5/BWlh$-dQ` +?ޯR2e1v_?Ŵ^+5Ezݗ@z+fB7S[2.+WCUMrNq͡bOdnYJnC{]+^쏊qǣ5R]'?ͬ*V@dithSm]+Whx\u_˟#*NVDyr_=[{lEwgڅ;9$MY*1@F^VxGߘ|0VulyloNB^UBmo>4/..Z[kra!ywГ!_OWSǡ гŮ(t/t]vSFrTbJ_¹nvz@pxxhy6*X^:D.춵| B2BO.v兞-ҥ)~ii-oE{@}b}^q:黻 28&̓/ ɵTнE;I:ܭGvNLқ.wxT6KV< B2B2b].[]VeƄy-Sb޴(} B2]#fq'UM-H[}u{{y4_!U6DCAW2t]]N $aި椡y?U8~]-aye\3,Bǡ )bZ!a s=ƄyۀA>.vvϠ!azjLB.瞕)-Wn,k5~#ϕ]u^z/BP0Ąy*%̭7Jc#AmC on) t!lmm%zwB?==U OǏX)Vy 1:K;dG]]V9v s}| sY\UР:BIwIֻ4#k ]Wr}}=^R>an9y t0&tb~6CE:Bvw^q\%̭~5 A {m|mW>8Ŏ-{x%^ZN|.vYi>@W =gݛ@|@ ~R޽p͛ku0,tA4+.}JFGU041}W+$NzW^zڽ"3/ds筷"a^}~֭ٿ^"\>{B+Ov6NNN.--moo$B/"t}mU)p xp+\`o'eMeۮsʝVI%Y~޽E[cyg\DЋm^|moS(3]U۷o][C̾hC/#t\Y^TG:  ]zL6]-)msM+[g o -۸VE\1QI\u{: Iڈl_%~5'hՉx"QZ}/x)|ًf mVI. ){yyygg'w~-;LMM4>7Sn(M1&A~)~꣡E=j#Z޶uir1G{f5-kI]M[wX/?›$a\% Ջo~ݲB`,cֶ拹}~1)gm<08zwBw +tM^1t%-I$mr)\MYhڬדZ=OIӽcG*.Me^W "Qv٭\_%~FV]W8$4ޣСJzcSw>IKnlFZPڣ?k::_K: Hy3C6- >`6'%09SBW.~l}J%ux 7 ЇzHq(}E;h:ǰҐ⁤ЗSg;E_ن] {}Dօ: /6  I%nxQ r =WrV$\\A}NݶKrĕBɳ)b{E%DY]5G~; }O\\6#P^~XJy9>zΓ'^ح[>|v#t\J [l3uMb5_KS57tz/.Ecx/o3wrqg $ p߸&- {#FQ^w6+|곳Ͽ޷\RI^B[ bDhm\qU=w>}\٧Г;,Oa ݯ_yNBx5?$+tRb۷_dQXFڻd'#d $ x).j6k86x]d2ʏ)Yp mIX "\6xl'ǜ]OzBo]=Nvո%5Eoyڽ{D0ߖԺ]Xf^}!rQ"kQͶfrFsR0ж6c Q6Q ~[o|m,KQ6+N.צk5YKZGĻ{51X[GkmiwxV@ڋovI@B`e6M޷ͤ>|ɓw-~ ]փζcs vaʶ[+j͍[lzKx}qyj]ѧˡ]} tdz7Wl /⋟WnEʖ.͛q }#rZ.k[L/TCm1f bT}>޻;K/[;m-ooٵUe%\+ǔ0Dұ'=IqJ]'ٵ.G!zS9bh$cxϫ49}~~>+qZlv5jAY[gI6~`:^Y[%=ozzcقhN ]vb]t.t K frzz/'.eW94s[EµFm"e &Yn-ilŻ#cӒVsESFՓ+NC)VslY=Ϭ䜛}.J frttK/ş ΂Fy[ۺi0Q9.c<Åo "OMMMNN^BG )Qҫ ݺG?"6"7cI¼л;}hRC! ;hUHֆXh?x/C@C-@loo[[㑳3{:4 ټj=~`1 K"t lyyY6_\\z@P3?Z[{koouHyiG˃ shor:vOuP]:8mSB63K[[2|mE w5syH-NwH/úVᡉ^][{K&SSJg|kk+]{78k39=== 0D>+ٜ1a]1+Tj< # Juú},  Y|X׽a]uv`aXWaa]uv`aXWaa]uv"KeqAͻٯOa] AFhr?Y _1sž|d Y$?;_wvv !  @ ú@BúbsBoJ+ƀ>}z3ΰp-zΰp]zӄ?F/Ȁ%tu@:ú@ a]zΰ#^3+ʄwDMQqo־EeB KkbN_Fvk_K }b'׵qΰ_$\INEi~vY:ú@ߩXf[_|ozզؒw|WͲڂ^؊ :6׶'+BX bLo$BYf)Y2Mqn҆"}6-Tm֊ ΰ0 *lߍBsYO{Vm+F+6M{wlb{jlnB̿{a]`@T/rae-1iԛ. ^ǾkyvY>f-g3 [ĉY븮&^e\趗، §0 je= $zޕΛԳBxoLkyz@^yץ.$}<w7_+n\#}n[~Z> stream xZn6 0szcXLfh Me_RlJ?Yg#RG"iKm{R(;%A< |ҷ#xNE(i/OWjy4M,(OX*[T*[|2!=2rlP bהcVӔN38 vSendstream endobj 24 0 obj 1553 endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode >> stream x][o ~#w@2I>n?7r~GҔ㝢u#)^>R~}~V`κg?o??}Umwoal?O|4uOU6/Ѥ٦֍ ?^?i40kӇlW}U|~v8l/MЄjM-ݹIZ@&u2Lᙷ@-.#_5vϥ潈g}}bӗ\?shߌӠ{pnPpߌspn 9 ssƜ;Ǝx6U_ӈ'FǗll {VPUu+;?=U[}Z?_՟'qz Bkah5:?уKZ GYWA.q- } `_‘kgrD탐K\ Cy=5z/A%#׬jZ3,A.q- }v WkCG/I&W[{yYBnکO.WwM(OI?%DKDku'F.^u\M 3S#1Nrt KEAL"H\K>mBHU"O & -8rPadLv$^O.rg's B m:WYs5:Ce1o {v2-l0-nȻ 4& a k}hqqr*=vf]318f]1clB  Y xęڻEUx ikg[G ZTH6O7~ͭ/VA1`Q4x^! U|X"5Rt9<%dMyRo&qk XkXr_u+E`_NxH,P U=@WΌ>,{PǙB9B>sP}iaYR t:C |]š>ѥÍޒ`y 8^ґ<_]!2D GP|,U(`5IʊI1;J4xC;qvMjfuqN. E_0v0Nb2Щ`竪BW^xjwIuwx:E!֔ux)j27h $=$sRh*̍qHgmڻ:=H kf|T'!Uƨz !sJR R*bwPW%Kh/*G$Np^&4DaUz,X$ SȕYsE1Qs .8(T{IeDv#[ҫxHE\٨*G-* bO|Fe#(z۹3lxNU!M|:QNf" YM獎:|*/uCiB!P'2%/H@ؔ$5W|f8=^0-Ƒ8v**CEǗQ1fpTdʔG ;vOi* 50plAWR-h4)9+c(puN*DyE(TItBMOXʃ!8{>W3JΊNIQrVGj0wFs=IL!}\[h(TXۦ^Ke겢P\3`9MZ(&&*M)I5unbBQOQrD+w,_Bү9iސAFE!dA(B]ӍT3Ey|2WL$!vkq;QXbSE; `1kSOAйtHMt9OtοُXwƌւ0gsS&`D:ZS dnm?ַ$KR|2QBek3F \+F k|&N{uЍnzjw5}s{rY>WmjokzDp󠃯vJ]٠c㛟endstream endobj 27 0 obj 3160 endobj 29 0 obj << /Type /XObject /Subtype /Image /Width 564 /Height 349 /BitsPerComponent 8 /Length 30 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream xQlչwbNƷNR4u[P\(N=6P JXE9MDEz)%= TVVUXjT4:RVS@q|W23{{53_k^ۙ^k] UkנJh?0 éyJ0&& 660 o, a8}MfM0 l2 laN`Y` p`7d0&& 660 o, a8}MfM0 l2 laN`Y` p`7d0&& 660 o, a8}MfM0 l2 laN`Y`>9Ԛi'pN 66ۻwr_n_w 66i ll2 l`5d& vk,OM``Y`&ح&&? 6M[MfM~l`46n 66i ll2 l`5d& vk,OM``Y`&ح&&? 6M[MfM~l`46n 66i ll2 l`5d[gә];ڴkt ΅&&?mMu opN ξ&&?mMW=dT9g`Y`NMqNA/AmU-={vҿS:_I}.>D7 #e~#/E[4@6}^ڐ``Y`NMGM<'`Nz#LQ rL=^%M$ \ZIi ^}vo;ۄh,Obwghtp%Q2/bh6 _m)_a,t~)jDlIEu]>Ό3=wp¹0d-΅ 9GzF29ʌKz/$2lM|]c|ǝpf 66iczt'$Z${sDEd.8(ϭ0Rc:RSMCMfM~:M1٤?8^gĸ&z>Oʤɦ?l,M!2eMfM~ wC&h\V b+G_&1]oy_1qMfM~ @%5NNr4<BI4ȰLM]1 66ĽE~2us8Qxn5xV^ ҳ/elSM?6ME3&IRuGsKvOÃ#ؒ=T9~6w 6ME䧳& S3t(WP{ (!TMl[)l$O;g$`⣄$<[ޝSGIaKT\ScSU o'+l$O;gS8ƅri#Í,Jn\jc|l$OgM:Ilb26ME3&G]VⰉޕt$Tma|l$Oɦ7t:_^)_cQ=%[nMR+G|bj/͎M`S64$$!X2/rMJ \~nt|l$Oæ@wI؜{C$ Ӿ~&ޯOۼ8ZT76ME3땁u NH%N2uKMU^w%6I`8xR`E,wʈa;/oFq6189ydWl^=quJM۷_jOT8]. FT bӞV_0h*/DWL:lʾSfSUmMu"9Hg0plJ`SwcG`#wcܻ(Zyv!|B pv(u) l>;C XlM9e?f ND|i$0KQ!  6]Y`&o 6Mt0ML abz7t9gG%F:D~GW7%>|'gMQFD0͗Ig葽tfŦtH>Y|4:{"%Z WUl۷F,g殓[6tGI(0hי 0Dc).l*)rRD$/.^G/ -gz.xi}<|Zdf)wl)~Bc}=t/Bz4>aL .tf7LDw{%duIϝ 89_rZɑl"@Ur l/trL?#~# zL&FQ9Aw<&ό [xN0)8l]9Y`%,m ?ҡp\&*#7HMEb;1c Âng7*֟7 Gxn`&CM2(ux/Aoԫk|G%s9`Sa61w%ZyXf L̒a6顿@GNJV `4 P^<=2:yW TIK[h!T$eMU#һ?1ӣA#ڸ͋,L3aKK?YcM`SDB{bRb%/ϛ_a7(mQ*ΤɇJ0bFaSUa6!T`.DGZ6j ɰ7\a.D`D 6M0ؔeeMzF==̀j7o=%WU5G">!2& 찉ؤ鸬MYzƅ Iy% Y36`S)6UCOpM$ȱAnfi>,ݥZݫLl`)k䶯GTmW>Ż?eG̺sۢC!M1:'1 f`MYVTU]Rh}K`CEEbU.E(]f*|!sLl`)rȦBZ^f+؁mS Es ʣ=¸ 3oVM` 6eYΙj pkem.$5F$LΛ(&`ν? 䗣Z3~/L$Χ*N^%¥խؔ}MuKze1PjPƜbl zl ~DaՒBc  hZ,VA+81k6Bc~I4V#psΦz<%wOkHqJq[D/4\K3H$gR$K*9ZMyQbGi$$Z#٤ixwW%zq9I I\>͝@>Mj6EcSuOMdzLpmM=qPMRH"Wrfp0 '&G`O2;0|wvWKTREq$~ˤ@K:RZMWl(v prW"ATTL-XՐOO 6F&te l,-*9NdxJAdtک) t!9qm`g S5*ϻ\+rtZS66`SMrL ?o oo$!U=)&P2Y04\4}4GM5:z&ɹd@L+7Ii6A%GuMzB`yz`S3ǎ){4SLzl(/m|6q9+GQ`S:BT|!h>@'Bb "W/ l*}fQ>'DL FiLDҧ.d?ɎL 6WD4 Sl@/)X>u6U 6>G٤3ZdSic8Q,1)JM_.l]׺z's<<1O 'bX pa#Fvd$dgN.AΧm"QrHJcG:3opolӶ/_#q tK=M2:h[W|2_ʅZ:o꾹TCm7}`TM~\Q``@ Psg/81H`Mr!ZlzME-M̏kHM|< L(*5NCGU@%1i7Q;tAi{>5L`Y`v&!-G,@dz.>Jc,O;gX$ٻ0Rx{t[>3K/pMR9 qǧv^ 66, j%w-lzg"&P)ґ{#~6d䧳ɦ ٝ:670%m\D TWODxđl㇜W;QMfM~:lb RbMD(+q['O4@%)MU5üxtĝ#0W 2W&Pl(N Ŧ\j'd䧳&NIUgc#~O*L`!0y l⣄mEmX,ObaSX<6&CM*Q>XM f!_2'T]B%tvlUB 66iWl H{CML lsI񌾒JySOW{2&J]6Uc.tlGECd<7CKD'tK:'{~s8.m7wuD `Y`FW)!A#DC䊹*46%ᆦS_f Ml2 l`dݍFuhMrj,OM`u3^}f ɯK`Y`&n"xlֈ˗GMfM~l,z>zWsl%d&ɖ4ͦj!=MfM~l ̦wtޓ=MfM~lZ7=s̵0ɞ&&? 6M--dO`Y`V['L]׷ iM<'{465m[WdO`Y`l1-6٭Uj465a|։KȦFo.Gɞ&&? 6Mf̱ l2 l`ԐӽvJq[eh#<{0ɞ&&? 6MJ"(adO`Y`N(@PBlnf<d&)9CKNM<${46q )edO`Y` HTv',O{ԲrҳQ&6U7e0dpCt?Oz)dO`Y` tC8Ifdd|=MfM0 L660&|.&1JI660\fTX', aiwu|NMU&&2pu¦jf=MfM0N 6uvlq򩳐 l2 la=tL`zל\/>dO`Y` {k1v9dSu#F +l2 la?MH*95MUɞ&&/hHaF;RΦ66oHnUMfM0q<^vTuё`'O&6"WCr', =~6.&6WC'.&>Z`Q` `^CDɬb', D 8l@>3&&.?zG7lV', %-,Ŀ`tTW,|', Ԟ4mby5 dOuz`Y` ҩ7ktw/F65p};Xa0:;9>א}.*{b;;\ Z^^^ @zGLGq]:n`u-b… [l윝U?APJ{ѕAkWmmm]]]+++A'U*+z{imOAPLΙ;6An#N.]r]#6QS ZZZjoot׵hFT+ɞ\W (".)lZS}AI֖ T\D`ibuE 2rL`w]U6m) ȖVWWD%iܛb ӮAXrKq]&U 6"? lihh(7°im}pA*#xfS~}1r EMNNc2H`3 AԊxMM1",--MkxZ3ġr KcFRbt@59(k]MkxWlCF%]Ś ̦5${  0GfZS@Ŕ<(޳ufS!AœI.6DHB'SQrMkHAPQ$1pfgg]%)q6!Aj yƦD OIPbA576!A߾&'']W$qy&${ (ɷHAP$q\]W$%1 8 hffƷU0޲i ɞ ʃ.[p)oٴdOe[u\.{1LoٴdOeU G`ӚxEu "K` ɞ ʎFT16 I2W477 N]I'jsYg&S==HjV433^i˖-ԧ''']W RD~ᅥzT%uB4??5쳉˗zz0DX#±YH Ai*l";/ \it,@P6ϟ_Q疯vvvӔGGGlBwJS9b{hhrdߕuB)iT*IL"Z!1ܱ/R9|xw]Wۮ"AP#*s˿~ EtrHu{wr'}\{;w\-A|>~Ws˩S#:OmC})]h[;\-Ai*ll-=9_yezppys]wMtSwfffsgw9|xwSb*l-O^[v\}<4Pjo_7u|޹J#Φ|'`c~:o+cOar:O Albt{e;o?OLG <ԼַF@ * æ/,,8Aܚ#%u]+鐼An{~=۷w"2T<M{fsg*XuPnlo~sg ֍l: Ʀ[nI*n9@[ɭ_{my۶`#;hs֭As>ܹjZ(kl;wvZuוliO|RMw?=gC/o]twcFHl_߰O#D释~ZY=@\='6J3롇ޘwk=zMj} ӝߧ["addz|zP56z2VVVoLhX&byjO |4~񷒨'xض-^xai߾Dr+6lT!(}M谒MA/yF:7޸;uQ]kXٕD[opGWkXL`S|%:M|Mrއblѿ Vb L$G{ʭL*/)'M3:T)Uӎ'MKeYG"ofjT!ȉJzX5ʦ7޸̝&wjOIT<ľ69u֧O/]**Lc6;_cqoNǏO}u8b7!W6ϡN bCCM1f*1e'z w9F4##7v_P[ ltNM"f~e[ȴ<=ߵc[EQn{wF bCCMqz5m?[?iSFP~vW6~#ݻ[ l#DDE4!l6[-ҥ.ݭ_~RGGF 'GVV:P$\LlQ ȕ8Jl8J'==23=gJ_`S!.A^\{=CB!ȭ&[!Oe,NODoNg>F4VEei̜I;P-:4fiON_$b!17Mo5SScvn.W#wM'U6AG;vtkfN7ZVo\U`GGFx4*!}&&?ubm|'J {L6q'USG Xiyr+) DsrӄnX|CoYz[LНn;l!cj[CUhI#hf!qE<Jl4Og~&N%/czWUP]J_`S*#/v/mJƎt@<wM-J ?bFO 9~#XCU`'rb|MW@Z_}pμ_/_ 7!D *xg2b~f1 wfS8S| Q} 8`a4fDH Oj}Y\ Aܫs@@1 *|=ʤXG8r?ՈyӋb8{hMdB$ti t -J]:&bMu}{gU(~YMro_>iMm[Fح96}d\?`Gykt:-Y\B| vM&"x>mR]6݌O4첩ymqr ;,>))᝔ u,mOxMsVZ~pph||gw랞6Au6lJ(]6Yi8v?_V)V'}vVlM'N={[>,fBJ#{rjjJC[%1 #×i61|U.NK[(#$i1*}_iS3{{欴<+6z֓.{BbL'rFغ}eeJ/--tS/sgFؾsyyJC[3WMlMtJ ًO,y񷚻ܹkB fk fH_jyr+WlH/'nw]6YJHk+3$_7ɛ"*VEXu6zon:u%z7e)$#| MeOʤпV[nǷ}ddz||bCCYdUM ;u6=SVfH $p9.l !*Wi`q[op]Nn^ZZP`SLH $(SC2X 2U22,yӮ)8+++ĻsVm35k-wttmyr()zzzO^lb@K(#/?%l{L<|Ӱ$~ynS#|S\*xΝfH #azkLн-fNcԜ_zuE7Brklε ϟ__]]M!ȉ{wnVjX+1?ID(7ԨMRQPra=k ȹ_>!6}g=ӹ!':dk@5׮5_;9ԐuݻR$sZ$-0ljTVcc7D̻̓$*F+Ӄȗ̗O˟sgЃ )QRVלU:I#Ҿ}I6Z> -A ljBO<1HdtGru1 ljB]y 9W!͟uں󖧏WHbYTHMĉq1+pc3335u@V6:ԅdj-Ai ljN^YرcRNkep &P{@nkzԳsXǎ l~$ȑ΂^կoyJM`A5MAP6AAYAeM`A5MAP6AAYAeM`A5MAP488t΃Yg>Ӊdo;x endstream endobj 30 0 obj 14294 endobj 28 0 obj << /Type /XObject /Subtype /Image /Width 637 /Height 205 /BitsPerComponent 8 /Length 31 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream x\uDZȎRoڒ: j!TIȖbCԒh(u%q-Xae'Y٥ )CBclp@ B+`B%Qm$Khc!ADNu8{3}3;| 3wӎߞO?֭{>?D!S~o& N'"Ov?@2nv҃v [l]bh =h@AH-6.@znv҃v [l]bh =h@AH-6.@znv҃v [l]bh =h@e{| 0wݶ?~4W # -6nx5GcSo[~0W # -6nvew/|n'͍+. -6n] yA-v!/h@ev.hL.څb E[l2Ahv [&hB^nv] -6n] yA-v!/h@ev.hL.څb E[l2Ahv [&hB^nv] -6n] yA-;'{)nC #-6n EKaՏv.D hL]p-مvbI}&Mx͉!kyqr&oSJ4uRS^KrT^r֔إZҬ6bE[l2iBZٮ*X{M`PڨKU^kڹǶi'JTq(]==ٿJQnvdXUh7ŒuT.wJ{#K7ءcJ%B{,oe]hpX1ڮk>vJٿ\ nvdC,ק*\_b-[N;kd=|N.TqnXD{o_?;.hhL,"ӇhlJߩ.P/G/,씖;vh?jؼo nvˤg=jWcSNƝZW*hڕ|v]_} mhLkSM0W>ʹطF>kWR8{rnv$vF^ims@)lW wox-CA-{ljή<*\+RN\UZV^K̫툯UZ9tǡh'^{og?T/[h@eҶt A5U\&H,_z5{߽ h@e6^<*X"]]Mx\ùTK}v [&-mg*yuuGN!.eqԇ6QӣRŋӧOԷ8w\pٳg{9QO MTCuJƱ״k^΍%8;;ˉ"#Grɓ'}|V?qΘW~Oԩ M$4sop+uo]P婇v_W߫GlViM}'Nħ~:N{/)W7c_Qο2A4,i?J]]菳 I Y[ rXȫ`|h7v@h.TFpՕ4l7vhW1][?<-֮ٝ;vw8݌UDv o_572iv=&tmaond[Vt|rߺZJtPpFٵ+EhBߴA͐ 4BUn-Zt2ƻvJǾkw~h6hBd׮7$4ɕtUͫ~Rzh*]e(h6[wܖ\# -UuZzknՒ`>]Ql;?gvo]nLKu7DvpFh@haXmQo>C*гݘ;.m:.څIgEz.\m>BZp' k9l)jwgvi[2)D`O F2#}MċFZ}u8]t0ypXXhWaƒsm~␺QM5Jܦw8GvvoZ¡ŶO[Ť^-!vw8ݦ]蛖kVҐ7 %|g]o-״vgfqBWٳ5kvlx-ăOHg}~詗4z.6Z]5=ܔU|V,Y5q%Mk_K\{F"Z@zܘ(7v ; G2l{vlZG8xGwBmm?;:v%h6hwR}"/!rgҾ(VMiIC-ȅjf- ;r}﹡RծrrQ|FTvž~X5 펓v%\VR2+-G) }nZCj59?x/=zwoݵyeWrAzތZouWόvs튞Ķf+JJ"igiji&=A_n*+W^ߒTVN6hwt pKwNjvD{)=QGRi;*zr˾Υ^eA5$]ΘllUlCQfd RE+? )UuDN jj6CvFF2*T4|T](e} lGrWZ_Қh0y`rR+~N׭W6k%Xc+/dՂ}r0jѦqŚjR|_ %#YHh|{nӁvF SʑrORQ* <(M]k3tOuWvS$BByopmМ{+3,]+ `qnmĵ\8dӁvI>QNZvnjg&nn͐շEvhw@Zl Mj7k׏Vy:!fPdj?˝Tm6/Evhw@Z2ٗ̆~[l7I^V'4-zHyg]@K ;~Vt]Ӧ]- 6+޴j>_-O̒ hwAeva;pά"4Vngm:o^^V?f0HX?mѤ ] hwc]OCJv}ԜY.Ǣeċ\Ymp<]@K ViQm^[jcuʡBU:|Mb_] hwvGWpꥃbx^TjwQZJ}5l5[Eݘ9Ouɗv7ZG֩u*na'NOm?et]y 6흻4ףR!Fv;_|_(%·?佼G /|?<7%gVv/kRxMpEi<^S?(w(~(>!G-=}rUo?4][ʛ7X֌WtH2sN,\ш_yk2uڛU|B_T%,bLYr'V(N(ʻ)Y6J0IН "G=z:֮fMbU+u!Bs%3W[kzUJkKAP,޶ջ7vڑf"Rk+%W)#KiU>"3׮]N5J5 o2ecweL\ ˫?9*ɵJU Յqe *a1W} N^߾_Y6. ֔-lVek]j] Ԯ?KdEtU)f#MYkt 5vM>)O攱%w6ۘ+\c]spQZvqr[kN c:4Ыa:9 vS57oHf2iB_uڍ;q]MrX:GhQ^<؇v+Mj߲N %x .՟vƒ&;pPvL@].\'6kîM+FK޵k7x[)5^6kI^u~n`NMRq?OhRah`iHfzڃ`+egIM3Zh|Msn֭usz?,+v{v5vpl76shk׮5)]Yw0&=h&N, mQn'["Юv>^J9*cwڵ麺TPEl3y]ɫMFF*Uv֯Оa;LwHRcyZgPi3jms bܕgL%ApL\ڕu>TQ ]QUУB ~ǹW 6k;69]L2ե3|k- }}H }뵫P% B/eQ_sR1-j;:YWƔ1kkQ )g㧽k+!WF` KM HkUzn2D=. xX|㇧ŬZ] VJ]k2WitZqSvdEI3ooO;u= FΛv b"@KNHfTys+7ޅ@hR펺v_<` o`3U۷rx_Sĉ(© }ڵ߻b;ƂNoF7A? h]j1Ю`]~{\Olpo):xs"iPB{u/Ͽ:펫v+k-"r]w͏~lڭ<]1Z^.[Hʯ4g3R 6wn5nCvL$2_ڪy_Si7]gJ|E@cCڵv}蒣~MfVJU#ɴ[x5XhծMcݚg\MW?ڠ]Iigdz{e&ٮvnڵq /ŬvD@eAkxgD1Ю=Ls6v~)ye<7v@l=jWS9jv.*CEu2v`&r@9 e7r||U^)G+kڊv%ɵ >=jr3JoiΥ H[ݠ MFMk2Hy5,"a)yޒV~<_Xc@/|P-:o=%kW={1yvԏ]=KSf%(zt<0)W"ʠ[g%i/u*;]FX]е+= f]hvm1QK̲:ԖVejJ(5<,iM@sv ڝ>c#ԉv%ճd7*;jWcNNL /څk Ehw3\KEo?,y}ȫSkv@)e]ٕڭfJ/څIl EjWMgfбlιVf_A?Y5#};T h&Hfh'h_"XK9^cz<7nJv +-{9K+ʵ*[Mmh] }v.ݥE7kwvM7O,lR݆hnChf(gj]xhBDvVB7ҮdVrϖUjBDvvo+Lys-rHDu^ 5; ۔=$?oԔW)ҠW5h#vi4u.>]&%ٴ+ V/ бzZeVZʡ_lVz:.mMbNݦ5y%3,Lgf4|՛bIy:* ;›Ov%ђJ=G7rԲ`_Yr^.4r}ˮtׯDh`$JU qHuSKu։sgal7uzݦvK&v-?:is壜}k[oj,+ʝ/+v9w+'EMF2LJ85ڵR6D3vM˗][8~؞#]vnӁv.=6QgV TV)H*d-v+%vתf\c W >5nk_ӢA%Ӷt A5UM#]W߻ەCR.…v [&Ү&j}˒do>εWjBbIڛ[ճ}v5wc/os݌p?nv$v\k>%.'xEȦ]='v-Mۧ]qEgUhLri7UФ/ce9M5"Y^r^xF[l2I]Mr U)?SqJf}R_7}TvfF2-6nڅb E[l2Ahv [&hB^nv] -6n] yA-v!/h@ev.hL.څb E[l2Ahv [&hB^nv] -6n] yA-v!/h@ev.hL.څb E[l2Ahv [&hB^nv] -6nl\bX~8~8W #Jh =h@AH-6.@znv҃v [l]bh =h@AH-6.@znv҃v [l]bh =h@AH-6.@znv҃v [l]bc}CA&"O/X> endstream endobj 31 0 obj 8809 endobj 33 0 obj << /Length 34 0 R /Filter /FlateDecode >> stream x\ێ7 }_`a ]iM%ߑmQ:Mg)ʺP$ERiϷ7ݙ7vooo7ߍM14$mbL]ˇۛy<Ӽ?&6:;yۛvn~?m޼3ߛyƘ6|Mvc^ݡi ?4l}2'jӰ 14jqf<';0"]Ni-,cG1},>4AO~'F$7F܈3 $7($7m,]ךQo73iٌl"s0P Ə= j~Rgti)j9BW.c..kvصs vm%.c..7/] DZ Z®]-%v-\]kgri)k9a$drU-Q|eS " ۴9F}hb5褋-14SAbC3ShGYg&QEkYhq<ZLc^|\vc#C5Ҧd]jKJA}2d*fزhn(L K3!o>i>S Г&=cAт@Myr|Jo wA au-\2fnQ>)pxIax.3w`􈞩:7c(x(׽],D *̨9}2Ss*2TȵODiWs.\k)Lvp eqWE ̈ !rcQa#؇4E)ػL(RZ)Ov6=@M  F98E#`:# sKCCf$@Is Tz( c#ɺI-dVRk  L3")1FF.Y5ގ^*0B-)x0h$ʔ% 'x{]re[EO)w*B"+Qx9mR5b41(t>Δ"@!e ?R.J4anZUb49, $00&Nj),cq F9!z7's.\@c%daHFZ3R-o81}pF<6@M5n%!&`Ӡ_fuG W MEړJoʂ["!beAB\!_Ž#}s*K\~w(V9uyH>ކ<cq;1Ӄ:C2ZbLA (PR؇G'e L|ci11 2P *&SN@&! k j4tq,e͈jоEfBn83 QkIKxf͐"˺ F~BpM#q T1eEYLf•)bO,e酓Ȝ@! /B#Bmk.zLvաU g )]g׭Yn.SZB0$)2zVyX[WZԁ)Fz]J,*6ҥ ;ly\a(IbȨXs F*d!\_I)0@A#Pf.UN @p=5aI|2WL+:_kce S^0Py)Dhm!&4!påx@j --ȋKO %Wd)ϣy2XG1w9 .,rםK!cFE,j|$\ѩ]q jJBjQ6*$w5O02g5# \wg%g;g=&zv/3 qșx]Y'( t[Jh/'/ӥq<x`d׺ 8wyR.n(5(g;BF׽ơRUeo4GuNfZGŌp$@Ϫ wM"=)>T˪Ǟ`+gjOn)<|͞6D3=GIgLJ7>?QEy0È'iLƶ7CyDջT6{tEvf[pǧ_hOCg@kݬ굛p l9S~ Y3|F?2arӊ30[1i_I; c˛Д ImJc]KHR)ERNC"X{.St4 攚=#}xޏxڎAu{8aqMi`+=i1Qvt {_endstream endobj 34 0 obj 2637 endobj 36 0 obj << /Type /XObject /Subtype /Image /Width 500 /Height 145 /BitsPerComponent 8 /Length 37 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream xQLWI!+ŭ).@/]bE- (HDG$EutBFjOZY+t_臻~o[?}~Ǩ=x839:Ϟy moo ryp0ݻPgٹp!9n9w. ccvPy%${33/4 5S]zӧ#bQe8>ݮzc|U%:@fvꍍb(Z%K B TjjވF}{UF(==}ev:egT34B>\nWHϜ>~Ku37@fnWAbl2n(ˁ@p{vjrou%lnu_%vꍵ񊕀ϱnW19Y\IEZ:[[%v*ac86}.Bat4]zc}04TC ceLLu_.E2nWqbJ|9dt_.E4[_/h] D~nnA[|f;ũS+ѣݗ jsxx Uoln*Ϟ=}X#bct4V(t_4A&|9ݮzc~>s钭JW٬5ZOiBE41yN#tnt 58{v'T61qw A;?OvC=qaS9+G6`湹h_is{{ 42Rv>ș,O'!Y\Ȓg5Էzůh]>f63cmm5 ont]-acKs7JX[/k8&PPJhci]|+ nRBzxnЧ}G=l `蛎5vsI1 ~5˹L+VW;KjU" ߆ HYAc*m@4ɩlkl`NKo~Ǐus3wn6Z=%mD}26+!r4]X7 Xl8>'kR(1t:6v.v jAR^$Omo]rޅ_s9]" ~M|pu7vIr\X[Kױp9qAH{';s"jKۦyjzVj zgx\'v-@c/rx_+Cd\vի tv7pppH$copUՍE665MkK?BɥKic sd3o~4|e[qS|zWϙ>QsB![ SiF9kGSC=E.Dd{ܦ)7Jsn4ӯC An۵P(äR)j˻TBal2Nz#[ ^q{x%F:Rd07y3R=ݼ3@9?y Slmbp;ᳳ҅N'WژB9{ asr^q;ns#n[ YDzJ@$vD[01>r;F:r υ(OGIollC![/Gs{s#n۝Iy6#5:H$}s.(AS+ak7<̍lnwjfY-;̛;S%yGݞ&_XX9HN~[d #΁u/m$qjjwޠv{JqcWWǸ=ARNK\.7=Qzce%79Y%Nr{s#m<% n뢗R(Ug@PFnۅ|>/###m$ UL$ss x(o&{[:p.AҺ΅ 7n;gQ V9+q8iϴ[u1NB(Uf0֮)yHWCn?~r۝>۫p8J 7L̪?n7AҺۋfFoɣ*A!nO&ͭ[{oC<ݮ158<.XPKp?Jkچ M^8mڗK8P9ˊ^ЯE{6YU: q/RG\W~b i3bo ̫2Ej n' ]jvz-J%Y]ǑŷhR%DHrp1 ڞwҡB@43bo bxt.n^]Z WP0E\Ep?qhiuyc9zڴ1q0 h^`!S #Gcbo b,,,w* }:o{3ݟ4vRX^s7'3:z6p/ ww n<ʧ*wsͽݮAn'w i]ܼ]]mI*mҡ$3DaVu/upn9r*>svç4Y;ݮO\O\v1 Cj[]T7>EGϟ;ޡVݰ.‚u1Inuvo> r, ;J+LNѧ IU2JoTn$/gTu.@Ln7d|8H n'v޷X*KoyGeb` IW7ocC#ta] ;gTz^JfSCmn˾|ˠiJ;r@*OBzо)T(ǡ6r- kqy] w*vKmva] Vөnl6Пoy@?\$}&h'*d\_5IA;HSBc}YПo)Uh'~۾QYѩnG.ޞvì?Wځ;-n S8 %x!<5Q2a>7:O\.g#hp{n7[v4jBw +ٳ*- j^^ϴX,_2OzM%p{!TwN1KWIB %6vvv0 A; YIJ83}54^K.& mp{v; N\/dl2z.t;Z'C~;U6۝]^ R .gN".s!557neGի6<-3X,4F{d*< nWQM g yz9.gNbP]nd%m3p{u}f[69]]N-nRy)= nY {{{9I'|V"]n?ާVm@W5IE|yezs9)&6srff6s^Hzd*NMqcTN?5[duqv 5Bc>ju-׳ u>=u;^ON۰ӡE;yd')OGUollCRUZB\anR;H$_U:{͛7vKFo;vwAN9ݟteKӴ]0̜\]]Ri` LN.U ^T7dvh ~3I}UFj n'p;^udwwfNO_n.j]t}Ώ59} LL\iy&'+V|.5nC>UgNZ~taZsɲ?~ks|F%n㆙'Ov.π,$% \?-ꐡx09 p? 3't{Ph['cs oq;"m%խ@JX\&/Bn3'"m1[RVMsg; C^ F"?sF%?J 7OXTgN͜|UjE63Ow4(_UkހvBgWPU糉vNцXe"U 2 nw͜ >Hkbٽ#ݯp{xܩ-}j+Q%5._Ne2#ݯp{i`dX4d])z,=2bɽ#ݯp{ ed*߶Oz%?< no35gNP{?z(*4`n+p;ܮB 3''Ϝ,<)JKӟ~nRk] )V}elVsv]/ïYϑɖrƖ]|ؙα[>yn+p;ўJ7^%ޗW 2HrlgNN?)$~!K[֭梅BRbrJn+p;JRxss DI!ݮf "L6Rnxm8WTJ^W9SG%mn'p;2y#v.Q9Q}(k!9˾4쑪ۻҿU[2/tlZ:sesR^wWqdB&Qdzw^_/VW5K9sڰt9X]14_ RtZO1xEvNmlu{&JI7nuA$ c8I#j*xV^vH&vng?gn3Q<\]AGB_rUJn:sno` druq1ۤs/Ӫs,Gd]5_2kNc wTIn?.^vqTGϥfv jSnt 'z!hPXlV]F2ڪu9lp-R?ݮzckk3t_4MOO3gm)XN٪Cb|p'ΦZyo֨ GDu$0=FBbD7dcjs6c -*'N iuTVPdv)+⩿n8ƹ/])+ns8̥K+ѣ 0 ;vnsBHBL=m rһ:Kq 7ڹӆ^o~ln+ڵxj 1QJM&Nve ã]Qf]&27+at4V(t_%/H_L_l oq2v;ꓭ-@dxnCrƢR߭R }nBGݠF;5++eݗap0y]z#p~ڵvKRUVzrYF(Jݲvj*3d^giiye%]zcrU%~Gw=W2 5RUݗeff6.X`0|xx@`T't_pFQ`F(yŢΐ@WVu endstream endobj 37 0 obj 7228 endobj 35 0 obj << /Type /XObject /Subtype /Image /Width 499 /Height 241 /BitsPerComponent 8 /Length 38 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream xOl׵đQIfU*@h& եlĬm4rRlBl@jaD&\$ e3@̐Q7 rbl']]Wt4LM 瘛NOJ@U.^.,hWYY#_2{^t^c  4 Pi]z#n2nܘ@^:ԮVw 4;߸]zcl,73PPpzYZ5Ϗ1}g>@ӧ3ժ7xzGGq9u˰fwtD'OUclmvw'76OQPvwwOJkWX\,LF-ᄏyj0j\{˺?(pKkWvn*A+JR2٧ݫz_'spp#Xy3g;;;?.d^Zuvm)>(E18Y\,:o&&t\P\98zvKW?.AWWvrww͖Gt ܚd.c ,>ӮV19zu͖Wc?4pbyyחUoԪe +BNܸi"fyV@AB!v>b?s/{Bi nY9 -OL|@O/.M/f# ;9OHlN'5Ȇg1_}vzP֜7w쾰sbVNRbW[XrRX[Z&yS/=k:&PqhO-t@>HNg iWNCqz ;w>#-*|QHEON?4pV[[jɮUιҬ(]}O/y_Wm^ο.|̏P2uTceeohhDN\ڤqۺZ;WRsNH]5r'6OE=ɗ#OJ.^.,hި۾re܏n(yaz)Z=cSV9/)Ǐ'"D¦rNWW<2yю~s,yJRrs瞙 0iꍖj!:G52JA}Ώ1Z,:}vʼv˗ԇBZ,'O8^gРk,P?Po`:9 h'|A*߯J_^+ޏF<, rpc?;qr^;ә8O~o[? @𣜗'){;OA_u}2go }~=?|k,#bsrnaaIwDbWyu%},F~\A(#b{d={r^'.vӹsR"OijjyaY ؍!izCPݨ֨L2{r^"vg~'<b2yōҥ?yYw=&bG9x:Sw˘"{Ŏr^q&b7 qLl=bۋv9?/hj=666l'bx` bPΫ0+hm1ՕxŶ+v: YTl=bI9tz\XvSNZJ2b]bSkhhue7z{+WlJC]Fu䫯bdc@Q;idr^ GJoSPoX;K￟J Ȉ=nhJZn*1<]XǶhc||izzV?[أ!*JdvM鍕g?4z%iccvdz;߸]Sz#2g>Q;*bb7Nĭ@󚝍ѝz&ɍ[[GOG}x8K2HD"wd@{lyӧ3~hgy_@ZΜN-{ NCrs禬3}}cǒw=by9۷s33~hL}``3ߵӐdur}zzmnlLU$}{.h1E"p͛Pd(D"{N;w>}nmvw'VWK'OI_AbQΫRpT']8Sڌ}kTS1W$sހ$YXzVǓvΝr{h]/w]zͼOp#vv5Y"v:g盎m޺ezOZ׽N]wʕuIۿ?RLvK&bz~ʎtp:=?@}tL{%v.EDKN[]- 7bǪFz+JndwOZ;9XkgG);0ylz?ަgI¦}ec;mvtlOCm{Lyzw?]/\%-xN?oxIFɝJ{fe/s2dyMǡ3K~mAbil6hO᯵oyI7H;cucVL]mrTNnMd>?=7wX[؝iحT2U$R >~hB$ǭWC7=DqhOr ~?XbQN[:m ְU ݙ6zQ[.9s(Z&Ey8MݚK狿{y9qí":ZzTiJ~+_D&lJuZ][&$Lkh0ɕicy%)]ʶ+՞HF/GV0_'FTmXSzLuw~ t>B삈]*boQΫ."v[{R*v-=!^624P}9vz ;uTk0Uҙ w3 -j-5-&#j gD# vU.w<{ pdZVSعx:0u,vl\DǨZUݨi|5ִ7nnMG:h;MѫϷU:L;WA0=d3HB'hSP'jUU+73Z(Lڠ1 Uӳ\QDH?):E+H4jPRnnM~ةMu۰Ѱ{w3;R12,*eaxkz" 2 27Wȇꎓť&.TMR`Gn:|\Z7`7꽻ݙ]*ƍYR1ZCU;KkJG8ܬdY7*v3/޻\WWp/z,d{w3;gymuL@^AZ鴫Ń"\ܹ)7[9iB$X~sAM|IȲYr!zslCgZ]L.;pb -r|x[Oaj͍ fْz OPt Or|[rd,j2 vg4]up< RWƍer{{Nݐqdzl6l'3ɐͽѣ=u]_/'JsD,}yJi/!q6C잠E|'ID.N7gj^AZO*rڝP 4*vRje\҂عL*vf}e]K=E%yx)ޟk{}mL_[Rt9Ϝ +HÉ1j!G*v۪N^RªIl?ťJͅxJLASsM3sOc{W/}RYPtkvFw4֊Ei)Gʜs^ޮZx\y@ݝ ۩-&\ 2V+^{-eixW*;;\y)bWKeYwjVˣSیNOŻumYL䋀p;jb -cawwԩWryrN^*C}U OO ''6ߵbԕG:Lݙh8ڇM̳Po$Irpv[`W37bIӟݝt~*WN+ݨŸL+ ݙh]R=-AZF𤰀UeeiW?nt4#v Ӹֳ33o縻P1D[^AZ)tuusH+,M)5RjUemdY u.7_!5n'DG+(AZI]{<" 2UO;Ir쵪z)5!/gq> (X_/ww߫qH$ xH 2i)SUvr=WY8's1=#j{&V\011%}UWȟ(y~f؝C'J2ad251ͱ3U]7tseb8ߐkkի؝(J2t.;~iZHbuHOgs}bUH^kUMu؝C*v&iDo.@}B=vT+bUGKr#5h+4P5b}t Zu P״ JSg:A4-Zu+z,5vXRΗSeeM2yܨ [b+qM ]9‘H1{:<2 bl2І#S3{--ՄPZ7S/5-ZuM퍊]P*BMGF았e{ɓ}ev[[4hNq;{: 5y$ۍ|Qz|'/gL؝أ$J2}vJ:^zE.:\z:.clb<]nje&vObutdW]yZbx x 8x P h 4 4 4 8eLyBALTv@at:M-kk?- \iy|L&e@萴 !v#_#GTˠb!uA;CR&x@d2֏A;! L !vb1C1 v;D "C/.'&>PO1cCh/8 qun_ぁQz x.vx}m[< b5bs3z̃|o3; x.vRD>I"vz7 n"KHvj'S#biO*حWZ!vh]byjw z^EqFI> stream x\n7 }763 ([>5 (K~#u(3v6FpbH)Ҏ>]^|9an=/߇_x7|9LS{X;1A,Oݏp84aߏ^^\_^83um411 k׏LqOMrScrstl ۜ%2`cK\>3妻܍Dz iͱe\sjm/@OsݭjzwS4G簬CsQ4As4Qs4fa4v߬1 醓b4٣CMfESw~XHj'6R8`N(QVus5^ \,=>g˹>^\,>+K^\,=>g˯.Q\us$JdU9\a4+eypṫ$ 2us}Fڧ5G^T ;sq,k.ɘ[rG2F-L02rW02grVȉk&kujQsRI}vU fMq\9Y5YVXc4i7mKQnrrEh!h*#^YM47qFsFsnqqhnXN՘ =~Sc.sTOVZȆv.%Z-oF ܱ8 o"}b|p6u !mpl a#pT& gh]jh\Hzfj%d&4bWsCEJèh +hτ.c#(CNz\DnsNU&\h-Xv]DA*4@dmiY ;Lyv4P2&}c(ϔO BB>9h*pRGCڤvͤ,5[ Ԡz>~F@ kD6ב9 1F _= v.ؙ0$s.MWQ .x t~1cd[ {nH-E6 !kX6ut>Z d IяAfʭN)x&d5}Hסqp,N.*"th)9"۳82d K6 Ɛ΢YTr$A[B0(viD@. 8"V-8&LnIgVZ"WRM:` v$hh&W/J6<7rNG봷݉]?cՍ -Y6*(P ?-6'@"+ o9w8Zb,gQ8퓐|f;21Sj-?;XWx2 3QV4s& BOi<}#8C$xM}&d 5R":&zd+JOtuOrap9a}wixa2uMg}J3a`ۗ"2Mea(|̭^[d TKHecvR"/m{K_se[vIKzY[S|gr ˧C#ƻt y@9kӑ+0 RD/Dy6]dyPcK!N:@R0S]/i1ȷR+T`8 Ou 9ɊL7z !h9RhŢ+n㶧maiL4yI%Pe̮, ax)V!\bKQ=oR >8&]3bp]mB4i5wv-Eo|At(4w^ aŇ}'Vz=Oad1HU4ܶd͌o00@QzDԗi$&vBٗ]iivnZ]4JDzg66n6Y[>50(n^ǒ^_Ĭ /C2Ƭ&ʃ해0kRC&ү4HzKn$# VA6;oQYoA -=S9SjOU)]]ޤtU5>D%!T/rlH3zrOoz[՘8ҥ~A1endstream endobj 41 0 obj 2265 endobj 43 0 obj << /Type /XObject /Subtype /Image /Width 613 /Height 205 /BitsPerComponent 8 /Length 44 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream x_lםVYY)k貫x)I)6^5`؄֒bJMp A@hChb>toj( ΃^n%. m+쓂>-ѣz ]z43 ax̙r;y;4-h˞vggJQOK3 s5՘M?~/9Z6V؟6E\sZІ9쏚jL%̿EZ8qIB_\qI\R)ⒸE\e$.)G%E".KQ%qIQKrqI\R)ⒸE\e$.)G%E".KQ%qIQKrqI\R)ⒸE\e$.)G%E".KQ%qIQKrqI\R)ⒸE\e$.)G%E".KQ%qIQKrqI\R)ⒸE\e$.)G%E".KQ%qIQKrqI\R)ⒸE\e$.)G%E.\c@\vK⒢L{,@ vK`*|aijlً{f"-Owduzeg$.)Tٳ׵BK!P^^$8\3I*{hG5Oj4q)/KJ\uPQO GT 3PGd"|O9ˍ_^iApiIAN׮})u2qI%E ;.aB!ҸYCР`''ҼZ봄|qI\Rp 'ťJs4(KyeNJ$.)T@i9\b9щk׾l \K2".K2.J9\%W 5)H{.ZE\e*P\j%KAlbcrJw\wioX%E &qnLf\dPG\Z&qiI".;Y-[_;;:2s3&eМ}]^_M\V#.Rиqkh%\9ZI%#}ɔ&Ru4*EK-DA(NX]Na%.;P-WK#Z`LщJϦ -.5 v\ZduGf1MoUIǚWup(qj.JùJy&.}..DJp⒢LKf!iC.a-BMNޓL!D\M{S{.NJOjN{5AI\TAR1O%qjYnDkeT{&M믝\:PyM\R]F\ƥ8qK`,P(ΩH 0xQkc).Ⓒ4.I}p P%Db[IԄ+@Uyɣ^*qIQv%(R IAQeaߡ}%ձ,J=9V .KQQƥ%S}iAgqXxN 1cLa4)fdKIUqQ4"SjI-\WbL&ZrرcV4.g hȠ "W.S$~)K!1cVND6&௉q:{f,TpƒbQ/wJ4̘+ïOxU3>$QnߢgiMw;$ J&)Lq +766=tdQKqd:fPd(O+#׮}SY>Kf?RkoXڟb]`ѻČRe ( tinLk&'90pjf4J^ ̨n)ZNyd:)lKȆuuu;tyJ ԵHЎ^6.ܜ²w\VI8 .Uft=|8Z{{z?}Y(AZ".* K%HKEJRq=\VL̝qVL&ݜ:Y(q9TJ   ĉ~]*dzzz~mm߇PUe4qY61766@%\[>I&?{{dbB!#V*e\sV,>dv_IU 6sٝD\v .kI>^%Ǵ:~BqY\V#CLQl*uT*Z ZZzQV.b &Usڒɓt:555!>i%.KP֭йS{եgZ-_}饩?j7Qe5M+sO%Whdfn!w;.~̇hڿ8zqI\Jl1爦Mw(̠~8Ꙙ8X|>t0E^>pqI\=۰sDS{6qDw"7Y-.ވuz#+c<ŋK4Οnf*~J؟ꁘ{׳\&++&@Y*en,qI\rGkhiNB\f) \j`|Ι)yWJ0ޓ|p\_X :1;whhNN\զ𭖖^dxVm*˸Gioo7ZC\ҋ̬7}x4/6eqb&\*;G^ۂJ Ju}&~.ZH:};uL>~Gp\;͎˦K7\l؏Ue{ 1%34t PϏ `#ReΣ? p͸D(Y_ťvs*ݾ}}KhM4-/˶ebJ%hġ e%^ F-k@S5.SKBxh$T#.=ڑ#^}$. պ> L54;^Poo7gm5حXl hH_\d\FmbυŸB:͍Ay'%. ijKTXل;|\dgg^ǡ.@$;(KszqɸlT/ޣ}OO(f끖gLrbK/~l?\V VWsk PRi"uh bj{.@'Np I>Gv .sseSLQ^.7eRv؅ 3yc# tmAb +˜i֦Rp4Nl:PA*t$|fC S|qSjd\#44R93W(yKKOjOqbd4QʯϾF"C\+.1MW].tIe$jOb@9? T6@)psvc%UXR}I<jǎnooEkkktc}e-q :V5eC`F e D -h gT~RC[k(IҬ#,9?a%̪Uٞcr NTКKG#/8:.5rPP(\KM x˻G~  F.PM=X2 (|%AZxZRz$q`%nY .[yQ>ty-KcLrKvhŊ;_ZZ q_x--HOcc"%y %.\&.;\aMW+pة;L¥L.̆8Pmթn;.Ţ;.-p!gv6 0PTytΩW;Q%F(g˧C$S(8\^X|Bќ jW9r3N׏Z-PI@5e1M{ڏ Z1*SZ:FL.hz疸pqj=+q fKL˩ڬ4åbMysT؏qs3OW֦mfڏz{/\Z5G~ n=ⲓ50)r#YPy Pd4o$W}i >><s% ae'R Ce{-<2E\t6נK :P%qI9jiiܹ|Љy_ĴKBuKrTPp:tbjw<` FmE\tW֭'>6eNqI\R".\9 qI.Ⓒ2A,$ lU$Ҡi:I@%~".KQ^fM3*Թ4~_J- \^P,sOQ-qI\R @oeIE@PQMqiW/m`Z^ٛOŮ\%/ڤ?FGe%pN t>: QOpgǥe'D;tiK]ܖ:9՞^*X s$f>SS%N".KQR5M2ʌ&/m)Kaʶor,Sxm& 2_2:#.vqI\RI/,T¥b.eBχ}.YPhF\dKD\{faCP;.?*żRGfqw.KE\.@]RKH֞*Y}9%[kiKw\5H)qIQ*Ⓒ+.OKwҎRɠHs /-q)^99\23j?%(ySK[jR(Qڗ:bTp\e.mAf}r qIKrK/q6H\R$.)G_X ;1۷>6xLv}}=쇂hՉ{ԩ>FGQX?z>t94?] eT*es'[NW* U?.M\KF9|bb끠L\RkuuutYORZ1Vj(׿b~Ѥ$.\.?*Υۇc洱ؕ+5w"LݼWk{Teug_y ơjrz(Ԛ*up15pF\R <Rf zdeVi ĥ97\wwzzz~"N\J!m0HH:0#ǁ %3L׾ɤ4CA¥ Pt_*M#.z6:2NSw)AWASKqm/\;8ėU؏_ut*NL_IW2#;]aOK&bC\l(.%X*)bsWN%GN\f~_r"-PK|$j+j v\v}+{XsJ-WffN2|R( 5#/J/,T<6{XwZ\u4NbXԯCp$*dx/QSM= gaג#9ΜXⒸNl>>xze4-K[b\K˘Y zʇ"!.; T'.;ӈe5$d/_xac#33kcca?D\1.?ϲ٬2N:"k%q/j|]Ν/^F0-lK\ "AL>~%q&.y01X4_cx"S.~l?\*-NqI\2z;lj֗w{zzp@eRYY(?ЩY#.˰}< Ԇ2]e;NVVK22M\VC m 1>|z433#`q6UⒸE/_}u)tKcp0ᣣSa?VˆXY%.Xdq4Ѽ30SA\.wvvRTed,:'+"2TVVosJ5Ⓒҋ5}͎*qs\6*qI\FƢ˷ޚOs'vVϜɮ;/.fe$.#cQ%G_z&F_Fsĥ).J\(_x܉??;=]j萹ٳ?ygqVB:iT*I\UN͚<6SŪ-D +˥CSmwwa||dmeIN!$"2^Vvww{ /ofܼ:cL2Ⓒz 0۴=L=,,TFFa5E\>Rvr?ȇp\΍TR7$.E/bk c+q\JJ*LlwL&f-%q)ƒNΝZzj‘U"(2 R)ۮ.gr? pSN(7$.EuL{VrN>.Yijgg?gg%J6B!z tY[Y]d2t ? pS$.U/i9[6OHZܹRˈS(\(8oPepI(O`:vv< Gp͙L:)\.?L\b6JZs#?KkO_l q8 2ʸTVF`x S¼ujkBC1[_X. Σ0qQ/C6Ox,S+++(A+r叡_Cq/V%~΂m bZR->q"M̛77NN|R|^>\.;3 'P]R* 33_X@"wpptrYH˲wzū}x^FqIVFAe[R2$ gaS՗䳺qD" m9{V(1q)TKӋݴk5z&Ie)P~&.e,deD\.-AW\TTӡs'64^XX ?n>ؚL&[ zjT8TPzv8&{YnZJ K|8DN uvKzww7~8l\6tub Frfn}6 \ wFr,6Z7q=\V zopHX5.% ףȹsйS[^Oܹm&u-jY6 \‰3=CqR6M=Jy<:R#r^'6$khpIVFMeLq%|y⿩頫vwwO~rffmllܗp)`is':rpq׮}.-!A⒬xL[WE_ &moRw Ӧ p$\.W*q[X g2^ jZ~jFYkR/#d-_qĆ,uս<4`ܥp1K!``O-\~1=e ^jI@e_) O1&׿?|w,(mLHa4)fdKIUqQ4"T]Hin%Eko1e:ek)ց_T#.5}^k̘+:} N]IK2.WLf^@G!,+ Je{\wze9lЌp4R\bkU7Y}\lo%E w)TZlZM]\^DI\WңqR9Ju;1q3Ъ絯H"%L\N%qIQeD\e#.Uj?/ .HZN0k.1iG-%K2&5$k^|8$.)ʔG\PB1^;%oRW ZvRPNe q>~K⒢LS.ͼYyiM}@YO'g^vdLM1 gw\bC.7;+8$.)Tp;PB4fnuݓt[!nԎEc9Ĥ9ĺ~tqI\RR( {o=Q jXUFݥGYRsj .{kJ\K⒢L5KwoKJpt aciоK°.>x+m.(Mw9".K24.ie{$.)qI\R".K2E\K⒢L%(Ⓒ(S%qI9$.)qI\R".K2E\K⒢L%(Ⓒ(S%qI9$.)qI\R".K2E\K⒢L%(Ⓒ(S%qI9$.)qI\R".K2E\K⒢L%(Ⓒ(S%qI9$.)qI\R".K2E\K⒢L%(Ⓒ(S%qI9$.)qI\R".K2E\K⒢L%(Ⓒ(S%qI9$.)qI\R".K2E\BmooiS ߥ#9쏚jL  endstream endobj 44 0 obj 12162 endobj 42 0 obj << /Type /XObject /Subtype /Image /Width 433 /Height 145 /BitsPerComponent 8 /Length 45 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream xOlםȖPQ,$VrZvȵ6V#\p !`mAO6Օk` "txdQo<W~o?Ù7of8䇿{o~Fj?M^h͛`D`ΝTved;~WL HdRPB Quh(6?_Zʘ!"Ȥ8ڵk'{}D$~P`J O<~7}[D"YMMe(D~ơdET䉉mwF$Zb16%67v%?y}267}sD"Quj޽q(X,RV+#ZP ^X߸koH$j'&fCɬݾuJں^bg(hys66%[MHtww]Dp8Y3%GtJey(BRŔq(Ă֕KI7J$B q(w߭tjH$]Ͻ]lDAȓ@q/33[Yɚ]"_IC"ly8>^ɝ{JWL.H|*TSSY8e3DL.HdD" ."ź#g[$n+ơdaO)bhD"ut֮ڙ3!/%_r9wL$J2:7%32R&R\~q(5VTgXDVPH&=־k5`wA$:%pMD~ikkip^;o5ښ}w +yG<6S=6FTu`DHFĉ+Oo/+A$,3T6??a߽jfD  {H}oH$K++h;jx bn TZl5ܺg/w"^@^E"|QJX'`_5W81q8&8V$b Ԅ"elHfYcvh+zjɤJ(泂I8<1\VZχG5ɇ#u<>bE-崭؋Ey=GbR%k ɱh=V║HTϐ*v *'"Q%O4p ѱD:"e+o4 Gbvĩ36;N$b~TPF"t*X,)YJ&Y6;T*q]ljJ,a20۶D[C jMq4D {4hZCtnH\_;GpT};љ_Xe-ϕJDRYGH(J2#%TИrq=ԏS8"^Ur [Z=56ܖ}"!Hgm\yL%e+ f9VsS[A]f}{k` Mzk+u4@Sx GAtT<0b*9~sņqD|vDžrfn. <]$^賶%דWH Lmatk5s=Λ5ѽ}ʕtGYDAh$J;3['Sd.%>&4vھg;6۶fxziPu)_Vaccw||Ѝ֌H(HdW0G $1OJ˸kLzG[8+vovh4YZ=F_7\t] W0;3]`p(z)ImmmE"ÿ$aM}O"Abs$l61(SV.e2FipW'3HכL8; Reپ tRm ĝx{'C ?e|JpS.6/sQi3RNOO@uV 1HDPHd1#EP p8R!rFxç=OSz)MNzmd$Shw(H ,sç=7۳g<n24cĎh`$/FJߊje2X4:>%DCɬyk`}26kFAb`hhkT,nXVϝY2IyNXm`$;+ bq8Zoj\;>4H|0}P23.ϽL*g 1HTG |.J xY2vvqP^qj0O+&va/pvk`$p R<!\r >u}}0Wjbpȫ>(ybO:7eni`$`2Z4ىd2 $ld;p >֔J\z%ظFmq(GCCmS;40 D| PP3pk:An$僂Dž'?f^Α#"u|(+qOۀDvo'$[( #@ u6(B4 1x}ck#⑁ό GV~R8|?s|5%;onxO "Qx!_4e'A\W =w?+<#Ov9 Y\,/-5(H ,bv.L # ^t W1;H`ЅLLJ526a'iaFAb`X,"Z+\`Bx|1@!)A!'A?M.K RX](F1-7<%bo|tQs V60 DXAh#Sn61'3:_Y*j%53hX G (0S^98w|'{/u痖Ei`$8~PH4pϑjY4a֍.9p~@\)i݊D}8&Z#wcG 2~]Dl;.uxt\lJ2:7%Fr57Q506? +/\5Doj(Vi+.M.T3mFV?/ڞg5R!.cǴk\kIxh_ptO)̹t>FE"QGoUo؝dSiI[UbTHolfCd;$&'Y }cNHX G-ڨ !la @, @0V|H:gR Dn؅yoʠfAb]HR!q:vնAJhjn j9.zTYk'y. Xq.5of[ejbOH$0pܑ[X#}`Wru=vA,#vAzbNHsAwbqvh i}(p s =c.H-v26<|~hh_XOjJOH3z\u+{- E"Gt\&$(T )H 0|.^[u70D !l˺G XXHԄ]peHN9UcH҉cuO%z@ ;Th}E"j  kYQ:+ݑȞm[~AbMMri`3{ggG]+Ud#?jz-B[$j]0` Hu,S#kgaqĪL?NNa*68F"Η<ga$])믿fo b~#Q7K 7'KcW=+S i.70:uJst$pA+AEu%;f9Q1UNkU]Sm=%R;OkU(H 4_Hz$EB`U(H >pD H7DAb`dl(|$v=m(H$S4 F$?zDAb`U_JX_$m`$ JL&٪P(!Hl^k~DAb`EmJ[w-aH[ msb*:K@Y$0$ A֯~+kLD:K@)$ZaH$ }4N>!qkk DT#\.<"H$P4H;H$i`*)͚O,-U26p1{x y94$K(H vvv3YDƃCwT硕HԒR^Yu>GIժ{ioJ8F:dq\ӌ2Ab7iooovvЇYV,Րd =CSnu:[-6ݞ/Q4KϟTmbVz˳gs}\U7wP5fC\ma^ü'*<Tiպ`t˄YDF"2F"]\P fAYR j=.f'D⃗ysĺHgkbWl"flx,jJ99hNi{GAbH<8Jo1`7j*FW\Ru5 ,PsCc_5H2׆c}oOj ~cȥлFSz);G$;rL]= AbH ÓdQI'I\!KD`:+⡶v!qrrzyX(_=jS$'/͆PmUjuveF1!֩ ԁĦ [6aGiiT?CIٜJ0*[=XN#8<+a$64}t8 zܹ|~i)ﭭn6OHIۗ&8Jޑ D\&JjS!="]2åD2|nmITH[9ڵ=QxNƐơd֮\I߾HVkWW m%iZc]D5|3 t4*I4sB If#5'2rU; ">yO<~`ilh+A H$@Hs$b\^P?V!6gMezA"~q(L8<m"<͆$ ":ya#>矩TAGa/bj^"^AN:C2$$R(]h/HH+30%.!QlnĺHԤzI8Dv q%iH-PC`C&魵p6D'&fCɬ]{O^_[VDAgc k2@P&0 XD(IN#JP:j+dXC;zkvBի{JơdFF; X5J(HsGbVԱk/^oo|5kk߸삭(!偁uG>4ӷfC[ bH, OΟPb7$~s[Y)oo]:2+ڂfC[ bHys6n==%^xWspc,tp$uIV܀Zlh+A Q~GtA" Bϋ%/X&aT>͵ڙ3!|}0הe m%H$ X,&>.r|1""j `m͵Ąc|RVWF m%H$ q~~@0DZV1.LE=}:ɷު>89 L5J(HsA"f"o)=LfXoo{lc~f m%H$9!xX8j  :DD|{H$EqtѣP̽\~yxqڡVDAKŋ)_H ,.!njlTcfY:uAX}jw} m%H$9!1] F ݯ?$E,sk!-S35ՃmnC^xmlh+A Q HHnK6J(HsBX|}bJfm` %P"1],mlmlh+A Q3Pojׯgs5kfC[ D7J%*h8J9Kz)zriڿV`"q{fg16TR?[܊O~S m%H &|~#/6N;X8bN p;<fC[ D\.#BX*2#O`z:H9z}O4p7Dv ?Tk~R2?Y͆$$6T2}5Vө'Wk'uH/H]ta'7/ ù_fC[ |>0zR>֘q.W 'Wmoe Qeˋ<2%™D1lggxݯ2nX61Q'ȋfÁHɽH(HT/e2KJxm-=YcV./ Ӹd2w q6;\ʁ!ǣؖS{QFD~H2r2MQ ƇsJx,{]Oa+;1K'?D^*BIp0An$P_5=Z-K'L&WQ.77[$pgZl;zؙ[O:<;=+m-li~` H:AEF$H$Kj 7>@Q ;y k#⑁ό>tJp '^ZYH2[kDLiDkֈc|SSYfHя="~ @ѵ#13aOGڈx$s䤧g{DJEt:  xB$zp $D"[5-Ԁ`jFD3zD"Uhm.=| ;anmHZ^囂D^c2LzA"QG<ĺ=ΪtKH$Y?$MTjDZ2%2KTQ\-zk׎ HX|>ʜmޟ^L4H*p";¼gY]Oi"/\0%\pD"QǩV{1Œq('ObsbjD>Y Jգ<|\$xθmռ M|t>ӷK$&v:cr;)U2θ>2￟2}D"z5u^)H$'95QHpͦȻs J+ڴ)H,8dMTMVDYmSD8?v.]2MVE"|?j!dQ;!{ѤWdMDLnj*ѣHDࠧuH ġA :j&AZO2PdM."EX jeG~QOeH5e@0`:J8kDUiE͝]Z&Ɔmhq ?QH$&f D@DW! 0j05qbc%ɓp8bDiww7q bp(Z/.L"HRr э]mŋRdDd3lOM7"jz[$uݡvl҇ }"Q`o„}m}`#&dR(jŎ6ygAomDj<}$5}OD"1U*:9ah6 D%q /> stream x]Yk$~?Գy AjIƏc l̾w"&Qvq_Um49ئn=Loj濏/Mfh=L_qƗ08Λf槿|n5NI͟M-ۯtn~6oi~6O?2ß! CKC-NCa4Ҧeid\62i8z9œeh蕖Er 9t3b8^z$W'q4oz ΍ qn΍9gspnPpnڙsة] ~w`k>>] Fd &3S<#p)ta)jAwB. Vkn@.rȵ^s r&%A. Vkn@.? DX Z $XJZ!}K@3áA\"UV;ct՚Jny wmP>~/JWJГ_c)gtqQ6ئt9l1h(ns&ʢ$*)ku}%HI,ݾ 6ZL`Tt5\H4Xas!ar.(x0l倀Gb 8O~W%CGj o4{r3r4˶ @Fi*Pvm_/jB* qT@bY`"k8INv~vgvι1W&Ķ$-E[:23t9]&09㖋Of1)X<ciϤ]`a!?\Ev%YB$A:K@w V #AiWf-n$+ G2 Fx)? aF6✑(`?yiG\³TFCSNCG  Ygˆ S/i_V>W;"Ft:2tMe\Q[P" &P|#4ۑG `V1g\#y0ӈ(^;񾸕Sw܋ U~ahXH&2RƊ܂Ƙ] BY*eN;ql3ɢFZ<V a;t~tm" EC]w#WB~(! !F1}7C!,0rGq>* Ƌ -g/O7 Cj+VU5tMX=+|5ǐhi$8EBRHEXt͖R6ϳummwa2<5Oxg-5c++gۚE I-u $6ܞ2VEqȂ(WeeT48C/ M/ZrZϊ`2Zy5>&cUd;ut̳{ED 1x‰dOHi[H)RuiO[Wrp?e++j)Tt[3( \%٘jdxY_/ڳ*OYsN,W3 !.!wMj)KrT׿.rT>~b[c\^J2ew϶ld֙im]4mM3jtd̪$~m j*@z4_hޜs5v́@/9 غ΁Mz(x5$?% 5vY* ks> 1v!2ЭtşK/49n.lSHXUXiXivGĮ_\L`B"~Ԉv=粠y؏wշ\hk6zQW[o``" !DS-qnFpnK/Di̓\ln{+Zsonn:܉M(hkK')xg\&8K")ఏP} 39 I%lMOs0H02:`5x~eLAS0YFs|d̠:dW]n^+|X Dަ0ϳ׈{AcpX%bXbRZ8L1(N)И9I9-Ճօyf~01+ӂaeS6Gendstream endobj 48 0 obj 2997 endobj 49 0 obj << /Type /XObject /Subtype /Image /Width 769 /Height 163 /BitsPerComponent 8 /Length 50 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream xOlgIH ݂I y1a Ɲd 2 -`fGh #" L,:,4tꀇ1žd2S!Vh_mbTz< _}W,݅           ]GvV{m=QRi{y=%reGAA e2zYÇ{{{Qt 3N6AEl=~ع4*$'OV|GtD.wqAt4洈B6m.dlllw/\bvkkEAAtXxO,V0nct|64 iy *eeZe-J sGt9|"+YAulsJ}t(g{&7-nAte P5/E_ JT$t | )H RtbJsɒǨ@ЉHA'}:##d`A <ˊ@ pؘ|qw1ٳgϟ?gn@JmO6ܝRȠgWJ_\\4iw]CvFKTHiV ږ]ܙ>n@d`iAA-u[v/kz堊S0E>й8>YfԁΨ+P +YM*?ɖdAAPPm3aS ٗ8g&ݗSl &!hТ^;ْ 9WÊ@ "1ֹ,lgbi9ljV 2 Kfl@A\"O799)m@kMmgqC2Л{ qݘCy›ШQrt{~˧Ï@@AGl(C֖w:^.O!o(A73!0]T^ġKq-܏)Qv"qAt4=v$a u~k &-a <ţGXnJ$\Z˹ =KƩqrf`,[Ydџq:ヅ  (.XrC[{jPQl1`X.ᐍ]~>~>I                            (. AW{{{;` ȣ.(0 ʹן>}0AQ@ f APaoAZ@ f APaoAZ@ f APaoAZ@ f APaoAZ@ f APaoAZ@ f APaoAZ@ f APaoAZ@ f APaoAZ@ f APaoAZ@ f APaoAZ@ f APaoAZ@w(|uff?ո@(:{ϖ(Dsܷ: ڞ5=}cx8o뎎W*lynR:hcc#k%?{(C]?ih<[^YY=jӟv|!K'`ՁnjPXG|/ ϟ#BVnYјiRyO,ԌISST%!=\&(9Ec P3}|4/\>E \ub!BQzA2ћ1iiC/kǎ\TT E@@ݿ߈F7]uW׋W622^@h. 1O.3QPٹ\47.CQ_յ|Dc P4/##ӱH,^kfst[Y@h Z[[)1&Xon "k+%j(9Ec N{w3v;]]?uJƍFE$#&@Gǫm=LWJ8ꜛ1@@V|~4vœ+CCEMD'O|L@8DB__7gq1S\^J@>=2Ugg dٳwlN#Ǽ/)  9OVZ[@㥥O Pr c5 :Qpt(K3u~; L@ 0uTޣiFc&%@ ȃFFFbX[7׭##_~Y& ϫ!~zcc*vHk9 Pr lBo+;;w6zz_=}sȏ{zΜKcC!fK/u'ߕx[Ed' @ yB壏bXs/W=s&_?ك3D>nR6_jDD!|:h04{[eDى2ȧ@40}fT*[c[<4@;uyķS@*iӧ1>?S>YR\d:jVF3!Ν{^Ô{?QoRz0#Z!R~3:- F@ ?CO"}WJFc&v r>H!qoFb7OyW/]Z 36%Ү'2 цF ERPd{ΧNn裹Jw);}Y{ix8G0~]q8XoL_yC[SwHv@o^3Oz J]:CS [.N^.N&2D9m /s&W==_ZKD͡HЁaZ7pF bcۖ e=шRs22ԼYl6X,@D85xL9"lUژb(J4<yȴ,<H_B D@# g%g(~hy]IK6̶'UlIl#V)X6 ȶLysY_=J\^('pFGׯFc Ry_| =>09Ta)&ܐp9mmmܼvwhn~V2!لtF5)IZ"]$b(9XZ D|I@I&o\E(:܊@h{TyՌs5C ty, Ha#_oJ7o?_v('ۿP8u6d!9I8&:X${Llf=%Og'tPs^¹lU( j=yr׎@Mu14k"1F[HR;HԘtFͦyl3e&2+Md&]1 t$cW P4Z]]l^[lp:"%?qiܛ?K;(X1qh{tZ- 1Z%;ym:a.-}h @,wOF OtvDN296ۧ@4LBEA )zjk{_;31^Ȫ̙151-H20,}4I^g)-p<(2J\(p?\"ЊQ=#;OM\a}}=;K@h@绛M=<4*%ʺ.ر{Pٮ7"@ cUV<hd4N5@֨@ CwhYӎ@%a)\/~n-21H : aQ*I HlZ}vëW)˹)'M߹>@?ӽd*('k٥[FllE^(Ͷ sdig6}&Y#.k=y칵/PQ .&mQMtGhQ)E懗&-5Gqr4x@q񎯿 RW^9\'Kc D *r'oJ?~>`h^=vLg"l:KOC?FPHr )Dp^_ 9{2s7/mCpr&"9]"Ǐz466ci$OMΡzD뿄@l!G2xִfד5Q2UrY @Ϟ=UF&#<vH{LDS(k+%H^c9y4f,PtHjǗt=LgX]zh(UKk,J>Y%"V9K?sk5+qg09"F>n~TT>p.v.x~tF >%%<|0b8 K9/^():1<"h[hYH;ytj/ڗDskk <OU fkwϽ]Gt[2i9[Nh\Zd|5LԈ18ᧄ D0 9oe)Ԥ1vQ (IS*ܼ~أjii) =zUL8D:sfLmH31Qh*3 S:e?SЫ,ܭn菁JE%E|KKZ E[E#Fi>Bt\_Yu??<y{@ؚLm lmV*; ~Y1vYO3kD:'1p`v}^maNݽ;'7{DT,..r8ٳgL!P5H[d0~+3oh(1אiP[;"JC0U ā#P3(2xЈb M<&cP w%"(cDmYZZvF2OqD?jgg嗏.-^l=5t3`VÁoH8$c<.Hg%sӑ49#PYEf[%CHD i$7s^0oM ti NdE'UfgF ̅xO[*x8믷FC4Ii@e5|p$1$c|f a!9@ZC> iD oK$ˀ݄?)2(ǂ@[[[~ 1jiibD B,P!r@}68j5? eTHDno!8/[qf@萐D ې0dѡPC@?r,DX=-..|yLj@!+gֿT93 ÍC_c $ ĭ]HhppFK/&4@Tf|:(-b_:6(G@?Ί"|Y!(om5?n{*\YMww 8+(]R7Y ^;^Ee` w:lij17ڂ_%x>vrrʕb,7ԍFMBEXNyrBܽZm`q@:fl֠"]8TzTs̘1zH47ق H ^yhY@_@h#5ﱓFbde.[5[{nf@a@[##_Ɇl':_{gٮZT( B/zFb{Orfgk<1Q㾷M5;;k9G|?S;i$a#+36d N>@l0v*Phn-hXgϞ}i$D{?7 SS;[}@|c':@‏xbA1"PRg=vNp:C+"J7e@/kqF:::?" wlYرcӍF# ߷oL2@Nud>it7snRR1J]#|g(411̊@ҝ:ճZ_ mޛA_ OysB7IF_ @h/NuDwr_͈^䋶'蜴a (сN~](Lzʹf>cX2d0mV$ PYcC7HzR2*G:Ed: cW+t 0T>Jd+a.-JWjv:C_ZF_1+kߚ.Lj@{중X@di#D؉2%E6$uy#QWDKG&^^Z@ =Љ.]=w+8rd.3̉o5І1F1jEG: d ?@) ڠW^ŐhvF'zr^y;%lY!/,Na.g@ ;i$ pmp 1 8d-Ӷ&)͠ɩS8-8$):jQRBL#PvVUbv#PVٳwl@Vq,Ȁwߝ\D)vQ:G;7Fd%iJe2Gi% t wd+~W=u;i$Q"d`1 [_ P}Z Ӂ DZd_e0i>"˕>v==}q=kqGgfyhnkv 2m](:ףG Q hOFu]] }9aEߟ'ۡ',ܘ]>U G3ysö3;[>u!ׯ?䨑鬙uJkwyy'?9PbKl{(|qELDO5<L&G@ $cmJg &ڦ KVr(S0kVZqG"]Q" %Btj=/&I&3ZO~<'n9/PzHְЏ,=>mclJƎ@-FӕlL͈ŐG dtdv :6A',]6}L8T,~/ryoBz,DKox/%,;eS< b9JL"^W evt/b"Vm 29٦)5n Պ@9$5&*hV췿~1R_Q<]rTC6zffj0'x,LgDO$~bN&F0(ӅJmE .'ʹd@L R{PVq7 `@QDB#Fe2؂ GfqOALш"9D["@ 8XG@e!0Y8^FI?21:LƥmO@s/WbXmPؙ3z}. P4n#@b7i-)V+ZHd-kx[047 J#C Yϴ;v*\"M@2>en<@kkk^mO>Y:QǏw8,|qa^ FhD{@=?$9(p[/5C(=^ "G@!(K!ZfȭS"6A Yk677{zJeK,=f wlꐻw7O(ˍ:V*z. HzP bv(r81^ӗ>#@)uDu܄&r@.H]H?ɱDterh^bdÚRimdd4;K@hRrFU&3>H`#귺qJB(jvs ڦChu DJ5;"(id<dY@zFf#J740}d 's$@zvD>yM?pR}| S@G@9J*Jf A.Rn{yܖ19tc h @ ҵkS|x/tiyg^E1F5;7F͠ mW.JIϻ3>5>>?% P4@9bXsƠx]abFMt">aPafz!ɨS{8W #D&~DKo9DCr>{Օs788+ P4@9ˤ:`.!37u|u#M`(Fy-xA 1K aȏ":+O---} @)2(iN&@,fw? mR*"_ӹ͋Q#pnb N5Ye?_2>ͥ.@"f P4Fg5C3!\.8˾ it pwh. ֔NS:1eڃ@"f P4*}=e8ٔ>vf鶶:ysӧ766K@)2(iEc ͺf}~T!ý{Osqߢ`@41HԩMN4;1Q-?@)2(iEc _̏hjW_0MlojO0Ec P J@lovl7'01(E%@h 2)uOO;/}g(' +cdzcc1Z>?;Rim`坓'sF#;@8iFGvvnI\vV%@h Y`Q:ʕmIC "/ׯNqV> Pr @ Z8>^0-o/  D R^ 7WW/ǎ>&8@@Vtw`11ωٯSS.}C('XckSSX_;D鵵bo;:^O J@d/LGI63Bkqh4 appVQm<:F%@h =:;;Ik/FFF @ZZm%\ sX73TJ彩_{0^@@t+M lo ''WΝ+}(  "W EH.67o9zgeeFC$f;ss^ZZ/1ɓsg#Og}B( moo3Ϗ]MfO{݉FG@;bolLdv_(IgOs~OT7Ύ+%ǃ(|+9tx'N-//}BQww.HmuPmOkkklÞNg> stream x]ێ}oAM7`8I$@I0mNU(/gF-RdTQ2ͯOlY5C/ͷvCӇnݍ|Ƿ'1/roi~мrMzZo_~~~zx~rݵq!gûml|h쟚??Ye_h^KnҥwKOWP!]N2laĚ!t& ;.ayIEZsF(E(Wӟ¹o'87܀8+87n̹]k߉mhz?l!@5ydLү3xddM8)NA(q- cAnzЃKZ G٘;˹|<ĵ0䚏3%A.i-fc@.>ĵ0䚏) {rIk5srĐ1%!|՚~K͓!`;$p 4/17C42bT@vSZX@i"ii{琞7`kmv;^ކ{Yʇ${H \q&P6{#K+^-p}e:+@WTB'蜫%%S)Ay dDC\2BK,  AJXTJXsǮZb-^Pa!x[?/l̤c1s9%hguxedf(,&[W0&؅Ҋ:wNI NKVŢل u3gN|ӐNM+tw|.t({vqLrH1ݣ$s5VUw 4Vۣ\"Gd;P,n`f f<7S9Be\sHn( "s(hP)ue Dolyv U B`46Ua٧2xeqQo1jpir$ վn:dXЕ:ܮ^4űx)-ygOPU@FWKP1̍B#LM#UNѳGNUV*Gu1ɕXRJq;):UxL U -NJ{eI1eϩP%1کv.":2S>V@BQ۪rVX3,MMS[ s)Un4 gv,aV> Q/)+ (K;۬!s l 4Cjr:Han * <H /"X q8k53G_]..VbQWԅ|"g f^pG菫Xh0kO%d{h#*zN=xumhAfkfpi¯닽v J #ttppal A:sDweP bY(ҕ¿mWԋa4UldCC>Ҵ [b0Deb׭Y#AB2Uw\[lrt'0jlG,oQ;H;WM ;UyBe͂=f)TυsBӼ/ VNTRJv_aR=1lU$uʶ֝F3LAF7?T/пQI '(MDZ[[+Ec<=E$9L5u)߿c-;pWp#>5PTNՆZZ١xfرOdFvC%X8#c ( =A$ 5Q =P9GgFt<5hAB`G&GZIt\IV'* (ھ7S,֚77:pE:KUD|%HfDi#w%l IVLv3Z5E$-@!Fg+:0ȪDD@媳믈\Rv3=*A"՝nZQY'8\Q$ёsE|l;8wmW duS&9]\&I^u c͙7Q?'9vAt\D5ZAl\UEЇmֿbzWJx,TqAVLX9Ă2O2cy!>f\S)#;k>[ӥ}^*Y9Mf٭Y̳t駷^]_wsܷ#.m'6Z8-iZ,RsV>҇*r3#aoj$m6HP9} wJ~p T.ZWؒb֛1|OQiWG -O%v?]ןzt<=sU2Cbdendstream endobj 53 0 obj 3013 endobj 54 0 obj << /Type /XObject /Subtype /Image /Width 770 /Height 571 /BitsPerComponent 8 /Length 55 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream x_lיDLp8צI_Ƿp\&4eoV 6whfcZ"E0JBZ\"h۸3|A`b3/W^oR$Hg~w]ؿ>NUfwSlm@&8ӧ1튤{>c]^[[}v|YؓI=G;ͽmt''LLL y8/_EC* R!"BKk׮u(5hF} W^,XO׫\~d 57oޔ,RcALھUF\jT }B/ZsO!G={1%+"&X^HkNOہo[C^(O"(e&+/8A_ౠmܫmK6 Ŷ' u Zv1a9nкђz|=ї3TlP+u7xjmw6iĚ<-bb^޺{~=~ ҧrծ>T3梪br Vut6U8cBzyj;fQ֟?ТN6M-ն&j4eR'e{iwZF_ @ Rӗi-\HM\QRѭ{EO-.XI{R ,;BUǽ˹IWSaf]l.[ %KӷY,-:%E̳սmr;xA ߧSxFv\A縵ripƊyM߼tO&'mi\- -G䶈E zX /(k!o(|:XI2tENeHbq;cA!#Zgꉤi*89VLO HƂ6ˣ"֫ǣmv&܂,%9yɦ^^:s3 N;9퓘m19 T 7YWG+KۿS\u_ZMpe$ $-_Z+'z7%m<7iN:p\Gni,e$ $-hӗ !k)sۿ LѴj3\ ,twX9H<=Ǒ}uvsLhӹ+_S+q0+vƂXtD-(Pkw ‚ IeAn7f,H$N) Nw";]Ў %__M1_: B,KN!>鎲K; %_z<牱; ,$wa5?YÇ/h2iJ6^߂8o;jl2X$LN-hWF$5-&&jU5zNX ,(;\>Mܟ]=\ B7aI)e'ҵ m䏚g*Qce9݌HBc;7" e'`A"Ȃ%,.[.{˴XȚi:hfk mVeYJ@`Aى,KDVw~A:: v һƤʌ -T N@btcA:tO`OEFb|FFj%lGukRnBd&y4:yN@tiAK'HtOJ+ N"X yHLFl/q-ΠHױA  7 . fSM& PzbA:zў1C F. ‚ I A_9f_HBfA2)GCY< ,|aY)!'}Ͻ32%z.Yp+{dW, $ςD uLYt-ӪĂz(_wfTptŽ?btdAcYFM̅8Ihys ޤeA[Yxȷw{>977{fP<#voAϠ# :~/BZ<d) ݺxoA~ɒzhvXtcA6?wOjDޙjeT{jZ Zy6p r{q,Njg񧌬vw Wz{{~%,ƂFLbA_r=8z B7<dgq\4s߂ögn_dwD|d Ƚhr;'Լȵ &H(u֣]3ԪO ~4ؗ‚ςTQ^r(WSttwD-h7Z_2,(;%iA_~v4 D e'$-H5U(~S;‚ M.E e'-htw}#{ # /l[W3[G" Z\{b֕oq߽IT z ;9 Yf, {gZgLHl ws6XEVSW‚N^,jAf5) ,\MH҂\ւ6  JeZkkAO,j jeAh)--h3J-ܥqz8Yj ‚N^,Hdm2)t[L X߂tSy4̂dMθ266o3ڴӭPIzV?z ;Cc63cZM"bAf#j/"}~嘄&E`AY.>g `Ay'Weʂ$G o ;XPv ʚݾT|dOHV, `A ,(k‚2hA! , `A ,($! T(uY,(;eӂ~qz, `A ,(*>%w%wY LaAy N`A ',(;eق~S;R(~֔lAKǾ>ł .@<ћ> O: ;XAn: ;XAwBA7 Dg'K.mbA "oM Ԏ`Ay "AX@tг \DqR=>, "DxPկ~7D}u顇H "Z(}P(lll%`A-=%TT@D j4i XAD _WbAj51D "h&V*bH: `A-Ԃ666H, ͠199I: `A-̂zPji3 lrT*5tXAD ׂH, kA[rDcAZP(\x1ů3tDcAfT*XAD mO^:ׯ_wMo9{ltFX,NMM]VBacc#$*JHAП|bA*F#$FPViW iH@B:bxΝ+(zP(j+4rT*5v _vmbbbxN>=??/{cvA7oޜҧC4EV+ W\i5مF15fT*6_vMn޼kFAz}ǒ@R T VLݼyS@q2SN2GZ8|bFQ,+J׮]+<Zlllnw޵w4vLVAׯ9r$$MR)F#$FPViW iH@B:r\,fHz^(jZHr\*H@A:!AЇjBPӮ@4RT.Ӯ@Ґt-˅Bauu5$J(J%$MZ- iW QH@B:+4JX,6+(ViWrmֺ?Խ{?HF/_}8RaG&_?W 1<<,-GIAlA^ҒT>Vަ˃ v<n+I@Ăxey,)DT~4$,˫NSLO;}fౠk׮\|Rvmj,{NVXf ?L!wZ?ϣڠ/\5Zy)) Z^橆< G+e o;(Ʌ)};.Ўы)6'ɣ ?/Ztb8vw>H_+Z+0&u"4s֛ņ)2 ~A}XPjtĻVZ- , E,ht@`A-fA: "h5 j6Rihh(, E,HjRzvEA-;c3FﮟZ'^;џA tP\N" ܯ[?r,֋Tb'"32hA[:!V >pS "vGdӂfX$q[ؠ@br"Hrf(  ~y7- ZJ666"G|RcϞGܹsݾɴ?$X___ۦ^Ox`**7vU=Q_6)lAq [ЍOU]n]=tGOAگRWՕM"|!h4bRtGyŋ[}'O o,_|o Q뷾{Д?яZ&627'ev?599"QOԨզΝ孭7VϞsjY=Q;WSZXZ]pAj Xh,hIjШ藳RL&Dg$ᄏ18UWkoYsI,(ȝ]~… =CCR1Iv:f E##$R$?߇,H, }Vrs`KgHy;̡Q׎fM&Ђl,zY*ɪ$dY[Ĭ[%,(w$9Uk\RT⥗_v{YHd"/T|J##T/Lo7EDNOhmmm:dQq>գn"mr%*܂h x_W}w XPxC~[FGgBdӂ\~^?d'.\r)y$ ~ý˵ ÏPjo3L XP! N:^WRTbvK$ػn<v >'.!e2hAuj~Fci||DM&`Av1\:sXo Dn5|N4JC]cll^=A Gyԩ2rŗ~BJ<ș3E w,$XP?՟YAi|UoZ"E]^xa>y WM,(rhhqV3hACCߐ~654O&h,:5)ƕ+|E5& 9!l6+)/2#!q;*Bs2=ZhsL3N!SɦCZLG oNU,Zl6KȈ,U*[o-g#ѣ_~ʌ.ʋjT~t,ɲȒ)yaҴ]349ɯ,*A *տZ/;rY~K ](?{# JbXc:zg@ ]`A]BV ?ZYy~EFQҧmYFd_?.d/5+W G?8r|#W\I,'~A=ڷ899$>6[H^ yzʞA_}XzG,`qoÏind"n :q&ֳoGGgdݼh/-H.='U_cᱠc.YWAr S=kG/\ڟ^`A= m uʠ}o:XBg|@:~s-E=RZmja咘Sg~7prXygCf.sAnO8^O2 k$%=k9OW$344&'ffNEp :{fظz#ZVGdYIʨkæO ޻30r%oll,**Ec<^)y4ۣ .չ+;&?/(h5g<VsAXHXg!L-m |ɐ٨sLdӂTr_3ƒ<{E!#G=ujRB DUD":: YGF&jZ1qF#o;:unqsLdωH-hFBGɦMp }4 ('NĩSߙ}kYѣ ۍbo&Gl&-m//0q'D><~/Х-XP2A ڳ<3hSm#+LM={\6<|lh6Oh'Wz%\HׂTWL4dX9I-%>ի.. %&vڴ VvVpZǺ'?yr򃃿u1`AD-T'ZK |晁e)ҵ ƈՄc ̸7-bZҲFn g%\GFF{!IV}Gϟ={S^=oٽ}t_Ȑ̪XP2A h 1oXDʕW"7EkŊ-Gwx~IOd\.߿~A5`Ar%k,eb+XPz4Ç?CR|~@g^yo/E J&iA'['WOP4yֺ%TFNIvzAʲ*$< uY ]#xCwNz5p &0ō,(UI]HRyCvE J&2kAhD!rnG-^?bc76 -zD"fiR1bA,$:ΞrO`}z wۃHweݤv֒؂]6111Ll|mQjBJ}nEc`ԫ7KXZZaCÂGCH8S>BA=lu6Ot-Osw-՘?{Ǡg!DDxڷ(#=C6t:VLSHƂؽ[\:۰4{ɂkIwDQob Jc7o] v!u!I%*ݻΝ;=yU/AdXדÆw3ڴ}ll~p@aVSN>5|ނĊ9|{Y4K1GH[n,#!>Ca͕գ!={bA=}0#n [YӧOcy.-($n)Z#9^c bJ6FD6YF`1Y9;ƭϽ3-+ekȉ SrJ\v^‚,HHW\21q$n *<8aȴbGr./Dw7yB,Ȓ9ҽYu<&b)ZEp=b<> X:tr"hyESܞ3p>嬿̡QOI+#"9l`lF*tMiyW^9ַ^я>~yŶK1-ߓ9|`R\؞qÝJ'YXmRiH.+]! /2s ren>a;{5oAjvQx3ROK z>2";"- ]4Q^/sfRCvsLon7l&l[rX+,%ňdwytW__ǵ5Hނn {&+ ?f>e>UgU"Hbdd2zbA[Θ0g@-nr#PQlx1 VZ(PG}t"hF; u'8ތehMclik&n~؉dvWìUO'aAY-Hs.)>x0 ʂϲ+|5R+˂ѐuXܵ[vdB~tTyg*IZINnYбc#[x½kϾH݂& Q oٔ)q?D݌T^X2eA}NAnJƵ OB,% l'kd?yf4ϑ_<uaC{ld:ujhh(ӘS>Hł?w,(E r2{=uaCO{zGό֓K r{G%saA"*';ZʃlxnӰ[0]vQ X۽%֟1;ҧㇸ'~s޽~PJ3~k"LeA!;iۖEQtDtwme5rKfAtHvυids-H˴uAWbb>6(\  XcA~R) :}wcpyb5O6XP2~XPb ʞ|lCrݽm>U_QbA+Πa,(=d=uz]㷠M̂Dw9Z&1 mllwrAq[ۈɂB,:igKI2ٜAq܄O@nG#=c ѤD 93/(v7l[FE" <;+bg@3i{cE.:_V &Hn(9E6[+yM_>ӁYt1s}'A%> қ ܐv+ҵ ‚= +ۊ;=?_,5Y5DZASQoA/H˂B>w, Wʂ^;vw>X%gjLǎ];pgĔDi^xa^sGJ><ڬ$Ξhfn 0cGJ&y'R ‚Yނ3nA!$iA+Yu Kyҿ:wf}['љujfnÜ1rڞ {#2XP23w݈ɂt |DoLf^4*0nI<I ]ZT#=]IH&ψj9wx/ewocA+6e,ʂ&2KoxA՘%m4)TĂKstP̂.9:_6%H҂ XP+߹(4ͽ{}A3u'I>"/={6."YܧOv#"$ϒREݰTv/|ӕ판Ph'NԳ{fUb s2=vDoDZǂSר޴:{ ͹&ԝ; RܯOM>pN߿{@,Rd_B;Wո qLhA!d6ԥq> ӈ6dx^ET]fAWѕb)vט&*)6V*p_2 ?hkGfl7mYX1)u9turlόڹ=U\6ums-̺Ӊ.bܟhL 1._>p%u!I%&< J&vYcNixrFPkks~ SMl춂myy,hI7c=lͥ3_9f~ԉYKtW!^5_ݔIfwop-HhAIf*oy`AZmj*J']+h޻wᄡ?`AD-(d _LHEziǺX^-)rF;nBNaNy}[e˽,:L5㞛# P +Ulok Y\!Qp1ܗN-Sĉ$R|>T½o+㱸XtˏzTZtd"o5Wɣ6u&fҢ.fA@E!z {ݔ LfOҞMXѤ0:N K=?@G;67ƾ},q{g5xp(Μ#2;[[\E J&kA#]%T<._>,ncOV*K"s;eEGG5cG'‚,Zu藳!{DGdyTQڴ ɕ-HYH`4!,ʕ+=O~Y#?:a4?iWu޳-rGKCLׂ3eA;v@)oaY Eo[ajC-bv[;ڶg JV;fTVsKi㈓S/CG{;zy"]ǎ]Rֻ${.:SMLfK[N'O\oSO766ܢ%XP"_>3?3OUB\b(N;hėnt}ϳucZ %ԷtΝIߗ^.-EUwoh5u0 wJgoinQ_10PJ ,('~8shTJh 2HҙyTd-h径jɲ[$e_-cc[%djSE6 _|չ? ,(_ 1 2;Lp1] ?@l:|J6MO=ɲ"gZiB?l|чtʕb>yEY4SɫhGewH-H/&i؎]Z㏗~F;%~juu5+d Wł[/fӆ0,l.,,ȑm ;ޚ\?Ѭ͝jO5GddMZ*9"KzRBݺ6'fTL`A\XF@gVM,(+ Z__4hE-j ۭ`?3j8 5*o̺^we]}_j]URAr[;xߞڱX'Q5d WȂme!`hB,HrcAkkk6 _>m XV0W&6iG#wBvO?^qĤɹO ,(_ A:M})94)鶝Lmm m5 v JhO.xMdkrFhwkLL_ /w;wu L`AXȏ0WN?j,O a666+Zs-baws$Hin= J&|E^,vx}KxK:XHZڹEC j4b\.!l6;7 棏 DzjZRzL`AXP_Li"^7 C5*V[K!$a,(XP J&ܹ͂I|~\ও'b J&|~Z* Zֶ?xd'?rҷ N`ADX&?ɩS;I*Kٚ=e-,(Ȧmm _.T*en F~drrdrr`A ,( x⎉ hrYW(1=6ɷ^t; d"_AlVUozXҕ+`\fꪣŊMG)S*헚//ͅ ;zXPv J&4TvxrBJ>\[;w:uȑ?9{Z$DC3H܌zqwSSǟ >ss)uzvy/أ; s4Гϫa T*&OIz8Eh{K }70NG3HHwOFcyorN3=&fT"W>DABH . ZvE\.JfvE^>D!ViW Q&''bH"ɱA"JB" / (@生{mDB_e : xMJEV ]N"Zx,hE)XAD UUA "hZ <Dp-HAkkk)~S fAw)r92t D,Vr^O DP j6RD@"Z/XAD h"HH{ Q"ZwŋX@ _M%V.JfD9UI, |wH, "ojGSV@t C#i4i :XAtv J ]DQ94R|dw (442w (L=+u=sLO J~_@k,zJDDKGTl:s@Nt}gϯ؉qMmbA'V >pS "rn"h ?q[ؠ@br"Hf(  ~y7fh">-`A9 -nA7>YTuue=юiJ]'++DoN[,?]r? Xh,hIjШ藳RL&Dgp Ya)o94ڑ,PZQ/0K%Y,kt."AX. V t2*'~9ɢ%}dG9D,JTy*WhvJMl^ -XP6-HA& O'PN!^$F яV6[Ĭ #O㝝KO'.$XPq=Ԏ.?kyۂ6>?",H|IG1q39)-ֈx~AQcAYyywNO ,`]?aZςi(7}R&pr,(8q*P-U" $`Av1\:sXo Dn5|N4JC]cttf|>=ӥ}{D HƂ6x ĕduܛ-ਜ਼~bb,3Y‚RÇ/?~[ ;*G[}^i}+ GPi9tyWKۿSlrʗl= F-rhȞW ]Ib=:tyF#xz&Yg.m6: e)&D:ܶ5q̦eʂ~BD H҂6 Y"m$4)d%MSuqyNR HւAX.s"BmV mVR^dFBG{XawU=d{:v+f4BM3FߜXPv,HAs?(^i}+znAuf{bA K1q+/tE,ȝr2m1mLmA'NO,cc:qttFv\\,7R=C#;~^i}+eAnj8^O2ⶠc>S?YtО%k=+ 1|Yf=Ӟ1,XPM, ΂66kh;\\ї% M:/ <8٫/owlȂ~~}ч|s吟׶ XPGuM*zCr ʧi@I'Yd;Yֈ"삡#q;0onbyd~-GreoZKsYu\ ‚v,LCP)y/9,ܡâ,hThyN 2Q_9!)drB{kEqən_]U-/UZ ,`؜92'/{b]'bX(iAqE0yn_m*;ީtգ$9Vb~qi-?o ̆,(EhNzR[N*ZP=D: kAj'P:zFM}G6]uIlG- 5EDC,gœ!?,,`X-e*:qi7^>;VcLyŞ~/K22S d9}%|\$6z-(79ս@ 2cAX"|aqyE-R;WMlłd)^iÂ:# U>ޒ[P> MV,kg> +sbL i@&y,Rt4W~o^P ʟ( W LRS|i@ .s+mɦy:ۛ\:xfy'OTKkݗ[P IO- =ݕdCF*V7-Hԋ3!X.dx6dA""/{ַD7^H4^NN^Gȯ8zrYD X#XP=ِ2ӫ8=z>J%e|Di|Y~EZA(ޕjy",TOhAf'5Lw Dc7ɬ1?RQnՠd6b<[rK~kD  '베Mdf]62^ٴt`A`Af ڥ`A`A ‚$XP= ( TO ,J, `A ‚$ Ymqb⇗ώP;nQ[ XsO>\9^f7+ĂXY/'QLJ{yQ܀wjR)`A+6kg-xPZq|Qk,H+d2}/TIQl?"نڔ(^;vhU}žncdzX4]` ([PZ"ù~=/ifY)fAM&,-{CݨC-HO{Â5[Ͽja,,0s8YL*O1 rQ܂byV 7١XXl-H4[ t[ւmrE { -U ZTʇ*iA@i\^\]̔POk;fu6&QZnAɓ5kgpX rѲ?yggMPI abA^>Ʋ2=>hj:ZEIu4f R]PEX2A.>i=>2x(?Ǘ:EƢ&ɂbx lAyT#f:^TlȒ<ȹ@E495[%b>t6OzAq<D lA ѝ⟟!Uݺ!<`AoA+FKxFw57_ ‚$[J^[\:F KfU, TnAj{E LH ‚$[͛O?| xˡ[7,-Q ‚$XP= ( TO ,J, `A ‚$XP= ( TO ,J, `A ‚$XP= ( TO ,JՓO>6O>[k4 "W ,u B h,~Z "_ ,u B h,~Z "_ ,u B h,~Z "_ ,u B h,~Z "_ ,u B h,~Z "_ ,u B h_~ί~П9 endstream endobj 55 0 obj 29353 endobj 57 0 obj << /Length 58 0 R /Filter /FlateDecode >> stream x]nw3.r@M q&ߡvI#wZ٦?9m͗mޙf4v9-_h~|inn~t5wKcGxEZ9>5|{4~7O4io[{7 vyt{cnXןӼ`36ؚ7~1fU~ckq;ٻpZ&?2F8m~d>.i Lto{8+#q~Z҇t= +~#&%z"6c' s6O_@ r6%LR(8%a84EC? GHX0H}H@?ߨ`P"S\ q%J^?MG8=;0McpVҢ|D$86T*"unFن Y`ٜs5'o븧,+RTBZK|5cbU@h[YB Hi0 _|}΄5*tDPOQႽI=nDJ -%MU2n3̓bQxPM۝ξ4:y6?@B%ZTnHDКrшJz-P0^9F-Ws3Xޑc~Mv$-2](J|C`a,D?PCE$aqaك#8baQ̠*2N:r ro}`$ 7%EK |!}.irYPn#SJUeCeAddy%SЊ[S!]ےT*11\!9>)޴a7T@7%t5Ja<5 u,DE"w^ Es*E)jYS;- U~ARP%adJ}Qk=w~*fL( 'A4 4#*< g*˒Vګ, KoLpȊ3Օ4(^bdNp-f򬒳BUUN%Gw-T+EDߢ&U@'YЮO16VU1ffZ7I*YNi[! HΧLsRҕP]h't'k"޵gsU\d3%eEd<} W7ROTYV(J^uRHZn̰ dBߢ(fB3J% Y8_˄ֵJ%/Xy<̲.'FsoQ—wpWXXی]u_W,c)_GQ` Gə D#d]w=S(Vq' py̛u9&.tE)}]s)]޻=~a;8$5zA-Ij0E);at𩼌p腴GWQS`{w_}bUқ@Ehg>hQhl&g&Nf-RFH0u_cפ54 -~ǩHR +};H+K9ɧ_͛o l*hQ8Kxe {J#!ߜ}[W'%}^vb{w)t=mzr!IDu,;_}yP^2,U;kFZlDg#_ߐee$T3"~r.)T&b5{FDQ~rK˿H+t^8-/'*;kssySw\}B.V("3j9E_0zBw2Nut,O!Ui(ULڛº2 fU}CjVhH {uD]kbpkBJq@Q1PHY9C4VC 3iLPݍ{uoџDVb8m{EW!)Fn%8> stream xlםY;lkGiy6Hn:gLZ*Gp08!W%Zδbe23Ġ-#0@Ax@ }/sUuYUUFWdUH_/5 I_QO#^o~<8LMMyf,T3{5~|XMvWi#;bsX)]rˍ'(OsVs}jq 1R5+T sW<_[9l@(@'ǐ6Re!?R Y5~ӟ^_/ChffR W_|`o\e Q M2 IrM둍u=5a,Bc)'tBi00Ӣǯ nG~ V.^ͣ@aߌ~:lz>VӹUG_Kꁪpe?~\;w˶[ e)}v)l8{~!nV2< fAV/!c@rZ]$Z%s<֟W4c#aB+6X^l* T )@.ã@]+YHH~un{vю0w,PS;dQn[pʟ+p2Q>mDOaߏDD dcT*-nxU'ܱ@NaoDD쌫ڠ3TcKςV!qz]σHf{T }pFCKs: \6L@xK75 6_=wjii) $@ ?"bSWO@"pd  iP (@A"\@"pd  iP (@A"\@"pd  iP (@A"\@"pd  iP (@A"\@"pd  iP (@A"\@"pd(=񽿹x[淾oW]*oOߑط|Aw*ٟlk ='}k ,399y&J JO|yT}1tbpiW)ٹySnn'}BCCCoj|I1EhkiinXg۶::5ZΜXk[kgikk~^all,FGB@}'@T5Na(Ba5qg>ƒ6-..&}G~DΞD# 4777==#QbZrBKvבLD6Q %;7$;v4?p /a_ "&''O|Aygg#:b5paj$R I\4 @Pmm]H"qdko?k-TAB =11!Ҽm}]]-ccY ht3r[+Q>q+m@ JDb׮ߥ<%}7bB鞞nў}=Ϫ}gO*'333JO@(PR>PK*Hm.A(PhbbSLL^Yy)q3},-  ]mm4 7'P ()+$n#Dk7U&sEP(wo]}R ӳoadzJz@ Jlre%q};7k7%?ܒm(tHheHTK?-{ѶVVVP % /^{mqǎ׋/N?Dg7'6Pڷ}yݵofK~~oii8qHg'u(=@P(tt&n#s]~R{B̴NP!#ߞR @ok M]ew_[U5(@Pړgᛛ;~/_N :tu[eKZZ 1?y S]OojINW@(PYYYmB8зgO'PݕO~r81erHť[ vGҷ(PXBsARᎎGx"Lc퉰?kjTUHHL(Py"m K $#cmd^dDj@}}r=b۷7f+(P8u8l>+ΐᦦmӟyv4NOqjg4[n%gj( TcH-?ǎ]T0Qeg&V2::o\D+5?h/N6J](t?hƑ#7@phyd۶-١S|_'(ЯyߑrwU*s߶ # 'FṤ253@SU=[o[K77{"(PmY0K\]q(,dzvv+WVnݸp``СoT @Qghm^)T 41qɶFу:]#-[(4pLضm5P Rn|/#B"!ւ[6h}pMO ڈ_o+IUj+ϩ^}yU 9ȿfC@9 b:a̕Ô;pH*Ŧ#g_w6tO%t` 6B[ҰHB[εwḪԴmmc\>pU|׳KZ 74;--Z( E~.'@iު]c!BG,u+ e( $P'^s=yDh۶-b*FA3Ցe=*<-R.6-#I}\mo6Q2#fˆɉ{7aZSu +{"+:$-˫m+o~pͺTwg!+E.)]oGɆ_X Tcvh|j(P`x */HV+WVxѣI߫@yVյ!1b5?lJ`E-kIHCas$f%:;p1SNMLiDMI^wdUHފ~6&gTE<Yۗܚfy2YfErMd哊Aɶm{ァ 䪈X6|"LCi?;vl9R $#ÏMx-[T8< FRB5zW q7s3.$_ڋ>_m{t*/]2@$I ްځ}n(ԔIBKK3lF@b8eFvMN wt4mrl9y $#.',ilh6hss/H/}X +t{C{}}tϚy16p(FR |(T7 Yǖ@Gi;a XZ@֭65#cǏLEʭ-!n VS++/W\J 8҈;DR\ ]."/;]3<1˷HWN< f8 LanսiGGXowK۩D(m%\[;6uK/ʹ%}"YTlj4I"!P!cg !h:!K>Ff ԯyؼphWTA MFyZr,nr;$޽yͿwtȆؔڡvh5QkXhAӡ@5 2ǏOnnMk߅؛ ʊMMM122}Ȁ>%.d#c\;.b\cn(\hՙic&nǞ@wu7r/29$B~rG%^y[xWTPGE]4]a<:XZM9P#9VӺP0&Gy2qI$7{Ԯ]sss1ނ .My'6<]v [[Pv[+o-dr끺l:u't^9m_>K\NzڵkBH6[_\p uRF57(xW wRf^y&<,5jJhs0z353T?( WncrmwUr꥛ {{=6:H.@j@"f.Z[Ìok뚜{eZ|pFCJdE荵 $} ]Խ$)ԑdHXU\vmddX,r9Ml^Ȝ*vGۑm(kyTIVV, Y j̥reR.*QfzRز Qر \طE,|UG>=l qv/۷CܬKۜ]> Y;ڬvYF[CLcM+\{aXQ 'ߧdC\(}1g\,SZ1~)P"9: -j ѩY@(P ۵qHg/d.(K/fN戞/bppP@4c#hfCB>mXq Ǔr+XN,߻R@" cvv39ԹU M<… |,w SӧeVIm߭rg4lQkݻwW+ Ȣ=>_GCz&b@(P HըhMS*eADG{{o4AGTtl sOa6jHX:*Z ՀGk@\ dt͔&@=1ވ .2]%TU~izDm9r?ȣOáÁ"*ڴ}kr7F"Fջܒwos֍]tS_<oo}:gT){(45S wO"';ܫTtt[&V {ݯ@PMdncF$6R$!֧NqprS{2Kv) e(R ڦ.[Kߺ QӬg ]PCó5996{Ul(PtF5ҷǎ]pV@ZcGX<966 IH?'OA8LiS#sV1UPĮ@V/1o|M[5C,U)[&꥛~EWmE wjѳNNE pl̳tC áu8HT,WcG }3Bw/$+NYBW(@ \ {}:HB.tA d<]em@iHR( .!"0Z◢[Ί`vsU 2c+YɿXTbu@wy]Ν5`S!r@x]\Jt[lGɆ>/ʶOP;~doe ޅ+-/7 W,ə <)j]SUߚh ȿH_Jb{qٳg_y@0!}}G{ >&c*7Ft͇ﺏeYĦ"^ЌI% dcmOKk5䣾dgw}FcLtuiRQ2)~Y(}``СokyLQWR=qHmDW wZf,=7ru+ K7)Pxb \)Z_WGbU VΟ_ر)CC;%(ʉ{⦑ڨZd%bW jN,viYX*)??;1:?gGOOOl쪞{;N}|_y%Y'V1e*5Ǖ(!w fU (<o7k_YP\ t=/ J sDOHJc=qHm@IL[cxr4Қdڎ[HZpeFesk~fsGW \z5d$Jf M_5zK77\#U@ eW_El!'tvz[)cm ##Be*/[٫HJW}ӁTUl.y},nsAW@iS uWcLBگ10}BsWxLW\ GMr~%L^] 2~R#&X)6Q TX[H,eتuvg֑5$D u44_?(@n..Bz7u y$kg>+iYJN+\cǏ}k!WUW%VFʃD<F1qDkE~!YeSK~C9W'|j(PWRk@Rg||YF GdzGAmܓD*QIg._ I-H oߣo5/iHt%puw} lD*ᶦ-R➥J @يD@cb/ɪf;m d5V*NU x/G9WG{ Sg]x(u.ZX_8L\}4utqH9I)(&g:5MHT4wdKkJGrNҔU{l \5 t]na'Aqy6θ^_<@A#r@??scW S)t;T@-_q)P{{xkk뚜L$,臍]&sl]gٵ2D:T<)ser;:7WOP+Й3gyL t7zkMP>YGXY=Q,{!IP} R]vxEW uv#v@e}ȉD(ЪTI.rɕ `~)*J<B#r@O?=cLk̪D4eY k6F {$}BRKڻۺ,'XVkmӧ,"*vY )r  մL M4$5_pP eCM%iM9Vr)s 2eg9W $oO|?N`{f8@ZRӽ$P+d[[WD:1R9o_XXXO"ٶ(#kNJV^I L|=>n)yx8tv-z3 S -iqHުSSGjmA3HnM#Wt2W- ˽TQ"BWםu9]V|T>'.^\ںuf':i@P2_ CÓKс:(:8ǒ96G1V*ܾݯ-/46) Yڤ9X%JaRKEH&Qz5 w_3 P,sP'3LõSĉ_{m '}"@ iFC d]]ܚoC%eHG~zf j; СYlh(fbdrDR(aG[HȒ 4::ﺐV2>DNmvX$P @RT[γ*3@eEєo1䭄 vO]fҲ68ȭiÓ(P`hG,sja١'@yܰֆJ8 ~ccBw,( D@)+LM"[~Ϳy.kG{@=c(k-䉰Z"]sTH-/ќlk>GQlp,*z饙ݻ*y"PG ꥛(?m~,۶KC*\߈ȫu{i?]zk{Eįg[8  q RMUiXltw%BH[8qbJ 5#^ b+;Ο__E@(>X&%/|;閥tj/[RÇJ)F䭅f+H|2Q %K-vn{饙O~cI߇APR1/e9tt4 K4ffWr75}J>ř3g+\JO@(Py0qGܹ>@"˗UZZ~B[CFccs$5 1SKjQ) r>/ xy+_9=JT5QR3ޡ {AT;@J133j$q H¶mD-[p4Lu❰ JOgSr/jLJ%U X!|Z u"H4fa/9X E]*P- :{"pEK.@A"\@QB""pEAS@ H  7D""pM@"\@H@"@.PpS@$ P (P;iiiYJ@(A ("bQP($}!SP (PDP H  "pEdA"\@A YP (PDP H  "pEdA"\@A YP (PDP H  "pEdA"\@A YůxA( ($ _&oA ȯ@tY!KB @Q>装@8P !(2իWggg$(dCCP !(r 2 Q@ @CP !(dF(@QVVVWlaa! L@A @Q>装/2 2 Y  9155U (A+Pwwٳgl0 á! *UJjoo:*Q۷o_p T|٤/2Ɇ $tc5,`84Dϋ%d?@: z:L a׮]GkyaՃ2 0@FA (r 9Ԉ2ʊ-,,$}!IP !(2G}@&A 0@F! Q@ @CP ( Q@ 0@Fa84D@A ,//_zuvv6 L@Fa84D@A @Q Q@ @r 9@FajD eeeE~$(r 壏>ZXXXZZJB @Q Q@ (@CP !(d(@!_y啳k wtt]gnn. ̀@xwTx^~姟~ĉv||裯}k 4(dMp@Q4D @|ˣw&Z[?aV_nkP Q2@>X :|Dlu=QނP Ԓr (\?s1>>}W-.d ) =Ndl)Pc#v  dN4xX>"(P,=b(@ɨxX>(PtٿpÚ(@jɮxX>(PhmٻGǏ"Vˇ "< % TaP@'_qo@YM@>BrN(W :SW 䜴)Ѓ6%x[2@(@I ~BnzAP 6+P2@(@A /wRaSTRQk@R Tmn߾g)wDTkW޽e-_v=qbJ9DіePVX,-//'}! ){K|üVÆ""'QO"Q Oz}žh\< ZJ)y)Iamo5)Q-Qr1"]TelhvHFOT`ٱzR9DO!k_B3L(P K|7*yl]Tn;:T) ]ܳ*ɒ_@5C"Qtx&TҩSw䨽{z{x'ٖ+q[ ZHi ʩ\l0 [bS՞*PotS]K(..~qBcrR6@ ά~+?6:f\(PP4dJvi"ux;ڀrD(@j WrH'j %lx[t߾n`7 $@+b(PtR@OjAShy+8[[qU \ -U SeWĉ) [Tcu1 Y]UeCXU 52tYyl T*٠@vQ2!O(n^ts0#{mEx]zL{mU#]2KccwMDly(.[Ncj/eP PB(Pa}1wS3K7Zq@1# Ҏ/+E'ArM d#qA((httFꍖ09v 7R#Z|('TTLZXZM6,X}&{ݹ)mS^7;*ORk?*۫V@ yQR.e||Uj T<,Á<눡@TUNS(Po҅4t@(@2bAnj0 TU[-gQ J(=(@(@A  HZ2::j {]ߢ@BrΆ K]VC'҉ˣ@AP ]J=//ZJ۴VQ@(@Ή@4j坝V(nt #H ٱ$BZǺ'BB@9' WK ɶʉxn:_7ǎ]PnFHH}9J V(\OE@9'f{@Z(m*󶎪\(PyP  V ]8ބS w5 M5Xu/Y@(@ @<6\GRĈ6@:@h||Y*ΏG<>BrN ⡡c~JG;d-M $Bڈ jՁ}(PDP  l@: {&ktt^6'vPQ%dMڈرlXڀ"iG %*hCP  ľ@F5 _ƴ(PtP  Į@ojB(Pz@P SeRłt ʟaGj V'( sP|@9'( sP|@9'( sP|@9'( sP|@9硇{؂Awb=233Wj撾E`vv6[ b~~$ݻwKF\[#wdËY^^A^#S,b "ZtEuϞ=$!ߏݰAְFwww ;b$We322ˍ'(Ѕ 2sHN9]}9Me?V6{qs;i.#^=P26e+j'Wy v}Is))pkZC(%jzT.,0svǯ@r.iJYcyyyu=c`,RM5Z~ Ѵ^W{7͌N64a555*κ?ֺ-~W tJֈڋ&^}cݶl(vt=ƪcD>Wfo+6AկB쵞WҮ(X gWݚ~򋍙:nfE='{2GV5bqnwu@RqEõK(.\E(P_y:dCGFm#̿ rr{vd۟ F\Y]sW #Ljj;zaVʟ+d$X,z}> stream x]Yo~7%Qv;$X`I0?[EZӋ xt⺗vOqo7ЇCGԽuJ_ e 9՟42OsFTZ6Lധ<Üe#w04teHN#}2U9@/g>jIsawSQnʍ@)rP (7LC4Du;!M?mO fݤ~?/V8N( kna>NRCj e̬>],,t]@K ]57@ w. kni],5t]WetTе^st2'\aӪ;bg\玺ZkwS7cEኧ+!)Ҧ8ϘX(Ӫ442 {\đ4E{)><*ta\!81?V'.0N~.%[9W>{WpVW):=3S VO:EgHq +a (7 V=d7JoYxg gM4\9׊7 .PVΌ02HDS>@#4d5aUI VB"_0Q&UI(Ӗo#x:BL#:h 6S1 aag;r 6Ld`(/QP\n?Yȫ} τyۆ{8zZ!ξNg´<Д6Șrӱ?nCě$i0':Bhx$y;|A )$J]e4&;5QFV8O9*-J #DHy~4Pa/k>v+ & f̈ 6Nb 搔6ym|6*NцрUO" 6̈ȮMfb(>1+ x_'qP#H<2HD YdRWPt,s[IQƕxw/у0"m7E |hܧ%fBf(Y{`J'A#Ch%j@adOGAL䆫_$t!XBRZ4ɨ@qx3YRQ1Ey)sT7S$[9sԧHy'3*={E8HжT۸u)< q)h\mϫgbp&.W(ooܑ_2C4BqY?a%BUI5cQ?޵Knqbfv#"`Pr>pJ 5͉[HJX[@lboaټ;||i{|/Qk;w 9`-~`ҧ-U,Ώ(.83Ld0%UzI` "R К#_D{@g4jTð-j4mTls!(oզL`dxP`4SXmihp B"$npSUEZc%dϧn-ޙziTrD}IBPeύTf踽Ղ]hz^H "E LZS]|)ڀ,P/^ثjT3g5C" M`݁KF'R lA5v1&ӝ:C 3Y8/p$6[4)7WR.cG{2sХ-n돈K2,CRy'p.KԱ(=@"yTE6{U7BTiUA)F49k)0Y{z{f"GEڰPjh-Jq\tKQ"w/&ŷԹUDN\k2:Pʴ&@VDfR-vH}wg$爌V:,.`:ucNMӤr+?زdywWCpܮNt#J,D!ƿxAHq'4ˊOڪ)0 qNd gh]endstream endobj 63 0 obj 2877 endobj 65 0 obj << /Length 66 0 R /Filter /FlateDecode >> stream x][o ~=kIIRqE9G)9-df[HwuOU]>3vُϟV7տU?UmwߚX~i8L/x~zO鷧cLJ[vZ~~T^XU||0fU=%wdO]xr_ #`z=_ WpudWX-ԗ+D>Eca]]j)L8-z(7܀3@(+(7LS[=-ۦ]?AH[]n$ l',¾㏿U[}Z?)3taap|tu],.kgqaaе|t l$X8t-9]nzQ{'aaе|tv'`еxt5m=,.]g@W[jIFS.JWԯ+湃7d2pNϤ ӛmlS/tzk]hW:{4[飏ʵ.ӥ,ͦaBp| ~Fǟ+R̈́Ҿ/0]5F П+CX BÆ`JWi omxm !|T4M.ǽs~qw/﯏k%Ž +MX)pFqo>ֲҽ,! [kYœ3[C2o֑fs Lj8D B,2'0 T  } :,"kzx>l <+yL 4 6`{i8ŚѺ 9X[a`C=Cҷ#+3޿ƽh!zְ uYFωyĦSB=Cv x`BilyO9^!$OHuBRtTuz+򞽸 ԃ+*̣ eu,< .4DO\aA儾f߾EL<44$y$+Lc8*STnHF7!}$`I)S|C""/: PD_%Y:+f֞A0!)*B.2"xa +xD؛o|wLq&̆P|H*b %;{Yڎ\+5%&bu;؝Mx̥:sv-1Y^X^,x5 puɏbjM_7HgT +Ih<[8N=̆1>zʊadpl9 q=DH;;9N:ٲ^tmG\LhOua~Qqg~!l)3S55ƿ&qH"kYLpn'vD [ ՁBx4a<-Ib58ve9 @&N~S1&6Zdi[#+G憛cKVDGS)UJ*X rkrO 42 .gm\+An cjܢE^S~ԱN=u,O3q*TL_TPIQz%,i #pC/Ѡj_dS$4 eGvF%)M;Ʉ/ˎ FT|F[INYgfH0oD5 6PUpjsfE2N MeSÉTs~'K$ LH2NE#xV%HFl:,ٞ /rPA9TcYU($ rЯCɦ$ӮT 0fIbB`AZ%E%KQX %( @w^{&;# CPAU6X0Ԧ@(>"eFyL}4s!ckHp,RU ӹo .*~[TV~dtFXZ^+5"ڃn!QU6:=0 :A*f_͂5(ɹ<, "*C2GPJ"@X+ 7kF]yW[̅hm +w4Zq7 · y㙱H-{kl>*TDц_])FwITh|[(ۯ6` >R֨IY˄ɘ0J JU@ y# Wa8 KXdJӑ+lVW[4Ӥ6}j9-5LEj+Pq篍&쯤z5S =;8kcgu[5PBdai)Ou!^Mp%Z׊3)f6h,Y&˓[) YapYQLpjA ]U_ |*عz9\P1 Σ"1D&5)@2jWR6jʬF@vuh3e ۥx0|c hY(-˛!,0yRᩲ  ՁBw_nz{  9\\vWbCbUͣi͙/}4?tY%MT ܽRq73{>T#Fʂ5D!MgE~F0#&ļ §eZϔpZͪĖ51 R뜉 9!@eD )VFʴ+/iA|,|x#09|h,) *LB7^ɍڈ`&Y ޮg,፞9Ut$%Ɋ-u2mCy&ױoӴ&&dUYט.n0)xR+r}e}ř#\X؍a1M6m^!Ŏ5 ى)R˂s»mH`P4o~T}k%DM1(7VSY;-${Aէjנ ,٥0GP#GfBP=J0SgjA!5pp@[:v0%`tٗFəJE,KX׸Ցz9 Ao Mvg5f >uz;m940ta!`EJJ MǠU*ҖUc'UU{)x2orM$QnݫQ))54Gٕeb4a,3IU4!eU ҧ%vʱ=M `_L]L0dvvNk̊thj%{[qPӚf~&7-u FYߍ-gO(Z49Wk:CaYR\w I1)W.Љ*> ($?){{},U :C1LБЈ[3kȡA&A:)OJ3'ղ6K1GGc!Yx=8@8Zn}|Cxf\SKz.ad׸ug*5׭M^$ot3= K]kY^wnuqӚ(B:$A?p{`TA ϼ Gasg[wTom-N~Mw['`~|j`N] ai6]='KL'rx[[ؘNmӨRѡuIᛛ "!aBcdLP3{z&E ϓq=K D%zL4aJ'dflɳR?Wa@cqZ'(g.7 - )kendstream endobj 66 0 obj 4159 endobj 68 0 obj << /Length 69 0 R /Filter /FlateDecode >> stream x]ێܸ}7sXytb  /Tؚa`lkD,u9ua]÷~_L;/?|U]ߚTa<Ncx㇪O_KoߞN-˿>~x񃭻S7w??铩L_}gsmP}̿_\[|\SVwy4Ń4I7[Xy>_'\;:+7*Vn(r#+7X VnPTxN]mvkٵ s/ i:>Sl QG *`ML_o ꪯ W.OvBcahnsCwB.i,Vm rcaȵnszK\X8r@fPw'krMv'‘kr]=,A.q, m WWU \ғ>ՏYWWm7pm [tlS t2jv>im2Olq=9'kgxu֒qv7u;pLB ݇/T63_P_qAam m05'gtVΈg.1};xU݁Qjuw_3k頡ЏśZ~'O&C6p0,V[gjf6r^s`jA,!hISBjf cqO3aE83d}?<10?l1Lj#~X[hC\2<S︙0B '.3UMhp4zwR<C`H hĮGW6Y~B|9$k72 ;H~zeb @ޖ&:aWNq ZbkZYvChabSqVY8%#Ъ湯pr>Rv22aU 1'ZelÂnA K= 5cO +(PpgFC  MPg#%;'dzߠE=#0\ }X/F9"PT-x6+lv~s+`Q&0QyЀD~̵UOl?ؠۙIAp&NaS+ V\ #)8r 1ϯGP'; U^SB g=sO\f6;fy/A>U`*># @tYgmhtUBWGJs;- @Eop!5}Bca x V}|-tdWu*C0X$cqX yZ-b9[Ihtk<}Ԋ%|Ē8 Q 7 ^N嗍-_!<=7M+{7xM,k~xF.׵U_4\Vɒ)Cc D ֱ[.n>$})ONt+%E|]a Qu$. (ԑ0]YHm&7N<ۼ@-]lD?ey^%V*jg 26:tķaEbY<:VgXzIE]RT<"NUÉ@#!2QrM3((h))y Ux M| l6wuжjD,ހkmGN&E.RTߐlYUI :4V)PRm#QKiBnZݮ ƆVn[7QCU((KPDfl0IM Eb ;/OkphFp`H&E^ P8VnBdwĦٛQ>J(ӢtyAH#zWw|CDDfmMB𪚇y:aE O}D}Rց%\BɁpA϶&,+ i6mB9 0d?j: ¯KG3^ U;_oeiQ%35" şƱFv`yI$B @43TJK\ix9"lz:{ f9xlP!evac ^z>0K.U55â"a*>ǎ W,64ol _7(H]C;oKڱ=Er˨~upebV^}`e\K1R4$p[}BIU!S.T<7LJDʸL)RJnN"F-*S%qEij%hAM4 IH (<;&GF<%R3(%0( 51D"" Bxi &U~Jˀ0&Gfa$uj1U%bgZmTtflQ{>I*?Y!b Ĕ~҃LB̶5e?0HA"5uaW5Djkϲ>D?}5~/~ߛ98`Ƕ eMVZQo NqffIY@$O޷5.1+*75/zX_KɏmPzݹMOsB) ɬoE8b4uWQx,PWEg#Bw}1 <")ΌT\5QBS-Y]33xOErP^%UB.o6 {WXII Yh:X(Rٷ X4jYn^I g)núkf4\ AhE!TDw{7}+kXJyv~K %h[7h4f1P*Y)؇Vdelg;@AEB5c"8v35渦R^=y1wfoyͪtwb%׋ѳMzrpt0fQB<{gW@Sz\#aKl먟2l7js}:QuZfnLP:-ؘ%:ijclChnxZ҉y4We{e3 @qg4&rH7QӤkI@J;uYLSOޔ%Zpn0Xnyr2endstream endobj 69 0 obj 4792 endobj 71 0 obj << /Length 72 0 R /Filter /FlateDecode >> stream x[n+'wR}e*%vR2m>@iss^ >㸾"`fHus"Vn/onŋL[B;^ Ld¥݃ys#ħ#Zov_=mnc`ӯӃjOR}'(R0/魡%ÒZZ+&Yh͌d"@VN;=jZ'2!R3G=Pǃ]ş9ZKhuhΞMs4@s5@s4g;4Ϭ(_hlH-f=޾ld!@ &IV#Q<ǨfK)z5)K%%AWWK\ u WS \KKdK,54kWWS \KKcv%pd\fdTZ\QTq$S)je:Η_׭^/hV pkMt>~Uā:8I튥Ƌ=1^pFH9H\<ܫ tNba.nSpw^ &N>o L|Z:,Du,D&H4#t=X䲂#chwցT;ų69A YfufknzW^N_ݢ :TAJ%m#I(9VwEs@C6&aBeY3ι+|fz euޅsxV~FSОV.zQQ6! ę#8@),:j؂Bi o5*Az"lIi5qBR IO3ƴT:HWEwT!H6J W&;- xtZSGBMB] :ؕ#!鿳>w/_ٷ)aXiWP4.X'!dlB\Xk|\ۇ;=:f^Awr4zbyJ\ ]8}c@?7h_==3v/X>T`$IQ"s[qD__{rJioR=R)%GU2ʻj_OwՈRTtv-zXs8`sLS#Bqz(λ"{&'M1o=" B/4Lv(;W3m;&+Y+ƏE_j;qd{ۥ%X^6-gſqkendstream endobj 72 0 obj 1720 endobj 100 0 obj << /Length 101 0 R /Filter /FlateDecode /Length1 1376 >> stream xkAƟݤI+j$'-HH=J@ I#& .W&ē yk{$)@ev~33 B˧>Ŕd%ӧ#>#>Ŏd%ӧxXmG_TE>8  B [P*Z|g#]Si0 sǍը0JמccX|\ѫ__q0Q"}ٷJ-ۯv] Gˆjv9ϕmEzwܘ+O endstream endobj 101 0 obj 565 endobj 102 0 obj << /Type /FontDescriptor /FontName /DAAAAA+OpenSymbol /Flags 4 /FontBBox [ -179 -312 1083 917 ] /ItalicAngle 0 /Ascent 916 /Descent 312 /CapHeight 916 /StemV 80 /FontFile2 100 0 R >> endobj 103 0 obj << /Length 230 /Filter /FlateDecode >> stream x]j 0a1I!P,Ҵ`t (sטݥ};Ծ"w#8 B#) 3~̛tB%[SK@}$`rxehשۣn 'M7.zBPY?6.$A>׀PAw3A4uQ4PύHMyWE|3gœ**[ G[!{o endstream endobj 104 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DAAAAA+OpenSymbol /FirstChar 0 /LastChar 1 /Widths [ 500 555 ] /FontDescriptor 102 0 R /ToUnicode 103 0 R >> endobj 105 0 obj << /Length 106 0 R /Filter /FlateDecode /Length1 38168 >> stream xܼy`U8<3g?w߷,f! !,} I,*i**VP+Zվ}*ZiT=3$m[ޜ3̙33>scE#2C% m=k3B+kǗ Mm l<=)) .\~!676,x}V.67C䟆|fJ] ~TguA~咆m_^ ymiÒƱgwB~BEem˖mc:lsC PK?fE'/&j;.Դt-ˏ (,*8$V:lH9G8Rص-q$g4%R9F\CCpDcjyMC;e"/bDѝħcH5oCK0? P:jDrHF CS5w%t/9aFB{h8x)q;i=D JCh+&I|Q-)z'1(nD]8 }QfRǍa^3R mE؉' $!P.}KxoN\xAѯ`{+%^Ft y0HÉg"@g ^G@$4z%NCd-Y˽ au0h9C/nΠ8<ߍIdy{;̽cIweQߠ7Ixn;C $xg&&$D~Dס:O!t7='t܌Ɲ ($L$mdyͽė# ;)~=8-ЎFՀ[*C//~ax6zY7{/og0Kľd^[IVrz7%'p`{亸SǼ D~6$ OO / q&~"*m'Oqow@I7&~? k`agX w95x<ǍV G30`Q2L% l ȏa wi #q. r9Rrn-0{7{{;}uê4~??VNXGoeA1E,ODi4I"-܆Sp>\/-Hx0'n~T#< 0P%u06 .r*ſDD$Ϡ r =~TxS sx:L* C#}5߈p7oexzxxH[ X|E*oBSP-O&Àwh4pG@%/@NWA ffzw':%$Zѯop7*Я > I,<[X)l 7Ԭ ߢWX BI- x6c&ˠ[{_8rzst͇eh<j?+x>% @j磿xYZ'aLDl\  h+4-IQT/w&8? ZQ** *OH !- cPW]a6G4>BizT Z>4V2h`qQဂh~^nNvVf$#qj1TEDF"Zgv}'3fG_A}EWY5:lNM=YS韛ZPhh]xY*Ruv3x<3p8 /hUZ'FuVl: ;`RGFF6  N_]@| H:QHA'5aAɳFUxȼNi*h$S)n:tv;h^}Լ Y\C-~:}7_BΑ6ⶎh4u&Y齶ڀwIVujN@bT z#ķC Ur~Q~֩DFD. nDSքm6+ EjR)kt-p$bXm`1UP͔>b:X Nm#9 !h!P >\+ҩjJB=mD?(_" R:#5x wFD0kYt@.28f IۆڡEp.]:g%:hm'ON>LO>{>|9N9fF51fjfYڨnk]K>̀:]#gq!b@$ı@UYN> DF :9 JVN{V ;]葉yKfshWμ٤f[իUں:UoЕX?/#[}dֶQ ڕ8qGZD3 JЈyo:{q;xo:H0Y?@&(W7eN7L(#垕;eD[PJJcD薢A1ћ..ipc4M&'O* 90R"M t=!)nƓQSү{rNrH4NZ-m&"tD{?bՕ;;va®=po}S= ( W$4Q:Z h_#h}1ZoW( m /0 ,˙eˁg%LrH1ȝk}k0 ;vb ڷt)/Fw3dq+<:=n *Ʋs#ct(kۼG{¹l܊S="H~9~ܶw~M~:Rs/?ҙ& 焷 G;..+/c*$)rl[;7{667͒h>qA'(X`th|iCV 7O$/}KC&xmՇHHvUFˣi2þþӱw]GEd1aѥ,b6i7JY;CM ՇBš!> |8p212[$WVT+]af8hn% \k׮[N?ֺS?~a% wb6 Ֆ߉kfssa%waԍ;fg硴M@069cr䥌"|{F{䖌["sĎH%Qk,U##,52Xf<\_y'qBj3\3dKiR~O QžO5/faE s.jAy].Cm!Q 8k8[VD4j9KWZM&ourQ1AF,OhOڳ8ǿڊKwҥ;HƝX!Oxb'4[ ?gjm-5dUw???u}$x9y4Y-sUMFۖ}Σ^J?;f-В@Z6GrH8&CUC=Tc|VGO´QDPv_u㻣@FD& ( "LHU|%߬'ܼIM^ͧaoMvvi-8XY(~g#/ڭf::v" R!5sDw&/R=n.w Ozu-3'S9Ȍm6y?)[#+2 6g`ݤؤL|v&A|D.3ΦJ}Eqrp }J嘎|3} wqaW'}s-B.<8ʃ9J@#z1.&H%WE`MU{T'=n>"1w;gEyEyyyz0%V y)e")xpRRsmlC]Z \Uۂ(kM)8gZǀ0BS*iq@}8\perĊr0PSsU{8 TT:0uX_ʾo@p눶2D]ap7ݽXXGٽZqiGq#ׯx$75~.5gÛw?9misSKb;T?8z=A ́5sȞWW?!SSteٍǐb:1 Qh5WwKWK-ţRcu%5|?}6[n{tֆs3xJ/|u#G.{7c@ ^GK.k,]<εWUOHѝꐬl2Ap1 plf7cՂqYe%U{]?#8ä_?9|hx$!6ٻl:'n!fE56:ZksRp7sJfƺ :}\=$'} APbDY6I)R*sz9{*{Ϻzzv)yv.vV!5eSk:M Nf夕o8]驠U9Jl=.∔f9M'M9)9~xM&[p>vk4%~~Qoy`  "hnכ"zBcRfCn ,ޘ=ǃC21SXE6#⫢{v9hG czF.˙$:E15S;SNSS p ҡMSV SV `#d1Y,tQt)m`Zj{$݌@{^c]U DI^x}s}ƁCzʀhﮣ2$̝e#+'+E T^L<rZLR7`9=QЎsz86.S-\(JI Dwo>UÅ⟙7ѺG_yݤ֚ieͪnTDR[Ż\]}pդdi)G 9ȟS1lƠF@=2O3QB#z!ueB+I"+:e/(!l/P, l# gl~[Үk;e$R:.sAQ/;' `"BKh=H`}Zph~ǿ'+~ =!X$/$| KP8g|9B4`bk"td x Ҁx*Ԝ&gx&]]ǭ>p֍v#.1gg WZ⻈U#|0Ar]3 1_kjTSkP惈N,Igg& !n,fv0[x>Hq,ETBmC0X>#+Ƣ#% x=>9,Z³./%>x.'t ^thקC>,ʧg ڵҙ2}Ӄ:6 L1y0aQ5jQdoO]33Yi˅r\Nf3쀩ۍ|p r2Y t*bt.,z?zWZlR _׃Sio};^;"I4u="[84CWn$? w;4pLV zInk|'€z{Qob;tuעT:8ˎ{K1)>GJdE& 34ţpeER,I 0h&*,CܬYs5O5hY`Y|eeeU̢ETEBf҅у@3o,W[NZNA9dDᣈgXDwڥ=ҋ'md!$`=cVζJЃlcn-f+`j`<fE0H( G ؁ڞ'??z4~>,ι _#i˸ ڐ8' }Fe{w%ͽmS\s%ϝ]!P6 |>ϗG,Av*s4 x")vz "o7<`PV׿ڻr? 9)ކg=7tVwl,MwPh<&]I. (恪d,5"65KEbAns)6*.TM9]dj@ K`j-Tb~Oظ+/Jh\pR_At`tj% h/ӑeZQN`C{;lbcwIHO%M=6: 0aIlaa'ڍ܇Ss¢_zٕ#oSW8 즮]x}ᓚ-*t<->g^K[)8͖-WKH d$7V͚7\m\aܒK&༹ǧ~l1-9V3b)Ć^9?d2'SxUaX2xB٘+V-&VuuSLLGݤඁx .]E%agxV˼BI3mt÷5bzJrzI2$[Zl-yMі"}kn1Ұm% Ԑ_|y .XZ岬=0~tms޵!w`>؄?O,8~C䱽 zP]o-͔+{#GUE'{jk 6}ummu-մZYXYؘ**^bYZWX7X*X5mmfrݸ޽Mn)+Sxl9bۡbxR<%⦶"@kaO8 G0F6WӓW+$qc";H~o^t(w:T/8&97n}ݔ!W>UMȜ5bP@#㓉z.$ ՝dy*)@)N=, ;9g>{vۻ2vS]r1•tZ54iˋ;y:>/}I\n) h?c3ɲj6y8T3k&0uoS`r) bhiR-f֖Ix t-XYY\eҝ&&UQV鮔Oɍ,L/hW+ՉEnI'#X̥kp8`~e? ].0aTc,% g9!0!J::8. ?s~5'Zop#䮌8pj&9@DJB^;VTrQ1b*1qKd;sрB bRysyVl\>G9恨LVFha4VYV*&$U7C~?+U>SϚF_KEky5oJhhφҕxT3>C4'¡UtK,c=WScL:͙Dp% .:ݙZZll+1*^Y83X$(K fEJ+QlE$K .qzX+q0 {`ǟ$ЏQe](x1d!xzMf|項.Kiʹ<\2~:CŽҗ0x'vv {Oy0Eo'OL*+5w+GGCoOON呡)#SgOŠrŲ~d`dPg27oNٝ?e중`-u` SIYRlKvguvz!" nI7Yr.A9t"vھz9iNQkb{5 ~QMz`D9X[l/d3P DB.LAcV3y (8RJM2dH- aGxZLJY3J 7_αѡ',ޥKG{^@74.A'o|C_m-fM&.[6YTI҆v搑ꏦB)DEV|򼢪.ەt5B xM)RiQY"GzQF+{Wwis#v* ;۔;Dej$JJCR᫔uuv7-u%eP2 @L:#h3 `b@4l9Dp a%YN $]Z'cu /4t!#DO"z J6c@QwG+{O{O{EoF~OthSMk*PL^$W>ha?U,I8q}M5k4ck4E rbG?ᯱ" ^!r4;p87C*'5=!-+l#Q +n#D>zuU` @}lEɭëv/4잘?MziIl瞏iۼn2pҪ-{>I`~ Vu8욣_dE?x:.[]ى[m&<ה0E*b-yfCiVJy"1'ڋsA7-VW6qE{'Kw|R' /U\ $CF({tUPuƍŽw+V/y5]n>{ S3_O1nl_TMeq = ^N /G {@C*X] c'O[ƅcvQ7bbI&қ2BOQEbv\")Wۻ`,E\y=+g9SbzB.+#9'.GzqMnP;hcxuEI^aD7z]M}jMɳgD"qgC0AVewW924=d[I.Y9ps&+/H|Ȭ3MqOm!?H#<=)sNG?^7G>V-\pnVpnhelCLt[(ndҐщp,ф.1Qwybb!9hNI<DLhGX`2_I~o;9shl̡d1SídžlӭL8Igl!{0\!/=Cz۸@-M*~IӺRVsaniLsO9 ny(r"T&TEk'm]k1HyO"p%Fͳ,҂[:!̫Esd9AOE0 vnvBP*8zXQK6!M,zfibn[gmA݉O:O9SKzvzlڐ>у3 8V" E;٥%*r< n^'NV6CJ2]z:#z('_8r ԢR< Ұ2=yE'ŷpK㋶H_o+0xL, 3LhqÄ`%LAP%3LM?7I PDL&DtE~!d3Xѣ7^0hYѓ5f{)NgLUoHݯcV]/bkK| IG[˩%}19^s++++\67F:R~Y)geQ˓'yciUM9Nઝ]E gqtꕅ I rJ*{)do NI4ZqKr]i̘'};E!*z+  Ve~ҥcQ;q@a mblXjkm vLlpc/\?Y2~{nQM=V;qR 냫jgv,] wmړ?:ӫ^Ó0wĹ=, o (+,dKJY?ׯ5T1' IX#MIhD5='Tx$2]d^"X`"Y}mH!E|p{tH(ޓLҽrEyl򨢃N:HO ch' ޞsxȶ)xzG<#jㅭ+sm_GZ=.-׍{X'WwP.Q-E C 4`~鏤TMtB{6AGhfsih}@Z"GwCُx }̓t'&?+|k&PK0.4| wwߨX~ajQXvۦGڿt ut9;ϸ]vvW&^ . vJ*z9駴ڗW2* E% Y ;*B`ZPF}MαT[2 C݀y, ?kz?m2&md˜f&4OQ\e߀z }v€ ZP}H/5` XxKh}e+hC0`48 t=\K\4` 7m3`+*H@>ج̣1 P^4`y}3Xr]W kK0Xre<0oԀ@F0cC j} f00`X_ ـa}sc0=Qjrs4A37`d5L71KL}MCkPjDM͇TCO5 53xhH /a-&Q7|BGX6{kֿŠ6cn1jLήw`i]y_nG n+k+woy 7(u-6VZ M=(Y0M) M2`]ާ#xF-LH[&I[K^kVc&- .f4+[ͅ>[ڻ7m0?I=^-`}/d)k͠VS^i`;i*I|c-l:mԸIn,YFCis[IoKX .FZ7ZX0*lDPދYJfh[c4v}$tI~_nH$7-3L>]VO;=Bi0l1.Y7޾2I70Lt}PJbq9{wĽ1Zf [φN-v鷐/a tZ5/-h @K 524@r j*F1ɺz~jFQx"R P X(( wJAxV: Y/U&KZ [$F _=-veez%r:cO@}}mIzKˤ"GbeO/d4DʭFoWt^6J?`WvN5t ~n2_᫗ )rCR $crYjV(jL%%=6*-.6̐!oPrEήZ4VF+)؈f[ Kg5mRIag+GWt~/]^*7o+5[nB]0NoOr\{!QOrUAW$4ft>Ʋzm/s -97Aw}eZ]ZlUu^: yuLb:}>]hWWѰbm'Q>>r1/FGf1<Ob\X{k0*_^3]{}{}pښƦړڴFm|PlhkhXҺTk[jhKZ;K  ai ѰTgk[m0˖?]olב)ŒhٖU[[dKD1rh9k)Kιl#֒ iQ",kVI++) hqg@iR|V-PܡN8Kp)~;~(ErDyvͼyo\s;P[1-vE& -2d&QBSa$fdfΘ4ShXSt1|SFœI s%g4Ɣ 5>'pj֜76g5K^ԤJ_F ğ4ĥ4scȹ6fgv)uŐ8ҡMd* D&c INJNQ4̄1>alY815)K1bhV%%i|Ţ`$_Ɛ#eT'y7Q,R&KS0Oh*OL BOl&Ah0Ef*Kyf*=f\}-dzc̜0w:&/$h$1!!;{Ld\sZY=7ЧE=++*+ǐֵQiN(F`ʌnsP!ӘGE$U,RY8db~qM2|LXF71",&͍9%ܨ/n߭ ynG0?M"8 =>;O Q]]؆ k᧏<~c?z0^<qjoYjLf)xk Ecn͕u?جqe=}l6wn6عms`m; vn6عms`mo~bBIYRbQrnZea2߃l[ukWm{~A6۔$.;jbג~iyTnN9Sa#<=h4@7Xf:4-,tAe㉣ESj2Ή),WQduN^iVW]꾧fY?#xp.ȡׅަϫ@-8jM kZo]HX8?sTH'lGcqq6m^ֿluk *h2`"%@_drX>2@d  2@d$"#[ B 1 01 0@ K; İDĀ"&1 b@ĀID 1ЁЁЁ%BBBB]"@ A @%"DDh@h@h@hI&~ @K?~ c *@J*@*@s J䗀Ȋ + +M ]͂ 2.K,/ DX["l l l l%"D<y"D^"p-!}8YWϰ-H56/K_dasIr'ɄOqD:R%(  ;=#jowm流W*]vl2Ey\GoUl?$mlu.:{]K;~rEf)*>GJ\tZ<OceyizZ;Z̓^A!P(R~r : Ż=>}W*_V2z|Ns4irkA[7o;]Rb?v]7ey"R\`CA`; 0# {sYQcJ pQO<5:G$kkWX oZ@@,*q?&~'%Xo=ӶB, #‰T= .%З#+ͶuhEW̊0Yŗ;KbdCJyG9"gEY1-t,NjK_vom2B%O"-"pQ٣x>6zx6xj|~_o<>c}̀Vz2z*&+#~N[^)W|}{((Q{9ɢ#ƢR/ڻ{&ʢ=hnE9_-*l0^TZ]sJvE(]]szɳl6l?jCx0_о_ռwW/z2<=!+PU0c`aa=!3Qɮ p&J$**G!Z_IcdwIZ5jJx&;&;&mBMȎ"&qKU6lDf5}Ga|=JӚyg4 7a+cu숦-Xlix$9F}8oHl5+7&$ϲqIj,"H h:X endstream endobj 106 0 obj 22191 endobj 107 0 obj << /Type /FontDescriptor /FontName /BAAAAA+Arial-BoldMT /Flags 4 /FontBBox [ -627 -376 2000 1011 ] /ItalicAngle 0 /Ascent 905 /Descent 211 /CapHeight 1010 /StemV 80 /FontFile2 105 0 R >> endobj 108 0 obj << /Length 478 /Filter /FlateDecode >> stream x]ˎ0EH=ݑ"tґ&=@ M r"?p/&ѱu E=E#16[OMpbI%ڮ?͵xzgB?ۘiSR/ȥ}k(DsͯQ Nx y A(.Hm uR/!eY~_Y3tn~iStYjE0M Z%01l-a8~%0l >cy(}{GCG׊>}4cpU>@qx>>(W󁶢a1,MѸMvz5}ܡƍjh7hscW} L5Yðcb /g^z endstream endobj 109 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BAAAAA+Arial-BoldMT /FirstChar 0 /LastChar 57 /Widths [ 750 722 722 777 722 610 277 610 666 277 610 556 610 889 556 610 333 556 277 666 389 556 556 277 556 722 666 666 610 722 333 610 610 556 777 556 833 610 333 277 556 556 722 610 777 610 722 556 666 722 277 610 556 556 500 556 556 666 ] /FontDescriptor 107 0 R /ToUnicode 108 0 R >> endobj 110 0 obj << /Length 111 0 R /Filter /FlateDecode /Length1 46040 >> stream xԼy|T8zι{g}dL H7YEPh+;.Hj](nk-mZV33l}_/{==wkf" 5#YN[/z!윾by?v?q^]r,BW^jրI S7# 8g#;!G9`F ߃9 |h:I>}x57D%} F4=<S#҇z?ڍ aM8~2}P9 ӊ~۹TT=E4`‘E t/"A*K.rhs=~kKr653 < O$dy[dxbO@sx y:È$ЃaKÛF2|# SɃ/gK୯D y=v>x |Gb2'rs%+%/o _&~>]^=߃7ۏ)  x~7x;~Sw_ AIBRr-9yQworIEЫ #|\)l 'EMQF;g,S 6vZF `!AoV] 3S<LތO>Buf}Nj%d$3MZGNlpe-Vq[/i,Ҽ|OC5#m3Q6R/4Z#5JwJ&_yqRooJd n%EJG|p:y&x摞n9BAxW|+jh7FkFǸO?>Un4P+|a*B/rK }F t<?raBנ#Ľ?B^F'xp-ICIl(鶚 `i-~@@B<@N@As/)[*'mh` uNEOӳQ7ҫgNߒ-F?`rDF68lDZ} a2ơ@% aGW xo r*5J~ƤIcI/@A$iR0aV}ӻgʓe%ʼnxQ  qMUdIx`T>(6)ڒhjK/FcӠay M-Qh|9-&vZ3-8sOδ2gZ]gb#Z꺕GŢ-ƢmxI>0m`oapA\30ڂZiP@.: 6`ڭRmj¾7.d:  =h⃦h=fҠn-xU-(vI#NAcZ-{Lt.}t[tWym)͈͘6eR 7>Ls;? 7w!n (ݴiCeۘI-\K⃛6 Go$[&[Q&27364͋(Kbs6k njAcW(8(iXAK}(0m`xmjO.<ҭ|af~>06 (6%:= =wCW3Mi׀᪖0"s[M^"čXtӿP@L˶q_NH d4؟t+_FbF6>4p;omm vZLGUȪH6&z=w3i麼)_Ow^נ9}[abL)a/u, LB$ ǎQN:LZ8gI2P%k-FӥuZP?^Ԗ>Ibse7y~ /螶6~Mǀ2ţ Z8Х!b2M N e٭|0MǢ75m֖n*5bkjN[mWsp_` .q',qM4*cGX+D%wo!̎OoÈɹ6Lk#g,F0~XP#xX)fV(~۩o7+BxwN'nKjT EQ>4fts}gb`0?zm'v} tzpAnu+5!WDB^1P"1QLO4N%Gt4NT0}={dq jL&RXavUU>)vz*{]g܉G\ժ~_,|!g~gx®owvoz9զc40%_+u]ȣ"oSRRy r[d sO(cFgwPa,t._=(Wpn0S]0/a]tLY6 L ?mlI6 aÑ4햫(^CH2I=? mU^4;9͑iG ;;9 ^z[d-Q= g? uK5$3-Ie)qUU =eUU-/eL; E ް݆쁢*6TKmRU>ʆ0ʆSmKn@|SlUJk1lu9vU*gvm|>ߗ.;kd6-A`ZpV:vT/9荱+njrK֍0:O0:5(0?:!Q#YC%Md߻l<:O|gw+f]+ƌٜԙۆ<=yևT~p "T$Zya8p6e9QE~LG"$? tpRc`?Y õ%*g閃8%= 4b[Vz5M[ujuuWyn7]S/__wv.벅Ccftut6bXՆfN;U784mfS]NDz6¤"jH^ri9TNl×sB4(C [VT롍ҸZZ#!Y$ sɩ%A~ԉq=7:@u6ݓlI;dݨ k 2_"[K7?~Ni_Zwh|,Rkh\L%I bJCW^]UXtXW^wL>I'ښZpqQS5JBy|I׬[?󛝗4tu A6M_ <~?_΋)+LEGml=Uua)4QiT>I(:nKlF2)G"RR`>ƅp!,trs=a- ϰ«J(85 )x*T~eǨm`Xgt}Qd;p8ԑvz(IQ: G!#LИq a#OFfTm3:OQ8Qxn蠀ɶ2\ K6J5U&Sl񊖏O^^̏^zVn1wm0|_y?YD.KI-as[6Linu&Tߩ< =>=O',*,!j x|m:u[? j^r6!"}IH)Q Y pP9L`#Fyr(mؿbp`|MXj2Yj},[OEd-Rnc{pAc/ Θ27tޝ/!)Hj>̥bR w&|o|wwO_kOqq}6k:;&=wɍz6!o(O;> ] XM ֠"0L0"  ~_irLLLnyb4`v0x^X8 dmMH6?,0 453%064_oZh "׊+l96I[7.S\1l71QDC["od5 Q8 5khpLx . Ӏa ݶbK{>{ɻ0uO*},Jj}/S~{󾙻":v3#D"X4T'js|$1z[ኜ{!xm۹owʍΩvtN5RS𢍠,{R0lSN6z{ϙRSe"i5=&;6_;G/v,/o:qC?{TԊ)ӿ{] :uY ,&92  v=h|*F]!fŤK06">;,c|2C#)(=t%3000:9>:!͐9gDׄoׇ?RT1y1&)TQGcz wRr s,%gЦ},'_f0rMkN8ƖrZzT"ZcqTQOIfX.R+NUnD XKTuf& z<? WnNx/w|{#>=Ǐ1Go8)7u܀_n'5=rΝAwSʆ<eIB!JĆdw3xՉy%M/3I\04 0?椥2ۨ.FX7e NHf4,%C&2 |G;R/2/Kɇ-AI7\ѕ,+j^ޡeCƲyܲx >{Jrɔbq(t๒}KI<Ћ#_d5&P(ߗOUCK' Y moIwFEQZ+;vQNvήems)C&;v*5== C1 *V+*fLC"xA8f3H"-GFWTD#]Em ^l&z$v&Z %c@Of4Q^KZ鸘E3ŠW#"E"雊L~QY[dνTسO$utuyu>H爠 \JVuFqh5񊦢ʪr0E{;Tg6RU@<,"ak>izlͿt3|ޝ\ӹzwy݅/ű !i*W.䊊PG(BXr5T,"v "*'EQhqU0F?pXBG-D'Kqq^"bqHL+;h< Z).\K?E@> Á0'j #I'8z^:\p`PW&"JA*`2Qi^p4j_prcvLn8Yxg?m݃G(w'v\o-][g&wp?w_l?e~cq17zc&,Z} =TmuMfۣgf[g[+U;|QS/,9˄zjE߲ ?f|?#9XHg6Fh>gL3*q0.(=8u=_.\ ,X8prrsӮ_tz +'QUy2EbMy<=QdɞįjX(9 r@M:#⸦hۺi0PN L  @~`Q3@=`:<\7=&> f\fijO[G(L ^Qs@} {TAqYuSe{%l$ƸgfhdhH9X爲4%(KY!~p=I@4.U48cfȬN&$GS֙ ,a m/#n.OpXGCH)BXv *\pII><*3҇0?u֡fܯDqwI4D.Gsݎ[_&uqƭye٢-z[{'}}͑EKg(W]7rȪ2w,R.^=e򣗿@m2izR%׫P _Nƫc³ a2nOxI3go} |w /W'/?Sv{8pP&Ht 㨉 2fgD>Kf,ev%L2Aw[´S*3s,P.Dd.w*>O$N 3H&$fJMb I ǧYkfhJAM& т祭>3}yԴbOgkV<d'ܦ1~wQٺ|23-4Lx." 9cI}ō:սWݔÆMgQC&pB26/,RfdO&z5Byaip~$>{:z/v^\^)&acA U fdt *qyc裑szo:=_Iߢc=O5U#:O4>k:o:Ա=c52 /YKn.`@7J}|/ݷLyLuxV9ԟR6;0ipxcEyB:" ZF1uNe˝l_>È;{$ddzaY6 n`I_\0a̖(MFnn4lЀ'[O? :ol"eQ4eQ<` *in8D8yh57\DAF[ , 9mchQ4SƎ*hZl.}q[4}җ%"l`?`u }]kO˅\m3uCm2[ a-qZ"c&Oj,HD({5KE1\c\*Ţ>ȤO|?\,>H&6*q?F>##Nr̿ck2\<0f%qYi|2c L5F{8*X߂2SBIڣ9Lppjz]Eδ^{R5VK|(zj(J \.2{w'xBIĩG},ctdjGIsQt\˝ui" x=,490B LK ;d;"f:rea(ڲϧmh i#},t= +-4NܻƋKCCk_x ZW%5u&_/ݬocroq|w8hnETEJe*Xi#-#aE 9 qUp㻋y7C<[zvoN5vP.c@edM44`jdo-D \Z1x篶=S?(uϟs˭fo;t˸uwܸ.Tz߼m>6CApK<~7M[F=|s)= ~W؆G[ U\G}`Ab(4-Bk6ٲ2W ]S#y)fw#ӮN+Hu/}l]Z˧QSQv h ]O`K0Z\*٢Y٨rT9J.tfTYgZ ]*XK `Cy?u_͒ Aް,ʂ̉.!DÔeekMq>& zQ_O2l61cP G,#ww1HjN@n|9MWWyqi!$;J.ܹ _x2r1w|( `r+ue*8B7'&TY){ĂIڈ?H7n؝3-|97rGz  >z H B}~K>{$|Ib_u{F}{ep@{u=#X/+QQ!;,ac0K8/GC3nXnk[Wd@f-W` Ӂ`ج3*.N$yLF᧓,LF }Kwn2B2t6B9?GSU#°9<-֥ڹJ}z]+^x/:u;Z6xn;gh\ @y3"/bѦjr|i_`j o/u8^ a'xAeohXluw% TA#]0rG'oU#IVWA_=e:-zt`v|泅g}9"<峂Iskobmp3bSV}uoSBkijɿH}:qh,t)HAlO*XT&B%""afU-@"RQYҨn*^gZ+pF[HA5*yƫVw̺{5ʡ%֢R4D~j$e9X1₶ M+fOX''QE}=,խ(*c:"Ue0REIU8 } e˲f(m8R…OƠDc6p23fh@0/6 9s܄bj/NɿO]':oh iPV9iTQ&/fCij:K<| *ZZ@{=39ݪi}0D lH9I31UT鎙+6Su^MfI+Qc#ލR\f^aar&Qs%8|06W p^1-?i_T͋CJ)m.; RXE(.I{5!%89puΗfȳ~c_f^(vVk}ܽ3x;n{Zۋ??Rt|<%m"ֆ)`+[&Tw"SD>XmT@}eLAUPx~:\`67@t82sՙydSOɉrs$(*  =rFCY)Qt:p$U #SfY`'Z :NTiCM:-6FGxV%j`)L\kҠfeIŧ]g1Aqٸ)5?,#ԩ23zÈ PqHut0]䏛ԪG(9>0,Vuvy Z飻$CCa-U[N%E3l@k?>GRzݨ9yRͻ=j>ϣEr9t 9XU '.*1R/xzv5ۙj}A 'Gc?U8.   hooǷY^%֢V*nCs3Yhe29W-=stfP@&@2/ӘysZDd~^ R up|\/OW+tFVeEq%K_bW#s[vItд=:`demc,-O!2#nqjr6;َtsTMQֆm%GHYɱFRTh(g}IY$@㴍u~`8صsA6u)h `)KI>Z48V4nWi+S:Z{yA-XR]kݠ[' >Մ. 0}_Srj$`tY`Pa!*V< ngCQu? d#r~\0VOkstu}wt΂>LIMx x:7_-xq W X4x MɻV=F Pb2'gxHbL=QDx/Gul`|P؄<}}{::㚢e&ۭ&-E7ַ:z"YyЭ %J'* :ʞ 4w[5DBq-Rq+P͛ɺF)c>|~!c!7f?૭BVx] HHD#"B ~[Т#xg;K3h(b Xn˔*ť4$AR5^Ww 'U|3G/ήs<%@ly&C~n&$Xh";aldQglV `qxΈK\#~it~ZLRQbK߬YܸS;~Ŀ ;myhRu\R[+2Y+ky]KѼ7`nHo,md`%ÿdn}KӨI@g)ųϿN`*2o 苜0[ܬselbWeoRG"& Q#*6}IdAQf'" Z -LXCcA_z,ϋiЗqyU?BJHa>zvpn"zw͚}˝7rsgu}.6GRW&L;ͩ3|`]M=wֈJl>]ՓrWh!,H#&-4KcU-D|4,1]0rF7pNOT_l.:=48 WA7ֻF_^orzJW(~0<өt˘~X50(<dU s"C`fiYJ`:ۅ$r[p݁w$ '}%I̔*On4O/'>`L]{nmYys7[ ~q[g͸qK~7r܏kxѽo=cC#ўB?2#q`W$"5M$ P^r8[B.P6ȹ4jp_:|Mp^7H I{}}HcTg.fӐtupEd)ёYT|wi(r(X8aWi*:C5^G+Ĉ#ōuqsk* 8>QNߠirK8ZlfW,{\5Wκf㠿85Ŷ4oˍIE2kHKuQݟWkc8V+rs=V]¸M`ACU>j*(c9u.0uc}S_TIiŗ5\f:}X"n;+8.%'% i"2y&~d7>%ԧr#G6/_=rফ6"MPJX9ڳڛ0# HZPm4px7񜎈2yɈmxNAo`z +/Zչ)/eBKVaZj.8H]Al,LkoÛ;E^,R<]ՆVq8de VyyuZErkVk]Y 0l_\ž™l<_oMeO#\8({YwHad&{[""B:Tj4Gw~.~}7JIԒm(M&sGz |:KM0oCv jy6#O-ZU-`ovE*C/fGn~;e"Y-_ĪzW$'ɛɅfy"~Twch 615eNx%wo; ^X+y"5FXږ;~8|WoԎP+Lj'2+Zq~3+p*jCknoUhI M&"Dk6$-볚DzTܲ, Dp"(𨯢*2IdF%e,oacK'VIT$BhF $l md[Ld 2 =قYZ/nߍح81n 83h.KT7fG&wxMnx띯 |ؼxJ434{x;ț2qJzIWG/uD0jq:&(c O˓iBREu2ma]t;ZeYė!~h% mv얽l?i "zȾ7`QhJGg"0PLC H2 `tHug`{LlL˰/Yio)NtrX{2%"EefȤ RA|RVh:tZ%=j+)`WUuwyĹXey0Y>'8AVup{yl08;v]pMdsg_{?.>I1M_DhId}*`H>;:aVډp˼!["Z"̮Z_2%~u:HQ Yӟznbz,~>ߒ> xwqkF½^^,^ O-_k5Xçx w/R{^|~pߡ6IeCBZ@"jt^ >eWtϺRo-E?z?~$OXzS̾6E&W2:kJ |}Xms.#jqbG;40,wExz/h =9;hO)bSZrrZȁT`,jۧƽjl[Z}ԥ Sw\>}>6Dl"˻`V3O>/mPvOmM`vbQ-ߴ~j"Řp+Sɮfs/!,ۍZ26f _l=Hz#j<߈6mkIܻ>z&H=&N{뚾Q}G}÷'xs%{{r9ejuA~oڒ;_=?ݷ]R勪˗77_gw{g3y_5Z]*կzn=S*} yMvO{q÷ҕ%gVڅsCj.o=haEt¿IxfU*\T*g>0)KЗM;!٩mvjtE_>O*ԪGRfvҰ^3 z*1q!e-v=zb;v {X7(E]*-'xJkbM}mOA;W~52/om۞;܃S/~n7y8}mS@< @0}jgIUܘW\߼fV™@g'b؜;``RpSd1[M&"6NlnMV>=PYxrMDR C,9)yVu6 ݡ1yi/-t[90t-u7׼,{s(#R\;+8wnlt]3҇t8~.s:aS ZVrx}4I6VKv@~`+͚YeIO<{^mżߓ"5\|ĉzP*z}\\}Gb6p nŇY][K&w,M@.7}&K=lmV{]NP/v‚Z]T;}] 5<ש&ZO9&X/:# kFv=ḶpgɵX5<'?M{ ܥƥ,n]yg?[2ۿl[ׇ1h{mZ2.1uRolfyݫԉW,XJd?)[eJ [t"W^YUU;вwlP9!*?b÷aۦ?_ ʣˠ~^yTd$[$3.MF&Т.iz| ׽ <.uƲ%A\~_gro%U\kvK(#s{ q 5.lpRnneC>ϩlp )|7s|F<лv@*2+>OlV)Y?9v挻73p2-˙r:"0fr]Īj/,(Ǚ,J #&3-%oR7RyZ ̥e=7mʇGO{g!˖80Y[kiƕjz3nymMNWsV`MY0r2M9^Y/ZWVFѾsucXW2xҎWߴoOի7hΩ(_^u2DR^8vo~i*\7;BV``Z@gۧW{*ww(͊XTM\1[Y+d\(zQZyS:zč.2GNKw/XټB~y+թ_qfVϔ|zj3OYM>8[ pXt?ή&5rmSo$?Z s+ԭN4&<W;RNE|!" B>Lk&P^anM@蜐G6p+UzwA]/X/1kXˬ?>}')Ć _n _Jrzi#s%Dz9[hs|7ӕ'W;FVΓewCz, ~\xhGчs,s-sG+m\Ujz՗4̯Zr- gX^wk PK,yfil s:V+6 lް%7ELl$SLn.yW'G&c.[O]'(p[Zazr36ִ^8ka Z*pչ4a-p^fJz]VP6)ula/3Y6;p#zUḦ́()|p nEB#:S4ngQj6C95X ßƪ 8@?8oV^rbaI(>HwAXp P6<#MB^c>*o~y1)%V{ F\ihG>J'Bajgܐ(\p3?{bBdM׆ kZ68ISr/P "e RY%( o2B9"P~r4*/(a qH7HXРNKi( ORi0Q6K%uh k).l4b#\cA4>t-ReRDLmȐbҧ8N>D6~3[-y kſZRjKa" tzdkӔoK&1hY58| om Qh'dM3ؚ7ډ!!!t،fR=rJϽ;ttfx44z~h!gEI>[k( [їG#'H&w{']8=m1?= {lgGNӅ.f\F H!14:ׄ-RbOGEbԱYv;3v埲I w6gCS ehj$c5ۺ#G5o!a3=6I5vKͽp ͨ1 VOAy*H8Flok?_LBbsYz453c RȺ팔O/dt1Mؓ'X T5ZKw!<-UUp` bkFJ-?#c*Α!?Ե][& H[ EcD(: @"703ms4Đ>65/gQkB;qmc{X(ޤLTz,,תօh<ڟGT#)`]'yXObh'rxB}ZhPK@Bi Z`Oq}xj9A};cA: Ĵ!mS^ DÁ|= @rbZhUt0G؈AH~Ov *H4kH`ׂX ՀP0 j7ȇzPǣPV('ZHdOp(1@bD}q`;ATXbXLtj$=]'bz (LLXjO pPD`_2#a}$RX"` 2 b\C 3G'2qhd7 y`hH1u(w韅Du1H(LMF!E%`R$M}wMQZ 9B zL'4@Mq'`1cH>F[@"1\W7<<\[Fp]$1uV?ea= :%Y}M kWܦֶm}g-9bMI E:F U ;D2rvd%( vt-Vd0h/6#H8a4'cz0z9*ԉTNM& k`3 -jV*)ӢH'Fk@/XX 2;uelv$U Z|H9Hq Bh`1cpdK¡H+p4+n)#FCMC,2CAUC#aBB'Dh^z~/E bo"D>hC{B]V}Mtq:[Ա3:ƊgΖXN'^dHes+ Ui -oZt@`… 6.n.iZҔaV{aENq63`&oѴ!AHI[||P(Canggn?vK-[gn?vK-V3x)ihWc zVJJV9ܦJ>rYOm|!3jx,/ĻNw:WgL n{SD8 .Ow=ycxܶ'.6uv [`׮4X4-cíyr/c9\6 &E $swagd-jIһͼ;FDf֢I/B- Gx$^S X`?QwouI"@~ KzG/5|Q?=—(F>zG|G+h9xR*o_L^yخ?EN$Z f] (OLӓqA s'Wϵ͋e/(GLx;x`Z^{u[`w$,O 7(ͅR?Uq}F[̝%|Ctw%kgK_VFi/'Nox[sͬDM+_[o`ҽ// ɜ<S~XI 7xM*| {tOMZ IaH*^^ {!zwSnD\'ӻ ䷺C+/TK0!o=Pcb*287K͋ͥfyȜcq[\LbX,&b,̒9&}ЕM$nyl,[:6cYG6evAϘZ;XGʱe5Mc5cun䬳kOcEcU]1γrUWypմfK;3I:6w3{l"s;ƾY#mCuw=$ض sWwwwLD4YJtLtt:U]Jt Gˉ&Df eLjX(ҌK$@RRL$I1/$3$uKi/QI2)6h2~-|ʚ>;M/kMd=^M;mL]@?uǂe˷!zF//[}mk:ͯ__VX=vcCIe})]V3d3k6!bYXV#ֿbdZU B^/)*^:wy EaBrke+20jAV6QQ/,/-:(gd5d<> endobj 113 0 obj << /Length 550 /Filter /FlateDecode >> stream x]Mo0HCJR4RMpH B V$zx18Ls냟̩_X{s綋LL'⯾TC%s~eߝzZő1ɯ9:wncǶ;ߛn/LGeiZj~śOfhӜO}F couP~Ufەq1xTi\@`E P 3+</Q ,J`؆9lg~Xn#@>(go(Ч@o}rdQqC] $` |PZz(F%|aT|0DBA8zO } n|0^( X8͆@E;>a} l8VEז>f7b:6 |)}KGШG0*Ci`TJGQJk+},&q>n~Ǐjo8*p,Ho䅟+ endstream endobj 114 0 obj << /Type /Font /Subtype /TrueType /BaseFont /CAAAAA+ArialMT /FirstChar 0 /LastChar 75 /Widths [ 750 722 556 556 500 333 222 556 556 277 277 333 500 333 556 556 556 333 556 666 556 556 777 222 500 556 556 722 556 277 666 556 556 277 556 277 277 556 666 556 722 777 500 722 833 722 833 610 666 666 666 556 500 277 556 556 666 500 556 610 500 722 777 354 277 666 190 943 222 277 583 583 556 722 556 583 ] /FontDescriptor 112 0 R /ToUnicode 113 0 R >> endobj 115 0 obj << /F1 109 0 R /F2 114 0 R /F3 104 0 R >> endobj 116 0 obj << /Im59 59 0 R /Im54 54 0 R /Im49 49 0 R /Im43 43 0 R /Im42 42 0 R /Im36 36 0 R /Im35 35 0 R /Im29 29 0 R /Im28 28 0 R /Im19 19 0 R /Im18 18 0 R /Im12 12 0 R /Im11 11 0 R /Im4 4 0 R >> endobj 117 0 obj << /Font 115 0 R /XObject 116 0 R /ProcSet [ /PDF /Text /ImageC /ImageI /ImageB ] >> endobj 1 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 5 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Annots [ 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 6 0 R >> endobj 8 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 9 0 R >> endobj 15 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 16 0 R >> endobj 22 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 23 0 R >> endobj 25 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 26 0 R >> endobj 32 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 33 0 R >> endobj 39 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 40 0 R >> endobj 46 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 47 0 R >> endobj 51 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 52 0 R >> endobj 56 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 57 0 R >> endobj 61 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Annots [ 73 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 62 0 R >> endobj 64 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Annots [ 74 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 65 0 R >> endobj 67 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 68 0 R >> endobj 70 0 obj << /Type /Page /Parent 99 0 R /Resources 117 0 R /MediaBox [ 0 0 612 792 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 71 0 R >> endobj 99 0 obj << /Type /Pages /Resources 117 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R 5 0 R 8 0 R 15 0 R 22 0 R 25 0 R 32 0 R 39 0 R 46 0 R 51 0 R 56 0 R 61 0 R 64 0 R 67 0 R 70 0 R ] /Count 15 >> endobj 73 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [110.7 459.4 253.9 470.5] /A << /Type /Action /S /URI /URI (http://www.nagios.org/download/) >> >> endobj 74 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [390.6 285.2 513.1 296.3] /A << /Type /Action /S /URI /URI (http://www.phpmyadmin.net/) >> >> endobj 75 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 646.8 454.6 660.3] /Dest [8 0 R /XYZ 54 721.7 0] >> endobj 76 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 283.6 461.3 297.1] /Dest [70 0 R /XYZ 54 721.7 0] >> endobj 77 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 310.5 461.3 324] /Dest [67 0 R /XYZ 54 473.1 0] >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 324 461.3 337.5] /Dest [67 0 R /XYZ 54 721.7 0] >> endobj 79 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 337.4 461.3 350.9] /Dest [64 0 R /XYZ 54 354.3 0] >> endobj 80 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 350.9 461.3 364.4] /Dest [64 0 R /XYZ 54 721.7 0] >> endobj 81 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 364.3 461.3 377.8] /Dest [61 0 R /XYZ 54 404.2 0] >> endobj 82 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 377.8 461.3 391.3] /Dest [61 0 R /XYZ 54 517.4 0] >> endobj 83 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 391.2 461.3 404.7] /Dest [61 0 R /XYZ 54 597.5 0] >> endobj 84 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 404.7 461.3 418.2] /Dest [61 0 R /XYZ 54 689.9 0] >> endobj 85 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 418.1 461.3 431.6] /Dest [61 0 R /XYZ 54 721.7 0] >> endobj 86 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 445 461.3 458.5] /Dest [56 0 R /XYZ 54 721.7 0] >> endobj 87 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 458.5 461.3 472] /Dest [51 0 R /XYZ 54 721.7 0] >> endobj 88 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 471.9 454.6 485.4] /Dest [46 0 R /XYZ 54 687.5 0] >> endobj 89 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 485.4 454.6 498.9] /Dest [46 0 R /XYZ 54 721.7 0] >> endobj 90 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 512.3 454.6 525.8] /Dest [39 0 R /XYZ 54 721.7 0] >> endobj 91 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 525.7 454.6 539.2] /Dest [32 0 R /XYZ 54 461.2 0] >> endobj 92 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 539.2 454.6 552.7] /Dest [32 0 R /XYZ 54 721.7 0] >> endobj 93 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 552.6 454.6 566.1] /Dest [25 0 R /XYZ 54 721.7 0] >> endobj 94 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 566.1 454.6 579.6] /Dest [22 0 R /XYZ 54 687.5 0] >> endobj 95 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 579.5 454.6 593] /Dest [22 0 R /XYZ 54 721.7 0] >> endobj 96 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 606.4 454.6 619.9] /Dest [15 0 R /XYZ 54 721.7 0] >> endobj 97 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 619.9 454.6 633.4] /Dest [8 0 R /XYZ 54 576.2 0] >> endobj 98 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [447.8 633.3 454.6 646.8] /Dest [8 0 R /XYZ 54 689.9 0] >> endobj 118 0 obj << /Type /Catalog /Pages 99 0 R >> endobj 119 0 obj << /Creator /Producer /CreationDate (D:20070418094234-05'00') >> endobj xref 0 120 0000000000 65535 f 0000288527 00000 n 0000000021 00000 n 0000000602 00000 n 0000000628 00000 n 0000288715 00000 n 0000014413 00000 n 0000017069 00000 n 0000289103 00000 n 0000017096 00000 n 0000019950 00000 n 0000027081 00000 n 0000019978 00000 n 0000027055 00000 n 0000043270 00000 n 0000289291 00000 n 0000043297 00000 n 0000045532 00000 n 0000061813 00000 n 0000045560 00000 n 0000061786 00000 n 0000076941 00000 n 0000289481 00000 n 0000076968 00000 n 0000078608 00000 n 0000289671 00000 n 0000078636 00000 n 0000081883 00000 n 0000096442 00000 n 0000081911 00000 n 0000096415 00000 n 0000105461 00000 n 0000289861 00000 n 0000105487 00000 n 0000108211 00000 n 0000115703 00000 n 0000108239 00000 n 0000115677 00000 n 0000125187 00000 n 0000290051 00000 n 0000125213 00000 n 0000127565 00000 n 0000139992 00000 n 0000127593 00000 n 0000139965 00000 n 0000148537 00000 n 0000290241 00000 n 0000148563 00000 n 0000151647 00000 n 0000151675 00000 n 0000164748 00000 n 0000290431 00000 n 0000164775 00000 n 0000167875 00000 n 0000167903 00000 n 0000197466 00000 n 0000290621 00000 n 0000197493 00000 n 0000201074 00000 n 0000201102 00000 n 0000220325 00000 n 0000290811 00000 n 0000220352 00000 n 0000223316 00000 n 0000291024 00000 n 0000223344 00000 n 0000227590 00000 n 0000291237 00000 n 0000227618 00000 n 0000232497 00000 n 0000291427 00000 n 0000232525 00000 n 0000234332 00000 n 0000292021 00000 n 0000292238 00000 n 0000292450 00000 n 0000292600 00000 n 0000292751 00000 n 0000292900 00000 n 0000293049 00000 n 0000293200 00000 n 0000293351 00000 n 0000293502 00000 n 0000293653 00000 n 0000293804 00000 n 0000293955 00000 n 0000294106 00000 n 0000294255 00000 n 0000294404 00000 n 0000294555 00000 n 0000294706 00000 n 0000294857 00000 n 0000295008 00000 n 0000295159 00000 n 0000295310 00000 n 0000295461 00000 n 0000295610 00000 n 0000295761 00000 n 0000295911 00000 n 0000291617 00000 n 0000234360 00000 n 0000235034 00000 n 0000235060 00000 n 0000235302 00000 n 0000235618 00000 n 0000235823 00000 n 0000258124 00000 n 0000258152 00000 n 0000258398 00000 n 0000258962 00000 n 0000259436 00000 n 0000286608 00000 n 0000286636 00000 n 0000286877 00000 n 0000287513 00000 n 0000288066 00000 n 0000288143 00000 n 0000288407 00000 n 0000296061 00000 n 0000296123 00000 n trailer << /Size 120 /Root 118 0 R /Info 119 0 R /ID [ <47070B17EB3B0B44A5467FB46C8773B0> <47070B17EB3B0B44A5467FB46C8773B0> ] >> startxref 296323 %%EOF ndoutils-1.4b9/docs/NDOUTILS DB Model.odt0000644000175100017510000137211710676757261017773 0ustar baeckerhbaeckerhPKr7^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKr7Configurations2/PKr7GJg g -Pictures/100000000000013F000000E5FA6165B7.pngPNG  IHDR?gsRGBgAMA a cHRMz&u0`:pQ<IDATx^oeU_?Fc,l NBPڢN&5% Lb&H2qH8Ɣjvl*&D0I?}},9gs=޽}nNޜwwkuξ{9W'Nc UY`;\~S'}@-_r^j/}ϲ\Y-`zM-PLownNʫ5@0޹*+9Ljک[y0;Wsp%g5@0޹Y;u+Zzp0;7knUX^[V Z\Zzfԭ ^k j[띫9Z^[V l;_˿;y韹h.s&#".sWlaTs͖4"(c- *}X>V 5_xK}/{DuL.rm֐.5M[?һNz.HOd$b8:lޓ?3sa쓱*|S6 p1Se@48 iβD:Dy$ XtA/cHOe'1˙<%b]B[̅OX 3zd6ҋiވi-h8踐Q ҊO˜WpCRZ|ON/a%խDYnzMz1 %Gj}l#l1'+3v2Ψ5Yy7M,srzUV!8P(;GdjRݤW}\4xsdDD%u`P[;(T&fM)ٜav̋V@:Ղ7x6I h%r *Zߋ%B9y `==YYgBЬ%?-]t'#LmK0Ɠ5 zC3:xpf(ކ3$47rYakth IJժfجxV_pbYa6akJ̆6$HK!K둄ߞ6mW3#o>?A:rV%0ޅ#硱C#7Fz45x㿭 Zt!3ޮN|o3FIEyo;#R|Hl WRz$Vt &^HS2ymmWχzAib_h>1j}"dt V@$ N.RD/rjk^pF:ou9FάI.I6Q8H!F[xoR#R[ =>|8Ѽ[5ӫJ.҉,.[[h\^]%EFbYsQ'++T+՚n< ڱj7>e axufY P'8ACyFk:֛]yah4#AeJdqdY%=[B%3&Us$@Y]5i|a2NNV Z,`zM-PLowzgkzmZ-`zks\Lj\,`zM-PLownݚk5@0޹Z9Ljף[s-0;Wp=糀5@0޹ztkZzj|0;7_n͵X^[V Z\-Zzѭ ^k j[띫?Y`bz?w4 /ג_wV Lr/&ѣ۷1ʳ *?'|$~ ܋ɟ,2I?_}$x{n^8FN7W5 "x\f`zM-ŵ2.L kz˥rPr924KJu轷|BOO ^/5BQ"H#g90Ǝ Q[^uHI|@,qa] DF*EKJ5E8aHDCka$j䌫L'a$Mj`{n'EoSUlEvdzk7]y/'CuD^Vw?W)0/dK+q0zhU J%<_Im {OWNqzcfH'S' }L(iuqX=Ƶ ]xW_Yx?{Kۿo}? |[2ɽ^(]gܗITc/o|Gb_xߝ [gӉyj5wq#2{kzMol.5w1'eJ^kzdsqLL÷޺qvey^{׮dz/?BB׻n+u!P& BmSTВĜ;{zP={j-tUu-d>==OP7#yo+_k8{ٗPkz۝pmgw={͋''vO=/wf N(/A"={ )Q* G:hV0#1vЌȂB٩|]]I ,܂ .nc>z~D_?y] !s]}=ELCUԜ = Q"}<73^v0 0!cGz\ d Ue_Jd.dd`UV,t}ŏ33^P'ӟ8!ʑ3UD @TWY5Nۋ^ "ANOS@G\Xa+J&M/`Ñ\K8rI@ʼnu4PwYfȉAcq{%il8pB *8LWl!.-xHC+W*$#{[a3{5s$dZAOo>q8. -tC <!H#Bz3ܮ8)|*J/|/uTƢLgBxF~`)IL@QƑ"Xrqܫ. G'"]+~J-\;0X tH'ÔZlGGBW?\{CY8LUE/W5wP |1|+"D?ay?Z? %~л۲6[;]U&xzϝ;wN]%{}?&f(]U2=7NN8q83go}3";v )Q=:u @9ˀfdGdUCdAªZ$d6)Ô@>'O|W_io?#z2( U]2"; ҪwB^+^4k 3 1vف >8  }2R)jA(2j8g*50&.^0Ͽ0 0 A 2;RT1#+Բ`.@ dVUY+B&Arl spʋ {#E,%p.(dRCDt7 '$$רb%)^>"AHÌ>v*+bGܯ^zoI1=->8!^rH_ H0 I.^%WGZRG#x05^}Q*NEg: ]d縤q2XE:}5{Z! KFIUN|#VztCHBߛ#dDɄкeς[ e.}^z] J .\(d]H/9:2!4ӼI/XJ/q5ti8rV$ ]қ2^ŲPTrh}Z˧A&(9E-/4[nŒrq䬹.k:8ES.t9o93ö.9Esg2W*q)Up= xE.ћO#z9Lp-9ն@dɿ,F gq|h>vW_ϼ&|?`>A*Α||u|*K 2X#=]epY[^5kh1By 'd|#q,ӻ FUxqkVz?ߒXQzN7-П^@G ހq e.L;^ߥ`Epqa-M['$QhZ8rLs0ʦw+wk&ɚX8 .4s9)eعzcх>1ZosqEYIz)tqA0]-RkzMi0ֶwWTZ-`zMom(7ʬ^d{rΨVt ^.<_gCXҦwWTkY b£d?uᚔkzMoX^ {Ko(EWX^]հuRRc}V;]O{(({ݡnN7Y- W\N?(˙p# ;kzKZ"+r&$pUbGW`qky[cV-`zsm@WHL5ZZn!p0jkzkmktzw=u?Ђs6ե[`ޡ>/ي93wf3s|y=9]+S+fVh?>a{n\ |*U:bF>zfȵhQ+2?|^S'YSY!oCsݔחfDNܖ % ׾&H};y@rJ#cki(+*MF4:2)Ut=pjs?{5g9;C>sBU-V[궜'EA̿wA>G'BׄuQ?]^W+QMCV{"H.5)=^lOs779!N jW.pGǩW_}'w:/bsQ0YӉ@CI (QCe$*8-v+nnӡW綥:qc^|:P]׉Q6Z  WNUePZTbzQq|~B |VeрQP8%7GH+ +|Q'RQ'˵`Rs Z(]7+W9]jȥoS50 k3S\]U39%Qw5]Ms vWsyH'g)qtg3Nb%.U..6$[ Rjhk> {uA]>*k6Oy1]esmuWc;ϱ`/8``bV}8UzYY[woxg9TLsR#v?hS]tWrF W3z9z+n.3NiUE4SBj:;p fݜSОy`DTCw,GoZc)hS),RoyQ%ʽ 3N5#D<['rtp/..)dtylS|*^=v)\LW#˙"6/eTm7.3Qǎ=qj5lr 1RCP|?V|T<0?@+hOM?jÜ{8z?;#ϱYWl}tS SɎ݊SxRmێ ϡ2n ǖk^p`ccB^;ΩG r QZKl?SYс©>%8L kNUrjT!ϼaYwU$G%ġY {8ՍGqS]OV@ګF?GOmt#=@8Np9>nhhuz踉Qbͤk)aTա R'e]ikAMalܽ}9)QUa4?c@tXϱD Mb8NN¥#c  a] GbǣlзnS.!G/CK;\rQN슬ZԞOs3^29RL]uJE}geC@8Nmmnk_SoʢTKc]TSp*WN1~7OpfN=;׼nvY> Sˈh oS^ 0Q9 /-G(NS)BQ;}U#M}@1^˩O}SφrqQ o~+.;#NJ[R3SO>ԇ~cE |+_l{8"`fj*:|LXQL8up=é3SS CfNJb©N h8>Nh8O?- gQ^x,􊕐jb CNCO~r.z y͝Ќéz뭗^z_7xC~kGa{ 7;b-s0oPCjKrw@҆*HL5N2-k`~N sp#v@%]䤈U4Exߺh .*-a e )I^ O8..O5W*OmM9E4JjxZļOPOW~I-!C޲lܨ:[a1A]+u@ѕJPζ۪Em٢ҷ%4©%,!2CpJ3A7S lQ8v栅SKXBdnYA,ڲEoKh XKDdnPT8NE[z= %ᣇ^~xoㅇ^{7+݋+w,6.Ps\H&Ņg~aM"|OڔU o4 j`~N1~Ko=<o/Ua5xxF ?H%UW%ybp* lMs>K L:US..r[–jEGbp\LhKuexTWͼokisp ,)QB /ǔRuާ?$v0l@1ƕT]rb\-НQ)yZs6:V%h8e9X'S  JOԨ )8zZ8qyh ^T]ZBe )Oxg"ɥ2sJ(&}$򭙾Eڜ1uA񌪋tlSk\W3Sr|Hc^b!46sP MЄ)˼pU{ާĿa/DG9EP_UԇhhOmʄҙ40?!;TQó<*Ω,tb,t`Cs*v]T4zΒN`ibSSg\ _pjS&άsU.=7N`ibS?n6eB ɂbé #MlJԂ@YHt8)JgV@8LN`ibS'NUwyNmʄҙ4pO?рpjH" >%z^8*}%QC'fSQr&tW-i-sU%]MpjS&ά9%F?T: =HaBwѹMZ|Z(5$ *&hi.&xc*rFa*iAU8aMi`~NU_IO\_0L]_yRdQ-\{N$?:©MP:0$W[yذANPP8&)P$SS9>T혻q+u fwYUH8"E͕# fAÓO>y.cַ/$N^=3 f/H| Yx,z~mɫ*x-\\M\0:џ?+TE%P-EWI݋'\!㽋51w ; DU7T9ȃ\BU*Q¾$E,@H8w, Jʻ,}9`<-RI2ލr2 8C'/ $w͉SS;/©8%qNE(!Ρ? J7qݘ!c:mT7H/suc,v%jg4؍pʅ}^J*;Gb3K»rv;^vf8xR .3 jG<}=<([؞9Ůd5s'T[0>ދQNA%68uVOS2A֑s N1?۳8.BGSDF9eNn> M0Ū;)W%O̻9:zV)< ǰ'~X3ΩF"΀U[3KکzġNM$©dS?UxtX|+#!޹~:zVv)Y#`ڤbrԼ鯖&'$jj }j`&fAU8up3sjkS1ԃN >uyCEkF8up3p&ֽFéu ୄSAMF'N='>O>],p}371C5'N}3w@#4PT{ԓO=ίHZ*0J`xG8u}u;Z7l!\7 HPjD?JHX $tQC`Ozǵ NsNMtSSZcm"AhܾM~FwΩ矪>MYifu`K7Mp&j?Z{]䟪r=FhWDóIu{wߜzOL?Su%O-~3sf"شx{MauF?%l؞9h9m 7 >WWsm_'~oҪ˩=<'[=< йT@8e/LU_b~bOv4!M1bSS-3znJwEM??No<JS V NI:FiOC >jzs&.YN+*@BuOGQE]*;Fu霒IꪖFԨ/cxNS?- >kcTqjVÜ@\ P/Db%,Q\P`2{YHcwʩ^Z˩G FtsT">!SAp\Ve2hۗ?Ϸҩqs9幞tHrqfZG$^a@s`ՙm?>u[VO|MG T:'KZ!++y;b!0UL|2iVگʯ˯f~}}o?X?U\JVcG2<⿮y]sWT'w5Xu*woǟ~ŗgO~:уpjُSUvk>˩J{k?՛ݐpjS7rS]B .9u/t'iU6`1S|.&Gt|©l眺SQ4JG){{]ksO *Z󞹠sOS6ȝP$DgJ>O)8Yʞ9uw*|S!uV.6*)Rfĩ矚Ω: @ Yp9dT*)<=s埚ȩf\?5CzO,3-dA֊$th/LUxI_b~bO VeiKmתJ Of\h;Q,W`眺S9Sй@M勁z/?t.0q':qU3vhUE<3:xԫdXrJb8)#Y:_{Rr9B!yBha:_z:{SxU\u8_]#׽S8W6@.2lg.&HǢ*/$9q*qHp b%=Yԭiepvi ?nݷu q6OCv >ħsp!aJXD92| UΝYZ.mpj O?FWnȜILhs HP+9%9A^NAR}ͺM&#ɪ7y©ҍ)Sc5O5:"~#@ ԼϓDTx&#][A8w9%qhs"#spfy^1%NaN<toxS7T7<ժs.ć.K~E.0<⿮y\uUtJzs9%S:zmaj8Xp )Dnu.쮸k PEuorgSk}dxDN5ּϦU kYudNUB)G*Xp4:b2(4Ktj|JÄyCO'>?\lp8Oy8U7<8hH9MIGOXm|o躢n9©oflxߜ 0io':^Y zўy8qE&U ?Z]HqU:1& \l(!2ߠͩI usND&sACUNd]&ӋzeNTbt]]_r OW©z}g޻_g5~y*3M6ZNNpjGk@^i984ٝNUUQnݒ?+/,:j 'G3!MS85]W)y)v7 C /[ThS+b Tb_]wHB6>.e5E} T]Mp)$c/ziTSGҌwfN7dM:qAj47}S[pf7Nn9N)vqoUyQ9HT)Q9[pzSGҌw%N͛J y!`Nn9%gaSiNqʹ7 x4}jY띦 Ѭ4㝟S+"a7wC+Ür>>dOͅSۣi`~NɐV?ݐf%zRatR&Q-깪8y֢T8u4xE8\~4iN-JOJs5:f\39ThbѬ4 ©FT8NE[} ZtuϹ2q4 ܒS5;*N2k4N%$9hB&-:ש.t^Z#5 MF*%KLwYV,%kAޱh\jS{XS*‡xj8;zjռN,)‚r]dӲDTds=y/M v9$؜6ޱ43_#Io[rL>zxҪ&ZR!L)BKWL~M6cgq }B3p7w: ܌S""LOYdՙ:ݒ(ɺV^XX} d ܌SPd8ԛi8$jpRj|iK:M/nWݱ8@&!L}{:Osƌ@L ɻOqFhQoS&ѕS6Dz/vSb5ƥJ}v ˫OlTh1f\xÉ،MSGwk :HBvrPꚃ4/{Y#Κx/tɞ:ֿ.v]}${@]Ԕ6e9nd2cJW-[#d$HQOzy7M dmW}0}c,!@Ǚ(Cmlӿ؈EWg=RMIr`!zgJ3ޙ9$]b 5!j SpUj#2zοH@9h[vz{(8:`NhN,F3s ٜ9uJ]5Q3Lu-)'TAl*LwgSX~:W"kDeC`S0XFEO !;@͹D骃tL08ƒY65OaSF:kBa5{C~']I:\tu!Twui ~Tݪ:uӷ[_!_F#`0F#`5KO}竿7F#`0F#`+?^}_ ho3F#`0F#`]̓1F#`0F#`yGt]i<#`0F#`"̃1F#`0F#`y"z̉0F#`0F A0F#`0F `)=}Kύ2F#`0F# A0F#`0F `)=sb#`0F#`0D iy>_l`{gdQ3F#`y# "*>6cD% ݝYT.[1?ɶ](Z~"L#e6OxQic?W^׿[ ]<إB̃c5lJ i0F#LFAO+fAp3:Hɇ1#_ǞH\m8wDrF΃O";X| OBNg$nTEgYT.*V8g]SmO]&EI|]Oou' AX䭷Ÿp_y} !|"#L ~ſ+_A)1*0%@_HFFR6(5gS7!%}\)v尗yG3W#`x2# $*;r.zƒcI|{DF~D?A_/V& TًYZn^C;"LInT2i'Db.8K];  '=҃ࠄJb+b+" H߄)VnS$QVCjt o0F#FAE?-HQ% JEAC b4>]˜$ QpKv_STI &pbۓ{E7Rmz#Љ(o6AR= ~|NJ 9X,YJJ01lՖ4Z4Ar"RuטN4{|#`0FTy8Fо6%ߞ3Av$pqT"и{Hajo8b ~_PuS+ɧ#p07߫{ ^ cBo11kM rq_ߖX1#H>V:]G l .m 6%(RFDla$@dYaؕX,%qR^[.bbjqS^9}4s0F'#p7}P#!?? 2%'i ]ʃhөM^)'g}4*"/t' hĹOVGAɈ70Ta<I4 `6p=9gB{&@zI#\*sn]QAv3V:A%$?8Y-yg8f E, O2r16F#`X<=0u+]0E<Ȗ /eʾm1rA2F#`.yr%:ϕ4#`d_gx4 p[ j_ũ<,qn 60F#p"AZ=;EAw|ӟv<ȹ,̓ 2F#`30bṼ́,?ot?Lí6F#`iO*Wy o?fhW#`0DB *f9Èꪅλl60F#`NDSu'~ͷys}xndu/0"&RY]e؝{?,g÷=q+zb80F1҄lFoo|ygd]ybKqwnhSMy뭷~!z6=__<:m@~U '0F< M,5#iy]{ ~NU⿃k8 !y7?ldW`~k09Ã4!`d_[ti{ }ѥTWoryGZYp [$y+6~c0A|~+JyۋYUSxbU̓AgَyCқyZf0F1 7A>sySܼmp / G|Ho".]?#9,H x(11J>RR/^{Q#8Lw.\hEVTMۅ"4P#@B1ɊUbN W?ln##`̃Yys\VpE"J2w $#>Rt ϊI%dg[Xu y|S@ysQjChAz#+yjƃ|_g>@Y$quIXD_W/Jփцe0 ֈ5:K5 %*R><u1zkBBDUegi))[+ǃ,fk<׿+̦oO~.ENpx+ؒnI9BfC~_m90F1҄<'>N lv @m;q1 tIgA[.qAsݍVʰfE9DDPUd .1C= ˸䢸M Σz8EDB̓E.+>Gl+:=xݻ#b[oF#`xy5b=xhO< } wgc|{w0)uQxWP FG5bUo}[P>gU=Ӡ&l.dGq&aBd]"DA"yA<"$n >к<ŻnYC4 ]yAkn%AFWArH(0VOG9 q'9x'&MqtsEa\1K$'bS3@wvpԌ9Jh3 \MUU+$ɩ3 FE**EC:X#` f=V"q n` =Y˯p2Ca WX-0,pO"mi5Xi W+qX(1v*731M|M-EDS+4hH~c0AVV<l~=K*v,~-I5 1Diħ0 t#KBc˯C*ꋥTPFZ, /%P[T[~0'f/e"rK@,-= MO1Jz4ٸn,rVAAU >s1us!1 I9i7YXbRiAbZ|o[\ÍAVR|Cx!ADFю-'k=T e'?)rtPԀYhFEs?sR%9`%"ءZD)bES*"yKpw({2MoW$} ƙ<]5#`axa=4HAy~@ 8i0ABbF4k"Hx]+ pxN>Tx_Dl.iA ZxBh[buW:zFbxp App/ s!*pF--e\*BqOcdxG5'Q?ŔTDSL<5/#8c^C"/edVNp{<f|d3~zfc<`:NA*Ԣ ٮHFgS3Ը&Fq0b GbF嘱?΃L͒9o4vh΃钁6DC}gg53elA+븘E~pM0 `ΪFhWEbMd - HOR1,'+!Fu% 0b,*,}甆\_MSiRg$f$9w!gy IU ؤsL]S4BFpxX'Ѿ>G$l,1>{dL')ΰ/GOءxH#4$8W>8oA"EF?Fkf'N~r0##`9"/VqA/_|\ăpb$s8 8 pQ,+A^V̮iz"іwkA֩wW$ 4F M, zzc rcu[] ytxa' G'gq_yƪ#`0b ' vijZzUԩy~x /yEp&@4Gz021%&`\ȿ$b$ės b{t#RXV>)yCw̓ H0FYXũ n<-.<\e(װ7Has*.\ B!uIxHg" ɦ. j@t7\YF("fZ̓,?ldpE6b0F!#\q1+*$ ZΊ" 1K2tzZNyS1F +Yu#~'hbC 4aA6ŔD;`n +vMX:DϦ?A__6S*#`ϋ13҄u#_^:$8vd!A-mi4Ҏ+o脀y&kDèGAzzyDv*-;`rR̃\p'2guN#`.y MlAHĉ^7l sd"\hހ橕Rp{\AnЏAV3vPI^4)1A:ykuWvVj*#MR9svT\y#`@'̃4пX {R= 96vwhNWy}I U`ؔn\WV xޜ*w/UxZ¿?| $4:X ¸^kĸL|+Ƀ@qf)JcB}R|6-QU65VNqx|IgI2MM¶8 B2ƞ<OgaY[; dyQ4'xݜ8/WŲ^*:ߔ9: 7#;AXq! #aOиA :A+f@4dʐ!4t`0AJ&`4bi㡪 0Cڋ-6lE N\c)"ɾPZ;=#T0%D? $"p/˸Xn=x=yFoMq8VNř(l> 'Qhj!S3zy qOĶ8 rj'R<4q6WN|HjXI Ei}‰>q>9EO~ #`@),A3HKnOsR>b(Ges[${J\k] L2Jj]{-B^$".6GSdE=:6#`ny M$<?R4EIqF/yVNřeJZq@O -]+ ]u;bA:qOԊȃ(>+BJ#͉}8,,h*\=+['q**C9qRN~]/57FC GVd iBrs/>,W;9w /XZD%B-篽xloNQB~#`!`W˺+ EkVF# <ԡ*yc]eAV# ЦtZ&DyX0F`(̃iB Ay0D@=xśn/O3oSx(1qlV%5)@#P 0aM[U,Frq:ЇG>>ƃ:NܼnX1GRMR $Ћ! m>%`B`(-|ƔL=`d(•1F\ M,U_=+bh@= [("drCŃqOs/dL #[Qr%2̓,U\ YxM&7JL Fm|VƩyqE5D4u{dJ3 6$D EÕXV|x3v,2J0>a? "4ƃjbv38[|HK^x)d?1G)^J{Sz?,ZCBUEY^t6wz#`0b :o8ZlD4M] f$J2wkͬK(fX z1BӾU%D82 Ce+ABF#:DCSlA@z% `cyprRѺٰ&ƒ+6g3q._J^]}߬FiA 'n+Fx,7OAbGpɬ?d#My\_ X12PtGdގ0Fib:u$F2\0 ֈ< KcPv 1W4(\U>Q~byRNԀQ ꔸ/iX U2Ex)r2UbS Z YĆ3p&iN!K/\iaG_'X ._EUF a.hj߄FҊb{AZs.xAEZ,YkU.&C# B}]ٴU],ʝ#`y MAhΠe#FTA ?+Ro) W_=O%$aG$<1ۗ N=LT/t8` 3ƃ0Apu<Ae5כ0زbd+^VnrLHBTD\gU-(B(O.&\B&BQf+o {ɷ}X4y )p㬭YZAă@ XHN<#` M,_TR$GŃ05>7~(YqOx]Rm,B-ZnAߘ;,PI\ B}]T%EIvmg%NdD($DI8!&r"}d..AF^$, W bX _%"xB%:ϕtɢ>B# <Wq%Aר20DM[y{Ud3dlF#`*W+p;Rv Q_p >me+v=)d#YDI)*63.6QBqJlN{ sNBƒ0NDzyD]ƒpX Ty}GxFr0g<^G jyX^K/h{E8;>A V)Wb 򂯮F~c0緢^:=xp1 D/xmK%G}ӬAHIphb"f!G͟'uIl>)>x܌x+t%2*/c[T[ĦŚÃ,})6w/` mq6_3WLߩm#`y +sb{ '6QEAy%Ys6JOUN%x0Nn#`̃d:AFvyޥyx:ciܻw8< :<yBc;y]n*Y:.v#`ny My|ՁQKh_u>J~k6YHy8JHxb4q UI1 (B=w,l2+rŭVNp΃:4{rDz(VG{@uU@6c~#`:!`A??ʋC8ȂHoPB,VYz\Ņ\_~mfeN28jOivD1B!%|ȃ[ʃ BDJ+EV/bYƒėr&TEDJw،};B07Cdwė7CIprU(>c^r i|5 \ \ϩfH~ǃ$J?DVl$-rbq?\Abd\*g*$ Z. Jw،fc M,.X_ZH?HV1ԢƒдM6Z%(fPܭ8 tXvADZ7?ʋF]q+x~ŻËa)%hTp$ԣ\Ԗv(Ha/JmkAjD"1Q|Ԋգz'x^ W. slleHBe:b%g˺\NɅX#`0\w|\~۸ބ+>x] SIOaT(J;W*5ij* OYj#^oQbM 8m/_.wRA|Ec*VK͸ESHhÃ4!0Ńl;+*> QcSqWAӸ%*I+3+893~jgFK*x*WA5r# :JcDVw+<Ȗאlx׼` M,_N`'۪ɠߕ_fjk%x{Q΋A80h_/]~ EPH_%&!$ZY@)%[$̓ܣ?܉$w aAX6r3kf3KwwF##`0iQ QA8k&'Q99XA+w20pQ.? b"u/yY7^I~Qo;2rcS}CFEv7D!f8h<0Fi(9 >0UiLGJhh3e|{2PQ^JA2 Z5%vxrwA<>^0>Ro}bbu<"^_^tb_ks! dV>Wgqk}pڢ:K%B!;w8Sf*=8xjWxvx[g"A69LVD}lM!Ec8 P&#ld;0FY C| b[/DPFCDjFAj4 {52қmD Orb[&cR! \ SxE B>PA@p>~ǭRW ?__Ɍ<.ixhA<ǭBj#'0«#͇w\UzqyfJPmoTdHDhRϲ-? Q1R3 %'*gpl˚)Su+0"`gHbg$b-kIԉ5 $S(lJrĤ#؊zEN`iF{ `GgoiE\}}d,Ɏ[DM]$؜U2A()ЮSݮew2e&7QLO! t~ȅ 7dyf&x춗AX)N'cl*tǧy4\/롓1T8+Vt-#`y ML strjkcC.}_SyLrκ>A4[ptZ?xt\w"͔WU~BAF0/^y݋ @?&{uzNp9-h;U9KԶ~@N> :#`FC& s-oŴÎ>MHy>$_i9%]fljtFh Aă3&,%xwbm?`؃+rp[[yv}c;AGFL֩ߏ7]0F`|̃iB` uE[&>XtP3hz̃,v`U_Ѯ]`jwv{*oxw/<5`w$*?|]^zةF\C#`ibJ43`  Ĵ0 gio~p0!`ێO΃ {L0&栳J HBF }@N􊑞Hh+/-2>AdtJ0BAAlBCH76>9UR+fRŃ2UZјԀxI5ԕRb/EMĄbWT<BL. 2>q"VsLPN{z')Źxvh#+&(ծzF$E1M]x٩x215SՎ)Mꅢ" x"UYSE| R<fYg3;#o$l [*K,28R|9&ƈ'l㫡t)JONyY;r. gpWr(NWԊ X\L\?Q{;ވkh8 M,3Z9Q~'Pti`Bbp-)$84EOyS3sEVޯ*HYÎ_ x "I _bldʑ؅.#T#yGG ¢ EQ-v#2]u<8#x{~ T.!:ݫZ4HURFJL0:7%Wb%ޮHF0b B/`0H)Dq$:HE [t<߯X"[ i?I9v.^!E?q$~]BSlꙘ-AXe2+GzԆ tX=3(BQԔ"dܮ.:}dw_Sd2'|I,"YŎ#g̗E"QX^ni>>qb+MQi-R#tIyY;͆SC*9K{;`  M,hv|}Dqa3,?A?,G-bvU"^<:ji.OHI^y>7kё:& ⏊}BD,f+wQ}|]x !zxR4scXE3DqTwP5 dj+xd-XOr"Td.bd%Lx)@ e{USӵ_ )A8|aQElıW"? Y8Ά 8GavH$Q2TfySo4D#`1҄@.&ƽiH{}BWftA(V^Ke)o4T)4HLO`Xy:rk"=cPS{5I#^G %>Hƒ$Z aBcJ2#He9>MzEaUDFGНp+xcIaŒR=)Q#yŃtͮeyW[/r[q8_Np|֎#'8ڕpIr iu$ /%?K{;ވkh8 M,3Z9sPbԶWDD^KAI՞*Ջr;l}/XfMe2]_\+/VlWA&L\r"Z$vA+#y$ەE:#`FCÃ4!p366<Y8W 451b#:r{{#0Fx̃4wh%ezKq:4<"?ldp]0F`̃iB<Y8oɃޫ۲HC̃,끉;AץN>:#`FCB)sDdRj[z@NѩG7\#`hibF 2b* =tҔ .Qqiȁ AQ[Q5:]G^{ b7>AL"tؠԄoT/m^s踤BhDF]/o&`z0A1eQ[4v]ǃD'I쯽)OFf1=ٺσ2_ChIDPSA E~>a@= hD%|;N&@b qh2Ȝ_YUTHH3i5jqG:FK4Fy M$<ɔ%?s?ɉ\y4vZ2eIjJ۸pGDq=Jj/ "i$_:(D_EѮ8ůC(rEEBNx/Lh )&;62+'?/(T,]&܃ ^4A)aGrs ׋P8ʼnt&Iz'eQMDM|"29hԜ"bv* y*w#p<AX;f$e$=+ůLEf֫dD 7#`G4n8[Y̅݋)6htwRn Ov}kOytA uRA%x7* NG:C`pxƒHo|U]BB'<E}p-\5f? Y~?htF0b <vXx \4:䢍kɃܵ7{?|uC{#0Fx̃4wh%T^ 1:#`FCO#0Fibn y`&1`➆, $Vr"Yix25>_( Yt=D r-OH5}@Py- 0mRw|dAŠ#Eӄxù/2sBNeUxK+X's;xo+QO!G/gM2'0F1҄@ƒ+qȖbx7^~xiZ߅ߒ;tԀ iu6 @̃oeK`R"j(](&3nY<Ⱥ>Y2K8$TiAD_1;Dl*nd0F"`3xHrma l EE`ǯWEhm Ґ#cQ6Rn瀃qH5'd|dzByn0F y&`:[e4@颈 D> ˤG/K )1ƒLEY>Cɗ[ЕKuCHP!R oO3%>-JC`/><9s5φkqydy.nt#7 ΃릶%NJU6G Ig>AH) 9N~%EL/h &h0'"`8):AbD4cک^<Ai*WFS?!h >OMzO;?xu,]jAj <^#|qBݽ ?0F AAVw2 -Bvdx3[-AK2 UDC`/ H8/ VV9R3񞻮dʫޗ{oc;AV+3#`hA@ϣsR3t .꒺2LuzTbqCQ, 7<ʗV2#ϛ xOQS Hҷf b8Ocn⋃>ot:$2('1GvTYQAV۵h0F M,@ N 0aiS}v`4!:FTwʒZ$M(\O!]tWgyiwfm%؋QFv?"11xcLIN/v!7"bp%dR uϪ;' +˩n%wYyI;z9P\oSq.B ! 07;1EKPvEW>e_Q :#`8 Ay}ϋG(Ch(a,r̥}$Jbe+`ZcV.kf Z̓]? qb ae=Dbnx}|! xIJYsA2ysil]{,{%mHSJ"n<+WEq|O8 Sr̃nF#põ4VE ot$ Hp(Flo䒄n@+{nϑu/ZC"dB.M?3,Z+7V&סzUA /v8 <P7x8ERW>5G(Q:x(BqދE ']#%y]qWO:2&:E1;} YoI^*DrmkG$@Y:]X>&% ЊO.<q*NTHQU^?b~I^azɉ )90c#[h)*nġ,V! Ǯ0F M,u9F#nؒf-y { \/ %JJ+xRKz1PjPLt,bXPhM>AKo"EŮa렝 iRLY|^̃X&Nc0F`5Ã4!PA2ZccrqCKCI/2B!xb 2aϦwxzԊ"aA/EWv^4.R`= P,1yQU>^ƒLܑY`Q~RYm:0F̃4-P;͹<\5o<,yi7A!xh0 D` <4P$ک{dw4z)7\½HQJ#B/QEp/i6iW|c&@.\摋ű¬$"b+׬^<aw4 ITIOXz'yFQa胡Jh}A1kԛJRB6H̘S[lԛ?Zǃ@l}\%KYzky+uǁ"28sXzM4u_%y{Tn0Fy M$<T @ՔCc$ {:ɑӋ{ĢYx/ꄮ&G*VuR]xqH24'9-WĜzıGS}eSATEz5`dTGP ɻ\b Ҳs:$Klgd$%R'JH[B#z@"uppdHFWGST%--u 9>v0Fib-Kx[د9=}^GBvA Lqƒ$]|ȃxo92QQIz 0=9#WQjxB*:$4("T,}oo!F΋!W(k%(RZB2QytEsx,[m S@vACP{ẽX&Nc0F`5Ã4! @Xlx3uƒ]~䥭=?_ G$TLio.[*U )@9Z,ȡ۬TsYbp5_D~NSUAS=8c1ڮuF#`0-ibZw|iAáːuG7x?˃h>oA4n-r4+G+_iCjH mʗHWUgŐ'n A4j)T=uջIpJÿY0D!rmAe a4J An6 j"T fOt%?*aQMԄY*(W="SVX0"P|A"!uȃ@PRzZxq10(-@|IS_A!^y?*yPXSjo uR**<^m9F#`ib=ssI:f"Ύ-kVl r/ `Өz/Pƞ*,ּ D0P8, 01zϹ%)"#e+#HIþp`\)y3CI~3P1hZAXm=IE.T@Ⳗdy!qR#̓4Fie+u10Xq01rH )% V.!={h7r ﶴtKbG8>~!_v@Tz Jjѻҡ1?E"p:IavAeT2bU8(y(GkV0F/~y^yO|7 DU㭷W,Ȉ̓  AXRYH~@Yy W0=;ŃD"RU7RN_ZYetnaH]6U[yq^.Ԥ7|׻_yzעYgRdR_F-32 $ НAq` U[H> $dp`J=OS9 ̮aX N 8AHPڢn%_b&ɲfW}̃ e] 5$x~  H !xH.ju r!/3~#H*ّOpÚtg rt$sſJbW@Qbd(1F,̃iBB/M:)Z}$ÔvVĽzwi1XY!Wx䇼]xH;W8& T$rv|̏bQрPU!$rT<  l0`=eaGƒ(Z鑀d.A*( q] )9Bk_J,Gpe8  M,Y3Npo&מe{z̃rh}ֆ#ʓJ#\0=LOzwAb%t$xh˸GH¿8$Ґs|ASh{}(V(*f7OAk[H(C;wzZ_LF0D5TA#R2u#Kqćj52#pÃ4!0˃DKc~σXaGB pZVTo,AsO62/ Cr^"q<lJ"c*EWB0 +NxA:d\O2I9 1ʯEݎM2Hd?› 2) &H(҈Z,N"|E7Ɛ4f12#pAXgry;['~v>6M)Ay2x D3XCRrA=WD!#KAfps"o X`y0"PX1yYvBXӴc̃4"ƃh_q.B:#&{|JvHS>wE\<\F‹bg%y W0b  W9ku<^u12i+3pZAzk %C6x$ Cj ~URBR.A\A2\#`B"<;x>~~%02#pÃ4! <\CB7x x%w@w3<7.i, cv>A2.q\b D( Udqݳ(Q%5<3M  Y$99t9k̽h<56>P%xڭ8z 4r_ة*]1`jدO>ss 'xTs2_@2&Qs8ڳ(zw<~pe8  M,Y3N9BL.Q0# ds.r!7JU-\ ec&xNJY2lIcb#b@88==E.J*YD (Vuyq^Kă@b9%!y6~qP?;<&8wq`𨩇UpM\ͤ P8s|AdGiRM(l$ d:xYg V#`dr4AXK./ dA_`%<"71YZ<Q<$_sILdylH~)"Av+ 9a\}<~_bDp0Ok hj}yBhF}x5 UDR)-=~ |U_fd}WNԟ)4GKߢx"ijGB ѭz8;<&аOC4n#q}/A8H׎UH8Oif o_G>i)pe8  M,Y3Nu1qOS9'ɾRw6f_#܁$K?mi*:yq^.Ԥ7OqI .FCHN oyf02#pÃ4! yܳAڵ1Ҟ)!`d\LxvaM62#pAXgr̓fSyq^AUI. C0g!`8{)w#nj0VGXE+5yq^.ǃtU1٥_̃2[-E>Oց⤌㮶by-:F0b Gd!bt0 ";OO?q?P"HQZn'Ra_eǰ sk?) UMNL4#ʪ9n,2}0"| :`w#q%_vuVRR,_]%Nu1C0g!`[pN4J>?S9;bj~O&e}~RI2TO5N3SA튪HNy W0=[Ab]Gâ΃ %c+"!Rs3"Y.hCWɥ [i \<?wU$\IB r_SȥxBQ@i*T|:w*+fJEߐ* _ԛAN A@+W|6Jb+ t'a>zv%$eXެFɃ ő0q4GKߢxdre SCy zF$ `[q<$-$ C<4p18ˆVJ<b~Cf)FE*lt~Ifdw<u&;?KiwY՜X?'G?=oED E$R羌 ő0 q?m!Hy If nr"gO>'ShӇz Lu}bv. L4 4zTʤ.I2Ue?Qwwt]q 5Y ifgYAHI][]pe8  M,Y3NK0a+4IƼI3ui|Kyq^!aCBȕ'-= {ǃ$ڇ S =Z-g|M+ui/W)`/k`>.TWwOA,ҍ\Ttxc*RX C0g!`?RUZr< ? C0g!`8{)+6k=[Ay{rv<$Aj'hQԍd<'!H+J,H6Sj0u7|<Ȏ*NRzYd$1ˎe[y W0b ^u"<ȷ_|{ bG-V;/sded(1F,̃iB<cAs2p|̃CkQ!OA,|Gj^|xdx,E̓ e2Fy&\ 묍asr<ȰIvd4dNỡ 52FỸiBG~|ӟ~/?7|wg'8{-P|㽽8}rB-w*%=Q (2!yԅeAQYx3Z8ŃH,nD |GjTYOAs/^;yśW_|] r A>Cx? /WD)1ROY(J耪4`ar̃5Y0F̃4tȥ@Q=+J~oO<\U&?{oERg*+vi5I?> M@}[ CܓP{( P( ܐC{'eqGH!.2-x7_|iOܐ"!oxc fJ$jB T( E N#0b<I7,w60r3629VG_'.pwOBBrD.1݆b""o<6a]΃7{uL#Yă@ƃ$ƒD M:@E<X[I7 ᖨqSlYZAHP xM[< 1$G?Ȗ<˪٢;& go_D$C(w>lYUlj̓٨Bn"pk냿[oed޷7ҎSF7m/R}҇я_+N# IJn8r2U~^AҸibYSKJ{-QxFX1͑r,=\sT !Ym9|ؙyoyZ8̓F\i b1Ƃ_9~V!<_쓔tS 4'5)UxD Ĕ_T%̓}`7TwzŶW<ȼmAl ̃t}-̓tA_pSX7\\ Ujs?!)DYvZ [$6ʟvW ;Kv/Ftu3̓nؐ+n 7hyC<cɮeZ Ƀhv V:A!0R׿wyge3z?̃1ZyyZxܙ#Ϲ̃<׵<:ܜ Zފ\(7 /~3 '>+O\x2&>eQՉ̓dAVd44^ b?!y'6قx8R#lȋ^Tŷ-!įx›+03b~iyMiki+n˵xN<(i#7j5?1 x|+g!fQ @upp"pﱣ3ZetRx5]) z`  C#(ܓ <c+ n P,FAbUEqMAXVƒ }Qxj [ׄ!!<|k_Sjz{"Al ]8F@ ]_K ]p yg|$y| &,rlcKYA*(91$r$M'[Ȭ,WAĐP0x!'}hh<'Y b[H8a( шV14^ ?ٴ#liݰW$hIn/Wl{L98 7 bFQ0U!Kd0s!c۔@$שhE IbMG%~9H̃  w^̈́h&<?1T~KoōPVXޠz)0/wJ |&psNA%Dx,LSP"]mr=!%H2FIQRǐ=QHjc]*ϳوmAY|#Hޣu< i-MiIIƃXRɈH.LrijbFEhb<wcecd/ rA2<w? (6+4y\88L0%."[+EB$/hפ 1u2^ ?,C-9C9n"TFG.~dJ(<c?yR+k8-ToD(6+My)A!K/Lte壚+yh. &qhSA"3Mr<pHLydBY%OGFz |Xli)_AA ѓ,MTIix70 hqBbRAFѿ4ƿSTM|p;CH = Al  r$ZQ^z9x'Sv "B)Ą+ jA*5eC̃t}-̓tA._KQ`4ZiLJ AӟΉS"ŰN6{:S5,E;J`LEl )ܥ.]y{=:{:,f̓$Z&D½lq} yHB<D!UJG;jy:Yʰ㾧teEҖ )6}R\1UviQ >kƔğ\!St>AR7B7rMҘ1FlAy̓PڀC[lPaHVAB2 w85)“Fa)ʾA%(ì U4d=QoNAlyߣ|xehYHCҔ2>dR dy0(&*l_22̞פ}rwmX ˃>?c6ی0+'q0 ]_H ]p ':'}c$Ԉ0WḄ3nL(Sv `cp"p2sZEc:ubA~|K_ImFN9صL ]_H ]p TC.&@.Ќz ^rX.<$*=!ޔX]:w!OA2a87KuUHʎfa'N5הV3;EOF=4K4!A,gA`1 /_GnV 71ci<7  Q!tlKv̗X SLV4P&ʂLgRUem&>gRӣFV,8FWƃwq ü+eEET<5orBHM*DuFQ+(&$5BTuRc79LdHY52 Ӏt p[Vz 0E5kdw5z Wߞ)#?}jD; EK۝4~da~T.&zt{$edK1/3Eۧ>R2R2:Ir-JVPmtXrT.IKEN%PH|"\BQr,L\(QEA5քJ<<ȭ9'66<#GHD{[{aQ,'U"$V@CU㾪HYUT4 Ҭ0DtVE.,׿~V-wh/![ cC=}b24ZŔq7d=8 7"ᕴ NjbJt!b @̓r/n\ 7K4!ȅ$ '$E!1 BFubbP [ׄEͧpP]:H` XDX.yX%X͇JrŃnaF.ƃ c<=C$h0@#+7^0&Liyw8M32N_<& iLjˍ..}$ QZg7BM(Ўgԇb* E~S^wA^Z ~"O\.Q4z:%QrDG 1} &cJT8 dTOXp$H6N4P<=|8 ?6" ΠN~d<^Z̃6AW1$g95ݳQ_y(q> ̌ j=]^bܰH';WbId(}~A )6*Hn"#S։RA{9a.dU?9=ǃ`W+GB\0퐿8S!`,`vQ <;0QL9ŃfD-(ӌl-6}+hWQQZ!Q\"Aߤ!B"~D}!HEix -OyF>wMo4vdkidnAr-8d zλOO|.S\?dV 9dJ,y}BLA+b[LЫ' ioG!\GT3"TGsRm9ޘyfane^^ }B=T.m~7S!5"˦D=^x/> *^kXճ*өAnFܾ9A: cZ:ݸ^ 1ỸB](t4y[C^Xdl43{'Mq[Q#Rɵ7f_G ^v RyNL__nD`ho~o;ǘϽWXU?WSʑN#b̓c2خS$q7'dAbCɏMEI8rC,Ґbbǃlt˝`A]+b/&R02. ^\ &jق6"`('uyl>1)s\լָ,RΫ e(N7x\5➔ P$GvLzHrVUSCAzY9PhqC 8$ Vs?1 {d!2(9 O#/dD.#=1&w ̓櫌<2ZO]>WA=2n ayz b 1:璉:8AzLy,WAH2Ck@!Qmh7@3Vb)LQ>"Ae5QK{Z1,w^eLXG.ȃ 1&Ƽ)pn#i1OCldخS̃ܩ7ؖu<w']Q2ғw_a׬B*HۨJ3<< 8 DdOh]< W7O~iY/ fÿw|*_җ~'<hTmYDJU%7Ը[G]7<+2}U5c($u1Ě;Z w٫k< /%yFBbV!gt \i|G<!RhVLT Zzjȸ1hqANkXVʐgկL0. 7I$TƬ(VAb寮y9c;Aڱr<&}7't<~&ą\8T> au S"RBFCVq*JǟxNaL+R q;ՉʎV*G,P'JR'u)GN<67CMorp Ur"~"Т <@k)]܁"1c7!s醢Ǹ$nZ\,rLOԒcĮ k Ӯ_'# dAS .I {k@RAQ@ӐB( K!!|8ͲXy'N+yfO*L( Ś?8 |Mg>4k"7a/IRyQ+lk o1^VdIQZnjT)UZD^5LՈF1A^RiUA.h^uĈYg0[h h>SFp F](DL'YkcxD" $"dZX t҂C< zt^+[$M[B< 㢃V9Ń$A3xѯÄBAfs-[-K{<$vI+wȃ!S6ăL)L#d\BE z[|SZd]V U~!hi80 h y&s%v6AgA(72jATsg2>> <Ȱ]s]AT!vxFbX=D¹5Bq0d"[ vi:h/?.fS/@n'Js=,sHVY?Ukml*1̊J+!]  =҇(Mk]pG7$(/R N{XI$< /N!U ⠦4[kG.=؅i5ZSc1bR̃t‰yџUVOg\HBK"wJ<~TCfp6TҖ;+#OQE׏A1"idQOL<8Bdé.WZKM&^[Vib-z2hi04z۠ >tWAJƆ$X wEUAH'ůBȿd6v[d#[KM 2[KA~Wگꥣ!\yăq2Oqj# (M_e{&^׼߼9gN<cihwK=,oL@iYٍ4*WH,B ^_tĹXϿWc<94<Ⱦ. >K~ ū<Ʈ+ƃLƞƃ~ C3x2i4`f9,Rƅ-0cq8UjU-fl-3 v-KrWEcA:G]bfY#[K ]K1^ 7bym.xA)D*d骇l0ރ!}+jH4̴2%V qX>93 Afa|Z|ddkuL?ރ<%i~ Q'oQ9'Ig)A; ^%5 Un!~)0SbJC6*CxVK«Y*V Q{JK3.muK,A⫟{rLhGbz˟J9UՏFEۋ"ТA.-#[K ]K1^ 7bXXYŌ?W^~: yfăTT?AR*"-s*^ v>d]̺wIQR+(|uV>k*vY*H1MPdv9XcĮ t\g/- Gٻ t.qybT!':\&OxÅ!RwP#jEiZ4o%<EbP(3DA~(#;PWyt ox /wn^:b=߻/n'p Ћ)H_!!`qχ(C>~7+]"/ަ<4޶hAZYEbԸQԘcĮ ^<|][!p}p|fN=(y}J ?m{!ˇZ$nB\y0d#B%װ\mRjG *m@d%j nfJFaN-^1Yq] Zܐ A+H('9 ~Eb($A+kȏWS ]{[4d 7?x# RƨBĆK!q+Cx"(*KNR;lcĮ ^<ȺY̹rFAN<GwajkOŞD= b⥛=2#< Э j:|EF<j n_lQTøRҖYXū g𐤉 sSep(N$Y<Ř+:Y*h<C>s &XR%HI\Jnmb^c\#^ OQ%Q(1bR̃t̓XF@< 1nd4mYZ)$gCNAݰ#Qdxn@u1A,Hj+!]ٔMf+PlIU<[2#H xQA(6*9:Hi\J0ŵ0yRA0Ayr/ҧ>i7'k#F^N<L;|G{'\;'C-1(cμFRbe+H# pWŃrt""Pt^Vzd@~~ 4.;/kVc .Kv bũOS)AHL51;Ɵr%@J@&sr_zfP AkLlB !G Q*f㋓gd[ e=}|ɷKAZ`ԞxyX]t1cū 2AZAkAF\ < *&{.I)D[BE֑(in`FA'߄īb@̃ߢ(IDAT5.qi3ŸvAn[T~WyElE*b8`_/-bv=H%uTRdj.?4G-z)sNZ.sYқYC#$ Sٹ.\# EƗW W^k:3#p- M&|̯[!Rƫ JB? Hj": 1HkE@tx{'5jKM 1cbҫMPQni#AmTYEc\u5d^SASkTl~_VM2#AZęAW>X#enAZAk#p-A֞\74 sV:VI{R .HDF|Vblɤ=?LG沧-<07\uJCԧ:N7ܫ(NgbdFx'(d% VTHu(MdEp`ojiR, AOjBL:bLŃG*knAʈ;/CTJD]Q`oXE{GR /ިX[J(>;UyyZy0B`Ldwq\땬~OhaK.{FW_IIH(ՠyu=?Aܩd,F_k7$)(MT"4C?T+*ujH/iTt*c&}"&S/jd=΋0z<Dm`WIE"ۣ~ Bt&7i'`|s (DdNt|Gw F{C$fQtTqA l+n:`02&A4E}@@繚X\ApK|_-5UF6`$z^pOZx*vzuD> yra ڋypԊaDbyKsܒ hE",)jK$]DSZyU|+ֶ(ȃD. HQ8^x0Ղ4^ 7b0FZR?EUxZ&4,7((d5Shk+n:`ăuF Vg~Cyu1/NmL`x1I'1V Onwv'#r՜ \\w@[c2 v7^ o)Kk3yeAAkAF\ PBWyPf귢-{[d^bk+n:`ă}⴯<F1e%JHVv:I IXϒkO1%jWpi۷4<""FMm*y;Zos3:9-kdSj3y.7u5^ 7b0FZtAV[Mȯ5DX]3^:Na+a򊯡 Cӝ@^`X!ndRpJ\(x+SSůXŅQg961զūn%S.1Q,q$qQgOWyP 5$vؒ̈́+Vai/THtqkt/E;giUmx1uD"'h" $I1ZjŔbb%G|ڗ&+AAkAF\ 1y̭q [OV=<Q]1 q1ݘArWc@]ǐ,A s#n' =UPȃ─l+gn3Μސ=p%]i3=V>) 7"')dC,+fwƂX7u5^ 7b0FZ9۽K hփp ؗ<U'S Wo/JKx eSbcK.EciӻoioEcAx01s$;4Z%* dŔz2%}P|(ίY sbdw5ruăMO3ˆ/OxdHʌҀ7Aac6O-԰ū9[#{ qRWYA$~w|{8 9 %AOt?HbfG<&ѵ!>2qD#=OjA>K"#\D܅+ @J9kb %%[AшrTa͑1 19/69Tnb4`bT.8!k7sN9}|fŒV'\@"3ќYe, (Gt5.ۋmGS)#+)><9鋖##>F`=_!kq~Ps,L(p>xnno*na AvAUk/ 4AalhL5``p~A o^y% \N{8:WO.I sάNWsH Җ1l_*idC2ل.$-32Wkv2 EÓSR#3jKUX$zF(z<zxwId&In49ȡݮ9ȡpsۀ5` f9H59W-Ag /B1NXzϙUʆŌ"Cڽ[搵 xq~YfSX1PdCJ$ P{7a% ˺ toj阃횃^ 7 X@_80k%?hLm 7.H` uF=?V y9:]H|mGMQK$̱39W.]JD.JSa%rLȥdE&eG#4PxɅ3 ]YePx+z50b #[(ߤb6rf<'?K8%9ȡݮ9ȡpsۀ5` #8G%39H>d|8jrpB*te Rϱ8F6rvsC]sCk kKqy@z$1"!hQ}u3ӕ4k$MUlAR1959Tnb4pa\|g  .E9*qD!Y@z/;p!'aW;?9:]پd@SX40bA7sC]sCk kKGp ŸXV"AG+LLb;p͵PH LLo \D->$VIz2Yel_@C7MjwJϱXsnPZ9mA䋽L~$~P*te59zZjv9i`Ś9=dLcrhkrz-6` X}iP297LdN舃q?U'^Ex?,a@vhi0&4Het.ա, q 0Jі4]:7I.E[/Csfu")t\HhHidzh x^X9HFA]6959Tnb4p:G]Qw lO@Q&HY.";`L.S<EQΙd;NF$K  $q]åa-Ye, Cæ&bD+XCnD ,\lʢЈ=04IlD`BA+/ %g`x>dCE*]lħ)?v7smgX XlC caBW0:ȭ }D,IcPB@cRR99L ॎ ?љwLw~h X}i !>Fh`槩.&p\u|G԰KxhuE/s~q  o;'EU[3YV53ӕ)N@cJ<'U[)$)nrA=D!h[Yd4ږoa1 +##/d12댰_0u?,TX]ڀ3oBpaER w+Fs:}RA)Wk Uր5PYqFv'tEL.!,ԴPٹ!$G,}'+3qMy9d7\cYs.WϏEq:]ԜYehҭr8b tPP* LhZ$i+ޑ\lKȋ4"I>[lfq⚗X7\>)LՀ$"$kIŊnPZAlր5З @0bk& r_k)' '`Ap$ a~%"k0TۛpXcՈG{WY-ș3ӕA֔-S:̱ؓ9:-u%Vק{.sC]sCk kKGpd<F$%A0&T"_ Һ%G Ԟ_Cʛp.ڢJΙUv :_s,L2?CBWm=[r lCO~HPsC;esCk kK uFwǕ&~G7;}=KGYS! SC)#011э,MR)o\9CtOdDN1A⺘A4E0ej): =#$Y0$6VI5A`Xi$m'kLCUrCKnjIbu>/ݐXU='P \A:П'NZ/ryMO}fd/MZΈR?kd;(ɧ>1Yk/ 4;Y1ss9,D˴8H4w,8%YA.F!uAhrѹeZb֢z" qL$IGDh^$QȾSOyhoO˛F ׀9-zр9ȾAAzm,rogqVR|UXU'ZzpK,N"릮303RB c>w#AEzHқo7cAzl5  O6C,M &s1r!G3W<$D!ܓb9 AA4hX3ēqReLORA+C@Pz!S.u.ZdcdqK$8e?mQBiy`D 99H3W0X@/h$C8eQdȼH?U,fL!>yzȟ_D1e(vQYo st 02!0R)(9@; !dQUYC"MI\]oX4}R䶴t>aWz2 k_E#b=';[sKF4pQ\@}`[-×S&֘-ZLqEVߥϱ_Gk p\K@Y(H GF] t&Qh wrQ"6VG4:;wFxnI$J4&[R2"%yZm5t>P@  ̋.X d݋ĹN،ߙ*{ӛO|j2rր55p.?&iF\% CF'2 % )pkU8N# E H1%CY$֙)dѣ99H}O9?wǎe{%/&Nx[nSɹF.ssgKq(aKȐ3k% sOS][i, 9W%3q\}㵝 c )bBbבP|d'U归G^ʥ ^֭)ވ99HkʢA1]$hh;TDqpyN~l{tvssE'nD.!qgn%8Hù5p)F/I0h5 }(H:"SLpL\F8HLǒ 1a::;>.Tm2br UL>?Znbr֫nK(a%dd%PEk Xhxk7B Aٸ@зB%ȷi Aw o!1A Id1$Fe8js]\^ȕ9o *r50R% L:Mp6*٭k` B8B( b~A+cqŸ$Cð (YʌPddO/)29㋀U!j"Z0TXj&QssI: ]Bꠄ!9 #.!:U;5` 쥁#8FKЁ>*Ab!@8Fז18f1\=-[u ø $j@'J!_U C ˰ ٫78ENDk>'EqՑkF4J419=Bw@R %.!3A\B]n!ր5Zq|.]qsKHe]B9.!5 mNM8F]Ga%؁l/: aNptE>g:z:IJX6VfGbm02%G@Ag1D)rY%r5}X/8ȷѴ>vw<[_g<wsaZȸR%D KHec4p0Uw8NYƎs A їc|dJ `q`Y!Έ~>O}#22RRiD"tJdN&(A >Bjg6V8/|oc#4SKAzo֟.!p.! ķl 4s i3YW9"y2{' YDVA hRC6NHHT=2HSD9HOsMAYsY4`Nou׼ׁ.!Ar +h XЀ99HAm;< )\8_p$Le&1xǎD$$I( f JArǜu{C}۷^k-@ 6F4K-|fݓ/l[oK%fr5k`AALSAju9$pD2&1dHྡчB \TBPB#AXI3ꇂ\Gm| р9Ⱥs?OM~/_?CrRN` X jAY%sj9YqDBċc2c|!ڶ#I5ЉD7"YTDi˘ҹ UM' pVM T}ۂ3! uh?An{׀99H6lo۩E§2 ۬̎R,kQF(\#'str攻K^-s^Zz! C_wͭ_GVdwߗ|ɗ|wZyT5#5cs 4e|kMEN+rYZXZ)ArG \%-D2BCAAdWX`Fxן6I+YA.Ўs,?Dy'3d+YAH.ms tI HCAA&m 4 c~߶S{ =K41A.k8HBCAAdWXSk`4R s{rwmrG gF#8}YW?::Aܐ{qR(A.Sk_7<995/u:5kUzw}_o/,c?\OJEY%6HԷp[ X9Hmw()7#@ +}gκ^׿krS ע,\MD@no]`ۍn`brG \%- q S& ́H'$|7DO!iܘ]=k`L6NzsvbuMbR˜ܑV.2M$! q"??Z r ʉ0Ё$ A2Wdį(8EibA?@AmWԀ)50i$&0iiWA^|EPGy{j bqOG@.#1.N&@r SNr)"0AE?" [Dz%3&Zt;O(P?^?{dNk2GKNSAGp<"rL8HT0Qa Ѐ)5lbHClFprP'KcpO?0+`*oj~);YQ A$4Af*Vkgɋħ&A cGD"2B@A& S4` ` bxj2ANJ1\krD\샼+׮#-nد 3]srྐྵ=NC #]8w}PǏWo{1g XhX<=9MsDvs0@ I4 A$:Af*Vk 9N.w}) 9H;_nJd 7 An &*߸9Hb*:Af*Vk rb2DO.Cq}sW[3ZA09HĚTPET gh@9̎dlrR! M0BCAV[3ZA09HĚTPEt &*Wd^|#+^l| 3;Vsr 1AFh9j+uFk8H )Xs J>s@A>O-o ;~\.\Pb2c%k4 l!?ٷ75%G; 195` TӀ9H5U^9*/S0Q CC\c{"d$FAfv#o:5p^Wo/w|yECAf{Nf X4`RMջdJ 4 :- ?px?qW)p^H>f!(yꩧ( x]>%2Q E'udge{9UU-~Wŀ?[ֿ~I€{N&skjj-d_}"?Ͽ˿o6' || oG&5{B6t Z3[ `я~4駟k.2CL@HAݐYqD5b.Ld&&^@vs}Ҭ " /_w_?Vk8Q '*c HvS藬Ds pPs H/*;%Y  #!=!J!J,Avc" t5ss?Dր5ЯAm;s~5g/YEK5д?`:ⲗHEkXu {,B?ˆ|"JAI ,5n@ EbbrY5` sӛ`uAV[ր9Ⱥi Xro0-9 6A B]5C YAB6f7Yge rbbY5` 4sFbE5AV(Y׀9Ⱥ6jDg F ш^$D mκP$|.FD* &9a䑽Řoӌ:.Ahai Xu4`RGGbrV-t k9&\ȣ't xN %H$0H,PD Bn.Vzc.!Yge sslZq09NGK69ZÖA֩uB|@a9pd,W$!AٷsY'jDsր5pARl "kd pBvFUA֙sYgi`>/}~S 5xcO?/s#YP KbβIk X5`]gI09K.P S9^훻W Lܹ4__̇ H99"ʯz9Yvrk/ ^ k>sua8\9:w.k, qwɟ=_'7Nx'Hs{{! 2r_qA2k Xi&SAm;dw09_U9o: |W~sN"qzQN ."n j P$# d,rEYx_QXր5PM T{A [ЀAֵ9^p9 Lܹ5S|ۣa85.9 Bt OA!B?Fa.u1JXRZ[=ݛ޼{Y5` X[4`E{59W. S9bA֙sYksqӐpHGtЯHO!yDYŐ5|h X l޹yAտK?H k8\9:w.k`w Ӑ"[ p  \'5,MqH@[sݭk`A6* '*Esu59_U9:w.k`w $3??O|*s,]S#%"/|7U &yz|nh Xhd5"У5`Nr?~/v@pݢ!8`D8$  %apSmČE K#(a.[= s-֢k`G ʢA*+р9:=Ax~x׻ր5p~]҇Ґ}s_)x EK L-fh#R% W#_QdG:TŌsڥ[ր5hdݔ\ -밻A֩X~4; o ԈDVi0#87~H>kNuv;׹09W. S9~`Iyw= |g XjmoUzyaUy.;ּ@B:i?9A$Xɹmҭk5asssҀ9:ŚL/?1mXe X;j`$> /WQкݱBwA"4he X5`rs훃kYs@A֙sYkA"a C&rqbZ5` XՀ9m7n}A7Yge 쮁dE% C4dw@kns6od]*dĝ] Cdi9kր5` V mk߸9Ⱥ=|s0y'xg%\lKK7Yge pq2Aӟx;U}eށ>|?-$?Hl) 1z-jM7Y׾sGyӟOHg!O%R/*%f j!.N@A~?;O.@᭟ I7s^ 8 LH<"MGwG>&*(2\yk4`Ts2{id&r:bC`C=::_#&?s $).+i<ǯ80$Aߍ(SZ_yyk@ 29:t.kk DMpЃ3@%@:5pB>_@(`b :.~q] 8s| khJ M5+Ai ε,E^ B!" A' I'$R\&* TYP#Tp/ ӹ50A> d Qch.[ȳ jEx,J+$)Ad ]ۤ+o X5`rֿ𽛃kz. qK j@s9n :t$AV"@JF_x= JBB>25!ҙdu:5е&9_ a,"zO$ z0o0Aqtm5` Xwր9ȝ[nqrVpɉ/<8&9x$d$ q HAPgH@_AYsY ! 7HbItߤ?9%7e X 5`rF-kz+YW'd"9r$Y"PJA$q*U傠!׽_:w.k, , X=/С0>.& (6c0$aPFi%|_Ymrks뵩0Yg8W+eT Ed^P,ts0;eW&qATUΧyJsu&\YXAԃD0*/Ā1>pk=&2D#eq\cr9\k0٨@goS ڥ*-( \+ppP8R%Z2/~‰0* pX~ծC n_)Vdg a^su&\'>_I9]0WE׹eLB\AJ\C>-)ȈK~BY124'k] [Ѐ9ȺVA$$w_su&\x5qR 3I sxkր5` XԀ9%7eAW0"8I~Lڐd;5@@]7q; _ygր5` XԀ9=wmAf t=0Yge qq9w  $ zիޯ~u7Zր5` S lߵ9Ⱥ&69n,(d;52DCArH@UsݭkAn׾qsukDd;5$! 9HN@Av[ k0\Aֵ9ȹpcA LܹzmogC;5 EO1I0D+틲/M\(tob7aMk׀9HS#CWfA*/}/?xY"pP2@G<'EODd Q '7)MT* ̹i#tֽ+d$> opO4&)_'z87 /)A]|?Bd$1 D!% y+Hd8av$9GX DAL̿?uozF/rk\B~7>8ACUȃGp_'xqsDUE^# keuv\5pa &/ 8N hBt@ B^-4b*r 9@ڂcM$5)PoKq] 4NC_kkF4` B "f!,.+eh#\wJ6krYPܲwĝ䈟ĝ) 0X)7ρ*)?b$pK]!UpEQP,%7Pb) $p皸nquLPdUz5bz~]kkhM Z*9G9:w4`2ӏ䆻1DkdR  TAzx]kkhP #Ȝ]A֙s5sfOfbxm̄,p A9~C9HN@Azr]kkhS Dhsu&\MidѻA9HSO+c Xր5` Xmjd] d1YgՔAzGԟd_}Yր5` Xր5` 5'0djjEeA΁+J5r%5` G]8?d$Tր5` Xր5` X59R d1YjNߠAzGԟ ~gMo5y?kk! `Lి*A>} _A }/C/+g՛s]8!6n;'K41>8 s+kkX9#3O`_~饗F M"a<< ,H'(B%sHchs4W9w<~So"?7>_q[bZJ<b!-tAh9kk5PL` =5)@x ̋,Lqɒg. p@>ȣ'OtN9 #*dqH&sݭk \D!Lp`'"3# 8HNCA?.kk!sDHZ"? \D뀔*P9;ܠ9);'mzrt@$闃Dbrnh Xր5` X@e 栏F\ukaD HAF`X.ϹHq-e!809HgsH.A!  Gp<$ ?#2kk OA>%!w_ 8Lr(9iȁ`chs;?ws"E7@$Lr  |߈5` Xր5` X@;A1Aqъ54_8x+75` Xր5` Xր5 uMmC_|E@ kvA*l_v_G %.-bꏾO1Tj Xր5` Xր5pa AyO#b2A13<裏'.9ȅܚ9Rd"=ȻO3#oCsWհ~uy:|ր5` Xր5` Xu4PyǞ['Dž@.,]+.^OF<b! 5V TA~-k{j*zjS`nO`K`e,`"'H$?s EZi@%8\D5xsap /f:0 YĸXNAC%䞏I.@@+"Q:X?>X(DlVC$' {};ր5` Xր5` zlN8'5A=#D1d\#Q?⺘AbyR dK9$.DxEvPxYiqMhDC~"''tÈp L+E8r(#08!9P/j #Vh "~B.9XH|sÈj_h npnA.` _Uo(D_ %#AJE2.Q9H9 ȫ^jX=ukk5 loB  \ Ẑ, %)A%X35` dYÂ4H /8# pϵ.F,CYb^PCC1b2r2kkA7w=]vs5`B !*1V }:AN"%A^!d1o\8Sr׾_?kk7WA lozDO ŋ/H.I4OAE^bԸMJ)f dWͿ͹F4W>jf#v B$@!pCp $Dz $;a|2kk@͡K1 ڨs Dn 8R^皗\q/d\cW\UH?S9vs,ɟ#h},|~/^ 1w Jhd1q\ b@>(p&7!׽c׼5O>Ag Xր5` Pߍ$a ]\P/0R9Ȝ Afv2s^Y9Yc8X;1>8 񾹕{-g Xր5ЎB p D@E aƼ\}H,&EVrQA[m/s:AA#t ЃA (Dy& o\B"x>@yQ:n*r !IBh] }C=1s_7򘬖 ȾK5,k<׽aϼeLEA5)9݀$H"wD0A+fj{0C?ŃCZ 3AHCp $L@586sA7xlw Y- <KzZր5` u[kvcASE  eACiF6Ev_ AE;AXpl^$ t3}C.XG{1^  'ҵ䜢c2A1p'Eh&2_C ]BVK3_ր5` XisZ6E=@ \B"2 J_XH0#LOA@x ER,w$AUYE3nHA;@"1J?8QJG 7y(|ɸ Ac2ł0*Ő Q3qjp'soA7!!=[eXw&ȵ9HtZZtKH>Yր5` \I^5v}V MUI]Os^Y"Rǝ\&'N0 s}cKji3]B*w;.k2\2M6o}^&CAvg <ղ{A@s^YFOdӖyk$wZZ bݎk<׽LS~#*훃T"=r ͽ,Za2r!u.! 9%rkuюG܅mcVA*ӌřl76rY,U9Ȑ:҆ARqqր5` XЀh#¶] D ͽs K]BVKwKHYր5` \@^vŚT3n%5ʿ$wXZڸ3]B*w>.k\x-6+|@ڒ &G ]4n%,G},GGޘ\ǤIq$Qd5kumCml9_A"1+ ͽsR Isqk_-ͯ]o!ր5` Xwր_wn{mlgf+'06/HPDz[Ns^Y|W}47{ʶ4Xji~=o2kԆal*yG>38y'"x |?AF^|E0\ǁ$Kh$׿}ٗ{Ps7"v50i] kk0%g8HC"wm7$lxNkVksժ|F&A1A$: eAPph"4n2Sݔs?D ]5` Xր5p<=Bאiގ88?E?R'5Od$)JZkTs^Y9AjwxA*?.k8H mloĪ [pxW*G BfnA7%g9HS+c Xր5` ր纫UwM\6)>wm7$!2ipek\w.ѶAZ Sݔ9"tc* 0*)J24 2ր5` Xj xZuh &jgdnA7%a_40gm\&Bp, CnT'Xր5` X5j]>mc{<;N9vs,Au4<;3" ;F: %Wn,9#(@Q ;U~b]AƤ,`U'P86O \a=q18D\#$j Bp̄DwxA*?.k8H mloDsΒ0nMI9fc&.䣗G4G"rn,# P`E=+v\bMT+,qA%90PbeY|r 帏XMU0]ok\ͺM6ߢq}I(IGF|2A"%&~b5{oЭLrAWP||' [ȃ)?Oά%nA7%a(>Hb30<@@-fQ7,9HS+c Xր5` ր纫UwM\0=swr݀cH @Ih8n t!apAHCڙ+a ݠ0ǡ{;&[*vNkVksժ|F&A!;\$f4#F9 " "-Lຘd-uy0nMIAكs"s:WkXuWmۛ!aF3eF' {1:2N*$XFPӭ#a ݠ`răE"s:W:|t4bw9kyſ߳;7&eV  > _\-€`%LN '.l dn#VrN :YPwm囃y4rcks dܹ'?S?׾M#Z ?{ڃU.ykɟw08)^3y|݋;BpG{e G<[d!28k0T-vdze~q&qRKj pMϼ~oSO>xr~RU mf\Xk䠙@M 5 $ , +_v[Wp0 _x="OzJeil$"sE[v \`crFAmjn"r0>kJBA^zҳE/> x^e)E&iqN%3"! #|AFd@gCUEdwCdT'XwЀ9A3bAjje60s>s)Ƌu1>xe#` @ ^nE 0\!Wp22bF&X`FPROjƭriSs 4b`~\_u ݍ'9lplLN J" dғH12d (9Hvhxz4`rLXsvY d/D0(Ab^|EBvlBdu3n8AH1x.` 񓖽$KQp#LF\Tq }@IBV%V)IU'-wxA(\akw A^xw'Ї$l?Skxtvs! o\ a`vʳ5٘_}?0c>ԬJ.V`jxamb5RA<̣'΁hϥ_Z;Lz &_A`9 ?#%[DIB #A[A:FsNն#![a I.QĖVk2֕O~wtGnյ/y@h{n9-V|ƻ#zkrۂMmE P\}+£dݜPg}6V'Lr*E$u9xʴw놌ڶN-1R°ltA2AcbE;qU.F1A@U5.$6n u1aS=kkS}c}Lp$q駟G?'ES}GbdIJ,H`pĔźArA"AeшL_?:So4hoD4X8uR̛X#Rr.ɹWȄ@rS\De"ˈ>y[Rݣ]Qy(i(b3&g!=X rL1Vx'pA9.+"2c)B<RЭh 9hWz|/k,A.x Dz&A'~ pi+F1nIA[AʔS  XrU*GT d$v)- /u1'W/ RD%XQ+/BFDu7$b##͟ K^4pT@q(pM5N,9ᜬr 4cJ΍5Es$dy5X.f"p&$o,W.hHbo9*͉؛\c(SF({!IΟ'%ޒW K ^!`Q 0VH\2A^B&vt@l &N(E#RӄQE[O8q7$_2A(.'Z[>bGs }ž.vkhpf1-aJMq9༅{=pR 1 EN' ~LI‹}nH9ԥFdѠ,Z34Ah04 %)hobd@FHAbW P*#GHpJ&A |8Eu1]!kE|9` D 9E>82# D X nq[dTzFqJ %XzZÂXAZ<.67ʝ[R;L.641o}׆K 8`:@_čim?nr>lK'?ގ犃Lʏy 1޸{JsR6G~~IH͘&sQf {Sr<8VCPO'uf V g$1x gwۃN9HT1D(E@cyYڗ F_]{-d/Ile]-Njk3jI⤮.`n"AV[AK.eiր5Ј Gn(䆍>.H3,M)C ;_ϻ1ec0yDO^qú;LUAQhTXg$Г/Ѿb_i{=Yc XMidԢ -Bu4YUkf4GےxT0sOpM Wf&Y14aW F[cgC/WgkA ,ôv9V qA<]o ]Tib93˼ݖ*9\?!cy3x4A x 00@'ܘ@ux!9Tt'cAK.ir^khV Or 4s(  8>Ȃa o]r-'N­' # Q|C ChXE㧫C/Wںȹkq \`crFAmjnr0k|z9!`ЧCbVG ?篋I8%9{6'X`-%C/W'k 4)]VsA0az%0`cwwu1_ɜ7QA208H ; ) rrű\ga;h'\b]N2)A0[mmf,e&O46_WXЕ!%T~| Xїxc5K.suAAZ0׎E@ [G?.P =}xLނ贈ØFA\%\Q/"#FJF @b 5tԖ~mSͽ ;ZE-}ž*?w(;7Y&j39HrZܤ9SgGA-R#Б$R@# l APъ ?Ss;P5e.,Ѿb_i;>\E ,\irFAmj~;tJcZ`"IV@5PZ\#,@. :Ӏ0ka<#?:{VjGNvhҎl9F^/95iǥ.r)6 ,B;<%`J2V$U@qt;Ib"=?'9B_OGGktUύ{I+HI9ߊMDETq#ut ؑ{uP}aI Y}9̆K;L*O!.n&q|XdX5NLw4wx%J;:$" pt ;Y J R0kᵺcr&'/HqAb;2`q,(r!~՛(6Vswh_r.%` $E9 MPȃ+S .S\#C'U N"UMxG,]dqC'y|Og=j;l+ʏo1G-]?U8z){|qRutq=򸜃$-fxes hꪜpR#ø&<ĻhHD8ۤrɸFH+̢ H>E }5ݝLNƟ_a 79+PTy9zR[@Ꮪkuh.RC>=\baJHwx%JuA Ft`Q}%aG(*IJ`LLtQU֟1Hn)GCq9DAb*I#s!iC|EܯM[&|hwhG;\A`C8)fA&9HnM*aъ0 OS2{[.#_v~:8^EAϐh!ro9H"؇8L0þz|$Lxc/YpFGǚ3j;Lӥ$_F}5ՙQ˜_83-C>j}žN$Wjm=?q/⋆gq7JS$ԄD"V8{9NA=aAȶ#G%+d Œc3j-sĸjSkY~iJ!]F3wAD4e1L Adh'ʐ-* EH곥7aa3m8t??{ȥ4I>2AhC>bt1N=Qv/SRrOqBs}0x\$O\OE3S8c#>q 懲] ҿ;r$VJ(E2dY>Gwx%J혃\8\Aow~6ŗ ߕCR7N|<~WO^:[R/}_OKqRjyUV$ OAS_ dyobZN-sAK-v]FJuA;9k;"i6 EЬeI:H|xs砾 #)0V %G=.i)b0ka^cb#nfއc;=1Ž&T~<(*z] M'(zZ zϊ zwqV!ڗ\+mLJˢjkhzNr.k"L^IK'oeja3nԀ9Gd*?HˀcfzNr}@v8Ak1ofUkr=MEЯ'ͯdʎl s/G9HF^?HQRcO(Eg KXsd&kh9Yq뙲G;4oeTy!f%"F'q}dFr0}W \]>#ri:T(ŝAve&dkTcӛ 8f֭8ކh 69e\ ͅ+o\ /.u1$XlNy~SS;b]vK.vwC 3YCzyg,G;4i!erz{~ABN1 "B$ { T#hr@lZk11YAZ3h ۽ 4D;ո&Y /uY;L*O!.dWH|h_r5 r=ڡ9He#98st۩ds/6v!pA(l<,SjE 뽬q9wx%J}ӛM_ Z-u:yȧH^zθs쒦XgvWXhV]j>xs^'1T>xgf*&>/?x{bUa~DqM4i9ίp[a ݗss{;omѾb_i >W׽W~Wx\q9b"GNNVjf+VV`lŠ[إ>' A neQ] 82|! uuwuޝ_"a{ B$ss(gWnąJ#! :3 ;ȂK.6qʙ0@uIig8PxDt9+@ 1GN__T\G{Ȉjz%y/"(dftnHx# ZQn-hnba9=EbϐL=c9ȾF;!)Փt)jVvYh)D= ;اkBbub7N?I8e$ϾuI^`r-a Y7"' =C #rhn/͏L |Zb SE\Klp;1ˣ; ] U{$fƊ}m$+ZNlYSdCTUUNpd9ȎO0ˬs{;P H.>^=(hoiOF ֺA$6"Qexr-Ѿb_i}0gt(~e(YH;L&ov0SEhD&VNZ~+9!,G&B9ejUq$9Ⱦq;"6 z⺘HHe jk"]bƛ[@[RSc c۝;LNs :w!GDH8$ X+3^DwL^;r/],#*f G|Ғp~{ 7Ґ TNvN1enhpJIArp%ڈ7b{ lbI|N"hщ,Dߟ"ad̮F=f;^o w@A& @CK=bJj+dy,X u's?H/o$^A!/e2D! n&5yzåHRlzA76Fd`?H43F+E-\v08k|VBFYU86uXe4Z]~AUGM}Vu1,~c';6piÕ ':rqE^$@ Y$Wp=҇<%0.B&wE,7ݲX硞 uר*xL GeA.6 ^\ipG59y{41#{Lq=ANAjrh*@|v h - "7!`.D?-zuܗ bd" U=BP\TR9f>S%_z(Vmh!#e+ߔ }ρvX~؝۝5RssO9RUNp{Q &n(Dh N*'t)+dbqهRՂt]0*TMiruL$&(uKd6j8Ҡ]q hu1n5psc]gssko K.otnTc LGr 02#,#0D y̚$S>P "JdJitWa.Wg`C٣ ZWL)G;4cJ1侊0{\y4Ԁ9Hk}9d*/I`l2`8p Un@&nD=S&#A%"AXOr 19He;l]Lk/c`ܧJ iwjbb s]d KgG K5V9}.&rR . QxTHz$$Z!H}Rj*qRrXVYF)q(UYQPOhƳhiܨWdn9pѰkP;r"4/Z' Ks>!b_1FM.&NtE '5@ Dn Ŕu1IJ QUQ:Jt11%` GeR\!WEF.6_xd6nl#IN@v~ӏaDpȁ:߱E]L6AShbb }9x8_˫P99RUN_\@I?H[aB *G̅IX Nq]"#[2 "zNl ~0dd'A$pNL #Bg OV 䖅\L6Arn9Hsoզ./W.Η9xtssCޭ2qBiH#r\BG&xKZ0MQ,ǯyA>) K5V9}Y*AS_z5}RlЋF$˵˔r&YLFק Dx=IOdhCF ip Qh"JUh3?2$SہV 0i 5L^r$oh/drA{l!Ea06ʹAA5s#K]_Wj⯞Mh&)繖_';-A݊bJ“SP9Y9RUNO,?&w9wH7Rz9 xpƞb(ȋȱqC/{S/}-(+pM9F qɞą'¯x 9 &bUpy {h2WI~[9ej'4MK( QUdA'8lW&)6+&Ss8Q/9Hsoզrb;A"b,tS9"DO"᫂NxdH,jo#|U/7Y,X ۻ$\D\.a! w ?eO:Vp_٪\H& NY􎜬d ز #Nkac@f&/6Jiङ9ZoPD MB$Gcsh̬rh>I4vC5l[9G/c9ֵ$nh0e|soX"AmL+bR 2Y:K7YANO*R:Z}0CD @&v+9 5$T1DtH ɰ쓃q"tZG^OGލ[noV|d9 d)Ë8ȎSbe"bweYS: Wr7A.6 I`:=9'd*7uZʭ8HG 8g_Nv_T>^4q$')罜8j- q8р$! !}n &qH;&ɑLAppLhlhjo0[r^ssko $@@<ԥsZB^GMbz%e57.*k,Ev!ld,d*7{WPu x ^=1:ի;F"aL}h2M`8o~Q& g*Js CcjK0?q=Ȋ1t.\Ga>xI59Hs@)+pEshppsG.A ˌNR98HN_Ɇ$Oa,âءsJppDFRt;QBQnU=%9d*9#eD̃4&OU(:H$dgbsz)/{ =ʒ('+?S^l"zbTf2V(K:dTzO0TM &&h%ϓx|4 g Oe! ya;9HfM24@1Р=i\QA-rXssko 9 sɰQrA)y8m5)iL~;mQ,n5sts> K!GP K5V9}ApЀOx .$p?_~2J>x/2oĭ))_|xBL# Mhr#ibMUJ)n .K8wběus4`bb 9X2wwK=,5?Y1Y:1YGŀn|D!'.r! .$ 9r! A76pH8$`Y;f̎,,矓bW7&K+KK<+}vX\s;s8%0Q2@1G3W Q%[mNˮNch59s9RUN?AA Q pzG׹&\$@QB?BPbbL2Š!zV nG;엃4-TJ}^ @0i#6Y:K7Y9bh VйA":n)WLD>Bd3N'ЃF╰\$HxA*[_ڛ.79Mzm=>5`2d3eTc/ |д~".p A@X bK< TNOyg,G;?HM 9,sCۣpssko ,,XK9H BD.W ZςU-8ǕE+hH%L6U^e{}zlo$h YVU3=<vq j_7i{XBr\I/9d*_A[ b.$ u7%=aGଓA[ Rܜu1b2#fRD \#\_j5d(=hE pn'&@gh{ssko \ z99B_;%999RUNs㈁9௡@pw sa .j;[3~RvS5onr1X+S:ʅ8\3@W[tƷ$ _16nj[TU_Lv;1a3{\y4@6?S/o>2], `?s2ݲd?ĸ.."׼!+n?;  A>& K5V9}A~,w 8A^ToF/;weEVl kW^LJ( &/⡚m 8"j´)hkA;2Aӣ)4j)08jS:5b3/!FXV pDq;'b+NRNAA5s/|Kޕp [Nip':+v2Ҩ,&怀ss 31_ǽ5'Ȃ^ۤ7 BAAjr9iSXMsu5|E;,4$܋[&o8!Mi(&|7Ś4e*VG;,rd6p`Z,$_T:qA0R#^I XIŔŮl)=pL^1+hf/g-vv;#AW 5sR^>dt]!d&2er>3:蚡ob7 Ëa}AO(uYs9RUN>hw]JIk0~gx +"jjwo+ ԤkZT0 iqmh+;6dьG+[cM>Cq"C1PWۑR뗊5wQ7cbssko $H蟱,O& `2~ POE btuXcGH9Y9RUNoh3qqR\\\$U& ȹ9c9DQM I6sDzÜ):8%hBB 8׻̚Q|6!S2zGCD)ϗKEB8CKoug9Hsʣaנ&98:\% 7_ldcbTcӛKs!>_zaEw^(/]99ዲXpV=a-`F808mbE3dW @Yg3˩]G2Y/A&ʑzp'S R#FbbE~C$`b{Ś=<vq j_ _qM =ָ'|.|32?}>9(rx;c]N?k11Y qxZ Bި%* nIIk&P-+J'{Ŧ1Yy"|!;PMa){b * F&7)s3 J$oh笉U-6͚hM1\(85+ŔC]Y䪎 &;Q%֟&19xϲssko 9dkZ8q[dD,W:5\{b)b`+Γ[;KE Kg K5V9DAlĞmfC#f/i03q9Aﵨ 񵘿+A"6`l:v!C5i]'嚗طW7Is󣑶Ne.1h2krjC]+yʡ,vr+$DQC%y3;޳9pѰkPC>嚃,}LAjrp#IWQp#1C3D }sڜ!*.})V~qC;%n9g1nmb M.lΧTJd'X͔d5Pl%ssko A0kʏ񥉇ۅ,,X9\'MDSCOo~D:s\&Z!,Z } Q=oD0ӤD!Ex3Q~/*$# =AvS8[%/4Ebf EUXp7QB`c(gA<+1DGfxt9HG̪,}Ajrp13' w:Ge1Vs&)+_"j,>Iۗƅ٘r*Ou(W\M-zLQ {)dfd35p72S-NVGW u4vRAA5`Z7mtcTc tyB2p> s9u`zad& ءPHG+T_UUɧoHD*9$.f/s5ie> +,{id/M^F9HsཆӯAZA>M K5V9}1N*)2<':=p.^CaI11A.9*%r~HLYz.f5ie> +,{id/M^F995зAZAyAjr|]L @Tu1 $,{s55 & EJ7M<>?VRE%QAXX.Ú5L\AZ{٭9 9^0Kcx"NvR*2]1Y4,X?x2й#^LA@q,% "a\FdoV NGuнD+kbJ>CQ"(aMlu+:Yz&vsFt[lVWJ.գ;޷v_를aLpfrG @9HǞ^(9Y9RUN_\}a W$§4 pcskC@qI5MBx%¥:#}Q@F8 5_pKA-nR)n#eh$.eIdcLpz+4Us'\4s#:DNBpw'?2~rvve=O&gD- .r'8 d*Lbqj_E- 118@✫y.Ouf荌_>˾^躙,,XMqtDcsqd" ,*n=?'A NquR2 z͕o\ʼn_ \{ wP-pE޳&Hrz"2:0MH hV(k40.iVnĚmΨ.%S´ı:t|۹ }ρ+]\_HA+Yac7/yD7WY9d*oT~/S\ϙ}v?#_ 1m|A,gq2$Y $ akT`Lzp|sB&cc .ơQL&1Ѕdni 0LQhTɰ2AjbJ I `e4Hb"Xn,KR[9F2W#?|`Ls7Y:K7YAz%uq9#Oqd P!Nm- A5uLz)^eѐ%bi-C w9pѰkP;r9B,rr?_ Ks]^9t@VK >Y?^^ᬒdA4d wbriL߳>pmތoSz7A8{&[AW2g$ +y3[$Tt;<.M@svt~i{kbb 8}Rͱ /r܉.gROstsdKH39HωGkrU<ӇcF{ (%$F К U-҈]-Fv8.FXAVp+ds7Xѕ A5FWbʽ8Cè뇺 ~ieh5G;O8+31}ٗAh1iN,r9d*Ac8$]krڰC}i=?gr#b% 'ahw&- qĔ #~' M S)!Y8Zq-LbxzշP Qы)8)!IjHO*PZսd41@OOFE'EAJƯWKxD=AAjr:dG8e8 zÈWMpKZ^/>kj9 RY.D\.~ŘefҖRzá}s9 Rӄ44ۑ;Q)Woɮ .Tijr8~NzI Ê;$n/;{4{\y4Ԁ9ήZ2s9RUNs$ `:ƯH>t aJX q]䋉$54ʏnպ qmW`H=AFR_W wAA5`ZltnTc'X;ԍߣt`DW@8PG"U0ȘԄ$%ӭ!Gԧ9p\ٱtsy Q }ρ+]\0i/6Y,XqG8P~A׏A 4t||'z0WA%IMZ=OOs,=ڡ9Yֲ{ w @0i6Y:K7Yb_N8H !B"(|D8F넃pQ\뇪31&Jm8>=?A5Sh ծe=<vq j`G.:|jEd11YsP A1A 0rbt0d(SAXGbt&;Vgd{gqrL|Gc8' mvH Ks9o6995зN +tyۇUd,d*/ #9d!A/j ~DIM|!q9g8Wl9ȊN⾴ VKr{e_ '7rZZa$2Gw tjiAW 5P ܂tHX$Ɩ=ۓ~$":.D@<<'!~Bьwks"bu KsAy0CxWls8^gxG3zy"t7}Mķ"8I=(mKApiu,۟Ẍ1ȍ=n!" W&dh@W49cH\޸ZPƆh[U@`yb|4a'fK1nfKQ5Y-!od$N>jh %L\'qsPĖ* @9C'q]/:vܣ#'j,vgq\M&uw{-$ύO)]9Y:9y}5?%_O~ӄ#?(Y\W_-Jq9A2'|)6$c[LpJEQ(Xn|9HjAxkkO-`aT 7^|}K{Q!PiJAh79Rhzv$S2p F"96.a&ո AC-h|k$I hg[PR|BAA5`ZmB@A#$.-#.cFp<8 6AWiܸF] k׳6N,b|97>21Śqim{}zCsވsFj=ng욜svSgq˜+8F< #URА܄&p=Ad|,.cAJd@}D$u {v^d{7"h @0i?59hnj.F95 W/d?2*Y!4S\hr:0HWUTxC f+3I\)s]z 8h{}cMK,oث# -<Î9#2kpy j Qq>)Wi%P@o 9/221Oȃkd$>A[}G84=wu2I~lW\]*b_=a_$xaƼHھr9?+FJy 41$bݖr+84P70FHƯY[hq@Zu ͫWUrwQebqq/b^QIS>rQ :'=&5~gd;e;lce/hF=AIquf9Ȋs X|WLĚ=na:"~tg%:G_9S2=/B^s9ni<W49˅X܅n*b*w|thmrw@YxQzNrVD$ϩƯJ7cQ+b (yFxxqKRH‘y&UDm0^Y:L^諟pHFn-9"N93NQ>$Өk5gq=H9Z eՉ4qhNX@cd)>Tn&=V4?TN)oPssko  Ws/HŔJ" &Cpz}AX1 ?>BXKQJsܳP9p vw)ZSzNrV 897^F|&>MQI|rQ_@ZT|/S+Yze:ATo9A=F"FD@q&ڗ 8Z0F" -6T9 5XaJE:JS t:A'Ϗ mwDs8Ǫ NpӶ[g4{|إ?WW/Q޾C)/"2veMv*̛|$xQ$6 LGcJt,wT5ipv@;AZ[o"߽#F/@|E{9ް:_|Wr9A0Չ&(X0RqtwOY[g|zÜ$Fv^HFMr3qbъ8MBL#i#vZ#vb) "/*~WM%Ab&OŎ(zVj\MWʘX}k CO=MO+Gb)P@WpXĻ>y84`Ra4vt=?h_1:3y*oQ%ۓ'/˔xLR!XR@'Rb1 |NIh2QQCEU{Ƀ ZW^$8R/ s…3Xe!2d<ŎhhD~R]Q9HsȮù(r87D,^2O&wkr~.QU>A}"\0qx;㸷}c|bL?N 2Eŋr|OVSa(?y2|o9vr;1oiPV0IFD2g/"8ݝpZR-s]Ax,L(1 #k|ok JrX}k XuW;M:mr Q124K5J4ӰC7(V[gѾ9n lM s?H2Oཆc%0pZ Q C/eZMF'& #`.͵s܎Q:$gwEݣz*'JQ|UE+ש(4QZe tZ$5G@D>Ds|7hz4-T9pkeקpd^Tʝ;J19Mb45E!QHl\"Qu1=yY \h܊:ĽT} 4+>ƅKk8F™? |ehd67"!-^ C/ y48 y9u9 p7+xslJs Ns~Da~bt_a=a1Ne6XAqMM@C'4.0Y.+NYjr61c s]!:D~Tvʞp/[E~ -}2g]S2==x41vx[&{Ln悼u2r̫]69tNn5v ʌ?N\WP矓d㵅U[@bR8,Pc^\.]az+yW`REdf^/ph\s@k'`2dђP>*bѮhJkTi⸮G[AH&pb5$[$Tҁ$=J튝 }ρ]bk {KXs֞gr?rsKkq8kc<#3_W) F2t~@~5獼N d57"?CTIv^Q=!udoxbvOcbb ~9G/sngoM9<a:Ks&sS:C~ǔ~22$0VQ A)Y1Bx t<\.4L#XU)U7QG=?qɏ^WaNU~iGrQ-j |1)RU`\Zz7{p~9H \(r \ϋB hQ~zP@fvs&;ubA"|u{CqBh 4pωpN.?s\DB i@sv.P6$Ip ,xuAy4\4susE 8矓DlNx/2~_¦$A.a2fzÜpP%GG\+`)1'#C,F9d|X1 EcY%]V|W q;e^4ZʐC<s)qGX26fqonGEuc6ͯ7ա1=jv#KG$1oJwrҷ/^\W9AgߝxUĀ\H#rȀo(y ފB=UpL&T5еĹwA}\ \)>X9; s0t PZr12Y/b Eh#bdƘ80FPⰪ8 >ioՐ8ja>hۢMTgp}&qq/d@Q]0Qp%$-[9XuBqkhr aJͫ8sу&ա =gV ^4@Q]`smlä!RʁBn,=U[x;Gzlݻh2!A.;=@ܷ3"$Q:4/!"!IH0\ U(hXa\İi2W`d ~Z/s:]ǡ8aY8o4n?j82؝6spHQh843ա!VzXy > t79I 9Hs|Iy"$vYV 6!{VbIs tRshsNZuinG{lN^X7sR9a5pY Lru{9l ,Vt5 "'-yA.F|; Kq9A%h^]3 6)WJ h9Hq 68F;D@dva E{ E}d9H.pNA&{섃Ȥ#_1 {~ s:il'ҟpec]A諬$ /X7R-]O9Mܦ9H_]P=?'ķCWI|'5ڌ z-dh 6AqLaUq FhظI %eNMk?h*7յꔱ?RcABӑӄƫ9*bT EW.=v <(grAA2ZIDAT50A{H/b }t-FKDq\7:;D+X7n$%OXG9}Mt&pg|9zRzNp|mc4E#D%dyTpPl1Ql7ojh dуr5AЂh5>7!r. !ͯhs;ELV=ԍ9P]LL0ykD&Cm: $ԝ{Ji {\[+n25#tbF$%ޯ8fTttdΒY H.yL&6aA=?'9!;5 ŋ|M_+F $Brvs 564:u\>ÕkHH5QZ>nhXUŢj描j4t>AK4:s:g9iÕA8 :-Cbxdͯ`N9b#On'ޯC=v11 F$@9 Հ9HyWlr~9S_#$A.Ч{ nپ4У9H_jwmĚ?H]h,-9As]Igqq)ir,탮Jϗ9S sp0in rƎ4uG=?A2]*ӣ6Aл`8MГBXOJX&h۳JҧED wssko AVw:hbvp1 $r T"8B%w^BaT.G;lTnW\Fi׾smvVh>d;KA/a9 |qRe\CǦf.iAX}z\q;=ڡ9e2M׍X}kdp/9 -O](I9Ğb z-'j9lG;4\)s+Fr1 %bo'_0 ABOu} Bq=ڡ9HèS9H=wT995з6r|]aMm+ @r+&.pK]$JsJѱ*<s|7M&(weQ=an¾5ʲН,0^+]Xlddu[R%Ux8 }ρ/6FyȊ.ơ fŒe `-c0_ MQŠYh:2nLPwֹOA(k=yn YS3*&Zv{,>KZLl2>|u{C_#H8TE/Wڵ o#:SLy raΑ){uėcr[x} 9e؛HIw^^|/& r E{JȌabk$\'x{0:_FvshEhdEۃpE?eѐpNCUJ#1r![EFn:prhRaVq4Ȼ͛zĭ?qh=k#qpT(ZZٚ6*W;ŋ *C,Ux_3m嗬Ab pWKB J\"qf#fAFusuxAZͬ[IttO&|WaL}.a d8dE@x]" 5 VMfJ3JzqMa#⏶h21(C2vV9ƓՍ)h4K"!{h0D?A.2#jXKز!e&)^D!糉A6}%d-T >M^aбw}bJBw;Gf 9'ܫtฒ5`r3n=?9| aި.b}6+G^j]"ߕb")?EzlK&pIZ6٤P,dE[Y#QU(9kn~ ƻk)$E:tx# )Z_tܐ\-_U.+hl[9]?HA4 Tzs=9 Svs@{N` oGF<=2_y>9=4 y2Db F*hDd0X/Owsh$-hՍe|"cE~MCZWYDSlV6WN\xDGѨXNIt*a!`s :b{N.s]]C5P q$.o:U/j^_ t>#q9Ap`0>e'S)*~ՑJ,N3RL6x1ʷev]T"QA@$$ՍD5DxLI9wd] 1VH7! Cϥ5eas-C/I5m@ATƋ%bt*׋ZI3}odyԀ9Ⱦ])zNIzEJH eptPN,Y]Lbڣ \B&ƏIuF#p\E[ =dHI-Rɏw[dN@E1;/ jyyArֈbg9QsG̮Re A?'~Rg^ vEZc>;)d$ A*?.h wĘL0'j7}8ћ." ܀^/⻲DS9ɄX~Ћ۷=aD3SsG 8]jzEl8(a.&SU3)lG`NJ.7S8q`A?d8zqS^5S,D3ز2n2ײax] 5з|sc_?)ߔF[9r˯dr7`&߇>spԎ}D&˫(h  ix!r#+wp[ǑV;`0u>s|{ܞL"j_BMҾ6\Ch[;r; [۠rB0 WEuŌЦ51]s D{2%$ GLs~wo'ٷb=?O \ɒ.m \ۿov*G;ovG4ZNx~cXڋ5vA`/o }ρ1J5#iV wB!7o u~`Pf3 +e8Ɛu&;V)dG[Tpq7.8HzpAA5`Zmr+k Z~A+qHߐ9rk\d=6[OOOsZ9=ڡ9H;& x }ρ+]\0i_6i1qh'R \Sazc$_B:E_rݯXuT(G;4`u0J11ր9Hk9Ȗ)6|]L [% ʋ H?(!ÛD& LehǨS ulf)=$r]4`b3H4`TY u wrjCe@eTs()'I" TJAAB'VAL|'򷥯qƏ E*ckK[9ovsu/"&UWpζAJȮF+zfssko %39zZn5P\7|O 0~J@W\B9\4Pn dV jq, (3 nbfwhvXYa jcdA:ju]+49pѰkP ?_ь;oyMe*a\osGu-AN`|?29; s:hug?2?i2/8t<' U S /="}뼨UsB+Jz^r0 ,U!C/DF49FV2Yg9HP ܣimhE ME}]<*P=}3eKMnx%;AA5KO}7>w *R:#HЫ<9]7&U矓y1A sIrzr h84*RX4cӌL9nepd] iAdD `38gp%^dAH2Y xBŎHˋlP4.[6>PKJuξt7&zEJ# YA}MVN9ھkE .A֍kkzs <NA1v[oyѺAqU :X ef3]>Yv8Aݴp|#Z Ew WwsuOJM;ƍAsZEd9.]ϤbO46OD"31kXs]B/BA֍s6qDhCs4ox%qvcAV"DSWez8\9ůZ*r}g^+x<"suYĎHN}Qly셊ߢy:F"TWd9Ȳ/V4`rnlnT矓\olb5jIru4e 'VG;/n A܁_87#d A81:T陃Xր5` ,Ӏ9H*s7亘8̝5GK.} qIthNLv8A_s%9IQELOlj!1Éo59H|IMD@.ѪA:AhZ5` Xhڥ39Ȣjq ߯J;;?=?'A058 9E OHݘ G-LC [~d|'Lr{ˆhh>- `K1Ch\ezkr Hs ag"a%VRԤn31kXs]B/BfrEb;|:ºAsп$ěB\\*epdDJd19rؙ[/ =aAhx̆V'"[j/F֌pyƾl Mce6us  ;h`ȨRHg!@u$|Nhse^5` Xi86(9 $#BJ9bP#0ã{~HCFpjIk+!׉5q9RB=awg9]9 kk`AU) \nJ2K S ep" BtαW"2Ȃ78A`Ku=".1?Rlр9HԞ;=hd%[ր5ЋAzi]p.W-4^`H鐛u18]PRtˠJy{ WjG;\AZVfbH4`bb Xր5L ^ t`0?0/OÚa˱E8qirIKvhr;4LSu# F []OkӀ9qmPr1N*#qGd7IA4v9\{zwߣ\A.Ӕ{݈995` X2 4H+R.F{&t9M .adV"dRrznu k; F 4-^4`KKR|O$y4FGF6H1I\zS[YP+b'-:Oq̡'#vh3ke098)PS~`l8 \~q0 k"k pU|I%d.C:`FcI R21dN ù1x_-jvX P5HlwM[I` FUs_d-xSuAsq(Ȍf{bwTE!.n{IcbX?vS FO סh6B\ `l@ӵk RP(•q9Ab@H 勑[͞㲗bqp1bZEt,_\T!l~F|~mٌ{ÜHT$moڔFɛ;r1rsV8;M]$d(PIs-z䢬Q Hjdtbb Hs1MRR?5` X2 zbth`矓 o0D6}(0q^Arک P LCKo}Xb97i{Ü$f&!MAC?AYDK^BEb1B.n=c9l{(A yr< F []OkӀ9qmP9Ȣv{NrTXrIAFqc*">u -DbܐMG;\A>' jAjZi$.pb仹jBJT&^Xր5` siqU29R?矓bgv >ҽ"A▙ظh|/gr](G;9HDldR]H%3csJ b8@]$afVvƶ'0v]eU䴉qcVKkP ք oG;7sN!ʀMF]'/'ЌԹ9jIJ%D+F4ZCruTC!=LuSУҨLj N˗Q@gz47?l8zbw1IN=zIc[Aٕ^š)(r oAj01kXsPšAъqo>h$B`BrkFupdDJd19rS9 U)Qmm-ɋ` Exe%Ay{á}sjjt^G&6[P?hKѢp1DEZe 顎Z?El\IltqE=ƸEybnyWo-vzz 5fVJ#dб[ր5ЅAh*snK1"Y/fKWq#Id`'Q{8\B^ZIJšp2).&sDKa8A)p }01kXsCrr2Cp A"`~O,` DOrⅡK q=#_ҡyN9KEe蚋*!#?4!hK~{ RC { nT,bۑУc?kr+rt-Fs\GhlŘՕkP ք'$`T䋑!Eb"Q A HI8Z"XA07B?h9De3#pd8A)ӉWkG;4YܭeiMmk`AZC'C6 mD }$H 9v!uFYӁI?()Ji$@swgdЍ"hF{@1-#-M Khx)iWAhxTp " E ^^m9r1u4l(F'NRڡ\moy 7 XDE>XM(dTh&%ڭhϑȰ((j;6r>ovZAlE@'9 #Yp<ԓO}@Gt :k:09ٔC9ȖA@I=01Σ8Wbpߑ!#l0NSY[O 0*sBR5aAqyh*#rPqDhTQTc&q!}b1 r)'**&-F{iʴsZ-߉ѕ+iUz/|64`eHD_11[2%+^$r}SS2J߈ P. =AF(WGn*Rx/Zm[Oĸ)Nu7 z;]niCDB"7ŌAZQܰ ր5p꫾x~{? ߗ ޲9Ȗw#y{Nr͗8kJ<8H'1XC#fpz5zá8Ls:}D \sMrԓdER@|jqR|ذ9H;T h k8qdsvzs-#F8.F!$1㲔?L% "0;[ 9ޣȀ+d`*E2d*H,{w S,eBa㺂EV/$ނ& ZB?sl(9H;[Ԁ9YrA%A&Lj-z*l:/5s0$-7ڜq&9Av_bP3Nv{%sX Ab+#_9ȐȞaE1`,^̗аa FE %p (*>P @ˎ |-Y-9H;[,7k 5`r8K9H;{M1s$=ҟ)&#{$BcZ\"iȢu.CbF ݱ/ G;Z}[EYch*H1.҆)!7lN0AQԐ ws=Έ*AQB|S`θV5115`r8\svF EBpnܬSA+Fȯ#~yk+\#~~U-cKq9\.|S=p3]AWܪ& oeIYk ǡ$ *ܹ(D'-psv2`2È}<ʭ#QBAH+q.KHL Fxqiޣ4hHdθV519px+KZDя~駟~"DΟzPpt!D)q"k7xbb^\ |e)E\W+ǎ q]n|\=?Ag=ڡ9eqŭjbbb Xjq}?8N*p+8; m&!EwcJ9/D!PZq\^svF 9axTWpЬX!J lŽ!^aX!oqXx)Vp QǷJ b1swOFRyAWܪ& oeIYkG yp\#H'@$H ^GJ!EP&#&xͮ1ia/80#3K\LFiQ9!?&UqqS5[7ۣ Ysa ;#,jLsv995` A('xm"=x%"I℃2"(:;VH6igP FN|z qgg18t@cth#!/_h"2x*C/'H/jaP"!aAv$`JQިըЌ < sF؍q9A0Ma֤hoQrYf ZɇX+-*ٯ<l= #hhu1yK6-0-uODb*RX$!%HEN0و)=GE] q(@߫w5ig\qXhAOA@"`Rק`- k_[\QFTUe)I4#%BA%5 ?QNIBxA?VfG#N27pf+{hp(NjR aD6rSAd*|@K9H9:&1zNsv9ȁ3[Yod| !sW g1ia7k~s((c7q. ubƿcWAF v=0:he1OoңR V6r"2$= CME D\S5zdsh{ +nUssk8PmC f2B- v ":4͎Gkd|9=?'9cO2Bу-I0AvR9C+$1d8U~0BC rVO 8Sjmq"WaF3 2lϨA>''d e$O~ۿۿ.]__rG^ Gƒ` Z!n,b!e )0uNjdZV)0 A! RX'MvF<ڽڭdԄ.͍6z]_vpepߥ#SHK'T`C5 2"96}=0"2wK܁:\0U58+U1-,iFo۵sliF-lwtU5K$^q]t59jnA~# R`sOqeexA&w#J0. 本ZY9e9S#p8.қ {k=4WG>&Bp"Ls@$qH@;.AJ*RUmY)Jq}Cxq$<ȉ4)2ΔTIƒcANUt>][1A_abU0u~GHʃ VdBg2u3#d<] H P"A$RUhr^՚/[6o*ƒڳ**gF 2μV Oⓣg4yV՝/ȃ[jh% q+ $<ȋnTow,U%k+mMʃTE E A` 'zQ ⧝;} u닆𮡯ǃ$KR{ *D6I%1x):p$ M@ʝ˃T:P LF۲rPk^LI<8[I$F.$~؃VsٌzA( \N BH/Ҫc%-*0/۪rDE[g^q+IƒJA`}ֲo" ex2˃/ԙֺ͟m_O~f?F@껐X=-^3_;gcȅZC7/?y[UO $GjC5uƾ$a[v̨]@svUa7dP* +n%Ix A OQl&W'"jPwscO hRKju3B!겛Tˠq=tA'<8.5ål>."HZPYk_'"zc2:]ٟr{8pʏYE 'fʮA)g5". pACa?QqLs;B!#J,$+/sl`nÃcKĖ!u@,֋4!$Wh1FA|!e DŽ Aՠ@L'3WAhP|]E1ăoy#$<8[I$˃wwqϲ!;8^Rtl)ha79LF7Fv|^៴5'}ɌzAЖF L92ҤZ`#CD<̘Tۧ:0n 4Cih9{=ɺ} Eg^q+Iƒ ADΞwNxqf I=˃`r5rjx/7 >Cot57|`_jԩV S|:(/(#zAw6wq 5dM6x蕚 +gYk c<(SI5Bg^q+IƒJA] 0G.A1 0m[ ANWIi_•Y|[*5pK E-d]Ii|T=E G(>:3Ψxhomޗת ЌLn7k<|,R +n%Ix A @A&o#<8[]>ă6.7{z#B_$4 ~ MȓZA?Ã>J2μV9&a@A5/&<85y$/ /AuI4}=@TFK0)e4+5 4f ~KÃ3$Aƒ p"K?~cY??f~dƒ3KWޭ2GAH a{s <[ 14N#5(cIAJ/ׯ2Z:mr(da J *ƇϨk T%wJ 0&q(@j)b4J YȚQܠ˰tbC?fkÅg^q+IƒJA`!/u]tQX ` L;3'<ƒ [ēK)Swre24ڂ9~HbDm\\C蟺(:ix] u.ZDw[s*s?0tvXBbx GmE48uE|6 m#[WHa%bj AFCRgBwPWWK=7 9xuOЯ?Ìxfy솊hYlt捣KC U] D B~QV']xPq(R6Vλfq&KJ{'T<bpzNP6p&jE"a($wh:YJzJm@Fטp9?FR3WANzu;~.pxq$<ȉ4),L<2e!b¢Rb7'̃8;A(W~˰̓Yꃄ /IsG;k=ȵsW۵*h#\n+ΎA~HJ ʅˊxم( C <>"$Ԁ_RkV<5RTO~cxq8ʗ꟢\F5Mw=vTjI_ᘡO5Chz E{oQSrj~Ͱv7dXuzZ0<ӯ{Ã3$Aƒ p"ƃPT\ U9DX(Ed ʅԊ5^'a?g][E:LEbRoΝi Dmn?xŌ0y1С"x_͉6^ΠZkG;S7"YmF=|V)w<ݻ  < Dnʔ K~8b4ja]z(uE .z;[stz#~6m..gM2pN#>&RAƱr *!li_݋?i4ΛQ#f,AcIܥ: ă?fO 4ydC.Ogyvr+A|Gي!jk(gxq$5"'As* .1l ss!A J"L*7(e"dG#']! s;S:`w$"ǾpHё,ݥr?&X]'5.Ã-qWB'ARꪾWL` )?C<#M|r7Fcm2μV L ;a`Aƙ%ľk o}FsY4bTszټ9wԆ^<4բ&2x˷R%NF8ܮ'NQ k^5jO !uo`^b'>+Wu{ c<(@Tx.z@NֺFa7>AƙWJ 'zҤk$9C] ̋Y"B'ɠ>Bg,0vbu]CS<@tP*aFjcφۍ*ZAx:ϡZ't|lA Vtxq$PG}*N2+ ^?IzEDڼ JC1Oq +n%Ix A Z<9^5%p҆nc^jPWbr>Ԟ DÉ,S5ɷzu,ֽjdYҾq`Ui] OOM[7-$/&\O<7b\eP3WAҖQȃ"sxq$<ȉ4)i,/{ 3k\+jDžո[];XAh-Bw\lZdcoxƬPꓬ4Lod0܌z!ƒ3$Aƒ p"Pt ;E?Mcxn,C gI2cJ=PƤ0!٥Z>38c U-JIh.ͱ=wKKHVPyz3<iXqw[AzxQ)*I_߫EӲ*X+÷z 2μV9&ax.z<RiلK0֮?rterTAk\4OYyػ. aQgT6PlGa)KcK]]]]Ug?wy>:@3z{Cu9/ua_ͨ]DEt]9ZULވ U7OL{Gx@Ba骺I[f =PI97>g^q+IƒJA`5f? 5POﭼPr|n[Fd-R$RrE{ÃQ< -b!C8;[5tJvy+41dINt{#y1j$Ka2y~p12μV L 8WA b_#Xċ2ϋiJ,r0r;k9⣾.|zAh ',QD˃4UYQsM[@Px^LA\=m>qxq$<ȉ4)2/tDÃ\6g?Ax_R,bSCq|E3&ƃЖaF=ƃe@="JiAbCWGx55쉆FJ9ĵB36#6+1kg^q+Iƒ AD⧝7mVAƙ%ľeowF${(ʣ8xAިt5.y1xq!E-٫ U/ x漥 +n%Ix=[iR6$-; 2^v%<uyT*4kN:ПXQAG m0.yJ!R7*E؜!JƃQcǃ RPҍ|jZw +n%Ix A ~yfCWzAƙ%,&۵uS}Ht8˃諫-5&!)0uF*)N,e,Yu{Y8rΨk bP.""qKx}(˜:5.Un<MUV4-}h ƒcKmLy^7Տ:@3<ަ? v[ayMt4;L;ڋ\pm\na^Y6ZjUXl rG^xq$*yŽ|ˌgxWΨ_AԄayrj{ +n%Ix A @7nkR;AѺN' '_]-顎U ǞX|w0A1<ȆBVm' pe#+qƒd39Iz ޡÃ3$ANoIy p0<ٹ,\75G$SsЄƒ2+a0Ν!wj~1Qm<=3axaQƒ3$Aƒ p"K?6cy[f@].hwbԒ ]C{wÃ3KXd֔^8̰r4 !Z¶{U?f?A*Q~sqsΎ纎{Pԑͨ/ m%|¿,<8[IDV Alvr'YC^OvvuMu,k!6D3Ãc}&sDe& [/uҍf'|F<J/&x#oiw lF=|y5{BE)ͷ/6 2μV t/a4Ltב| N'"<DLDFؑ,\Ŝ8\4t]RɁrݫtՕPR!a.?΍3aĮ)`%S{dGx݅;XhekՍWy [yc)sDÃ3$ANoIy P<ȑō6loQgɚs,ݬŸA1 ])\n*3& R[ieDk}+Fh,CMݠ+!ijV%DG诸~Aym>=Nʃe/ 'u߻*,Bi.Zd4XSYs-w͇Q}.ƒ|ł2hx A @YZgj6$b (yb,.8ϯun .)J|J,hn|u2jL^m _{ D*i 2Ǿf[ n]J/6v2ZpqG8_: 2GJҍ!:7hEAbAQ%6IF'b]7jt(-[mCG c $v?y b_Ń@m@7Л‘#/{"}Jh:. _.y*AHAԀr!qȃ`qL4P<.e4&R桲AnM <ȉ=U*OrlƒcA.`kA0]RQqMU]oX7 kcu05r:qF% //"x٭sDAfqyTx]Ēh8^=| dF,\kCuX:MidukAƒ p"/i}aۻO|Ã3]xѾAq=T|%yhUwI2l |wτ0lT><8[IDV ]^v':O U [q59٘a[A2 b/.z-/nչSWwU\;J!繉g^",ǝ] %zo.x_~;(d}YhqE⮪0UQFEml&TS|M7$ok)Sug^q+Iƒ AD~r7{Zv`_P*Br]WHؿ6QnSLa44y0qq;Ǖ|Q?m|NΖ7|Mxqf ]Ҕzl6VHgf]MZvE Y骫.IXGD$-+x3Gx!Bbo}˃>i @xq$<ȉ4)ƃtw'澕mYCL|7t%cܩѿ[u;YbF/N;LƒcKl_zH3KBX:1.TW &=sz~0j~kFgWfXc9"،xiN}BRWn̑W6B`F=""*tS{xy<jۧ~4buhM>vyŌH͋(C o3]=@xѾ7'<ȉMt(6i`7Vl e57^M5V=5u_A$'͚磳Ϸ27RHWy>W3bvrWϵW+#NqμAƒA>>i 'n dM $ AR^4h6 SAKP'ޑhu#3 2`ɃtUx랩hb /Iƃ< kY."Sa/6/{=~1/JrSg^q+IƒJA`}nO d纎 r.6RY<&Y<ꄼ}YQ3(9obA1.ϸTqtAtH0(n~qX#S$d L<ȋqn2λ$AFD A@8~ "ELΞm K6J[!Յ7p(ZD%d*;2 2`i_]%' mDKH+Xv+P.HW<!e>RmXIK +NRtbG7R),o(/m'7>kF=ƃȮ0s9)Ƶi8ԃ+=% B'q"]ZvM`Ƀi A?BӃtx 'zG^@k#ȚWf ߽7<86]uC[jzw5g?wAp/p?-Mjkԥ3_H.jP(nkk{ng.ҼFP*NS!+!ΥKͬ,M@'("GLu!<8[I$/eO`F2<#۳hrΨ' t㪿+=g^q+Iƒ ADxs |^Sh:e:3f?)w+Un|<՛s$ų7~}~0ZAƙ%4M 1{br a=_6 ܧn(Sb*bAYF35yf?/Ã̢$sF=<A <8[IDV ŃTo ʡG"p-NGjϔod9մ 'UšsIOxqA,1PuAAj4 Uk<q٠ZF3 įA^dyŭ$ $Xi\ʃA8r<ِ3+B ZnbOjmA#<8%ҵZMhb70& hԍixLgxZgg?Ãs:N?3axqEIƒ3$ANoIy P<nXxJ^ ةژP Fj4/,[b$Rad;Io2wyƥt냸&YuD"fR04['-Avc@j|FzFs(硗u3ax(dxq$_@xqA 4ChDt\uTy PZJ2KݧtacS2.VUDA"誫۟gxk;>L @x A RWhUj$L (φ i=? e0nd'1<8S5EuZ< hլ<2zZ<\w|gz\ re$A L@x=)4 BSب"Vi@$Xi.A& G%&tT6viZLD 7PjWL%tJ"'=Q 5}0Aƙ:lxֆZWqT5 n]]|ZUߴ֌$A 3rx KA`.~Z3lO4Yv&>tw xƒcu^/[*k-j@S &<8_H@Aƒ p"wMKxt #o/V-ez3@Aƒ p"oӼFIDbF3[yqAƙ:L @x A Oc/).EB-y2٧A\W3:!FTX|vA--ꊦ!XH$zGxqKBct,틼rtԵn/NhCGkeNÿ̓`X 'yy{w~y$9/|#IS Dp AT~<3ҟ|l1#>w.3YcqR{Uz99)Z(Oxq<Ț};`Mޜ)VZbjr.g]՚jW6:>_936"n”ǔz8Η9 0ANЀNE`uIVO?EOLǜITyܷZx ;e2^|y2p-ꯨg ƒ ADi_i9Q3a&4<8SoWpnE^`/vyFׂ D1>nW3 _Q\mȖ-tߨl]]@2G @ <ȉ!|O;2qTqiG| C˾sZgX%BFRO.Da$EaQJR.wu>L @x A o8Pxq φ_ x9jE14Pc6j ƒ$/=I@ 'zSh@ "?Sz r<ȩ&PA ~ b. %A/pSC8cʣ.7&΋9=˝h C4A  ,4gvhO"x[M7xͿk>j&⮉dËpJ']#[#dw\1GFoɋYY}UBۻt"Ӊ PKU5?n\|I^Mz8Η9 0Aƒ p"<~Z-}gy:(܉?T|< Oa+T:5 fttG ->燐 g B[˵LJ 2ί{c_Cu%1)%N55#*y.>w Ez8Η9 0ANЀNE`qBܾ_lVM- Ko7q^LY6NRաnI~ ~Ү<ݐr?ڸrFk C7EV_~7dƃ>HFKÃW%[xi$xqPl 5ԒgۮƃԂxn5r uZ{xpM0 yCd%RrQ? ;%rA[_q.6  rיhƒ*p<  sNrn}Q¹r q fƕpn}5;=Tu;n o2-K߭qPY5ʃXgTG^D|+kv=.|#IS $[.uRٮB.j)He8Lj_Cjs?D?ȃ裧3NiTg-Kp>8"D6蔱=row6P'ƻ=6+X{乚6km;k& #X2WW76^#'7 oAzFii8(أ\@2G @ i4?<AFTDv" bϊ e"$p9CD06% l۹ύq̑$)r8D p*;lx(;C4Ioc]9d]%tU)R K3S!l7uJD)C j#Q'BP\n(.Ç>i@$x;K!dCcj@?<9_PIFKfKJL "^^Ŭ58 ^ 8_H9B"d8iט"קrg ƒ AD⧝:sJAƙ:ľb6BV y.5<냰:Y8L @x A {&!<8S7ڗӡT*) V'V8 7ƒ0N@R 7!_y KD:2h`>L @x A  D˃ЩN; %>L @x A  D˃ Ɂ iKŕS!SDv͡p6k ."?Ã!z. A>8 .F^_!G<+bFcGU A.K~PA @x A  D`>|;<O=oj.9K9K"dʹ%u1@!AB poWF@/O fG A  05ANs> ނ@x )y2 @D D HD HD 5Tω@"$@"$@"R)%@"$@"$@"0B הR='@"$@"$@"kJ#;2D HD HD 5Tω@"$@"$@"R)%@"$@"$@"0B הR='@"$@"$@"kJ#;2D HD HD 5Tω@"$@"$@"R)%@"$@"$@"0B הR='@"$@"$@"kJ#;2D HD HD 5Tω@"$@"$@"R)%@"$@"$@"0B הR='@"$@"$@"kJ#;2D HD HD 5Tω@"$@"$@"R)%@"$@"$@"0B הR='@"$@"$@"kJ#;2D HD HD 5Tω@"$@"$@"R)%@"$@"$@"0B הR='@"$@"$@"kJ#;2D HD HD 5Tω@"$@"$@"R)%@"$@"$@"0B הR='@"$@"$@"kJ#;2D HD HD 5Tω@"$@"$@"R)%@"p6?/_p;w/?q ?/wݶ'f248 _Tf;ċ2ĉ@"$}rM)s"$!IHw;:?*bg*67w9l4[]Q",mbЊ#@"$-R)!% D vg ) FCu%h킠b3dS,PLd˳+JĚb$FK2OL$@,R)%@"p:H1&^;+%m^)U"(l-ϮáxݸNJ)/2D H!Ji]S@"$#,ԸyL4ܺM*%<^k!u1򧴰EՎj\lWJl 8 (%b[(V}fZ5-{hͶ$@"@R)RJD`w$9$Ļ6.g_G}<;2!o>ůJps&N)Y-|; m@ʫD05gv,[Q ҍ5%l5z^RR纝*R 3_˘)Hw"JiV'E}g9U+.3J#oakןX\7D ~~q?Zm>?Fq&kֳl}A""Vvh V9@f +T \X&qĉ@" J)R"$#@B3"dCg Zߧl+"r|%bί/ؠ|ru*fKeg;lR}v ~5J$Y4om;V,J.Z$]T)ԍ[Dl*܉7?T3e"<TJ ە${##΋R-Z0bkJ)LѼRTQ$rp;aIĬ  όBC:J_;ƶ-`VR@IEL$HJ)H8@)aqPFJ [`بPH]"@ׅ\ǩe-/~R)i#e]maEok-腢QvA-} AL!H]H{ke@"p aÚ/ZSZF J6_'JY3ջ=wwa)+J Đ\!=@W)uXBި@"TJD 3xJ~C)a4R/PjiJv ~]R*eN) Wlml~F\V5HC ~9'`i4߿RbpUR,θ%[uB<+%Q ֋U?-Slc=Z) )-}y[7eYD HbHJ)H#?kVXsГqCmEϭ)a]R/V_fP՘HZ[)o(zgw;JQ=%ghP C9=ȯ5ŷ+pkuI$HtDt:$&&A^ҷW+% zyx*\)@}P)՘JՈj5b gKCT}LBSS՝UBHQz+{0chmL$HJ)H`jQ,kmbd}隒}UI[J D[DPoPl@!@-E2bBdMI5XSJ;TCQJ*BzO'8v!\0RZ%Ss@KKFhs ]]yoH&HDvR:(B3‰@"[{SC`++/T)]k5\F ~6(H<-E 0Ux\/O"]KiZRb^>=E.֭Rg;g"$WF R*D HF1"Q} zg)aV5 2ixָ>3xC̽Ñ3| /ȯch,S?Adq1  \Ybl buUϢ&>v*R;k^'ZLruKD`WR)!ڝy"$@"$@" J)R"$@"$@"$%@"$@"$@"R[_"$@"$@"$rM)US"$@"$@"$ J@"$@"$@"5Tω@"$@"$@"H;fD HD HD HrM)s"$@"$@"$kJ@"$@"$@"5Tω@"$@"$@"H;D HD HD HrM)s"$@"$@"$kJ@"$@"$@"5Tω@"$@"$@"H;D HD HD HrM)s"$@"$@"$kJ@"$@"$@"5Tω@"$@"$@"H;D HD HD HrM)s"$@"$@"$kJ@"$@"$@"5Tω@"$@"$@"H;D HD HD HrM)s"$@"$@"$kJ@"$@"$@"5Tω@"$@"$@"H;D HD HD HrM)s"$@"$@"$kJ@"$@"$@"5Tω@"$@"$@"H;D HD HD HrM)s"$@"$@"$kJ@"$@"$@"5Tω@"$@"$@"H;D HD HD HrM)s"$@"$@"$kJ@"$@"$@"5Tω@"$@"$@"H;D HD HD HZS71KB{ǟ ?}?}V~o|gw4̔i.@% R?\Yw"HxSw"8ǶRJO"p_׀3C;WNjD;FWK?S;lge#ETozVD9;#8f"1c}L)%`̟D$~/(?Yu.J)32D.rvRJAo1|mRve@LtΏ S)]ETJgrvN,z@*!D X@H SGũﺽ D*z( E ٥R ,TJfv@Htq.Eũ.ՋD*y3D9TJ'vb=D L,C yRZᩣTJw^FQ"^="R)vKf@*`@3D yR8TJEQ"eOjlSҸ&jku RbDQ"RiSv<[tB>;E;G郋XMZlNUwf-K ͵J)nƈK@v²k3 Hk FLRb*M3 \3l#͖ k )%wiSZqNpksPSH.l66hxa,fSeQQJ6Jל U q)\r; z~4Y b''=kyx"VhQrvWJ.[\SDzaxqT&^pװ\[J,Fd>VTpx`HXƝ hxVjc|B>!}ûF-UJnPW8E)Y+ 0rf@qR⇳(ԥ#ln08ϣuJ;nxRyz>_hD-mP[:ڸJ2_3U b̲ &5@HQH䒶PկJk.u2AzJ3bE >\f09zkH W\þ.~smUJR)ڇ} plT 7Ug" r#ȓûxvlwܣ)Jb !gf@~s? "2*wlYBTXN)c>7M~p6(Eج(ol|)RJArk[ŒəJDx%R) XQK\XD8u8L5a7D'\ff04dxVHuP)=2~sGS)hdEdϊ ,ko@0zů,Bn%ʰՐSE"lm\7+vɒ:E9S$@F YQJ1~exIKԒ KSJq [}OI 6;diQF 3MBpwLjdm%R)-&E-;52O`zu=2)JƳz/=8?CRAB=֚.:' )%w6%>8#L`j9y_t \QACzdVq5Jjxa5_D`D*%7Mҷ=:悜xAmaY)EN$OBj$QJYJ\Mᠽa_Y[-Y52zW93d7J+T_ (*<󴙷9TrcT_l3ocY7v5tWx0yH!vHa33L܏L K m%xRRCJ !SMua͑}]7S,f4נqb/7!BV4JjMٺh5(JEZZ2MKIɺY\F%dPL; jȃQJzڱ҆GH7 L7Ƴ}]=;.R)L 3;ƒ&\%oL@8K)LJ ߫QHt~mmkI򀆧Rb'nQJI-|tG*$*,Nt񎞯^%R)c)OD ٥R:!+6TunZQb>R ɂL4[~Y3SceGQbzhtp+ F:"QJG a^1~)S)mX*??n`* jU/|&/OCɫxR}x g>Ɂܲ9<]FMILjwوjD9c˴ G0|9:/+=s׾F4y?Z'y&\ f7q4NF2ͼZSe/O<}ٶ(eB2LhF9R"!dԭܚ dtKl,'#yR;*% J}G0ZB HI֣e dkRm]U Ku\+&Y~X @%kJ?)@ ݖ7-a˟p܈S2~D9RZ ̊y8{Ӎ\Y,FG9:ޑ9B)!99}\sHMP耿Af1 34- Eʤ ҳbSYO<\ NssMP7HCPg"nrR-)$YMvB>󯼦&`ɖؤ4GkŊWQaqΎ֤zDvqZ9b=PVejٲ"0(,*ɌkOwuPL.FM(ʥ͔GX @%fR:z:K;` gtC@;%@k)%ft`_5=OܛvtMc?[<<.#*%-Zs +‰ z\9lZGg(7#)&@ M9Az}l婺6k ֚Λ ѮFod;jd[Eօjh(1yROrdt)NǍ-mفn#N!ZJih [I1iEقrtǽ#s~R2XѯpDF̷[a5QήRm RrM "(]/RJ̓4pÿc5Ny-JI$Su'awrE@uᚒz>6RXgg7[p,kShzBG;N=N@I+%K~MەmyJƤ=CUv6ߺJiO. )pі+[Բ4\7wZ-Fdh/kU:<ݿ׷EQXdKv A]}?™V{y6ٵ$Fk6_7gKl|xߢ@hxb&{$BeV䐫E@o$P |K^c ~4Eb#BNRrWiZ׭^d=m5P66S%u: O77% )pv WYVGz@ u#y!na]; b| MaqCdQԵG٪Pa kyl.V}{ERj#`tu/$]@9-NGLhչ=0Q]g]0Ydգ6MtmKc7Cv[U}Rp^\&hKz=+QF'e3 <{YpY(J ;V_ (gwɳWC/s^w݆nD9\S8TJEQ"˥qKyz,2HZt^(gRJ+,!?8ӽ%TUn֥rxRRЀw^`);$PC}88 HYYN۸\7YQΣg{30QB&G}$KjI"ɦ1V`iz XiJưke)Bs]"T;Qӣx’ʥ"S`%R)Ր D94o 8|pJ)% ֥2yR'Ж6ps.Sĭ)v%zeݤZ7ov.:R԰W&y},{3 ,L6b~>Ҩx$i&k`)rRiSǬth<~FFQbRtH]Ei`+ifkgasMi;N!(%k2y֓;,tZW ҧb,*<,׹ w8S5Zt(%-[}J)g<*\G`rBo`rTXB)!US3sFp TJ22Qبg"&}SJxtXQnRr.&/CԷcRTis #0VJŖ$FZu6c *הKrKL I[o٧䨰xR&6Jv%7+d;ch˛6tfЯQSԍFԧG1_SAM>o A>w#.ݢQnRr.J/ՠ7ߞ=ނ*JG'*7*pdx 9prwQ1+qQkQfr+x9?ǯD䨰xRQΣsb7㫠R@U;igZGeT6\!,zgplY+.C)5%a>=8eNP2-Ǽ)5d4齖X@Ma*س䜴u l W3B)]SrRz*b7mWTX잧tSL^^(J q_(g9O"-jTJ'>?ZgWNV@Rz9[(% OU&SJI{4QFJ)MJUQJ^^ۨJ)GfE)Gf6j@Rb @*idG*;rT|TXJimETJwW4٥Rz7TJWr.Qaq*w|(JiLy"Q.҉EH4($r~xꨰ8]WQHWeD9TJݒ#^|/~ןƇLOot0lEO>|sC&iG9J)ɓ;R?>He:`aP#kERn[.Sng+Т%*pͮg1Jic.90;Ywr۶J3̗@OS:a 8?+ӢFɓ>Rh#EA+a<ďIERZg3V ,UVEu^|d(gwR5iQzOwtf.# * /Zv*8/|*†)vrpXaz䌋}kuB)8[I3A:Vb_1&P-))GK)_KDL,q;<4)D-dGJ NIa[!J(%lE)EFE9Va䉢ĤRC,?7֪*\C .xX6?JR^2˨C7Wl4eMIMFt%QE 63:ruێ69RohB)vex~uBrH ʥ;y(1d9ס:.Z=~T҈!Y! (=hRi+-ٵB^&EVAJ9.2n(*jӦG-FnmMQ,ǴJsi>eT78Fk)%KkJrKn%mE/{`ǡBlkVLc8zRG9Ln4$ ./A'RQ/تdK)~ۮۉ6y zsKkEvlDŋjT t qC4odjQՠ#y(Z)@wsꚞnF;:TJumuͣ]=!'^-7M(%TJPJv⼶vӋs󀺓 (={ :5WwݓEziJN*rZ&C+cUշrR}A.UJx+ҫxJ COn;[Is7Ji)Ǩ:~:F&RMn 86֬e T=c&O%Jvu.=jAj355t ;yC>Uly_k9/yMZE9;!r#.eHeYȸգmpt(+ky]^ѡ[-JiWe^,$ Qcɳd_{U)*,<{/Xni(1TJ}R5@;ٝ@gc M'ZԸV[nʟr;)%LRr ofLA9tt*B NŝF7~?qG)g(L|$QJi;9stJKr;)%~8}TJprQњDoړɁdQJi{؎rHt^:< (籓Rz֧6&*,ҩ=p£(q#t> @{R:+H#;r.Ο8;zzQH4y<(gJN̢RB eD9TJp?[?Ht:4N_Ju-WnpXז|*-UJC wCI("/.q$;M`OMY\|@بm}wr!*,WJg݃D=bO!_ +S~L)4 2w1m^)QnRd蟒Icϖ ĉ4˥~\? K =V&]z,ԓ'7kx+&ݡM).֓P䗎5yR d2E1U\dZVh%F9R*80ȉjPNCu NZ V̄. `diǁޑxJ ẙpy=̄[A>y8}1%V tg=)p8ٯ]5ze_@SԸ`l>+k"sf[5>gW)aLIsҖR]mB-) Xsq7VrxF)Qή\N8nVAJ2|TSF?eԌ!gPmifm)S ?Թ{TX\+%ŎM22J`*JcL(1՜]ѵW*%*aF{K)]-9, ]"*jY#ˊrv5CAUJT(}V"ȳz$Ӥl)%Eb:qT)QJǿبН|Z,2$>^)[6G9Rb/,UJtEvDT)գ0kJVJVĪ#jO ;RJD)ґ0Fa6yjzR"P (JpV) ]gNgRU90w/+S*8imڐEfjMiJq Qbi(q$UHd@ƎZ&:<aP1йv:'qRkmNKi}n(Q+%*%w@PJP|^Q`w2pjV_qy=oJDR^HٱH-q3"S^\iG'E9d9aJW#5w+lc`=Tj[ENgRjXJ<;(gRJ.'[nVf6OXilĨ*"N)%7÷(%n=-Ko 1w/(&I{<˙37MߚU/; Hj0dxBu9qa΋Y6ǣGRJM:~hEl+ |]庣@r /:<G}alG(G60…ݻUD7OGE;@AފSccNrk#7gp"YE)qvCORȭuOkQmZj8^=9D9R9Y0uf՜R:Me\\g +>[ENZ׮kxQ7-J?r1MvK?.sɦi]z@Z-_++-pŶ4ȁE2F=(~%?MX" 3$&}A.9|$a=uӾDYV'| [_ ”JEIM+UmVpyvR%J[UawNcVaxkW+jUnXes<]gˁ!-h"RN åsCeI&E%&B1kUo!>[4>wASz8[g_@xlm/ϟ d7.'(o.r5j]OҢ#1O?KKr;)%լl|*-J{KV^ζ?9t3}%.cDc5YLFJiڛK^rW^6"ȗe7f(籓RB-X=ZoQJ؀i]g%.ցO(gwRzOeKW JihH"C y줔 (d>!DQ"RHwd&{#R)SR)mA/MG*+*,Nt񎞯^%R)c)OD ٥R:!eD`Q#2OR:*07(gJ)[2`R)zVvytϠsQ^JiAaclJ mxwڇDQnHn'[ԙrvQJieiR`>R$|@R*N&#Jɞ=ɴp+JiN3+ Bz*W(%΁/}woO2c)p)\ f/pMa?6C7sX@sz %,R< G cmHךfQΣjz۶j&`{K삊y hBSw>D$3JvX ac형'Ua0{ED9RjYB `x ^x d!-x ϓCL||||AD$K|ZO o<ȣqA1ܘa댛sx ~pD"J #D̙'܂ӧW2yJG:g m$Fyo`Ȉ,dӘB)$3q DŮRrw)aTidU}"U%JuX+&ڑw1kݟ)xҒ- D9Rj98ZJ$'%ћ ݷ#"Au\q$‰)1hq ދ#֦)mXw]n8 1JP(%"`PzSA_ڕ7*C:,}stŐsRwB@L@k)X4};(k[U(f+'B 7$cRJJc3Q0<]]qFBhRJe!(JD)%1JR]G) ܤRꌅTJcflޢ4ظٚ1e$/(h[ rwiucO-ZSX}9D4ȳ-+"!nWcܢG,=#T+%K~dρD]C|mXwJ;ÙVJT)ImH«(JRakO';fqSKv[WCL@k)sY)͏TJwޑu~RVu@@ | fvu\r,RJ>' O)̐R{u:a/:w0ත|>H^(Q+%уdiG`pɨGЏqɏ>GPQ"3wuz?*,vRBY&p#C(1|OuXG騎>-PYz.JLo.UJ$[bɭrv/:%'}'Y[EV~?ޢ0x8U3~"Iz%p6?/NAh#Bp\iZ׭NEʐiY:N"ԓcp@LQJ8z=#eѬ{=L;{ס"Ex"Fj˹6 Lǯd/,*,n}%z`TEK9D#Q*%֞_'"C>4$94j ?" D9WkgKN1Q_k,=uxRp-_Z w>ǍN]ڭUӥ>*,~l.ʍČR](7ԽQrv!'F Qd>OBJiOGy> fvL2;rOT3s D9;*%~K2c9J !4iA.2E y8IЦTJH_Yv1eY[kiERV5Q*%NBc rvT{x1[3ȱ4vRN0$<W(%ͳI%`3R+FF &$~G~˻ybH||WU dVx U.p 6%1h(d_(J &6A>X G.Peb)_K!˱V?/< rv-$2RqBKus&b FV{0:v+X$ RRQ9` n2ܡ`t9Y騤_yddET[SCğR) gˆ5xnDQbF)V\-}(C= R^RkSy@+%Sv ]6bף9rn}Yk,$%ކ'0Z~77RDzc%2% 먘pT64:嶔clnR__$;p6F9Z)mg~*%1ֲN׼9Jdi(%k8x nuF.Ƥ~7(1/}}(z/pKSu{ LTX\+%MaW+%;])qS wˉ ߇J܈DR}X81yRCTfr/]gMPJ$d\W8TJ.xi{Qv;RJJj1ƴok6>ܯH)"]b散֔ޡ0颓<g>X$H]Mhi:t}6}ʥ:ciGve6+ҭ.",p\gU&ylQQJ9?ܽ Qn=Õ)VJosB5a_.>q+|<#o&G(1y줔eL.> NNӕRr fQH#ϮD9TJvSfW+g ]]zN(籓RB=4#=*,>]) ڳˊP)=l]rv-tF ҳ7[wQc't"-2*,NDQ"c(D9TJ[J=Q#[+RxGW/1ϔ'"R)؉YTJC2A" (Ji S)u{ETJ{P@K-Y0]=PR9- '?B yL*%|QɊsxMm7Oun^ۨ^JiH re{E *%9@q&XZb?(gw):6~$++aP ҡFV)]Y ǼRry{ãH<fLK) IH)-,Ҋۺ /aRZI8~.ۗ:Rd㡱DG<8ڣcR96Gi*PB S)]g$ytNCdhЦ`i}'m˓t>,~E0Ltid'Hgy4;:5G<BZH:L@{h )s%ΐ\nR{m[`~]$e%fRZsQ[^OH=H`+2g($ӄ /a/$Hf5ZD9R*,KuĽpӷ8RȐزxzk,$5^tٌ_/ĭ `<nXU|6%J&ųtU񃛩5X(Q+%e2Og42 'x(j Jm*%#_h$A]<@d ؛̍BZ͐Dllnn Ô55 %8.ޢh%~؛:d*2[JɱvD"5LtIZ@U9έ`i>5%85QJvS2X_VϼS& qd_s+$<7!Qή\KRJvPH E&ܳCWS}MΥ7D _mI!-Jrўev16kh=hn~0畒^B"<\dL/I +e3rMi"RVJ,uGK>ɀԚM L>I:+k6v(%7(%x8_2ۿ Hx\{zrGfxS?$:7+S#ZJɵZss>TJxHRJn(T)AجPJx~ /~;Ra5Zn +<\d_4j)%F*""KrQaP)m j;?"h]#6ySJ̍kJzQ)WrV(%2VJaHJ&mH)$uvIfe?>TDŵRVx)u sB^GZ25N=n).Jp/DQbf ?墭@:+^lRBȤXzR [E{ kZJɵ. SJ]m>\kdpה\{BܨoQJ+wS :oĸDn)3q[evTAj) Gh ҌM M\Ɗi̊"7<1:SY_tR޴1{=LPA35$,7RCd[S^䉢P)An, nP)vHa+&2V \ޫ_X(gCm ]wE~5%N.nTǾ!dف@TyRxL0#_Vb ccŏ{_RBHfHkޔm/vhTpL&{y%'3+/7iiyDTwzTXJ87 AsdoNq GE΅,2&l)_[ nD(J `\;_\Wؓ=59UU7m7wV5Z> ӼX'ݞj;4#/RJr'ϺYBF u:FQbF)ߺ,1(rv9y68xRkk?JYD9J迴IIĢ;*$K(J\V)[^,?L%rvTJ]?93B)i(jՐ̧@TX|GxR~O,QJ);: @0Q#RpDgJ)Eˮ)ݾD9TJݒ#J).r.Υ8ה.ՋD*y3D9TJ'vb=D L,C yRZᩣTJw^FQ"^="R)vKf^v_{0;d.YF9)%FA&GeJixNX̤Io/LLV'gUP)1ۂ;}2:';HZJi'N" ϢF{QJx>YL?]jNR*q&ܫgFR!ુ]NWn}F[٦RHAVJ !2rvTJ){viߢ>N\S_{,>Ę#חOy2Ab~p^typ$O 2hu~Eu%~KCT(*%P1V=ijX:^&Jn}Hllިژ~J8[>ɢSp3a X5'^N6֮kVIFP%% ֙_D'J$DQbfM,uAA wyb"npHbiP&[SzCu^Ǽܢ&QήT{–Җyz1X@T[Z5jRݭjh߂`[6?BЄfxSm^[3VѸ3TJ kuGaN]:R!˅֥#|NT5:*ѕtT5/T/DRJagVS}k/OB)iHFna.&쇮oE.]~??&.}/ MՉ>QΣVJA'bvEidJl{k+pDYd==RZF܃'R)\mQ 0UFrn#(nMPX~mF(oXsg ar1cA]EptINF1-"gH=*%ݒڟp jWHNNFw|WCpU殦zFm\W(%Ҕ;5Yj!ܔjvzvb&-/.pM E ۺV-\g'rRR_bˊJɥtK)D6uޫxŚ5Y3JfDQiUqzc1Ҡ7AubK)۠y8Q2.mn4ڜ>SP>9dQXeUUN9HDky]aKbKr滛*@)Es l[\sϿC<'c5A{t}HBL3TIje:أHqTD^ :[֚,G9Z)Dyz7D WRJ/t2af%lly@N$$-p5x~1h0PCZJ{M)4)3jd_pVr,4n).bYj d۶7S)h~ޖWMo;:pM7ۖ#C(I~tX=]K),lѢzѹ luT).K* ̇a-3q K)AThSeJveõ{_e|Hbd ɲTDqN*ٹad˘:J6aOE+Z p FMPr}S_ _L`LЧZDop 7xqm'4Fcu*Ც 倫8 9̭}}ɹ¿d(MS`\mލEQxZ<_;^1TJ[7tm\!lmXmZg@XDxQή؃4t=$&W`XDunsZ쭽ZM7|;-zRIaPU`WmP(b2jr PNӢJWJvx[tu%\'k86}ՠr}Twe_Eݎ-6-Oz84xUC>&. Uܢì{J(#ԚeM8U3^W6MSFH։i$ ^gbh-I%︀mtyf܄S5n&-Z}#ֹm92B$8^ CT%7й6p :DjYV_͙\W׊՚wSXd'ۉ%K)qSkJDq?G]l?F40)% 6'*YQ= ^`rR_3JkJ!D)X2а#{ ;[ ~%Hu6/⩾q'~w-0A-`slpǮ#E]V_`\GҞۜ lrrZ}]Bò7_[CNv03Á Q%P`RT뢁JmdC4nW=djjJNd$V6z}苢>K|6R#L%J^52&voX[=8GZvYajgՋrvw#P:/AA" \`82 &;aXخzN6vbqPJ'E(Q+y&G-oIpzn8F m*3JiK=D (gِg&<X!ڨH;TVa%ED9)[iSJ& wHpq.N{tEQRg̙9S@Rn:4uHHrWSJ0?xR?~lA%.[٤D9K)ͨdOC z4s:Q#]ٯ@TXJ=_(JR}E|d2˺ڃQRJikս1Zgm5,ZB),ΰ8~dE3 MP|v)QcREYLObwMiPԨXqȊyVT`EA{$TJ+DЍ{E6OkWUۍpQ:Ji+8BARuJ *.#LMS b?{h꺱8Ԋ^vZ/3yJ&0;T8$ €~ƿ1s5j6=Hhp(1kf.7"LTX\+% y)qN) Qp>S)b%f/GC1$o#&IamQћkʷhȌ'KoڧZ*ok(M"Kx$R+괙:p)S,r^Z^(Āw{ g5ԝ--jS&z~3ߥh$"y8.RJ|#?>>:aj=m} r3g]$sPaC,FrRr \̕r]@0D>˴.<ƇRRqĸC6Wi)i2lDŝwpX$Jn{:m pk^;w'Q*%> ;')1׆[\p"e1 ,Xq-yAG2wO4c:8FR](gQJ.jSl ɔ 9IR}F)UjDܚRJYix6}3ߥӚ9cBiNC:H+%y5uS"P}0YR({}e|E9Z)nEH!R>VУ!1p4{G'D[)U\H#wlWtW¥|ɺER(J ќ(%׾RIDQ sΠ|% $[* Z94q*Shk)\T9,9Mp#[%w)m3BIbKuKoYNTͱNyzRޥ.G94`w-RJvǵdFwmY(կ8I#ۖRrV[i⢜&R0- o#rOtRFfJ)ɲ:s$꧿{)D/:p'0BUJBX.{)_(Jubp^?& $vírq?9T{UV\dLj,0>u0ٵ"^Y9d{>˥P)Urj[S$ՇRUJ3 wiooڹTJeW;Y׹|jM))o*a< #.d=;*%V5%`TTJCc%A󨕒K(%N_!@WJT|6ʔ }mJYE\׀R aN%)%wB.ԾƎzVJ;-*C8G2tLwV)X8ymrvJi+B)1 QJHܚgomKR6|R)֔l7kq]"C,zYit`-D1 DťybpZ׭X I󨕒K`o Av=iC}Jɾnw\KQaqG)sB1tn"b>.dp#nd]%fvM-;RJ{!q$:<`pgrOAfh+3l>r.նQr?{+%W.k7?ָr:VͪUnMuU޾PҩEuW)44o^ޥ_)\``_oپ" ~;}z!7E!Q \T~R)ϢεmrX6˴JFk}QA{wRbjkeBf pGo 1(1TJvR@G)d CB5n-9loO64F4laşrv/:ԼrQJPuUWBuZYTZn\[z4Tبɳ_{R/yDI+ď}Oub'q.NV'x/VnEqrJЯ[Q\C# E9=% c;פii3G oCg,2 2 )M#HՉ趿yr3P)ѿn]_S8H"O׸>WMd( Wtې-"O Sb yVD9W ^}4fȆqQQΨUwJ 'KuKoa]S>ʼPJ)&E Q$K<(bW) g73Jݨ37jNHUuN ؅%0bћ˸N'#3 Qaq*w|(JiLy"Q.҉EHTB/P{~T^G a-eDS+ ǧ,tR>yH)3Ó-:'!٢NLTXx?؍R*,Nq'Μ6ShpgcwåRr7RJow(!K ^;FVgDQJi㷃Z2lL+A잧>nHKU]B)1~~_7'k#7pcpȓ"?,?n)ףC$c#7Gz[׳ eΝlm8> y*#xS)E9ɳ.8+ΈǢO 9(AM2<[ !ETD'zL`g [J PӼH)ٓ;m;ɀ!G} Ld4[bLER⹐4 W\?\y'e3~dt2XOZ*B$S& 5RaZ(gRJ8 x(Y׉-c9p7i7;]q"dtx'CǎS@TSڋW(%wR1DxAn2V)iZX^ D.qHUBmKh͖t-0&VpҸQsekG\֑#I0Za^VQ՗QJ@RJS+7wL]ZQaԭ\ٍbś0S8ZyL )u-sq/^(J wk!I\ahstkF9דC=$!;,zV!ݴV) CsE9RQPNb* {h45C]zUԵ\iVPn9d DR;>D =dB }Rҁqʏ:F ̺P0|HwM3v󚊎Nzl5! kZJRE[(8miAC}Y{O+Xb6nÉ RJ<:Pbe.R)E9RR0!}Q)Hh뎩먰xRҤ~1V*%ͨ2vEQbRj :t⦄Sy(,j`]vmBXIF9JEF>zg]ZMj#EsO>w5X[&'QwQ[ޫ `3+=~ \w֦B2čQPbEHsuOr>Ͷސ4TrE{(Q+uv#d}]|^)ٚs`& -rEJv+J\ Ɩw=$+Rga"_V )8~6I%rO*ө|F 5:8.-t(4P@[ZT2~S{UK#v4DHR%eǔKo[hV`-_DbJ. 2*%F$X*$_c8.RY 9Y ex+FQ=""TeP["l\sO!AS3;?ҢG\q341Bi)%RCsUs֖dVSW`QTX~с@ixr,mfX}+2bz;s/^(JlTJt:5 btAV䆫Z:#2/f,=ա9)B/f +x!bQΣuR:^r޽& 5,VCԜ{~( @c*ahq@0Pa'l%J0BޯiPd8`:PkUf O=TnRhcY\C晖F9yJCTO!AM+}i\N,WmݷgAoU}3xXW(Y6D9<{٩zQaٝن#ER 3N/l~HN :$7E*8&?Z gMN+rwTJ.3gsGDũn(qR:wr7`s Pn:͍PG9RR}c_TJol.D9;*]jQaq*zEQ0@"`rv(D`5VC&>Q#RxGW/1ϔ'"R)؉YTJC2A" (Ji S)u{ETJ{P@K-Y0(J\ S)]ETJgrvN,z@*o_Z=lصKد/} nr[EٓVW&yJi{nV@gQAz=~V⨰xRZ=Tv;Giz>ӏ2.b(1TJ+ӊQnY:]@9Oibl ]'5Y1$[)E ҷo 5q|鏭vh%dnn|YRB)t:svD[jbRDp_tGQb*Gz|Ec>u TJ+D ]Q0Lpޢemvc~ ӐHM\,d wxOxtfl;Q:> Y>TʲÔu[$( 2"EEUl XSl&<Qn٪H~TqzMH)CiI [Ax$y$'UWNJ Fv%~EM'YG)nC^!ATX*%[3@ar(ꅩa!h`V?"R 3D4DEkwM7 Yό-Ԋ">ŏȝe8-糗BH$3R' ҂:7B57RIT^˲2+xRG.u&}=H !kܱD,#3DqMT>-WA]yAQ խ*@SQ:5VnT@f+VQuR٪21sAk63ƢGg"`(nqB:2QڭUJṅJ3JNXj]=@ZʥJ*ǝh\"4Z5l4C !VTDB 1t- 5n|v͜+% RYܙQvS1(g7u5gRMu7B53bKg=+ݴʀ@brFhD_ː~֦t)ő?!!9Q&ULV^,Gr\:bEm Yl21.&67 md%5]kJ?!꣜GG)-V[dsRpƦTRJnBpQt(izMɅ5yJb H1@MD T9A)mR\wEQb~M!YH-G1Na rvCrs_|5It5J HqP][mS>LTG?(0i󯅳grU=l~8z}^ܔpu+X˅Vpj& 1= ,h-쵢ոs5y` ZYjh۞MPc5}WtbkZT+%Rq Jpj`s?9id1k/jaf+?o3'Ey-IdGp&dG0r.խm1t2da `k(?#|>B)qU55" ]wKYy< :g'!;cT8y=oZRJ<s~Z/,+QJu.zI+q b'ia*%<%ZJ;YkUJA-ku!@)=[(6PtR jrU*% /8(!+ȖbMIq[&mdpRODKNaLvqSJ-O| /RJzg¨\S̘dh.ޡY=W(%;l^+6f [J Z?taaәE/rޔq6E 7X].w+owiZx .l |ć3tp[=W)Y`/vO#Ak-F[ 'mpݍL}?ҤRr:THA|oǎVF=;9mʬㅋF'gks1?)E6s $/F.oZU70c QnkMnXbנݥ}^$x!=kzJ)ǒ&My߾gA nA| [UUQu>2dAw mǴR+ۺք26pIIgMC> 5+lQΣ L vFւJ9> ௜8poy#Wm= 5Agv\Req]2e?ZZc\Z`Ҍ7yAEkݮtM"9C(Jᄈ8(;)i@*%NNߥ \$k||ѣ, J g D :H$0MV;e͝'7lE6Y_1m$nAT-J%ݙͼQUJ+hgW< X-eOLdha;57MoQJhE0*64 ^0E$JihYMTJ!`&WJ||TRJ; r UzR¼'|1%f?)o"'8O:{OJ S4יܺ, an MkN A,nUgQk#L~]Ъҳ^GwRQ:~dlѹ&Gd]]D&QaqfASWQ)9XhZk<XZ4.ܮaxTqig1^JIXGQb\kIRr]".@JuDTf>}VJ-RAeg\o(ڱ&$[NRKcnjDJkMd"u]0n6OfhU.lSrͳE\S+fH kOzuh;lH<5ѓ\ LF]&KP-.zMAFSЋr1jeL¥~)% fH(hFhvb x'pWAeSJCQi;Wknp- 靓Rba &k 9nG㱶xZ RZAQbF)5hcAp JnLܹD9֚Rŷ΍$ fv˛LF;!:XSYޢ#3 Z 4WN@2W\7s]f8l`Q^(lQ7Zê2.a+OWJTYI=*7]Fjum1Fk֩# (Q+:O/7uDla a\wtR:\CX}t ;q&~J wlG}9`hu[nqӎhG\4d%ME$t$G:I'Vu h鯉@+w?鑡ojaю\V3T)q6wq@kܔX#1؀ל$o;:>jx)γUMr}k;Uerqb[ѬDzxe!-Z{-jnה5u:PrCwQj0#gRсJ 8t3&*,n}ѡcsPbqGiwJ\Vל-RDQbR$@ Ji#g.}rv+KuGKChȟ#ܽY(%}Yq % ,4G U!c|VR$WVB,86LGԁq{TgWJYq0/.*,R*ߚa7x(A%V(Eхt-u_Vu)QnR:+f#J[Ȟu!KyL=&^Qd&Xf*(VOvⳓEQJ2uHfl~[(N)myzݚMh!pR:Bɽ+ 5,a^~.cMkPwxO>9zųS+!ș+'(UB٬h Gq*%;)Y9@H5PW]OſwU*+@TЭ.PTJ0}+oe/G+.+ts\+X#J{.q.yTDΰ &RXSdPۍ͑ݺ(J(󎣙RJRJP\)%!F(h/-nAxP(K۪218RJ. Œ#8yԻ[d!&S=4Xq,.IK|ITX\+%m=eM@CI8:UJIH,OR*Ϣ_|1jjr46.V3f%&~ʼtkkΆD9;EJu1%&/88Iu}Tw, R,}tB)Uΰ@\c̨}֦tQ?anr:YiNCY"nCo*mW&# a,1Pf[M`"C;飯ҫRJnU*U󨕒h kybScRIQEh'EYiѽRR/p2㔋"_ؕ#fJ]YĖUQPRջ~(1\Smh|zLb?tϳE9RV\q^#TjǑr Pй3k+q fK)cDQbf,9mh|k{. ud Vݨ\ptrvw*ld'LY%*:HajSgVc]_)QyTO?;>J)׾&ӷ1oQpEn'N^J )qآƝژx'xFQ J 8VikZP>,`ݹJiTTO?{0*.YgE ylQJJ wRJW-u[,۹(gwR@> R)G"8YTXQ)R!4jVId (RvǺng`Vò2AQ.V) Ҍq[m B13# 15n'_1ƉUcXqH/ "b8 T+)c EAʖ)QT9]^7 Qxm-ͱ!eZg Z plx)k.#h2Gj,9;ʳkY4~ג+sʼnƖ]9O䩂b$fHJI#e8p 6GZP)R=RJ+[1S,LOyksA2nQXέM;\㏜.t#.\{%Sh.׺ES#?.Y֑Je$m k jډ\/GReB)! f!=xUA3S&wg; zʺ [Y."С-bC:#BğGT&pcqEq5vJōLFH66zSg`=NElnjAWZQCh~@ibW)i$Z  nk,%WK\F@\By$Eyvnm݁FǴ ZNz]*,C)R4n^mQ:(&q15aU?M4D֐ ,LsxqHֵ@Ң2Y1[պp 1+ ]x)z5 l<|~Vuz2(;PRB!90X*{p)n#IꃪĆt,Dh"˵. l\NcE9zMōȣS"\ԜwR;pk)6bR0kJuGO)YHoK/[ahX&onFfe ER,H(JL):5}>)\i܇;|Ұ\LDջIvGƑeE9R$T+%C㶚v0ר"# Sޢ@AK5t 6 H _P ͔Dm}h3axu@,~CTRJͩn2%!EzbܲXc-{aPv:* RrqC[z@wA"+d{*"d~lt&g֔8ٕ\2-@i 8j=E}o_)QtFYz/vLي b5k ĤRjuk!7!GF~4?u5Z.Zx|y pRܭMKuk3ʻT7;Z[k]Fh &'xRNs ;/1PvHoSs~:k~spƪ~MضǃKA1'9 @agYʭ Ҵ;r *]_ԜYX !L萡EHU5Mh]I۷=YTXJnG(;K!Q0cJE< l]%Jw>h⧛CkMz%S.@TnWы|v]kMFXآz 5Qƍ:Pl{a[XmT-6hP}Q^Bԍ|RڈT>L"<`B)q5k:D E=(xDVw4FM'&@bP k^)1[k)CqMűt\xYa>`$y~_}۷}ۯ: iT<*%| mƻAs(t\aG4M4n Sɨ}h!R@4tYӅjh6G32YB]W+%suS vR:^,r)uѡ[\QyZ2IOqG- = L4!sMbNTwm?VQ&t0Lא6l~CEnl{[Z>PJ]-|T,יMIw]}8\h] cLRQ+B)tN^>yg v&E@DX1 /-ZJi{%Ȥ߷%|v)R€wȔQ*psහm+%n@Ƅ'GHC : 4ڢ5.Ga[ Kձ~5xvn@˓V]44)f}|o'.z-l ȣ~F;:L)LKaRݵiE7OuN6qS1*C+e#.mlp%0?[Qm1 PJ Y`,)[vvK+WxYUJK0Jq*#r ':mQ+!"bSPx<ӧR5%x# Z ,Y RfEWJHPۍz/}dylW=[J)mqŢ6<-hnNk_DõÐ(xvn/a+dCe>µnlnq"yZclW2Ew+j찙#aktrnQYM+l"s?H̚ @ǜj~Dw& nas V2V)18`)Ś D]L9Z6fʰRM"TJaʹVJØMA}JY[sJ 9vZBnzA=Ʈ)Y SSJeknD&Ps+%s~hW8E[7**%O(?.hvN;J)W,k ;JetjRݵi[JE hTJv[?e*{!QJ;P :V| 놼B)ٯMw\ŏঌUJ6zt{奴;PRTG(eEC 6䦡i=JQR:ݭǟjRyڕMUO~Qۦr[mw6fZ ŢvE_t€C88pOt0MF"A@g{">;m%v=T+oy-$+g]f ?*]@jC֏9׀JCu|7U KzDk YoP:TJRJwd~0P5 m:Jg\tVӲ\ n<mR܈R[{˦nJx{N=`\k0\Xش+GEny)o?(ޖ1=b =uL)T@&n܈+JihH"C yR:sRXbۛXg^5@R)Y%"<S) x*'YTJOlXgJix&8TJ>XqpJ`S)=RzRof[:TJC3)H){#XqpJ`S)=2RzRof[:TJC3)B)l1<c]7ؓgOϚwMV|z_e-4 Qٵge<S) x*V8Zg!ox9+GofCb]aMl!LaACxR!5CDTۙOf:}K)-j#R:>(JiQxc3<++}qg=үt&НRgy C  M\u*'|q3He !xiɂ0P~ˌI<pUC$f<ڞRr 6gG/?JY[}#:3Ux:0LpdJ)E@)}_Wن oc1/g||܆StCݦ.|PK]G2qZxp8-tǩ+qOBHl, :-:b*plu5z+Fu_3{?5}Os~<еHqs)4RJnAY̍CQK)!CNa$&V Q\)՝mNK&5DJnPD*B56u`qBrVR fX1HIdV/܏o~ ?~wZإ-9Z7 0XSR>¨xsC[j *RdvaRN5T:C6v\^uPnzVJi¢5NY['o8kmJl?|Y[@.A<,ݜS) x RaaTs:亀B)Y u.X:qs~'0s:ΚR'fiR1}+a橎e>`:T)Kq\in^x(VЂv_JN;K̐ oq5sDYZh)jIJɶ-*DRIffu$/TJT,|WZnk2 7ęwR+%n\WxHpʯ_{"ZzRjl}:-RJ xyaQ]%EDZg}R):0kG(L/B Wp*Dn{+S@-kf7B]m?οWA+K+*#lg*yӑ<5QV*xRںUZZk91+\5rCު݇qʻ9_ܺڱή^Sb"7f#a\w>آ Zҝz+R]ws5gXW(O*SXGNJiLv5^^k]B ٹJRʼTJXַ_tV?} iNe+:TJE!JiƄю)efWb]RB@5ESʢ*epR)CXGNJiLv5R)fG *@*vm6,bh*Htr_@KZ"]ᩔ.AY!<|R)Mɮ@*ʬuvnNVEJ{lOf.@88Mt0Y\.c"oA ٥Rz oW(%-NNJ]+!x\=='kK[Շ]\wTXGNJiLv5^Vv|!"%Xdln{#:'.jH}Tmm\xgr|du7R} eLPb+N8ϡR(lC4Hſrƥh/G&j3Qt+OLTJ gՖ}.B,yDőR*] w*%´jwY$ϛtyCRR8W/[(%m!VfTqG4 @F2 Z[w-OȍÐ3eF딒pB)u~;t0䰹q|kJcǭk˲JdWpgWix4gqQS)ScW+%<8^ZTln@ ה 6o0"g\SJQM!ͥ%# =J SJ(S0ky@_?IñH)W)iMH)m)>RJu\y:8r2TJ@e!NZZGx.8lfoUPbM\J*nή $)TI)S)V)~5vGfRJ|UgM/tqml(mRY̐+&dWCUJ)R]$tՈuvRZQ|$E R$XEzkDVem^jG4yR:,. TJ36 ]Ozwq3-MUJx,\w6F@*➏@#'I4 T&o[C *Aչ1nyYk"<GS) x@*kìՃuvL[7-ҭ/+EbGT9O*I2HtEkuz4.ңrƥRq/=iC88Mt0Y\c#A ٥Rz-׌TJRcSy|Tg_#*'$PjJ)^\qFEmE8v'{ USA~:yJP|Cu_(߫'^t*pH.nZ[^_)Gܮ-bh*HԷnq7eq޶ťRuvQJi8 B UۍPJ`O/&k֊TO#~b):BG)퇿Y(r pkdAr9'Q5B}ɳiL{fǭs ~YLff6U#'I4 T&UJ1,\l5ǚx gzFxXl]Nc!rJ𞪀 Y/x|eb]_)))TG :ca"{C2,""eRD}3^e9+ W(%OE\S׏FO~nbdA =mJ: "[< &n -{dEC@'Ě_LfxHka(mt qq`)ؔUg묏E 7PJu+%!yR:,. w*%֮gRҼ/H]kϒZY&]竿 roL+%cX8\S}R^) lP/mu""e( bԊQkQc-JIg1'}@Mґ-Ě*uJ+MbKk&ώ@Ċѷ*9CTdMS\sP 4-:+&+ĢlD :8r2TJ@e!NCᄈJIú%h9)׊ʱ&[W{ShW}a)ήS٭+Zt.jB;^p`ub>݆gu_K;4ӻE)YwQd#b~]h'0?Npbr^AQX+P(%ǏɊg[hVLpM&K^+\QdjUx:#&dWCJc ׳R7=q"+CuvK F (Rzn'(_[楖}Aݯ̀[szI;"E_DժREKהl\Yj*V&W ה J:c8yR:,. *1t]Jik *Wmv_E](%qǦ$SeQaemWJӿO^(%P{q\IJ5 W 7AɄggw\M.jlUlk)% .UJBkZʭsk0[Er:nJC V XGNJiLv5^Zu= z6J aGzgb|v5}w 8?#kJ -P6T \LDuŁ"P\D{(kRbd8 looQJ`!Lmez-w+RbNJ& DRאըsOk]1`V ~l5l)AmYʙ"0yR:,. W)kYvhϸE_غm>/F ,IpåF68k7tt {(Hۢ4wKS3_vB0$ᾈR2cuQqd>&d"o[|G~7~DqsVu{h1+KI!\>oNUNu7W(%HK·(+LG.RE͙O춺 d>kuìE9RZW&> ?'4Y5 ,7P)uP9mwm~TuuvJo?L-j V}sW(7wpxbG`5U*2 *%+Tuc0K|0.V)=lR:,:1S)-E,ӟpY J7=[R)ݓϯu*q`bah* _VzƂR* x7@K4|<TJGeX%\l*#g!YVẑR*W{62٥R' _*%{S'Ami>d%=<AS) xֲc\2n ݻ~8loE뜧øET_DEuO=N/+SCJm Oz*yl#>Ji)b\e'-(E);(M.7* ZRJøE]\y<*eoQJB<?4<8Fi_Ǚ):S>rK@j/ %Eqt@$(BּcQ\6R XqpJ`JOZP*%Zxjs cvM O z8 ]ѵS,B;1r$53c! +6vn-*ceruE9RZW&ŲJIYn6׋T.%<5@nCk9h- rMg}tU a ^~wl`+b͉uv}vVMEJI!9be|kR]EX)M^ƄT,dDJ .$pD}RR)9Ds]͓— T-644HGpmDuG< A.+=lA|ݮpX$DJ:ǖy(%9h5S05ԹRno3nXgQJrqJ-[`;J:Fn𦘐\g.BxN(%YE$@JҜOq xMUSM0UCV2<^z*RYi$ƪM6G?v*TJ!mfD!e-(v5)z2ZJ]k!;JqEq_. XXbC`ks=J #Y:ǖѦ'sqXvA}C_+%{u&Aw_:JY5PJ]0-knl<H8הJ6_%q rk!VYL6O}7O9<7|ZuGF\ط`#g݈ua2ucRZX'o _>{'*+a#IZJ< ;nz*Rj9ǖIG s)% G/kzQU΍Ht􏸏 7PXe:RY.moM:iiw"3'+])R,Ĝ4wR+xcq0ڤJiPJ}j eJy{WtܔHSv纊XVlJclJM}F`doK<6XKOLOW?'>+FJz d[!>&Pֵ[V0SMl5Z*Z;Adb͇U9(%u\1=dp.Oob],fT1,CZ׭ZTI-w46N&7UPv³u}RZP>,E yl>Ji)b>R_L@s<ERZ]ӟ[T rHYa&ވ@88Ot0).הZzRJGKhW "bї `ViTJ3(eD`H:?TJPJ Y&MF:X4{=E ,R.D yIR:J)ҤdA ٥Rz 1֐TJl:#TJR)R:f E ٥R:YR)"Ibt*LqR)MZLb]*a yR! ãI9:#TJQJWu_^h{[~?.}d]þS[tq|x xeXg9OiJH9>UVhZexdZ)C}foJ @88Nt0)Dgٿ'd DעGV'>F)٣Q[g9o+̔G E)!y`1z8hRvخԐj΂ޢ0Ꭿ7Gmr̟Qۛ|qfnʺ'CvF*&xǝEqEkKSbT̞6r57{=bt*LqJŢ1ț/&ߋ DžҸO!  +dGү+_}W{ 0ȸcl8&]X  wx_d.mֺXgWJb,8l#")x^AWiHc;z_6Pve!@ǦR:fĽB)^c`PX\G4= oj{ʔ)!clAjEKx\ZHFb#muE [mRm͍v">|Xrk|jCsKuGҩ1*%Q`|/un/K?&1t}J[WdbJ WBkJ!W3ȓRq=]m9R;`2:'u¹9KG 0!S,RJZ/e)i0d-ȹ _9mrGYjZlfhxRbdf\'C3JgݔQH9^\yRpK~HuBs" ܶԹ >ø*]kqH:?X$*%h$BךS?Xq[_$upzǾhO>N:*gN_̳v[7ok`(%nl!\9C>3)VV_\\*,ekm?ʲ3_ygFȝ$Qd9{S6 1xMgSMnT@8irVe~b aKfPqJ;qVxzO jڪ!dmN(%CJIkΊ1%яr+Rw4@{ŤLP]i ܡv<_+b-En-y1@|P[Xqp$J`S\R'+%,+A?,J~ן`'/5%X|p8#wM ٺΚ+dzҾSP2uv%DVx *VXQPHH)io,EJȡ dY%TV}.8 WHܔWR\i"O4&d5W8XČRB-177V*~Rzϭ}{֏de:#TJbD2 vI υ)+ IvezlXN8wZoڰR YIANDE@(%KB uI"I)b'UbNRe+ƹ;yB)d- hxx4΀ΦYL6O<)/s5|MkȍX6&[C~ߜP,?Xqp$J`S\R;~c_tF±FS&DTjRV`fy49u7D6m+,S8gq{#kJ ', &p`LPaM i:1[]FbNW)1U7ʲf yIDAT8po!W(%v$ 7~{վʔ0fvq{괶I4u.g]*s?|#v}VHJ5_ݛWH:?p۳x,vٷu]q@-2MT>69vw^hX놬/õZfb<0t=;m`1H1õh܊eT8ԺnŁTi([0ʲA ={4EJi2DF yIR:R\ر[&92NJۋ3NOz.UJ60KO@*}iO?MK+Ľϫ>7]:#TJRJء?eB)MբfE */7pYX*僉@88Nt0),4XJy <X@UJ+$.@0H:?TJ-%J)fvA ٥RLfETJID Xqp$J`S\*TJ4<.;L6e?Xqp$J`S\*TJ؃y6@Kl&fk:шP~H)ܔ}k: q|Rprf.j/0ErXqp$J`S\*# 7a-v!<dž/=ӎ\+ZE bݼR9ncc t=_GvVk:x4^zO8A:!ɥkܴUJulV9`ШH2ܲyo c6 SHYD}7Ӭv+Ġ89xcRkhJy&^Xd'0  = sMU2fhͪݰ}r1Z:J XuGҩ1}۷_?__J ݤ}.Z)']\ *|l>/(:JIޖΎ{8Ly[V>Ji~`7ed 7p/ io8؉ǠۧY*%d#{DGFJ>. G_e9؆JIg*2ZnG;\wƃóN"4-Rb j)Vz:#TJ ?_*%}@B3H4ÝE]M1dŬͧWA3e#[Drkq:Z)e} {(ȍ:ZQO֒,mE}֬|[֔dHе5NJ I ml5n9j^GxKz)XD vժdGF ]SBiJɂXbKVz:#TJR)$JIq/ÅEJi\5nkT2gI[[W>ٹA,sZQ aQ2Bs[wkV>gkҸSJTa[VJv_(QJlwͬ)'ugkťpM眥Gt,Zq<S) cKtRQE<~ LHqϮ~NҹgR$[TJwzήENÝ:ҸkJa8"4/\DŽYG}wͬs \S'¨(kJ<HOr1H]E>.UWlɘ-#X1\SSS9\f*7ۊ[Xqp$J`/^?k3JXuњ6ɰSJdm>R %Au5 "`qܱήVJ Kzir̍:ZPcq#b;f977Fۑk+ ^x gM"[|H?.q=<.(oC7k?vkdۙ3۫fkm3$rM5_ sc&HsR`P/R:^)GhF w뱹Raɢ3"NЌWM8!|9e_ܔNnn">0uYa~j_q(o6,~ ilncҋRMDh&V ՐVl'Y9:CTJ~⤔z)ґJZxdu]7d-|mf}[m:3[hZ^,rc]k]?ȱs(ȍ:܎cD9ʡOj+ғ:,r}bt*xqRI?֢W:yn /_tXg7y1r0R:,RR:;0j\ՕEd:#TJ~\I~wZW_%d:sTRqW|:cО=ۭ\;ͭN϶@88Nt0/ Q)'P\}rLߊ@;F)H|2puGPJ'G{eU<ݿkJ~7|>?ډgwA>gqBϦ)Q?ŔI1+^@t^:R/nRJK R)tJf@*M2)|:RX " HJi&$-;?/5)M;*&aRbݽRK'vJ@*YHydRCb!;[t̵y×7pr<9nQM#X瑁{"p"-TT(%H*%'nvTJ*{J4z: f "Q󏪌\^!XgW+EUMT))dikd),TJ`R1{_d'gKݖΞ-'i{o^y1VX=.XqbE'RjA[+%QJ#B֝քG)|Oa3qS(؍Q9'T83B E)"nO%G2=xRu\ׄ xxTs8$p#9pF7=̜t9TrWJo,]^gdƿEq=B~ܭ3T¿<wIh2eM8wYkkHTYmfTZ Yg`=8ZիS[7}%mɳF?HkKCs =% `Wyxde-q!WG`iaac*͸ܖ=]"7άy!c]^Pvt1,?Kw_@+%~ c"~p3>vLC)ҫvB"@ɋpQ7eB)q뚆/eVp 2׼/RKzEhA JUeڧfôHҚZͳ%k*3HF踔 d o6k鸅C]<렸q$>u)JYh\kTPvm5tar%r֩YZVd+e7ᘘW 1$u(`G5GE)q@vȰZuEj˭7p;;xLߢpaCsWHh`F& ]>]3H۰fDL,.GJOJu<[ KJ֎Ȣv,HCG .I: 5$#0y+6R-& ?QzdQvRJ0RSۄfR1Qh92TJYBn. OlyTJ*%ה!EAOEJ>v@L\+5:HrJk>v]#dR3C2֤-FmmeL1,[yCnfMI.XSRȰ?)kX~ ݼHuGYD`J K=o3tD ?gWǏ_#k-i񣉭+(%:Gǯ5b^lECR) c]G)q <>EK|=2*:tEerV]d?J`KM r!ږ zΚ}>׺2 b&-wqe*%Y-|[1cA2SB')Eɪ]p 'u3AjING`Rٵ)%Z¾qlxvҺMxM)֥g9j#TJkQή,ǸqF⪄;iI3:e\+:f֦E}#JHͨB/p3QJt!2tW5$ó9f=qRdaFy&ӥ|H.Bm]SRblz[y&lP\/pl!9:#@"0@*:L)֒n%lRJ֕Hw!g/*ejJ9MAw &I:9G=J)g$ הkF`BhFZrTǁ5]TGY?u5^ܡaTJ+=Vu XAt؍-^) #Z?Q[m̳ߋȍ l:z5VCJUuHX["X1>R<]Mi{3vx-y&8TJG*%kiu[F:=yG)-Wf#\5֒*v(/:OC J2Ɛl]?Wf]K+cRw|dX1fDtV(%*" &:-+5%n=޷=#fQ\=IGwM~[v߉]4h7Dvlݫ.gtu%H[ 6`.L ZxPF 2)k`:ϭVs󜳟n{=%liE2H3ɃF]/U #yݐ8l@JN2W/$U)iP>T@/#D[W.b5¨~l% a@/-MJV5.z-WCAt.o?X;bkJ)qa&50A[EL?G>c'eX@Ot j=bJ)v|d9{M+:>%2u1׫z }[R1;s^MnE߫\zhR %22|CGeOhHhx)H64 L۠AJnFӊ"RWĦ_zjwkM5%͝RRLL@Jԁ.<'^Tj{ff#w^z`̗N\GYA'qf" r(>E 818nZK1N=N,) |cYm) q<]W߭$M8 mek {_?Y*8<ÏZWJV%s$qB "N.G%8?Mes41Ti>Z5 RP5 ,zoY=ۨ(IM/BM/ϐXc\)YY)&W 1Oc6 ˗9=z0F,j RQFp^Z/=سX•HYO2%^S2 إm_7}7ɳg{zrxnCJkƎ4Rs#%0ҷ|S{)yxr{7ߛ܊7;b" 8-ʼ)V(x@՗8Ijh:.mˤjc`xv9H)Y6V"hB~QDJܐ r&R*!}!>5miEM4nG-a"f5M/L;R""HZBq=Ĉ'_ߋY5.T1:_DufI R騘'8/}#n}%gK %M WAJ'/$ bΫ:ZuKqw{扔NR)O|O?WC?GV$V~_ߚ|ȟrB,K~'O?/9@J{wCW9aT*jz$v"7&'q?^$n$?_"B$.}DĬ,P*%їu1x)y}DJie@"sKJw8|9HI("b$"Tl爏6 (@/$WGI~G~UIƘj+RDJO_R}DJ4'(t"'4px&(, QĘac^|v1F|&Ds0J9^)f-˻^i#6O<5ȃ])7*^o3ͱ Xo*"qSMi<_"y"5R1RbdkX˧X ':xcD8-Od1ާԌ)9f$7p{\tܡ ,%4o) +t{}HiQE')qAK}$lcbc5$1K+M2%*S=//7U P+bu#6&RRtfDJjB"v(kW(:)ϦQ&R2C %>bCġ`ŁRz! "2Bf(ާdVJEĔR#%2&^/tR~$K]GǾb@!ys`8c*07G@GLH#i!p97߬}RhzۡIQoJvm;WdHP %^<blv#jȁJ?])K @`xa! E$2G]@/X-I2 , S ҳ@#>i=QdEẽA]YHX1Bcb bgY#_,PE}\pNtY}J@M=.c-\O7pex^!AHz<8fO};…rrwLoqro惋G4pZsy ȿf x(wJfP;t499}&Rj: =So+jTz8yMUil1itvGhEr7>8N*HɪH)v4Rf2;Lx!&AbQ0 GD=z8x%hL6jҡ,"zEmq8Hm%C־͞%LDuͳM`s0WW*B= aTg9)u}O ^I|U$ /ү2>\ I. ɣ0hʰ;MN|jgMuE~/,Uol+Ry6 ލ.<6܍ #vr #UgH6;Ǣn}LԐ#Xt<rňM)"d9{0*#v_4RK]F)IQ^GsD3wxzUt~KlЈS5Wq"gш78=|f"ьɄt4>܀V| R {`~x@Y)O)*hnRjqHisU86w#z>US*x9[[S*豱H0cӸg^3P)5GPő4.W0vqx:VvRԛ ǔj o+wz~KSH<@J3)g)CbX?tf@J(c3X#ݥ^܃+0æl@U^8F*nmFJl+B ;u;ge5j魩u"(-SZ]ucwxyS*$,NsNWG4C@sv:w EdP"SEb)cJ/ܣfN}<Ӫ7;)"R ЋEH4cJ9dXDG("%kһ})i6Ou_ʋ`-=ci}ͅRv\:~GJ>v]\Uxd]X.IKj;|*| $RJH 쬁}KH~>J$ED{'gLie/V_n%+Y-=,TG!%n}"&ͥrCCCJ&(RS3~Gso#~+\HDJ{_])JhҟDHI a-ţSI͠b_Kc}} ^QEM| %3JY7 J$ e@0}oѨ-WK?H+I`_@T_g*tRB‹8pFT#uHܱ+ʨҺvD|/`*ԹĘ+]&WV}i:4)WMH!G2v=Gӯu-Ҋ^֞[mD vFf6hz5ZZ,Dɢ#y s=H/~>Rg+&Kt/¢+qxy]⮈/q]-r\;Yg?w<'hWJ,UEp] 뗔@Y(#Z ȶ(/>& ʋKa Pd'Չ!(ZTT$ABkG|"n˗^ldml]_M 1^MYh)QRHHuZHi*S%FNY'X7mSZtmMo܃+^/ "= RSi ҩ# #W"^t!m=[ | ִ?p 9%vqS0\$EDũYX87~ue<^ g1hBc0ʹDD0@J& wY;OUrב=fII뀉c{ԨoST4¢Z]#EIEu׫刮^ˊ"٪D`5Ml Ͷ-0<7(GIR@"V"^ڄZAHν}hDyF\FNZL84a${޶1W,p@MϦ`KOQrJ?X-V)0iS O,yTR!ՠvRŠܜc<(aqOWѨ 0YCa!f5k:i5[Vl ֿAo\'5nzf&&l up3xᄉ)R@"gAJHe #%+a|_$n"irϻE&-(BCu| iw!f툃KRK:@Jqs})QwBv UF=tDJDę,#11=<!kf "Vߑ=#*0F5R5=ԓDU]'̨~XWzf6jh V͵YwZlѢH !&mabLDvEGͶ&OkJԬDJyy_HIkS-@-EE*r-~7JG8"G >"EԦ"b.]L;ѧp4RTESJԿe7{uVW (XlsͶ7Ly} @ n8pVaή3O):ZϢw >#ev9Ss@5^KH)5H Jx+ ixǯߋ.r\ lQ@2k }]CyfT)޹HIIL կFJΈ!b>ZT| }WU}Dp1F둒+9ʋ{ [i! ^H ~q >Ck6^x[F0n|Cްm,: C9L^j,P"9oXDJӐ{6X;NƯ;  Zr-OW91al/[OއO8Uϋ+S\)N+NNl:Ť:z׆I*Yz#FFR)Kr?35ւִfSMMټ#[&R,5u{8CB"DJ[DJ+$K @"H wA%1Q?.G[<ɤPJErZ-Z/ 81UC8b\?YDTq{O! ֠~cCbUCQkk쭮wUmM{mޚ6Xwlx-况U vEUE. {6q![9 41낍.y"9oX)|eU0ا~$iQ%ʢbQ*9HTENaΩ*8CEDJO+|"kh`|mcW|V]Lgt?DJfq 4(@цhupq=磑juΠܹޒ2O [#J7pC,qXI)]l&VlMDV4})rȭ.Z]ȉ.R/f"o Ozg+ ~~쿁DIpj`k5}"9oX;A-h A:F;za}Қ? HwBAz1RһĴ_Jtq7녋H+7f $Rj;B(68/H.@O} >19+"/~E(/==sA)yETe/T$ÊS*qv/0Rv+vJM F(eM<ÿ :.woOIJUC0ֻ\ܹQH(g35H T$Np~]H "#_/zXq 9Ws w׋ J O1:d@H/br5S,-G 5_A )V"߭(L6w6sI ALkTX'$w %.*4蝴Ѩ5R}=*_È,+sgiPiݖyRqmZ_w P,jHa"EޛH AzAЋJOF; [q &>AR" cb%bXj1$_=($Pņzl7)&m %IYb@)6bLI'H+ O c}d&|,7"R*rĊs 8/#-r#T %{u1YqQDJcFH/}rADT5Ǭ\XԅX m"`őR]QihO]薰$*pPT+6I.%$m2^-(PjxA,-4H `{>ֶYZ_4^yJ}G|EXȑЍc,G1%{b(@S尕9마8Bױ$V8yFj {l)f4xgͿ^iZd>EV[ @J"9:`ޘݗ 4=Ŧ긍l7ws#u1lgd>li ,W_C^5(]Xkƀ#B !.#ず?X'l4Z3j"(2IT6Y`:U,5QUAxP2%FN 4B(X#DJgwSmXDJ`X#zvGJM7hhQ z-XDdp7jzޞa!2|%sL=߉ !hBbuֈ= +0_*^`^)jVfk<;)Vr)cQu-GFvM[ +4'O ɳgasg;4=d=x%T{ \^tښnhS+BrfYU(ѫBioԘ! Yh%4[ll094k|)I=7MFzyP0Vկ Ks6I| $R:¤)DJ@#rc8ĕ3&4pq(&G9XlT@lU]EITV *Xc¢.8KUof:z]a籺mW.ov%>~i6X cDe])ޱL x-i^&)O96i R橁Si d!3M D L@JϫpBAg++F%a UM$R'Y4HT^r HtĶ9?~KjԻ$RXVw"n=u16_f6$R:rl@"tS@"+ ME)|gDJ$>)KNaR|#YGv 4oNB??^޿NE1鯤NDJ'iw $R:rl@";}LW;ݗwͿ??Jl"{W ﶴTTu"]d)drr 8R[r>>{S/?&M0~CʿZ?|?lM{4}";R/U?>If 8R?'>я~wO{1 |~h%Rj@HF~J0Xr#X3zٷs=*޶y+zlRZ%0K"%͵M[E(88RzwTݵ }sSK0Yf6;Y\vJ=aXiR*ڷ }HYqy HR}=mkTpwn`Hek L7J bD+&P!9J5RGMWxG^w"2^xw}w'O^\鴺μYj֜ o½i_S2YϾK$sH978Vcj_bLI$AJeTZ*QMنTAצb &Du 36MEndSiG1v(ʥk#*huz܊L춠\b5/R}Cy{"DJx$50M1Ff6HP:gXFJ\"\^p;qm rGԡ#MGpww EXbq Dpz-Rr $R0}i0&53)VLēB61REb cJQQ K<.e?)Tׄbhzwlo6z6zfxnS4ȍRu1E2'9EHzEJZRaq^b(lUᨌwppnjYCu'9%Z@"infE1Ff6E$ܡxv+5%e>Wt=v)+`ҝ9c֋Qd)-/1)),ť͌$sSX5D%L4IOwߍ0aHhᑉimK6 pkZ`b>>KmzHɅ ]^cqB@w8˛H5Hi5h &f@i J' +5CXJdIV0LIw"*|* }J9q:zWr='f=Lɉk{ddX*XHe'y=H| U#pS*G׋)EFwz(,)>n51YJ*P@bFn(m)JXfc}>DբWx(}"C՛̏@"9nEuhf6J+JsV"%"E B)s˝2nѯb3x3x<^]|xώ#Ǐ xWe,3A*|SŌj,RYFJ~qY GF񝌔Rza@S%b1Y}7)I)9DGnBqbIT;_QzKUXw}w?6Ң'Aj$ň`f &la&R2Ҳyc #ʼn;.` YI1UI9aB@%>rc!,9_E ̛5]BVU ʳyY١/4fp4RbZmGkMCzwDJѺޣTRQ<§mGMMZ*,R\>b Rj6YgIHzsrn38F`1U $+StmN椟L) N1Rň`f8VH{HUgzQω Ђp_Dc N`YxE Ww(bD_ĝ1}uX =zHFRA@FVZ9j|5}JҰ IVH)2u׳I17hͩg68jn,&ͺE#aE; )Dzc5 ! "شV]!%w+'_$XdMD$)-zIx cDDPSz;΋w>y_tXuN%|AEf񸼸xO[*S"HM"EQ!8 V)?ǵM)QFU,X銰V,gMg8PoljA;W*I]I4& Q *JE bBCB1/}`(M$1 `Ca,#4g`(6mF)!+lH)nDoSzsЀ_57c5*miMU#C݂dXFJ+5dWR=^GDG %gA*Fl::Vę3yDNEˏ]fɘZfLv-}P+Mgq"+,YSi ҩ#9HWGJlkƔ8[n|WCDJPSu #6 G/"%=Q?do(YB\M@4N G&DJy 65@"+hrH)ιx`J}WҚ{HDQARax>;`蕁<^ɽ'(VN{$S\zi#%b]$~6'R˒e<):R4p9T>6"*Ҽ'ٓbq ī* ;Uw1qS/7K)5o޳+qVy~mmQ )w@25~6'Rjv_ؚ[ץyWܚl*\Wɞ) }sɜs?aORylWBrHsF\ԅxHi8l1z'G7؇K 퓤(BL j#g76m7mcX2nq (4 l"Ncݤ0܄(*$ѫmU0v7/SY gS6P_)JlXiuuCĐ0m Hi٠-5ͳi\X.}ɘoWԬRtU\6%|ww͉4HiSCHI4 l"RaQHqZ'"uF0g \"d73gT pd#񊩘/+Jg^uDJR2[RY(rPVrveKv->%g 76H)¤^)Er5fC[ MϪh5}t+9fL&5H$oؤMg񥐒W8HjL fy|^+b8ػ6) ZK>+ yp^"##"\?e, _t=O+| Y2VO6/ƴ[!VN8*~TZbl Tf)zmnqlTnbsҦ1 Θ :W!=M1ӦMgA|[~&Rb=n'`"Og0V RͶp|\Cfv)#(Z}kć&RiOyy+gQ }tZ9=5$x5bh ^OP`/ bc1Y:8Hɶl8䚥hZN5g!7bH+ڼZjێ_ny +k߼7y+B$Rf^4 l"Rc+m -΢5<<ٟw|ټs7FR--{9/߈jXntR=/B3LrY(`S= %j6Zpk`XX870cmWZGM-nSHJk5Kƭ UH!¬WDJ{y'50S&K!%u ԉ|$5udzA^dlДzq&ުbj@du/ōI=~.xQ.!Ҕ|Rk89 HP{4*Qm skչ%6 0&ۢ!.ŠkuC@xU&EM= ildw97_7T؛?W/ "A&XG|D Ѹ^DS&3q7߫H*+UDJRH"mK&!]u:w^έLvonl*ΚwNll&}'i Ii9?!%_R7)KN O/?2}5uG| Cl917%LۚLR5 l"Nt 6 *+b71ّ_)DJ7w)jxݛ+W\It3fo(n &R|Eo%=,RB; N4HiLR5 l"Ri:3 <;t>λ`k7̾T\_/5pp}VI0w%\ ȭw=P竏5R0LoPJG0_"pJйD(G))dKtODJ͚†)L"Z/5NDcv)Ҏ]]74qm&_l֜_gعQ"{|6R=y/=29 k95p6MėBJȻ.Z/&=FMJ9:"_J$bQ/n>dpό\ɷz WcNHI4bGP\D;ŨDJHvHB`q.Q6r` n'}cngvky&k֔E"Nn> Т(/`djT8DmC,휎>rR\y)&q~6_ )x=L3I>> R )Ŭl1ΙXJbosKD,:zwK *"(K'5e\}wsQǔz5qM1_ iA2g&0qa3kX  5y)XEGnvi16E9@V*;DJGh5yDJ7F05@ l?& ÃcG!=ʸsT\ò$H#AD#>%spp.!/*1דԄx,VxM M`BLi c}T(ډKMn[xEmA2p] QAdTJkyQaJHX&4HnfY&K!%aFs((EJr#)݀4e{ RJr&$(=W#ZDJVqsoP$cJkjJ5H0&W[:S*<{H$ Lb3D2ͧע7yuDJ'Rҩ{yS:$R4%56MAJ8ȁ8^S"񮧦C) ы&1կ8H 3R:O1% hu,[W/bc1^ME+4V"K(?Uzl%^ j"9([3&RiOne^> 'i^̶cq26b\Xd/,۳ /4{ҫ2oQ_[j`6MėBJlfS_{]8a5e)f'aK^/ഞC y7/qX C(3k'Kl_|jQp8).ꚲ' WeQ"|`3^=KW57:밥A73d(J 'j6|cGKHC w-B&DJ[ =6sI 쫁Mg񥐒:LyW}v𚲸p&Jz)EfJy>4c,m-B5c< X!R^X$tl䂿;ދEs4RBK[T8mZ' gؽ&I^!dM"mClPkU|K< HIT8^@xT cWhVr?$E5(/kLsLHi_5h`D|5t/Rwj`RSL_CJrSEiˬ\4 T'AJIFJˣ+pH4ǯ\Rj`DHi 3˶k  Ez"]!%/*}p$X5/I9J9^?~;NRs4 l"NtR4HiS"R+V-?"?ͣ`洄DJ-50G&DJs%5` $RJc."yoDѥW"%ei%Rf.}5 l"R u!5H)mRRbyHW"0{k`<:žj<6Hi_5h`D|)yB塚4Fb+Y.orܩw;%N&b8inմ^i=^{Hi_5h`D|q^WƠzp};,pP 0*)[7k 0)57j{EeBHD,>ةF T[ KlM-m5&R;3acW%Jز71G<͔oE/X)$!~M-_/bI$8wi&RMn9~6_ )WoA[?)9HβACJl&^ %@Qq%EDJ%7j!m^08U )5oS %˦6Jx%|2!!88Ǭ)k3~6'Rj꽋,!s^Ƌq&nI|)ÙetrH"9Ԗ4w9^X 8x:XKjӁw:X9=/"%5#׻8=$RMn9~6'R:M)eͦhrHk$5#%b,xl)dW틫 "RbڊQ)vEJ|RgDJhIUWϙ|R;j ҎLV5!$HJE$&l\<_(ߣ\,SvB=<ѿ@J9"%C&=;6?R2" $RqHVk *M'吒@c>?F/x%Ǖf?O] U_/0}WO dTK+_Q=swDJ`K;ٸsz7+)SO)틔|:{U AJ\4:r_CJEs/ a˱Vu!:qՙ9.>0X!F2y>?^K{qN^Sl d! V߉w4OoXDJ=4kLih(V+i ɝ9fh`ReY1Z=MM5nD|PEWd!%y6Oo=T"@ q| y;>_Aĥ}X zHR}Q$A-.wZE3T)zwsR]ߜX$IXviƨQB)Q_醌)ŶRj[x][F; .Z5鷱9bͻMnk*5DHN*Rrr\RջF+VY{Fy_<5޼+8C30Rj{&(sOKjM6bi^KXYUKPn eClcW)Ž>|X7䈔bCfo ShO $Rz"7EM ܦDJc*?;v g}n;bS+rB2t0zwO=k95p $RZDJW^W#%ٹϴ )ZDJ> kR^Hip>[)٘N4șpuÉH ?)jM!wV')}H,n$Rh35Hiq]܍L=H):X, 2REqӂy)aqxRA{ID$Ujuy#7X&H)ڳWqxZ?6Ŕ4RcLe@GH6v)7,)ޱQ;f#+h-mn (pdH鸆S'@"Ř\WbJB,d"?#,oI,4"$ۇh!H Sx%H(ⵖ|RHlXƌ=s%f͛* k6!hfC ,k"S h;,O#0dZJt\IΩ+k R)Y4u|毉ynCpV?x Y[}qIi`R]ɖlWu͖fK+xvֆSc*%cL%߳016L(y!@LŲACFw Qvx"˝Rgck<6[ P 8o:S_RRcvu֖'vbcJ!HBav<\:Lte_6˞8NzHP'9W[ -X)I Hib,5FWDJg>"j*$ɏGBkW~aĂ-ԺgHS%ᣑbq5ֶ#M;=MΩh Vyuަ9`qo`aǁ Y=VAJXZ ys,g$"R^ <\AT1چbU# 8))4裏PbvŻ7&ևYHI{ mpH B&R:/b@"HiG Y5p(jnו Tx_Z}ySx"\DgT.dG#j}x&16In+SMCJ*NP 8o:S?{WQH'K %iqri}gL,Zj $R:!R/h^"eGV3,H& #iՌv}/E?pIDRzIQHtj5H\ͱټL+2 ̎W1Z*qc)=^%a/7xJ>չ94W,^d>)ūWDz*>"杙vI`>Cؒ4\^6C'gA' M^r05HX]S} \z[4RL#Mjwfx%/|\ DJW,b"tS/DJn=<<_) ,zx!Ӹ͉ J8`hh/^^\;$躡LӐRӮzDSa(+؎|-0"A駞lPeXN\9)Z_^K) Rh秿\Gvj1R [B}I5Rj94$u>(z__H%pQzRjz"I=6-8 )9k g37)~"k$Rѩ@"H[(9lGHIr^i!p`Y DJu) %Y=̷b)"kUig"ڮ#%*3s%Rqhn;MyL)LU^ ^K) ^ƝlC eV՗ř8e>FJ M2&֠o>nzHo)j0[u!/Hָ8ԴH)̤v$xdюVeHeZIntj5Hi|Cqދk Ǯ!|?/ye]1a=-I["V^:( oٯ ʫl4>4 5~ciŔzvTQ%[ܙTEs1%l2eO2Uy$Rzy/9 H4^}Ǒ EAp@ o͋ 7]';j8 ~/PR lr~$}k^kziFJEmvTk'oL0Uю@%4\6^BJl~բL—$8S__2>A xi}_D|zZ;[Q"tS/DJk)ٗfZ^}G(#°TWt›KIV 6RQHv-5{H,sEES6W%pEz352T)L $R!% +d&$C!Y[gI]J@6ۑ*=mU\RW"/˚Bd+)Ơ %xgk`^pJntj5HBCj~ <)/|rH E&$Pbc TcOx NqhݓU1"5wqDJ/%gS)]|;y)R]4p9UqF*F))!kbLQ5q".ݥ_I"tS/DJ^lz$Rz 45pE$P%5aʘRqR^pkL^r05H)Er8Nmr>}N\)qrض2#8G* wDJF^^n;5w<5FJ745M͊s5hH8'^ҩh⢸ \LaGE2c^K)݆ Ui3mj`FJŢfncCJR$MEJ)+SGҍN )AJZ}DlOr5fMD^>d5: xIFJ\e)sŀ#ˌQVAEf T8oSLjmS4ۦ bPY<)P+PQ2$Rz3߻4H,`j "R+5V˥?.Qs4wch?9}׸rFJ\e.s%sa$$dbpx1"R (CmFͶٳ8VxgK{,jwC)mPVGҍN )-"ޝ~4&@yu|)2%/cK1z3'`H *)E5H)k "Rޝ~8X><575]9#%N&  Zc*f⠦*dh͈ms R1ҸOM}DTʖHʵeO^r05HiGD==ľ 0;~$$|<񘑢 HI"CGتԴj'=+ljې+TDAflZ9߱O0R >yv5۝$DJF^^Ĕ;ȿdMą6},՛_c.9d0`ٳ9R;-)[Oz)d(^mFu~QA+Y4ywP,s_Q8?6"NM^VS3R*o:A~nҍN )Ҵ\Gǫl\sɕ_:i̟,J~-$UzލpQS<$ހ4*&Kh&GOzB]ϕgC'Rzy/9 HpQy8S 4R8 Z_'aКyV/NonDkrH(P93GѐXme1+8BE'7pHntj5HH:cJ n)v吒#B`w^=mllcSI)m:A~%^K)%RzaʒH4KTkrHXQ9~| 4`|t/6=Wqf"K+;)l쭈rV<{vl ~zIi@"}&i {Y@"Rju.4)F-,e\1xE:kȹɹE(`'u!+wP.\4d6ߨH{/ .ggcĶUy>梾4vk RSj Rѩ@"Rˇ}&eWR*vޚҡ$@z8Fd "'}Uz^zv +MRܔ/A՗mJ-e9@"{5DJ/%gSHip/z:GYW)u bmH{b:qTz+8=duӐ#LD AJ=AzXzԻ@JnDX SgDJbR0$40 )HIVm]l-Yy>2kj k˗*{Y@"^>JF^qWɭ;{&I>&e)E'Ĕ1N[iH)Z"H&R.KDE v)|)xy $R!|v zO?dj 5H4@J65^zaeYw%8R/ Y@j ҳ#%\2+!%.]LeAkőR@j 5HHi/ϨWBJϨy))vj 5xm $RJ4\n@"K)R5H)syTW6jMtF牳t@j`)%Rg,N,5rޣDJR@jHt'RWnrtzA{ߵE޷.ʰ"@>4s}ge-թkWu@+z8+!%BPz^.;j 5IH ^[DJM~"bYJ ?yy1M{܆MY'~%5 x_W1R"@j 58)& >(aH掔Jq |҈k^M))bTx(zqXDJuʱ.xVx(r%>JTT/*)"o.lSEMQGO5N_$#UNTTZQ騨Yeҹt5Y4{,G<9%kD^ҚucHf:%`*&FJbN*9vǻѯcW~d,#Šl.z!g c[oIoW5UԃI &F@Ju)NN@J͊YmMJd"gR4&qb$oZdXxJVw4f%RJH Rg@"&RE@H/I)c;Yh9 NHI')kU8U|%U 8H$h^}#E0ASE=w`ƄMG!>WhMpf7h4l(4b4vA{ C{{S!a$=%lmM@j 5Hԋ)5Scx)c7X6D{>EYDOtOotpcOtg@R Q7U ͣf )9V~NOh41j2u)c}BEax9m R%RJH Rg@"Hd`ڻCJ@#?")ٷ3bfG ;+%vGJ"fjD1)?QϨUFz( ĴB('\whmZmHi:d䦤[P1(]A;Y4AB4溋B6ӀWHbLM_L55Hi R{$C^}'zy뭷oQ*.z1X4拻&HX6.#/{L3 Z)?(Q|PH5p\h!& tNEv4R[ـ-$jUzߤ"nI F<д1IlC+(yT*R&ҙdItM7KXDJwvtOwReL̐Wtݲ98)E@E^G̛c]ަǼgh& <3ӣNpicYh6Ѩ*^cT%봶17#3HLT|m`de%Dx4ўU'5(-#'R*__zOZc/x`{1,I65,uj`)-"%&t5nc R0"\+W},+(8)j"=6,oӁ[sUz sRRdk0mRZX%h{!\cwGJ"vD5H9|EOƿ#^dyv}Ji El+_Q/G\]B\)F1bz)J.;>~w}ק>)]IXY7zh1a3EpHi/N>@"EK\H]4׌q]`r>%aOzo؊ƮRLfOpܻȼp(Wm:p=; /35p49HI%@ql?\LUĔzCSu@hEpH]cJ=5zQ,0;ێxGX<3TX)gȤ}'?GaxDbG;J/azIQ{=}ԣnz?2g @CO/_R񌋳DH%,Tj`/ $RZDJ)FB"-5d1%bw8=Ra$.-e H]㸭?sڄ]&sĔzF0=z!ߟhg:C}J{^jU4WMb{zQ!%W1 Q7^ voY\%NMeLcJPG^} $Rj8B,(2x,a %$"Uv,8WDJqੁ5H)ҳRה35jNF |c˖1]xa $R,R9dOW9HI3NW)j ccrR䏑k&Rza7_.FΒs?>8[ Hx{qc1uxl* e)ĶPM2$Rz Rz։w%Cj5HHIa|&ry48)IKY#%Q{Bw=Иu)mak!DJW+,"qh5HU:׷=j6Z>>p^0o= jʸN.>Lu/۔P>JA9%',Q/CGI+U@#rCnHǷr.ߋNJ\b&h$5JKQi_4i 0Xuyb'MFK;j6+}m8!lUDy%R^c`ufX$=+ZetcHi9&Rz Rz?>H j |GSm~a=o{R ^^97z&7K$_ w$JℑQ~a`xiYSBVM5RR.*5KVODwк…]1VpRחYES2Ej;}9g"%4&b~Qq]\2>X`<6T䘌  "R(0-|exދހ򊭾4zn9v玹$R:\y`4H o}=R0N},8!(R裧Bcc_Ď !,^v(n&0iwhbA߈)TA)ssK$"0=]XC,M(4fVdpym{=oj)['ZxlVm4{H)M&0)[/Z, 7p9dAE dDZM@psz/)S5R2P$zfE]{]OL-w=6lRk3y_P͢_nq^DA"Gծe X/ˇ92@IpH $#qbJqOm=z-g_%ej 5k:Hn1 Av= MytH07(n\ӌ):崛bJqL全_ƜE(5p$Lj#N| ̜?Rά*n~žCS{:.Ɨadw-K +#}GCCDJT/{^ ,]nUuR>h#v_\/xmjo(-3M &kHlC.KNTr{H{8$]Lg\1%&x_Mqg|(EfpOtRr^jH"/έy\-|1c"38p:{Ŭ[f4w$RAfv+h:HɃ{xܑn#eQ?y2^ÙE8].5fOMq?bҨUQxA8f 4f}0;uַz6}E-9Է*UjqAhf.¸ԃ6hMInz5@"^Oj`1;Qe'dNؑ]c bEۋHou3bR4XgW̦A[I30 w1˘H \)eptܩzjMJ9C(I!;,Ӌ\X$(8`OWz4R[oES'&4< q +\f[h'aӉ21FR"bVBGwP {Y{M}mn3sŔb>"%_1f*05i HCW^[^֩8_o2R"&nӳ?6.[b~H \AW@Jtx,C2zf}4&zr₈bDY109cޒhB5:Fz\n'WGN@Jm*{ix 7/Mirc־bAl[1m1d%2q=#,u$ 5ݹtV)a1M΄A|{DJ'Llы;tFE5[\1&n3FJd60ٙw1˘H \)Ǭ8ХۑbJ>M 5*"}0p5EJ?L@˥9EWu\DJ:seSg5+gxD~u[ Z¦UHRH8,fL{gE--%J ikE_ ;$,w6Y}D`яԂX#"ېgdzxR1EWK޴?\"tRSk {i^XGg?9Ԕ$gBWr)mO5dg1 %S<ҾN|.RmxEE{ wPɦ Y WE9vHTGGI ]`툮,5 fLGY-*9ͯ)EeZ"Ɓś85FJ4fI 7E%w)`txmXf 5+ zpNK xGcARi=aTqo Яg1'G.qsfj'ҾN;ѯg=ËÛGj M NT)Ղ6!1211@J*7M_ToӅK  5ݹtVSb0GJa΀*a C!vT#ym)5_3_x=v6{lڟ*DJ"5(4pT .>&A=_zu> E7b8hRɛE95\1yq#~H {;uAsMp0jcV]6bk;U,ۓm6R/WMH CSm-¥+k{D 7Fj\)1U NYL0G ?8ŗ$FNz/U4FL\QDVQYڠ$)X5LK25.D&wJ?μ9ԔQ٫Fbi?LsmgMF'wN"$ZʭM}64<|5Z~j {b;!X!CAP8.vk )`ዮ)ߋ(z +,vRFJ8gPi&/D#twG&R:6L{ߖR35HɆ5p4Rzfݤ쯣j"ױ]J2fj5?ed HDJt$5Fh)i]3DJn-;?35/)\jYͼ)M'@_:j"+XԆ24;p)L $R>*q>RLȣSR'RPe_3s!y3?fNϼP~Dț|g$j R"~G! Ӎ5|û47\to8N15P+E,^xUkM5QH)ޑ\{kn*{`ϒLg\H߽wΕ_SaNz>D5ZI3ve4H) yMXF6q~4R*.a_9b/)\mr/wj{z.ko~ o ͏)zot |/hSXD* *ҢFD4|6e@"DJ7X!%yZ&ȆF/W}/=v鯠> t _5HIّoFo{[)k V^DJ%VQHSq VF1]hP_ %}/ᄎjs`p;b5)"Tcu3c]7n\rGcQ"f먹~ƥRhƵ,tVυO>Л,QDoRt+JcEB0F*%T/fLg(\A)`OX#'x;.l>swZH1yQ$&?ƫz0J`l/i RBZ^$'H\LHH%qْaDJz/n~qO@JTKxD[rxD)ˏfl{|ƌJs;"z5S&7 ӥʈݰflsuaOl9'R)@Ћ CXt>m 8pVπJAVpH1$DJnBJ 狞=ޏ'+?G_)E``A|Dlo!xbު%$ ~$y5Ή "2H)rk(3ы2+Ѱv&`3'`]J 1F| o*)a[Ѿ"Gs%ړp/EHp1 Z'0XĠ mj.#T3񙭣[Oj3)< ||惓q_җJwǵDFݱ)1yg%j))9K-Cp X)_ފ#%OG|ץxaz,HI1뫶dESzJM `IxEk}Ek1WǺ%\UǸ0/i7jzwMAw3D($vDcJ5)'/H8$9& __zI ;Xd87JYIl|+A"ch&~/7DLVDMᚘb^]!*/(^ڙN@Jv%HɶTe#SIXA2a"Rb'E/uY>pAQ&X"\PRIxf/["v >"QHz) SA $}-U>\,)$zoofh?ݐ%70̗eC)9N_cG|ӟR] g9_*/')I0\DJJU "pJt\يpżH=_ z/p20rWynk1bJ1X!C<݁=?yH4w)y9V\-pg Rw&x4R0:OfxPcN5gqbDO¯Mu*DP]gԔɭFJr7p 抜= 'eHtOXЅ_YަwAw'}ׯ]_""#Tŋ <r~D !Fl% Y)]"YQùDJl7 % !zrkRKې;O7~v %-/ywtXhƻ1!Ĝ-? -JD~zQFJN4O"5%Njg5Zafa}nj~5. B;*LMʈnJl5uΜ]4רfY֛S^)"GTV A +%$M} 'E}FKi|r2؄gL#t)&B) #A2)"+TMSQ‚TFJz1+@~_竏WfL8;R.gMx __*V)S$@5=+qKrB$}'F$RzlIc95HRDJ3mL{OzT\IDGYiŗ̲//l.wQr]qY-GLBR!#b4(;BUyk<"~\NrqFHiø5Hi3i`1U93i|91XDKf))sK)-@3K %XzFHpi|91HKH鸆0 )x̦KgWnďS %Yz|J5\WayKҝ*SW#Ӽ_i|91HKH鸆DJt&eP4F @pp4QY(aLG뉷y:_}RoU*yFphd+G$k#lϖnk3s%gyY."%h5[$ngќ]@&PR3:kTxÀ}}}󡫩-bz.Ģ#UOj ;vה!t*)]7!%89%Ee4cl,Z":yei|91H/ Z-q FJ,&}Gu4)\p))GeCƱå^D\ hk2w{ɏFJ",w|6=(́P,W.㘪nM^69y$qCstH/j(E> YG)Lg\HLE:ULyG th@/beCILEXH8)94Hi ٗ&qMFJqr0  )&AJ1kOB2ElEѢGOf̢eS7R,75  HbMu(N*>,Gjՠy$zYtjnu#VqS"%*9-$":{qPQ1[ca|(y9;sb 5Hi_["BHIƐl~ifc!-pأ^| yHp;# hOuClpDZ4p7OQ;pkDn&m)VWKt\CHHg50YM4zϝL;ΉI'@"M?q !|{h -%ͳk`He|Nc/|L;ΉI'HGfv|{fu4SIc) xgmyܖׄT4A,)/\b5OX>Lg5Z\tP|gqNLr>EJ 75q"f ;DJ5H)^8qqRS!7jI)Pftdz:$۔ӋXK/\νzDT(P'3Rm\nSNtýcȀTj!l38'&9P5RRkRU6[.w鯚v͵JL1w*2YIPPo;oOL1eP_s@Gjvu HFDJE2RECR-7k8#͠i'ͱVs_l)kE Rր>Kz0)ٮp\~.(ǽzSETk{`7GSYmG[z3s!%Y!h%6n7u3!;W+8)a]]URL{O@hͩ \Ӏ ,"%}(hxk* Fq^ } D>oKNXrzݩTW%̘qF^#%)˥m4fGTE؛Zf\_ⱆfm0["A`qiG)=O@J]T6jR.=4fkz4Cw˱W1y"Mw깐()Q CJT{5kXG❅1M!7YdwO&RϽkAP-2^7(*Lb:vDs6ι#r(ɛLckrUk5R }q֌ugpFeܵx[ek6<#2]$h6%& mz:oDzzz쁛MG-,cDu %鬞 )pRFJx&x4nyLg)3~ۄ gwO&Rb5(ZnHվHbӎP*GC8'rzM̂PFx$HTiOtП$R:!HTJQe#8<(U̱_{0"2hK瘼l@}2XWog`"{^Ӌsv&cӨLjf~j y g:χx1~z) Z3L;ΉI'z0H*8i#%lSPĔ"RupG)vmo4yw>38۠3It\RSj箍#,КdpV1@81ŖHE9 a)=zv..vW߹W߄`x9UNqAHhTnԸ\$H{Cq?\J&WC}^4Iz=!o3S4㜘|B HnMl,3Ax5 ֍A_*f{sP8C:6^KODJ5)᪗x|< 8_RL70_%},dD1k󟀔0hVi]5bޫ9MdM\k[9K7Y=]L)VcJ笧j$j`ߛg_^DJ557^059HiQ$H ꩑,2M)fqNLr>)3F=skAJ2qGx <;Rⲻ9S3h`zjtʸ 38'&9Pw&޷?um6,gͯ15# tV) 4)D)LOi eODJOWe) &R c[u k|ϐd$jFJ?~wmz>f)՝ĒSL>۱PDJ5#y!Iaٱ.R{ %33yRwަs_|B2X3DJkRןi|91hܧwݛi<7p"9\c"z%R:!\)KivXߖVp};z.G!;>UwLgtHIݫB7z ]ŷ1Qj"׬UQ>ĔD3U"(8#U|GZȞL'w6#vg$jFJ_x_{AE͏VA/2MWđ(D}}ٿy )&(<`Q̴j`OJ.&(ض]'R:!H@5c=#㔆-#n𤟇&S.ط IA6މ%۳F_KI-"I$tQ8+SkR|6*<d`*Y&(|SkEFJ4H\X=Eq6֏SQtVυB@# ]dOmR߹۝c1x;z蕊İȮ)YxxISȞY4)jxFmG ZMV8sb 5P#8G/?B8zP)#Rh`~3zwbJw%l.sJE)miOtÁ/Fy3-uC̼XpC% -"% )fߚTs@Pk1zK)H)f]:pуcTx" Hz9/$lo0ӍU ^nnzvDH)lܰ$^깐1t$k#% ta8RѶ{5+"R y)dHI=)fqgY!ҙwO1R}@ay Ɖ{/HM#"Z)ż6JYDJGs!%PS"(a768L0e&9N5"L'Gb^1ƌ<F!qVx"R>r3Ty_M1M5ʵa^Yl6Ѻ rt3s!#%f {B5RˮY==KD(U 3&R ~+s94}* aA^1RrF߯29R/⢾)9':?̞ )y8ڇ0 SvYԌ8\4&@8h"RrXP %RY}_(DNzfϩaqS/dE,Svg Ȁ5=^sgFuԶtfg:χ:O݊GJO'Ih WSZDJ ! %b jBb8'L;Jg HIVP``Nt`2Ř"R"N%2xDJ2@J+vEwefjeLp( z*G$)`=lBJL#ikX I 9S)$da}0*)y{nR?4DJs/깐R4wS1~ uԋy]"o)5 *o zEG]3Y_"Gy~w+R ~Ɣ>C|#pC<[IyIb*mwG#7F,R, 9;8걷Ts@qq8^bGJq ֨!ǵH)^n9){eqCD8Trm5Xv{q}qbM)֎b)Ȣ)uݜZ+'zʂTx sYZhfaOfbRН!佸ط)L;JVĉ aGǠTd011/$HEgn-8""6H "%;02."8L`0ũRxCV1 4IDJHIYc}5Rtފ@ԆhC[DJkssbאjz?*\芾gMݮ Vlij؀芔1I,j!y5cdcAqPmac%Si`p`O\c;VAh! "n"q{)J*[Lx[3+U~\O C@1NCO$VA]4n7ZZs(>YS$Š,a\p=f5"Ek^ML@JYQ=)̬0BI5{köHk2 ?g~Eԙ)"ggs$jFJX/"o=ek`zj4^}(;Lݙ38'&9PO7^}M&Nt\C8 RPn[}}}=b œR:tq;Cg:FJg0sb 5H{"IҋYl~ R_50YMڶt38'&9P6ƻ$R:!$RW {=1oHRFiMlGj"oq[Gm)$IH鸆pRZ~Rsx,_^%\W|I[kW&_s}SFR%鬞)hH3ׅwVE}};_}SAv eՐ|]l]ڌir}D1RR* L]EŖS\;zfqNLr> vH}ari4d YrQçWL c0K"Bd?dfSŰEoA!46%_m$%[b0 !&xhu=5Yx]t5@{DK4ag#`)+FJTظƝ;e50uҔ}u2c /t7QltVυdp2nيLYfJC]_x_ 2M}R ݱ1wѫ℁~vCRcf'q8rA8g|wR4㜘|B 1%5U7z.qLO)4t(W0d^7j:OٔΐL=j|y`1 ܢS/{qpO?9)ͽ1=g۞[( >Xэ/"Q`]d< bjqq<3}=Tkvj, %Ri<)67!%E)ob8+65HiM(l&0Y=RY AeDJҁKhVNbm4tJ O ^i[@.MМ#ߛn(i|91h"%*cJ=zazd|fq=krDJ51RjFc޹Ő=o0uhJ#VyZ^zHî˦)55P#)1NQH)461f7WFDJ4b)l"Q$R\THF5{@2Y70qɸle n|@^0kې̬{qL_|7'R:ε8)n[,FpEx5/"%7j'0a") \8\gUo@ЦdW L5xc'bS5R"Iܟlh! کDzRr06ߛ"RE)o8z1RQ]8?Y=WLI*4LYOQ(j?H(Je#E1 8$RY,JeuswORQFln5}7~{4j5ikrIt\CR=q <7 >x`d4ښc2<Ttp9)>7Ht\C)m$O t5H)<550YM i|91H4It\CH4ߞ35HFKI&RzvkYwODJ;))0$y)=@t tV)Msg8sb 5Hi~Ot\CH4ߞ35HFKI^)Nk.:;l38'&9PAJʎ9&R:!$RzyM )p=~DX<*btV/4 }Di|91H4Y$R:!$Roϙ ),^A8+2?k3s!%ncs!9*2n(њڏӯ WшVbrf/D)#] 95*&TS"D_cX%>](gqNLr> DѪ i9Ķk\N3__qEK.$L)>Oj|?Ge__Ļ𦚽ht`ԟzE|{ѹA\R7 +}E8]οqd͘ePʱZc2cz.$ d=j2 YFw}mKL"7M^VGʚZp0 [@LhXY/MJWvt"M)'h).hqh M/6ؖKmfi34w&J>Q&R: >Rg?H𦚽ht`e9 膑J0K"`q{hM ,Y~ DJ+K#`xnX6MS_7 j̍an)-19/.ҮZ[NQ+ qݱ4{du~ H)7hrs` ֍KfMxbg8lOEH"%L YMTxSv܋F&Aቱva2_Aw&ErCk#cW 3V3Ŕ QY" 5R@)a?E O"+3o/ŁpTz↎f=el#1)m=)ħFJu2Cߌ*HI9F!ϠO2RKW@DKDmٖLxŘ2YX0:'RB2TDhq.@⣑ W-MVt曐R:bBd?3cJ+GDJ*J)b{F^{x1%,C{lt]ŰJI{zk2q|r>H6<78[ٌ)Vd@剺Wɮ즟,y?%I <R %6͊0&8)phd#]u)55P#b̊LgLiӨHCufD!*^{S{WV){r,ZME/qݭ]M&RGܵɆn&i|8l7kwJ89#51P:EbQ8)cExm )l05R 鍽CҙGϪ'9X7FJCkj`qbF^q;ۖSMΖLg\4sPڒڀQ1gLL<ŸS*.VbUDE"J5:RPF ,Li|9]J=TUk3cѸqy"hY纸l}f3+DJjbYR6{Q;0%b^ѫs.ؽ~`SSЊqd͘%}c kSkuA깐I*[ Cl'l3o>=YyvB9s"R5DJtzWG' tV)+3DJSri|;zH4Gxg3@jW:S tV))~fpG $R׼R_W3@j (=2X3DJi~GO~.¥.9RԀ;|N+J OO;sZbJ/$p"P[H' pHR/\s115HA'KDJs1sya {5/lTY@jP g'Z]j`~|M˕P1%_ʠ(F #RZ\}gM]↧e2393@j 5H R 8R'bx)WliH)Ʀj6 HVIR@j 5H ^OCJq{RB?@&RRIEZMW1S%Rz=[R@j 5H k\HI tFy^g0 g[1(DVcJpA9-)o!"%hTD"+{!_ iC 1)R@j 5H RJ_ie$k R @j 5H R'FJw2-x@ <_#I"R@j 5H ϟIDATRO^_H R@j 5H $R:!TyH_H R@j 5H $Rz0,9a_H R@j 5H $R:!TyH_H R@j 5H $Rz0,9a_H R@j 5H $R:!TyH_H R@j 5H <)}~9~wɶH R@j 5y{g/~/*@j 5H RG"~j 5H R@j 58)9+&J R@j 5H DJR@j 5H R@DJi@j 5H R@j ҿM#H R@j 5H R ȘRHj 5H R@j 5ȘRƔR@j 5H R295H R@j 5H dLi ;> :5H R@j 58295H R@j 5H dL)cJ@j 5H R@j`ISJH R@j 5H 2O,2H R@j 5H )%zN R@j 5H RSʘRj 5H R@j 5X@Ɣ=R@j 5H R)-a.̬S@j 5H Rh cJS@j 5H R@Ɣ2H R@j 5H 41Dϩ@j 5H R@j cJK$"S@j 5H R@jȘR@j 5H R@j 51)R@j 5H R% |SkG'5H R@j 5H w}aO2=IENDB`PKr7Ů^^-Pictures/100000000000025300000096BB289E21.jpgJFIFHHCCS" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?:ϻka4Σ֯WNoo-meRkji;P_um絙>K`fׄ`FOi $F:vׂ|D |8Y5i1 {&J-Wo_?_wŋS$ {]P>4} g>/kwVc9Ve aWcsWqtnbiOcc-7'Í^UON&QEQEQEQEQEQEQEQEQEQEQEQEW?_x[d׋Gx_H"]O:` ֡|]xoŚ%ϟ6U'l+b-/Xt{n嵞' A(gG7 iuquo Q]DIʇrM}8 yT߳ioe侵{6̊!+Jc_{o ĺFowqqam$RzBwgSla᳂?s'bl f]_$0zum"O,=K4uH 3yȍ'9_S\x_2~: O㞳6ڌZϬXJ__~wCέbF:]'$ֿ>OYg}.Գ9- m5oGy\כd(it_ʿVue)ӃRd(Գ?2j!ujN ' @HO!\Ѓ@Q@Q@Ix5.seQ!C\DOQ'sF @(Ӊ'f *?3TQEWq.5~*ӭC.5_X*Wo2U( <+IxUXf$e$ ӑ_/g4dN!u#t+_k$~k4[c0=I+M~ {e֣4t!y_s@A_z޻XO4芑;e\}E} /j=R S`x6UkzͤsS?˜pFbm_JClmiӢwӍq]\=0AFEPԴ\?__#ߴgnuGmC  Ok7v\tF k'nlI+W7mk?l &ψ{b,KMP|{Gilyh{]S'Ÿ)wٳuF{/%G$ Ox#dp76Ml׺N}k匲}mӿLߵWo]=?Y|ZDҼ7>? x]n>"6[Ԯt_9wm6k*Zm/)v?{;'&:\?!|$< 5 >Lְ΋ vVqq"4c)؏ۚ4?>8!ϋ^~ӟOx/o>(|>񮑤̶nkT7vwjKm_Ji?o ~wO BUֱ/QYxQ5Nx S `JQE5Eܜ'?ҿȣ d7?∑yZp県=z|¨BCeܑkx:1{R 㯷>R/Aʖ hPryڝE^ҵ;*G{iVDdb 0 >TxEa uD7?.5;W5g9 =½Gŝs?Z3G#'ʤi|n?ik5[{ܥ|_f~@/`??[;zZk91$?x?쇽}_Jy^?Wa_eP\uXꖖBx ?y+iO^X~wvsNcslÒ}k_ľ!_Ýn),(~_Y߀~&nVP;]ˠa9|dl-o-7(xcqs0[kU|K]NJ2=0|kIܒXSwßtw#}&0?Ÿt%ݨIP>҇{Z:q-}ϥL QYW=FQ;+'a{qʾ[ѿO&spM2<˻K+]K"\3GHh=c87Fog5E< 9cZ ?~6hz߅5庁$ n~u  [^ CFn-Z0C6 {346ֹr cJU(=?Z?fEf}нVCItT3m,tً߈A5vɧ\ _n2zGˣ_xZtwHC\$ހ+U?]?Hu ?I$qI*G"O@f_; #CLP?(]?51_7w7S*jvjֳ] <@nz5|$_5{KReh%Y@7k'x7Z4}VkKS̪?vqҿғ |KK^5ogb xJk;Uԭ(-ydv T9$ր9:7π^/׭1O"2  ok c{_5Iu gx8爰d8_3_ΫrJ8>t]3 P ſ~;P/=Vlhh{0ڿ?ty7W9R6[''[U+}:[V(aFww!BI$*ʱNLWgwMm&tF Nlq@9[ :^i߉t{n̏2FF ~w2K5@$rW߶C]xR63j7M %Իv_h~Zxi'5E'?WAm?]ERB鸑RҾZKi/T[B/0HǙ1%ֹL=ԇBz>?P ??_`ĺUYf2 9_Rxc /x+heJʣ'>'@zt s.߮H~.Ok T?_0r ?XԴ.6ki^'R!AJ:׏%oك$ָ$-RdcT3W;!DZ4b{|2ZeYќbr_+Ϧym#4,0*A W7n/֣Zm>7hF p1@.U񛣇_L? _}{~+..ڍ'q,n-} ^gCx2IHUְs_ѿuĖ<$LCjr8<\L_  ළ/Mdk^^Mw3x1bMnNy6Ju?? e(t'i}ƿ`|@иR<%9r7~>T𗈬ṆX} W~m3ƿ;4DR8 /$Ȑ; $??tb.0HTq^=n|wI"tiv]@[ <:`Oi|5Mks"2ZLɵv D?3V7(fXXd,7H!nO}96ok4".If^~?,cpZNR y𝶒"xs1W_&)i}hļitFug6ʞc9@.y-o`hd!`kMwu|G4rpCy.oej h\LcT9U4X >À$e# G-Fh wpsp:{|?VtajCR9U%+c|98ܗ8<<BAk:k[.9aX"B { 2޻1x Ev=Ip'&^0>qҾc3>xhE:UIE\|gkt5K g+x6/~45:֢˞P-O3 Ehܟ/g85yzV' O :e8(>llmmRUMkW4FU&Gv $ztWMVO*oz^ү-f-xV870Tu_Q=ZhO0;3zW?⯍Wjͳ~Z<ޟʾ. O$H;1.ziaYXBj*YA)JAk~ŚUoBӚN&d̪N:`cxWsⳚ@wt{?4I5GGŴ *~|>TX<-%͊I%=zd/>;y (%ŬnBt^&-F}3[h&!z8:c -?NiI=}j%/+޼{YH#bG@q__N?O_G ]7pimZ-j-c5:X_Aw Ko*ʌAX0#€?W Sߴ ]^j҅;9ֿD*_5f]CeV,1Gژ ƿOhXPO,Z<1{mS1\E"E3'˵J8{Y5+Jgkv,ŝg'$uU̿fݷlicp?@9{_Zoi^"yn/aTdÀ}ekw.Dx,+Y>6y/WjuOI% Š:~TEPEPEP Ѽ|zxlĝ7zvW0HWbpU bᖙ,b)O c[L|a>@/P>_c>>>>!xR;]_]M;<]ُ'@>4￳W< 6-223Ǟ;||# i [#6X>^u_ dVρ[Jc&f?]F%,"tq@)|U7g=֏smtbs,{ FczY@$rY%7i* kL~W?gkuhF 0JlrIP:t~9@T7\})ÀP_Nǚ\ǏĤly7(+* +o֞zܦir蟳_ H?rKx2Wo_ ۳U1 E5 $q#wT-d2K <~W5lxKOs^Ci;*X؀>y?0֬< _ZO&lʤ2krYK`/\?`x%ν{xr+x^mp[xVl_0P\_Z'?|U]L {0m?P?8s_5-ͱk{#rQE7??俎:>sLyN'o%{WX[MgksܻHde9SR[nv"x;U%|~`~nZPܫu,c0=k|JէO#H<)Xb料n-C#1 (';=+W\va=.4n2P;ңU* }0֕K 93ʺ1CNxkt2r_15FzW*dhQ HڄsߚA;x)4I*0U#wPɠk܁~ϥMgX N?ѿ¿SYu ser1l˫`ըLfGY&}򨱖#84$zb`wܟҀ?o6:^<L7"T zQ i6>[FoenD:i_ ;%` "T=^+;4 c!-r0c^zt &Pjogol,Z '8GHO~pU蟳$y4kPD _Z@ѼelڍVj+0G}0復u0G8}hٿgp?m=?_U)?el$:gLpDg>4 5VѼ}uKns<=Oҿ'=)}a[p_"̓g7~TQ 8z"* IZCOX"`IǾ+օĐ JKju ieM~!RhW*W ?ࢿ7‡+:HUp| / 3Km*A9cFA1؃Ҁ?v|?#S7F< w?5 &-:/kw $Y_p=Ƞׅ5T5+y I܌ ?JWo_5 &[}*P] )֕c 1_8#4QEWjk2Ӊݎiֿ/+/2xsec q/soss[1.qֽfݿ'WſGgyaȰl<5Z>=?-^%¶wZ0Z4H& ;W?q@n~CWz> gx@܅x+Z k[(tb#ۜ|+P~EiW,//T L rYOzS- !\HX;ckV jw-HO+*5;翾%f=v''޳$Rh)}zƮnrNcRM'^&ubG`&Sh45@ntB 9+# =Eg+ -M>|=z|ыle#`c~Ì84᜾=xoU6SXɱBT:s_~ٿ 62ޣi7퍦ډQ,]iΙw 2 #t%YJ ~~TmtOgn1w)@FSdPnp/[>= ayԅܝ%xV)hmɕe*rC{G%x6qSvgrI$ɠ3TmKP,33s>Pt遊n<?\0j|pcTW'~ i֓L̑IDAG|>iKcnxsI׵ .&kaUE$ڀ??6NJ7:l]G?c$ ȸ#޿ԯv+:U<0Dk;s;?x N֭ydy!vWYzWR0 (]c}y>_%u V[(DŽ RH&1fUrgW:;A<Idc1lc߲yt77grͺ"I'>fVKkO 7QHwEmh=x35+2[7ڍ!'W2& +B1)%TZn?!ouZ-bF w|rS>5 :)fxm$G k<'kz伵F0DV ާoOxQpʍ+0999h7-̟ Omj6 m4C$w(f 0G+'_:mo#-`6 izާ NA7c P0yS_|}o myIq9AC<aa !խIP-axhe37&園I0Eܟz-Ϳ%|4x66_M5 m_~PEPEP/|;f6ul:kGK$H~+.<&c]:դ2?+&ĝo h,N`)fQOa@âAkZ{ [ڕ4lQ\>FdbpV?nω?i {%5kr]VU*>oI?3g閻BJ8+_/MGSTt-V5{$̊MrNcggڈoŦ[,DHs4:# 1 x>r?O}7IxG"-,ng ܑ3uU9Wߴ|oO6W0IYF7_ i+ot}R;[$)SYo!?_[DQ?n--shY@>W` z޾M^y7RB iIq>"|`mj÷jvr"N%qP?&5഼ hhÂ~=kRKA2>^8?_ 14XP0C$(5G hxmYm%ksuǡG )r+?_OoگN>ƯŲ \FkjomoL//& dl@@>WGo~-u*K{IRT6(Ru6R4wVW:I :EUH摂,z@!Z6!d"^i\c'ں__^+vsE=J"hɎicᕁ~h/xSRψ--eWF^{#_o-|/B̷+|Y*=@7; _οisQ<1\-jX㕑Y,%HVAG}Mx^̋#Ke4J|q@Z7z-t ٤`DI?@kѵ (kKmUFs ҼACIyA4]@!}amm c/7^gy:K(墄P߭Ī𱍗 ) P+ţxzt @0GN(,'_#Shwrv"'_؇kA8-[},Qo|q>xL3+"vw[Ɏ}cVoR_/Ŷ5־%xPOqw!fs<ֿ*f5,26me=hη`ο7܏GA:7Wߡ:} )gD@^ }xDF%͔*b@X@1h;29띃ljY\JGҞks[$kP}PF<vR1tūy.<*KL$ָ) g/$`Ck/Rq@w.eWF$II'W9bN? kRd{1u43,rr)BI,y"BbH,ies}4vQYps~$?h^u_.[IYQ.:fjc61N XiRI3NwOG?~thV0][ď2[Į]FrAPgxOLh ܑ"=G_UL P:R9UTS#b?|kK$B|/nXm5 <3u]0`NrzmoeV}:{m'Hx;FpH~>tPO &5ox~L7D-eu @1r֏_跐i2\;#SAֽgƿO Z!2;RAR Rjm崨~e }޹+ lV#fث0:WV2|d;sxyw+JR%ßD=bV 2BH玛=~~R5&5yU[wgv,ĜI$? f?ul<9mZuPRf_zBU9xo7ux"ْX?-X෉UTRxs_g_񞯠܍*K=ؒ+\c<gOsiZ YUebkS?`+@ѭ $yc5rX/\7W ,Icao UPWP`qPEPEPFx5~xsF"cqrpS^kne5s$8E rON ~h|{~'Yb%]Ə #Rm;q#H|#bIy>WK5ދe"bDq9q~7wg>%@W>j(y{\֡I5.B P~_L_?ޗVIbesֿK" H#DTp8ҿ, -xA?'oS[?3E~K^`eXA=jV8z׃x 0meS<'< _C5Il+8nJ( ?fOZ$XQNqNMu>+7ź,L(N20=E{_ad_X ;No6d> ]D6&)L fTLJ! ܠs/\] i4,1xEQ<_LS_ MLm+db[HQcB0>tUetqe9cgV{N%M{xlrTZ"?SmZ?h >}w_P3AQB Hp8/χ h쩫]SQH4BA;0mc]f\ye3>L1Wn55⸵@Z fFI0Mi6`P{QU}~K Sαnt߂?:퟈;{wxf-cGNnfE< (-ݨp70' O'KO_]fᦕ"\i~ҢqG'+^l$~`W X_W7acUYZuv9,mkd+x#5^Q@N+7h~ CIW:tX<'᫻'Zm]Xgyd7??V}hDDDl6w-Wg:272 #k^?G$,#]س$8NHq_٧mJ_6JN929Ǡ+75OxLY.n/nR$forֿw o7goksymophJ6 +XPfm-T[hDJ Y 6 R|YO=ƑPx3 ' ֿ~)fjZxcKKw[,źW};>-i|?KyUY"G0zWg__+]:EV$`|"*3ҽ:QES4J@ ֟Ex7_o|Q:sk Y=|/fmVG_hs۞+e^h? di.3E_o=Zi%ؐ_qQ@OٿF-:h#ERQ\^*,rZȪ0A8x@ JUA Z((z yߌ~x#6[xBIy9;w-z5k c6M[h5 }rS޿>>?|e}u{6veX h6[PW5Ӗ.ƽꆾU?O.$T8< _7gR[[xWJTԡJ;~|:QE_KDh6ҽ>mXYK[H P0Qp?ojߩuQEQEQE|E8|֤sZ 29S_@/Z98V[o*7"/}GA\ Xۻ,cu_ ߌv>O-S<~ZH+;0A9X)Ư@ϒҀ?-̥_7O\?Dss'W~ҷú##gֿPɪiX.$r@ɜ [|NIky=?,6$27 rSmm\u\_> E}v c2ր?m/OĽ(^\cR?v0_`PTr?4{-:Y T"KاZUwiy!5U8~~4ْXxc:auw&C$ ĜS_CW|3=>@Z 8jz=QEQEQEQEQEQEfjm+$u+k ?Z֯|R,3Lr~E-x7O~-K^&-!g$ՔPRx[+Ti!%B(I!XI8ǯs_ ںֵ}o t \\6`=WjwVm bXDVi `r:PQPǵli^$4WiZ)0ӧ#Ҿаz~Kl ﷍:zrO"?-*\[WvM[9bP= ~7? ^6n#mmv]_CWh|S"FmHll"$T8O?y)|:<9cOF6Gx 6,r_X\ ù}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ eWe bM"Ms%l2Q@ Ab=.?ݶ.xHz3EdMs-?& i E~xF y^1kV>jp$Q@D @zm1-[[1(68mkxY Hr&?Š(^#^G#?¶-46m%L}0(4((((((()P}jp֐\IW]¼/H,9?(8_ؓx#}:-{> |6"-(ҠmGHH <314:gu%6<EŸ D?ܯN+E-(-!@Vj( Py(((((((((((((((((((PKr7 layout-cacheM=K`Oڤ֤mRCD&"S].JApPgG 褋A\wgAzdyy~ׁKm`fOJ=[9NxgV/*oiA16KOuR[ rڠkၭ^i\˳f޸ .PDRO^{|O84(+}%' bʯڲ$uBtCƒ5]f.u\.o2?E*5[~S3z 0dnXi #RPKL0PKr7 content.xmlrH.<B;NBD e<#VP@d2ppa֓ʪ / DM$P*+3+/sK{&g:o'#glN?||38wߜcg̉9O_o[o'ku Ɯxo[gA߲xupm &52{85^ R_8y_Yo&|afid//// ǝ^%6"x=\=5]yeF^8Iv0"nnYUy5 776m/o{wn5k2~K,&X5rEi; / կ:߱_6>>qc6>>2Qqgi%} yFFxk^/xˇ1m7li 9.e 7cDތ?XE5 KnT(=|vnZb,-6G}?`I/vڤȋdTsϿ&E+ۙ4/_5Ǝk372 ,Hbz6.ׁD|n>oްq"M-;N·ؿ,\1]ߤc_Ë=0);'hԴXdBEݺzלW+_Ұ)!M1F6/WN{+۩yYNȿu&Dk0ںÍWVqRߣڽ zMN8׫!fD,+M)(N's]"=cư|7ms,s+sٶcǾpyU4u,!I3VϏy.Z^ ҇: Wp.:W&Y9 J_m^Rs1uϟV7( f`RQZ:ُJG%] if/Q.sTv)Z'eBuzH'e[7J [ Jbl4+ۃ§z[I.ۍt RSuR{%;@Qn=p R}8h] T}vZovkv TTuTN裲 ?611JNvmT*(^ ^%bjlQ]ѫ괻+Ыjz)|*mPac~V}VGP>P>P_I.}e%144444Pgezd?+>+JcXl_ zÂGe3 A,vJʞ[{ [‘C%K'T6Z̊ Ԫ ԪԪԪRvPvd?2[ͶZ0duyI~5s8 3ṂyZëgw=@;x ^Ed^?\}u5h@:dҋ'!7;8OWyItKh8e֭BCEY UXfj4Tbu+PeUe'mvԐajhϖYTɈE)/[]@5#WWw5E#zfˬm3TՈI4nDWHuOk9'uJQ^)]eOeOCSov2 άT&Wmu [fNuv&}i?n몳I/LӹtϕbHݣE3fkͨ(QWьœlv43 2+avhXMY5ь*,x2N3UY![fXfֺXfXfXfWuhOCMS JedH&u "jW& fOzDL_ ^vj(].f*+ŐyUm?(7gaUv5yUzQ⑆mW]<{**ŐwmWђ*XDt"-o˛]<fwmּ)Լ`F55V5'pov bH+MkTi]JUhרD[U.f+MUCJUx":P,**:5ЩQe]<fWV )ԼBF:5Q'povebH++tjTYS UVԨBGUV.f++tTeCj^YS UV œ^7BGUVH2U UVhէBFZ5R'jvebH ]ʄV3{:hga*++,0_ [A*+dOz -UY!ŐWVhըB>Z5ЪQe]<fWVh ) Et YDUTV"R'poved^JK`H`]lհ_u +T|}3s@ ] ~f>3agfjD݋N?,xdv.%#bD3҇*锛vGU՜I/ܛ]5H [u/Ъ@mUN ÍޮaUUE]Eg ulu33xfUh ) a*vCTE]nT]I/ܛ]W*R*ETjb$fnXabTmv?4z K$e84Rj2o+*2o+t"]<مQX"i/p/"*EW#ZEW} ZZHWœlv-,4ӗ,z+ETMm5QUYD*E4x fI3}{Nwlu:.j*FZzEԭQ**7bvd?4v#vUCj^i[JsU*wWvvwuU$CZrD%Z$V5WEhEQsXDTmvd?4[ν%fRz[Dn},"Jkm,"œ^w-ܻ" 5ՅSX/߰o}4]ԯbדKoq O_O_fv'?i4E~+ᙆˑ3_X:2S~B8kvL[׫ߍ~~NeLj9'+&NMjo;ܰv]uoG!?2U_7Ꮇ 'BZ( G+=PİdD L'$hD/t[5hr8nŔ⼸&Ttn* bgzKMq5ӂńN*NFv*D/| خř5OR+6-Wٖ]B{/qs3.ss2sǴA=_sk;tJj Ʋ8{[ ҮڥEYj@Ƕ*/Nve~=qYɚ˜&gYM[-SCCɦ>T5Cw>dG!9@l/ʩٺ]`0uj>ӛ9ълZ7#s﵌7#W_. w!^ ֛9sB=s\_t Ik Kt]e.~;q?2m-߳m/o`nچ=g#\2kbd|n r7Mg/ gaLuksgLď+[+^h:ԷRkZigG?DK)_J"o 4 X^ϋh ㊧"#')K#b(Vl -(޼ܰ>6ફ21%3J/̟vlBJ,]8٘tC|7tf{x2z>2%Y6eq)yiru¿+ukYt YVB}@Q/; +X\[WV+M ;Kb9,Sا/N'=  P]o,~suyEWI(HXWJg/&~² K%T\]bѻmǰ`Ao]*'3A3 ?fInth;qώO%BP-\_rwoZvc'!ȩ`w+ᩝ4O_ [;1>ݯ?=y*>[? H(Hzl0]h{s5xob:ywLX9̡/7s@k/п]sǺ cx=%Ɵѯl}L\;aHiнrK[g)ǨvQpe='17$eG F_!l8IvL.{V1;BfL8ypo4iD *YV y<)=rw -D?g!>n; KLT]?8pHO_qm)LGG`L͔2ĉe,~=eej)E89s<4#.Y9/e"h9Spw(Yٸ1e#΃8ց)Qx3"ΰ?=y.Hp#9"QV.&fKxs26cH,{|2_bX4Ecd(3#c\,){#M|n;[@Wtt Imcr)O[ă{ss4A I}gĤC^L5D ˿ehwx&L)٩rf GP0 (JR~-,,ksAM4pac<|7,yCw4oAF2{p'|ELM0&ㆨژL5H x@B&߰NS9|ĨR h9 :u(FeQ=j}8Auz4pcIrێR/ DckvMKS2=؁scaqNkӑltwT2VgaCF< Sa;qhƒSv(tT7MA@X{6$ٷa6b&$J@7cxT`_('MYF/wi`1جgsL׍ mF+~"ނ[pd-_6lzO 5"??\SwjӘ 5T!;r\?i8Okmv) ;^5.lrP4 Z}mfR"YS3=pW 2L\h7&VcKL=Q SԎZ*d+:?OBˋ^5KbvyAp~t;ҙ3[ݏ׽V{batf mj1M;Ǧj`h' ϔm_c((ov1Rq1Yi.6h"ʣ%pZn{+9Ub!;"ԁU,1ݔ斈ɴPzlfE [jPTIIڥrY\\ɄiS+aH3f0Zok$av){ jR|PL!@?tq>d]?D2t9~\AXAef.+YV}Yk9֘gO}N, Hn[%X/j3:}`"L.hJwroߜCy5B^ԼҋWzּM5.=V4{$ܔ!"qqeeuk¥߬+U\W@gJ{̄(ytEO f UML q}r\WxY/s+c5U% %F醄,wP(uq1J5C=DQ; ѺcY ZPb[:e6`O-nv󪝎u9LUw ~5:g|RJz'/^$Q=R|Fs16@",b:_p+͒}dU sv4f;$Q$ε@|D4ˣ#"߉[;߂vvWvI#{ykڅE gz[:R8.1y-)< 'λKb46"雳j:ۈ=*#ӳ8_ǖ^(;a_*BDfC퐁&}lXLG3Xgy=3voMiWD  LftA6F/}3tZA:f`2~{ f0b綔MqQ撩kʻ/TRcRiNBsx/7݇ߩ8<8,ضmC͏ H\|x EIu O _yc00Eޡ2`:kUN!ST%  TՑE/IZVI:B:4B9e'C%j}ގY ovdc7SN]Tcġt If̊w*`::Ëa{sj-0(t\&eơMuIT/fн#Glf0HN,Ƞ|^%"ݤ/0Z7׾N**H7{aі]!$GLJ 1 v( *W΅ןn8g26^}vnDU&1 |7+cL,091!G ܑR6oS-Ί9>iS=#z울#ؖ#X(Qz(+_-<&*ik5:4~hunlfZنiBⅶ /)nnn?ط}x;̔F~:|=@A!hB+ rbvfBeHS]k Xڏ0m]qJɁ\Eh2 W]N7_Mw @35@Pŀ/ѧj"m {[W:[>H\0ÌI|TPCVTK7"+HҦ ]Ҍ Ҳ@k*P5ò`e1}\nnnU]Y޻Gڕ9{dB2;j7pH1l]E]XuiX?Bl?<˾Q芵 @@YJyHDN{Ep }Q[AXm "q% |vH79 cLr:v^lIA*(TXKCچ56łؽWޟ0r Cc l(49W{`-6qz6U긔)mfMD),Mao5jh#y p4㔷 XT{P "U\N~\C{aНQ 0N5,lZtGK;b~aXwfwV^Mo~Sc=J*]E{K V2^2Pb#*ڃ 9v$[rx:zE+IVUUI'K$!h$JҁWIw$z I eDY)2ؾpTP J J&+4 /_PiCåyps&|h}H>4H)u4G#Z0k^!S.W ,ZbmCԄ[L%h瞋X.+{QR{OV ЊJQ-eCU8 Oc튴7 9zqv%4d>f;2> kC֩sc|pku.y5:߿|d͗r>= }p?{k]`)2/_n^`=ܾ6cw VH?s\bąXzR,'&}F|c,x%q1[PP aa[x3uPL=SEEUd9K_xq*p uĢeM= ~P'9*lTP{a4r<*maeCI~ aͅguH|Pe,D2s_\`=Y֭ $;nNRz1| PZemtь *Z; AE7܆ǯ*ɓu(e@WWI;TAҴy0P "5TanoQcυw kR؅ҫαA%;dIdoݡ[S vrk^NTUqಬ*H@u~:!9;PŨF`uBBZ!͐j\?~#A稬;\.ZlXà |t8ċ\2( CHj<+󣈧lzicb=5'g"F'd*kUxSzLڬaaѬaUCYrfG:9x4l %Ae2] ͍۫ efEάϚYI$&:4lBgsJRmRmKSmSmNTmTmUڒ&W,%hɪe VmIj ##NK\B 5\6bjG2K>)EjqH89bBB,kW7$ NK1Zj @[}.b.qiSzH b'LgVc]TcZ)Bxx5jҫJV-gYuEU,*Z|E;w^ЀU-zACߨ(fhx4Q Vy=#[etA\f'/+-ӫn}_7lZ_62'W<Ҋ A' jؔb2gZ >ﱛRyQYR6]I^?՝mSzvk9זRT{ze<+ Qcd(*x1I.A}V4% w +)'U.1p#ΰ֩sr,jE簻LòSBPI~wwfUG)ahl.@ʕft0\817B-\}-:خk03\h/j"[x7\~#nCWM!B3AsBbC[Iɕb+E)IgS&q?n[kvWLScβ$D,ߊ7skYX B-fzbOg9$m~ w `;Ʉ^pyD"ZNRҚXS2uLybDAc7ԦHa>^hõL*h<"cdj*jl(x4E\{YPb5.a*m ,ɽCM ۀkQ.ry, t0/:h0nZv_[U}C1ь¢;zې2l$Eh58gW Dl$^t4J 8|RbKqMZ5bD&j]EwV 03 V@d>#xE˔lcROKNWK/Mlj[%M-\F#'l IX\IT*#} h^c>yG)3[py¨qo.%=2<̴]FE=A>ֻ/ji0o>/k:‡"~󻈅e1T{aa,6eiTU.Uݭ:`"4( +BI *N2F*I ^u V'IuƱ1.U{,MR۸\F7PTr&i0R"U'*HIUpU[oYqx9}kN_w>nuۇa168pmrw}cgu;ۇןwqX:l7+U6:*=~BZ-M?]IQJnx&v L"- -O?9apM\W!j퍄KM]MuCT *uڷHֲB:*p2mLI1`? L gZT\9Ց ]8D7ӎЅ}S!,YۣgUٔk|")ǥ,sPX*8O~Q=q+ aꚝ- B{Hjk? XP?v`uC0a/T"PCsb[$ fV]%a>9pX,9pX89pXY4{c0:hx]uv5@gBD:A(XkQ}Z0_9T(K^Xc5t&-֩K$ '(.u}SrM5, .qQĸ"NN&RRbƈ51b2>Tgub0W埁j*DF۪ʹI цy#/˵1H\QVKHh˨fH[91N0zvk/U̗*KlUu5 Hk$UbAKI˜r_U2 Q&(5j/25ù`7=zza Ҝ%))IM~$7=:yh"*h~Txӣψet :\7)MOqt<ěTpozPIKaRsV'^&yd +bJ#hxӘdyJ}IX{uCE<v+Xli+-]bxJ&pIՕm9'gQboKebz^slR.ͱfN}k,w[8unLiIVl rΝǀ{]j{m5{*,ȅEjJ(=_ }EHg0Xw)o0TF9X?ZVawG[ˣ?s7soZʼ\)CG=1Kůi +0_9)4fDp@Ougvg#ةyncZe6? VNb8;r,:L>],]8]Yx[ 1:j&. ]lh*<5^,o''9kf u q D= 9QI˂N12}y>'Vpy:Jm=^ӈ̔ LƱ[Iژ2ҡǎ~(6rOd|7tDŽ*As()Leи,ӅL:Tؤ[AK 1G4X_ #ae *YOn QB@9A 0k|{*#ޣkH]վ 8HS2O#Aj  A~.(+dDRCU| ;]:kZ^!P0Ŭ2\wV`Eap\ S&che 7TӾePMLxTϻJmbi}_U*&:?@y*+_Ϡ6P܂>. M5 V9'~OV2όg( V\{ݱߌ SNă/&zI* .vF׸DcrW!sW[ GNZJ@6Ne'ֹdȓH;ajV^0z5^ztzգIŔ]IB]Ih*uh^ATXWZT.[:O95ב I@7d:Ϊ)+Z*CM>pMuYDÏHh0>MuX V9prղ6>8nsSTRs?R[6Wᵌi;Z#M:̚ąnnthnLr =Лoc>+ztHzq!nfaJ'@3,HOe'a5}6wM1#}5Fz @Ů6S`S_꫆lMD؎oNER Hb:ǂXH {H&Tvg):@Rt2ɇYsͱY9ŠrD &6x֐Ea͈o#SqI ."_돠A#hP||T2+I ^KIB#_G2<2GBj/Z݂r]%E>#<~i0R)܋T_eEȇ_V#ANq^S .15jg}Ti#u(sX|'J||Y,rډ Wn} ő@Ŝ//"ˠ\Xʩ.䄺XU+-ǎpv'P lSr188-Ǚ0c7߈E =K 9_] _ 9Z$lQUKl!G{9Ęux TwR%cĝ8]IT3c5%7w,̛07E7NAj^ 5WSnt3ᨤfRStW3궮m(Ci|zY*VÝE:@*eZ0gB*i˨ʍIa€S>,rZZAq@r 4ʂA'2™q` 0eBn5=>Za`P d !L=1e}g}`YmR;BX/~ͤ4tGDHt l QyN5桞|KˈEAzqmÊTi,+./:fr"wX(C9$Dq\qe<$X0OiYakw#k/Bs/l92RYup ߐB @UJdkWgh.\]Ym4Tۧ-u6v[>0`Tvm+& +퐊9O,US5b YzU*xMB'f="+߼K=u+bD2)\SSROiz*IbΑz' QvСR'Dj:5et:\7)GZnJښGq(ݏ˻"\"4@H!Z /DY7ฑ ey)bBbvk4ZFeR,IPǻ("lWV !jt=kmqдqtD3g 9 MRvt\7T,.Cs ؆Cי0331>r:սB] k6wlE+Y[3㨪͆-ԤMU=5Cv!\0!AM7)0@|Prc|/ƉqWU1.7lYh2;dޢc$oOc6ntSG1ˌ0Or)IᗢFauQT:GX]}6 rk D؜DB7zf*+Q_=Xm Nk r&nNM+# 7#ǞSgzSb{O/H<ۛ.@ƏmH Npk`dCHvPc3.o̷+nK5o]w[j\xQBeA@-$GTahV.aq$cRRIE26!TLX/\\Bscm r *270bUl Ć'T-J(#,Ys lz)@ N#cM6&Zw,<̗x/iARhEerTAhBv4e&$ ^l=cwl`k!7G?d_#qõ^aRJFJeW4X+83 J=W喔x4oVO5Z"&MY#CvH;D@ R BA" qX8ޯx kf9R;D2#$աH[EL uȿCLoA_{u*a[ZlYwÝI@ J- },;#M$h6'aHim3ǂHHmv)+\5{,ZDr~[?Xp-$j&ǽP~2!l{<kX)k$L<aE՞B klpqY|Өr>y`)i<7,X~ 61k!u k-,aISR+ zk`R= aZTE}\By(qFkKFk+/,@BgTpŲ:{Rbvvq<-pY~_mr= iyk|I^1wĤkMgt[9⒕q\τNc}^EgQ=P9:-U9CB|ۙ!v99Vk^3򺦂bS֪yn [xgpH][r#2\meUL/;߬fㅩn H%йh؈|y/N ӡ/x^t1O֏U~Xb\xocΗ9YˎIw_\3{1xedJ~ջ'>Bt(q\bNmR4"ڞYd)e5>uE^:10TF3O$kNwFi\ sX'֖!qOc3~[:1&?x-֑e1\s+Ͼ{sxOhϧW).e~jǎ+S=øtz=7Sx sǾG6%w$U0WEԅVA([x_jJLYJՔ%e/C?Wt:e#icpY'PE2]%()SضBYzPK؄V#<P:6/Q̳B1Q,Ԋѥ:!Jp }uYsS ٹ PW̉Ġ( B{0łaiC 0<;M1bߣ` J]呕[U"D}Q)Ȣ.m. \$z"=$ fDYa&-{8wrR@݀h2uhB2Kԏ: H6HP֮L4) U/uY'[:qm\U6?-g:>^#!61-1 # :Yr1FG~o]$ &+Gӓˮ(PEafYԄ|\Q|[zFhĠP]ak`-d5 KU.',1D࠰\ˉ q 63j {6٢ ͇ [f3)D%/@(do1Ҍi/&sWPR(T8?C)(ʕa=p8 NدgL q a`f< (*M'Q.\9cy<Ã:T.k6m='pYDS=6 rՄY8J (}j(%Rp #4O6iUS___Op)~UIUZjj媢m+>y'ӥ*\7-=iV:wx5IǔW%enBaY:$`W'Huul562AVn3m^RSe􈋽iX[" ssp$ ̈ i*iT퀳`%ކϕaseX\.6,\mXY4gWIJJ$HJ Q'H4?*U{,7S~\.^drk0ą$NmuM\O#!IPH+aif7.LTPݞn&:>adgTVܦ eRp$K[rvb  NdÛMc-&=vXX&v$5Lu %-2iq|B[qz"@>ݫR},MI{q=Ǧ \b[, HEA+Q n_縯xr|ӥ(֞^T !o2MxT޷ݔۛнqb!Y}Z5C6}e:@]  <0̓>J5k<ک yF|vЌq%*X qbD| 0ݰvK=͜neJl$>W0/vk%~"?MJ؞12Qqo%f̘*\q+ݞtɬl~3#`{QFVLSR"o z噍6!cbDVL!mڏ<~cI 2*04HkkvE Va"#eOIf*v=VWoPE J&<3]I }vBoʹay٨ۈ Th(x1Ga8KZ{+'{Dv"HF43?F- TBRߐNgVFMR31Ac@ S 1"^ GCo"Oы%zRDuimcJեeK1lyh4 W1E۵m1k}+6=tpa&w|t ;(wɩ􍊒SҔT(K ZrjYBSaُ!9Z`"!Z6\L.\ _-.u}S&:lkS4A(/xDžkxAS]-zZ`%-CYr*3$/! D>9n`Α7CHь~(e:4cFKk R0ae[Y+pS˨Hl [lu 3ДZ+!\Y͗?vwzjvpNݾp!43Gh,ȤRH\7и𼠬=\WΉ?QZ<$y~JM;žHc,"A)iTG3:ǒAjNp'3=Y/"^υ=i7QՃvdѮx=T˰L0gڧo7,1RFK͎?1㲗 f鶎űMNgk_X!pрbPkYBmBpSP!8-Ep _%J1<) ݔcϱK3d9(!r/o)=*VkҳߜE*X ٹD@[&=p:|&7Sb Ra ƉBwC? vV^1F2F}PA|L\"EJq˳+ b50xv&κ*N,I)F]dۭY={suuKaR\3x䅭$mytߤLY-aX{(XHP,j4*0%UYnA@׫m 6 Ϡ {lWm0~k+Xvob1Ɉij TrmAEL^hIOWi!gs=gboy@'j[1pEIV_YPUwک͉U3ўf|?j$hs2~Kާ):6oH%7m\ XGh7mdB63(X.6(Z/~b0e{Q6/|C;C~i@f9B%ݑ3Sϒv 5 W'?(`5%@}N=I G@CND(n_3 QQ+#me1=lg^c?"Tޏ'Ƶƈ$^ڴkec🇧TdהaZTE~\2\sOqFkKForQ LbrjnDTt3 E(A# A|rx#FwPUƲ^RѶСTvMٺG}Ny`8}$!O+v7Iq} >d_R/iO̝916T4|:S4;*Ҍ^r4]IcG's\x m"<"!z/Om*xe̋ &Kz@+ibJ 6K-$L,gE#Y]qrf Lۘکi|0]⻯ (eT݇jxtGSF=ANs-YU[2"@D;7mn;cQ"=lQ~X$ #6=z9džg11U+yCk.bwosno<R@8y":s y&ZA&keC{NɄ* qэz'8.6UwL:UZBjPST odԠo/M5WU,%X5mr`]Fѫ O(޹:mg\"u\&f+1ԜY8.9. ЭOmS\.c[FԡFc9IS/3s4i)%u55?ZJ1*l1SxiLԡNG& 2mٕ~GMS ԴY^2F Jѣ88k/_IxX9N駰Z> .kBbe6T&9WZ5O1bHGN{ "Z84sƱ?U5xƈ~BEg(!ӹg!#^N giUtFe>Qc.xeˈ0".+ذ)iu,u,u ,u Z$Q Ub7rhlp|FY v_U\'Ĝ.i㭏Ytõ5\CJ`mC\^f[< +fÐ/^dxd G81 m$Y>Gr% qlT,_{6KC&~^F_5}ђ_",U-.qf%י'Z"byk<il9{/(P"EL ӢϦLl2I"6?6& b=2 I͡ ^Q]pW䅼φջA7K.Cf/W q`f5E'mdd+c衪 SbiǙoRw1KfbzQb.7(mO(6?Vuv Ϡ{J/%?tܜn2iPKqtPKr7 styles.xmlZ͒)XL%(ьFYɕcUMʻ{vA$$!&ǧC0O R^F :LgI`:h~ۑ r%2R`3+C\5++J,V2[ SǴ+Y¦k-YNeV/NY}Tf;6,hǢŹ uxZt3qkjpચg1.L,MOa}h]n1$UTq?9#d'w;ϧw%,@{ v\qRM6Ӡ}~Xb0T$O7'N$< P5gƀQi)[Wv e8qV`>+ÿp#%Pp}@69lI:#shV^AЏa|{J4aC|çGDGl2h)ɭVMq@!޲q:񛪉5$릯9rCualsTH:UKU5%`)Y.S^_RUGB8 @AGM60YvHuP月B5,}^+hKQΚJ~q+7򎨓`a8h Zw<"[wuΔ7rR45LF' Ck ޟI <ʜ&y!OwbʩrHZsw; {,F A>QOw5 M6Y1$ MOPύoSU^U-+nn n`r1.t^!O5)O_I_iQK;ZLoDzHgOz/ǧvr3MgNnp K #A=X3.o :̋6e3Dk` w6nnl V|r"z{C0#-^tQB4[vdzʎ[K3Jv+UW٫s^ gy5mTzk>Ŧ8MH=e"8 "ea@[@AiQ7Č#J'pjSTkqj=ݧZ>zOW+K+\ !W\!S;g#*j]t"jin҉<ݗhc axVmF+ '=+uCw͸:WC-CG FGp3.Si8pb4)z`'l6+|'#Dd̓Pë0\#(Ew9KuQ΍j~k ݳR2Kٝh3A/6AmP"hx.*%o>p[*W}ܨ`QJ1q35B#@Im+Běؗ7gìDx|>#!>ce@> ˡ];pl=aBt tV]tNʾ )2TIw@NVQFCZ,Vl9~!QH *CK(wqK6zhk?PKn1O%PKr7_Kmeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m1$Build-89902006-05-04T17:09:48Ethan Galstad2007-08-29T09:23:38Ethan Galstad2007-01-06T06:24:40118P1DT16H14M58SPKr7Thumbnails/thumbnail.pngk4CxFU-*-T1ick"RUGUkhTUYi4<#DQth4,DFo;;gv9{,PZr/NT djQ(XL4ڴb%|QB?l\&z"C@Ǹ\Ѽdec$'DҮY'z͖=|hbB~HBJey=_Z]?/AvifXx}]]wFɧ h_uq!} ׏ވwR栲)#wn'"!\:{̜]QVMe_Sr41<&&&b'-ϸ!E-F=:S.v۷>moqE-ylU]l&3GIl**Ov]~ֿ $;Qˊby*`a9z/4A@e`(=Y gFmJozZk! mtXYV낷;eL#7`)d"C9Wa7G.?s^^(ϺQyr (h@]`1TAnFB]+^ 1>}7vA#>bO̻9X_!_X{Vx)A7Q* 6;B y>~IOή[`|9~rǶI&, avI@m(~fpFtX>YUT;_JIB)WcJZFq!Ml$0 0Ssml4Hc4͔d:dф=P ;<C*aܕu^=@ vMÓn%/%z6Oo^rPik.,ӜAꊟ:ϦO(Ԕ65~0ghPK dAPKr7 settings.xml\[w~?]Z۵uvַ)R1P$|EH2gfs_˅Wx,p).+ Xvs] jk6&,.AA 'Am|] QAjܪQnZl}ed~]qJ(E(sJWWWuբueˊRHXO&fV)/Kba37Ks]7?7 և3\沜uQ=8zYqonjE0Rm+_oYzOx--Fv|vErq~[:f4c[(Vf88c`RaD7 p:&:FnS \b%/a`\p&tx#5V&i^|qR'ɟ߫dJL:O2iMR"?ўR J6LN:=Q Yd4`=lqlkL\Ha.eRw1(2ELobh& |dIO ?gaJ? x|\:ݻسN010'pkMȷ?72$ k. u$KiDtd¦0Sg8dMjb<ܤfx}C4&^X13PAr!_fc7\UPj KVґST6AZ2r рz?&A]kG<3zl\rfUƫb\UVsq錴6'`Ǩ\ kzg83wϛ90Blj@qnqT HYY>Y.lu퇺k:p&9* ʢOTS]|Q#qnW餭4}w1{tӢ9h.?fCkWAڲ"HͺBL5KH-%$Q=rr<9 i;Hުzl+=zt/㋿mW@/u׶M,:kF,x( 8_ʑ#GAsa܊s^S.@c#%~ Ki_W9r?=Q~{Q\?kǼ Wfe@ך7x>k_ԵL'`z T {[]{"c߁|O.3"0`${/D{[;b\*twt+Ou00`Ds8'B(Ӊ\Sf(ٔx?'R4o4TEU_rZBL{Q8|L2qx]m%G,Rs%GM䩛B1IOKoBb06,s"wߣ;6'來Ւ%sEq@Cf3uбuޗRl+n{zZ#kb^(9)', -1q1%0wI|+Uv\ԓQ _!k-0 w TpeJh/"m5F&v(s)o'\h4[[`4Xked=F1&5D,eX b9F00JM0qH<0gi— $(˺%Y-0Zp_q`&B9v=;Mُ!!I,bl;- Eq`6'!]VXXzW_J'7PKOqT@PKr7META-INF/manifest.xmln0@ =vx+M.]c+0UkUQxfGS `&7pYܦdw 欤BXď:Wem_!nR鐧eKLR\|F@> stream xVn0?̹@r^ts4G*F/B2#WWR^5ڎџDW`>~Z\{4PO^+OKt<-E|(z^mдd1zTWml<8A,der~| F7&cM:W A9U@;0%#f >NqȶyzVzl ۦamd<]*I[0\3n)Ħ Ad ~r>&-˕6 |QeIsP!'!@Ϝ|5Zu]T,c@LI%O`N8R,l[lTT%[!AZdoQNjS0˴qQԤGj"Sqo/qb<"㆕c>vp,lOֻfS C1C?/NwRkڡ$6g{ d#Y?0(U(H"Ue0#tWm>p=>7NΧ[o€=ϋq ;$8(_6"If-E:iҋ˫}BM_ ōg ˃յs}B}cXpzCnvA%"zom_5h -`T tv ʼnNc}rVĿ{2ȉilendstream endobj 3 0 obj 764 endobj 4 0 obj << /Type /XObject /Subtype /Image /Width 595 /Height 150 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 13579 >> stream JFIFC     C   S" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R*)dKمj?t6b)l#RM@ m+* )erה$s.0Vl劉hO xڄ%zMw0taE6= C~c_7v|TӴQE▩jׂyۀM%gngHF pu_?홬xwė^rb#b:1?M B62,W3zn2F pk="9eArk7 67s>c}E2D+ʰ4(((((((((((() -gxiM8КĽ5 yĿ߂#rQ0?oSY}֗evƎWjOcKѠsG<],jczƑZV=$l2 =Ή"uH']BSZ)p-GU,hJ( ( ( ( ( ( ( ( ( ( ( ( :5\Y[Yn$h3x~j;z7ͥ7TU8ݚo=Ki>=|[KX/t!4q$wQK00(Q[9⻁VH:Ѓ_ ]d=G ~$xn[φ, Ͳ C,>@X~~?S෇u,F96q+JQEf?ؗOYǘk\.35A E_wx0J(T`GZ{eg>r@Mky5Hd(?4Vcw(8 +Wxkb_?'|Fŭ#phѫ~p|] q?/o@EMOPgS}GVcד:υ%X*Lȍ*+>Nm"i͜~G_ Xю ~}WPEPEԁ@ E4:NBH*_΀E&AK@Q@Q@␸HZu]BeA[ȭ4%-(+6yS4gVEѡQQ@P_EPEPEPE(((C-3"uS@7}R}{'@Q ~T -Q@70迵왬LᨵJѤ~H&,z zl'ּ _g|@i<+ y C4"tIa3m h4/_FjYlg[7Sf[ ʙ}@$Va|mke{㟉SWŭ.75^EX ց2eIb'O7մ >Ii͐pLmIM{UosW-Wn{!d8Q?^.#/?\o%^IouylR؍3rw)BG^D YHidbK<0vff 8q@Q@>*/d* PPsHgMC|zo@:Q@Eb([KIPe9WFm]Bd7t~eτ5ky n :t7PtA5cW*-|}k[ k@-}Cd S?;:ҽ#GJ+#_1p5~"BF/:p?zuyws_^@gj힏Ku:D3Vįx́j[_?꺝ޝ\F \Pş?¿O*g¾L($K6ʃ_>+xI/%}8,kf.rI4iQ|rwzO̧ Wi4f#/R>G5q_T-Qow3_]*TQm̱2_jx'.m>; 3jdtZKeu9M}"Z5M;Qv,jߚuq }g[_J89]Fzuxn iBJjwſ'ÿ {Ċ>ao+Kb\ h'Zk>ϼeyf=ɠা RRR}Mkx[ wAvj95Fh('@Ao}p3W֚_mW~ M+|E]$֗)Am;풕+;coRpJG˟W姎~ j^6廼<\3u:g!Q__xG>/ӣd~Sbtm~F{y6F&+qҔ|ƀ?BjU$ԣ^m _jHXD€Ƹ ^l2 eX20j.S#h߷ǃf}/N*`+.iUӳȮ<5/BLjWI +WW_g>-ײ* g>,i6rj*}QE29VTVSzO+ 1|/e%D3noT؄n-[:ޟݺ@QOP SMoc:K"|_+ Irg|.x>5kO=rwOS@zLDJGj0&֟־*})0hGk̾t_SBXd I1Rs%w?W$F֗}1Ȳe9+7 ;%[<Xoe~'x&tyk(-PEPgߣ]# .sWl ~ϲHV,vm'k:TF-Qшb֛bڕv񌻜^ (ٶsnWvqڀ<_u(۽N￲;߆2>{%pWߋOp!_ݼm2Ȅ)"A[S . PVL%r4οls8s` dm3_SRE&@5?c;z!/)6%ώ|A4i]4Id =-gIs)5{?Zp?ٗ6<)K(v@N|>o\XJs=J0 G~:<)}kaj˒|.gbAʱr( YI/%χ"#8l۞C/?կYܤ`;q@W/W~v_1V0I[ҽbba@7񦢎>aN{їGƠkGJi_L)bk67"enz4S0GUv64dOG~"N$'ڀDt27qּXt3A:HS@?NOPpkI_&gi'H'_ea ~pK~0ϣiri IbĒM~OI\Z~y/WysƩ_T_Rh0]VAW hvMDm­}m燬."EP$ KB+K" q/M.Ųzm>[B}'"Ns@ v>P vZ~=z>Wx_wv}>Є6:tt"(#XtP( ( (Wjo< <\̶

R* rc_]!;k:YӬxz16X|'Ī*5/ sXLt1cP%>foª~9׆ITg+6CNyx M}@;K|ZS+WǾ(xPOʧ |w떝'&? iɠe?[ExWnx>YL<-aU~/2hm|]n1 ~Ki(&dWPknL@ȱWhXl~_ b=h6cnȬ޺2X|<~u~NNWW{g˟ uxk? vJ}KX^7bdn{EŔѷFR?JzmMm;J+G|_vJ5Y@,Ik:f@=k yc7_yge.n4ʃj; 7 ]\x2XbF8"Q  M B~J^LrKW9ZE*b E~1>jDrE~R[οi?)Dc8q*1Nihlou8_>*p?i)ᾢ_Wdǚ'O1pP:R`_I|J9 .Ek/]_KK{JO~.#QϿ)?;JTPI*+ Qnd(EM<e%Hr+k=;V4[Vxؖ-~u(:w}Dt>7f` aCM`m0^[F_#Pٮ\nJZIX1@Oi_m# o8j_7o^XWSwƾ P[ PGK[v z+N-uX[iT# _̷>(k~ [+!nNG.K!r@ 斲;Ep]E"(((|;z~~ܺ,R0O~x|x)j:t=gz/wR{cyyF"R^Z [4pCyk@W`+˝kNEկ~ xNž0Ѐ?]ҥufBT+s\kws w' q_)t@Q@{g4pQӌǜ~uuCӤ_@ѿ9O1,* z9/ES ~SO{yc5k$+$zk|%sx֚xRG @^,V/ě Tf¶wWq+'r潲'1`:?阮/4_ ouXwuݦFya@/-WN\}__G}F cODyl/AwG¿9iۊ⥬6alM#,EAS]Nn'y[j@\>ﮡh32r~h ͣ1_?M]C3p9ۋVP  e~VJ>zĺ "I*+Z?^Džomn`Yq@/ UP}82q־(e?<{g%kv)?1o|Gv4'qfNnn$,I LK@YKXvq qcfҿ";fS/Qɡ-c zXi! 歎k̿h=z]#-Ö"F6gKY66,8k\WNg gB8[p9 *[ui\ cw1@W'čBj1הWҿ'Ҿ';ULszP'ŭL`p&+kӾ|^][{yYXV xЂ2:W_z[A]"J|_px;FҤY4{񥦁9&Uv3_</S_Z~߶5;?f$|]4i i:mE)fvs |oFHV8۝6mac~|6~6C`$WpW('4;TyNiM;ޓ+*8Mio[9'4w3J^[{` QgpS袿(׋.e\+g(Ʊpv3K-XNV1+{o _N6I$sgE ͭL]A].-H(o-s2_ISՔ د(/<b{UKq~B>cv uBqv_uiD:}huzt1f+keMឝsb(( 'o£i/! rWyPh~hVKJTe8MTM.ChO[GԾ&}o g_QÍ1ҿc"xmeHI}klRl1(aZ(/ۃ{/n" 2ՕM#um2VKy:8WO ZU퇚rEDzqJ+RMq7լGﬥP?4]8_i<^Zt_`zm5/W,n^AȤY1$? &s/_z1𭕞ݥ#ºh#Sid<3+ǥ@O)rT_gDpvW4Rm&. r!"Ko4 CG*$ sإ]cAW|kxxH8$W^u>}m+߉gQ/?75oݼחRHX5ϱ'־+x+^Zgj/߰~;I%@?h|f%rM?.UOy?4Ēigsy.O 53~ޑ+}[PxX7̸֭60,%K!u͟(/,,mĪ~h\FѺ1"oxBLW,G+gw}sh`-=K־?boXNd&ja7%ʤ">poHǠQZt_Og$qc9+_JX.`]m6c ("A jG`PG 5kW VX@ ~/|I2km87Z`@Ƈ 󟏚#kuTn>SqW?GΞ5F 6=. QD+=͇J"?eKgLgV%ů=Cº;G5qMdg \|I8+j7ӬQZHtW|ԬuHu{fFnZ]kX7 xې-tUk9Ϋp |%"$Moyi"*1*kad0Ag"h"nJQր?FL1_Q|yIMjRIc)^qĶCih/ͽw~2/c-[%@嵤6iJ A~ s>hCh⪳g{-,.QאA[MMF[>U5\VX]xP%_Z4?7?i1xcӤvq,Ѕİƨ ߂~tWO`"$'F ۻZhmж=43P]{G4bE<E|CJ<3g1XVƮhQ j[\#τS+IsYǂ%(OWt/o:oR}_U*Uj0@ k) qO dQKgMx6®O:,cT"$ J}EsoE$Px ׌N/9 ͔^cw+ڱ1@>3dh=a2{ o%Ťw ?ݯz(O~QHar^á>Bzt9 (F8QPxOrut4P'r_G 4?PFm;@Ggn(kEAu:B1¨5ǿoEUw%2 }50yYc_?Φ>&-IOJt=sPH.|ƾ_Ư x$:+n, Ό95}5KHU2W޴Pң3&Gһ-7 vR)ǨU>dtz{M9UaqEEP$jTPEPEPEPʿ뿇 6#)ڿ~ |_a\q}.~? j.A~e {M,X@ 'u%mPޫx\}5M8U5&mݾG,_F_ 5]8SY`MPo ^qK}?[ {r%x{ S> stream xn6 t] [r(J\'1H@hnVa5#.7a~EJs!W5yv?;=g/Ϳ}}usw}Ekh~=ҿ5w\_~z[E1Ʉ$3']Z)Ʌ߻.A}HC1bkDBvS 6}Iuj(QcMͫ楹C*i.|)E!_4dV˹)n:c|צ|Rs?}7opXogZ+ wpy::Nwbl3}-뻖BQ{u ?Ӫ Rizl(,axSR ϳ|P@r *Z͢7WG!+ςP& BJ(vipP?Z]!᚞r'(P^"o) ^ڮ􂛵l„!)%9rA=(v0 {~ (P*k%TAVq/C2-BҽD>X&7ϯ @ T=U-A~5=bq4nVqugx2|vѮ_by8ŭw7(P@m*Kd˒4yRj:k]98a&C9F-/\A[@QeGLDbQG}IL\+8;ăR)ZǥR,HHyLo͌Y (P6IR2\-Mg:? b9C. 4[z٧L) fYe8eL )]6zyUo[(P^*U6fUv>c,u<|VP TŐ͂Շ@TY.LUcw{b^6_\RMڈQ Se^T; x +~|^ @=#lmxM~EK|;ȫ+ZdsTƖ>ſwEK(%'Nd٠jwʟ׊^+&^y~ Z  ԫ"%ISbys_1A(P@m* /W f/]l-ۉY8vY\q?p+@z*K/gnk\˾Hp'HZ&w[ (P*-\jޫ;+R[3,c`W͘$^q1(P@m@Q!R~f {Y[gBԲ3~|xYa_wٶ(P~*3vQcdh5flgmvg&:cg&lwR#YQ֯u{wV^qv@!Ԝ)S^;NvcۗHvǖM_F6o}k_㿿6~ > stream xn6 t] [rxluZ})+튤VCJk9͏HrTJUAWuC߫_9ۛr\]ϿU?JV?T(=9mQ?P}0r}ntJT))I`졎)wXڡB_E|,fc{UX =sWNE!ƧSc;9 Ucc(Rܯ^@>%ꪫW Ҫz (P[D`+(9(P@g}aγEEnhq[  OcKK)濭2(PFҫ4 X\zoV~fC䩵 ֱyj_xep/ AEJTQ+R~8e(P3ѫH+ #^ En+IJ Š@;J4xmΧP63'r0;,VQ:Ƃw[p0(P^Iyuㆯ> (P_0T+h%af»A'V17r6q,F0pd|(v_&_V:/:BL1)>PL ˆ=[yb]ֹ¸Eydm> stream x\ي6}os 7Z,/0$ l2~쾖sT]'!&3j[*rjqߕ6'[l_tw;N =5/7/rzjmmO&\S;XYiӊy^sKZӒ m%;\:4i|dy`GK+Ɵ' G+koqڄ 9x{[n">t c\\LD|s 35ޔ}, |޴J9 g=.G])jZA[:;6FTR!Tv>V4oMu$|s$3JZk|bJP(-׌E? \Ilbve״̀%s]iun"#r+,r>Dvr@Tp x#LRA,pcxx_mȭf \s Iں`$_xe\w 3RGB_ TN(9PbF=4.*/K]ZsP@ P ^bըOZ \E*ƪ6ǐj¤MsRĠG2_<]zb>ҝ. {%2u`:}csG0Gl $u+E,C3&ӧQ YKs!$fe@q.b2$Ї 4̽4 ئ [ $ 9D٪l+q2 R h! HR45g~TM,CPH4px߁)TBS) Qء6C)^RLA҅S-7^ To9MXcrKiA=]֡%uiAr"".()-:D s#VZU U&DWЀ&`ɜP4<Hٙ?UeD2na)`7r6q>a2XcZ˪ɲݝz#4INHVPNOfS>ugD&s6Qlw}JJ U8awUzSr%Mكj w8:X,Y(ZgRpبSe!K z 53lExQb KhȌJ (M^C:8$K+l+̘sYҳ-[ؾx#[bb{N'񟕘\*=QmZtjB"ۍBSXXOה ӜyRՌB i2(6AXeMKH\2e8agas[2.d8 ˒`Ś76 (nDS2FSӽw*{JbP:QF'DI6wdQiGiE[k 3۸?)V #ruS2D=jʰ틋u2>LT ഄ$:d&&)itUm2*9Iγ}4B5 )Ir}rXR Bnd05*0T##O3 V5>L7%~`'~xH_ ![QԍX؈nގXLYcs#R sj+OѼh*Kgt\GԂʗGV. $f$`(_!=-bfL4q*f4c>Vh{{i<&[$]\q!/@=0zbq\/}/.Z]X~Ψ>?g4 &P$֌K]4-< ,3< qzvtiuendstream endobj 13 0 obj 2154 endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xUJ1 }_ȳ`me`ܛ D}:MM²{IN2>wp)~;<~< Mr>, pg{+px.ǣ$@'  I4#HN1? ca(Y6ai"æA].=PWX PO\4 &] 4`&tf͛`'1V &Ki'bmU Zܽ.:UˈqWs7큏+94|e-A u7@l\7@cJEwB"uC[T8u2Au$x #b&s#buZW|"endstream endobj 16 0 obj 489 endobj 18 0 obj << /Length 19 0 R /Filter /FlateDecode >> stream xYn1}3[&A<H b3v*!Dh'\oo/eG *|Z?}_7$d_+~}QS„A3˗]|9ZZQ3݉Y(^|-ã9~JiEEYBzؠyYn٨WpE}(;K1Ҹq,&7\hcϲc%MQ|{#b޿ :dw(24 (=p)ì.D- ۺdЪu zR\ZRXwcn]UNsK4`W'Sh?8T J}ܥ mt}M)ynrͦzG6L܉QSv B0`ԃ0UH%%$n])PHU@W2ad A"d8kXF)R"خ  7 fi<<590TyMt ǩ-|<[U/k<EQnz ܽXFARq4qi ra-E=UMC\q1d\G]G_vtB#c ''OkQ`zv $Em(R"5P1C!SE4r6T):fC@!H`)9WD^#E 3A[}tMx=5XP(%'}W0ow :76T8e"⚂1Y`$UGz|r$%TUyֆn_f]f:\ZHzS[wF`S{Շ \1 3/#fJOrQGk522\ s|> Gϱespksulx#Q.aWC^ wA$qd$ }ߜK96ű<Ӡ2j8BZ2YmJt6+oēxxۍg3> stream xo\Y#Uh$K񧐸)?#DuMH"LRW`YEl LH(BZWM[AvF +𗕚Vmay9{vϞwygs;Stb$}/oHoے$WJB%x%P ^I*TW B%x%P ^I*TW B%x%P ^I*TW B%x%P ^I*TW B%x%P ^I*TW B%x%Po?޽FW~ӟ7l}泧F,zklq>ޕPk> lA`l/_vpݵX?h9I;b㿶_ us^w- px#E$}Hc_ӳ6=&7ص]/a# *L׷f}cbx1E|u O~jCxOGcPkUJ?Af+ {{]u/P.-IlB*S?emz oY\++=A̸›,e(|T~xQ9ⲽvSk|vxgl6E M6d|Y{^ nðAV,;_G ҲE?`Ogs&Cxgv ek;Z*6 FfwjR9C&9l_V#"j9i^;əVv᭫͠:MϺ vNFY/cQ?+x\PkJl8f *dƪÎ-oRT*;ݤOm0ky>ݜ]G3;, `T,k.5Zd_-h fo o61zAV9Xf-WߦW%b3=,pוeY5'Y2 /8Z*qAwmw֕ >׼]|ntQbޠ}8pG~LaE%42֚{'%|sx%\ ^I*TW B%x%P ^I*TW B%x%P ^I*TW B%x%P ^I*TW B%x%P ^I*TW B%x%P ^I*TW B%x%P ^I*TW B._zw߶}H ˿J_o=Kjh?;}fϞ=gd|;]ؑY)ww:wsϖ,?=_ΛR|>+o>F&x52 |$xeL#ؑ#Gߴɓ'ј m]=c7___nZJWovۨ3ėH^A>']33'^:WeKv^##tZzPeݎܵk@}Ƭ!jd"2: Ɔ*jkB=2Q!w cE,Ŷ  i|g$r7t/p&bUH`'On< Eܚ05eƶuu[U˂ 4O5Y($/ǪO ^Bj#YAfHKی knAۚg=`̋|`≪*GYEqFݽe0E=dۊS|+˪Z744DC0EƐe"l '쎧sȩbM{iޛnQY~v7w Ï>ɣR]yOħ[o}|泧|d;wzGd7?|0+x5 |$xeL#+kd7 ^Y#HG{|tѽM׹5u'ʷq_} w?cxo># Tj+ xcxFمхR^{V7WA6w߶' QG-qnt0be: G8dh9a+G>mwpF  &ok* Y$Tx-pk~˃ĩ'=;_ =3`izM_|,@LQ9걭uB8oJx^&@"ID&{^VC`43Pe< e35kƶd 쀡PPϪ`,3Q2Tnf5k.^P i|HVn8xީfs@3ltT%x<mGn 8 !A*0dFoeg 8PVCY 3Vblx=O?Nߊ -O%#Pcy2tz 7F>oyx%sJ%fzo}7ŜrJv /P 2 S=f&8Ns9L;}Sk>4~f-~o=UR^.!t~2ߺƗf!p2htU5;ԂwȋLN㿟Bh3ӶTo?!tPU[x il[w`0rDlKN9JcS6vZy%7Z:5aU]< Z+Ue;:ImkZŗ^0<R Bݤ#-+kd#=‚WʲY&a+xeYKxǏ{o`=z[y\{N(DwIkmp)ËpaΝm<ޕ]6~Vxi ϟ>}Ν;|0˓/3:m4|ƆmwpFg DqA]Bpxl?pt[[‰>i?<^{Ms@ES?5/D֓Ȅ(O˚ 8*:/޽{2$qf)HD&;^??6$3`gj  X&K=ֵ;b ȯw'}f˱r=LE F rű(XW  PdT />kL#>"{4Ln30J4"#2Yg ;eH;+[|*HxTc @K`1&b¢0 yH=^n ǽbȡ8 Cc^vYQ^s #ebwbVCյzw ₖٮ,7x-DzСETJ*ΔՐAS/ tp1dw7V^v gu-e6yRfxsA( 0 >>NќdJ̞ 4xR`{66yi"v=kdh2κk z ӛ> ̍z86-_3C\\lKm+vf^^N(qiU1_i2;Dr*T -x1DH[DI@8K 0ܵ90m5$"΀ ^\7 9<3cLEA\8ę%Z16S|kോUT5PDU(Ȁny+ ӾW$x4^umZ J?ˆނW |$xeL#+kd7 ^Y#x]ϻep7>ճ 2lZQ[zeE&IӞsXq.|g["-ނȰRYe&]3Jg8^z\gy?dzX wl ZL:yo)}uO_)"ΌroB*޸>-"fد03zx홡CPTꄃ= )xoZ~y1}mr's9!n@T¨x'}i.1r6lؠNx&:ދ _Mm ŦErZk! _LH7m)n@^8Y#x8~Dx>ζ 'Y5NT2s[ W3}M-۾7\ v0,x>{=D,WRiGvvc;Z|>/ *:rXϋuVey3TiW֙zKGWo>F&x5{,'N=3YV{ˮ]Ge-`_ //ݦT`Kmo+2:[WV /oJzq-Oj"ML'.ƌsZd^5>Ï2^"HӁk& ^I[z ^Z^}oseږ[4f qvxYFJܚGf~!-E~RIJ|jy90 fuKH^<4+sHGl$%+ ^ ^+*+xB%xT RZ\&2JR#^ezZ*Z-ۂWZKj=!R䕤Zz畣*xْ+x\O4L$Zz^<%x̵'N=9 /d=/6t8HJKG ^P ^+*+xB%xT Rλ[ ^]9W*TS+Vp-87 ^)sխep\ߗ%VOHح\ ~}- ^IJ_/>\]ܱThFikԽ ^Jggd&L3ns_+˂i$x̕ѐ+p+Yd-D*ŎJ8W`B\z ,nE^[42+1`$Us!L*ug%Vn/RJa,.glT[y9 *"U<3 K_6++I뼯}M7! r瘛;w+P=RJGRRW*TWJJ ^P ^+*+xBx)+嬋o㠒*[W$*+IJJRT$*+IJJRT$*+IJJRT$*+IJJRT$*+IJJRT$*{=24] endstream endobj 21 0 obj 6596 endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode >> stream x͛n7}6I0hD@ v[#j 6g6߮ivq_l~{}}v7şwi77cs~a2q&Oy5m?6S|{#C<0N><F.4On9B?B1g\NPX?%-hȻ IsZE]8pAcU{?N1>szcO7D^ #y$}:$I<r{=,FP,_Ӝwް g \dŮ̓>HBaUcL$|,ss0ΝEQw0tȃ(*fDhv#>}<ʤ߽tȌ*h]xdLNGnVP4/B\etALD},V1o %Bl'&}(k!p)үkz7%-NObي)Ң|0ؤ(hI#6!]{, E/uLu Enpə:mzM[7`?#V3[ҥdA#B3I=O9FJ ;W\HAm2[%R4%!)f! I!1_И7%}EP>@^8DBqN%[B{o]`nN D`BHNTTxFdw9Ѥqk4!+0NE$9n2M f)\&XBx$\W,U74ڄIn sLUgpl7ǩX~Ų`CĹ+uZEaB3i&?]$΁*=a{W8-MCoWBݽ,&ܘ+*EWkR@U#*a޹U7 :3ϪZ2C=A 7k* b+ԕ ,t BUu P O  ;fXgP:Φd *h`^!&$MRs|-?_beU-U#@4xֺ~OJgyO ,0[B~E9y(0B( @]n=p9{{Yj Ez#H o%@r++uyl⼴:>@ql@[}`W L]+C%L tlJ ,}` >Wywc_zKґ{'>Щ<;8Kز1td-0W,VTW]tCa7K˴>~9ÆIOu> stream x]ێܸ}`A#(z&ϛlle?ub C-QźX[TÿkLUo[}'[Н*4fhɏ7p^h3|sg/l*SW_V?O^SX_+v|W+~ǟS3_~mw!uA4l6|dž=?Nva7⦅jX0O!̳Ӯ.;Hi|- vºfg` uuYEdc[͙')7?\ @YR@.cMJ W\N-`eؚ2H"aD"D6y>aUNG)eh}O:2;uFRDd`E8bqv}!9j" ["# ajc "^Abl'#"vn%u)+Ri|~cx׶^0v:+`e}y}Lu&Z<(?b(N%3 n+it{jq{_ =KO^ d: Г$egBi38 ~%>N0֪7ҐuQ2轤d{Q2- &hsf|k+[_IXnj3EfvW|cÕۣjH9iGz,bٸfcK]͆I ڒRw/>@8$AN)tDQ UnF!SXΕg $[r׹%NSy** 7|zHRCdRE>¼BdffU2U)6æ^ʬʷb Ngr/&,}a>*UT_Z5)#ATH`?SRg*Wΐ!B0&(۝`h(gQ](l Ϋ#L_dhbXY$L&˷4:QQ3~0ST1UʄT8c(D}kNB$5ӫdIYYu{ȴĭ{*3.~zcLyYۉl+#?W]у[K}%|E?#F$צo7"W.П&/h3fΛ 3F# /zxoU0l]MR+op zE2%< ئm;7ZPXq1Ɠ6Ŕ(TDt5z<n4"A`t_੟%nendstream endobj 27 0 obj 3156 endobj 29 0 obj << /Length 30 0 R /Filter /FlateDecode >> stream xUj1 }_s!$_B!{s~@BRh^̆aX#}Wh~q=Wz8zyl&'}`YeCfCc7(bF`P [G*T24Mag'/A+ޓ=xX2OmR \Yg!u mL+q_IId)wmb$)6$)JRڈj7mC[%-"+!ѤTIګe=Vxk*6i])0cKgEx6.EX0/:NJ*0/O3VY^ \> stream xYj1}7F3v!|IJmS(uK߯^i7:,PJM243g\H^= )eC l?5ϗJ^HȦx^jX(9ӑ5-~̐iq)ۃ?ɨoiqx?O؝ ݗr'o$du ABY'It~}Ů!lFJo'ٝEC#0$|=W:]\(u _~/!)teArĶ E~!p{VaFy Qx 5_e*nBML\ "[/ '٨I8T 0gO];o#V8]5RhٱU%hKN*pո:BwqWkp C;IbT)Ղ̆^8^_]D{:X ;ejk~cT`d F @YlmA&|7DHV N]؇ P Y]C Be:"fZje4oO<9h˽[;^8 7rnafkޢ9:?*%ɯ0s1[ĀZQcd(A QPػ|[HRCFk RrasH!oǂ[wMhHYG#">諉Y6B^#0Y S{fJaGƾy_ N&Yi Igjƈl'ɨW!Aҭu⠚k2Lk=NY 0qAg7qգKB8b7EM. ??a%9(IƩaMH&n<7pRy4po ,NoڿANM/Q( YƟsj`Rv<\TX'f#9Q_T.\NM.qؖfmeHiUUo?jh l1"xxi}qnxzۗlg_ zHMZqyX< L2Lݏ.tl;#ˎ8endstream endobj 33 0 obj 1056 endobj 34 0 obj << /Type /XObject /Subtype /Image /Width 397 /Height 325 /BitsPerComponent 8 /Length 35 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream x$I~XXͮF=f>iWڶH-iff ckd솶OVF #}XclFӘ /6}Xu郯֗""223U~7l۶~Ol۶џ۶)۶lcʶۘm{6l^)۶ncʶۘm{6l^)۶ncʶۘm{6l^)۶ncʶۘm{6l^)۶ncʶۘm{6l^)۶31osGl>S Y3>|tom1fͨ4lLNƔݚɘ[1:MJoϩF=~.mh!9 L9~ϱ1:M)|ooukW绌h<2DG}?96V0WOOyw?dl?OuѣGO?tVu邘b)/e:-AQutȱg≪9`x~Wj樮'|27|:\겘WA?(~X|{8 ,V^Ve>OqZje'e]f̎,kېz~Ϲ;XLnuzo߾ ~"wy'DiԐgX d|ٮ5Qx-TIl ̬bJ_xo/Һb=1ŋ2¯ _ H6SAl (oJu(XRz`}Ss9swĉ2O ua l"`hp8L$q /(" ,=BūMBl8XFɲ?iVL0Q;?1ө۠2̌oAUl)-y_?~Lc}ldv|\ S$R)W#b0)1/1P7lN- Sϴav4^/~ ،r5W6{g5r;3LⒶ8G 'b`51Mua*+M8Ыgj- SW?BU f~ء[`e :'Y9'EZ0ŠXx뭷0C&0up[S6sTf^GabNs?kL ` =Nq[r>/n;z]l8q* txg;0s"Lqr ;)~a~j S}Sf(# .ś}ltZJN/uS*ՐdtYLi:.|x!R)ğ ~Q'埵zq\Se1qƸ }z?٬H s)\ ̓3ybjxݏ)6BN˕TMӘZ.)|zO3Â̹N_]J Dyzi*wjLYQ3`kqerW/P&itXCx~fU-Қ򍗛*DCa15Tُ5:9gwQ5ztۘZ.k{"}Z4g"X6bҒX e1JU./mVY'lcj`ݏ)@;'D*zC>CƖmLNb1[JgӶU/>Aɬ VF5lO.v05PՏtW2WIcQ&|眽߁G5UQ}'ؘZdF7{Sq/ϟB6e7O_S+1EsxR?buXO]1BSd >'h%bi_S+1%`SRO_dXSSoWoY}/Y]A'l5=@eۯ'kFݛ1:Svk6V'cndL٭٘Z)5S1e-aٳgϟ?t+&1e`Ν;POw̽{ί2ּLQ)^Ǐ{!ÇKzr>}(d52caI!$P-~N\ʨ!L(ژEytLIAk(H<ɀi d|VD`aG,zz.yUeeL٭ytLBi_".T'3QD"bmJSDQ>n,S@W͊S()"+ 2b(!L!W;f 'e'϶I1٤xΘ:SƔݚit/ކcfSY2BbmAm/ʣc3QߏLʜSH/Tml!)^X vb&W9qy/,b~UeQ8vKٍ)5ey%SvknSޫiὦ.SvknS1efcju2lLNƔݚɘ[;ӝgEG/ҋ KU2sQ2<:eTڑn $G….!MRWdD"jOA-dib1P3r<Ɣm/ʓbJ(>$ȐQ) k,!UE4?L*^^IX1bU'%cn͓bJTIaȮh Ĺ)vi+ SBrX:.|++c(ΘEyfLQ:TpLi߅Cz7l{Sq:ʀñX% i!]R%2+cn3cSo0MU8UUTO}n"x'1NUj9CcʶMz;F7 Xy^XZ'48q|4W>6pBY*V2\L(Svkfɘ[1 %˘[1=Svk6V'cndL٭٘Z)5S>\Cƕ1eajOMƔݚ=GGO"j{:2zJ|(+cܙg'F!+S|(N=>QQ(uҋȘ[uM!$ 4wЃO?ga> ,L^Foݺ* >NMq >]i$X! m92<~SU+;*=)$< Cd R Gp"eU#.+cnͣc ;hI)ʐ b>b)*L GL*TlqqSvk?BnhRo ׸R$TYo<0b5H˹hL٭y\LePo+frIBT<}4Si>S^C92)5OћLKqFZ(a3(ta^YTOoj`*홦O2<ł;qRc%vKt ,o0s-Q\8#qSvkgytiwO],Svkm:uP+մ)eL٭yEe,ʘ[1:Svk6V'cndL٭yE3ԒSvk^Db)=o&0Q%:._G5c6ĝ;:Q*/(ydL٭y3Ži.( pj{SܸeFkjlɘ[fMm3,ɦ-$b2)5o&T#;2wU$_aa&"( 󒽝dL٭y3Ҿ;`H1R,cL>cʶěR8[ @* TDq,6cʶfMQ*&(>&NyEL]__ <*3l{No)TY^Gf_̉6̢N Y4)5;dL٭V'cn+,cQƔݚɘ[1:Svk6V'cn͓bjtskJsk&:eeL٭yLe FW.E^e$cnśOaj%*3#ș 22rUC5.>_C%L߱E}Fǔ4q'}]R 5́BT1TTٗŏR'*bJ;n*V "9shs%L/Zp\!)hhKDT5SmhT4C<OT9K M(™6?3ky0 q w{~/2Peev`r bOŘŪeLX Tb4SR w s 1gE٘Z6t3@X!LU;x/nPfPX"DT1%1eLY)hb SN*J?dCZf<5_ESS 1XmSi+8IMQ7d\ď0릲3A]f1u)_(/r޵Șj15n߾},DY)S믿nL]dL7|ɓ'L[o$A: fc~)2qԣGP?&"@%`aeG<Kf1e#cjEL!'vX\⫱㤞9ƒkʪbI'%X?~E0TNz)S/݊ eL)ͥIrj )߯68qldW;96lK/̞6*/ h*bPb:=v_VS;:_Ɣ5;ceNÔbH N3@:]i{=eiܭƔ56t3g99Zu~8ML b  ]-/XqHS 6o*N3D#1U8O)JA\&RgCp L cɘfж1{mdAPeO@UeYmu)J!,ULY[9)kmS֤2dL tfմ}4Ɣ5)S 2s%LWկ<}K_C6V-a >詵<7e-aߟʘTOśzmQƔ5Iupztu2yL-9˗/*$\z '8o2mL-$\yS.Z)znJg2&Q.4SPd"ұ/ISUcTZ'J@-cQZM^ĥuJ7`~ S]2mcjE~I֞Ǜ:S2mcj])_{p-S? kØZ]-(xSo޽[?S;Z~r)\Y7-<Y65jØJk75S] ) BR0NE䴡`8$ X~eØəq0z4lZ\9S jۘZWr)\o>裧` kxUVM= ќ$+)$"=4Lqƅ1n :*bޖ0?ſ蘊j?ޔ9( H+te:$%U^Gm3VޕNﱋ)boY)5/SKؕ#i-5Ӝ)5/S@Svk6V'cndL٭٘Z)5O+7蝯cV+ Ej)5_SՇkcV;s2<f֕,]{GUYzZ@!NR(ReL٭ytLq[#0);%ԝyLUժt1M\ՠU]U̓H 1e)hZdϏV~9raHЪf9Q˘[",H!8Q Lv8M]iЪ2Le BOQ(ȇ$M7YfϘSlA132b(rC8V@ͩn9d%m1~SW +4l{'+tէ)u{bԦŬ=Wn6N6s3"(Y MRf-z/Ywcʶ{6LqVaҙ1 9#k?Ne*1ULQS#14Vn1"-vcʶO)LIdϣj 7!g=XvBKgj^b,}Q)5O4N@el2B*y}"e⯜#TU QK uST[X}/i#K)1ūPގ94q8ljP1Q)>VfV[X}/JQ)5ϳY)t?VSvkS~@Tqf~2ǫ1efcju2lLNƔݚɘ[tЇGtiA9gʘ[t2)>a,RӋ/$>+$TljVTg5T5J'W]\/aLɞaЧ{O\2S%[q+w5 'ń%Ij8p^lzcʶOR T% b% /Y8)"ZNJ͎%B)4l4OoHFϮH6ST T[Xǒ <,#GU3ͮf*Vϑ1eniv1ecO-ň{\1ec*eL٭٘Z)5S1eeb͹4Svk,f7{E+eL٭q6dLv)0q0.qQ7q(\`'qAY[5N=}X;wX[ܪ&qOvh97%^mJ 7hLv1Eڤl[o`QjWM;@z޴EE)pWss2u8VmK2$N)<. K{ĺ6WC66vTˮZ)8+ y.EŠ|jL*L߸PƔݚ;Ewn@LuՖ KL)ޝq #^ƌ5f-S'FƔmSBSGdLUkch+_]; Q{SRr[ux1e=TTOxW1U[(1LJ~ts'M MJaƉxF 3 45M]-|T eNOvSr$\Db䅉0U餞 1z;=A1|N:e2DUÕXR'RB'Z7bW@Ukr R読ʴYjc\ƔݚYX=ʙ˘[60uUn|BdL٭yjJƔݚɘ[1:Svk6V'cndL٭٘Z)5ۯ}l~啯SvS>S@{f_ſ9=Ĕm6l^)۶ncʶۘm{6l^)۶ncʶۘm{6l^)۶ncʶۘm{6l^)۶ncʶۘm{6l^)۶ncʶۘm{&}۷,˲7x{W-# endstream endobj 35 0 obj 11824 endobj 37 0 obj << /Length 38 0 R /Filter /FlateDecode >> stream x]ێ}_@gްټHʳ D/;9p; ͮ꺜*ٟO˪Ʒo?>fpng*\{ѹqOwee.e??bxsxl_|⾞+_|W%sTqʗr||+|>#W{\ios@ESJPZSJ@l)z\h`KC?k:U#%恏݀| fȌ*XrytkqT蟫 \Bv KKƁ9[Oc+C!!̇ p>D?02]K$7"Fpe|Ƨ`*x{O*Fi ºAV0 rNgV931kLosT2tV OxLMI9zBVj;5l rPZxU2M8H\NvB٦f6l'P%XbH Ȑ#\Rr& GJM7B?L$0S2ޭOɈ}?>jʰ1sER*Cn>o`)='{BST JB0|4Nr`80eM^$Pt-EcRB4|Cth]Ihyc-'S\9 e.n%4J"JyEC D41M^HMJ'(0MҤ]UiPJJ-4~&Q[i-MU3ϐ B3=7Ƥ+شߜFI‘_Ȱ@=ڮ~ MgD!Jmo?l]oh v`Jq:S2yVB }6(V-6@v6-pіEW l^>=A %OXtxh/i/JEUc%GE4{Gf_ݢ7ݬ: Q1*[˅>afv """K $w6^~3ܫp3ovYCO_[簟7u|J{ݖ5Rl;yOuK15䴛BLп}7;UYbEpuo<*-PAF]UEY`LO& 8[_#`pg\6?p?_0omf?u}*h3[sx[yKCt5Q$Nfd*h%M`*P*=URựE:똷 oٷW_O׊y?}d})}MUlg o:Vt'񛫻ao$~ `%~kWҹMӿx-5yrW$\I]^$9\7*v|"5? endstream endobj 38 0 obj 3489 endobj 40 0 obj << /Length 41 0 R /Filter /FlateDecode >> stream xVj1 }s%!n.ڦPB߯fNKXٖtc+]iu=}y0H-x{J5߉yrtZ-k% ʐ-bl9%ˑ{`ɢed)n`SS=CleŊ+h ]\ Cj3P,)lžʽи}h3;{$ )EK;QS.:g?Ku(l@k7qȡ4-G9 av:u$!d˦ ͦczaX!pgMZk.!iLۥB!\1=Z~ӾΖVAt[ :(0b27ӾL :UXϏ =YD!>ɭmK ))NynW~qi[ڑПZ:7XR].ٹ{unendstream endobj 41 0 obj 596 endobj 43 0 obj << /Length 44 0 R /Filter /FlateDecode >> stream xUj1 }_sSIB>]I 4%e7= αFG:>^g@A9==/w]VϿfwn#&orC`NC8Tl+>4y%;DhzgZ7endstream endobj 44 0 obj 508 endobj 46 0 obj << /Length 47 0 R /Filter /FlateDecode >> stream x[]o6 }Ӈm@1&s:`X/s-9iPhYH<\'MhNzVT\zk{dzyzҙfV3LSX}10 l5q`$Xztfb֧uy4KGAf;aQEsoih_= ~&ah}48򉛴w$MzsYn<-̓TMk2ػ8+K^ 8e<%W i5{^J`5Kv0ƁmQ8ZEr&hyfFuq%okp^4>; E]!fA>ov E HLKؐXQ6zęYW/'K@/E$ \XˆhFW$hGHi|+ck؇70:*/̢ l1EFx/ v<)랡Y+ m!%#| u&hI]lۖ}[,΃k= n,Oj?qKR6cP+~Xx^X *uB%xtĝ;(Xc 1=:[(TCy'pn!n5vyr$ܖK)L^(,ezIRB|äu,a_lels\BۯfIM哆nFI (\AŰtFb/CuL2"j!#C"Y Y$\n #)aeIDsQULN\2sOJx})c b-@=8@HrH.) 1-^@UE P6+" #"souo/hfBm'/ 2=eWSqKwf߃gE*'5JOD5`C8XB#?*."+dJuQQk[YVn=ɨ$ BSB\zHy~@sͤByg\@Uݗ#n)m)TŢX m-b[.ޫ9 ,iP8E=XcyЃX&wwÐQ0=r{!KXHs-4 `x5SP]^g'[\'Uٌv{\6AgU³BHMI <(^>Ҧ(>%w3tchkl0O1;  TqK0c܌+e~骦_&qCQ/4~R1J\:U o9뺳5)CAJl"E(0^t5F*XwMs%]|oa DոoD(7@rZu{P%A#i]7H?#%4Ȧ Ȩc!А`haj@hw"@$>(  L: w=`,z?BC=RV4oGH654ۻe38WyVk \ni&NQ;΃k..H|0b3'_ IMzSaf.-v8Q놨A&"z1{bRcv $kȍ=UrZc/NbaWe,&̆"Шݧߛ۷#Ph 7¸vih\mˆ3]\Xn˓Ҧǯʟ`ϖ>[nzwn;(K]Hwe&%"2D%s=` LxMM4ĝA;98LKy5A"9 cT] /i.4D u_Jb"k5)I#;kendstream endobj 47 0 obj 1989 endobj 49 0 obj << /Length 50 0 R /Filter /FlateDecode >> stream xXj@}79PegV{;i )yweyWF.!Ęhn̮zYJ!;JYH&WlVևS($jlx5z!)RiuxT7|Q~W1Q9vm%~p{l@ӴI q1ABwssdA,N9es^.Yn!f2d _† NXcA{s 1wcRD~Բ2ϳ眫)@[,m6scK/?**Ff$VdJD,Gu)Hң(m@%i,/D IBN6 `-(네XrL((l}Yb&`WvǰoG [ ! /xJ2 wYžB̈́h*t0qtK8zMy'DȀ=ch2l,)) qe.`+ld#6!*-@0=/9O3B&v9֋zAmLK#v~dMh*ͨwo -@%-U 9#Z0Tia:gČqbp+$'xX,q3a d"Xzv^v*EuٍԹ pm|@XXz k֧E&\ l%o.t I-=W~yU/eԓc;}ʳxojk+dgs[> stream xQ5z7`##[9s"Iv,O سoxE(7Lhqa?y.b#r1˜3Ag}aNAEn;Yw]]]]Ww^˦v??B!B!槟^/ B!B_;w?!B!­wBB!B%B!B!Bd!B!^A B!Bx!DB!BB!B!Bd!B!^A B!Bx!DB!BB!B!Bd!B!^A B!Bx!DB!BB!B!Bd!B!^A B!Bx!DB!BB!B!Bd!B!^A B!Bx!DB!BB!B!Bd!B!^A B!Bx!DB!BB!B!Bd!B!^A B!Bx!DB!BB!B!Bd!B!^A B!Bx!DVGg/ B!\)A 4?3?Cw !B`"@+  ~bw8C!^,%s{U?b_xOa=*B/cr. K@ b5`ַe/߳?B!E ?lrE#v ʯDf)GEű\Y;\AJ%|FB!<. ƕA&#oiwgʯ&ǽnez @A Bȵ 8 2)xH9Vv]d!  @![A~P( r5OƤ2HukMgYYPYĸ^A6d!3r2_+oX n1Oh_!n~i~d R%9I}+[EK&L!u]YEKrUk{ov۵a3?/|ɇ~8V1Vjm|Wtg  @!kA~7ܢFESn⺄Թf+Z$E)sI̴9+*JP^tt*)te]&?Wۥ=r6p6Ng\_|k!`jK? d B!\ bpז.,)D_G{R +_k404R ĿBWq3_''okXAno\t7{O,K$I_g29q駟_k*:W_}%xP ~G7 ȟ}]%eJ֎|Rű+ZWfF2HԳVSB!\ ҋD #:AƏv[IL$Knw-ND+1YC%o0 ru1%&{v((yDKW45.pQAq >?#~l|WfO>Jٮgl AKN,l${@ʍVBׂ>B5@B!<#(h,}6H~D/7AЈ9lOI˳b)"<;t]qR\Y({O;. &$2~MŠGI 1ldSN d=3RQ|^OEa, ĹHY Wd!3r2)k[Kdu8P)$eʯjdҩef)HCkDƘdڲxΙe7ua+ 1\0y:rhMdc>0 4JVJ򁱃~G$qA7~ғ ~RZVAʃ\+oESs+#ގ-3,Wc @!ADM{7 E[JS{uce_k^2j,H],&E0dv ͠b {3>3ܝLl2nJ@m| K"|aaEP*,15u?F<-"HFRѬGtߋf`uݎҴۿN2BIi7四dDwd_(<)Ʒ&Rä2ȱm'R(a{iiZ-d7dl[]?kZH X QdX 'Ew$eBK'n=,$$M<&x&K9{/: !BxFnLjYv%/پbrn Ҿb̰JedӯFIabaZh˿7`1lk<#A-]*e?-aj&WF~8Lf٘YČb+&~;v s cwŊ˹K8u z3h4'7=DzܸFӁ !BxFnI)RA6}o+eo:H9ec&ORKʞ9Nyπz}@!d/ǤO?TƍSr;3IڹSW,2LrϙQdHH:]qu2_ D\8@B!<#$O)@q< 7_گDONTjQWAT^&;mJH,̤{.  qY q&0 bXXK' )A$htN F$ml0A Bȍ ~佰SI;M߸/OQLA9, WhgU5їH=꺾i,2I=[Eo , K;hi{G]IJYrD"XdYC zn-h 2D'd!3rQ2ld$B,d^m$Y;㹿?=d2#/~s.UKA~Jͳ2UJrtɲ|9{0*_B;]DYAJڻL7g{8z/;d!3rQ2pDYfA._ʸ"@! Jb\/ s?5IF2B !$  @! Jb\/ 2B !$  @! JqSqdB!DVҌ 7{k܆>(B!DVҌ552 !BxF"@+ tַm`X>B!L"@+ Tz OO !Bx."@+ T &(^ B!"2K2 !BxF"@+q l B!g$2eݻw#ډ#v,d@B!<#A lׯhnHԮJrvS#` l B!g$2mJ2ȸZ, Q !BxF"@+www=,( o߾NT;14?]߼ycalǟt&eG#?v/Y5~O1~GdgJjV챑]}|,B!DV215_a& A]ِr"cZC<`O"D9’GJU{;^Xì]]͛7daZWe`4ł-Q @! J&DMlX20ݞ8fW y(: ɺ/AJ&.X/)2]Ƚ'fɞ݄H.Ԗ9@B!A E.@:Fg}mM\Мd 'AT[y_cGy U^;-0aIPJkMPã_qO:]Uu;~;5{¬FTn B! 2c ^v4~${2OR^&EI$,ACNLºOel)EPj؄l,ϭ܎;y!t7DB!A ג)eM-*{m;%9x}D֧<(ҕlA)Lp+8f`KZs(<ˆٰ1 E"|MI10Lհq'MS` B!g$2mDʀ٧2HrvC\gRL`=Dfe0ݦku8'3%R/vGr]8]z eN)31W-3VP B!&2?rԢt-y"jVd7o\__'JeE§ .iLrNsXt7edG\#B!DVrE۰VB^ m;_% [D6۷q/8tD#ԥr(c5">ErvvQ\F& A, !B "@+=W9;_% 0w<#9&t|Ѯp{wfտ"i2{;r![5du2GB!DVr{21XaB٧8!@! S_{}l3xz@ %D@"ci2ȟ=wR3zEt=! kh!{@3<@7o$GveVٍX o/u )"gcSA&%2Ҁ r@و k8 '|KH=&I%lDgM2/@-֛F`U#r'I.dWQʑZ1 k4 n[7^ Xkso?%NJ&DD$g|jd/xGL{I_@Ga]2%$r;QfA2]АqYsct]P,2 k%)/UѬ% ^rQ릐Qd&w~ 1}K/*d?TtV$^ B'"22g}ᇟ~i*vпjY6-x#xnqӿY , /8KST%&2씅` DsO2q8TDdRy,f[el/'20?슐}d#wwD]9 .dKPM>TqRLez*,G)F^&Ǐ;hײ8C{[/u}0_ѳ!DqZ|p<`7x/ɰa?r`Ndf̋!2O.REy}yO:F6+Qnm\el/ps+fo!FzGCVۓA%\RYRPr`;O';l5prC1\^ @lD519ɶ qI$UDǽA$XXgYP^AQJVY1ru5I& @L @lD54?րfXsq2iYA3Vʫn7 o[] DJѻ|A&]D( 6ʾ4Y7К$_kX ~7:1QC!lЬ6oq@3H8"~D1Rq4ֺC;Am2.:\ #XW}M!dXkai2ȟ%#|{FKotbzB&2#†[cm-*< s6׾`o X9 1,{x o߾*hX wܥ~kWٟ;́NLTBD5DƕA&YrHȋ@m}K6Ha %ݩlM.X/4Yd6", d! *d!: ȨO&h؉+]7,qY;ԏ=CKzp0b1ްƔ'ݬ d2FdXCda2b 2 oL r@و k1 gAsUju@ d2FdXCߍd8 rwwYd @L @lD5<Ū,z|| -77ـ Ge̵qI1` 4cw!RJ*c4do;%{;5,d! XU[]dl\ 7 hEM];A6A;Q/=Ɯoe t0:ZYdo @D5D J!2 \ Oe. L6ߘ 2. mJ[[j͸7o iko-pww@;uz9ӓt?Eu.ZYgh̼]/Y!'haOͷ">)A+Z;h%iG Y-ΒeG/dv^z]{f#YnCU;ѫ8]"nR:AݚNM脛\ϚkITJioljC(n=Xdj)_|z(MHz]zf_XSQfnkߎv츥<+(vN(k.D--T_w֤!MdXöUcc7 '4хp9vNрAc JPP| w\j㥘[WW 1>z< J6}hJɒkY)dKRu83~bܾ\6#3\ZnAɪ=x. 3 n2@%p,_vk"{B|*7K6C(vJB ctAfl2HWOTf_zX>6SrQA ~]h1ٰᴾstO-kI>60< 7 v~0Vk[F\k(X6ܕEĝ^OooW⵲9]zʦ=U Sc2HWh.-cRolj]BP3/}̃dÉ=C~ FwSj8`H.Axw7Mц"jA pF"ꃊ;GaFa 58ow-h83ʓg[A(9):9 ɰ FAzKm}ύԞu. A2( A|Ukz *C/d/lO13DoR\]elX խ5Wu$Aolj]Bp }̃dO?كc NA}VN/A?Qd֎ŏ.Lᘁlg`A*H= @D5L*}ёΚls$'b}^f_wպ"Iy9⍞$P gDZO 15~z2d̼KȿǂrC;r]&d3( A^.\85xJ%+mՕɶ+Zy wJוG}d`F'v@*`2H[kwl;Lz ACi ‰9Z4]t%(M2v#ퟸOX!ؑ]=]Q ?eE0kjT^H;!3|RprrCY|<'$?q(Ԕvu`2H20 NK?,rӵ({ΫJRmkT'ssBz뺋DŻd4b]bS,2HQ#Ot]Vnp5l5?.4ZsxF{ 2H\h"^ZC(A 3`6$krk4l=*%&"C[9tzOA$YHFi|g5 B8#A` /w)A;h`dd}\'.p{ m]Q̘EQ6 c!ϼ{'1 ƒA޽Y]qn'Z.|rYlQE(8+0@'Flb]Vq}b "ϓ2jrD]“b2H[H$}o׬%*7KWjRAo.^|bvaS_MKU/qby_b5 v8WE{|_UYdoA pQD5̮%ӳS9,$[n0lwaJF03L|>mtQG7q nӓAkA y$w,@ڰMVb>Zc2pT6Ssl_{369ea؋oYêlo/ !7a=7tq_de`\DYmt$ǰAO 4]^Îmt\qڽ M ig^I;;kA e XLAو k1DT߆:r(|S ?bNj$ s棫i !nDh A=_@oXnklPIgUd}]Adew8w~dc2FdXÍ ` ̃2(" r@و k1 gAS3,{)@e \&A p6"bn e8dYz)@e \&A p6"fvJmVcdl6\#zyʘKXwR ˗AV?6|=l2nXd d! mj'j^/"sef!؀ ;9#__Bs@/n]{? bdxln25jE] B8A` Glq'd얀 ,_zI1T !pA` Vus-OT 7614?[:]sg'7#g;E_젧#ǏVS6qELV=H># WWWիW}5e5o۵gk6rmA4w{]_f/M߳ՎdxЯՄMl{ulOKlX 2goWݞ-Y]P? bEjUMn5*h5A7 c kmSrSak'2D5,L'O͓4FV:hY# A;Kka4N׀Gj(e`Ya\ D%.)of$ED}6޽{'vEn_. -(e Bo=J*~ *K?;_8ɪ]1Fw((2Mg}j{Ya&Sa2Vp R|VO4BN,~?~9]$P~DU:xN%D]:.A&ۯ^+ٍ A\2&"iRL ԣ\PbEkd2)B"Au51<+Ry ?Q # k9~"A|C"g(u. A"{~5#JQsdV;L<,ZDM䂢U$V4EIا&I=ȧ%|FR#͑ q2,DIŻx,A{˾ZgeˑAb5Dfd i$M|N @! Q06AFV9GheAqmhʞR2Tis djhr(D^ .> ]"{7tХ;Qpp=!&z+$$_1gK+ŎIe .XO+3`G9L #vsQ=|\d3=BdM5W2LaUW-+]Hsj 2e.[@و k|)d0 ۀd7 2.Yd @lD5ܰUu@Y/6)XS_ش]wn6/YGI6Qdf`#X>o0nNA&gŖUV*O a(BLp-6<Ӳ~lju8Ѩo{^^ l2H}y=fWtI|l]R<$]A p6"&V>^9^'&|eWc . ]͠9 S~m0S id+_݈*(; ͋+ё ϬG o̶I.?;N A|CrM-I6H6c J)Cz*`6DAC*DbAK 7{VU0 f ?ZG55/= Arh^ZrQKtK&&;|m-,’p9NօȪG;+] LjJbSg3V/!# wV`&+jD: 2"jR6 ]A p6"}}=xTb=`Q[o6/}7lR X2H>xuwDsblA*ELgܖA|Nz˗A],o9GqㄩfSKzQSٌ a¬n!>J]9w[џ K&s[񀧐TY6 !ְwJ gS0↹1s:{}Wd >1e=qi=@Da# `2p;֓ul/{3(0 "4k:ɅBg#2ovAFV. [C¸2DЮm̙b 6H b挕[˹=hoW1S v/w4fm%l>{{xыes+o ?RS d! ٿZQV;#V!XgÅb75kNůf!nDFn&$>!QT\7 ,ּ=LcK{v кdUm @lD5Sc2b 2 |js{շ X 2FdXCߍd8 "W R)0qddP2eBg#2!ƀ ^QuT.իd{3A@ d! YftlIpI1`Ty~~. 33Myѯ@ $X_@و kxUusss8WWt`pw1Kn JeA€Szl&2Hd ,Z A p6"hU }dؘ 2adUd3z82FdX禶׼q-#`GtQk<"amִ# tĸfy]OoM.R_)+YqCbD bY===yV6Xbj~: b.[=boZ*do<{e7W6XG9Y$vk~Ы{>NR]kݻwl2j85]&62FdXöUe .lᆭ(,64=k'#,5W6Jђ%̶E!-G\vPd5Qn>VK6)`V6X6ۃ߯r8? m$XҼjq?eRl*g<9Q`fAT۪x鄽/0D\alD+ϒe}s%9fd! U`-)$_E_kDφSݣ+ ðgWZHp9EjvnplՑnٌշnr sބb,7׮_cjN|ӹ a"G9XMP?o}ƕf Pl2HTʴr}loʷ^C Ka%Dr vd! U>hA|tl0Շ˘7.o)]k ]͠;xe`Aj]lNT&{uPa?3oX#,B(<w j,\qS>r+eQl6$[Iծ2HB1ڍ~m^I?#Z8KBg#2aC} ڌx;x JYPY!<>>v%GPvп1-c fp#3 RbQG&: -KD=wEZk=NWׂ؅yrY j,_ *] r"2d >$>λeu)r D{;!bFو kضB> D޵iW4'jH&J6k.c m͡wa헣U߂uS]P GըAݽt}Q)\U`2HӡYeyEGZ{qOӹ(l6DS-ԗ6jriW2RAbsrWqŔCL>m$+6/[f\@و kXwKV{THC$B7--$5D joK.|F\~+Y)0`ə1 m] ƫ+3BWCq &d8eT捵6 r9s,_yEӄگ{hx! fΝb[r'd])[7$oYyE `Bg#2aa^$IN#do';:&{z̃7m%O}{j}{b2H׊Q'1gcb f r+^&X "t5xRS _tzt)>6aU{7쥗ӺA p6"Vy,4'"ArqƮ&81Vk2D~VðArwYƩmЊY_ "Z.L;S+2*Pckeh!@و k8kjCW9N +`2{F4o=Qx^ bFO˛H IHaK?*'/سUlF:[촀$[}Zr/ !pfLU 2H%޽\L `" \&A p6"bn Ť2 onnn:}jm r@و k1 S ^ ˹l d2FdX}G$$x||Ќ9Y9~=NXrSzR  deR @lD5<ŪtV[Š777ҘgΙe(ZY'hԷޤl -y[d `2HoT$ޗдA p6""8eۅz N9 T}ܖ A KdXöU4ioixn:{;s=7ҴȞRI ]TrQ6ɖ1Z!ɪ Qu0FPn^n! 34䳀߅.OUJ zQ%K,fFU]fTW7l-d"+JvpO ˗Aw_2oߺ#dSPd[;.k:!rA>"xo_.Fq`p֋ !ְmU2’ı>)-{4g)tQ^LPrAw%ͼ. +YBOH#GrRLgߘIEI(bćcY FWcy U ٤/2Ȱڟ Ϛ]B{b6W} zsX' G y)>!۝N\l2H[.{#4# "ʯήDr1r6|֋ !ְ0B}0ӶhvLQAWVg\IT̏xɗ$D񚁟NrbRdxO,5}ۊY>)Fk4{ ]M dNa2Gp铪AwRuKw|`8n?r6*4?QyRBtʼnm#I΍. Aܣ栩*w-$۝Wl2H[;?,Gh*F]}UqRL "{^䌭Bg#2a %z_49OCSݼ q0KB6An^ {.%ī7HhoG (2DY>`d]i+'fَE$;=Mn|ބZ&Յa2Hb r&H^SMGRU;Koa=2(ķi9+Rs{dT/%eK `˗AڏvCtt ]otk0 u\Bg#2abUWFsiht:O2rne_fyޕx.M$夝y5-vk",ִ]X#Z`կ*VE2fřvJUwsݮhvk!T ]םdd"N 91\dw|$M'.sj ~1l>qBE,f*f X ,Q1vFW*lWe'k+,|a ]i:F/$omh|+|֋ !06ȾOtRH5K5&&VXaUe/v͘bK%V_kpfpi i ~of[(2H|SDžK̏ B)yƇu`NDh?#uk&{{]zA p6"h˟c֟p(z 6c%ƕAօlϳ(6{K+3 W-5`(oѵsȘAA0 ȯ\5A p6"nue$lM!Z>I8}+X gK~Ey0W\FpP K ӻ-* 7fH  0 B8A` 7`A62XA@ d! XU2zId^:G r@و k: ^lRiֿfQ@e \&A p6"VZUfdژbl{~au2Ȗ;[A. dKi" @lD5֖dJ{? A51[CV*ܔY׶ 2H 7 d! 0lgXdJKY˸ Je|T,F|ql A KdXî7[-8;ZjθN-v{m$[yڹNGX2@܀Iqbkk7HS G;=ixE6$gMXlNsR;iٚ; vmx} }:E3\&ݫ~kef]A{"SDmXd=;v^{'O89eXS~k$~-V;q-`wA ii@foB* \FAkпAc 2F$VPn\Ck+y٤]mcaI1}{VBsH6Z[*etg -lCq 4[AWiĢ6Xϑ?I/oYօdG% VD6yص^gV7MjWGو kXUPG 0j';A2kTbDN_"Tm Լ*kd?XC2ɧ>-+Al-ikrqNoWQ5/I"^[ݲAmt>sP)^LV߂>Ve&L S Kg{҈ϔ?^ѴG޵#fAW̶߶eخIo&Ŕd;[en @lD5l ᙵ-lLׯ'vPCa2kTb"$~UtXr-Aߝ%Tz$)Z?Pv܀ jB(Xj&eOWS!: 5"֗#7I1@>I Og)sXېATWd5p7B֍0kD7a>又dGBB)NAT\U ' iuG-ngʜ B8A` VU4.u[ !Pn|YTW}v4aAj0 Ҷ1}᩶s*icG]eR @lD5۰Q)v ';hn9S zHu<&A|;l) r{ĝ%2.$Z_4Ae'sk~Zdq}$Sz&1 haU^g, B8A` ۿx7CW9ll519XO6Ucp&&q7='iυ0^ǶSfz' A=v:+9hR-poFZdZR&l{j~WFj̫˔Ax4 YXkɶu}ZA p6".=r0Le  d! XU2zFDۈ,5>  r@و k4 db2Hӱ.*(լhq,A@ d! )T16k$NBi6=FBRD $#2 !ְҪnD`RUna=6^G-: l+A͠+EyS 2eBg#2aU;e/ ð pT9y.s'J \&A p6"9f@X4;5[^&b OOO7.# +<ⶤq;ԸH:3Eܹ3NGZV;YrX 2sZnT7t֮v]ݻwbğևwsb"0?g>_:{!@dXöUeRf%铟>Jܰ#hfX2UkWBŔԾβ~U3V#WyY@`='JKXaTGt˗A1)-k?1 K$WX+3e՘+ziſtz:0W;!"&V Ae&^>1ؿ`c!/ Sc .SiβȀ_ohՄEV+Y%9օ =iKx{Uf:ʼn+{nW]KpdXLr9jRLAHA'V,yru/}|l@!ְ0)=F\9=O[Qd2Hth"U<*e4LїdZ{AYUz`]T >Itk҄D{V&WQػ+WXWefP? Ȇw-lr)d!pR"*Q~MWde ﹫X2Hz 2]zGs&6Ha[ԏK7ۧ Ӛ01ArDh4%XRl$WQp|d@? ]562B8)A` !4Vލ*T#îR`0ɚYMMZl0E֔$2H\{ʴi oj寘ZG|"V/,\Atz$vl BD5l[U&Nrwѯ w|12`t%d'GH9h"ˍ$|f'L޴ YɊAe +eMΈiA ‰ kq<nupanwz'&RYkxv| ~1)&nTA,h$p=W_/aE= BD5YX4KPOe%y^:Zxc9X@B'%2a۪N>k#[EY&ѲR#,4@ \4HX#vUe+,S]WfQ X2WQ_jCR.Ѽc^S_c*lg!{K ؍(j+kyټ V:2JX 7R{rD{%%10b/W]2nQN BD5l[U5Z_?[3K"~&5)N]laQdX ~էaW!d@{4/[5u&/]jQlgÒ_It. A쾬g sU,IFGb׻:eưCgŃ!T[VεL W]pȤNOVs䤘 Kgey}4ݏ|ҕ͹z 2B8)A` VUu7 m(?tvcWxVWEi[= ylUVK'omĎD#tUzd}Nna@!Oa2KJӬ"US]a?K'qU]}lrnx=eiu:QХ*Miw[.4/{xb; 2b/ ʼUzη2B8)A` J6HVCrܫ8 d8x>]`/ԫ2 OIտ)geSl3 ki` ۶=Z$/$evXwkiII3m,v5/\n!X Z[ja6ǙY&ii=t=9'!@!0kFw(ǥ?\3)DKG_ Dergo# д55)']XFTcjjƱ2zi3X$%G扗jc?N^4\)<֒G4}G)0AN$2QO3TUezl |ʒ9zSB! m׷q/w?;՝-PO#$ZKėHyvMb,$V\*H("Hrѯnf1MͮlwAR[#2H\c:ȧ fbJImSSEyBpy=|QR2HsL/H,c{9܄A I kصb6+)0sjdqܦVC}!ˀjI1~/fj70t$ ,v#O|FOE/ BD5\UeC벲+@ GU\=W % #2B8)A` V9Q|jC;bmx,AaOG=גl׺qfw{s۰D?]-ʘf*5؎^(X10TX츶g2Hl'48U F-TRMX>=3~,YO,aƅv.` R.P΀WQbQc2Hv.Xk~ ;z=Y1bX'mB! YJ#X6f+6o6|_uPX5S|k&#KCO{h0ou9eS3#K΃d+UDO} v{qWR fW/ xi:]FRPB//qom6Ld+Wl dմRAr2HҶEYcǞ$kc}K6A I kXUO_)lO`}`n6{֍٬;"d Sfi6J1 "WN DZ^_̛};QXqI(xa5o+l;t'~P,9LUe{!"oOI kN?h~2QB癉eWF ]@һw]2' g᥿ @!0_omG>N6lx»=NA厒[6J1 T d(E֗92HW2 "wjq ā?- AbEeR_wS9ĥ XN)KETr9Ь5gm]X de~ dl2F=, BD5,؀͎$#d`7 (2^;o]V)d_ A /Y$ۢfA}#{}_3ҭxlKѡ zruGRB·YHrͲtd5GG/ (d a碩*:^ }jd Pݥl BD5. aV?]M>Xi ,~ ;]VQ3E쒑j,]rۉ/; ]-X=*ee./?҄cߵOdyuf o[N+ؽR/ g!4 $Ȏcsօ M#A~ .JX4A I k]jN' 9~W a]+19=?A}ϑSLjx˥KKuѲ+X2HlqMª/±b;q?VrE·hek($WYf7v> QYDD/kUx]vm @!0SjV Mb/Y7 r sb)<㍶>yu 욌>6ڛ>&WIvb0+_T6ݮ_ c1ans#0Cj !NJdX.wx7 Kխm~=NVՔ…s>(SvͲ`<)E͛7퉻r{.(,z:dXR @!pofOa,Vbc2 mvc_a2f4{As oCp>ű$c :{Pc\Hҷ1)d9 e@B'%2b_0 A. d(O`28A?mYBEdXCߍdW!nF2(c2?o}gYhV!g'2!ƀ ^ 2(c2`f?3jBNdXN  Uz\  e=*cnfс 2~ XxDhGfvq ^ lAzB/ `: @7 YU2ȸ@Y/A6KAk 2~ ض޼ysuue#[?҅v̛Kڿwwwo;Y+:>??vA0~ǬO?Gß?[vg^ b%zi{u:jl=.${󟞞bX'ƗBygK3lW׊J#]YΥ ! :&X@Vva2|; bu=PTFO*=bMjn9:+==TwAe,׵lB A]{ae QeO6N^ vAA$h }ev/ۖA⋯ܹ B 2cĝ61C8%lzv1GdQAGƭ/~'|b_ |G%>a/Sy @7 D5CƢl8q}$cQ/ 2N5{ߞ[7r-1ژIX4LŠa;h!k5)]NDAMAH;I|$*^852Hymf 6·D݅V Q&nԜ@.t|rx|_@ O>A dX.$Zђj+8>U1}D#g-$+J ,S *$0,ff6,wWaOO ZFYG(uznqY ҼlFSVշWZ2H|) z{ 6?f*jޕ&q`) 2_'|_|ׯ' ۑ>H{WY~LJ~h%e_cgٹY#{`Bε#PNꖾN,?b%k=_(f~t @7 o)../Б~Ѵn+4q>PdE\2H= bv MBM=,uX/(/fr4C[";P肀MI2ph1sd~𭼨 F/ ^C}M?ՐSC5$oZ^~gii~28""V @`(f#/xO>%(&aGhtJdQŏAaܻ8rK sV(Ab~ƊaENAOC"A A"/+@HիW1 ?AgN1 +p A%aa 8_Ӆi "Q28yCy%#`3n9 )VA`Ma7 ln ?5BOAtX.vWd`\/;L<3]VICZ[Rd7#"[jbeK9Q`R/P\+;/Pv}2IeEAwP ZF;/ $(~ "pD DVpHiu̅T# B vKÍ׌'bڰBAmpX*"k<]ԙG^}l%dp Hn^A^~2 FdQŏAa<DhAbDhA! ^spx7o|1x [GpE@q!DEdq5Z$4E 9K2Pd#' q9|x 0iAA|,4_!n`=V.#lVA>sVk sSHEQ(Dͪ2$4E  BA ;| _iUfs,M{ 5D-2>G@f9.$(~ "Գyc!$4E  cX.OOO׋9::7 "L (%8/H\ l<*AdsdQ`o#\L9ʯ(4X`P jn "L (%8ix粐 MQ2ȹA2(Q9 AfdQŏAaLgUXY ֣Dvk6ßV¬ V~s؟wZGpWWWA7771CyĴ}r,f[iX*tߙbw-gS@2HSl_As"d> 6x[ONxw_9z_Xvٟ֏4mK 2#$(~ "c:G6r|9@mhp4M-FPl|iNFlֆ80>-cc1AbmN̞Fk0v0?}8$4eeEQ8 ЮO<mqo>'}㑯 }50:L7}_`bF|y%S2d!DEdq2?}3`ƢCP)jh0ca6%)?AX4~;CMK ?ş\$Js\x6=3Qh)-scn+ޞVUw 뱴ݳk@6S A(# {a^񸷀:.?ؽ g<xswQWB}8Š@ A)!DEdq2@⫟?)1F]G2HG 64Ū2HDm r SԤ 4N37p$P#sꞼP4.d#2Z{ @2H96HX&ge߽}4ar؄sF2Hx.M@(&C' ^7k =ˏ_{A0@O-kG3Ao}[) (%ØA0^B33 7cfamȱܻwʜ~+|$m)Cueq i~-3zd.Sh + &2H*8)MCOh_OB>罏ǽl-=p }=az0}_qi[ , (%XpL<+όN `ŁH? A0UtV,u "b?'ڗApAO{К}~%U}qzKR[g ;>‰ "Q28 >3W )V  I*MCv [V lC|a,kZAX FK"dIz0CX/ KFST͑`VaegѾ > axc'T_دucJbwWb:yۿv-G };~^xxbLjj,x& ~"}kvHEQ(DƬ ApN6|F78&D )Nm7) # N~R]./=]"LJtAPT2 erߣrzYIQxzYϤh@ԻY\2(G 0feob᮷渢,LE:|Y^$<7NWiY=Z2HS c(ʯnp  O&Umv.7xD0$`pೣq$$gB[+xAS.*Q/C>PD9dx&<ނ1LrEQlA!.#E t .; Qz aNO' ]W2HS D_01Vzzt ޴X2AHosmTd>=`HjΎe0zx A h}(IHdDuGd @$2Xѫ? Lp `$(.A!(`ԁ)lp,'5!r!fQYAo/H9`TR9/A2cE_#]1>lڗAOB>[o{TY [-`aL퀃q׌3Ax^EnI߫AP_$;.I (MQ28.dX!6rh4Dmde2ը逰qx|6\aeKAbȶp~DW!DADQ?JqR$5lΡϸdXg\AaGom\XZ, ։Y,z -\f1{ղ遷 #ºPwsXIHdQŏAaTC2HS# D;qV BA DEdq% Adhęe,Hʐ "L (%(de A "!DADQ?JQA2HS rn 2ʡU3PF٦>Dq "Q28U AdsdQwu!ѲsA&l=K۰/5"\,Eɑ "Q28U AdsdQ0\YM9iGy ",JIΐKK7ct]d~%e}"Hiyg',;nmb2v42F:2=e\/h_rk>ZLKC`i'{ l;`fnlZI:4. 9uA*lA13dzXEx >L?-Y܆oo bOe¦ZIKo " Jm85 6Y 6|C"Xy*zC1'iIyzz~ r+IdK3(ݷѸ :Fv x (n0I?4 !+FLؑe:8gGހb*W 42aywiX-1Q~n[3{?)D "V`&6奟~79O* +ə`aSlT A"`3Eq$kd';({d{ N1e#Bͽ avUM2@N1y ϕkf |ϾKjaU>|[Dl?яo(H Xd+ ~f'P!'g %mZ=[e;|eXiFD Bz c tN Z|$x#!c'۰K2 wQId!d~Ah_~kQudxߊQt "V2H4~_in N` fg}-l 4(F!?NAO^k((2IT @[xtZ}X`( Lɴb9 " :)~5D_(A2>֑Al$L??_ޑJ b6"lz'2A,']t#TAѾ -*x0e{ gOZaJP,| A|-x ;\Kh 7Bcu wՈL۪*Q8],\_m~e rz{/ D\ /w:_HA ZAKAӯjbb'漬6@*D%l$L/}/ ؙglä87d :A*ģul^4eAhsT#qHG KdI)D AYV̻Mh)b,R2-.3a'>XN$f ppHCrl:d Su$̎sk9 8$dC2Ȥ "V`soooD}dZt'I%ЅJ,^aLxФ%-_/V[Xj}}6 #^" &\sk9 8$dC2Ȥ "V`DhA2$ӡQ͹ o߾}ܭ8AQ2!dRJ+|dL D(C20ԔA>C7ꫯ?^~W^|u?%V۷oh "A R2X#d thsTSMy˗/g?٫WiZr8%4A5R2!dRJ+P2ȹaY2Í.AA`%?Ǯ÷99H>O?W_}s7oްX &ȴ^|I ˷hèҶVU3meVjZ XރLK[Br`[b[1;jѥ (d.HA rnh_A|] ~A xzzS\vuu2&XjB2M_z ˗/m; o߾=%,VƬ %l,"2e+A,-I ;B3d-AK~عX͟9> "AA$LJ bJ97/Ŏkb deLd*Qp;O:F0N1 aV dRXJk \ =(؊dT+Ò0)F8YVY33tQr,`[24sA Q ?+h9ȴ|#GYÇA?gaZ;crۅ> mj 6~^[T( )S!/\9AHapI-Hse "m v'–iw:4R xX&j TG@`I<+>IPLTNoQX`Go%!dRJ+ R;kID脋Ҹ}jD2lf KXd F ,cly&Q7,ҕh&wY?RS 2à!Cb3AoD7=5P!XuB@ 2XȷMp@c.xkhD99NUC4.`ow$A^[V"0;KA$e5C`{ ج oLDO ڼϯ>ݳ@$A> AfH;6CuQK;%5˶d8$LJ b֑Al,mr?AYOucOK"z![G_VmO>ݷ>Dm [ՇCb{dO8`d׬ @hdq}\ ѝKE46_&zx J9[JYh ג 2)%XAP`s9 -p?59MU_I/v@7J11i PwOIFOAuN]d\d2$D:A2ݍYA2> a'DzߜG#Qp_a%Nw0v1ND8~^"~`ZyVjA҃%؊U PTdT+;TZ{s :_A|W2|auG*Xsm.x؇< Hcxۜ?|ypV; ~+G15XoUtP>Z5|6fsAY*H`Ȏ"ENm>sdBE&MˡB}t1;* \N+mpHA Zf>zh~JT~nfQ0?7tVoчE TF;{>*B4We ,A@awHlh`0J7=lAI ;hHc9C D ز 0H]`P]З6$>%߽{ʁόewE.!@'OiKC2Ȥ "V`#2" >k%YͳBڿp ՞ 7% a{EeU 9$&C~G9ř xa|@_iXުCOQ!rp ] mQ<P o~(-C2Ȃ#]P Qd!D\۔Ag{yM 2)%Xg\0ܼL }pQ9y2A~ǾXm Zط +0 Z f'C D(C2Ȃy9,NDaBD C2>)!dRJ+ " BAF2H "A R2X#<<<\cfw1V@2Pda:9 8$dC2Ȥ "V  D(C20HiAQ2!dRJ+P2ȹa2Ãp(Zx 2!Fb/Z}'lsTcMa?_DGdC2Ȥ "VdsÊe#y+Ozь Rp\vuuEj/DV9V0~Wu~"#R2!dRJ+P2ȹA2Ehy+셻=͵v,hsTVw)f'8" osa|{l~0{GZ+%(ܰd^t+CIwwL,$||aiՖ=(`[abžB25`{BIV *8"+fwJkssA<ٮ .~E/B&/7Ew}Hڇ% J%LC_carǘݵ?}V?L_6G5zm5 X~ OOOgVJ+P2ȹ}7K<>>R rnœf+S9Kp p$L΀:m_V'&LQ"ɣxM9Y0Zhͫsޟ bWȫ@0p|zzB/ba]!ۇec5X&o,xPV՜'V.(ݡ$ @-*u6G5zm5 XMW꿛^'Z,A B.~g_~ڬZA0bI|l13 l#~b)O`Ygf~aKa͔b2b~L!kABO_-E :@_f=,%F,x ]Ŷ6)޶FS}!HiM 2SHAK+dGAXŸm(d|<~?3ް^ɢOa&怜iHdhR2e3> ,R$ṓ3 aż,ãwda:#owODG7q/IY:Z,A ]N{|›;Igd*B`ɏ/`>P$2-G_ {ҡ2HcCVN[HA< Dvd! _~Z/IY:Z,A "46z{ex1A]! bI(<8# /E򛽚 \pஸp*aggK2Hfٹ7vЁF0;AZ]dWwOyԌ(ے %˂ds@˃P2XAy ODH,.//~Ypp }1>s[d2F+~m;h^A+KлV±:"NׇK`lI/-\2]L]mjFA zǭe݉^N+r)CWd-1mI'AeA29 (D@ .94![6} /\cãw¾]dytQ2q^o}!e"U*8%K22H>V we۰}K+d%O9vaADMf/4,bvQMVA< =1ǰ, t[a9t&CV'A>4.;6#ز*uѭG%d? #BH[6P lUnb- " A^!DiกD˃P2XAy9 bȶ:[~K`+۷ ;#G̥.Fl'#QJ˳ CBU}¯ eZ Q>;' ⠰%&NH("9 UaAevOv/ݣ2iْifv[<,ag3, _$C bJ2p Z~KY:D2HQs 1߸Ux+b8 <|`dk7܊*T*XCvI#_'Fw "<^wDUI} 2꫷o݊en7 (w4(`xf%4H3b[r *=%C }dVx>$8s;Aӫ }/>CzͻwꫯO~%?ү^?-qtK~~͏= r`y'zڨ vk_q K*6Y=L&e`gQH& %(DAZCov KGHI-0#dɲWlD%KK_^s5!Dæ0K Ɉ2bիW6?t+vdC!<%_~A ew'} n[j\+ Ы!~s<.ܲt?LKw?\G-(D@ lD|QvRf)dҕ`\dmj ~9\)ֈRB"ާv ϝ\&{e'[]e(J QGC \0_2?|V䫯A›7o_|駟| -=, |im+dt޶ʶE`V 걭ϯ:[mVmvZaAUhIA&{PV3Ӗ>*-Tm Z6;tAgUE,iRI<˒ARA… 4 O.Q$n\[ٯ=fKJY1%(D [Ljh^S (LC}rD&9Iervcxffj?UZ0#K{ZƭB; A%0%-w U56ͯm> ͩaVaSi˴1FLL#U0&ﶹVHH5 +`F2) BAAm%wV݀7Y [A@>; B͐3FF'm3`޽KwĿq 9^2 k-S>!!uZ^!AX\of fK.j##hyJ+P28/AS7] Z~.d*ڬAq϶gچѵh4% 0!$4^' ,`(IcN|xVr+L?<a leAh$yZ+>*gxtTT4kgr3a_iRCTD4.߀8 1 R&ْ̤iKP x88S"[O\Wp`i "Vdq^fe6(ࣈv HYU9^ݪj^_ "ժŮY-x"c NDW+{4c)ZĬ 9D$k҅JK`K+d%2A& V|GY&H2㗎;#p~NZwL|^U8|AGGefBU@7 _xijKzKZ^.+C[b3PÚF2Ȉ$'G`2 lB-  psʇPXPW~O>Fڟ{A?E: 91{e|z A27`i "Vdq^F2fiax> n$lγ2HpV>^Cr3"xDi7=Y} $r \Ȩy])L5;HiKAiTA|xE,D[Q(d >Gڒ- Zk+ן엪ϛ AW>b"UAp\\0gK+d%2A`wyynn@H-!Ab >vbK <Z~O!޻9{<AAOPeL1fL L}za?1=g,S@[.,c (D@ Le?gfd‘*g&=7ŵ8ZIefH\ ~*<)$N c2ȇb> ƇN00믿"@?a.KcC_٭0ʰpG~EO[~ K]?n><EA-V@ bJe$ʅ7IlC"Iةe࣪FB9Lr#d4` =Y} .(E `KmJf{/!(6'SL~>,gd}9& yB29 (D@ Le.]`i g>9t-We߯ woC:y$XaQ}X7D+ )<٦[Wlmvqn#]l~kBTل͡JȵPZCj"d:Wc&daY rhyJ+P28/ ˸_-ifayS>.7r"fH4٭Nfpю d"Je&l1BC}3eDsO (D@ A>]72^?e-v&Ala%nE0 f1Z wVe~_$ & _+$LA ,:Gȝ}SŖK+d%r2usTfWAM5aBS -U$pkuHLqX2M0" 03X=,eS)ԠN SP20-  {,RO{Q_?bm-śdrl[<6"e2F=A΁A " kEoyet9)  (@Cqoف{˱?QN~pJTۣ/˓îMÐ ", - PYk X(=O^d[Yr+t(-Ex.)GAOe}^T4BSg1MI`i "Vdq^Ji -%,mj2>CS /`y` و"ٳ0ǯ~d2J`A2\ذpLK1§=(a0tc^+_? @ n?ncl#^ҽ!6jb΁A " u}2jhsTs ⵋpE~~^S!t܄zW ,PQG#d ?WPC'Ԭ  XAxp bb " )D@ PlC+9nю N*!Őۦ taL@e(' mEAE ,_-dS2XAy WWW6Y椖ͤfvۦ 4XWm 3d-2$d><öٯ~o3Q^}  ۶C.DawfCfO/@;KX %KK)մ/`:`O&Hea,{'ƵK+d%r 2:sX|hfT~߉hsT zb2j[ysscZdЛ 5Bbnha_>NoM`aKf[b &~fѸ {3y"~ijCI{.OEZ0eD&Z[-=+,dh=-;huw~.%bJ4b6Z,A "˹dV{tfo\|_q fQM*`g3GFeA\MT* o& xV!"؟0As #iHz01DfCc 1hYE%vٟˍ`-Ҟ:]vkA|K,tANI?O}$8sv'(6AL'w/^$=,u2H6ZRAwʐϦ7 r8g[ ~q4J hPAf!p#Bȧ)CW{ `i "Vdq^Ji -%,mj ~Cg#dG'Œ # A3TFD]Uޫ"@ AzpkvAw)273pP K B `~UUXH Bǃdx+H#.`i "Vdq^Ji -!)FܡhsT3P0e(rf5X3db5AHtR AP{BCsB~Rv2Bs09D QKw2?|3pPAP $\Wq} Je]eS亥X[-V@ b.ZSd!)h蝮-٫ f 亂L0y>?0%o TyT(HͶĎU hY W\EUxV۟}!$='z]d;LkqG0M]&҅wJGٗ~yt~fXcx!W6w' FAl+\AYUZ;;Z,A \ 7?x!,gvk"痽g>-7Z2ȡ=do?</jE~uQ✎%*mD-qH/Mz[@ksuףknu\ހeX}\w>=ݚ;d+ ː(+(!_|lkgG˃P2XA~3}/ ^v~heE޼++>ba@HsFodT_D {o0{J}ja=~хu.D?lvHmwwwy.yTvҡ2HϡOG`2\~˴,N[ M*Χ90,Ó ?ޫb/'(/BkE˃P2XKAN3 &,:s_bDg ܟ3Z~O! D>zC"f%}?̞R_v&;X/=vFEjq1 8F5^$< SP$a[q&$c5;UA?]l[gE -٧A0_l'FP* Yr2H9( A;ti Do9}u 5 GesvWWSodxZn2Sxz$OE@29 (D@ Le k[}I"!Ns\惟QlYu}"k.{{EBDz~wVY` \puuh0637Rjy-t&2C[3gv {u{6`U,[Ae8=0ú}M?aTH9 2 s7]Ux6Pm &~;\;tDV' 'PFf?yłȾa~c U U!DhY 7۰e*\]w?]K؟ I?_4̰BTu֪ȴ!ms|Jkpz,S28CdK\{h,z o (D@ K >. OOO98޳NXOtT悹6|c{\}8BqI ]aa]6P8섅b` d{J(Om %٪ ڌrX?8- %x^܄o,uF$DD4a h#Ue>G C,n5GWԗ̂M wlE2h_=CxGa쾦zoVҋ Be.Z^xBUY6K+d%r,D -AդbȌ2_* gIn?t݈O;5iT>ZP/NDj Nt,S`)2m1YF6AFG2_+? %`b Dikm hyJ+P28/%A!!f,;r"kAJ4lK`(>Djf4S2w¤&ZG-A}i- (D@ ⼔ Z~& M(QMk=6p]fO AwC{XU! Zn h-FA|pF A'AB ,9?bw@@%Lu5HHC `El!4@!RdF3 -."@kdQcmK+d%R2Hkhޚ RٙRBrd8zD  [n􎟬$BU36 J6nn0?lRT:B@Qи ?&j W 1?wp_ dF JB$Yr :ZA^p;SdfDM`i "Vdq^Ji -ٗ%~hsT]07 )IɅy_y!dRJ+P28/X_cd9 ¨kX4)_a:/1o@W6G5 9N؀qQTz rn&]geaHA "R8 ;kb@>x/(ǏCd!BvR AFp2v̡f@2Ȥ "VdQ)dkvPX0p jM5VmsT#qD>D2Y9HA "R8 AqF/NTQF2Hल,HdsdI)D@ (.S m0 Y4&!Rñ2wCe5LT~+O~;l"~}>Ɓu nyJWGmɌqzdsdI)D@ (.H)"ra#.x b!2H"`yĄ X8r Bu 2F" ړ ,qYĞS$$LJ bJEq)HHߙ鰔Q@ "r:@)&r㤳ln,EZSē B{^j.7ScA2Ȥ "VdQIeq*E&Al<kK\J[1$0|,Sk9XE p/d4Ů XxT[>b?c[UEHt}o O,7lU2BZ*/Вd[.d;y$k 2)%(DťM:|mjRj1k Am؅EXǦl5>SB0FڇY7Z^0WKeB&{)>co )BU,EGacX M mH!uF,gTf37P%Y 8[s£$c;v>y .lHCi߮; #O Ww ]*kmX-dںom!3=>HA "Rئ " GH+PcAN1u4 s5cetPTbHe3TаFp"Uva0`&dB_tP~R -2|g!}5e;vppCXe o윖cw_!87bŽ36mm#{>7HqA2Ȥ "VdQB KGS2S00 w=J/TA<4DV^zdz pTa/ o`I?){ssCR*5А}|P=er25mmY+ip,,I cHA "R(dhsT Ï;e* [C&wb?]WI'~>9WH p+,/+Aa+}*D69^A"iJ8 B `9UН|( B|:GG *t_k(X-?}ӡa%LJ bJEq)lM> _нD2HM- fæ:ԒA||b(T`: B(^ᬓ]z`DA9fo [ A0sdM硰q5H2 7?NI[gdU* y5 fAXlv#`U2HS "VdQdHޙz&*^GHx#3uy}. ;M- ?ebfCnՌ..7wX)Lj+~l| ankTZ lwYd[Ѳ VFx^/vOF(AԔA Mojffvji]_rPV R2XADQ\ %i&AkYܸ Wáweǭm N~P#eueX}\wZ?r!JHAPmY17`P(.s؉X&Cǻw_A2Ĕ "VdQ‰dGZ/Ggf%_]Ն$Ўin b_T|_-F5jGZ?" >ef"d dJu*ZAB-tǿ 4$>\H~i{R0:27KZڀPX3k!;d{ R2XADQ\ 'ADFXX>!q%5gľ` 4>BA:N*Hwh9L< JHIeB2Za7B]qDA&d%N!% qKrpd?H1\{b`(C]deX} T~Jz aL*C2, E=Xz3c}TdI)D@ (.S Vơ&`fr wEu"ȰTKa*xmsT#qHsAA&d%N$xk!Q mi VdMeuO6G5AdaY r 2)%(Dťp #t!a܌ Xٻ 3Bº6mjfAVrRH!nU|! dRJ+P2(KD!Rooo^$ Hb1$t:t){=h&Xp"Q@ )cD썋"Rwm᡻]*?Y9=+ -r<x 4._\plq,>V 8mu  XsamƆZCԐ r 앗,dI)D@ (.m 9nZ]6G5 @ 0XJ&߂xlfjڥ$g 5CHi>L}a~9}^(*x2eĮ?u!|s q鮃ZY fՉ!:$Bmpc{Kԗuee7Z]d2DeB׍FZd6 /wXڶ#|(D@ (.m p9dD͵|@Ce+ :AQh] m9,@bf,>1p/p4:p/e![!yьr ?._},ʹ bGhjk1$LJ bJEq) t9)8xϑhybz+]O9Ba^A(A_رDՆQ,1%ҋdekتо R*m%2f[߾IK/ 40Hb9>KańL[# 2)%(DťP2&Avk,C1*m0GX|Z:ˡs)kR4.)!/.4o RA=BTgh\"F|#/zP'<(bWxroҦJ9J+P2(KdQM$OїPg7RZ2$}\GyR| z^82 ZAXo輸8Dd6p=Gtsòd> AC).t!dd %VA0k8ET<09?kkӇhBN/0\ ݼkBG~IkvX2ywҲ bџ:(fz*G6Z}gח/Z$Le\27XȗD _ĈF4X+$w,E͐ r> "VdQj2HA,դ2Pr; Gd6)- @ߩԘ!A= P^d  MˡcgK2 L;w(W\2YQ2XADQ\ 'A0!(e_7#eQͤ2p:DVeFNKN5A&d%Nx6W9cn/Y$F2H ", - X 2)%(Dťp"F ʁo4aLJmj$4 ²  dRJ+P2(K2¯!PN@B$N2}<ϯ7[Ռ( }jGKx dBf r 2)%(Dťp"k.lWC̈́S@eCKcq2͏}@ԠnH9HA "R8 >v;(WڽhsTSSPv'^D"  dRJ+P2(K2Pmj2ve^]]!clT/+.ͅ-47d^i"24.@Pɸ'xMّ'+W;MT^Fxg( ߼ ;yhSw r 2)%(DťP2&A09 !ZIci 2B`H(mD0cE%O]df,\]]KKw| "%m|oDlg)h0]`z#oNYuY=ZA^z]>%O!)mYNT&t2: vY>2tx5kH+=ƾ:A&d%JY:D2$oߡg{X 6ůQ~_ZA`k>㻊\j_pSAlfg^u?۷)E&ioDIfb[8գe z͋fݕD`TV ʈˆ 62ltA ƨ\ -JPH}/Tv R2XADQ\ %,mj"ޖy3U22>dӘex[e3~LWЅ;D>A`.M!j5oRI g"Ha҇h'@܈z죤.KAWd u)Q vŸ2 v_'îgA&d%6+p@xt3AT/22_2]YGg8lYMń:WJj+ \{c_=s|, Lh9=Ѹ ⵅËvr!qЬ;ŰZ2H9P 1v=A&d%6+rC d ݗ(,4ˊѲ Ait }vl)qĞx֮ u\ F~4AݽeFE( JhHA "R8 n> `>uqH |Q—YZ ̢qV㮥QM r40^ in_h\ϋ+u#זNBhm\lZ&L_:VV-M"} L6/msQJHA "R8 OKa Q4Q*68}h9]qø{9 ©e%ώeQ`$LJ bJEq)B)^]]¶OA3eo!flda\ " `XĐT} dRJ+P2(K2 }@? e9Z2Hmj$4 ²в r"c: R2XADQ\ 'A/eQ>$ 86G5AdaYX "A&d%N! $> ydH|,5^kDF(hp2h֯r * ˂dsdI)D@ (.5...̄Aɥ.\*H=m)8g9Q֩ y*x˱Xr%,AA&d%N$YFN1{u:6G55egy ! !Z~HA "R8 26G5YdˉZ2ww{ূa۾Q[E!M-47}~*+ll{a%[/Ŧq${u,}{{sfr,n`AzeCߣv]2${K2Ȥ "VdQehfq դ2M61Y-6Hsk,L+P.T0 3(i@HwNb0Cv`Й(pv- }Ww;^>Pՠ~ЈZ/}]WeD%a}Û5ZRʳL:d>u@%$6D?Vد~2mokN~4WЪI2Ȥ "VdQeD9dH~[Hl0t>/,ecDi0Aa I 40Aq1'k5HtRwu(w%Y}2ҘfP- p]OFwe$0z 7Dl$htؐb;yP b1N!a.e qyU$LJ bJEq) t9d=B | !w6YGaAnDm},]/Q>Nai Ѿ  ':ʰQӣVti›lDAC۫xX(`JV,|"5A&d%JY:դ2SAf`J]7#wpR.2Cd<@`JA0`#=D: lHiA "R$çӓCEQM*pgD^b˳pYk1B AeeD<>>+Igd)D@ (. ^d ٢FD}d $+n4 26tmj$4 ²bD $LJ bJEq)BvAD@S? _\ 7rwwgdyX3 }QdƱVdxܦB29@2Ȥ "VdQ‰BfN+mS%a + ćHb1aBUV9?HikAjcQ H9HA "R8 u#;H33l(LweQdq2)+zB2n)xUdI)D@ (. B9O~_2`~gRpʗ.-555ڸ6jaK4ۅ73>:tZh57PAZ" UA&d%JY::wboWhh~17MK(ʐS|P>t 5jN P`,ʉoѴsLnZh J^9s,BD,շ%2Sɐ9’[a\ާ˰nook˪I 2)%(DťP2qΣ{sműN*ۭ7f;B'@"`tw2XƔL yUInp - ֯ Agh؃xV,ha\ <2"])`.V j@'{ 0½iel?gX]W2XADQ\ %,< J<07)D& 6ME髿OS ZnC2HZ&;G$$V,D쑐+yv^^o7o޼:Jו "VdQAsHY2l.I,¬j}l*[F2;m zuM5(L_:ET~70He\@g\|/_}ňsS2XADQ\ %e#{}k yΣ +`:DR_9a!RQ2Hx>yhymn~7-[3}$3Dzd~2"/3D1 @e`g!1oHʀ7.b$}*G4#<:d!~7~i F耐MPB8 q4[ 5D5t@ݼi?~:k,Ǧ9x ]XAvJnH# b7ƚNH-fb]x&'Fu47_{-[7@ Bjb0 d B8@ RhjjgsmynN.՛U5qCUFxУ2NHX]8'5!uԎ7z Yn(cPB5HݣjA< AmS0z+5؅;VAMΦwj;:P0$ 5 jRͷߟ>?jy+}ѣ~J!K@ Rhjjq @օ295 @ QbOE^0V뚪@tEy%'qOjB5Y7OUK_'ҟGBP=bvbG\`_`=D{vD k0zĹ{!cG8 zGZk]VYZntvt\ H%FPu#KZŧt O/w?G BHM{4[ 5l?EJI.{T= Pu H! G~ ^??.b5`0hZAmiBR!8}Mg)`%))+F8 `,gAԆcq.%"~E)4jn `I+W0 :C VHBoñEV~Uuʋ_MjB{| 5D5p8 @L&9z=9JR8KPυx@_]PXE Rsoȇtz$=2҄ AH!$Ek{]YDEU2Fw8F%Y0#L]g#P_A< AvOIBlznЬt aPyאA)Ts:{Gl $5i d<Cؕ:4rj0WR4tB,| 5D5A"SWKkP :'t:c5e' fa4<?҃ħ5Y70S}:]8@T<5] }C@ GPx@5N\`Y׌c>ve$5OA jnA)2I1U;w&S Ԏ/ Pw (&A| jPuc5H I #;N!T jB  ,A SPd! s5(CA!UPx5#KP$3fV'A2B BMqd5HF be5!jPjad /5ȭ[N8׏9͗Q'4J=M|EZWQ5Hv B B AYK $1VX 6%IA |}s{ Z???~8|3>AjBHոPx5#KxA._|bȑ|9)sݍ677 |)|իNrS2 \vMώzy>)xo}| |衿8˧A R_A<Ň>ac>/R|?*kk׮9rƍ{334i[ĩAnkPz$$_P%{Djޛi [KNǬޛ)أ!2$i ( nqx_s/y$%/ ~ |#hoVzCиzld)-Z* dA#Gč70VDC%ɹst` S;u: d 8A BHEjGjjBPԗ]j#$ ˨U {GfO ":?%V8q})dyբ6EF8Cr5!jXAA!A R_AP,G5nllDr8qB$[\ q ny^CT`. 8QRAR!5H}!^B U v(Vۗv΋3!v cj r7nD5VYՌ=jB*󿸝.@55!?A 5j娲ۗׯonnb 6DRZre! Zˀ`8 ƁMxzA B BjB Bd9*Av)Eo^ (اU.zÇOlx , +~2XXi+تԓhZI jB R_AP,ZG _R.O>4!Ivy{X;Pj72o8w8IV9\I&k q=*& 5H}٥!>B k !cu8`0*3?z^Aݭ<(ːX B Yt!j% A 270It;.z Tw"]B6Ax/^ҟnB!~@ Bd9ANH)A BHEP .CjAJ!]@8p<9ҟnB!~@ Bd9A TG$jE5 jB!x 5rP%A$*CAk!ZAP,5H]x?n=_w:}&IX-5\ $@A!j% Qiq8^? ðYb//A B< e|>wE :ttN晳AR'O]Aw5&b/[9A{>$MBH~~yŻAwP,Gd'ܙӅ-G%dKR.A B<@>yҿɧAyuvV2뤘Xswys!/!HUjQ>V ;Y4v`0* 3AH 2 G6!$hq8=-6 j$&)`LJ!r/U97PɔcƆ^NʩAɉ-{u闑A @P,I 8svwU<͓;~QȔE!L$!UIg{_ KZz#$p^Ip"MQRyF }7?v<*B!+w^w/!+d9 A@/Hav$ H$$UT:%ᒩB Kf?3!i9#JAsKc%-નAɃ A>}ͧo9}QIED];C@nQrΔ9y@Ư:DDT%׌hu2 SȖX G)]pmB!A, >vjBGyv؎V݁~Wp_#*Rb^ !$'^jQ b|ܤcE`?T`HT>Qb$U.KyN9$}Z )I2B!$j(K[Й&p̃%b j- 9 :p:IY ֖pR !9L$  9b@@U*Ktd5*αQS9u=\ ,B}RLjB!A:$ u*4&DbSJ B:F A/5SW$_y5:RH0 Wb)R+CA!BRYh8b5H7jm'(L$Sʤ8ԏcu=ղAPC~/Ky򩛇eEuS O VȱK*E`Q=\g:+I)I1Q CHO7!BHeYhctTi^C `]4V@_H>r`uSm'SW Jls`yUi7z狗L B!5rAt2 .6]͙)ba_o!ZXDp&HK {8/Nd-8APtgbqA؉*v88w82r"[΂g{_l#5`n,r9\2wݹ9)B!$j(R05j`҇;BX ʗ IXµA!BB M %ex5HF`С'vW0Sty3c+R2JQ5HTPB!̅d9A AA5!B\A.A B<I {|6B!X>yj%KP! <`0 1J[;A !A^c?] d5!BY9khtlAǟd8֐njZ$ZM5H/h) A}3g7}ɧnM~…_Q!'v`Cc@ɔjrtyСRO4jB!r VncFەN#+AYHB9bk )BxIȁ) iq /d=Jc!p my`㯜9}Kߕ|9v w~b(܄ %QXMVPB!SIrQt:]ͣ﫚^n#S1!vR k[tUj > 1$C˜r䣥?B!3 Ѩ 3v2 ÔZ-SB+iɑ^ʙ,:&ڌw'!^p s9퓧O>uSo:KP9rd h JT+#ǎÇO=2j+@ B!dAZV8n+9NGW  s R8$%S*AB8$_2'ITvfIgVzA4\l>}[ ظ+gn:tw!.(Jd„䷟=|4 -7jBUAB!4LHʄNy}uZmdJ=2NĞ7z P)^"VHދnkBj > 1$C˜bʨXT'j~/qn=O!BO=i{(r4EF#LiLLzk\jZ)zY4H_}eK`0kJ&jxjI_x5Hh-s5HwN3oʃ3ej#VQJ!\B!Az 9)RH b2!HNە[{t:sLt!]5HQLǸM1mǮך~ ,2͔bVwy61!5kMX=>HJ_{i2vLu$CA!BAS x5 *CA!BASk 2qepEƐbOWx5I jB!jZ4*AP@PB!8P.A B<d !? !B$? u j d! B!BAC R!@ BA!B@ 5Ht:N&>]TQml.mڛŢ*>A4\l>}С ~ 9jB!C 5Nr2ө/* FzY,zx@5L¡CGQϽRMk<B!T jA&I "^հBC֨z69 H*שS F5ȳϽ6O>u+ǎ_+w1CQ5Ά:tTr,rٝ ?ql5oK_>WH!R)ASAtN# HIZ-ɗ1ANGIK,)JIBU3J .W"5x5kyMI\x'yiHI) t]l?R x̔cx rZa.!B5H~ A8hp_`Cg!XC.$v b-I BHaP@@Y`F7S&Hç1E:ɧn"bT@t(ftݵ.WA B!@ 4at4譒k<2jJ8) Q>|L&0@XBHDA)pd:_A R; [[[Ϳup Aڵkے?777O8%_n2z,|lZCNt΅b=s\6S΋ 5X {sx o:h7 BH:$6SiZv{ggGnWr:?`0; IH1@l I!9pIɗ4TFy_F̢55T˗ϝ;׮];rLؐzYH&VSj%SQ8R^S$2_ne3q/QRKxb?p:#AATY ?b c-: U-W(!Re%Im0 /U>$ *Ng0 a^n#SQHKjB-N%z^9\k[2Z^–jڑ]ix IlmmY9)FAsTN'Zܛe4puy]N:c]=.ؚ kQA .HZ/2KAJarkC@9B)$6Sh LzC/D5@Hh.b3QIy1^9LM#9(Ѕ- c ҵ?wp<R@`Qpy?Pޝ$6mv ڌ=c6 O)A$,{b02Dw̍&hO=iyrkC@9B)$6S ~RsR^7 j g5Hyh [:AjBkH^~ `xЉ0IC%AVAp0E55l,BzA0x@ҵa(B!`W$4t:E30sDłjȡJtp]XUAbϛAl:)f [:AjGv f8B kLvtUg )A`-drf H N·n@o D!K׆ !B]]F~ 9Ffh&`=R5Z`2h X4E`~V M z.l5ȹs666%?5:$SJbQ Ɠ`{s5, ɠ5`2kT{U,BAGΠѫR'? dP!B]]F~ dggGtjp8,vrkכNppj )*rНpck/ -b}W왫c [.AjBb0essY™3R#=Xu-"k!Z8)-@vq)4֭[zB! zǥs<`eTZ,"gnABB!di%ImAv[3fA R; apa5HtF!K !BrK`O5xNHBE8ۉ p."R빺.wY4hU B~$6S.{KH`Q&<#A1cBV륀|bZ&~ )m35Q B5P5){ab* PB!~SF~J f)=ZGzpDgPxI4hɎL* 5ȝAA 5!0%Im` "i &;&&֐X<#Ila9Ɩ%R YhB3YTXRCHǚ]$_Y4̠A0a0:EeN-ɯA5KG²hs`0 BÔ$"5QD/K ; }N-[Cl"EtNX4_z4Q 4r%TF4Bc4oPU ktW`>*UѻWnA 2jp AJxQB!~SF~ hIkWH<vD->eg+OvH<=]7u~dU!ЃI1n$Hh/cDyD/ɊN8ԏsarnv9y /"jB!aJ`OAtf_~3|С #(L?XMyF N`XX_4ED B!?LIl)xm,zQ z`0WHa5` jh5b%DzpQؗCD#OMxQB!~SF~ T8 FᝫGY3s)pV0)l1 RFMyFF (,"!B$ 9c-tP4٨F @S,:kH R6PSz4 U&A!?y]<7E.̏؏1V<ʳF̗c'kA& VuD,mzn_l sr+ ȁIU@=)=FGT\RTjBHPx 5Fzp1Wh>Pp!vqpR:2D<%1z$b< 2jMxQB ăa 'Axe.T}PyiKHD߽(ߚ^Hy HPLc@A/}nt06@ H&B0 (3Z Bk?$_n ) -[1CǕHaNzHKJy@ 0IrдBH #˵5jI8bUWq8nm@G%i~ؗ4Hk )V+ )5WA*NE4osχb0͈W_}u}߇Boll;wN;ȗLZG/CL#(tkV&ԞG?:QcwQN>x䩔lx*5-7*XIK_ioډm Mf&Ru훣5 rF׈dJT+l-8ffUQG "O%L}Ud*iƀϠ4_m xG)Ns^< +A"? t: ETha+m2*'Xxp_eȁp#R4j&Wb'AP41NI8VdT%bLq2T+1t_h‹"*{R\tb/[[[_vd8HKw@: Iے~ȭHJԁ$]FA 7![YL[# djoto֜vڛ%tJ{C/W~= \*i_6xm+:jȔ>S`VA_J5$[/ixfZ J @D˱N']u@=El^1{Qn4ED B)5EoToվ@ #~H ˣ(7A4'Ϭv f.iH*_ZիW4 o}IƀL70H Z`0XNؚyb&=sshȴ{jAMxQB D']{ ¿j?֏ T!v>T'Xn"2 j ,Ԁ41ZOBO$t "UHt]@۵R4}gNѧ@ԥk1I1)$ϩSDm,Kf`1``$i[ VM RjSK,ڐJm*[OLےAPCR=8ϠZ4ED B)jj[!]ZREV$$կ%D{ ]VlArDCDbdSl?Ԗ%VQ%A5Imn݊}D55Oi'**t}AƥkƀJG$i )1 0`! l=5Hwvvt1R;`C`%SmĆ^ +t Q^wx58;ڜhB3AMxQB \ "9|kkH_kHa~nJn`WDܛu3QW;bRQbPYXD3!͢Y/ҶFm޴-霣:f,[׈GM5}exlVţ-{VM46N}Z߽}F΋f^u7 t4 U&A!Sa$AIa?ZSTdu=P9vb:Q@c@P*0#:c%Xӄgd ᕽ%`Q,tGi /"jBHPx ugD P`u\45FzpQ,:^hZ`:MxQB ăaĆy Yy`٢45FzpA gCAk3Z4^ z+`yaI*4NRԌF詝x|&A!C AP0J j MyFTz=pV`S!ݍ+ c, jê’#Ӵ.|Jӄ5!`A<jFA pa =8ψjá%a79BGLq4nu(ݚф5!`A<jFA pdUH㤟s޻hB3Dvݓ F5 u!i$8]k?02dͶZф5Hxb<~'/!.j] 5ȪղmrMфg$-s^nh,&z=Ej5r /"jFqGo+\Q5QvH MP0Okfn:8JӒ+1bқCO)=D{FqŁRFtgs ,ZOфgD5Hf6a(Lحur&A5Q܅0jul %]9 {?& ?_c,>?uA0 0"i@Pzd$U%Q@)X(ǢsnVďr\vP<< Kմ 9fV\3j`Jƃ 3S bo -]8֮S4ED (A<:v?|ȓXzCZ/#?#?t$?<~_h$'x+E{yºC vrJttlp0)}~JiۋsI' !7eC8i^I(L( XhB3b'Ht;AILf`qNW0ndh ]ismr5My5Hբ /"jFQ; DZs忌D D!57A p? :ƦbFr8wQ ϐ2XjJZrPV%()禱l,lT>ghB3AMxQ4ik׮'N|҇_~ȑ#/c%Q5QvH MP0O+P4 U&AEadwwwkk6ƍ׮]Ӝ[nB2ofJRٛVL$4)%ó\ rޣO_5*A5-5HR8$5HF "ϺLzv۔3ф5H(FlnnB;;wN>rܴ!R,$ڵkvr Hm{3!iPիWJԑ!\N{q.uh$PNI0:v?'A/ZlNNyHԱ ܭ(65ҫ p(A*֍\an{5dY{5FzpQ%|7m-0NqYh‹QAܼu2u޾A[~ "TSH:4ĖA6YRpnll}=*lLH+ I_WUݤQj*0W`>JeJ3 WbKoEjSל\\{oGCA  &<#V`3nelinj@8X7 )bۉ- 58DjFM#)),Z^2fI2>Zm4ED (  rȑsΩ1@(g,Q7ga .ZŠNc@H2 ) V4A$gkk {j,Ŗ!!|r-p>ql?.@  gZ814Af r26m9L"~iҠ 0$9(;K|*A$-B[koγւ,QG8l X&Ȍ}+O^C@l*Q0l4Q m0 o}޻ޑ 3jor:M뺾v;SKyB34{zRIS1ф5H(lmk׮aj ԄA{ r (uD$i^0ЎYwԱAC>})U(zkI[U'ފR>5cT/STX bnj;Ӈ-V#W/|YB;-Ӷ"d,$c[ZNU;iž,u!{h&=5>-EYl|rط2}:m5hkW\PQ:j&<#A@e;Yb [4 @Pgb쏤HoKB‡=)>qУ@B)_~2A@T8=2c yNU8hoQCQ8-3*ӜtJDUKʧ=t;ֹG&چNqv^_}K9VV  cۀD/[O\ж]k9#!&<#AUì"k[7ggrDc8]k?39$֒jMxQ4b4ȹs666_WQ]]tDTH>]O-!Bbx`Z jL؏ؒTSc/U.[ualȻPԱ鐾6;;᝿z;[O|.FROI8EaT8Oo ͏2ٴi|I ЈLgAT̆F5Hҫy~wlK :~YZ>/whB3Yб{жi^)/";^N~EVYxΗF^D 0 X_ԱQDghإM3%~[R8j/)6b?%Ÿ@Վ:èڲOw{3MJˍPĶ̹Dvʌc9b_Ma6XG8Qz;/W8υ b }t% I L@{zaNw 8?ꯖzk_K|O`l`K3R"9-v;TTp4Q ,v/2[1*oh7ņȮAw{䤿p/xY̑l/$T-rF^D ăc!DH?5}=)?:D?qjiSR?}U.cHӭOu568*ʠsuwՖ]Ķ̹wag6!s|r~,Ks-Wa4 hOc_ڡAu_qK ZϨAbۀBfd6( >qM$ߎ#)ЃI1%aJKFƨ'%u%fmW<63TڴKҖlɤt2`գ@zFH blMCg}IAԙ* 4: з2{Impc/KL8ӎAl $ (+"i DЃc;L 1|7}*D${8N6cL[aԨ 8A Aq!5$k "Z8k‹QPxu~:xA[4A|0ʶjj,dlcb f&%mJ3 XkcR;)F5 Rh‹QPxu~:xAul D55L `.53Ύdg{ǣ.)7IIF#(,j0R ֊1lG0yMy5Hբ /"jFA AԱ@ AԱRx ' LS`Y&%'RJ}dbdi)-Ѓ jE^D ăcӁăc;&ANxA,My5Hբ /"jF?s?FOjěa8A ЭuMy 5h4J؝ф5H{;'~JoH9~ `.0rKݑS "O<^&).}xEjy}uOI7#RyH~SpP0l4 c^e]h‹QG~_X\QCV*<^*5H- D[ڭ$bO*/j p< ]{)b/UG)SpP0l4 ؅nөF,`0t:X$'Eȭ؁KV cMX`GJJUJF^D ăc!}Oz . &/wŽ!iaytEaN‰"jp9Pת͔r_/@ AtVm-'e $ Reql3Ӷ>D/UOzAVKT$L~Kѧϵ*#g -,.p.҅^TIAOʤI%-JmEZAfl3fLNA{IRnA=!-ewGHOm hcYg-KaRɤY u&<#An? BG8SբJ I1Vht/O ;LMxQ4 jOt ?Jw_я@5+~?폤Sp:%tV.Ұj b߲yO^z:5Fzp V+~#U> h=<{1oԄ5H tH %_gHzjm`H~l;+wwt4P^%'ԂDUI'T1@}m 1m/Z@F!((8BWI1%]DR™?ȱϑNiqYL=}Jxf5 BAMyFv#D siE^p4ED (A<:v? ,?JDGv nu^S  ;L܊~+3dpRR5JipN{ȴ޲0̎A{J j!cu#3R/"S)-s+9mMQv0$͌Rc5dhmfيiWv0 5 YT@i#4v>3v-K2娔t mcLcGV3g~␅)Kb$ I X;H_"5yήAz 'rIψ AʮjkbضDX{\I[caQ %%G`֖ fk W[1hCӓ~zحîz!N R} ϲފfbAK[]+SE5+dUM +Ơ9 $fqm636 BjU> BHÉ LD`IigfJ+:N=s^|F FVZ59d$}Y7Q bokTߘ ؝%{=n՝"%'TViMK+yq^FaT m6Ɗ.Loգq8gm۱\!eAd[͑]@F_z6fĆba4+5Υ Ԛ$ (+AʭL&lj6$g0t]IpfP@=J]ULJ[-dJigi/U/F59.꽖KnWcӁkyulQ(R0j Ԛkbߎ XUP[Y9Q Ou:!)x+a(M`!B`0>D,ёTPI(+-)b^h4$ČBSkq8n(eul b^~ -$}A BHh5Hht1P!kNITDZL~0[rpxRIv:n^*ƨJJsXa"'ˠY7 QvX  hPRkA .<[sfgj,4,Q#@vjxƀVd=g 2,_cY YK{UONyoȬʌs84YQ7Ɉ{ٙd,L NN' !waapV ?c@:-!4,Vɵ;htWk.z~JzC d!@2(vM [duKggEx,؀8WA+x>jCM2p;9S]JӃ zBƁ>p $G ;@v(d7 "HŮ)dk ni7xv* j&G!8,A' srKꀪ_T܉40i'nAvP2n D "]sF&m"$[8;  $`Apī(u7)VP(, !'t]◈< =>'~qx30AIU@̍[= bJ;AZ8؁ 2z2B2(vye{@? $[8;bd#>. B~g9}M_vq]?Z~Ѿ^8 ]X/^7,)Ap_Fބ΂c2[` 52`}+6 a|XneZbծk-0<1Xikû dYA3(XR^+v|D!c}n,ob f "]3AF_Y\kQe,ߥ?)02_tVYC2ȺS23p b13k\v4܃I v߻rbߺFv 08VI'~b1TfA>ei8r _^q8k-exp2Hr1}V?mh6N/Oc|A>/؃|.n)4n9kpr,d0{dQE$ M(r#LAcx~/.^kS_4)ZA-M rb8*gJ1:d G5hAN,3 ^[ZeW+v7$zZ\@*CؓyeQ4 f9kT"I77#? ÍK^`v 5k2$[8;sGm>'v9=021=c:)/3^ҋh߰rڹ-FLp =2A6GG;  xg "lADk.|~~>0 B1WB2Ⱥ)txI/PB_;]0vAJ>!bB:X9=7K?St!meE&̀\T2Hw\NKBF}zAvد 2q8{yyI)]޵E!DVl A-Mm@3H=c/(K7i 3c}ċgȁ"w=N?7D_Dؓ " 5%l A-Mm~B3}bicz^m`IA6 `G [xİEEW AN %=ڡd@2 DdA2Ⱥ\ PBc >i !ϣdgdG; H$bה 5HY4qv+xw:Ul`JCLb-mGnKI8x?q(d%A 5A|tlD/ ni$[8;s҇ߐՈ(0̌]-vql-#N_Fd^_D sbq]׺8 ®g{ *(z2HxlcØ~)f\Z4m`2h3F!DfQ9x#2>===??ex{{cN_˗lG߷vE>9kX$W- &\C ~ 3M,@W,:i} cGKvcjr'k2fE8q|yf)3 Ki583?)ZfxAڸ bGVh<'nqh|S!Ghp Ӭv'VlA=$bek^ЁZi}"VY+dikEOZKDqÎfHâ\ ! =x@djاeS 4+"dٹ}Crz~2u׬Ace$wỈ. b_{29t]?BV}Pg_AvXAfQ 9(frLnƣ2Ě_mh2T11;ۍbbSv B{EbqY7Ұ!?b Z "]3A" mYk)*'f&׷|AA# A1@BgcVw$"dٹ}DE\Ve`zγK{)74/>#1H^Av _mxK-UL›qgd`BAڸ 6!&H{mPYkm ڥ ޵ Df.SC}kYLfHCs-jH] th4a9~޵ D br2cX&^L@X}duKgdg`[vȚ >J}e:GwYe&(/ N)fS8dpc5ұKk9o,.ޛΎcvVû$be{F^? F ď4MA%[ A-MAvM16w= ^Jv46o9 x{$&g5h <~0PA ~jA.hqf5Ii2E4q2H:]z89L߇Wpbû$b,FA_ad,WÎ<ěk5Yc[˔ Š1si(W 0ڽm dٹ GK8//s'ɭ6s mab30A|֞;w$+}G%Ժ?0RMw4ZM=aEjq 9{;8/"Fڋro8ê{pKaKHH@ 9kMYhvr e%&ucQw-HŮYA)F_ki|8bz4C(`_|7&+g fVduKg2HxgGqD[}?*mF8 ,5kVWzm;S-S]T/R=G;ņ`oh[E&fG_2\W\}Sq〹Լ%?5e gK49?/'6kA2(v͚ " &\wwbW";l < t#Vf'&2g8¢\/Ě׾KhKjSCto (lCҢLG; 1Jn/dQ욽 %t]Z2Ⱥ3AN1:]봱oK %2˸Pb@(!,SGVO5*"v6>8 \E,vRa!C,l!h f*ޑ¹@҄= K+^bg+$b]$[8; ̘#A`.}80n,\1Hr[j,*163 ^JgԼ.֫LwZ)d.ny50=ᕫA`O20 $bה 5HY4qvA4<//F .\`aBDpnOEdUY>V.l3e@ ;@v(d7 "HŮ)dk ni,H3Kg |% 8Q{B2UƗ-^g R2УJ $ADkJ$[8;M1lT:O260f#R@z bxb2B.._mAvP2n D "](`S|t^!dٙ9P-/%'h`Ap$,@($A?zd5+V z 6]]_u^'Y*d.2F~" ow1zeF z]3v _5 5sďo9}[z' ni,nA@@$7 4z3 KȏP+zpņ}+b tW⧰S6Wg`.lY%>`dJdJ&G@mX,HŮ >u&j,>vHX%A-MEk zڵ)z~2{b?Ue ݜu^8BgW9V2dB$/⅜@8NѣdDXɼ~hda~03eGja,ˀ`(6Npc$TnzӎC7-evC}  ZMh{HŮٖA|GģD@GgY Ȓj闩)ǀ$ &M =0{ M1j F84U9Ml¼N JaNlk ~ѣeB2&8ldF UY9 i\sq' RTC:C k9(͏톞%| AFbt "])Ə9 idHQ6em$[8;7%g`Mh[I|gݙ\38H%-29&IPh O;eh ~Ia\?43, in Ӑ΍*tչ RT'wy9a6l+qM1,-X([lADkNAxEXR2HduKgdg`c5^yۇL ZנT:"7:\QInh MF}zymTI=2HmP^YA*pZ!! [kv 52\V#M)[nڿvN׽gHY4qvF{gn 2h!bRm$en)@]1/ZLѣb'684#bL鰫v N;9}omj9C 2=IݛҾ!DfQVduKggQg ϸ xc"_eK}7#+ߎ %P=? u+8 e;h5z|dEq{d]| B ^ "]S2 dٙ >b-ca?􇷷7Ŗg؆w㗜 ^e?NN q78d]=N? f%\9ߴӋޡv1zÅdnq1{AN@xznADkJ$[8;skƪ cAnd:~Ah B)=a;ʧ$jb12gV=rAcO20 $bה 5HY4qv oX@,h?b^.yMKD{[3P2УJ $ADkJ$[8;2<5dyCŞA$ʶ<֙\y||PA@ ;@v(d7 "HŮ)dk ni,nnNk2 iGDj#xĂ <w:#Fwq(d%A 5gA. _x:KMκ dٙ 2 j2Zf a($<藈X5FpeɐAP=/:ce O{?q~zs~4az^hze!D2Gh!ZDF2Ⱥ0Sp#y Mbr}5(ݘاrB;fE!=A-w ˘ SkEa9C;w^;;yEծ;GN'_ƞ _}Cs2Hm@W O P7ͣh-hv4P -e?Nϗ#`2)ʬ-Ex;{0Fh%o-dQ욹 ٖb#HPm_T4Gy }`IbV2gb?aK =N?swxߎXW 0w*5ʯ;GH( Qezvo;:O5h PÕ).1ei= f>\ |piW ̃JK.& %{dQ욹 TY[Zl-e4~pnC.A5L߷+2ץ^pݭA23Jz~7Űˀ7Hn/ ~/AUj_Nq u^1u;¹[z\ ÕQ78bd S" do;A奥z3UDցx3g_p C<dQH1ZHmlY Nh$Oi4$K.kN;di74V^- θ$; #9^]ST 7g`..w Xpw+4dW;yjE\pOxhnA/x`?SxC/gkuzj|@U/ $VWf0*Ԫ'%-X LX, :w_hG;WG2k6'\wO "](ӂ:߇8, ]ښ8 ZQ| Z Yf.0T2Ĺ z2 "[A.Xu 2 Lpv>0ePb'D(uev(*.돕-)΁sqE,o|b;eF07Pp}ª`i3e‹fP+<X@AGLeLہz++Aa‰ޜv 5k2ȕ{ 7dqg, 8 O?!Fx{{CG | IYW0!@v(Z&筎 {4^ T,* , qףeGR2 B2(v%d,1u Θ X g i/1Ē{%)2HJXoX*b?rEh}3d/L8Vįg5/#d@qvo!H.>G;\]Y{AYGa}%b\h5p1$;c.xAXѐA8LXyuMY\А𐀃XN1F5uI;Bǔ/ҵ_fLgvdbh \D8 ADkJ$;cAg2HfB 2J|:3ޒ㔆 2O TJF2 zC d!@2(vM [dqgl بr e#$4Tn@3 -^ 2OAh_ 8 hAv BdQ욒A X!ƓdbjL񺖟;{iw46Ŵx#PH:Bv(d7 "HŮ ¸zf0Wdqge? Nر4  (9%RM)^ڀW/ ؿ֦_/ސA 3z/qFrw}%Evؗ rV`*mX]=D@ŖʮݠzQHŮ S Qѻdqg,̵1<û䏳:[NBߪX07R߸.돕-y`-¹˳/;Xd p U++Sr3{þd&ԣ2-c2?hj Ϻ7HŮYA+qikñ3FS>V;S0#[׵bo|.-XUί۞.- XActF\Au54׵AWȻH((vJ:S?~u;__%kDDm{ș&go+Frm*T'ޣYQr";[3%x:= v cCivE|Y,aX#|*޲^̴B"K BsADk267%؏9[t؁^\`~hvc9 %[p?HUk)!Aĝq;2%f͘]xv%`r=N?s݊hq/|da)~>o6.xSPޙDF=L2H?G^oB6_(. %ayx_{3} &{s1֕/; PZFoA O&.6D8<ށN9 Df.1{b2}<(LVS/D%=N?2b+CWN?ZQ' P3w pQ?Qhά^md8ĊoP{u(17 '_v:t ~Pdl\ņ,7QA$b, U}8~(XZi{ PRX˷dqg 8 @y[QmCsGLfSj2H;S:ǏQI~NcAj=2H^tr`/Cv8*0Ꝺd&W dwپKq5.M1Z (QhM} dY Df.x!z1 d ؾVᑉkis ҹ _r2H~l!D%=N?ϕAŒ#xО&QAjPޙVI|O QQߑ_DrG;e &8\PLI߭ n/ABiřwQpKbl=>i^2w<3{dQH1ؠD+n+_ڑdfFDN#58 ARdá"SϏ&Jgx0 ёFV+$/e:n^ ˃!+p8&A P3YȀm :28 \N6 ].`ݮ0Evأ Օؠ nhF;HŮٯ WHwƢ QVHC^}܁!zKp63ckbPN o@Z h= BAu!DdA23eOtT5ߨkJ8s馬8[`CU׶ZW?< OAvP2n D "]S2 D/AÆ~5N 2dK|80wp0 A1O1vXfDi \ k'ѭeq(d%A 5%l Aĝs4_ l}\QBǤ}b]}z& 1eګAj"p?W\$SzFޏe@ ;@v(d7 "HŮy WK4)k1$;eA0s羒trDX.x @y@΢ sZ8!>*7FuSQ=(+V` x(=pjhǑʇkFG3p •^AX=a.F߆?%~@33/1sVM+V]_ h8UOuHŮy Rz.|Z Θ Q.*ϝu%;ylFPѪs!>:D)V׶āa%#O{]evFwmB˅!>kİQKȉ} DFz;dQ욹 ^&∥!s9#?SbZkLiyE_+;)x׉5l@232p=(30Aɖ!u|4t%`5 y ¢s"&(N GlxcX1Ăi?p"U( >*AE>M]ϑO4/Z9X`W2~0Ұ z?W>0/_ w07"XbØS`_* 8uHȌ/nuۀdQ욹 bϾ4uSXF kA*c@(Вl^>/>s̷ֲ) θ m29VkdW͎ ?z~2ܶلi JEvS c>Ko=jC,O9JdⰪ8*<8ݬ!'Ú^Pm}4:92 (cqx,.X_M҄sUQ:CH5uky?wPc_ jngѣe(PQXhU c0=gڿA)~1 2> id8AO=&͵25=.HQH kkPT-UQ:ZgAK>bdQE L ebo!'6بdqg 8 W,^b= i~zw=->= R;|.­8ۂ@cXilbTu]se?g=h^zA丷hE82VP< +Ir$UZQ.uyGyU1@2(vQ AE{"5_cQnĶ (dqXtj;/|00MCoR\ rVhf^rhW 1J$!kx 2A۱ E{h ̐/A8G*F[Q.urecNe^ +HŮٖAB=u XW XL_h|3Eknq 3AĝQ230h: 9Y~]=52Hm 6*WԆU1X:?1|"fAzx]? )qcRRL7iެb2MXAwV]Dg?Hp`2bdQmV-KtZWuhW Hnrl {dqg(0<30_ FЛa!Eik8/r6u|U9]?-caY "]3Au!DsmއKØ/F>!C^(z~e/hED+< 2B2(v͵dql Aĝ1Ar@r`.qӮؾaQ8 hAu-:Z@[n)wYW7c( 4 ŷ{`㊋ˑ "]SA d:կ/.XA rt߻ ZHenAvp2pn)]@2(vM [dqgWUpW3^__u9ApOX=N?%=ڡd@2 DdA23]Wg>RĦj2p>%3P2УJ $ADkJ$;c)&cxG\ p___-흢gdG; H$b׼R994 D /%loc Zm3,[ }%zX_`ճK@x`KU=G;l vK= -liYćpw"3#+FlMk Ef VG[ ׅps"d_[KpgqZYCuq94_ BpTY`xt2$bet\IW֡mD[ Ib "AvAxݐ u||ZXW,ݩXtzxE2y=G;lo9 M2:f!YV1kۨ`Krp4E_VA}L=eSvLBKUuǻ7ON": 5s7}dMA8d~ B23Jz~AlX7ɺBΐ'_hSN B|9/q= BàA#.oPaJǽ%m5AX|b^dA54X(Z].$,l#R9Ks miS2(.Ģ 7(MAj "AvE6 nS\ mG\4\<渙G;L{ B1~ $+e\2Hmn\_ 74doÒAdQ\ b}%. p(:IW՘Y#"$;dg`) h~|_i^Lüתyd>8 }G;@>{gNnIelءfdtc$Ll{ oV;7K3 5bEBx/}vO[ψZ/ Psdž'$;D#PCk0=N? "0;Yy"|_9a؞+ iEěY.Az8[Io<`JÉ2Hn֨FwfcE-UdX^)>d~Bե 䯋䯵(Y2t2$b, iOCȃ/јfEKAĝq 2:˻lveqX1D1vž:,~Z뼊%f +2m;AvXAɊ ;΅I'_cPا'ɢr4~St,$b׬ @fdqge ׃ w y 5MeȍBZ -<3z~eU1-o%MDvXA+u}tvEn[ B "]sF:TB232)N˥*9 \ K2`^n>wqx䱄_˃0/>$T8AB{ТG} 51_ t!{k D20 $;cA Gp7`#ts8^N~D)`s!=N?D=e2At!dQ욒A Θ ФՌWxc|'ŨeD4H.UB3;3P2УJ $ADkJ$;cE*?R!6WACûZ:p9^4A  fyE@ ;@v(d7 "HŮ)dk "χJߣ!^I" f,+Q:)rɽ0`pq(dgAB!Ɛ "HŮ)dk "j+߀Q- | 's` ~@_8 )=N?' ytcSϠ`jףG;e-J|K9; AQ̰xFA2(vM [dqg,nBbP~~K"l*)#V&„cWR2YbL zh |G[{ue$2HID< eu "]Ӟ_WZ AEd _=rk;D\9x%F{\4``LƎ[fKyzeDxOAFMRv "yKΰFrE_%hpe 09xURwn,\``bN'= a[@SK,1kπMdnADkÿꆱ(%o#<`I?uz~2`^19=bV:se^h0\ih\~i,hM1|7F{K`fZpq! 2$ !AKAȶx /`?)09Oh ө A8K%F+i'DEQB8HcHcfkt s9]h 7q"snH`j 𴙟(LčASF^4F:C:MXJ5zADQų(䮘 6F+xzJ0B۔@{>b-aUK2 X%DH}N?2zâ " !DEQ(20_KAcYn)z~NAΚJ:Yl = brml9Ra ˉ 5#JEQoF wŢ " r<$}4b`Ǝ[mJf3؉(v􄹏OAFM,b5oEvXA/eyv@5Mp큷Ţ4!2 FKR I&.MA-FؘӧdE ihB" 0EG;] ynȟym< A6Co[cKJͅB4qE-F؊ d(7z| j"[dQE,J+21 2 =:~{{4}gQ%\˜ʧ94An4,_V/Ô'E "&2$(gQ2]1A P|||`w.`;0aAlrq..Afxj^l4aQv\L. wx$v8 \Ty,a%YNh:;zC ] KiK\K2(x% w}}l4ȕ!B)G}izAKe?P/"V>j5'V[rY=N?d%w%S DEQ]>GiJt3s3249Ӽtx2k7W "(Nd2c D{=l]Ľq d&Z { w`[2[cٔ |]/Y.4c]B[isov{@, %f*0W&T!% 4lXT ye G}\ d~T"8_wϿ{G_ "J+j530A( zf~t?SG\DxZȅ 50AQ6& Hw"xh pAo=]eT1ڳ}Dz{{õp0W!`h0iŢj`e| |\7 vg-0])>@PqJEq9J$lA830Ai1v1X) ,{-;tkb@9%oTD3`:I%TEՐW[coʃ،Ӹ3Kh*B (.G d(`Y8%ʈRh {xސA|R}||P/+kED =aM* "r ?Hs; ߱ho! JW#mya X,fEa:^ebn3pv֒cޫ=>dk>;HCPqJEq9J$l hH>O:iރM1A! 9 x8 jG;܇ "$ J "rܦ _âoڥ d; 2LJeŘEOz}xӨht;D@ ;@v(d7h dZ A)=N?%=ڡd@PqJEq9n\^77կ,Aҿp駟~9+b׆ci;n_JV 2A\gT8ȅ 23?>> Ղ2e#~Bg2YKہ ÃzM=52Ů *kϑ5̹P2(q2%?Zįk ?28n97Af/w <^,fHsJ0`^5=RŮ拭q\8>;z~(pL=ڡdϑ$%p4WdQe?<e㧟~bK8#d2πҰ%l$lED =N?23ŊDmethˍ܌pii#8] Ybyj K2HN-0)bZN,Ý-JAh ^jȋj h(gYitXo19GAi?GE P2(q2?w._MSʰT2;. ҰDo ۡdg`AleG1]}xįӨLcYۦa޿ =aqSL~KP)ESo |QakQg=G5 vsy %)OtO旿xwP~sʯkdf@[;LW Ӽ?pbLek Jz~2iUWB×Wͬ1Lؑ"5ܩ dT 4/ 2H9ZQ ~.h*B (.m m򗿤pgk Jz~7{$6 %ebӷ.]Ž7 DM%r w4p h RSpܫRAjvU4)bQ5 rst R4y %{AAO쪌 d;QYLA=N?si!.N4Qyec 4&q{L.''w8|lB\;יrMG;eJx2H V Z24ets.feCU(Dأ ^C2vxK꯯^^pwŀ6!}@r4 ,VfνY0ZU‰ڿv)qh`Nh* h*asEG(ӟ#˃zQP2(˱_DA2vXA,#U \ َA[o >P)J>>>O.ɂ] ^bl =N?2zÚ "tCU(D(d 2VDc55,zzQ[d(p3/+əFQXX:Wzc}lEoE88E3pv5\]˟w_!K?G3BPqJEq9J$l 6zϓNb7qSLAiH#Vq%QA p6bu]m8 jG;܇ "$ J "r ?H asC1&)1Ud[L2K=>>)cGq(d%P2(Q2 d;eiUWB !#1C;N3P2УJ 4WdQww#_d)F#@>h dZ kí+pN^qMXxb-݋3P2УJ 4WdQ_տٟ?/O%Q=#. 8*` bLApi78\EeP 4g)z~v*qȢj"F.ܺ =FdKS3_f=BPqJEq9z ]_j|g[~bey0о~|4BTQbe]-&b-e3_25pʔ BnA9WC᝺<:P2(Q2 d;8 , UF 뗰E˧q t0i^ Gbl2aHc.mP Q|iNr)۬΂|r-|Y9H)2&(S2 ܲt;HlŜ^i"L% ES9DwCU(D(d z~2etZ΁3#.f|<˧xO/!0i#t 4)3K4dsD%! CnAԄjI9s ,-+ (p\96qj2DCU(Di d;8 2H[_PL4X瞼AxP  P)*esc[_# M *7d~Lypw"|⢔ "r4m z~e=aӬ26U~~Wܢ2] A װ(OħST;2eJDS;hڦ"DdQidP3)N .[O^gE| ~G 4nq#l_uYD$P#ѣeQ`k WTa_9)MoiʨP2(1-#y.Ӆu a2=\] XTcR3pg`.bjp4#βONAi-#\ڵn_YF  lڗG;, p~g^|؋pAErb?]k) MeP2(1-4}6A a2c V-@b\3b?hS<ı-Ŵ74Bee^Z#?>[AaOwuf'6"ń}4_վ=aQIuJS sڭaQyzT&>y %2"3Xo"QHj> !>5[> g| d(OJ:-7;pS3j>\` aXjFoojCxр&%覘[=N?AG;j@PqJEq9dF,Blvp`fJ/VQl)a d0<_EfT0{(F=OfH #x$:TВ@$M!έU ݶq(d%P2({?#/ӻr H21+3 VgX -*X[>MV$H ;@v(d7MQGs}nfY|Qi| 9S a=K(pC2vX ?Vix:=ӣ0TyWհ};#h;w\7L+k[=N?AFWz+eQ\ +V^":2ۄ* "r,Nv~q6) |v-B E8^nzyytٖ Xʧ)NӼ Btkxel||+䵰 e78zâ b?8Hi!dve00Dn/S,xPЌ3Γ3x4|M)!P2(˱iPdP30A|4.,3p+d9W];1*@vHA[c<e2H~9R|?)* "r4m z~eӬ2v3.Ai²Ե |)^qdsk^^^h)K()g~M>G;e'-Ճͳuyg`sV dl14WdQc>M{L?ycc:> ^bU?҇}e a2 5z~2v ^wHsGβ[oRKua ST[0 `wQeh p`;J `YM(M3ųg Fj2 J61t$U@PqJEq9ӴO#8bU?*$l [ŀ6"Ц#i;ki;ʼ<9S:2-- O;/oip7}f_@3rxdXl^Lqt 3 ެYj*B (.|^0L)=82yNCzӰ2N#2lraQs-[ٯͪ,b A6¢ U~mC_, ;pSײ qCⅬo#z}Pm3K2/XZ/91ɿ3( krhEDP2(1CzKzyMb􎃖2%a-}LGi,x-K[f 2ZP3s54A A6Rp(\6eCt_t4 X>QD*6Z/tt3V[Q< /e8=o07z~v-u=0с$, [6}:zekgf3%ؔOy %2ӧeki;ݥ:;e,n!d;,n*x.EIz;el0.jMkAB~qq-AvP2ny %ϕAI9//#VSl QyDI`< J v-hABLۉtM|O)!{* "ŗi+4;iX恘,ó2qdfFd^_D sb_& @A#?%"ht baCwTlt21.βO<2z~+qk O;RLݺ`ٹb%|}* "r,Nӄ!d; X$ooo]qXA^__ȋW///x΅: Xʧ)Np,nJhy`dLO;P_])G;, t{G)nGKoF ekZ;Oُ`ʴ:x)eby?Wس CU(DilgH|5`S&.SG\hG Iqw.L qphAҸ->*V+_.h欰)/rIJ^<2% am^(۷1xX}d?d3C^B+< %bK] Ahy:Q2b9rX;Ο#;&``av%h\VMXdg/ _}dwS__MQdOx~ژ;l?|Ap i _3#A4$3gn_,՛γ 4n 76t"5 t{u"mC !X=fvW |[NG溏hlVD A6Aځ5zL?3me Y~||dAt{ V~M8,m NxyyɊ'gYOZA[kr4B>*Fccõ0pNe4d!`~'lv όlOWYuک ,|4+mx̋eWUqX OswGB1\BhhY.=c~ Rv*ScWQYd;[_y(6G?;)NN>:  ֭όQ%ᩓ}Fve4HA qVm{?k֒4^:Dk1 lxU86VxPFA^__c 2zClaD P$VL-l*nn_ah&욥 @;)aCuRU.-#SN6H&|]9$& 1ǼXvY~f` d!`~, *YU~e}},5^ ZW +EB+ݫJ$3A99fdk e=Ńw [lQJ6SS3A|DE[ca|~~.ϙ}S1D Qii5_}LxW`̄gJI̔>%䏿nKw4Aڡ`n٭xn_l V{JK?SyxLum1^C1(ṃ~ :\=6I<  QM9>??w6s; [jP= i2diLJok_^^=s4Gz:E<ِ16YH(ҒUU{F~6x쭱A05е^VaC6P1XABkf;-(v[2[K-DO4h^@>hN=a(]EHou^6 L+ljkڠEIqY3z$Ժ:i[/7S4;V<4 U c0)&+NgÏ`yb\H;WAbnPqX )D SdЊ\M*5n}PY/,/, {iPp i _3c έ9űPv:rGV~ rw EQYcYZcj 2Պ١A}UŘSny(6ixi1̸ TԥQ?:b d7 1///>j|~~A4k6H5A4ŵpE A6Aځ5zL?3b(r>q~)dE[c6H6݀ʭx跊7-K Or4Ț0vDW1o'4(P8l؏4oh6H;˻w]acQ kB+m4JPi(x尪`kKyFUq87Dk(0T*DH=|3vM={v^ڪa\A_,H-/l fCA`?nAnE PfۢW3A~J6=c@mKhvIaZ<ڣ-6ts zv\yYQcƶ=b੍YU٫w}jO- P8l؏ RbZ<ђ)r[{lsv$#v.7mݖhgwUv45o}Dç㽺wU*B3jcVmԣCA`?Jр5$n4~U<0Q|gj,1  6Hp1൘*OvwUM.E= 8<gۏ\=CA`?U|yޝ/x,ReUxr[b->AZbaRLVa!줤YĀvzW[^I1W3dFp eV]Yք/mA#O\Yj}azD[4Jmf`u r~f` d!`~Tmr6H:hYV:[ƋD6H;R=_OAI= 8Fp eV] D3s/NWI_I pDb2u+ͅΆO/ˈ rzL?3APq 2CA`?4 6*ޘ m[])5S6Cj O e*̚WTZTPT͠Q|#36HWӧF~u<1oA[C]G<`n*V?Nn$}!%;z!;~un9^'-Oy@aC]fMKKKT{QҫM1̸ rŰgn8Lozy cQv4GF ;/1̨ Jͱw :孝N'~{{SK鯒GWVEka҈>{q{ t~XSvcVm퓍m+,4Dc>socf#hث62ux.EuKgo|Aek{ugCA`?vJ|1 tAd~f6LiԐZR<V6HZiaE,=aBHsWf^lZx밁ߓAZj'[nۛbOoAG hRU@XB;Z R7I[os:q&)QW^8W&P8lҴ cQ q /_r%\{JuyI2Ay C!bA,19} 4ԏfW,UZ^>{ K]˦X8E5Eթvg5,d\CA`?H6H;пPgFfW>Ⱦ\Yٓldi.=ܞ˜3ƋihM򏵌EħxPklĈq#WiDyl8O".T\c|ITM!C MO @@= n+8MFkc&7^gTЎ%(m r8 1!ZA4 i,FAtRJgh8S5xjJ,+y(6ixi1̨Ni|̒TR -  -j!bVamxRvMWgFiP]dXAWW?vYb{1=^.@}!sfj)xc΍+1 Q1Rpw0Q%>Fũ:ϦΪ Wp<{7T8?RI.vD qcvTS)>@A6}gqecQ]0RI%eZH"11xl?IOSX5:$;%*snzi7-5Άk^kyws juZmpk~ViDU)ZbfV{E^,Ϋ=e,4<'/:~Rqro r}m;5ʡgZюf粿?ڹ|砣v"sQ;xGT,lvjl`ާ2=hsi^x}/ xF{t~dyAڎzL?36ȍR4qU(P8l؏2Mb!J44}A++f쮴AF|ۇ7kP,?&\;WƝ?D;! Pj+P4 lV =z+&s)55>7:V.i=lEW|SfJ a(us.E Qi?k,)z%m~)UV*ky94%q/PA PjZ\+t"qJ͕cf۾@ 4) ¤A߬ È<-W 󻅧Ҝ =myZȹl=%tz1z_˱A!_ k K۩5lV(7/ APq 2CA`?6HV$S/?N 2^dUs6v{+} oaCiTCW~)mtK=jĒ Uĺ6H` d!`~6Hu+l̽X@ $}-/+FU>`zZA4)=zCT"r.lvڌeFC㔼q8Vu6H#_MBγmеzL?3APq 2CA`?4 6*+%>@mJj k TQE.NZ~8QyYQGy~c˔6H;hT#sˑPv~䐨vO+̚;~fk5{fcl3MGe_sl]p =StM;G?+Z?Bv5Ti|Z1[e3MkQ%lvjZi4팋8kp]J7Nu{/ZcwzL?3A}pmY=6Hu첲i<cQU5Y*aKotzL?36eqSlë-t97tzrlLvX%r'-|j)q;;oKg1K>2}RT,:UE˂BrjvvaRv 2]:6N6ȏ2+9+TԽߑAaeQMF>&cQ Ǥar^F>'jK5k)-O_ oCٿ*>QM[W=&ٶ7^}M1K >z_J$|iz+?5Jb~#Ͼ3R^^^<SmͨvxI6+P8l؏ltAځ5zL?3J$ qe=ʼ-[;5,$ qJ\`=pO2V^XAmoP !1+ι x۫l`Ub\j(mjte˚cl4mef}K- w .cVm8i;,x,<|45Fy1瞍hs Tm2An`#TX Ј S~όAXR3g"v{ZW˿3ݨE=anc)^CI3 L"/%9'F{r$F[ R.w$l`~iZu}raoZP)lv8񎖭pN>TncQ US3V[m k@LH6oAh(Mۋzê uhCpp*'j~Nsm4Jjd.P sѥ6!6wp A^~;zL?3 Zv:tUZJZ6mr^4 Çc X9wxmoM=aI_?,S2x=Me:o,\fk:y(6Dz ;W^LoX T1÷ܣ:Ս7نxt=QQxL۫g>uYWYfDW)v6_ȓxqFHi)VLSfR'*'lA |B{Yc 2zClaD `( h?j5p%>X//3;WVo$aCiT{JZF{j gqEe$1| R^c 2zClaD P$fd>_I QlP  id^Qq|w.<_aC=Z$АIc['VUUUm{G*˯Atm{E= h$ È<ZQ )suAbckk9vwqeR,U^6MUq"{ PW"JX[ߗTكeG=я/lk#am ~f6 xWM=!60"C.^}@a~NOmy5RxџAW_Lצ2jzL?3 3ZPq 2CA`?. 4]ς;BsdtSS|Yj6H;l_H5C{߃3cmKⰢlmh"ebcl/Q SzC\0;9 qE{ֈSҴpb}Em]i5 AU{uzL?3l&w5P Do$=Zơ%/0< ihN @@$yzzPr64Kѝg_+nN͠J^ڣwxF!&A`?H6H;п "gËf6mk|UA*h^C 6 A6Aځ5H?lha!U$3:UWsa'y (ӴL:M:*Z6H;T=*0u ArTHA?zzzRq 5U4uq l؏2MeV^dbƻGaCٿ*3f ~.LebR0LY%?[Ne!4@ld9\6]ңAa 2W]tM!&A`?mwu`n| j=4mZ*ep%?5mU]^htj  6we,V<ӤLAt(E:n6Výyq l؏9-ۊS,}O5g_=?NWN$.5yY*lvXAbbXС>bxaRu@Uݱd[4@y ` s6Ht-Rβz>~|U:f = 62#t5+m l=%A2o6Ȝ!",qH?Aq l؏$&V)Gd}XV$_Z@,^@4#>5U 0g(}hԭ6H9vK,tH?Aq l؏ @bzl YeTYA6j?ʫٵ,#5L|gk0Aa!gCHA;] e@6HJ yAM!&A`?4 tȸ/!'mӴXHABj˵<*j@t &21 K)bvXjl ˦*` e){Sm[LZ>xi^|}}j:5@NA`?. ^^^F];|]B QɺRV`]oo@1u^D<ګlLJ}ǯz7AF?͜m ^R-쯀ϔ_Rk=G!&A`?HTd1P p bl,gi@$jP\ExkcgSt@ 䦇fsj<3.t.j 80MC; _hj _%͵*t:}LV;ҏqb!=OZ Gq lҴ 4@YA^t(_, jdUGrtlm4$^# 6 A6Aځ5H?/ q4 ]l;ۛRyw$ƺܽh864mv~BI{#a06HS+|H?m1ѷ}ۆ*jĺW Om/wf-u Y1:ܽPU 6 q4oه(Ò'-4JAu1_X6HkީEM7OeY<53S.5VSd;cKHo|˚q l؏=l޺3~ӔA ]S U-O}vV|;#, 6 QiZ5ǽ鉛vOI'tLwz1!>']hԴV=v S1{'lv("֍iҁ&n6qMTW{:NfĥQW>JSsq l؏2MSR6IS•X*c<|.%n@r=aTduL%}Vk;A[6\9kҺl%aCٿ,,'K ~>x1,8ޛԝݟkA\Gx?@y . 5@ljcb=el;mm7U'D~moy!ӀbF&#;d $lv s˽ujgIF_$v4knϣF;j86GG#Cq E͓Bs3kT6)!}5 {SAB}RI:B6AF;5$^p,e9H?Aq l؏6H|ګz4#7֏h 3keA4k&} . eJ36Hػ v@Yohsݽff @!&A`?m r$}||hC;=.8pCgtќFh:@57 mjJ!P5EE bhǹGOS̢8H?Aq l؏J)Wt6| WiI[lx؅1FREz>FUUҩAaI3Kz/˒)6Hr^毊)ʯ-./x0 JeE (Ӵ{I{_{ˇ>AuVszGX 5@y rcd{Z] 4:~_&in~CM`~liz*J -qTvG㱇H?KDs4gye" Ќ--@Z(Vi4@le]'lv Q&Qxӊ彪6b` i _h3AT7x ta` i _hAAQA8lM6/݅ r_ (Ӵv{_Ӥ㚉 2H? ?~pU=M1Jq#?ZP^ 6 Qi~;[ww5{[n=dYÍ l5OWAFdSwp}C?H?KDb%f%mmE~k\ U_5J]4@lckGJ; 0$;"~^$6H_hL׋gu43ξ+ 6 QiOOOׯW\۶1Ww+6=??Zkl6Wͽ7jy?at?M: Rc=m~j it[uՋMӓV߉ U?euoxǭ j1⶚An Uj (ӴX_v'֬S>~ofQDcQt%HWg׶xsߪq|: kC;;_-y?-S_6H;TW:4b6[hCBG *tH?eNUE XA}5n^:WKTD+UGyBGwhDvU~gywZ=]vެyc3A!_YRK $;JEAЁ 6 l,gX? o˄I"Q8Kٖkɠ V)UlP6glUǓEΝ7 YҔӿYI @!&A`?nA|CZBm8DJm6Ȝ iTGTT]O\1j('{鲡,4myAA'XA☟'8 {hd 0^ "C@ Lehf q:Dl4NWm02*{Tk ӕo{EV(e6 U)sJTiĠBk6EZܮ 6 Qi^bx{uSc_K5ZNc*%jqv zJ1*up?Ƙ$T]-B7Q)ǞKOYGT b߉]ݨ; gG/%wzk[|h86GuAϭlT_<¦S|NZ~slv_X}unmIm|5@l.6eiݟ{)׍ _{4@Y bqDѾU$_N4K| jGG8% 5`O3h4wAe  MO @@6@1+m eZqZq lҴ _kNu TjjG YTC$Cժ6HlxmmCPe O pe A6f+k\lI. ޢϪ E^΋/+hZ ~,R,>u팃@d5@ 6  2AKOm5@0)ƫFm V _WaGlF(m_~iZR*yHLm[ZKz~Y5hɲ'Qj]rmԅCM`~۾[`0C fȂNjTˋPcKWWCj60vbDhjtQ b1CI4@lG68 9OOOq۩6dևzZgi4@lG6OFp/BUls OOO>Ae ~b ` =lhJKh U+ ^i^k6\Ol4@lG6z0EU;TA.*Vm4&///iCGeO:-kd 葪 E^΋/+h Οg#hg"dZ'6 6 # b|K&_B#FcH?Aq lY 駽 6 # oAh?ov ]c`Hi4  = 2Al@ 6@` lGA6 # 葿/ 6@vC@x4AAlxAAlxAAlxAAlxAAlxAAlxAAlxAA oB!B!43 endstream endobj 52 0 obj 139799 endobj 54 0 obj << /Length 55 0 R /Filter /FlateDecode >> stream x]n6}7鈤(J@`lO]A`%4%TKA3Pucթb](ʓ)Bk?kůnoLQO9ELwјi1>ܘ_?”7{`BWg~qKzŹJ)9l+JT{EBW4wL/r~7l@y$V%)2ETu\~?jl!ϑjvV9-؇Oj躞:nb&`|Q{AxNUc5!EJP\Ԕ¤s0h(mIL=퇜[Dk^D8M2oyK3M6kADbN:p .)D}ֳQz0CQAepD1S!5! Ɋ}4PQHo^q/L !b3I TN;i68i?"xwq!w"BD@(Gkft)?(2vv_ N6HLA8#ĄDkבd3RΣ9 oF5y @4ڦ# D( 50a-lWtיn)Nsy>#PLJqn}uW7bxLr؄J"#\B^0$UIBU"493x)3\YPX DHj};yqWlĀf= XYTc(,T'\SAՅ%:8JӀަ>ߧq!Q$J7&(##Ux3x]ƴyҠB\#bp m/k-3 ڃ*!b9. ʊC-JO2Zktetb qBěPK,]N|^v,*fl7ei9  %Tx8*.U `8 V@;R<,EΔ"h/֠jEf[Z>^2(}Ȳ%o1$(qi+O%U79-uw=|ơ@;GeU\FaSuɽt-,*wU [[VARb痢 5݇; `&'3SЃ%ru}aq})EUylU^d ߲+9@$R#o/WEUkL;H5s4ִktY+WMڨ,:;?~+E'69x4M'Eh?0aX۟7L?~ok?O>QSQ܌5J[HRG{*ry%y"MT8AC8ñq$TE3O_e+*O. lAh =gms(mAsƘmS[8 P_l93* \25M7 ϡdfku/Ml|<öB+&{ c6I78c½k/&qB*?},i2x,N#eʄYQt} =vg[LF%8ϩSU 03]f_;H#RrI#Ac%5}TL z /]&E& IG 8qnZS&e}׆]GzkYlcKZQ nPr wkCMVd9K^ ^+d^58ݒm|6dʌ;TayLgn~vƈ;0zU?cUźFqXhYf}FM':Cx5"u@vAR| KLvW@aMLk{܇x73zV}4f\Z~.>~2^X>%iDlS.aX{78C%>8wod_"H}a쇅zXpTnx!={qlIw3ݎ^ !|M]Y2^K݇?VZ{+,PM,"3q8'm]#Fbn]Uw<M9_xÖ:._X,WcW>`jNZoC}^`BmV5]$YZ csf? D2g2 Ϛ0lu81x{Sx~0:c6~wh(G jb9@7 ub,^/M[O lշ!X+&Khi1i5LA]赐E,'h[eFdmʖp{-kw >ފ.-PB"ͫO(bdwp#$Hvah Qyo<5vpviC]M=7OVM>9MJ{Ì\gS=+3 x,M/z7Coaa;xStGrĖw/.> stream x]ێܸ}`A#.byd|@_CM7%Y簺VlcCX)Ӵsf xTHu3' a^`g{km)r,FrqtS ̙\|޳r5 i*>d8Ap%gJs´,e:)2 (<U25}qeEw+E\fX6NMu%UH,6Bjb@@+ 1JT|\ XuK U&*A"V >92uLE uG&FFu50u!VгB0*lOѴspڮ -ds~k#*).)cKj-rBfdZ``1(fg͓f;2%-G+ bcZ(̂z?AU%/*E6I{eYB|H#G%uPV"*7 5Qխ/d$Dž q RP34Y0*Lj5D> v6nHz܉Ѩj6D( ȋ\3H:X!HyH7@9,L7d&]}|^? b:͚`~2m9قT5#m i!c"ӄwDp*Irň&lMK#ʎ )yp:e(3jdDž质zVo,toe+'I2BdZ[Z5, Yg?=ڱhTPb,+/z u&Guze;'cdf?ٍ5_K1W:0M2po.Q]K=L 46j&OA-[#z"pD T9C_]'jNU$dl*}u+BH:ȇF/UVl+")5 cjtRڑ01 YF JW9 Vv$F{.A> M9@n?%B=X&BMڦ7YBBMpuƓB2!F,+̧^_6ڈEMao3)- inȦHZdϭ ;Xp]W|fpeX&!x4%!r#-Nhv NW| `{) e46wq\aNBEjHò  ueng2P~!fy2{rYnp=iduzr< c0EM=<fϑwc/BLr՛|2AǝR?>8C"sqgR?njjlC*U>i  Ҙ~t!HcMa#9@FsZBĄa~Nw6C;Mpc`@W `XW\ᷖU{րc%c,hJhkZ4Gՙ@"۱-ȶY˖p'%7,+i<#^]Fƍ!]P+>pg qx"$HÇT)F^`5upוtaDZsua gƪG?5^mwl7 [~i'qύWKs}&9c|߳C׍&U)JJŴܐ딴S16Zp~kOendstream endobj 58 0 obj 3004 endobj 60 0 obj << /Length 61 0 R /Filter /FlateDecode >> stream x\ۊ6}B:X K`nMI6~vKv딪4MȰ-n:uT75Amtv:gۇݨMo1S7աQ덋?a(x~ol|WV*h;P - ^V->HZ8Uv4v,[]MUߥn$cʱUm ;~5K>Un=EϽm599VoI̤c|-ZJC2m 'C{=/'p4:^3;h˜`=K-wƑ12/jÿ!+:8$4u-c릃^`Cut&.<|{섓) ,t qo'~0,bFkr6DmY)O2sLV(X p!}ILvxb=S"0AJpD DZ;h'e9IYpTyLL F46,Cyu AJA: mڜr<=vrN] Jb_Q=h8"oIBI\րI-F-;ܗ$6J %6FA'_%I4QqU% $X2WёYu84JŦYt/FZµ+Maz$yt\zD]5%V3#OVNB/DJMpPu^F9$> ;$d%xʢs-{q5ZABsIYY"N${|}!I421wU唐H"[bui.s`Gy]d2!ĉE.j9 Ut_̔3Cj %-#9^ ` ;jg%r8%*Euq|[ YiY>p1djo~GxmK%_ `tdiT)k€Tη]]^lY70˥C `%Wʸd+Q{xCʝ\kmwWBYIL6#W׮'GvJM߂^3w ;%q0;ĕ{Tx:n1%bb(xDaDE)=ticLID."0YuA}A3R271O}3/?x?ͯw~#lۖ%qFPB# r'!aY  Ɇ-枇S0}{sD< zD"$Q J!z|`At/H˓=LgYjd> 14Fv~.~( mveI3ޘ#ۍI@>r^ɴũOl߆gˡ̩3Uy33DKVf<+*>Ulbg蠨H}DGS1]\nnڎ@ت8o|>7Fsendstream endobj 61 0 obj 2081 endobj 63 0 obj << /Length 64 0 R /Filter /FlateDecode >> stream x\ێ6 }_`:ղ^>]6@߯53>$ztdȖLu1ۛ|gvI~[?6f ӟ7.\SPh.?O6O7߿5ӇM?4OġޚwcI;|x,%&%~KݼeE _'Վ%.b_T#|+@; $tl/ܡlC[Uq2 X-j=^'b71Zijc}X[ٮ癞v渧N=:{qWKԓ}sh;I"OH֡ukBt]wZKB=W+ y5)M)؂muE#`+B S- h<H}A[ϖ j45=ຓ[D"}uݤnaN@`}H$&_'H"D@iL9$/ tQׇRvde5'(p4kp2y%QZ`ɚ8+"vV(ЄCy;pD9_XZ履-xّQ]e[*fFD-d0ܣܳlh<92:?Y--LP,R3ӑ>glꇚy'jp#W bH{Bѯc["pX wN(0/8A 0y@ !G߁B<`y8 |LpпG`DVv0!QQ[S4=o88^QAt453k}P0D=ܥJ*#EÝ(طL`޴578 bk"罟L<=X]EqYM]4o CYHLaE\aAHV`v>3Vb͑.~x{P0횏Mn~aHqm׻ te Wtvloc$4u4 pHd!z^e7-ZHE8 렑I.MK>GG3^o)xC?إgjO. |r|+̳̳}zI̜y=̥|1>XY)eU6zB~&9:K6RA}fӷkR#S2؄endstream endobj 64 0 obj 2179 endobj 66 0 obj << /Length 67 0 R /Filter /FlateDecode >> stream x]ێ}oA#X,==M$;HvKVhmc6ESWLJeSqE VSW)_mmm>~:s뿊|u+o_<>4kWݻ+W¦4+~Ӿ]O+oRĿ\8n|f8|<-i.7rLKklun:~|78ws5 @>5gڕiOvqfx#aA P^a-GEPHaݕɹ/Sa|5pUclMR46@c仑sTppߍDW ]fLǥ UK"xDO79^m=Zr*QjR@v>EC _){FήsШxk J #IgF̥bѤ7F>")# ΜvR[pYഌVak%y% >n|=Sd΢>un#8*KC^2s9Ib 𼄷 .:g(te*;~I,CHq P%Ef?|c5$#2dbh=22A[00HqdAR-gBd.|>gp^Ee镊Q%gdD$d;0jxݔ$ޥa]>Ź@. AI%ͬ $^$" +eWT%2n ,WBCXZ䐼oʛ觮o?E`2~{Xӊ`bmOB6uǼR4oR`ސqVRiqU-3[l 6W&v @Kd΅46D :kU,z^1GqǠm\^Iy ]~>nhESu $ jk<oҁF#_gXQk x ͉uK'4vT!"J́џqTchpy0m($@q[VG *- @$|mpN\Wj)UB'mkmABVQm!4Jb wex*T㙭]`,N*I,t&.5ippkbDܰ.gI)ghIeEo) #ޔ%ݛ?=I[QhpOE4xU|@;_q cjIBjcbo#Ov\r.WؠՑV;]ks(Ӽ0nzHҁ(ւ)OrBũWa|EWh( c!^]NtN.Z$)5/85E >\COZ^ky+֛@B w7p$YXF\ٰBe|:/ś]x)%LrBwl<#9|kKu HsG /M22u;t %![ z.P:f-[i*D&-H|f5$2"&TſXՒ0=K5^샭h`[ e;#*YZސ`3HR2=𻶸2+LPbTy;oFc I`_b|}X>v2Gaq3  41~_nfo(EwkNa8hR{eH&|QSL,8fM#o4nɩUKѥu ]1L~g; <Ƃ[,؂] b 甈:nUΘ.ۆϟ2-QjN9}I$sC3p ##Ĥ l6z9domi+_&Yc xJkԮؒT ׼,vqŌa06|ǴZTh]O߿ukAVKޒAnZnB ;fnu3A'n1ڴ800ؖаGAo,őli%n楤j?]U?^Xۧ!^?XV@=nK^ݵsnx^\+{F5m^膰vw"Bސ ݅m wzx3 endstream endobj 67 0 obj 3373 endobj 69 0 obj << /Length 70 0 R /Filter /FlateDecode >> stream x[ێ6 }_`:ղ^v~@(K~=<:3 m:$II7wNtIk~: ;0LYwZuO{CO_{#f7䑇y<;!<#Oi8NS}6tZtfлHNB - jH-ݝbfu0idHo3(aB'yt6;MIƂ \햄lWHc"9J\NKLY%kÙ{W/V?jQj*d!JyW39 KzaC 0lDrOX*lV7;6C?yj;$b]FEP.-'ƶ rLD9V*q1w*uԵZ]D@x'dkU5tFQ0Na2big6-rd_# _3a"}x,>O/, A.n,:b! | p \!5¯2cUfs! V1/ L,M͛RV IBs@}m5I8.ۥ9G5K;uqRqypnX@6f#%Z9^+G s d˂PD]]%Xc? ^G ksNX[&OR}hP@lGDEpk ,H  ʕzOQI"*0:Ч͉qES Z s6[ ;V޺Bd҃UE鷢|*"8bnI4qG[8+K-΅WhJLge[|N1̣8R07+Ņ:"R:jb@+T rU}z9Vh}Z٪*:pE?#Dz% '2ǘqLL2or i;"mF rM4I`kZb[ځ;6em")hfm0FbUЈz-=!FspS޳+\qźzD IŰ"zZGQ'+( 3;ԛl ;nbKZR}v D6"w\s(1B*s$3P~Nc`ӊ)'jr~mBU5VWNc 8m}`SBr SJ~13.}@7^(Hpm"v]R U\zBFw+,>~#~1D2tn~n&Pغ[bup2 0:y>`Cܟs!_ ]Xd&X :ሁtb"B#Ri"{$ο`V(뫪\0lx v̎j;Oƃq~Ua<.$&s.) Lh?\,@$hqM+~ T82YyTl|B/zj~}R)Wendstream endobj 70 0 obj 1619 endobj 72 0 obj << /Length 73 0 R /Filter /FlateDecode >> stream x]ێ6 }_`2$_nsmRh 4/3#sDm32X"QERgm1Y2oLo}Ζui0Ec6e7df?}4ɳ/ٻwez{ _gݕ#nL6?Sga2iԻ+y{o3 c+arԱSe3ݽUU(C{51oO|Fӑa U7v޿ ?<Ճ9?zIcGGh(0REs|&/0yR{me6)R]%x&% CQl8KwH%J4s8p.52Ʉy ?Ut:@]] 0`ah40Иj/X+H/*5"2pBQx#;f81NA?,_2rl*5"JfZGM7($Ӗ j"H?ӌzi"=fDIZӬA;(9E#_ Xz75LiéE@1"XE]aId5Q9MxA7h¸.j2 Trw(ɀ<fVQ/oxOpj繷ڃC8gaɭa8y pD(hldg'n{c qtbf.(  @#Py'Ռt!؋BTfc(hn&'NIp<)rJp#[J6\*JEpD%F[D B_(E`1\6F<ƅ&5xCG‹lXKp#J $Lba EЇFeȵLFS ds60fNd:-AȾi7lA4#)TO i!8T"'77^OB\ lȚ)~^9KdrSɦ K?0[ ^eI8cBaVD]`3$ []nBgq)F#Z~*k`CL% nCTJ%bnA-DlZ d[8/ (Qd@GyNHhF!f3 jJL`)Ӥyh&nn;C:cy 0Y&]݆RVHkڙAkl(xd@Gh ;N:@XofTD4q:k‹[1f_kDHpɰo iW9~DJpMkN+C5B|`.5iݲwSOP+DP*@ iqk@H 7w{^Q0 w . !HX7wq7w1 Nq-cm+8& 5t; ^A /Ќd\`Tu޿bu3q:V rHRPͤkr#SMS:@)kUE)PW<[ya5(j6€+m[u¼;EuB\m|S"W'q;<״qEĂo4a ^ȵ qRbaª{!`5j8Vup`4 5 B`rF> Uv[ @6 tV'2aV|T H#֩6Loi 0<97zdI_ ˨J]%ޔia [t/ &S@WLԇߺ@{FufMx}_fo󮻯Ym:ڶ0$})m1-҂&}HRml F5+~i QـWC(`]G*M>!h}A_^eaKp5mMok9P{SETvlޫel{ږBO{F﹦8=Нڄ? !p{%{ ߳&9AyVxrZJb]|$|2L>endstream endobj 73 0 obj 2912 endobj 75 0 obj << /Length 76 0 R /Filter /FlateDecode >> stream xZ][) }sf+U+Mݍ?`T+m_r7̌}V\}lV߶VΨ0Sw2߯_Կlv?l7wVw2Z>7t:|nZ7zZFh2wS PF$7I+0 jJފ(̊ӧB"~DQ?c\|aNL&mqTJ2ڨ 3'΁8nM~cg o2WW=8} DSQ|0(+Q/ gc(1\GmdR)K9CN~dl%}7=w\EA (f{Խ\nFV< 9Vs5՜gۑ>2jx^dfu5~*X(aCbЕLղ~w5LWLh3sЗ)< WbTֿ&b~c}ο[v 5GO7 #tC;8e3TIJr^tӜC1@ kD}67]ekە!S">ٔ!#2aPdbAЌ=ygF[ιA%*!dk!c.a=" @"2xD&PxaϽޯ ނ<2P>3MAe&S10x"LdCޓI35Vr6Q7xE~l K ~xזbעZz KwBc; F?Xܳ72݁#x"{絙`G.-` ]1^L"~Fɬ"1 l79o}?ަ `nVv)Ŗ.# %C7ꑇ)( ɀ,p"J{NC) LA$hE,/ACqtF,GpX'DV<(C>O쨗9}xbFOs4r_w osO97`A!Ϳኍ&΅|u˜9ɸYs`cHZw'X u: V`;?|Pendstream endobj 76 0 obj 1317 endobj 78 0 obj << /Length 79 0 R /Filter /FlateDecode >> stream x[ي7}gC:ZJ*0ٜg' '8#uTuUnwccE>ۙ]\;onolg6c޸q]fboS;(y7۾^_7! 7kJK8Cag*-o-Cb0nڏzwgka E( 5(>iSR[I_a\Gōu\TQ_f]XZGNGUN8? B+T[97rca #j"z{ffn$'(_8W4vŤTehLn,4-K hn,DS5 H $0K.ʄs5] {hI(H՞M.j8؄b/vsCPo $b^~MM5(saCU jd?0@΄M@*\Ņ 4̲Ǐ p2 C6gYNLgwW ު OE?[եHU~TⰗ0oǃW'V}x? @@51yh0n=J|?o$,ExK2%"{Yx+cN w$zB(_k"N4r)lBKfY:$BơEtՂ+QB%E6/{9,adyiM7dlFnNXаzbwN/A0P7dL.` qx ϶h^oOZZeoPܻ> &p0 js ,ɫJkowB>dt$_~N }MU(i䃙ll wPy$hmdLQ*"pbx[D )l0PԆhLZHIVc[O(VGiw4ge!k}yO.N~ c:*/֏``D~4> stream x]ێܸ}`A #(cM$A6@e?d˺NH "UŪSJuC}0Um5_YO]V|}/s?0 ~zܙՏS'wh0\0^y8pŘJ]qnWx+8u7+VFvoq\z'M?WDQVҩQn5΂ֿ A N\uyY +J?MWt[eڎTqma^Ik0aO0v;j u;覞/fUgO̠T\CC8û**s$06WfBiS~3՝)Olιɣ% "h޽,Τ*kɚYYJdX+ypqCNϭQ&%L :&(8D٥DAqlR<>J mB5@3^`$@\sTvf>COh=2'I&/zZa !(<6/.d B >$[Hw<^]X@nV)k?:ĭLɫGا2x}Hae!lHb})W*RK2 :i h s1 ݗ,3aGaڶ-Rm]K .S` Dq+cm]mv0!"] mc^\ V D^:|2j}JeҖ{0` nfSA^'Li'\ތDy-ՅVבEO&hfЎxudF' 1 XH4<,S޲Vdc_tF "V8]XOT>xJ2 +Py5I1BG-z ] 6}W T !Z0.L}?| X3+6!KH?QPZ[IWVkWY/=A4h! eZDmJv~\>5`(Qqo`u{8E"V)lO^ۂwp]^!K5b$(d} bk 2!Icӹ gÝaT=!p"** {Wր.Heʰa S+|Gs:g!asÒTm=G!\|*MƭԲj:mK18 5ǵc xUvw Ig`JMI+g.OIF?ƾƎipj#N81g̳7%¡ μT?9R!R` %ӏW)?0ZH$~lԝ|!ط7ҽ^awop®zn2)PʦvwכldE!&]J]rm$`CyPGT"IBTDH*֏5W̊, xNE9Y\"wxVUxX S^q8Pa9w*-Q9懘d0[U:`xnίD9 De7(w]6yؙrMf7}ae~9BeCt}KU?*H.֛#^*DN~WbenST1)dPA7O auMy X?g071N{uƨS1KɇNݮޝb"Ϡ22^/-r0[^Xof:xotI$1"st(]gmF &˾.}&Ҷ%Vŝp1CKQGd6(+s ͤ+NGMԦc@#g,OILì۷0gf'уM<7 o2 V%+tbYш01iצo'7Ive <ΊW=LL0wS-x_is>BUTDڎOA;o5o@L[(e9yڎ) ְUI7M`Pf0uXjT}z=nEI@[aؾnx%XN6! 5O> uMM{黐r'ӔM L9܋j;~> stream x]ێ}AlG$ufgIN  mQaP{܁B6)XS⏇-m~?\Q>vÿχ~Ev}Vnxc=~D?L_\O_][\C3?OÓzxqTx ']߉];exGZ> ӮVe /)݊qmƼ:ICܻ UiT^s 8 g꾚;N}'>U3t\NlAOӪ0wR<3ݧx?@VY7󷎳bs_Qa|d H`̍dXck ə|7iA\rywӢ g'J. OۚY rpSmH3k|hB8cba)y#iCKNkMs-|WUj@ WJ <:C0% #9 PC4(HdORk0`K#ɍtLIz?F>VYm5f8kgίGI }X+oV lu:z@LDA.(4B۬u0?ZEƎ*$Ī VD[1&$&9^ :SЫu($r!h/K: s![ \(UXnt#l'VM"- *O6~4 !s#AJ XL( W SM]fLIᢘvbڵv0h\iBU>B6duRK9"BZ#rH7]0 e# -"8veT[Y'MVvpՎߦ bnZj9^ICF9Lk<;5GFZ B:%“>#u 1BM!jۊA+a&nb|a*+V\ ڱjY9&H`҉iQ'aDB&%z!DA%N"[ay@+ޤ!~&M.4lxj3~tc -S u*D vDƵBtM0xMN(A(m )Y{@dj@(-1r\lDxQy+ 5i1tr,JjXꑅ 7[,B?T*ŨF:aXJG !Ļj2`Z7Xccȗ32D'i?GJ6+;}+ܯ`=RS+8 uC3L%dJ]WmuvvȅM% 'X|O[E 5D*N08AYoa{]֞N.֐ VZ"|3r)/)]Bp6Q~EajA=/:3ahha3V:cl\zBtfv;Rh-yJҎ²MTػjEj;"/|ڊ,ͽ^8ƑgަE,/qar|:$O^A ofQY7-EoP(]<\/$;R֤ʵJJi`9Wu  Je-Q&.dk-E[4v8;3/\*e$ȏ/`SRFWOhqPJuf74ؽO$$!޺?&`ҧ͛`} ь9%X+=öd+؉2BOchնeU. GYFZCKnoHniUna%RmbJrfuAX)*29M4/ olaˉ|[ $qc$6<^/7)[6 βBU9i48N̮AܪĆBX$*);(>ߑ"C{iZބ`3Ƿ\ `*xꎧxLTgVH:^QgzKvcS6x'B^~; 3!8ɘ2&P%UMBIgg:G6`Հ7ͣD]߅;=Ǻt}X\L` @;}i 9mL2ݚ$^)-~è8!_2<-~*^nX["C @B[(!=Hn΢S<] K(%!CO&Xg[8TdEg~L,Iڛh)cSs^q/W~^;ac>Ḩ5hϏv@?v}aY3:Y'>nx?֩:Y=&5JgN~wIt.Aem= UBendstream endobj 85 0 obj 3408 endobj 87 0 obj << /Length 88 0 R /Filter /FlateDecode >> stream x]n6}7snŋn@P >5hESyW\-)EpvtY{Xr89s\_oo)`ڄ_~/~yS= q{sx{cۃ+=0exkPZg ,.ʩzgma4;IfIv \*NgH@uIew-2. (:z]vOƷD?^i4"D!]&yI s[di\BJ"wY9["&/}n(5\u-ElH(RسImk" F_VqNdނ_QϯxZGFjB^H@16s`)U+"R&pVYgaWޝfWf݁mPm >]zrtGȲyOX't%{bZ?k!eyc<"q.D9$/y40hajP&OIަ`k Шڔ3` 9^@OYo15! /Dan $)7lTݒe\c X ^ɚldA'4ЦL@ [ !n}g{p.RީaVRä%,ќq9#])rFft~R )ZJ")JV2TEs]v\Z J;)ҁhlu I$e@O[_ifkn4\t0v%~#Cʾΐ=8  A\wHc. a¨II$ϸ䤠Ki$,D[ewQ*h򤲌!ؤGַ1Om1S ,52Eͮ'@ #ꙡ -,L١&?&|iLrlUB\G>^ !A0u4 $:x J'p}17W25j)(:<_S/iTϘYw$tug)hK&"U$;B-.gKN>քZ>LjB>+i*V1B$ Vo~*v?ﲬ;Cagji!G΋زIȋz8olq艾چbJI EA ȑ1Ppa&QX<~nƝ$pUˆ0rV >>~"8͕_B]nm~Eg25_1cWx13#*KoxRh]7V$07(")GdtuЏ] .uMƃeӐLh"ș7ċ_?c5\43_`sޒA%V%SM˪>"L ɩi㱮6-8P$0ؔe? cHϪ B[v`5ANaUq:ßB&qY5gV˶O7/&wjcy{!){߳odUog^e:d3߳a=vY 렘߼Wឫ}JM$^zqYakweOzx X ECendstream endobj 88 0 obj 2519 endobj 90 0 obj << /Length 91 0 R /Filter /FlateDecode >> stream x\n6}7snyE  >5HESy5)-pv$5,̅Cſ~P;A߯tНڅwyyat·^LJZ\ja'5ύ~;{Ӹ{uwx2ĉOt_?Q7'.Nq'vgs]~X2~\6&?)j(-Pz© 6h}Z΄TqM?5Nq?;*S]fI#j5=VZ&,AQ3l]ap 0l~(W"`6$\Jh͑L4̈́K/3%U ]7Z"B6amhdM?q:z{Z#E g3Zf,$0F8Sc g hy34Amz:ʊNip PhQ%*n9gtuZIګ@w^}i+B.Dl@(3w/;{UӀ@ V^ bp1KX geqa&*I۽ߴ!r+N>qGn #lIN6 >-ڽLp;PTV),a9uMv(Ao(1[Ԇ,j?[B[@$`0+ DTUW lT[3 \P + kq#l C 8nbEL+luB?0K 0ii/ Yd׉";x PTM`/HOlIU%䀹] i:.YL,$*EгFi;S~YAu^6KdQu7q0:{dؗQ}ȱŵ&1G؊1M!ﭓûkK8?w9h\1ǐ  {xtR,;w znF=f@з1#,$QLfD#ˢ Md HXtk,Ys$m+Ue$0o%b`~?FJ?Y%N7u)Ȕ5Pȅ}8.Uh!έ;,h[}8ٷG WSXMF?6K䋬7P/":Ib([x|VPtM#8&%aº{( 0if + uƙZ? - %$*yrt,RKkۼ,} #3˳<ŠVf@"ǹ{vif$f@`zپ~[P8$*`Z9U mNtx#8S$}Ň(%C 7E$办Q 2fQ6)tG Iϧ,@ݚʓf^Q5əU BA/{-~ADV\E=,kx֧guKx8&%1A7qt&s|_,)//^{/}Au-Wg:xHi/!(H}xBlbA6dLSe4=ra΁yuѩKD;sXu^ldnYV Z'0~S)M $@TTJ 'v8a,] /u,Ra"|)9*_VSsJCYDDY(bjL\^$v$_~OwB)6m_˖J~3%<_dwrT\= >1EkNcJBCIPàW*N$Boz^WTD@'^o=HdIc;MQ>ިX=<<6M//])虦C΅JN;lo\m3>}1yH`KJJmq4g4L%:5mbF:u*ۿ~%sFendstream endobj 91 0 obj 2129 endobj 93 0 obj << /Length 94 0 R /Filter /FlateDecode >> stream x]ێ6}`Av"( ~9,5l{0lPŪbթ uݟU]~0og¿_~~~WTC?/탭Z? oxј6ܛLesnLX+{hxjWqg?^iG*OϼW:Vz̢84w@Ǒ?8+gY Ҝ7isb}f^g=7%HT87?ϤY#R:kL#yu7?uTG[.\ @nI)JhtɑliZ0>5.pN!KH$5R4F'2#/]E嗢" 4 eEv2cQT 8$]E6p5_e&=O~1Vd i'- WIiq+ q_lKjL?!8=6RS92!^&v W)1`ַn"(v'%-mk- i˧APf䪿fU̱*cǠڄ]Fi' '""p@kjev$bZnʤ sDK uS~p3'g#NE18! 62{]W/ I7 (lG N "2dmצsNb-L>OtiW3Ô *F#Ǘ)3(jqmz3}#BRwk˖ э3Xf&$UU'.pRż̤.90q1d$>! њhv(qH$|+'J(3װ+ֵ휦|MT@YHKY`6,-wU4T$i@e2f'<{Mvڀ8͚rV}7+3k,LR:1IДT:]:1H$ E$,(5( '9mbz!^`+|>Z65^VOh[d(tM^kNځA:*F*#´6UK"]݃tsA="ôbȋ?&#g5\lU| er ),O2OKqdR` sTy*)$OBYthTrO5VztK(UyXbJ d^"d߀/NegzaWTt'g_?+vul3QtH)kz(\0-;"&I] DҚV$#-RlTbk:Y=5y(^bd;ScNR2]1ߕI/$^Ab~W~-L_])р&4kG N|ArSձ_SKne~!.FW4 RV6ɢ4 O0ԧm)LQ[SUs!9j? oa$lَb6QՓ^,9HOΘmB.#/bAt| ϤH+4GCۈ82CP3 ;eu B6d*3ZК=+> 1PױR]m`F0B"u;yCH|GEɼ~>q)Glcxj#\)jlz/>kNnAQCQ8M}SY=AQ`o" 7Z]/yP$!!nOƚb/N`u-m6rzg_h, @9@F L@V^VRʦ[NdD>xƌ[s_Xr@Y2ZzS/)U##vQ uv#{[n~61ef|@0ьh%&!~(9gF4tPLӆLIDYΆD8%M>p$cCOJS{ÂbD/ cIKl`7"KU^Mp*4 Ku䡭Mnlz !e(mqڴrg0^ޏNw85${ O޳C)Im^f^cFL|v9ѷAiz4`endstream endobj 94 0 obj 2833 endobj 96 0 obj << /Length 97 0 R /Filter /FlateDecode >> stream xYj1}7+BN>5ڦPB߯kIH$J 43g.RxZ )ɍn{PJƟǟ^haߐ8|J()>ïjev-y6>+v3WO_oPVyUG^mFVZ\8e! ;Lj_Bc-Hf(xt{y23dk,2g6 a3 2֧tQ2~q5e':230Wϱqsq) ߰p\BބM^jD:lH2Hg~XB)T/gISCx)Өgy抾ΰ93#ҁL:՟\6q6'֌Čz @H39'枆0Y4~.qi%7@CX2'Q~n^4K33B G''Ե_썕jr p pf7^fEv1-zzŬs7;5! ֫ا@1wr/SKђakjl\Bi5//oK%]iT/l'Ry%&Ю_NK /sE2 Uw Ƃu{ydg_wE@ cw3k|b4 G>kzgs>;雙7ʖlllq|=;bs)\w6FwnpmN˨ }Fendstream endobj 97 0 obj 1120 endobj 99 0 obj << /Length 100 0 R /Filter /FlateDecode >> stream x\n6}7sny% (`>5HESy\-Ep4RdwE@ܹr{wA77oϿ5iэ:t&8j}i7D4)tk;h<}ljCMQ[m'6N;|"KPmu]+y lN? |gFr3YIJhՙLiK .'g9`_s0'8QmzC1눯 nr< ـ U[CJ0=8#K D=g0J2*h4X&/.H!@146ёȔDxI0;:u0`.U78 ttFxP2Ϝ?⫌#Q,?nh!FQyw3W;A7-MK0>,ZH:wp@2.*AzlUN'W"vbMD|*V kƵg2' {lъ^V8|`HAzH &:E/ x>SٌĿ3NM!%+p.,i;IN(W `4&'w%kL H] 2vhh/Qtm,4$e %Q D9;_GC> <9_+xhXyDTB;wd*<_JzgWIp+(D$V]F=WC7@1F⒙t\g~mzC50{!Q3P3{F,I˹(#JinY<$G]jl̥J'v)Č\^m[Z9V(TNDJ᫐ZezV ho^lE!$63=kzkF(331u1WrܘGe&ea^]6eui7^kۿ>E ̀=.RlICB_Byc\cr,d8!49F+sOn`oHc\/fT@ n9Cg xKTEF/]n-=5DՐ =4$'jej}> stream x]ێ6}_`A$>]&@߯d[s8I܋",r8,o7eܙ"[O﯊ooLQ퍭vBkMИ]CC> ?nLgSx\)oo|7@PiBc:^J3ډhD줚0hIEXLAvw i'qG:u`#˂ĸV ڃ' U+4CīLtTT4Fn\ 7Ak.1Gڦ? z^iueA@I$`!N]d`Z&QDQy?1t9P}E+J]?eo wsUOq!jFVJU`Ӌ=Ʌ@US&@\x#!t+d2dE-zZa-RDTE^I90օ=d7Ho+š|5Ȯw>^+SDT9[0WG5%<:QYTD jm~;jcLg^^~ǵMM,x? N >F,jFŪ,nM\'hE˺%0+#*?xS~-I2`!)d7Y]ȪRxpsqn@3K3B(IЩ̥B9o'P(2YmRsMM$ĝY-8\ͥT W[z (+ jWfU;Yrt4nIqPh.CA1jp]46Q2<.aDuUDWVL/9%9!  #N$R-LI[R0,N=-&:C B_32uB Mvͱխs7%A!$#DY+?#?=t=金): |Аd}vQ.<wJ8زEEk$Sl9'6\\<9QcȂ"nkӷX|3MR* h}5 $>mD4ś骝'L`FPGOt'%,)ǓYRqrU8`蓱C+;l2ZC 8XԯA&gY6[0k6kl8TVόZP_X2 d$ iF|Ѽ4weN\Ỵ+GyPެ.C&4.5%ƌ+p?%:UzUښ'TISŴKEիdE✮~Q櫘TTD+DL^4^T-&AiMUnG;hRgixƵHe}yZKGBq@w&Z@ Ge @/K?gbvL|.܎(-n#PnOPBsFT=3yEۓ6ѕsK ְzuE}A t).%&ʋ52eTbQ(n`+EP\i%a1Buμ }޷YS_x|gC(W58ݾw޹GεĻ@Fwx}x׍yx;\*n?wU䘱[dJ7O o6PJ.>#endstream endobj 103 0 obj 3077 endobj 105 0 obj << /Length 106 0 R /Filter /FlateDecode >> stream x\j$7}7y!][jXyC>` l iznjcguKU˩V5vzIGc4|ĝ|;3<>/G՘fen񻱌N(#C" Dz[ii LޱLԻ$K$R(?@d9 *5'1K :mV[5ˈw 7oSՓHؾcoP40%2sy$.l&`ɂVh) RPjQT,bO++BX(e^̓K9XoZ5HLE G6aњ2YfBր|]/.Suݴkwі[}_{WZ8Z,VZ<4)62)Qz>M+]$P֝%mfC9-^}Bd+AcC>ë>"j.PD 'KveTpm D]>^-G,pl(3L'3ZC٢HR x? 4s%/inqj–0 -#8=䐖-J xP90E68%I. 3"„I`b vJG_<&!$1AQׯTK\ cc(k^u<X附/ZEhhRF (Ťi)HP㺒|ŢI\seܽbyXA#5~2Hnlc?Hlc =Y]MD@=fX #Pq#f"b L O7Q%34p]ߟA@hL+{XpU>G\=E5}k=}L˳}p 2qi]p`7T rULjnq+#^rA2c\;,D:>r7P4a:lLSQ>!1ec3;KW7{E^6Iq{RT )ڔ6- Mh| @+]ndWtJ*=\6׏q] oy,nBRf#7H KBPէ>K(6'PS"0]Ѽ^ɕ^90Yzil%FYSOt2f'R+l΂DP8x!"N46B4X⅚qD~2rAE 5({r*cQLPc~$b3熣I&\-w:ĂM;űbjt5A|/BD-Vl50WW'*SWzqiॠ pD|i#/ 1GmuiW9n}&_~N8|N{I%[ʖ{ђSɽ;^h4\bN*q@kny8 8 x J%B".Hy4D'ΩŜayk)_|=nXq:wyCCwff.fϜN+lH-&2+ \T= 'g@vĊe=fB.ԸYG0endstream endobj 106 0 obj 1920 endobj 108 0 obj << /Length 109 0 R /Filter /FlateDecode >> stream x]ۊ6}B:X K`vg6II6~)UthBT*SU*UF5ߩn|o~]n. w?ۙ;7>ݡ᠛ߛ?Fs^Wpl xc>> 8>q +SSlĖm|& H}y?})HTҳ zBc1ϤEj #E\#h/}$%$mf֒k.aog3qm\|&T22v -dBi\b~a(8ڀ QqFs B.]r37Rb1.mϧXz~z~M Q#4aࡱ'ƈuiX7qHg#?0T?/0 F.-bTq[A/b-p% }a;+jKN⹲{0fC؝5!H9Gp{  UI(ʼn25nXѴ_Lw /'<0:JbPYHQ xڮ HjpO%SީtQ`8]Sq*k TWĦX%J:.+Qe"Vm1@zI=sb39JI,,ΫKR6;/֫j'%dCA H l;)Q^{k03n"2lR~\pB+kpo ǪZpL*1G{1x.[",D)\lغVΔBoX;7tcʲxZpY^$Rk=է/Фb 5 Tb=ʹ?DhZh ߲ w^iU[9Hg.\`h͵UQEI%4:HpK5WMDP/O5rϑ Lofsa%`a!Vvxg58#7gd3ɳYiZ_l . DnG0n_wQrZ;\~!pR_uyژ+_B$HoDDB (°bq_6Ey"AM2x<0%u'A0X{UQX.9?/ q KQ93NI鐛D%)Kbk%94zKYD%5~[A٩6/[ leљڲliu"OA\zH/X3RxLUs d~@7BsmѶ #HExK\ (uh<2!!ǃqPDx&P2COݶ=:'[!龂 9m:D[)* ^®GDp ?-%¥6u] \YAٛ*ܟm,-4tѩ %qǒF۱ uf_]Qq./q/F1w1[x|XHs|+&$a\DXF$`_gxJ,O|J0cNC{ގ5|8\mqx10Ɨ0b w0½/|{_}q,3~,挦^nK=J?5}Veendstream endobj 109 0 obj 2542 endobj 111 0 obj << /Length 112 0 R /Filter /FlateDecode >> stream xZۊ[7}7su= LڦB߯cZ['nJ0Hڷ5}n)̔~z~s5vn(B㳞^OoviU~Y],+ˊʞPVD׉-ZrZ"9z7骐q 5A D7e0{^r= %G*b'v$p]蹬TvYxdum++Fٖ]Ak\29 ? (e%2iZ&Ff˜-U觕 quB`eNb[փ`!r :)ܼuˆos$#1ݻ$Q?#+H>±Oui=4;hx0291C_scWweD/ƪUB3btX)} B2ah_تF#UAuf&C0M@@) اև~aI`ո_ǒw(>1ܯVmuDŽ+u(=xškJ ~Q \b) ^֛o -0a3]&n!n z(0ҀaDXΘ }4JZC~6 xo{E jEkb B;(q`F&:^mC5Sd[o?I ЎmP}k>Bn+Q.ꯨI*+ͥ&z?#c?ײμ.]?+ p3lC+M廼Ĝ{@EV`j!#*"kaBcF؅crAe'<2-ULWć\Ű)"5"qA?f슣0suFM-@)>}t~I y|^S7sp &I) JkwζjgT#Z̼F @_xj0o,&c/LOQ@Zc9g_ lɦ G(nbR¨ ”̄-Q3z:\(헟j 8}RE_;CJӭmuHrTmWO~Zhj?] -Y)J  B&g/ȇ8?i;3a0( Eu@ۡou^s2-| ٟQ-dMC呞U똷>RGC`uNIܓ칽o'E`43&;h^vٙ/N9Z\Ftp@2[ӨLO:wM7endstream endobj 112 0 obj 1406 endobj 114 0 obj << /Length 115 0 R /Filter /FlateDecode >> stream x]ۊF}_г!H/yvH@?jZ9USjof 1FnUWU:U}]^WwUBg?YW_9IUCoƎ^ߔg_QWU7.T}yIs|q$bynp5>;㓶m*+cǗE7> T.噿5| =O^hCO-QhUjbIcRBahSh5/4/4ӑiWm?b~؉>ԓ c[GR=;in^5KD lο:0K40`hK sՠp^MFS*2 c{ t\b_ v>r\ќh@ĖuOcZ6xZh`RԂiZh)&->NZ*=Y0+bFȜG+z #C2PF; C._; &($*&QANˌ%=#1a _GO# b$j`8X-gkV=ĉDµ"AeLu"ErFhv. XML5 sYhڣY-L=_l~:9 ñ\A+We xiV,fl ')'yݻ%>\YNpU~(#<kye1 E1O&`JTHdEbX>D} ðE뭪E `ſfx\[Mja[(:mdNZ)AgFaS'5C(RBeCH0kL n5.KWPDfV?̓~wb51Jt^ Xe] Xyk:սATS҇^)- ,(d}` ߲SI\L #ԋNZnv6*G2 frFGW$)F;rt<dwMU!C&B])r@ǺkBOh06}@5B+sXD0!E[8((,7Y4dQĺƹLFCt)Ĝ~)~(A~EWE/lBN픂] aMV-NCV':pCob~Pέ_64䄤6Y5na(z'T7-4bmP0U Kf}zʐI?֭,@_ǐes(9(YЁ*S B[gR,5CzMW2;2LLjXE*U Ř,>[8!س=p֮mP'|N@c űӲYͰPe)Mr/<3mQ^ݸ qt-ҡ[b-H/1_iw@ðdcXԘݛR}ޚ`„@{zVW~2<8彲Wȴ'%I%:pDc9IMx\d q껲?oU}6hRגָkHJ逸|";B FH7V u>uYBN}_J,XX[:!_&6Y6<ƓZg rNy.i붃 M7HF-t˵hI4v-j(4S,9:^t2:-İݎ^W2ba+d{SNP2(䨖ob[U8ەm3? b֓GC!ٔJP9-%1r,cV~Q!OFD@]^ Epjmrfi)v:aJ,i[f b)jaٔq"p%L XQ::ѽL E&+m`2Yi UHn 0b񖎝6;%ԍ|[u"K+iH,7'Ś]Ή+.9tj/`UUٔ¡;"RP]Xk liliSD5{fQkw,͗RoƻpwHIBXFj7zG5$QKSj1e8]*Dw)n[rv{qrZˋ4 A1X\ )[~XүomHz#0dwoNc?b4"ɹC&&Z _#,V < 18jdGۮfCtt?L4[C> Kw;C;|2 eäl'w ;7D$.vN~?w!FxnBwm-?*<UvTt4wGefvNS\&tV h 8endstream endobj 115 0 obj 2665 endobj 117 0 obj << /Length 118 0 R /Filter /FlateDecode >> stream x]ێ}`AI]\~3@>vſoՔ4:GjB-bԕTy,Ͼ.[[?w.M/>+fuẇ_:/>ė3.syk]^~.jxyݠ'? O;O;) I@sƪc?͂/ Jql\Cz FYz q-N9c*l9igǙ>)nFۅv9~\?"8zIsGG*R5QE5u5uDUj}lҠC'Df% SQ|:78'%@ȁB$m*3"{ x .[`sf .Qiiz 7 2E.{"%%aYfR;a{qj5⇩5_hIfF]j1OHÒ۰Ը"P#HIUƘ!*M{ڊK~=(9q j~NH|@JmI ,1Z$PnxNU#֓e+߶MSN%O+N> 8r2Pl]%^;@| TEiִ;q3nHxZׇ!lX ^6<|taG 9Wc*DI*nQ`ݼvu 6S.aSU%SNK:`P"BUuK1Hhw%gۓ\uOȾԾ'p5Dx7۔e?۔t~Mo9DVZS ]fuN:>f.R6 \EȾXZI%FnֹÆ&VUJɾmVtINܜqjMy/U&J3\A#VgNBVޤv rF UOq|YчxV8] 6ÿJJmP刧r17ѨCg24i 6?R+ytTC Y{Lp=ʕ[&>-*xr0Fg uLjz}VI6Igo\lRWVu]}qavv]ύI$L.kRMHaH2E#MvVAv"D h 9`Tw*ĬرЍv(Vv+t;?S*eί[ʷjg;ᾒw+]=VM,>Ey3tP~^)]XQ;gdS UO=MG& ׀b 5>).Ζ.Ƌu.HZKQo8)B~ L|Av MiyQQ1Ǹ I.e1!'Y HJ%I})t3fLàm+>18(.\*W%i*7^Űt >$ }XɌ=kq _^9.0> |אce-03Mh~'X H8TQ/ qdhSR:PYendstream endobj 118 0 obj 2960 endobj 120 0 obj << /Length 121 0 R /Filter /FlateDecode >> stream xUj1 }_s$!<']$i4%_o$gct|$#l73<]ϏV/0f|9pEοz( pN%.֠Ԁlrhؕ9#PCXӰlcm6֗뜰-. -,//D)~HJn÷(wHjTbZq:Ǫm$Qt.N{?Ԩ_w4C候m%1 ч7ս䔶DTO FsԀl4> stream xZۊ8}s ^]lK9,,K~?rے>r3BnT:Uubk[MfWQ ~sgΪ]|oҢ10mf46f?tN=}Q<eFM3z7ɞ$0/qʘVy\DEt>gtѠ>C^KMEu+GZ[ڇ UsFըt??&9Ōc*]^kV<9[+jnWt=H1˷m{88l5pDG% t챠uݶ!-*Y! l-]p|vC96h|&M} ]ITRĆp wD3nIH +(N_"▕q.vSzG6tqp"^,;eÜ{Pwm<ER`@r (`2$. 'qBF"҂볙iSJk{7>E'2AV%IxHTv@f 飯JkU!PXKoJe,A pwP 2Œ/44TXh{1`m{MXN\Jt u)c Cdc f”0+Uh V,w˶t  eUnHPp+Is9ƜF#`f goxYf}~={t5% _T<% ;*k(ޮGhtHpɋu͇ѻL5kg$ )ǿ\3ZQqNdPCᆔهG:#V2(s)1!VF9'&&i;FB Bpw$$Y0.#Ujɺg\VX:oO큚Ɗ!u>m 0$ag)QpH/9.zSe1ҨtEj?LoYiݾ!h) ;.ݘ K0ˣG8w0!DigfMIM+o2tNdoe ı}z0013JWƉSɀ&|Պ1ø 1|1}0Ic$[vjP.U/8Xda0$lM P%h}0-xZD/-D^m[_쩕RdWJ/iendstream endobj 124 0 obj 1329 endobj 126 0 obj << /Length 127 0 R /Filter /FlateDecode >> stream xXj1}79ЍFZ )}LkM4-K~Z)ZBLzhE͑S:}:>ӗ 0._GO?m;Mև.9 ;;(?\A搕]1]t$ݕ:KluQߣt(1]%NGK)[JTXZf :`t"x9S]b69X>K^0B^_PbcrD~Ҳs&Bfe)33g`J|.5݂~fLR)Vp "B_A$T HSlg;s2ax0;is.f='+8w%L21"UκϹ6'HqNi+bw»z}^߀D,kܝEEHf;4p-Qr<¥=MGցvd/=Cendstream endobj 127 0 obj 808 endobj 128 0 obj << /Type /XObject /Subtype /Image /Width 1123 /Height 911 /BitsPerComponent 8 /Length 129 0 R /Filter /FlateDecode /ColorSpace /DeviceRGB >> stream xAm͚ti2Ȱ!ޖG~&DQ{&"M3&Q (H@{t4q҇v&B@'g|ُzVZ{]֮UVSoSVWe2L&d2L/~?L&d2L&d~WeJvd2L&d2oL&d2L&yPd2L&d`J2L&d2LLBI&d2L&ɂI(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&d2L&ɂI(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&d2L&ɂI(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&d2L&ɂI(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&v~֟WUۙFg_ Gp#؃,=.wL&{&Pd4I@?/Sx?SwGRHouKV V|?IByk@ݞW&f0 %L&Ǭ޲r<֋6qt^j襏%SxL{d>C7W'PRץk4=i8QJ2LvGPd:9GK|Ԭ#ظPBoYpy zJ(d2MBI&v0L9 ok?G:mP(坹g?E_.3ĻyR+=}4x#_d2ٺ&$d[U@Zwwhկ]ewmU? JL%X{!MӅ𛣎x }_3'CrZ)jAW3\:+rQ({+:yJ,4X*ꂳ\gd2ٜ&$d[9+>oytƊ+$t';ᾧ@\BI cWu~VjX zqxv_r3[mMc q ܂_R|0N5 wgM!m l9P2ʱLSxd؁g#NdMBI&ɶ6c7J ]::z_ />7J\ʮ>9\|쭯JJПhP˵kzb62j~B.e䚆'dJ2L]EBVaxSO (BPj4.~q^Kyn[3b"iP(! ,L%)_9|] 1(\v+?L&$d2lkA(Ցw1^Q(,§@> __x`B-yUb;,Q MV(Pָ*(UdMMBI&ɶtnآm*Ւ7}7$\K(Yx|tVuXE(q!wʷ_k&rQ(01bP-zҖFRtR7CL&{&Pd26 -?/Z~BGVSc%V|Ê^1ٿZ\!<VuXQ(uؿ2b2L %L& 0aZo|{nB N[HoUMSlY](,ɓofNj7Ju$ȊP;#.WdiMBI&vzA`G )nzt -wTu&yR_ 60W,JoZ(iFHfE-U:X7_;VtY&f3 %L&ېW.G&Պ~_-GCՅ%OfԻ.>Q'h 盚-En} C !g(ZZ diMBI&1NG"։fvco?a?S/~QJvڑ~S'yT<7); Q{*>wZP-(ǰj:W ?s ʟ #{zq>SjBL&I(d2nfVɼG='?zổK/Nb9qėe#!" vKl=)tWU_|OmgͿߩ2h:B9\$=GiY[<P&ɞ$d2lguDu;˯qj;ccnj'O[izzXz"{òؼ5j-fLO%B%H}"< b9RgZ݈ńebXxTY^y d2L6I(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&d2L&ɂI(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&d2L&ɂI(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&d2L&ɂI(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&d2L&ɂI(d2L&d2Y0 %L&d2L& &$d2L&d$d2L&d2,L&d2L&Pd2L&d`J2L&d2LLBI&d2L&ɂ#~od?og;"ؿ/n/hcq#֢D?ͻ?LVZՠ?LVǶ-JDoZ__6_w~w4B/U\8sVZO& j`Vw!zbN>Bɞ +P?{?ĿZB8sVZfBO& j`Vw!zbJ"$& $L %aH( ºPJB0$ $BBiH( JTPf I $H( SABIJ.$& $L %aH( g?ٽp8H(MGJۿ}Kʨ_~x SZء/nP9>T!$\?a??'=F8E(Y]װ _,lɨϏ0~򓟤l;H(Ic #FJ {\ܯگOt&ґaDO[z?=/lE/L#'ӞRtni9"=ғ\;g"|>bBՠPLR"*BBi-\A~!uwBEHuo {Z t@گ7 kw/'?A0;I߰ #kq\ ~wIKcF[>:](IH4|1yBv83B*Oc"S.y2v.ҺS6gɓ3 %e}>fǨb^v218}2_xǯ|~N>!<;iq?3/Zh3'=-%w:Y/OxOуxBBi-n'TAr`c/K!t@uO#3I< PBf>r#kB F51߸^N}to7!/KB)B;L"E,`ؗU|2ºPJNZ|i~B0 5"Jh[OK$U[pn_bb[o4kK(1dz yGlJk!%m!)$w:At/t_H( "eKv3CۢPz[ KT(]-TB˩R`:ǜW>/KB)BNSB^!0t{}|r0Իŗ'sf74OJj ԡe7uHnv[\PZ -GIKc OiToDRlPG͖~祿㭅Rؿ\[JiO x҆Hy|GZ_pZlUN!h4>:Z(_Nr~ϓuB)'|J㻧2W(u'-4?r*3yq`R6M}Tˡ}9^DYiE~u "R 1utKo ^辐PDʖB ~o?vYԱ_k P: 0&$8DA>sβ'ʣpvh__'/SҸPbRPZ )i=I']]3 `վRp ^辐PDʖB SJ/'0O-\\Oe׬wG9|s^އ[Ǩ)vۿi u F\iJ_C|ӏbƭMșR}9SȿEX@r)g}]Zwk'C~v 9*o| '}Q銝ޡ]F[i?ox>dg%JkEZ4{&d]`]#'y!\L/$Ƒv;6I~Mw4J7ه#0aO% Ҍw'~y`Traއ'nB)MEWXܚN\#K(^kڱ`Ga5Çվ:>J3`Bd3)yudx]pBW+Z8gʨayRpy屛P|ܸ1w1\#K(Lq ?N⌁?֍ԸX`ٱȽG`ay tZ'oeeܝ7B|>;;ckB%+ܚ3%OI13XZ(]P-dʩ M-h*UG:r7,ZC]}l1c@ȨA&Y#TWY(?-\#JзMc2\^2}LOڑv|Վ$B;jP9 %rOlAㅨ lXyɨ>L8^g^pT4IޙN(.v`E Z@-Js>|,sSW %""^I !B *#%X]aYgweTb}yEzg5t-0ҼZĞBN>i%igF'叧 pGl-=amb(nL3-t8[4fI>ۋtֲxbw:nɰ[|8x/9$>҃Ji3ZI ftypJY3 /(g^@@WNl(?o8o0c,.;^W%JV~nZ?[9T|'gr)}Ӽc7?i<}|dZǘFOy7pG0 m߮Ҷ, vݿv<&Jשoԕ3F 7GpV8vJp<ֆpfJW_X4w[ wOscf?q!J(F)! v>A(,9bscf4$ %a*H( 3@BIօ$P$ $ %AXJ@BIP0$a]H(M %!@BI J A(/+B|Z/G&?1uN(ɇvB2]y׺o _ן;YR-t}鱛PJCÜL8JyBؾS4Mꜞ0P2|i|x-wX J[]kvMn/G)>E;ybkt'|)/;VROp`?^P~3_m0B8Cհ A'^>=Je='.LMSM1q`g(m[+nfd /mJj.n&=2G͸exH(=vzw'JF3ø'Y-O( vªN~*μ/m0M]M /iT/g1FSL**ŀ{N( srkFPBE`ōDZWemVs')Aa%-#mwԽ;vJ޴L(=q+`RI*JB PZax"OXaqOȤy§lB5jeg(^,dX;PZQaBkNInT Z %hp5BPF]V=f Vd wPv#~2:!|@<%p wJu>G"W'%${ qO'\8 TylB0L$j`)?# )XSP1[/^O"0N" h,~Ƅ@s}Pڔ$4(2 2JʊhSxz^mB @]B3sv"I;N\%0[OB pwR_ jӧqOS(OdA(qTF~~EAuïXU9`Bzʛ Qs]r[330y}{,w*~ dpU6x)Khq_ ݱ>J2UJqW}.vG"O1^߸'d9  3%A %Pt%P#`}PXQ0PS % mq0P=ĄBITJ.Jc*$`Z$̉ 0!$a]H(M %!@BI J Pu!4 $ %a*H( 3@BIօ$P$ $̀ikoF:O.߽{g\8U,tPzOa_7r uoH@Ko$lJbsJj%`#O.L+^^^>f;}8`)ZѾ:%pt;œ>vJV WT>:[^ю/“gUk-+.LktLf1-Z^la#HzVNcRkgZ(\,/d';>}B`Fe'; G'5%&BɲR Tp>t) FAJ0D-.r2-Db%B ?z'xDjeB4 ^L@OJ>B)eTMN6s',ggO~fйT!ڑ-o _;K(mXgݻw fFo;Fڗ۽sfqݢɸ;If;cZwhA$R DOƣl;?9fdPBY[)Z@pW 'ݮEɦB e%E(; E8+KO%YگcN&9IG_<{ %_XhRzNî8|Yv}W*g2Ցօ+E[ %sDu3Gˋ?ӊv PgC˛U"fJcUǤw*@fDF';B 1` gㅭD2R6 %&233#ό턒M'RYv,G8EU8' %/.PL o^m$3qzĐ7NZwN=ҦסPO3qhx }SJka Лe%RJQN +g,/rni UvI/NN#c^ bn ^߶K. %pȴ-Y ‡{wi"} 5ZBR#aYiP /eFap"0v3J*=' 9>հ?. SB!㫝LMO@|fC tiB8Hj0)-Q:y؛:(*;bE-v_;yP QBi# ʩ}[yVP*!@sP(u J|](1aB݄҇ӧ %4=kۅs.BF՟%ψP Ak[HiY$}Q MQ(t\"-O+KCB!0PO+9p1s ]kWdӐLㅭD򾘤80E.KB)$ [O턒V`Bx52\P' 0WROk L(xGU#B)t `C!I~9_1%CRUޒQ-&$ҡPj7nXwf7q֎O_qT1P*WFB2_jbn~og߀G"|ƷXq<ƚB"S,ŀ`; |p[ 1qb1s&l'1%vN '>q'[/*+1a9]<줧 \Cs2z5x㳧Cg77)=jQN Zpztl q2Lx*g2'5l%X;LKU; k} t>9v O[<<wdRXb8ȆvۆO@řW݄ҡ~g!̀p.PxH(|6X5{ߦ/t&܎ %L8ۥ 2d劄҅Pt1`:j-n'js@BI Y= !4y(pBv`{B[(Վ瀄 %a-H(  %afH( 3@BIօ$P$ $ %AXJ@BIP0$_^D2Z>eBKiTy_>+Jir&ޮ, ݊ tp_)tݲtwU:K(wrE rR>!EX J&_ʜ_(+ͦ,XZ'^Bid!~>^ \:9wF B h؍+賂MCar"6`%1 ߖӦf0{Y:_3tϷ5vlZzcE!|Vh>JPp(mXfTv#}9{%bR OTP :' [ y!ΥP"h+PcOdVzLk[QFS5DHzjwwV-"`8Hx_AuF~:B~<#fJu اAT3%if3i_~Ņi.Y"r|4I^<`%$̈t>ځŀ~urK^煬D?M5RZ `2K%i뽷iq/ܮǢG4CaH=ӌ$C<+lS䟗2i.A0Up:N@&PXє=m|Ql_Fg‡JA4)R/:Z(\z)'JTo5R-=Z4Ao4S>quD((Zj {  8jÄV_g9hnM,Ϋ+(#:BvB)-d ]`,) EbU)E kL'>b`;­MV.K+;#>B4TOm*WP2$F;OJuSۢPd:uV"ckrri'84NP{>8>.6%c<~#&J~&'F}K [B*"i8>xˌklpP-c S|8evB)-S2w c PL!܊F)<,} V RWːK-0(4=(tJ[$b0[BԖ75:P;WƱE/ qwRMǴI=\hPzu_ǢS(}>}泊PN>}Q(ۢ 3CƈDhPvJi %¥B mfPgD.؃JjJU 7]ɳ %a;BJKJ{bomLI[$pQARt΋ۅ0}Q \PJM1.y*'L ~YJD("dyK'tGv;_q|{]A( [_ T׌Q;qz,l'RT(ӛarP UZCfe(Y-0NfΣd K_޺#rɗJ!*cdz#n?BUINl7uSۢbyQsPja[ TlzJ{-rGڬP@*y>P3,KKRLRZ -DԬV!ؠP*֊UiKL28hւPt1+ }:X"NO He$h.c[ ݈aqb!x&><)>YJFvw#*/8vJ5'Y PzHT}q 'L&D^hT_JET %_=ɰrJv=FqaZ- >v *ů/O,|,>J~C1fC3ElaWk!g0]Yi.ѹ1*2-(ĭ5綃݄jw{*JN@븈7`(ORɢ~ A vESa gS,v7=nj]6=D0PT/1^|(w[/^(XB %Omg&\k!dBRz\bSK.|( n>X1Bqp-WvBA(}U8x2$}U?gQXHy6yoSV=n潍Cn^Y_ka76XiK- u!6)v XɶG B䴿FN8&<$&JlOC7c~?YTrscߏS7>L8[w䘉O4r #SfMd %O;0~$uy·cİIݧ/zǺf|: V%EoS\Ar޾,`76XiKvKU%calu_hవP4p59=/ 'arL"|-@7_ w < u`ﴮ7JiG9#LP(_HR;])f;@DMfH@ R-]?]Ja#: V %?MBIHPiZBi.H( })v%8/:$>}ZW(~zdЈvJ~vB`j7xKie:>M(]*ɿZjAaM(-"vJ ܠP %I ӂ98z{[ L/7%/,=I4/.rEGʝ[vBBsP/'n4{|;Nǿ֓vBU.J,6WXVt<^/3ι }%[ V3 $1Pȧ>IJ?/O+?LXJ\$42bMoN,$v;1PttXl'HVÍB c)m*t'sx^_MsH^G(aFaR`-]9€ uE;x=&Q,]sHh0wQ]7$B SDz yĊXa7+n'u܂ݝWF>v^9<҉1|pr`$4M_(#+_2;Njʙ3~CE;!q/<1/VW`KrYt |bsYV˃ Vҕs#YH- 56CၰuW\{.m[£bt{ULDZ_cJ:pK+7lx_gB|ȅn8{uKtu8ԆM'.c_`dx2ܾXjhwO,R)s6PZ=yϛ^ָPPauAj nKY1B1Pu[;>.mp_$;BIV Ip|$ %a*H( 3@BIօ$P$ $ %AXJ@BIP0fJ߿?_~E}cu=kJd-,m>8P:!.׻aU GJX^Ĝd-c' B["-GXdJAmFM 8Pڗ'~/ZOqdd|N{Oz#ta°7٠Ǿ~[LĆ[HQX G$B$~IF4@} oUECBRFG,`';.HHlā݋3ak*1\Bۿb֮/Ovڙ8㏁nBj"RH/,0H 1 /LRiShOC 95-bQVvݻV)./Y]kqگ֢_TU T]H fY52@(Y?NU4/ſNW ,0Oj1`;t5<=piޅ{vL~n̓{Ov;B44?J)6J(J8+YZ-|!i(j=cLA 8L  %M Z?O"cq '=B({,`,Rݷe ̆FщJ[ E|8~BHw 4RzP S3~'vBvF׭jM!kĨc0qfѱ;EB)^XG>hJC9H /|xn)lXd_w|pi69_}WJ}i*l'VaT97dlP(s^ޮdN(!문-1 ٘Vr*+B.Ta>qPHa_( bO`P*8 h*Z/L}Q,7:d|ު lA(%v1f`q}Zh|T\'7DZ8v(bxvl?HI`Xkp5.`og0ؽ˩$>j7Pw{MQBb}.'|8M ˂G6KC  [͍=B UP7 XI-9V/L}(3fmbSH\(:6v@ 3W:0,0C(pnq6|$( ]0P52!y$5Oatqp)\x$ %a*H( 3`ft|)³Nqp-#WvB|C@V/ h.!@2 @@!9DPЌHI(;Tm4F$#SS/ A(I@9krÄH)qWӐ8iwG5# XVj22W8&Jⴌ?3N;E8qkv/fvB -f`ֳ" ^O7,lk[+ca gY10Js(3xI%rv  %ppl-ROJρ>"ԜLR'ɻGC_Q1PԅU]Z ? Jl҃bS$L.ZM=B)M[1A߼HGxaj^ 70ʓ0Ėx,#Ҿ\G(Cz_" r C:1 7;) 3\/J'%49j|LTS'_sS(B(U[ Q%&ju3UB陰P55cCKB"&P].k %y YW(!6%} XPB) W r"*f}NL¤oR B~}SƄEzP*}|zQ%L]53?88^_wzbbЯS[*)~^T\L">5'OP'L7̱c,Lx7])죄PEXz@30'8%'g8-!E;~=|zxl<8f;'}NjҘ ]S <Y[+amGZi)Xꁓ)j u@G(+ٰ),a#̹o8+5oYA1P~PC/^ wJ7BDBI$IB7-w̉'JoL~t w BI݅fJBJBI %AXJ@BIP0$a]H(M %!@BI J Pu!4 $ %a*H( 3`6'﹟Q0P;W>J.fÃW_PK^q]e=7]-n^匚밵Pڈ3S} P(=.t RȲ9TRR?3j\m.[zӟUЊVB }PRy$ƽ.t&J>}^ioGl[Y$+cb@l$vIvsff,:sz/l*VV ]4^hg|4{.6f'd %N {.Ko F[N#O8)~.*Q B&6!Túo`O]/" #aP]őE4+S -\`J'L0q_O('$* QюW\Wv گFBrFT @9VA؅Z̨8 ~NڿAJ,J50SVI^ `xJd.JtGݘލdxPTu$R %x'pK+֩/ErF4N(-KZx̑JOZ0mbƛ⨋rGfEiܗ iR[M0Ҹ2$IѢ"ͼ{d Yݢzմ鯩Jj괅q ȫZI ÓFE2H=?F';" X7Ru}\^1yXUc7l' +p gbێLX +}2+hJ|py>J,_H5P95uD)pԅR(uL HyLE {7jw^a^=Rݲ "VOXi5l51M^yK]&/w,#{WJjt a7J C(8inQ}f~?)[\Q=Mji D(SCI/n<ɫcOz7~Gz7 [O:BnN(=+o}< PTލ.8O桾oM(|-˴I9"EO8rj1cҢz܂|[@)_Σߝׅ&&&)_#=T}tvFﻬoC^#zf{zTSp_&崅qL+RL%\(c-o^J~JɢPB',ZHPldYW(aad+qpX(uR_Oq}R#κ);4KBǓ-rQ}ՖP3%[/_lQ!NBvjx'ߟg>]xcCal'§o %/,~;on5[ %B4\ֈPygMLc(Rҟ^-PJ %4 FZ [MxWr Ê`LJjt ^B)_T_-{:SpՏ`wZ;ma3%j8Ʒ`DzMv1ΰaZQ(C@]}ӧkvvBem$cӂ](ҭfj>m0.MQ(L]%?yjގ3r*MK3 %FJ|j }'JiyŃ=V5L=EBS7,ŕ;GINaw|TSX}VEE]׻+esyO&崅A ,S=yME2!ego:.g [>+u2ձ>J ?Sΐlb:l5-C"OwI g ]V]i$>o?^dwU%*p 1#vڨM`7jYwKؚx1MEM^9s1tXQ'';n0m ӦSB\J$5ZToo Gf|W}ߢz [N[~߅!v.'-J.fJSቅpB( Z8PU $BBiH( JTPf I $H( SABIJ.$& $L %a ޹?tx \9=/lNlH{#+~:Rq6JŜX;]; o-n/?u5eqC.B^T߳os_.3+6ZuQpYw56pF=Ab PjeKakۢ} r_tcFJ|^tՍq$v]gwڪ@&>~퉿;Zcm;|',0vp@y[4 Û >fl^f~2;ͩG*EvMPw&x~ %nB=fAeĶ__;҂/7[ۃ\XɑBɒd_^ώ)YcB¤wIAv102X)^OX,`7TW_q|mJ>Wv߉_[nNH8i f [ %А <tšqLI"}nXKaU1P*)܅* c_@_Ε'`֨[g]tz/zV>$H*%2 >.//HL(FoAƫ(cdZ0[3ay3g#{"cdq&ܥ\`jxz)]񡰏PBw i~*u7JuMjGiEj0BB %Ҡ:OҟETO]q˻Hg}G?EJ([E r$?s]B< g4%-"k1QF]0ӹcTg`Z^i$<=do_GNjՁ)̓>&v0|)O2 wc#a *BX~o4o~Q«җ AŗD*Ձï|k3CISFjNr!`wzz3)7>dkp`K][g}GX|pՅqL%~57J?C>N(A["7J* %L"\=MR9PkD(Lq갊PgDFfJi滅^(iBsP3CQ~$*Rk%EzՎRXGjE!\g1|ۈ.}i %$]uT`w  < wBi:.<Í]v ӍB颊Q(cAR8 x%MäwI4ӯ]bOAm]MXп#YY<B)-p~;DoȫI.l-0̯ lj:}I-RHg}G𢺰8aLKg|vPXb)O.@iɆH-vNҧH ! p.)<@ J<JΟprj͊vT ɓ4u#T(k|=}uUp}u°<[}?%VfuKYx74ھ\ua3%=ECao/'RXnԒ/1' .>Bh}0t<vGUFƟ"AQna:ʘTr+;8!OBUMҀT(˯}I uV=Ze S΅Tpg:a<#K{N UÓaW vb=mX[oGZvjn!ԻАu/[- q_[aťw궯 턒p(l- Rq58! wpV]6!ǻ 5:*S?Ƴ &B Ѽ]@ erBgǢ[ejc?N'JScf@HO9u,=ƶwӆY=VET(F28`'/:ҾvLX K༏ߝǼ)Xj*턒E`g$(2nJaO QXZ0ik vY)mka#ŻźM{ښ%CT@AY mz;qcE(fs1=DaTJuZmbzߚt[T΃w83էJ~%\άIr;)'JlGOBk~kOPJ w$^7p4Jn5BfC` N: #B8A貄vJwJ, e_hV[ӺwcURh},>xA\YJ-^B)4s>߬}iҨ: TMAE.TOލbįu\*HX|-mOPJ |+S % d=۪wrƮGry9ϩ( PZwJ,r晰PB c.e)-6^(->PŴDzPZOV@<NTT''o?S 4`*KK÷iF(/VVTug)RT_PJ&5J))yq_(ӮJB~t~ y8BڣCw: g .N ވ=ޱôh Ry0:<BK @nH-jnʲPJyR#s+'wPJ<[S7hQ=J#JTBsֲ+>{9Cj1V^(yqSA4x %|RQ^+!ĆJd~$ƦojõeOG3J)n|zd`u'ҡ;%.{Jv!?le8⛳A %_yQ-?J(J-:̴hFkgb%pS?g;,P*zG(Hta˜8z:ITZ)R{zyPB^q3% B`a oar~Zԛ؅~[e~Z~J'ݟ_3md @0@f\[49Rb݋qbcqi3Q_i[VFTtښ-*dq~X޶O5El\̙g>˃^}lsӐ-B:/ߢS{zOHu(&6sR}?0Y 8ȆT( 'pVy>oY,tJ}bkzEz0 ZIJWE(azt

E>,FS+ffYaaqFB)e(*G0Nسb1@Zvl}6)nD(F^O!N %ﻑ(Vl4B|eo a %Lg5URiKjg؎ IAg-u+YN}Ma[#{2y 1WӼMyE &[JFEꡝdΉIh6w $:8qNc9wQ|Ye0ZG3c0" R:=8Ry[ᘽ~rY|nǖ֩`; , %_(^xZ\BĞBeYW;68oW6FK:1 7d#Fȟd @IA(HqiS(O4Ĭ!ud.gh^8.6iY.dΉIRݻ𵣼@%x,h*p1.*t&p`GdY#Q7?J507Kze}Pb7J) }li:J!?8FK(1B]#S(BǝzTIZEGKAЖ-g{, N`9z9`PJPT)zi_Οd&eZIPݷ-}JuuRݧ|9-fJa jfxytPB6[0+`K(a]t %<  %݄BNJ腼PKH(ݎVA{fu J_3!CbNuz}ϧ)1#2ON>XSO]XL bҲ>J50Ks>=^ e۪Q0Ė֩#`Y S!^(FPjUI\ b}$7:-iQm\+5F<[4/;eM):ZarLZ GhUKRM0rwӛiX6 v2' BIĄΉ6ϽASndzn8doǏ2j}f,RfPN(ݷb*`}Fv t}_4 |_e{wtwGiWԲ'hM>Jȷwcւ&쀜Ļo5& lه":ݝ9B[W(]GEZ|}dtUQ61~Z7?~޽?a4b~3q|kcg0 YןL`O"DM&>iu|x`f'H|R fy;[H(g,vC~-"@fIl:`3:GQڿvqbku͘T(۪t Hjp2OH"b1؁o-L#grB#E(LUBe4 `O6z--ڦ4dH * dw 3%T ;st0j[[8; vlgXnͮb{]ADޗ}:o!gUîVi+3Oqi|8=KE>̞Rf/5;}C2s %VR?ɇe4 3aO65GRMm*nIJuTI$g  Ut'yh'QM>["4זW~S3ռַ}4 _S>xk Γ[x|m+* ^ Ibؘ220fi\jx"zUf .XغX|uл q~vB)V+ET %t+[VPQCt NNF)PSřаb܌SY8q--Q@oK(!/+>Vb@;mbmӰ!_;]V@dPR{\4-bM[|`՝~PP8:J q/ %/P*<9w"7HBigb6y[.J[7 s`7j@gl~\tak g}MqKZB[Ij]C_s<b};? 616MVk`i'$I!IT LM(u}T2ڦ[R=uhs`i ~~Σ_=߮u S^4}r؏zad_ԉǷXeiO@Km^_ %;k[qrЙXcɎ=J")/Mґˋմ%=hbҹ#a <0 |`z v~06m AQO~7y$*||ժڵg}NgujW]{ZUծ Ệ7="6/TDbWV[iX.!d6 J*0p\}zǏ59̿挐bQUoN,L?x+OH_ڦFs`}}YX*evYf*3J-7um™56Q*E5vKUxR:nOγlqPPt9 (<€D/*Q:u҅>O8=n{ Q:ywi{;u1Qz۷oo %<5.:[JqTygu橙.pp.3w@Y -"IJGLl56++^g`x/ n[JLT5[[,nNJp:lTW¬-ҴOBw 练TL=ϔVn\(u]_KVkLIVx֧ѡE|5(VOmdIŧ8MfD4l}-V]ƪzW쥫RTťRŗ (Xo*ZۡĿNF1Q2SC<][5kHHLGJ܎ NJBտ5R 6w qWY.} e5hb֘صee[ @ӡ3P^=h( zA- vcV,gokxQb%:D P!?l>lf dcqH)[n-\(͚JGZ%+o*)S0pE}5 m,u()NS쵰Qrk$rV r(l RA8piTs񮪣Sg}Mvd b ijS:1HO|0!=8̜ir fycO^ʅ̚Cn5418nЊ%(-LGf7Ԃ{vKKr!MfKZ̷F˙/Ggߦ:](!+|fXVx߮f4p94k*qf}wpN qM௘I EEg1/n;JNPF%Q*k$ӱ+]Upg*[\ nKl@\SSu,#5֩M:{;Č .!J:tF+YՆv`lC'U:dh$7sv bh>eyo6+ͳ&҃]~>"DIK1XV>Bx02'ܷO}o. = fl?Q*_tpai[]zװ9 ~;6vhVvQ{5ne#=(؍"aKTZcH" ԉ4y(l.`%KPu(g427]ITaI%WPb=4T` aM9ohގ̿d QstɓkcVTyE2X{8*YQ,lLBtb(q4c%Jo(W$J\ճѝKoа9*k}wOE\([¥:Q*d:.PJ(laj7ɼK\(,^J9i/k-b$j~ɔ<@f;#1f_kV V6\ /VaJ[r1XQ>vt=DG Gq ]CCy#JYp[wi]᥂aXfQp_K8tW'J,R\(F2M6Р_u vk9\(T_B̬oy,ç罝btŲ:~36.VU5*WaEk׻ekeY*ڐ,p\뚎Zjӱp0G"5(a7Gjr %JY%@c!jlZ(oVmNU8-s|wYn=7p94kܾkk][.W%}H0)Z.Qr$*sI\KT+]\(_zEZ9nff+viAc&Q* fw.3Q[T|BsV*ʯw}{8=STgJ]lC)¿=}iv\UwlCbf vqY z4%kG:5c8F [2KFja$8ccF>d[x5x$˪" Qb*`.fY܂,1 fZE**Hj5n$4.GW yUuV{gxSRe.{xx}N7nOoʔJ\ ]ʈ?y.v͈RikJ4QJ I+I঱QbO٧CRkUu$ .F J]4mve 9X E47K؋`$+ಹK$HYXFZP#сUZxd4&tĂ47V&ex#EĤ|A+QgV#JT$:MazǔJ2,_g/+L}% Ko^FUXd"R25ILe?쓤VjmFJ:$ i\(_LиdSz4QW-U5IR:*6?;O`ۀAW.c>@{"$|hI'Qr?G">8&ǯJyƃ-3%JxV wd媚Dk/˺ʸ.~`P\E`i4~fBpSOi0xW4F̐%滎f?1.N(4[TJjn&JKOu #6QkK)UKq% .F JHk 4\y#FF*ˣ1^kԺ6&K%V0$:5"sFa&jU0 pY9F)}'ay2M(a91__ F JXpux,nՈ+~lrUDaZn-A8XSg Y-Qs f(Di&J5oa{4 T% (6&Je?-IZF[שRJUoRJIhHQz|>vt}#V XnΖQ)rW#JA7 %J>M]F%\Y`5).ܔl}LJW29$Jͯ9~蟾tPaZn[knl>U4iYUz_~&Iv1QJuv--ČVfPcl$k۲GG Ҕ؊*[U!dZmi* o/URYV rWق(eUTXkV5U >G)[?m.ܔUĮ,e`LMU O< Gi369K;&垰0wԥv>@"UW5?ې$p(a^k6m(فqg ^hϧUJU?;(V\J\qv"{ JّK`D)'ӲJhGFn{Q1Au;'JqOD)}@ J4(2Q JD)XAA@ JD)0(" D)0(F@BN1;'}3^e.%JKzzg(;@Ӛ"S3+|3lyҶsyZDn K,i:9kBՇE0~'!DXD.%J;/=Ni[ԞЄYI=d|{9(H=қ7o޾}uH͒aX0@h)q8oQb{TcI& @󴿯&e-R&ޣ|(>~8A:tVn1*{3QnHET֛?:y%Sha*+*+$J5z.Jݛ5nzk^H@'F J@@C8SK8eXq<xa?YS9Kh 7kZb4vB!eeC,C>XP[Ӫ{1eAZg ZUL d`ea B%ޠOP|q 8X /D|YFwߠE[*.vAQ1T~D5zV O(9uץ9ڕ2%喦(_;5+5Tɉ5D}mw*)Q.q>؞(/5>-ؔ>\{Feb P-`E،(LmsU}ָSU5ڮ6/,ЏAF*f91}]쁑Odyѥ8 htk}mBnjGmA'4R~ T Db'UkK(^:WO}(?_d=_zRjFʎY{WEg8-+%Jo5ԈRY\6Ce'JuMp}1ul83PU Y匒k]U%tT,EZBE1&Q應雎8U\+[*P_4[p7x<~vˏ K%SxJi,TA5,5Ϟ+ǥZ?kҩ/˭\U_$Xô\ :,#h 3cg} Em -M`%booŬv)#}G=@=PK3`bt l/E},rsDɭ7f_::t^j`naײZn戒k?QoP[3Jhx0kw6 kDUj* *"Oe2T\Ͼ%XcR?]1[\+u<f8(&UuMUqKkk4,/6 DiޱZim[e'˔ٍ,27[jyxS>ݨ{D[(&'= MxTj{y%ﭭK[ty=K+?aABz&ͪ"Օ)u lBQQV{a})-uDB*ke6#JZnuMp?4<&͡N&i!w7:qiELbM۫JEm2E횪/,Ѓqҵj80plɁ`3pڤQ U#/_^-WbI 7νP tuQ.a)KNdDiױ&phr3Q[P-1Q R`Q @`E(k!R .( J AC!R`Q EAD)!R`(Q J4(2Q JDdp^ktrm J`'DiX*E_ las1:V9r8A]K.V#csaV cnAN̫o|D?v4vBN3Z% 2zLf_ZNt-zEgG'}Yuڳn(A$o"LGFYd8 B#sŋ)A~MW݂\˳p<(֡3Di@V|1'ss!h=Oa8֌veDQb_ms?s_6.Fa/΢}Y RCKŔZ@#0KJY[ 9d {3V4"C lW_,W!J-az>eP-Kl/8Fŕ»otEl8ܳ|Y[Il6 6kӯͪz̡Rh y*P>Qm czņY˴SnJSSb,B!Jyqxn`CH6I'$H5FD V[$4B'jȭ)@ḙ^-Z㯼k'?hw>\0fZw (BNk-m %J;h,L%:틈;[μ*EqxBP~e'J-(>m1 **eΡ[\&\Xa;B~y`w-kT}ME{_kV5j@on/7MQ{t|T}dl&mїnJ4U1v\8й*5:rACF`#+j=-z +%sQn0>{u1 %Q6cwjs؂Ն鸼@mK(vCׅp"LΥwt9myg#CB+R_Y lOܗ[>`[zWSrvҕS+ޔ im=~IlS kumZWuiaSYUgهr-UryilT0aN:`LCWKY=D t9+wQD:iҵ([Bi0l=-z w՛YXzwDi(auMV:fo rn)1;B0H nuZ:Jqaaq)&mOn%JeQU}(&-=w[:|g<]cN cŋiitFiJ(yZXoY?؞(/|t*Q1zl̡V%ML~YGQDN5յig4Y |Py8̪%4mT-;YcJG JܨjB%`k*ͅXz eكdɭ)Otrl(]1Q>DI81"e֔JGC\Yi;B R:~tuJB .2y=}lZ?ؘ(^nT㰴0R(ŕM_[ko>N^h]EKlFj&N5յiYWuU:VueRT3+K#oѵ^f}38@@ 6Ӥnʚ !MMF8[]$93dqEY.L >fa6@q:BW{ȄD!6n4 `g-N  Z֔9Ti Z}yZH{L|A(c%p+|Lϭ2T\g_G:,Ҵ+V ᄅP'ȶ1w_>W}c$թ&Z]u:u/PU]ga RZ/>`4U(غ6tOfS/~ҩRvò'Y]*ƭv-|٧(+4tUx %֞:j>haQ 7W5ٸyHY\&|MRU˺ɉ.Z*D)+Ķ:ziy8}У͡Rܢ[yP>Q A™͈R8v\2DL`J.Ć%- RED̔k VBǦ(m6vnYJg N=Ӛ= f:2T}#R .(EXbFn=@`-Q EBAPAuD)¢DnD)0(F8D J (EX( (B(L~czَٝN=gn/lb:hoA(mL[>C?`?s]oO2 /F ~ɒ7# o.Ntɦ-9rbKҜ:]`,vйc֯eGkVճb`c KSZjjx4X, Tcr鹝w:䆖Cd,=5dДв2O r&V'Z,5CC%%Q!ɞ2AVwJc3; 9[HkbpJ-gRHC__.ŸDh%]Fm \,tYbfRJ8(< cfDgkS AXN[Vt̪:Ժj1&QJIO t&K\"[:˥w4)(DIg MjJBLF3쐍ϨcGJ,gFØDsԘc`EDdz W6-c@ ߉–3JnmV\TXU"U75l¬kwǘD R(5TBALuRT&rDKTӈ+k:P.f%}vL +Q-D*_(3QpaLn][Oc>{1p}Qr]@:(e,N|mfDgjTXgYFe3J=nߞs{VՕ(](i ֆQ3-= Ռ3jM۽(=<0e.m4Znqծ>;fX -f!C7$Je/vc4亀,|7JqeS|.zmï͈RP\UH"[X[`VյvcLc=0 bklrŨ.#hM2ĿnR6>-;."J5jÉp lqVfBaQaFÀD NsгP . KL4Jӹũ OҁURgkSMڌ; HʺImUzeW-=F Jz[~ݺ@Odb?xLZeD@ T$ `6]Q 5aR5Fkj%`LQa0QRsv& { Pl(-.!=.M\-ͩkEez+8!1F J]"RۇR l@#j.\ J"l(`v~3{&JleRE@`]QaD){&JZ J"l(#R`Q EAD)0!Jq\W`QaD)A#`;ڽ8"BN!a7=h+r7; D)BPDnn,Ɂ9JPKJ](ٿsxη&ɎUʠUջ( J"l(14G`'QmTvWjuQQ=Q/^dļy+sxe֔g]دo߾}`pdٲEnܓ.0- ^'ñh "ϋ5+fΓj񘨐1De=z!#3KY{FҦڛ[,&KGgp^e3[ޅs $Jꘪdn-J'î^e~Ǒu6[5 F#Jvmt|E³If1])_eն 8B. h!mhD0!ɜV@(afäP >/rebj iwj k`!aLZZFD6."iyKvٍx9n[%vuS"ĮdfW_խHi_f3nwOh:eMƏjD3M:k킉2=&Pp#6j\`b#{^4L8 \}yi2R$j`!aLZZɮ%:ՍQ*c&Q@TwQ¯5:fx/!mhDH #1DWje>Z ڦB3(Y6[?͘K9KֳXT{Fc%bd #%^׌Q*c&'iWO#J:^^/RuI;Q1Qœ5"l C8RzhsQ Д%%4>o(iL`5gQa0&Qr--`b^Qr J͈&t޼yx@{\_(t&C7f8-qogAٔM&r;ȪWnw[jS>>-GъRy]ԨgJ%%쬁=#RۇRr;T3.E-_zs 6#Jٺ||]%"U75fW60QJbq)O̥+y-RbIK0 >09;KA >: D[HIF˵I">ocFɭer8~y_{FTPp n0A?QJ]xs 6QWP \PRZ=ȧyjbޭ`muРsxQ [36di48Zctgr${"l2`I[&0vbTf[>o&f^gQ 6Ft(%(E}l JDÉ-ȹhȎs緒,Qa0Q:a ;1B0:6;GiMKPq(ےD֡E40;v!!RP+.ҭcDiuPճcvے0Qz۷on ^|iOOO`z3SfؖPˡ}"+aِ][b+&W+bL fbLg/@NXde=5kgG`2a =D|2ԳB%fl5F5F:+Ͳ2벬!;Kf9KRyO ]>-%Qb'˲KSFUuhQ:vM-벬jozYY]54ך*B>X]S ,M 7ZkWS,2;۽C{Tĕ0ҠM(hؽڝ%kK TѩP]d)c72ux..+a:6"@d(PfDeaY=\+sZNYq-~D)BÀD)Uz0A?QJ >?CdzC((pU]P'Jp\DiE B^O{-RW'lUaTcMD:rȔ?![8{E/ZOlܧ`XHQa0Q걖]/:׋ >ݜJRsk'%.MwUT#T@֮ke5p O4 qW'8DZ5܃KG.|G,࣫K{f(R l@L-C`@vr&p$ܧ/(Ep':|uQ+ZTb-*68:=(["R#AD8%eY#>3gw!=[8`e!tƿt0z=˄5Cg=G{lIܗ U-%Tաfo!,;3[@Tu%JHPK~^}2,DڅxI^><nt _ԣ)M; ll &0vǃ,ր~-i8 IPڥj6(Ee&l:&QeHEDS--sn;Gװ8܍>4ܖAݥS a5ߴ0|ؒ(/TEDS!s^#޳L}RY갛q@*T"@fMc=V 4+1wS|0VP~(DqmMF8qcFF6:tgI6Ǚ_zDާNX˿A.~>m)t؟߄g<rU]FkvU7R YMv޴9i5RXAN8ĕc:yд#pLP@1"Oe*cz$Yך9'ҙƃ'18`vF6TDKq8*d_st J־w5kN0;Z9R9@匒\U?(=׋{(ܔ5R7^^sf֕$%ܩ%j,BGsR"~Кj^+*ô-9yD)aq2/gY{l=2(E}M'}$Jڲky2s}!Ts%!J(RG]yCQLN{fDL/DR5nd-y{:avjTQAݔ`ylR[(`ZJ3q*dO_i +pO##R?'_\1O+gm(e^3JQrc-Y$$JF~UZ >/ "G{lF/TKEjEDzxnJN#Gсd J`(&O:["Hr1"a2%/j.<d1ϗ.\?<|pL c!MJQ0`?/Կ/ď_ ޙu۞Qa5p/[(#+!!":A+33J.vW LRgʗ媺&pAU'Ji{GW3mdM*74F\d;S Ja7=|ogaa^6"u%+Sb?ƞxtCX[v4+8/(k P"Rço=`,̺-Ziu 45vLL">)fpS:ܑe">\Ɣ@rCzI:&Jie;HPu*jHVV 9UZU]iXTK :ouM0Q A J[@`؀(WGוXO-bE J7A68eZ= z_nnAuD)€!M@`E(k!R .(E0Q  A# R .(E0Q  A# R .(E0Q  A#`X7 J ?G,WgpiV/wF'0dzz90&6;Gif{_qˊ6( ~T"(E0\(?wQ>euODKX#|e}Y=q]ۀj Dbpwv`۷o OOO ٱ/Ȼ V, jyT;YuZ 3 rf{Mxi?]Q{͍'KqdyMBj1dՉ=bWo*QzoO/"iܻ,ؿi?_n Tz31k1.,E<]KliFMl;5ʬ\'lIY"dz^v 7Oqa9L^ߩ}i/jeY3 F JT^aӴ˼D3(-"97j"d Fʔgy} l1Yl tkX-YDY47$%il@+v%|D)€a]wwAd{I,_?!WWRd{iKh ÀHs7+D2X5O:aKD.SYD8[AL,9Bbl۽,>);)V(QQӱ]h@8LZ+SڽnJP4&Ԫy)a "=q>nDk רYX"a{ V&kr{A" %J\,dI0i %4]FF??֥wv'R(G:{]hR%]zGOzTq ;fD ZoD5:9iһ( j}'ھ06v/KJA DIe뮩o \)T?Ea}!Mȼ it $ڳdq23\LPv#=}a.Q2CB1((_3(arʂ.3QJɾ*5I7iD}%)\OZs ;Ö3J:ANN:(QZߩ-M\Olm0QɝQ"1j0,|0,%"W:kll%@.Ў#-i Xjn۷grK&lO]<8&Q0`X(GFD~(aۇr3|dvvNR}Dž|3fi9Zƌ+Q]IN!p7،(aBdF NNQe/kQ"YBDiK@T8Li1 ~#nJ-<6wk)/0-8@, һ憙 J%+~rmiA" %JY#5 8 >vE]լ(Y2@Fgz_s}x3w`  &Iҧ߃/BΰQR%D)ZɅ~>g?Q*{YY2f6D :JHEw|D$|MYDUӅ'L/&UlI՞% uU ,de½;D|x8~8(E0qD5rGܻC2y(G3H]ûo:OMٿI]3l<.'aW-u쳕`:x/hl^ S0Qޛ?˳ɰZ,3XPWR2%6~ҔD,T-]H77#Ka"A" .q3 lqˎ[L,R2B4o] y,õl-4-\X>Lss=(\(%^-vM5$yFzRVV hnMeeikq6( R6κA0ls6xww" R puQ(y]BCm4+Q0`Q2n(ur/lwiĞ/7h Jap J 3Q B@`]Q0`D)0(F@@`]Q0`D)0(F@s @ JAq3kKA# R'pWpNkn-@ 9>4~no\A" (mINpjsӳkq~ >i_z=Wt+Q  J!J?>uUTKY 'd` ,*b4D)€!ΉҺgS27=Ƥ©.'ی/nW!J=UzA1Qa5` px6߾}Kd1, م ##-l%KrU'yӥ8ʹؑ?e8bPQ8ǿlap<5= UH[V"Rؿ?#dD tgn5eq#̼ g2-ݎ"{Z8ВѥiWDic%p5j-î K^_n0Qzap4^#%4,1.(o"8 oqW9 b,%XK%|4<.H"t4g+fOqaO޿oޏy(Q¹-vϩ( 3AQ%zQӡDt\y; ^ .Mf;9P?vnE ^Y!m !J<,FSH(@jIFv244ނ.¡sUk!; Kavn0vRrl*Q8D)ݧiQ0`Co,\(iǏ#MPGsG ~TʬOAGC^ (.Mf;94VB^G Y/#Kųj=aDugKD s]&ƮEcÀq`B5^X׍f(isP4{F JW!J\Dž鸆.R$J[*W(eFl6ٴǁ bwqiZÅ,D$Q'D3q{}{B45%8(!lW!JJ")L&һ]4K%I7 J ABf̿pvv/L\sQ€+s[694:9XiniFDև2OhRz}{B^`sWr+S97z+|Hc_"bJbౌ%J|u17 J&&;~s6eRf09;ck$\7n6Cj5Kd_ Jl'G eLu{5 ڂZ/pO FC(+@$>HbI[84gVXp5&kh쯧\HgGΈh n̈F1դH37փs)nA"M0MĄYDi{ Ot?wz46Ql>X2׶5%P,AKN:3K:jW١}Q'@Lul!ksIAWͅd{fVxeI۞_H71*XV4nt>"R $Jt)ҖDI-z.P -u=M})[aSAj^)=Yz诌zA m#\i'R %(E]$J_G/^_ pD)r6J8t̲+N` \D)(t(gOdORdYYh$p뾉V++'RO=FC@`]Qp7A2t&Q:!X>'PR "n(KD)XN@ѥ_w>%3h@~'~Ss\׼[½d9X4Y{D)XA# R .n({߈_djS(11c_ɕv\&g\FBJ$>BV0yR/·-2R (F@s0\`@4QAC{~~$ U"'BvA#1 f!LcLAAǻD)ΖA:cp(sQxK?{oᦷ nB(eD"%J$; 5,scxUٖ(hF X:#Dz9 9DLY*&WOiOA:dWpRXzzo\~D)݄(ՎR*ғQٟԒ//>D)QJkвsqq$S>ҺW- rK`( 0 8;%1X0`N s$cӥ6Qzzz=E][&͊Q2s3XZK+-fW-zq-=rø:J.t(/#27^'o-~QҬbRL@XP*eRkY ےg(a֛Hk q06D PGmXs` 7QQ&h_ep#g|,]Ѡy'2!% "! 4kܰ~qAQp7DMJw;$J L')ѻt iV 6y(aUJ:t\F ޤM`Aht<8ʵ_3'F׿3.0tgz6ؒ(닶WݘGKÜ{n/YKJX}t- B`5<[JF 5$#Jz;܁`,p|}3|yqȖbD(jyĔ!@ګT|D8WC3WAw>g)B%nݎϾBWo!ō5In(0Z?洴HtmvEq`6 6 ԮύD)€dnF]ÖDɵ0YkSfR6,Di،(a:Rm5,}9(tQծ.Qҭ( AR]׆ ו G`L]żLuX;ܓe^6X] ky9EDɌe anZudR`YAsf;lF\k N#J+aﮓ(Au<?a JfDIu ffL}D)ye>e cAv J騮d*6:=DPfg@W;ͶYM<]`fQ.pg!#JA*~`.Q*{Y5^fAv'TN=s"PؾrIXO)vSI% n7F%ulJ geKzb}-@-D)€[߽Dxko`1eNR l@#U{p,+qEnA" gُ.J_>H VO/"-36?pL "("R*K|w~L #@(k!R .(E0D>׾wޗ >b?~ҼO/ -^9eW\Ʋ- J@A# R .(E04ށ}%1BHcRdJ _d8 Y$|,AJ%he #CA(F@@`]Q0`h%P]φ$$ E`RHCĘb,| =t)>=1(.p(eG!==O< ]ꇽDٷgQ0`h%]t]Fp(H/(Qo8/uOOOhBI,uj%jrҰ=gi |3H׵J4+6/ic=.:we-NﯾOyxEu;.M݆Re.6]^w*t" ]~dO5=*D4T.c4IWܬ+4Ԓޅh9#R%4%Įv4nQBv-R}ۦҕ(oEn'[ VKg۱4e +KD)BD}[!`$PdUJ,On(,Ìҫur-7-Q#3MWi]-/4M{Dz 2IJ,ed]\NWe7u瓎KZUB{'B.V9pTڟ/]("?oZ+yOxDƖf3>j[o[f{8LFd!J5G}Q"@ޥNMXG6DPPqher=(Q-.`mx%%&j,(һ An=(]+DH%5*D-[uͶE2};\bR(ސCܳ"J53Hnt%(a_Q#%@Ӊ\AVb\ @q^!nR[F$B.>N")6m1-7s?Diit!RQQU #8g.f[f{[;K\$3]O(}牎%vSe񟘾WI!8}(c\(q&=.jW7\-r8-ZA 7 J[bai>d;cZ|f)[&!].rcM#N˔ 媐bZb{/HTBl"(- A Qj6EZJlةuvk7^Rz0Cݙ`2ޅ2O9zdlpRېQvxWxݥn$Ox*U~%`nZg. JKC;D_Ξr_W&Iw{"ϖ~裏m?p68#%N3IRb0\bky%bLE!NS?e>Kee|KZX>KA~_|!J?NEx , %W-@R %(- A IN I+;BwA D۷8gv;ƗxR#5CFbz:ޒEOYj{ァZ%ӓ(dvtg_Zl-$z ^+ѷy,%J EVK6 4QP~pg/nk(= vVc=1[%\v`ZP$LR;DɬN43{})0Rm2,]ؿ ˯>󴥴vˋ d.tsplul3*\IAj4QjUEQfg|:;WdfKLG6}cC/(b0SlͳfF#%{98I tt..P(hY-&Rij$C}AB&+0y . e 0 А.I4l)*#!JqE뀕`nĨy'x E"+KDi!(aeW(!;0(QһXYV LJٵ!YvigAQbVv%Q#xAO+dɌ(ѧ[RZ`%J2]7wF9 ڎRusr zLkOX4.Mj}Wk@caGirBZҹZ$%_F{et^lt͈ߍ#%j~t5#JlL۩69iRBfeJ8KSp̡L`d@1 (3O\3>,HssUQugsH~WK D"e|'4QP;G6Mg_!a[7 3wo?N1.JtP}*FN Lb$of0Bi|ЧbJ G@O #W=ٺ9U\9A=)+-Aj؀(5{eGTZҹZ$uW6Ϛ3=FQ`kӜLϽm*3V=L$JRg{8繲5=x&mMlu6c &"˥ẃbDVD!gcn׀chTiBD60 .,QYHLӖޥu3hvÖ8JͶΩ)oƨb]%UukyQjHZعZ$s'Q5OWKTkNq#`1+(ef 0?`y5o"GAƃx4VS#J&LMu2u1\#Q%gT= JwN&J/^v9]sf4 mFtvď%v9&rD)M1<{e3:nQDW$JX(w\A&dX].Cph儑{xޕӣ @Xάmw೫p%TKmAEcFIq(Sޕ^h= Jw(]()C&Jj/`s!55YF7΅ΩdyYiȄDŵRM]CǴ_߹Z*3zX Je)< loVGD x (X&=#YXd{l8! {H>)kcbX%H $@mC0#{ Ab6{^thEX j޲̊k j̤K1I +n.T8+XIQ(Ϥvv| \(EU5Vw%.+ߝ(5"YxXg nzY+6y<jPQ!m J f?1a.-:G/;̔}t{!SX:R4_%iP<{/>)t ?K{ǯw^FQrߔ*aZHJ9y{joY5"k-KEV#Riz֕6+m !b J"Dn@4KuÅazvlo\:q'fzV_<ؓJ4i|6Ql q)a k~x;)dfp2^ATC2KC;RmYGjNkOΫ+]]4=]Q9ewBiB J"Dnې] 75TD0-EArP7l0 *9=9W(nL{A-qNԈv~{%]J;6~!QE(eݹ|T~~fG+7&I5G?QRatA>9Ay1qR`ݡXw哪2yK@`A"D!Jc|oͷeʒ(ٟ \O}cYb_7Z&b}l(KD)0(E!B7(Q2f-eI@|+'YMlF|xb47 ۮB"R`Q!BnQjS$(q>M }k6aPٵ%[EϿo\I2err~jW!R^D)0(E!B7|;R$(q!ҫ :L)Qbڂ֠,'K:Qxze$K{&J+bQCzBxB<[fs!B DXL*a()32I#YI.$F?fk#]_[$J=.Ţ6myDXUzVv:.QcI(+.#?R`R"y&B*ѭqS \ip{;7Պ;3s^kﻃah"Ǽ*j"%q g\jOsMtߧO*-%D"/ba()+B(GbDP,aαH J.U ʉD -UP,{6z)8c%L?[0W| Q|>!-E:TŋȣņVs>]H~pR`pձcp "_Jӱ4!àZgT_ UZB"JD"yGl:7?G(_vSЗ{@G M|l,: #I "BUm2V^v脨T#Mhj֥Q̓GMl;_/e#gQL@J/UyjTӧvt7~_ $,|_㫫þ 10/?RJ׎UW(`/s c*u?/Y c.H&8]Ax"KCE@(h}Bg"P90xߋ>^&Ъ4 =˭VkNJԥ=B W2!J*b䝏O9Bk ,?xX(5{QRJo YU.1A:V7Pu9_ #hUZB&J_~&ַ?ifD"9*"JSޯm`2x}R(ߠ!Q yRK1*0(E^hSK{WxDh0=Q g>7R.Kamrslis_lyx2-<(L5 R(' >N(Oe(P?ҥr3*@ t:X=Qя~ZX(I$ɈRFm ˍS,(yqWJ}^f!3/';Bh™==2HkEn4w66TQ OeғF J_;Zo8Y=[kp8Qp"qxY,5>MR]u{Fe?dQ%dV"4Q=H Wwl%6= 3HNR_B𺘕5Biw k%4c.$nFaz1A8i=qs~^Opbt 䋭Kt/!cK@DIX"D$YҔD hY~ oX2\ [iZoZHZ &4+r' 2qpڪ:4#47,8Z.?NB7q]>Ls!2><Ҟ9~ iSњo~AYi)6oi ۯcXbb}z!He~>rXnGxpgB ( KD2+dgh|\ #Uӝp+C^>o Q!ND(I$˷(]ݳ;x]Uÿ6ՁNT(_t<%X#̽ b^\FD(I$_ngg."JZ16Q9@D/={6e/>N?O>95W.c<"Jɬ&J݇wj_agLG nؗ`ZM,1+4oYL{g"JZ!$l"J?x#&z ~eY,c<"Jɬso~ dLdE%0x&Yn1>E$( [R ?/^O~~),G}VciuS>݃)Q ~TRuk(,5'YOCDI"!9~ ^chA;22PVOIDi8jND-@Dq l Q[$a>}0a{ŃXi`()K@]$2o[GQH #Oy~GZb(+׊دii- p'@<_IQHf%%~qCo(L0.JDij)<7B>[;igkQvl(4ŃCD)8A8%J y 7rqk=Pad@=K( Rp-u\V 5|P-HSHV'ADI"t~t5%5 dz$HaQ Htv,?a 4 g8 V!:n?(~ 1xnahX{'JbOD2+i%^?drˉ;J`L(ZD x:jMb)DwwwؚKG~J`/_Z2i | )$a+ےY/8=)k'(oXvJctFl$bNXD@EBSg'ߞo07)8hB+<((YSqou徵a FP,#FRڧVʧ= $xc#,ͫ= "Jɬ$F[jʼnRu= Y.D'J^QR Qaz|ZLF(QG#%xrdq׳ <85ókdQ) aE~QO75 =z+nDH%pa?J\[8(aJ?WyΏ.!$,"JɬDDiJ 8P`GA?pt/f!@-SW-xڹ[,OnB]))$l rAy$QJz QB#18]aDfQ 3ھ7">o='`JR '~(|Nh^ G\-wsʚ $,"JɬDDiJT:H*Ηz]P"DFI_Q%TKcumTU規0H%8IcZwSN7,4l&#OUuhwf(m!$9دҹjjRQ%dV"41Qc>ggWz{nQ?j5( KD2+QQNM>`nO x;aE"J!$JD@CDID%BDI"?/? IvFⳳ@~ov%aQ%aQHf%O^K1|_}09/oGO9"JJADyBDll[ n~k_7񋒕WD"y1 9)TnOkRiҨv3puB4h{v6VI(K~)Apzq(Y׬c%dYB"3˜bu`; yg4 Qwzz(XQLс1>cq)nf֋CDIX"D$ .sR?$Vn*q;iJ5Q;ovy{{SFZ#-l1V^d/_d[G޾}, ڝi딡y!K˚lRp9I tbu(6FTDO)J`Kp=U8{5IbC&)_37Z+ DO1i9-Z bud1pNy綖31ׂEk]dO?Me7. %aQH%I!X䷓湩T%8gyuw-xemH+HHlHЅ j? 8/J8YUrAEZؚʶp,g, 7Iߋ" ZD aDbl iQR_Rĉgc# 0|@ Jo~MQԚ6h'/ %ϝnYiu$ǁ̧XJN`,g+^,K|ǐ)w( KD, DeNJX T I3TJ @1{I@1Ҕ|J2pz-oGc@ֈb}JjVN*%İEZdE$cH7iDF-QKM q&%JitNK x="5ݴHn؟r>-aҵ"JL\ҸXR.'og%aQH$)iqCjbu[A$`VJ)Q"_U9Iƻe;!2q0d2ss/Fz)ոX >#M:ZtCb\_*ꡘBx*&J^9gNi"eMRr8gTZ' >xI2DiX%=ΗL $,"Jɂ$%2-.sRU[A$`>J2V[OɓH5%9W[^Jpyx]в[pl=mъX~~sCC!ԗD s %M(w e4n $J\,_#"JADKADI"YtLeNJ il*D ϕyWpT`no8{I~7;S*޾nPyvuYl9>PGL+j)0bψ;;zb`}jB16QL<FCZDTuy % ,p/`Z%Yo]QJ}waj!`ak47oҍQRG"J}I9p<?ZD4fokNXkϴ5m`v!Ji7|0M5fD _D^, _fQ m5oSg੯Sݸ-(I$DsCR; ɦRJK~qKq4mhE֭q~(Dpcg.ᓚTWþI0RnRtwmq<8l\"< f Қukԓ֗: D ֤ ٝBL4.A צ콙5\[pE gMöopRmGcPGN xOMFoNp&\DI"Y%2˜È{MI6Qka}gֈ #`w߃Oiۥ/G叒'-t)OjZtjԿAO2w_4;i)]:(I$c4N|7-S׾'%Fᣟ}O?S!wOC2hC%0D~Yrj\Ii{eX1Q~][p4Cn d|}_]Ý6bSS?D$%"$"J5 A?h2p}+\T&h֎.3S̕Okg?u'6[֨GЁDDQ:CCmkGyWAڀwUJ,( 1Uy//V˒-Eֈp>&}m왫c-LK4TMͧgpq~$|~!@+p%d"t<(gҵ| BҨONuyYpQn.m%aQH("JgHJ`i' K ^ :0BH Bah/U,pRg-ԷdZ8֣Uw'E&=GZ@ZD.6]<h^TBMR^k"J%RQH("JgH JAK`i%S_{-4XlCJh9"};mw+&OLD@ѫG);b767=GSj";d1}گwy~R.NZ6§i/6+.]y sG[#JI9my{_΀CWOߘADI"Y(!}QO_ЋO+B]Q(ry!yh砠tPI8 :;J6ư^4r}(F|S"3ER*^~]CP;JB)ST=l"WX/z$t́()oޕFj c+7 =m4fnQH("JgHj2޵WaG~U>]Z/rpr{I^CzRyԣН__kE:|v Q 6Kc%{ja:ճk+݅DZlXIν.> ".!\ Y F_ĘW[b=U-,\(LƏƐ-rWjĖʱ"$,SDΐ80%A Fe;?-"-*|.ba?Fg,l X`7wuXRQH)"JgUқ7oRwSy[k16QVtO -e-!8B$XRyxS;>*RZi+}[5|StssDDQ:C$c%AL^Åolc"؍i" X{lC(I$K3DDI'D-@D8Xt!A%)D(X9lcYJш(u $,QD%aQ−7`<(PKwY޳-l1ްQ ,b6%d"t( 󄈒(G`lȈ oyE s8;Ȕ(=GzT \(PD(I$3d2t6x며ewޝ6޽tY%Q y߬WAڀF{z,z[¾|.@]pxHaܷCdP,l7 %d"tLF%8 aQ6fE+Dꎉ4EƓ9%aQH("JgH=Dz"i+8,/_xc%xMײXFo– A cZQ&Ț(YcrE!rerv>:Z|;Č<6,6G~9D)}Re?0%/'3HGX> JĮZ)t5& 1]Wt@/{=4)9hCAH,Diвb}_4Ik641T:ƌ=S,} e,nk[xϋW|PޚBs>4%NH[g4Wt R頟صL6 #0P7{ l+:ih<@կYM %aQH("JgH Jx}U:OxJ#D3z}%wX[*6 gdl$+{e"qڶ0ViH#OR9lzBH둥ב҉Zh>5xc ۵RyZ<ѻDDID$%R%6f6[)/KLåHÎ3'Jx=(QeZ>U d)ƁDnҨDiȓ*͚ JV[ک0b( -PI7OgTڤ~EGyM<%$$, "JED Iyk ^MS^(Hxj%h3xaEB<0hY d)nm:z/@ZO">(aua%zbTqC9'a3 ٫cVҊNVG`0i Tq2F%d"tD ?S{)n)|w{ `\'/px[lbC橪R<6kg} ?M0_k$CtV8[KlE ̿Ɖ xM!c|JxߝXw_2YMlRdK(<:gLC80d=)ag%#C&Og־2=QX, ]4;:&(ٲ`~p3%]!R $ %d"t !Jrk?17@wP{, #c PLO.} q*N0W]-{\_8~oyQjY$iJ<{|&O:WS_$J.o)mr(-3dE\( KDDQ:Cw(*;:NSOyt>x4m%x]o=ɷvn9HX2_PR"C7RUlٔ=oMphڣ)Nl H$@|2/\ z#pn+:>)Kїȱ]0ypڸ}fNuuI3־2\u5g?B֊N֍ %ڟ]Cp؄ \j{-oivP2;%zqj{[V8"JED R3=ʉJQGDT# 7.MqztO%J.6Hf %d"} tH"f7OS[;-10/wq﨟AaY( fWj6-ᢷ7DbK2pYTX-|̣ͮXh~mc-_ȁ(٨h;1`K,5D 3-DB~Sq ccD6Y?E?j?(([/<A3iÆT¼3XǹVVQQjbED"(A&QQAޛS\T2{BbqJm?DfXw">B־p(I$DDI'D-@D4]Tn8Qg'C֊(I$ DD "$"J TfOrQby(K_(Ҽa[9w#CDI"Y(ADybDQ* 8OLeN?}\5Qj)$H.."JY0p)S~6%&J=M=[.Sͫ-ckDe6 tQDLI4\'Eh#mm9@i $^D "J)*BN)( Q$:Ϧ} ڢ,Fu@DI"Y(Ajoyގ%?-4ek?x읗c ?qņi [%bD cS׋Z-4BV&Jޥc{L&bKH'X:g@Di8&6n/[(I$%HMp;xS9jB4 p~Gj6x$ ^c;8z߂Њz̻PL#nKU(u|e6J5\R"J!$^D )Q3 *Q> 648}k;Ш7{'P E kx_M^lpI#vڶLFy'J^G|alAYLk뀈D(I$%HJj;`!pޟ(AE!<ڀ|. EZQz)D(;,Ԅ}$_d;Li̡W-D4|evQ:ZsFXD%BDI"Y(A%."JK7'?PJK>DE5oQ%xT;F1ջ0ZRW@GR:gu@DIX"D$Ջ$%Jx$ rAipT~} U>;o&U{-֛P,!ui0QJU 5Q|e:{QAd;% $,"JED 2<{pWi'ZǟpYw4xB+-У_ʹQB C1';zn՟2'HKh|}9^Egi^}5̵F0YM}e4+[aQ6~cu9[c|𦄐|;GBDI"Y(AwǨ!8-L@FEҜY16E^)soE7Sjb\ɻfN=rp)(I$%HMWd.u7Fw)0k[Ef`{X͙ckDɻBy::ÉUGy"|*CD .,mbh0 lӘ1OM=|wibZKM[BH Z-ubLG-CDIX"D$ՋCj_~A[ÑrS{'?ߟ Giv|j% 16Q KL`-f; sz%A(nB11QxyGL(6Ŧk;U|Կgk[%-CDIX"D$ՋCZyd:Ҕu]FBx ){S6J6w+ gid-g@XxS A6}lN[CޔY=[D(I$%H(}wW iԴ2KBi( 89 ~-4d}Ga7*4&mԫUok{LY=X7D%BDI"Y(A:Dի(È/Mn=.,%yPgVA lTĖE6sR6StHQYܒv^KSzxQ_D)ܺeJn$sQ-|Dņ0-, WdD/pٜ Y:Ĥ;PLX$D%BDI"Y(AQャ@ oLcN"J^Dp[<al95o.QJ]rցyx?ձZ7HA("J2!$^D 5QjヺsG(&FD_w(+/dD%z0E%NflY',"J!$^D ѻ=:)qw.\ p6HvR\+a/IG:%aQHV/"J(Bg;`8dd`O'%_pġ^ኘxGwi:a-QBJ|bLZ?m,-0yV:ʯDnQ\ t0Q Y:)X7Q?4uZJD"(AKn3hj&L"X7QH$BED \$k"JЂD"Hf("J%aQ%D"PD "J3_r;Ϋm k"Jo߾GVF*V"JD"(A&JI,Qnry \^%g;s(<XaJ(I$d"۷oN$8ywwS;N$awW& D|EZz+_כvʤ3PWh*'\Z!ph62~iU i_\ -!JA`8xiJƓ|P|>DηthU(ևC|u(I$d"^TqR˴5F>nJaKi-7xS N68Hp2"!|=:JHZ)(O}#;afD,6ɔ [:D)TPBQ:2̪Fɾ_(ս-& JഴQbd  i>y`4LɉßQX^+EY1<µ $H$$%hиL#a!^L9K[qOx(Qߨ!ҿhzZ#@J(n*yfԍ0]ڋybly$#, ( 0߆<"VpgY ׂD"Hf("JzG4<-^G swsX=(ak "ڿԪ뷾#xSrDZNS[DnFoZ#ɼ΃A&Eme09ZD í#\ "JD"(ARcƏp/{ -fDXⳉDQwt["]4Ҧ R:ykADI"H$3%H}.iG;bx )%Jԟvy$^`F<|!e7K.QBziMo!>®:W.JZC3} / 0 `J" J{zg{(GD$D2CQGp,hPkysmm2=ojRu> ;uԾq^t'd?Z-Ap:D-x_adcˈz1CLc~a9bGPiyԺPϨ.vk-+az(I$d"907m.kr8+-(I$d"YQzmݟ^jTm"J ЁD"Hf("J%aQKDf=xs?od@@qңL}b2Z՘:, ?ׂ-%GCԋx7D^h3p-(I$(AD¦ob[ZS}οrf[w{;^ W4C;BY 'Dka-e*4 %gILp"jPNGIkU,9gԂHN%bllckcG"~ ,'@:[Nzib6}Dwx, ]@$e?,7 pc2\\thjdх@҅6C( ׂD"鈈>zG=G-Dm|EeuKsL ^3 Ō !{dI+ v@h@ z :^rj4KD z5b74y3dD)-'=VbrR!! ;~wo{OC3E[]1!* mQg!xRJTQ)gϞZe!$H:"1 D ni !cPSSU&JOB*Gٷq,3"Ĥw[~ ,QJgIؿp(,U1<'J~tZ]#4qX26C(?|㏍}\ؑ`DcPS%P%|V)[g:|=i4DWktseD5[Nz_c]f_.HZC'&q#U(eD},?x&Ű4iTCVkA&QH$%%ء¹ZxD %(esC}D a?jƋE\J0.S-L NZ(㌆v3T~T16Q'ŵAFuwz? ΖeUp‡J\ܼM(qf'J!j :#HҠ"J,(yO0coϞ=C M07_,%%& iQ561JOQu(MRxD$IGD 5Q^Lec #ޟ`%4|;k]>Nd1G3?#AS}Q~?e -aq 4diOyǟ=zqңl%ƄBա9sLS­!j{fd=2A B҅6C(Oal|| 2,P>Sb O",;J`FͶ@(To;G!$H:".\| sâJD.B`bQ?dlʴR%J;MHfDD_o;G!$H:""QIo޼\?µx(X|K󈒿ad$'p pX=}O={ p(QqH[h i\~:9 %D% w( ۀR4Np `E|$ /0KEpx ^84>t'X^[iN5;"JlQ( 󄈒(0Ug>>Q9Tj)eKA3iVhlИ*Uv4W@' J6JUuM GjgEJNADID$IGD 5Qw;:y|I+_#?ҫpuv EQÿi FA-}d*ϟ[ E"U4V 8D| {is+{ߺi1`,c%%?h%?'1iI0%X=2L@4+cJOTGp%η^ ;&G=Q4˸̷J̙8ȥ;}9i%ZxO Q`堓0ҫxk4ȧc|} e uxP0xaӏ~P{N:BNWјVcwp{:[1O%97?¼-nƆ|~zs8Nc)êϙg4:7d5|%Z;DrYQAпqU*o.΃jIܬKV C]xO ߙx!M+cK1/{p%`(. F'BH|0+F;D*%Ja 7%JqF8%JG`qQo sw?f HV,!Jx6,P ^f @ꔼ4i =}4IR92-'PxG g 1Pqսns~xN>4J0LI#'KQXgoR ĺ?p?Bkd@L˓R)Q3yOa#D+_7׾韞x&H$vn(x ,!"pe W+%|U@#)S-%t4,%\ )QCqChs ^EY&x8٘&?&Q|DoKcΧ5~!ˊ Z7 Ust&okG5ΝF`qQw]{rI$-vci"rU!Z܉|zpTI[*m Z0 yX1hah`Y_Խ0!Vcg?ƔxLzz=jM}K_ ['Ji(ՒyZS؟*gypmM0kQ={n%nuwaCp*-$H&%H7G?iʺ2+k, [c?V~16Qa˞#f <*]d.V7|-hdJX)vyMdE֩P);W+Zfl^G<}GZ'?Dc@- xK00qڞ$+!E$ee D _"C>o7{~Ҕd9~/ok>(K>#~,H|:iuF`ѻb:ꭉ3bW%xX)Ђl Ns2$\h[xG|!\6h{V>VCD(kӉlMJT(uv* RU;IK'[&JLO@%P+\&O.-l6* #'k5/2f7,9#3bW:myHv+YBQ)D$ee#D_ x}_A+Q3 ӷ(K i¯Lȴ;C*`watkd ^ 5Z-l?CBa_hti-yC+RE8l%3LVwQH$%A:&4C̿!ݍGϭ Gv $H.+"Jc~[j\ YIX`lZh?|&-c(~Kp-(I$ˊ L "Jµ $I'L?z%A "J $\ "J an~G/$ADIDkADI2(MdJ͛e%a ,QzRܖݗ9j-"JDDiz('#+ܝПr(͂}Ȧo8-<6k%U8!ʄ6Kޕwoi&t^WW&(I$(MdTTHp)16Q ׇa IU"4q-4ģ@%=%J_/ ,/ݓmy"iOrr:E!EZzOy,eF:ψM5Xv+ZQ$"JCDi }LV %rkai7ǶJȁRYbKHbP(IFig}~']]~/^x.$%JgpD?͎!D og_IwxcDƓ%\h"޽{w)/^%l%rkQB™W_%8;{JL@aQ\ ÎY,:Q?1 Veg$zў?ط–Y>EZV(Y)O,Wy"JɩD@aw71䳘esA8faF?)&oŠ( [ I ڀ[!(*EȰ^+"?ڃ-Db4۲[ %p=n,7[DrQ9"\@4LC ˷#Jǭ,-js*<'.|NgޮD,-3b/."yΏp:8Ebq) .r0>o(QJ[C^g_f/E'*S#PL?Ed(ˈ$ 5BO%BDI2DxCOS0X J!O>A.J`O>aFjxaʷ0$ƅ&% Sp:Z}%&JW6] C^@LACp|XZěN0Àphp&/ǟ#Mjp>LcV,#ãa|kDV 2K5K|kU1: BbDI:D$#ID̥C|>Qb4͚?qRA@aHB YNbnkG@)[ׇ%IEƔ #q-0%Dr[ J"Jd)DɀKFq`ej%؍el%ħD @JGHl @߆@Die+l baH< Uh3fLA`G<.|mA^()"Jz;iyr-o(SrpNY~敥+xa,OgJH;MHS^o%H"4=DƓ(ُ~&25WNYtSb ?4cM7ZXe?hc{x"k\Vj~ցg5"õvdSC>f\#?:'gK„ȣDkOXS:U;rf;e[WDi1-G_>%{@'XXG{, ouJ|jǞ 'rAPISZ5r Q zG}he K˘pGqDku~[16Q,DesSRfFD UKbG&gbAj @GNR"J~qUZZGB/ί`D drcŗ?BRgib;_28>%ߪr)9i "JDDiz('5Q?PKJT&u/_:VWw^k+%΢:\¹4׾ѲdB-vZ֫#lڜvgp.^Qo%}9cD^`ٯ8(u8^eY(ZVX)7ݣw1iʊbNZQj};"J̍(`­'J&˪&JX> Wd$Q"JIMR7"^8R^(EkbʺB 7HTkY'%Vǣ}b("J:I!<< JƼT9ܱoE:,Q [t7Oy$me!$I~__maB؀~ D<_t8'S,Q+ o0*_[a>:Q4ռtRe<NXiZlM& £sQbG&Vا"no(3|9\p?L2ose؂DD "7,ݭ崶d$W~~~Edb~K|G+7J"Jxk1Qƒ`F%Ag_Y惫rP9N>QjiY(ħ?acfwKRi5Q jgAtyzC8t #KK|i.1[&JIZ4&aEDgm8,2Aa$dƾCADI2~kOm܆~#DG`+hDRֱzMSUmОί0LG5 J0J69T˂'HkUU;ڇ+(ְuuhW.p\yt]`7{{CDI2(Md2ppV p@ӧSQ$"JCDi<(Pf.m%xqq&AukWp-(IF!4hGI'IADID$#;{Kv O~X/Бm d 8A Xȑ8C92Q{ tvԷfabٛ"JPB %JpJ4%O P[>JPB M_W#Jpo+|MԸߚ_TeMG,lQq\"VbqVF oW(־þ~ Bi}0wO+B mw 7VCJS|JP(ŝ&. +0+>T(aoGJN-7-,r6኏y?}'>==il.\-ѽ>nLuPbU=JMӪj <)K\tV!5vh#ܮdYn)L Z}yZXuBAݚZ~V+%FԜr m[;~eLx_,ڰ2Ж{PXN2K+(3JpK$>p<,Tw+崴|\9E@e~\ q]T BV9=>L*NAP"g|jXBiK俩S=.KHDC>S֯,oF i%7h2 u94т+PJ#\hTsζjXn,gB#1G( Jz¦bBI Eeީ-ܧn)Z">sB됥cSVr@(A %#v2"8 %p V@(AD(8">PGBi{yyy||\$B b)>So*})V1J㸹P`{w^sЖkxD(ŭZ/Ýu>Nغ &G%=s>J_̾0>ϛhն}ky|/׉ Vȇ|h%TZt-n.dqkX=im= R(}JO{6}kw>?~l6q(3l-K .정>PQh*Vi; 1nږ4PR8eu{SԀk;Nӂ-slۗ,L_Qo6N%oҾǨߝXjbWT+/}E1۟ͨ"J-џJ{oU̙PirzTaUzͽ %PJ5yU,ڀ}@?~Q5к\ j%[ަ%v_;- +$O}#JJh4 T+~D ^l<9=#F f\K@B)z%qPJzsB)bږ:ݩ>~0cP^eiR(ll4lUREi兲[雸^|GB)MeFYniW'odԇ0Ty&is0{ԪdԟRC;[B BI-h:ѹrZT?5J|{IAgRX|BI},\0O3+ )D Y@ɪי7+t#*/T*TBb{UR)޲ala.tYs?Y 2p,>=ZCd 1so-4!0T?ҭJ.QަsvnG%^ >JنJqdG#&|?FҠ<نGq} ZYVٛ=q[ ƱJTVqˡV:j®Ŏ1s+ƀd;Asf*S4z5Zj/VtXgyp"/byƜe&~)4lҒ^ozY?SJ&kPX %0q|YdYVBIO5.Zek/%8oB(}`VޞPǝ% Հr 0:bsqBi=%9J`+ tg@(NC(B lD@(#B %p V@(AD(8">PGB lD@(#B %p ?]e a9q{>JxPZOY& #lkjruYO]> iZXZ[YQ>JxPZZ1qBiyS2,wUbY(===i渕 s:8S03Vhf`qC1E% %;K{4U|g4%_5]%8P29{YƠGsP}}GW1?U-2=' cp@(c)~,.i)(hJ{9ܝ3£o YN 1w-Q2+˱ YM?[ {xOxF %oT;~ӭ<:1_z2S)fivұ_Aw?4STYNj pJf!ӛiT,mGz-HI_Ay݄ne:B)>.8!uX>kڟ:cWFnP}xrDLCG(mb/P10z҉J?ˣCV(bqON䞴BiK0|j0A!T,#tٹJ bSu_co2B?+ ߀}³0Z([c⮌ʦOj3>+JP#jNBw%s Kv)JV(ō̐c[AKtĜ|KсP(I{Ŕ :;2a(K+C=[5JpK=:3 yBӥ[:=lWe:n\SA(cU(YVQ MzfҞ?)O[1NIFX^_z=˨ dU-[Mb( Beo/i 6BteξSXNɮٽP*ӹNyܭp*+A*F+B63 dz>miPR5([W^w %8P>6aAc?sӜ=wO]9}W@(cU(YVQz-y->+Q}ߡ1u\S UeYM@Vj ^י>XG(UaNi[ SMafS<0JJe`:)4E%+$d kBY4ka1R(Y:W^T_()VX(Z] %8ٟ>@bሒȧB)O?m 8R'T[ʜzO\oUT;ZcX71^,u&R:M.Ä(u n] VBIdz_JSrOUGJR:)B)MziB6@ϨP2'Ax >NOq%c=s~\on]w RGЧczڝ7}3roq,RbWBfB)"0̵[T1C[5ŋjn|vNѹ`}::Mw+]6Ugɐ9E "ǎtSdGpGJ`[ @(eζyb)pP􆠉%ׅ@(AD(8V(=^nQXUJ^N"J`+ "Bio+U(P[>JPB %JpJ4%O P[>JPB ш~_q4}4%OD(hkJXfs0| JYoڊqV|nβΟWxP ;=70PP%݇PZ# ̜ϙn %/M~EHFح#^l+gtXˣ1K=3we((ׯ/bc2"JkXJYolEc&Rh5svٗ񝲋*)C~1n'32T,\S jE-Kˌ{J1<"\*+3I}#JM[F>MM/K蹢iN(E4ǎ"JkJgtD| r:etQvV_Q3ǎxo`Itq3B, ?F*O/JqeYdWYz:Z9J.X=L4k٢s)͎(yz' pP*[юPPl'kkZB鬾%B%o`6f{|>AB(pk4J'EpW^,dR1+*;J]%xV!%2犎^Gψ' pV(U[юPJSk :mg_ZQJ̾ K˅RY1B, ux"G>~OR(ixԇSgS޿k.ݻ84;;@|[ ;g2dΥ )DYo%5JV;0$Qθf]jc%O;P7Xfck ,MC(-aׯ_35Wz#Z۲}PmQ6TlHӔ2[H3k%P]^-C*K=y&Bڭ+?X%5TLV;0嶕ZdxI V݋t*<Z ,YVoUT-V(ZiǭkJp7p@(Aev ߃PɣU5t|@(AD(Je B>ߪEYj~DKXg߮R::n@(PPZw ~y?֍P[>@(!<,?OnȁP[>@(A7%n %8P^C'J M奿Y6Yz@(AD(">PPJ5(P]>! P^C',^^^4M)]bߨ+M[}X'A폫ЖaJbҦ> D5X# zEܺ% w}wL5Mט61?H;,[Bj>Ҟ? VD(De" ԘÕ7yv ’{:^+SIJ_&se\]_^^$jĨn, ٩wo3eE7JB!~ٙP')Qp޽> stream x]يF}г!7@x<'d~ܖ>4[bn֒)y|0`uݿK[C=>ppEC[ԥ.Z{}7NolaMk񕭿.^|p|T݃+i?(wżM: (&eUIc8>,3Y4|}XRhm^b>; +J>ic'|ʪq}@Ojz= s!<_gfj`~Pq\-sr ܮ-X+(_D @=A1gV-[]/ԓu$Ay~ >Qټ,OfZ0/=4ȎkYUVv4W01Zv2nGGy0#`=YB\(_(6yA?90m|Rwlx%/U0NdCض@ 6Ƴ(y`Y4Mp>89RQu*: 87F,/<.EypNNN/>o6 >k^[_gvB"h"F$;NCp-*HŃn5&rIW_`9DY,ML?flii!!^UMB\(IR"I.>%ũҧCh dPD8|\ ܔ (`eΔ馟Pt nubHځ- , YD^nXL.#:e( /u0|Xx<: N*^nF]ݔqSa&)7e宗qUcjp)VP=Ze5\{OVc fcnVVTa~?|8eV,׀8RйrͲyB6yJ 3LƀXz[I"viTa2 l\cSjkAzv 3e_ӂCnQEϺ/❰lcm![aôZu  de9ćDnikƣ4/oKF%#6Rҽe hokS}K650u+¿صP|Lg8}>{Mzx[&$j`z925Ghⷭdt`Yc(`rבh m[ .jRTYبX#h_|Nf:9 vbӰ&T(u{w+Y\)b*X(IBox]61`BY0`y#K$]=N`F@{|Vɹ\nejdԧGfGn3KH{ b)ƃpx5lNT)%=!MQ2"Vv 썭Y;dFٮ7GQ_SS|кF֥W;r@qO$I7D| D$!4Q@^im ־5D814fyXK >azۊ)h^,9GRcљ@K 4HOd#C0t^^q+6K_{L.ԵdlO>>'BjŦ?dnAٖl w~Ĝ#NMM/DL~3NQ5=E8l9H61݃TS&gvmT8p ,p{t4FںO2 }xmw M=dبaexx/4{N36{,{suGw5{L㽪䙹WYΝmrn;{ݒ\7fmz֭5Θ],I]!yyendstream endobj 132 0 obj 2827 endobj 134 0 obj << /Length 135 0 R /Filter /FlateDecode >> stream x\ۊ6_wuS,ˆPC })kWOz ]BŶ|M4ߙmΦO4i9 ׄ&vh!?6J҃67߿5Ç歍?4]_qI޺0]OWL|<>>_y\n+ o>!Yl}92t%>sUwEbeհu !xS_ݸiU9x0gi +e-`\EL{s+(v#F=n2.C3nqƤCMgi!̜( wU>:WhfR)˪>i$InD&D"E޾;y7 Q- Dsed^׷q} sC1fE#ָ d˔C)Sg:*F`#.@>|5Xiʂw2HqWDn%2*_6)P#^ 0@ܴgVcr\R* DypU\dPDp ol&l5Qn23n̼zX%D7[ҺNwmf)hmpgGí31QHG20CR*43DnْlfU($Vc!0Ev2^)lAJYL0S[q1 5ގb3%ܩ~Hr_-TՐDj% M"Ч %b޾Pm[IW]g(f \ÑlxsL L-1}0QEkMZ/g)#(Rb̶N{{R *Y+*tIID&2U 6mPET=‹]NNW+j%z^0*P$հ'0 u"z8kd=yz׀`=INMB4@7/p0YzȋZRLgTȇYU_ N`ʯCq%9Nx( \Ghh>.V V44*jǁb -6Q̶в`~?VKbRNQ3aҪy/'2oeۗeLlBٿ?,>:tHם[1Z̈́9*W>%^)'-% t2jG=1m4vhpyhuPh{mnv$U_rTSI!,RxOƓx~{ƓNzϦc59{37 |F.@.~/C5_mϧKh)V6EI !sLNV8/|n34>m96k&r|ap1XΦ~C(<p!Nf3'\3{089L>aX1vl/|B>ݥHCQ3> !qq~y*.b+G] 2q%nRdR:dI UzC0v [׎ ɬxN{k,[ϟh{exg -~x}\3x5}Xo>6юRUwch n!p KBèCS%49԰$ ii칉/X8G `4f|z*1Ռu/Gxjg. w4ӷ%"mL= R7)]!呏7]K_y|wWNd*C{oʽ.42;$M]rHt<[7)%"$GBӻzK8} -XSZdendstream endobj 135 0 obj 2316 endobj 137 0 obj << /Length 138 0 R /Filter /FlateDecode >> stream x]ێܸ}`A#;ϛ H~գsX}Q{ ÆE֩ê",_Q?;Wmߊ|({r ۿ|Evh+7\tnWpg|p犧 WO_]Kfh\~+J=4| 9<~ƣ9x(Uhl-zΡv9B|F2D8"Hwk4l\Y@M$g\BrEOjn_W!^S8Ё"pzz26Χ*}|y>YJ"Gw*wE xOcrՐ$3jߊ?Bk[ &2)Yw[EC"`rT/r==Ol[&'q9%g*Wf_(1}YC " %n(A _GM!,H.$GB8y 6a0]\N&t&]+Є*`:ꦧG\͌@X<c] .1RaH}lKY0H~!Qx2 1َ f>3xԮ<:4ތ6#|Vz!5p T4| ?մ83iR vV˘0@;ٜ'<>Ch=DaAQPI-x?"/.&wɧmXDĀAe1|ՙ1ggfH%ʲ,` se3}5%ž%߲TaAqM&[ȏ/O߱-,?EHYy#-hᜌQIn0 pE9X(uöKI?D=t-!?YNd%ľ8H`B"$X I*rbLFt y r#*QD-)bT*$YHYؠCz|*&6~ y.RCNZ,x> +;& J$AY+CGkfD9;RwC}7B+;XрbA@o MbⷊjFO$"q7'mEfW/, nBaS)"2KV4,O3J 5@"&yC&g&H'|"x3]$  2NuH?X]J*6 '_(k./a|z瑏bGBmGy$2a.+^afF >Q[sٜD?=3~b/ {sۏ}$޶v+ЌTnKLSc@5Nx?!&TZ*l#6H'ldX8nFӽqYtvQW5ȡ왦 B⋹2v)ǥ *){ps\Y}\bd92O:McK;GOҝKϿ9BSxL^Fı h47xULo1d&F#6'y LoTRrR2/R1G~ǩK P]oZ:]S^G)GfФ$0@8^OF@q\0Y uk:=su.%c_4 "zc Dz+ybac,N,J*EfyųDلB8qZF.7F#_~Q-֯%Qǟb73WN,GIhvg) M ?N "A APq}l3z/-M$fH$P=FT0&?h3{WoW^ LDCύW (DK֙Ly%?ЋkGw#Biph Oj[;k/lD#Q%=Eno3g.ހڴ8<3|n͐Ȇ $%Ʃr"JLc{y$լ?~.Gfۆ;io_?\},|gZ5~\O];4۩[O =`;m]n\"$ՁwoT}&ﹶO#%#&`ޱNhKzүsendstream endobj 138 0 obj 3103 endobj 140 0 obj << /Length 141 0 R /Filter /FlateDecode >> stream x]ێ}` x"<; ;@ſ5lκ{?eež[x)WWB]4@vX\t)Ҝ=k.xUU^Eo7_M]G2Ӽpmڥ^JӾ#{d^}kpAr/6_O7+u+=h-:c=?7PI[65䫟oׄ`)$9UY6vInaR P$?IeSS<~&]E{d3ՑMEh$)z&$2+9HdTa{Hr`'>0#ڇE4 XC&{-4o_"m%»8]Hy"^U2.&T=HW.n:6*lP `*SWcV0 yW!@Tk5 ZaD r ^8$2gƅ ʇ;>b`MR@%5H$ &c$"^,B(#vNpdYإp(A A4$EXfr+K F\.>+k`ln!.yB$-g{G.J)H04 yJҺ'` ). /jq7nQn;@i Ɏ[f,0Dn-MM`I, n4|pi<:ҐxGEHuN B˫#Y[Unoq8)Hx@2pt4G1lNÝA'5K^Tb\lF"+PE})`Q:PlWH UukJ lWenir?%&^SJ5$4ã|8[" P.]DDK2 S=,p(ܤ2q|_1>?#X+KјބL!b)CC};asG;!cADjOM.hE0Ldi̸"kD^GnDXu\X/?&f '~ 'ƙiv(;.Y:dX楘Rv?i$ve.)V9 rd 9Q=s탘<5r?Ye)J!49- wu}YuXb\6c˹LZW oh@KCՙk:8M) [BrB{bԑWY܅cç)hOU. xēu F;5'1+bNS1P9dv^vf*eGa4'<&z\̱x+64]3SM3Ʈ2JQ4~={j:qiV2 aΗ42!* s#EyFѫ)@Fs,USBdFHtlTcX(-nԚ\ъ).cg%D.;1D**YGeIY#!kQUCRW4K$*ӊ4IiHvGO`@a:J´0*vwRLe7"Oݬczh>0bT5䰐FuHY"aaer;˳H\iSfvhEghu\q4 Ya8;;]ևA6x$T{2"Q{Zj)풟g慒WϬc~c`Z4_ ]:N:y=i?9RZ JI-p-^ᛑyV Y+ *.ȱS4hF /xF 'ɶtps0 IOv yu{ӌgAk fa4Lk >x8v#z:ucϺt[: E5 <5T tk_koeBeRXu3st=i{7!U@ hlih_4~ _VVD t_eq fel5,˱46a yЂELS%IdE:"ųyc> stream x\n6}7snśDA;6@?m M%_IkRH$ԊgG/WTu]}0U MWl<*`U?Շ[{C뫦c=Mjiopl{O ,06 RI 9kzpcWmǮn?Ç>x:LnN+X"=j1}H6k$.2uZZkAsZ[[ `[0uFB?IL=M-wWtnFoӷ! N=b寈*}Lyfb℡^rܙ݀ O*N`4>G V&쳘P 1)~؁Phd~p}U< EF@p+ ueNoA-6H7Y(>s<;0Zʆɋs$8@+l-uԠ6>XVL?W'ݝF hC n$(5jB/]_  r@F\19i}L11/h !-/#H EMbK'avG5Faӎ3v;G5aߘ8 7nHVpu>sI|%!'2NHQl) ;ôt. FА"ʒ$8d}T̜ʼL~e^J1<b%̞1 ½tɨ& h[KNh0B~  Wllj#}[,F ܑ 2| 7J}l3g~ԝCgGmxD~4,+z%YggAD&duk=B4XRb s@w%)3%0(4Y+ȇβD6OOEmqcE i dbR9dOp|jĖ*%&摗HEaH$B$ I+Ldѳyi&rۏ`O18t9UZyН&ʴe:k˿Qǯr֋.6T4/"-2BpnqT0,RdUbTC(uΤB(]$k5FXػy!ȆUs^H%Gh")hUh? 0+}l /yp9#2qЩ~]0Rs`|ss H|ۘ@`65 L5`eBϑWJ`lz5uSҩX[JRj*'`+unM8:K6.bٜs0̈́f` M0kaSs f.y%pX {[gnF"R kF=ITo3WY0?ORniB2rO ya`Ok:-8Dz( "Tt*"ʩLR W;@d$eeV:Ԭ^Ki!$9YG)m2gp)’JʧT8IT8Dzɗȷ0+_ّ ]D|PIW#r^LIRm@u;|xų'.uPMNu5~HH8W5LhZm^)*ϫNʓ7 C>3(ikҴζ$! Vmѷ|{恤6OwpSq2S=k9kx 6pb2L㦤F/^òmatUy'kh0aWRn\^Ȍ]yQm^ ps|GNTv[/Te޼D&u;{.p,s1t { m#>"=[f PTAo5(P~sPWOxІp4kmҞ iFJj/0EReicF/ i#v _4`cA5SJ}gt ?fȧ4~By)TN1º;0A44,C%u8փβ6][?t{Ks~)c|MskrcF͘j_?]_ ,c:ܲOUkzU\t Qdvx/Eu Ā;/آ1wba?lĦj gp.H$aDzO2ѶєXw#~e'}ءWnoCSgcmЙ(8`.{gvn?k/נ٢au3Wۏ&_xendstream endobj 144 0 obj 2452 endobj 146 0 obj << /Length 147 0 R /Filter /FlateDecode >> stream x]nD}Jwilvy"}iė9USvQJJeqPtia ]4o@N":;]x w}? hFb}}0;%50ya -)*0>tCpR9$oEW$퐷zy7@7w߇RAV3P2\LjUɉ \ y+0G[E@,LXעC>r>lgFdb)>ԀQSTLUtB } OS C"퐌|KhpPƲ;:LKړ80 YEkX\݅J q\x wYocBoKcwGg:M\/KY%7%,1!)  !^#%(!%$bVO[ewc 8V*->7,_#Fvo iJ$&R CP % $I4~tf08)'IV$|rDˈߠ6IAQgAtj3k!,b[ L<-ĄѢբ!L==m9]QKcra3?N(2 hn4Q1-IW޴c;,qDi{*L:*b 03knz^fMk/d 6e-+B!)-#m0C*K)h*y57LX kܰ4:^yـFQ^_AUSUƆKq1g6zA JD4%2$y 屰EL<Z [L)`U!s^dy:ƬՑ̤lF3mw s$걽UD4hKN˛Ǵbuúa_y0@,HZw.+gy[Mӯ6@L5f䛺S5 "ڲ!}"ˡ*PtZ0FW[PlGtcVTY?ek:ea@VY8J 3Nҋ^pjut1F@ω#E= 2p)Lh_6["\(Y#h S&H $Z9lMq?p^\,6(x4c:m[${3F8,-ǚ%e53JLkIǐIW%՞40#h`)xa~1sM քm#h@͒-Ryfvvʾ-JF@BR@%' #') ~m?kXv}̊IYg&Vn}Mm~+H@$eá9s_lgGiv5BK:䑫)^4S fT+OG&iY&trJBMň,(m3JΟ,J~Ӑވ/s b\ ;gΟ-^2[@#],W(af5r[ ӕ>JAT%q}ON[7 j>p#g},K>^4#],ڇ7n24| [}"O^x5~lRs4gߗxDПb?o .Iaw1o.ZkQov@霭Wɞl9Lrr$m$.9PJ6Yn*}Ǹ6-`apo 7?='9MI!ʹlK Qj{̉ Lcz<f#{$m4|>/ޫ yݤ!Y3Ǫz̔_Ҕg5Xp˿jJbe!&WF}}rd컘 \"@ L~(8YY[Bf\6o޴ c}U.ɶ_/B)2SݒᡇpxT#o??COJ> stream x\ي6}o@*f0to].ywJ5258Pn,1;*QLT!5@ڕ4%SH:,]zg(oi0esVݤu5߭&-i[[;}@MkN (1c-f)֮=46I#A/< i,eʽGn xrЭO(< @!bcAjg(/7ti4m>>ݕ{Z}X  A;sD`D|WDJ菭g):I$~h]E- fX1ZnWNKSq ba{_P}Ř.`Y)n1ϖK6Vp2fv\"6R99h|!͓$1S`$D #yxWF"bf_5},ty)2ڽn(˸ 9~4ޟN}m٥M䗉RAF @F/gܻ#̜?1DzeL33for2%'!X I`7-JXMq pdh3u%i̸Z5~*b)ay vjF;=HFV dAr&pkUVZ$O'2ႄd{9XhB,L- /N6XV:;"-g\> "yL$1qD.Z1I!VI!]h88qNH$Q!}P[F 6auh⧕]R![ {]ܹ+ I gg2o=oy~p#Pp$aly[wd̼1rQF.%EhY$ndy0ce$ v?9`v2Ȅ/L}ϗH0bc5XLU7/SBvu4ظ$}H!kH9Հ!nڼI;(`¥^M|c #JI'm%[&gedG !8oKJ`9} bc$M _a0 A@PqQ]Dd`x6D{YHaJϔ Ɔ+dh몪p!krh7GPc^tendstream endobj 150 0 obj 1949 endobj 152 0 obj << /Length 153 0 R /Filter /FlateDecode >> stream x[n6}_`U:vv~@(K~ʔ<ّc0l8~}0*6L~g>S_l8XbT& sOoFB'xw*/F~W?7hu:߹DDgomG8b#:Yt=B8en qzDH(Z}s#~ttzX!C^8+H@[jLm4$RR;IzwIyn/[XkWd$dG!sPG̑#8`n~둺ќ3Y̋<;9p (q+I0Qb-Al9 f&] np39 І=Ԕ|kX)Mꏅg f݃h(FTyC%^0 5EX؀2L)!t0H8N02f*G(K^@ pAXlL! y HHHS7aPhI;!& L#18Z${J@~"&G5*Bb*Y l][TH"^RT,@xd%00k I)RA$Z3Sh`DRM&(jI\\:X51gMΔOe2 +S+E"=+$ Ǝ=q f!fa}˕9*ɠC0bm8wLdhLxںҎM6`5{  .P Z6$AY]auYz7[w-ANy_&He)MO Nabj[ڮ#sJ{X:2M&5H$ܨʆZ<#KAE[q\ ˄4~B0Jl+J ={x i^{O.tHh+8%lcmJ\{1W0ŹOSZ67y,TYZlDNT7u@ ۱o΋ awضI5(hi1;O7萉=hzĻzDD'etT?f{@ (6[7ĞJZ֞kv6OBDi΢8\Ϻ#vgf L}[I6UZQ PLo, d6yŵkd8tqAۭl%GnNw%DW\~}tؔn:+.7g9sL@E2>6/0ܒvөH;cV]~zMr7/#u혛2$}+O+a6ݘњjOd0byb[ug$M%$$eؕ:Z~lkL2@lN=5wjd7G1>?4%g \_Cf&{D'+{'pLu7g] _/i4ի*կ|r0[_떐 m/N2*6؛*~p#5.mIxZD]E^=UcOAi!s]Ύzv1hbH޸o}yfFg9^"qx_Y\̅%Jq!9 ;h_Pl3@)% pG &ۜA#}PSendstream endobj 153 0 obj 1743 endobj 155 0 obj << /Length 156 0 R /Filter /FlateDecode >> stream x]ۊ}).2,}ե.:w}>2ܸٟ˷sO{<Õ0\ +U7J':^5,Ʃ+_WxGv|bR-WzFWSSK]v04ڋ].Q8BUܯaw"+mJ>eխsE Y=Y<^ k*/am<a# 0̨^GwtX"q{Gv 9 ^ˑ #se 3~3w5%Rq ̯aq\T)=,@d8"=3, kOmD}x.~)Ggx܁πv؏̙ BrYw:fKuanZS#mwdi *xX "Vu$eIB"D4qKT+#KKvv\GY֬?0' oC{p6j) ؉):@ 6$.fD8U f<;Kف4= t7~"p2jnDj qu=L'n'8lN8ъ.wp B "6ywt !NM/'m** BSG 6_9лxI˥ >fVKFuq)FA[*gAtL7D.&gA3 8 jHl8mIIĜ &erL#<<.l;rۡ %n(r3@{"n kouIp^n%1"V q}ux` 710(t 'r>m``XU2,F)FQWC -KP=^Y%wD= vl ?ơWzAQ $ 0 {]@_qo$& 3DnN> }u%uI#Y`5z[ھؘRAK z]GE!#W r,vdIb6']l5sT-Ey$eO * GlD`lӪ15u;6yyXq]X18vUJ$N"') j^{#sX\*iw~"<<2ҩZǶҰ-xE I +!3VF_&lڷjZYh# OKAA(y!iIB]Jp ]u#?Q&*·Jɹf $wPgzBoH+F36C(Pǡ:V 顸Xl$xbkR寋OUnNJ@ITJR%ŏ] fKZW&JGiv(ƤEkZ(ѹ&o?7ށy}0]`cɓӊ;BMp i)p+ PӔ^DUlk T:KcuP\G(9 _{T] Av6ъ&&X>~BJ^+,@ 񡧎zZD%yemE=WUoYZ+&'BriJ_z5`+ua].Orl8qoL%Z-~BKclfZ)vGI|i17mCEDB!OLaΓ*w19-R.fx $ / S*Jf}-?Mf]:e]y2̱3mp+nTr(JO Ęa)kOɵRd*mջ]1|K(кW4EqfsmlUԾAEm`^>==d1 וz{|vILDI擁dv*$eVcT I3Kw҉O2I }n%qB8`綪AKI9lB@Npn$Q/Jֽ苟X%MLh'C l(RhEyYs>#veo+3.ǒX|U2Pg!4)_c!ġA w!wm5npm01)P4(@u7t&eZ>/qٌ~?f?~jgH!h-%> stream xYۊ8}o:Rjsv$2%m=:%Y3%MFvNNR8 )~TA_Ox0ha}HPR>tF>.Jt !+vpyw|^yWfoqv4@QR`ms; jG<UW"Q5@˼ >dkt`TT1D+&8i2N9 u6m8)9,:fL^Q=P1v).27;kz 8b! PjRBf=Ac^[٪Ra˂^i@h6n 1rSfL%;tVݕfSM۞g√;ő~O5,.ؠ+ς-{'eQ 6S&4jS!HZd .F[LBvJLh@vO۾xW'[0ɚŸ]OU| uA Q*4J4ºIWh zt5D;N.=5*!R?5bՠ&KXOqrԌ/hو 㰸 na`u-+*3z(W /젙k Bw6%sJGFc=:yۆV)ay,ȝV 8hicۛMrF`lH0*B yi]BsTi[!Ϣ^oW@M=SOCyՊ} =.T:QĴqT6:zgzZ/;hk-#䟃s #pS$ycCF=(sA2{Rn !3_*bXi2l 흚Q C*?ןq5} QxmE]B5%wp'Kpb81;dW2x,JpM6Sr:,jӠ2njLDz~w˒gG W JOTUͥov?T >xi?b~3=VY;*LRrOVE Of۔ -QŅl`{M@!endstream endobj 159 0 obj 1188 endobj 161 0 obj << /Length 162 0 R /Filter /FlateDecode >> stream x]ێ}_`A #.a`ƻg' o}Qwl0T]cEc~|SC/{S}WO2uKcT};^{??OWNW\ktŎv[==g~6=7ߟFLϓvM}47 z4/g::v~uS+&:g>*r{Հ m~YW\ 8TuGFGtu~PqWY#$9@2w2÷p&FgQZ3) $C&br-\7-Ek $Xj5 _bKnyS->F~{6bпgॉ'GұenHAMvMXMyfC`3CB%T4Ǩ Wf8&LlLբŕ%ĕ@D\qH6T(seHA2;0$[9_WSdѤ49x˗}DAD1:qW#*{+P%ƾ[#Gv˖VF7]z#8#NlZZ(؊#ؠdb4 Ɂ- F@ 4@mZ-OȠA 4c*8J,>`x (bbq8˜\5LyTIyf5T:7xA}q4 }wĄ40ZA)TH~I!,`B`1BJB[6?vʰPu-viFZV&,1*0\#cX@ f`"7K"u+6= 6y j:Hm{H nCX%R0e6 bbﵳރkd:;fvs|[F5*k梍8NGB3+2a(EV VX$ r.m|+9+G4ea/ x-1e>[bbligK [z392a7cޑ$)3[B\ UnP7_,bfOS+rLÏ[̽]Ut*ZU>Rɕ Nz{H m;s?HDWHl7B$,P+dhDҟ`Bbc3A*)*~ Z59%&J^v5ux/ny{wDs*0[^F[&bbJ+Odx%3 ^%};2@@_>DB6ڇG򬶹dzZ~ZݤkHXa1_-;~>;GpʣpJA)Ys7(ZEQ%A2h~bD?֡dPBs{V&3ng&{9-Y N: ĄչCKn.0i9 V{aLO'd$ZHn5xf+j%,ќ LOR1!| &Jau~1{ԥ:'88WJ3 X[2.xN2 Zb"+wD/]8i7y3҄_FS%9a͞l_@EvKɞct; ;ճ80A6\6g ؞ݰhoF <)$bp'oJ o蘶}UZ,p:+K8EbĭK"l Dʿ}꧵*[EJH,͐};V(8D=-p vWC(to @w_x~ͽ z+_[zӴYӴCz[,iH]Y]5LqkԻ}ͷa U<+JVi2h7ߪT5}|Zk2j j*o[X#Ԏ?Gc%&Kݹcrld6<7߰&qVjчjXpOS]6JIg_в&a4+PBG^t1ًs؁BuLf6G͘LTPV?sW [La=Bz%u[`S1Ql5ƕJL&}e"_$a!zϤij>[VUYvlMhsw>a?BFyզ5{%~χ{c=߇~d5cK{鞹Ww/:agq 7X}^5] Yچ+ !znlNFಷ6kP50;?G齁}Gdendstream endobj 162 0 obj 3187 endobj 164 0 obj << /Length 165 0 R /Filter /FlateDecode >> stream x]ۮ|Xk7  dd^#GGUleɶcdIdw$쏗weu뻿~5wחwy YY7>O_\oO󟳯zyWuOxſ6Õ+k5\Õ/+wm?_?rY"{mW՝4^/Wc6lׂ6 F?/\_B#St4uo8ȏ" y1eTvМʗC\>=o;兛}:^i&}~3~A+Jx?oF i6jR`!;PrXvc׆Qͼ=f0SE>i9l)QX@{ތF_ bD=bd}|[:i L,IQ}"x. 1K@:- -lO A3QLX:ǵsPs/-$H=DR]g")VIə .\O]K$G#BL5or-_ɕTV( Õw+PJ$F"C@\v-zݰӣQ<@7L CwɒK0NWa:>UuUH3!f?L^Bv>F0xwaX>NFNV`Ȳ56zDD6j%RZaN2>jo=+ b ME&'yK%cGb&MO֓l)ѭaWu CYòJ17A#k  Dbz#=p('zrK9J7 $[tSu++FAbjz&|ĄJMk#&MrhIY>^| vLI#R[ HHHf?ԓH]HȶYJG#߻ʴk`/%"GίĉF6iwHCGfdDrQiɦ"\sh|Eeg{ 2'yDgƩw֥c*@ѯzK0i"ͳ#wfBtmm{G?W7{blRX.T{^BdkO ċgM5=/Fd),e-?ung:!],qS"9bJ&IٚH7tšuZAnNʾ]BX=̥AOTCW~L帬_9tdEo)VaHmyYnyY7`%)9qx{5{%~`ɘ7˖% 'O:3 SUWyYfUER7$/CtT2wT̙g: X xʾo5JTZPhU(w܌:M?AM7]ݾM ě06[Ak :ֶ*YtI VVUJm4_=-a#XOl0Qurű=|mdq(SRYD؄"5YSʈۆ5]8Y賠bM9jD_( Y>4ȭ9.HDBbkp8s-cw5SdRE΄ȯjP^#,4 c$V8cKXQr;JQۇ3  ~[& m<5/-3 B@@\\>'n$ E# dFVRO|@C 2!SΐTJ6&X\SIE$NG% %\f=;1e?eK&E DSAl{.hPĕZ%SrRm<$ &Jgys ~YE‹D/he-Yޕ %Mޣ>Z3o\ϙsܸ*Ϛqƚt|6_TúbwsD>VRm?4}Sal6L3 T$l ERc dG8},][ .|=@uAxKQkW @5/nrɸD|'w=wbXm-%ÓKq@2##eyNv8.CXlu(fxZG0Xyrj/3Eq ጁ4ړ<|V>duc_~а顠+TkRfQĤ 3&:.Rۜu.QӢendstream endobj 165 0 obj 3433 endobj 167 0 obj << /Length 168 0 R /Filter /FlateDecode >> stream x]n6}7snŋn@P> hESyW\-)Yp4j7a(Zi̙.o7eCy0Eߵ gۛm_7>iGSxk~*>}{S_۲CT:>io#ow_ϻ76vV'&̶SSM/SS8jx[qUW<+cwIpwµ rN2MqH62f\{暲Fs1rEތ_]į&E#ް%-ɨAFqULcI#tW"m҂'L>50R;X8JΗ6uWe c4jP D02yF|)d]VJAi#T`=^e=9&h kQ"84 ȨQh(W+–Lr,('&fVQZn x82ll ="Qv0z;\_T<ɋN#帐^4NW+f .oSD 'P&v& DX!\s'#?f#0'Dl#s Hqiz=V"{'@Gky%&jԤ.0@)p8v4` ()w!OV#(/HB4| |*7,`J?REA|GK2\ 4ul*&FH5@gbe+VC~Yݽ,+cm)1 +t*F D'[r6z@GI J5SThؾl?z5#8I4:j9b&`tI>L`g;u`4LR8h@ rۋ7*8Yk|縈7lg6:i_pS0^&g@{_כּW⻒&=HrtZ)$]4`ye%f@n[]&ŭJuR0z45[OVI&7 _w=kqi$)0w|/CpujvI4ylEƅhDVhCQC,ut>>8ZeȔ{JxWw) .SH3xb 2.tIhm- ȗL% #4t`蝫DW_G-p\ic.@c~"UU4 *Bod}ziv`3U%R D RA-!$:ų쾃#SSjTɴMLY5m Ns2HTlUdh #/RNY9Vѓ&dƵ!xt'k%[VSBX;&y=9b !|469>݁9aAAI=^ i8L~ e9lk?Qfn[2=LخډǙjYK8h-1"q#WZ88Ҳ!uEsz%`"9|]Njm6TjGJY`oqxsʺ rajm$!py&~$&Mr{7$9gE4 uyM̕bs`o +3^ࡹPDa1*8Adt YiuLyM̶]RN"$ >1 HE~n Dx%e{mJfΛ&9H߰A.4dX!F]O Bu2͹@ꤳjڝm3޿~nG$ـnr3/^# Wm'⧂@ N2MLBW D9dZW]^(6PH7ʥ;TK\EaW-Vck2bn>啕yՠf:T^W3z39`ኝC52V HD4 =H`lD4#kgTv*$^#էFNj:dve&(̡m]4+c?A]\Jendstream endobj 168 0 obj 2542 endobj 170 0 obj << /Length 171 0 R /Filter /FlateDecode >> stream x\Ɏ60t"fsN$q _![MJW,j'1 7Z^-,J5ooiT:&v:~Mn!]q>Ʒ:>Roҿ97ynj?4oy8{9s7mwt .Uۼ7?#=݃|T+Ċ<j|@$l6l~W $`6ˤ$+ `$ m' )EZ,Lc3ľiHZb 樊j4Dj<.k(Ǎ $ucVq&dhvB-hF%EbrU-P Io&NNw\YIc*@IhX!OZϘ Y-Q]9A OE7']eQn-oe?p>h(AG355Gl ^|$ +,A\l-a:us0Cxv!h~yŇڇؙ\D kb#W)A3R p:H- DP#ABR2d m쀿5G6 D6x8YdFQh=F"moV&+n[g!5 `:b/Kڄ6b f(%Y*34!އGō^5 vERAXyIqUƘ&$  ul6zzԵbiF(C9Q9HR.z3#Ɂtͥdb"*&Ln:UVX)(>GP. 珯=@ZSQ4^׶̻Ti0ɹVeQ!U *bo~W |/'{Uz+dvϒtҜ';$ \sPCxvWrO(G4eWM4HXvDUBGB"z"! ) 8ٽAa&Wϼhc[6z(ҨXh]YTy"B;qyJvJn#*5F.#nL 9x%+gE7Hu1O/l,mgTъpzٖ䡒ؒ9P!.6 bwul * hzӑ1# "%r˷/w"CaPp F8)k-=xIZ5&K"W-xR9% tYX Ϻ>ҏ%)t%Iy4ԍy RkNf:NN Q`%v PNe%N@ IhZw;C),@zK]%NAihK/HNwQvrU]Mبo*^Lna oI'ht.|$ !NVD9u=WRYbl܌ PvM݃ݰ@r"vHQ azWZDⅳ O ׿DlQL6MBժp䋘8{]*t |EWԾapIV}W?6AʅzD$q4rcوd)ńS'8/I)wic59<'Hǚ0IܽGfB_?$h?cu\ᅳ+_&:Ym9mA&8\z #I=LȡD`m;R L0<@CBsĊxJʼnD荗XDE 4qٻ%SHn ouT7xguOǴ?~ 7>62/\I^'޵ |*S;> LwǏ 23s%<%P9U)TOǻ$nÛ5kaioW}/jendstream endobj 171 0 obj 2380 endobj 173 0 obj << /Length 174 0 R /Filter /FlateDecode >> stream xUj[1.DJ 봆~@_PBGHF5cyy4a}{ٝ& pO~tq:c8tj@OnlY.\Pv^*ÊpfZTla'P9d \8̝tLzd*E+i5Dv6 @lbSQEhh3Hly_H9RDE l/HS͊ J.B@(_[%iM^ID ˊkp}oYtT5Z qu6;vɡs-1Bm]/aeNXGJ*0/=a, / .?l7<#^j{wGz#.N .OK4nȓy3EO2N7QRUߩw4Cm5S7ջFLtF:Yoy{x8oendstream endobj 174 0 obj 513 endobj 176 0 obj << /Length 177 0 R /Filter /FlateDecode >> stream x\n6 ;NcI6(03Iz6@(˾~%;(v AH")J]_wF?~~CAs}e޵wP_~gvשؘј:p"4| s;W?e>=P??SS7LbRK[lwj& &c=Pvг7뱗iF 1ZtWau{j<l6joWǷVM׿/# JGޜ4dяr]RIe]bG`]?aǧh;a  S 4!H@%i8q$9bUs,iC p6OlKYQʼnN>4W]92c #D0ɘc6lM]iHȊ 54.fJ8nZe[VLAXmSp.&tꉀUǸSȸ~Hu2Yu1ng!Kj[e,3/#%..KI"b m%ɪFP)R"b" rM$#VGogČWDZgC O9z!{gVҡ8SRX4 rEk`KIwKȏ$.MD9:fؗh1z#IujYʾT*{m[V:M͟Z$D+R \62%ɗ0e/%CѸMޜ{}>Q @ZjZ[,?M; {c(YQK ޣh%{ lp$>IW&,T,\R.\ua Jbd&ٙRYx[66|фU/';R\X_rn/`օzFr&YlUYb*'_SNt%LŖ00J%*>]'.EѲ K|%&FYx=3 |_&B pޣinWF.ZRlQDdmNY,6?Dm\buzZL8x#{Tf- L[G*e7LJѥ 6}J2^'g865DMLpq9$;:9xo1^m\(jUB"tΰ96i*&`P\@D@tL!0Q`(5lij0 +Cr`U eY񹎅yL{/RiԢ,Id˻,()|xtp.fÇ II4ZÝ`6.wv˜L/}{P}$I+jMa6G iSKڃF'K_nqdG<;_R>DnÿeR@$phDs,{BV#f&!ZYnD]%F1Q%aqzmxP=^ @a۔s@osgn%anNئ&clgIڅ;}&P,`wQ~"GKL纩nx^5"Y~endstream endobj 177 0 obj 1780 endobj 179 0 obj << /Length 180 0 R /Filter /FlateDecode >> stream xV]k0|7?sve}A䒻>=HBI K~$4B)xΎV~j`rA;}_}Ǥ^A8?r#Gy0SUzB2}Uv왎ぉZnܠcp|vNk7#2mlFn!̈ƄXxk?#6;#|(˕@ 1%e*lZy=ih!'dhjp眩/H1\,e-(Ġ-(\wT'dgv™[:>\Aɹ+[[ŘMzQBVb,W1 2cbl#Wҥ'7N&$;djp C&0W4NFb*"Ҿ ]62gFqJEr..%Xsj&:: +-0x|i.y;Nr{GyBUfWσ=OWAS:N!GϕkjU]@NJv;sb)p¶6蔊Du4dŊ亇<6`lgendstream endobj 180 0 obj 595 endobj 326 0 obj << /Length 327 0 R /Filter /FlateDecode /Length1 36592 >> stream xy|U0>3g?wߗ$$$7@4lD {XlTdӺT ZE!A (jV+mQJܼ= Am߾x/3˙ygEfqH_QvCKf +o|!iBcs'BJ"B›Ki?m5B֓ySeZY }k%|jӊGe OAuo7ifRÕ OHԂVhz ;-!P&Ԍ>Ex&7?@a~pIlg=U~F(njGA"X,g =^DDu44F5NNAd-Y˽ra5m7ډz#ѓOqLܝ>5( hԅGA^q+ގGH|57;fpȏBtZ9Cs/t x܄=($&md=ewuR;@/b|b ;V?UE=^FR'E2oƷ__?O`}SD2Fm%@-VeB!/8Kq=\Ͻ}t>apB,6#ji?XS'+$]~%#$p!C8.Kq_7N|/~fs C&yDA"yE>.pc"ŭ6eop/srǸ5?ow? +{pXpF8#1(&y_%Q'͑HIp"̵ւ@G=ͯǡ 3>*b+<$蓢]IT։KA]r9kq͵/zM)$R!~}݊N0>'+q1^^#^nހJ%mG!5?Ɓ5+s=Zгu ŗ>Qb| t}>DMKz,`02 ]4CKAU%s"Ԁw`] lEgƣxhD?j2F]@__Q0{Q X)SM)>x4ԊP7Lج;>fwJ@v@<.^EHT^ %㋋"crnjHOK QI ]NfM"KsSZOzm6m ͇렠nDAmEjY3ܖ:lVK=RnZ)*3Zz~7%Es)j8g2&[miփk=+N5:f4ګ4 ž1oꄽ@'2'B1Ҧ5̙pꔄPz\^^҃“{l9 *g=FkAi{Gz}-17.]U190Ggй|ᦑ ֩ffnݤpdmޫxUn"V`4rm|- љY O%k=JxritњPo0i4([h9}GH_ O-3J4TNE l*"R9p<ƌ^Oƅ$@>4h[W=! Q_ׯ%Y?wa<% H˩!Pg>Y?T3xm$y[xz65iBhr^rԭm+P|!@ $p4ç? uCB VcWп}_GŒXL97?9ؙr/N*mݪSWh֊Vvk]%az&Mbhz*I4 Mƛyms^Iy꽩P":+%å4 DfU tֳZ|}?FL*è >c L ^_B~R8J| , 1=ӑsJJgO(Eeml~r CqF tE k[! ,^*(8;eqi*p%5"\$%IdB$N Q Іס/_Oiĵ֛.aL&bSy"JT9c90LNNL{MM{)#++gI kSn|6]^W-<#b͈(O( іcYMEzSy܈<n 8+k]r|^ߑ9˓#DySn{LពMA),n;[ "D7]%u%!Upc+FiL$O84dHI4ҥdI4L~K&cWĔA2ji1#g(QM!0A؁5boýuԙ) i~EBpߎ:0ST/EYyM^7.aS6HÈi6xLt.} D]CX HԐfϷ;e6v03)+OE3÷'jS8% 3qťp01ر?~ͮd3EV_ٳi3<&^H*ݫ.lwwXyKV&3UNicg#EbhֹŽٳٷٿ1h A3=A5ƢH71#ծj*RhIzRmR[]It"$3v!l3龾/q20z0z/;>6Q+R&E3|_xs{{mيp瓖BO[NY6vfiRXO4!}s{c5JqT42V"fBE)ETIT[2)))a)5Ei^^Y՝ٳ!mR-g?3Zz(ɑd/~ߋrhNڍi$M'E҂}@9qh7ʷc{!Qٔ2B8G :^cgQa$u&QܯE""qP5f)X LL2yWdq% ?W2tմ'@)̎i ̾Q4/95Y^O`KHa5幔RPA: T|c SY>%-BS=)A8xkz|ss`./#0x1't ^tקC>8srᖖ7K-x`o9YwGshdᢏĉfSS:eL>o)1%5>k*a ƕx ȸOH!< #-+ܞG.Y6ұxak^xp^E34Qy۷>uucϟ $6Ψ?MZ ZF]or H8=Oʸ@E? | x o̢hxŀ7CTVqytm;IJ-mIOS2HI%IV[$I=I_%IIq!ҡ[DGYHOOt=KfJեX ,ݦQc,%Rli&f$epuĵ7/ W eS!xMHT6j*I8+ҸAS8gs{}!p "e1pxȀEJOWr iOLvv_}__8 _6S.Zh7qk'b_{abq@ݼ'iZܩct3J'.(H/N74 ۆs>TRpAq. Չ_Jb?2U0T&*ݮf+8V& ud!m({Xz[?͸ Ieqz<>P,{)]x}P \SP75jߜ(@| !,6սb.٫;#\aitppĭcb'b\R}ɾv·s72'3@(+L%+wXvO*OZb:{ԃ oooOK_Z,D\VGy0>V'fuαZVl?+\dF>I4%+按D6P]th/v:iÛ~JTB8 ^0oQvGBnE@!1l׀`2>7P+??f]sIFNCh;a*%^MygIj--a[uj[u V|ٗW V, Ҏ b1+n0}kc_یݯNq@箮([R/ʻo~8'BЕM˯XW^I#ћ!@fM&.]N7qLTˬG̼(y"@29U̒T ZqvsdKDolV]w"ܤWwv d%dSΨ+;wqZ?8Qh(8T#3UUQ$9.Ln$iHwͫ.|hpI3I?;A {,vc 0*`Ҡr/]_zGqB \ dCnW^'U^7Xb-+y-o7ȜZ[䣺%wMhK  uzܰe*3`Uf{158"jjzIh]đ؋4Vmkim$z,n?c0|p]>Hi̷%7cbZ{.N+Jۨ.bfpS3_)S]خ$I/1',ǝ ?^cxL3b\lómئ{pzs>.@!U0?'z2vI&%KG| hK#ޓ9aTˇM ;_'~if|`˃ ?_f=$"܂oyYOEdžOb_>tbv;i.p%W$a 725%F CtJ*Ahk2m֡hÑev&2o3a~; SA5Fk9МX09ٰ6иK7wi96;{b܁}/kl.\8ϙ)`u&~3xj/kDzPF=LN-&h'%.bja؏ӝ&%Ϛ4OÝ`|Gh;GE<>_/t Bmj?rs'Э]9c$g@?0kjtʇ99ORY(A؝%HVWZzʞ s- Ox<|Y ~[-2_Ddh x_ծ’ ddPn[͙ؖ;+0he>}J>?C,9/񮥳M=gnbF[ M6'*6sh42l31Uz$I∨f"Ů+m 9w:b:cWӎ)aAYwep" ytןn"f $fɔUXE@jx&>ʝ@؄eSj/༉ۗM)"wҞ? e+<p&ŔmdX>VTla-^ Lxcx:6jO[-F'2hbUP6y$@2J  8UTr=IPR큓^ 1ཊ9BQLc*%d{oii5Ӗf541uY#n+ ksk$9)sAKq˲W._mOg]z5=Bޱ|_&mg.xnkݿn OzQcɸ2>OvI d!`L\nŹ Q&qDnEȤˊFS 3ěɿO'3?#wY԰|~Ft؄2r88ǖ򐕥 Q1T͇;=0v mֶƁ݋l8)L,64ϵ ݚi aA!S>S0UW|d[e[`v6"k\q!!%gnU`-K+ ß 9r(/픁_ mjoҿ&l7?o Ǯ=Exx ol&8~nʶIhxй{߫X/!BǝBK",9"G*p0!"ڡ›05P$LKqY(`/P9'PhN<4!ٞĸb@߭\lNsN߱O Uݼ]YyvSڕu?d2i&Z%E#S~"Opryy92u>W!\!{)ELHlݓ+yoFg1,FIL_@K W^ I w$bPCbqp_/Tj 5yf] w%ޕ'qO줻\ZؤInJz#If[`^'Df[iPWLTL`3t p9\׋gd[U$0g T{)5exiuZ s;I`%^Kt%a認II…j &i/M3mRC&l$l3Y~~\ V &:/<&AP8> MULHJLSL"Y-<[H'KO 8.M* ~}o%{]TC#ql~!"d\eg>&G4P8x:䗱/s|5Z/ک%ϵHn~G}<]Y㐬l2ANpnG5dZ,HnjO ;lKix!tNhq; xرԹ%ӻrh~ݫ5wN&7 }M~Del1xF WU9jR^iV`ַ!A}bLtd3iK*erG~~ oڏ٭\$zcoQqmglv=Cq?iP\@5#A-%?2vئ&};K䰟<ҙWS8Sv$t=:#c[C,TRqS[3㊋2&c{9|'\8:Nࣧj,' _/ ^a^*^~cľ!$,iwG%Ve&S<<9:u&{f{H1x4KLBF^$befct1~nLόs9msoݕ+k$ם!͕".!cɚߣ"ЍexQ!'M.uF'.^gc8HsIo#3}xӢog1 |^\9c`箜5/ .}Gr2Zp"/ WՊfKu4~E??iy%y|.ǟ]jKW7juu~Ju\j\:zUƤm!3^)'GhGܔgR )R %/a1GͶK,p Ӕhx劔-)-U)b8,)%Zx[ZՏ[;$QcfP0͡i}7"2KV Ow"J)#=c'J=GC*-܋Ռ"!>l>O;rlD #!|+F^}|Ƚ뤹WtĢ9KTvhG eO/WIP癠NStKyJE /~ 7êjfbGwg`-sӍ7wa?j7!>)+7z9<xkvQͯ 2xvzV ٭.ĭ6^l4fU[\hiv=&:wa<[#sr=ϱAJ'hx;{|nN{D@|CBtz*)0NҳBfCm\w޽3ر97K}^23Op"$8O<@jj f5G82U6k\^<6k}ά=Ydɲ9PtYb=URBLwRщGFBbbz Բӝ}QQ:T`BzR"&De3苘^2l44CW)\ }y3l38eg f̿6É80skh2^/;>"vȡ 9.{} 6"3Z]wq[~Žvߛ;1wbSnبqĎ7?T5~K&[:m1B*\4bggw_xt<=8G$BP"Ho$=0rA9`pA~3K DBKlmK.7=]ַUE'{q kMmuqq l5WUjeu`efes`cx݊fgnjUjVF6n\&n7B PObk ȋX I89㔱gg^1RSEr`SnNJsap(a g q$v8gz[g診O_^:{Zc/]}7>+.{:4p7+uJA ^XG5!Ώɿ{,ӃCf_,4=󯡝 8/j\$MΗߗ<&2/Xa-r &}ҳ #w۹I]t}Xf{cs,F^)]|އ9^@n+>c{vlAaw:7 HaNd >3t3oÌS5CqsN"SzndE?uǺöbgxM|ݗl'x!-r5|p4 %bkLw$%KUpB~Ϳ-ja;Fnw;eC&1OGyjUX b  #7}&nA~D7y߄4rx_Ͽytu{;/1A(p!uB.<&}[s&|LsOu>{w5+HQ՚Մ0=ׂi$;R⅛]k&'+}@<)`)4bѮꊟ1^W}Cv oU' D& UT;Y/*Yc1s.B;:E+JQد_,i(^_%!!!ɼSsl1[ʖ,| HțџQ)P9U5$ЃB\ n GnXe?2|?v?H;E=c:*!`/{eAQ_ j xQ6|m/9W~>}`7惔@#p2yDz FzR @w$˪JPMAcL/ԽI`r) e"hiR bf}_1"e"=YbOwʛ!3+%Ǒ,o&2u6M<V9 ^ְ90Dvx 58h>~M1TN =K)䁶XhC1_3@ZFuoxC:ůK',,y)4\%5HϐvN%%O?A-g *ZmW6:zFpk|ZȗuL?hr)'hzD̫O)21Yc"MpDqdT0a >6# ~Z3fW,Tu5ٖ#bRhC(zGfܼaKX# ^VN մw`z+LW03^_xFl;$Lػ85 O=AKb%v$t^,%K]8LLqHےq tՋ- \վO+,_dM [TAEHrfAp*(7BL.:5oi76 jhLkCdGo5 9{|^|ǻbwb.vچ-~[Nۼ1xEu;yGٟVåkYl+B/ῴEwq*_xO $oQbnKP5=(@ ߉!EN6A:I܃n"}AKz(2(i9p-bwTXnv7ØKmA`'pKIh-M "I‚A(})2C%0q!g\.{\X(,IS,ʵʀzozr{JƲsh!0&؀Eo5` =1`6VV̀UYN3`Z"ՀͨQbqǀRervЀAl%Lo?߀94>ـy[ X@fj`Zbɀen  X%ulBc]B׻lmlEfVvQw?(W}O0,B{߀yX\|`/| w0d+b  07pC 07[fng߄  Ȁ_ qUJ0*#>GX"gfy4*3f: geJ~fԀy`;f.Jg h̷ <`H0Kg0*gp1`ھ Tn6`;DkO Nf_4`UR؀A`p6Oŀ>q|5 }4nP W#>ζ32R5@+ @ˠOs J@fFiA2zx3>nd(J=I{|nq)NmvͿmeEۭbX-ِ1˭h,VĨX،ƽ43Inu#qT0bT[A:Ch$\ k$덾nGwưc܈P; ~Ա9Ɵ[3fC Fm:4g7ġ:n6F)mh~i4жCqjw7$;(J3덒nFi*Qgeinr<ŔsƨLH{8KFhI{kAVc&ͬ}7˝j' !9<Zwj/gVO3tf l쥬4<հfML i;=uWq 73-gmژť=Hn, ά`P\iV,c˝ޮoyoͯc 롛Qٌv(,62֘ fdr5lO\˰qm4׮`CWX~YYIƴd,na61JtcPS=?PmLV09[.}]P7|jKH ˬ hti9@+ja\'Zd ILmt(W߯$³z _ʧBxWϸ-t|g{dj7~h%VCu_(|SlZq[n?,;¹\Fg>+L#_Bn "lEwGJe>Ԏݺb8Tkz|ga՚hc]}T{Hjj3[[ZH+ohkjnmږjS7hgڼݴSύ-)\mEK:юцIu'.os+hфюNuan~9+l-XWԪ:+:is#+mК[.h:6KKתfjs-3 sn]QִfdQTQe)};Fu t=uy]h{Gs}s6&_P]AqXuP͍ZCyih->zhU +Z;ZS@_o먫i@QעA:f {L0Zl&N%jjbdX@0Q;ʺVE[к5thG#Z׵N:cؽ|9 W~E+ Ŧٵfyt$%vQ+[Xem_ \֯jkMm@Vmi(kľN[VDv-м- dl qr7Sbi0k4['rNJ匼]"uKZw'f"]O5”GTWzGl1슺uW4@Ѯq ͝m!-Umum4i;iǴy[GV[nSWWۄUV06uE^S׊y+gsqx.-/X]QȬU+O>{6BpzYj.hԙSgUYTZd%1 3bcLd>YO (. LF~-мniG4J%1Wǚ@ ZP5'AJ**NQ`\R#Z|n:ŋui5a,~Xһ 4[AFL(s)aR ?LM[Yn HX]'Hȧs-Lf dX.:-Z F3׀-Lu T&@*;UM;mv +`nUkDzθ2ydv/YDǁ^ hq5(t@NZh'^}ŘA7kڽthestU\}gp2 ᬉ# k}YӉX7~  7:q&M'9>R?&?(+0HŅZ񸢒o?*#1=jh3rܚ.ԍ-||Nmn(06=Fef4??6 ~xmk^?6 ~xmk^A3w; !Kk++>wk/`VVCec/CPvùuC W &^2VsϭcxnkeZ9ՏT뿥a+̟Oqx^+{wtΖV|g>JcȺFl[(W. R2~쿕6uIh0KT݁lR}vwgsmh\p3ajnF"мw؂SvhZvm]K`7?9j(ׂ([ (H!Mt a2h^y %s8/*t D Yw5>Nwofv$+=JdN-H֞UsosSpZVd!NEypљT)&*f%wεBG0T.ynTɂ˺X 7jf\tDH8 =GE=W6 `Ż8,z ZlgԊD%eXP)a7*8$P 4 As[;*i\> (((((Z/ADAAAW7" "2 2 2 2ȀȀ(a0A0A L"L&SED@D@D@DQBA tE t"< < < <(£TDDDDSMMM1]q4iii(Fԋj0 4 AĮ]vMkjy b-  a)aQQQQVDDDDYepK~Q~y֍ϲ{g؆wXElQ[s,|>E&ܖўx?.Uh i*u)ag6]Ֆڶ%׸ku۵mt => u:xMǘJa{1ޯA~'oRw+> tgrqe|oO_m3UEF0d@R5UBhҩ ߏO7}n.b.A[X>gd/} 70sKZ+[0U;pv|)]%&lΛ-my~!x݅mj_%-†my,@], "wTѡuursZD ,Wz cО؝r5sǥx*moE|uqcYLW57/ߗTusY ߕSyZȷ+rr<+/ *|ga94e@Wi|3zU6j)oШ)ZfPF[Ni ӆ'Amqww;nt 7su땻\Os9Tih}Wp`/0k#- ^c3 _w͗V_O&gB隶yŠҖ9p~%\KloR{(d/O\1o1oxg[cMzOZ?MOd_QJl l]T.rٺ zR'(YHvWa5w#N0p=IP!2uv1wv8'ʆJVt]m =6YUOYY:v@U$%BRM$WY#BvÐ1Ֆ?]ڏLxPif=5K}I(o^kWfJT[kJɤ5KC[S!_S'us2i2|jX6_m]zVʲV,EqcVڊS[13JA>Y6Q^;CDptwfওkl{(g%.pwFEiyg Ed`D%m Mb)zb/K/x$UU*P )9m'ӴO|2WH6PB'xTf'4Qv5A ѳp',=#c-)gh%7ZnX0 ѲQ"2"JE+ km>˔r)Gߡ~KNkRLH+[FTaI!0 endstream endobj 327 0 obj 20982 endobj 328 0 obj << /Type /FontDescriptor /FontName /BAAAAA+Arial-BoldMT /Flags 4 /FontBBox [ -627 -376 2000 1011 ] /ItalicAngle 0 /Ascent 905 /Descent 211 /CapHeight 1010 /StemV 80 /FontFile2 326 0 R >> endobj 329 0 obj << /Length 464 /Filter /FlateDecode >> stream x]Mo0HCch)M)Ц8Y ׭V{ z<'{O*&u}u֩;>MoOħ4cd:ޟZRٯ9:zXw=bG\Y=tㇻ8?eO SG>cX>GcX>Lu-HAAE;BBIXUBr}X>%x?ZSN>D5 0AŎ>x?hЧ胮 }*#ş7_ endstream endobj 330 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BAAAAA+Arial-BoldMT /FirstChar 0 /LastChar 54 /Widths [ 750 722 722 777 722 333 277 277 556 277 556 610 556 833 610 610 722 610 556 389 610 610 333 556 333 556 556 556 333 556 666 610 777 722 666 666 277 610 610 722 237 333 889 610 722 333 610 277 666 722 556 777 556 556 610 ] /FontDescriptor 328 0 R /ToUnicode 329 0 R >> endobj 331 0 obj << /Length 332 0 R /Filter /FlateDecode /Length1 25644 >> stream x|y\EpUws03\! W1L䐐;a1! h\DM\5QcMHݸޫ{{_3"Tu@Şč*(嬎趿BÝ!/GՆPA+|zS2P>eGOC BE/";3P^+BPK>:̰BRNo0 &Śl;RRIa ;Bcy&cDh|I) @P+C{G[1A!0=hh b̎@;)^C-ciU0f_ds#w#`?Bs® яk2ۄP9ZKGopzmB^fC7x`zC싊uc,0E(Xk?eܽO_͛JTza5g+W]w1f-)c@s:.o=Zѕj}hyݛ8h# ̓o^~M؁ A|ɨ 7V·}=} ƽԎՍum;0vjS'E`KeڊAע {{:F'P m{)6\p'ކI:X7>![E%Pbnbob 1 cn:Ԁ0t78:b=~~+`+,<"\WUxnQ܇o^C@ͳyk 63Z8L&)` L;<g/_2ae|X+|3v {{)b}UWw8gr|:a(:!BYq.ŻwH)(/TTv(oWƕRU6UUQP#[N0-|2#l`h=SEdbIf-(} C c~=# z,i/c(r?X,:|DQZG`-޺|QWC ~%C94/%a>Fupd?2ǣE)t b`yOQ~ǬC̵!] ;{]ʶ1Qt ,5}]oL>+vpZ'Ӣ{ =etۆmcM3a;(^N?;̮K{9`a=q{5 |V<2t,ZRE˙LYVz3.X뭚a*)-= ߓ73wFNv;%:3RSv[rb6 F^jRR(ֽY4Ǹ%AoJEsLEqbb3Ecz+^ ;U䋵n1Z[ (F(\Oa.PpXkcY-_\ h5ꀦ  hj=6S`ZTR51ck}jkR]Ƃ[bȽ0fPTM)c*:$A{ā{jiZݭKba51" nn55ER%j"F2ً{ E@!,EZT]Kj/c{fHJ s xA)b+Vnդ XQ!WtLo)L7 F6 Qtխ`'&D4a!s-0|1􊵂1_GI"[p!{k|r2[ (DŽA8xbyyD/T Hq>-)g=`Z]."=q/jBl,A-4Ƙfrz%ii92ѽ {I1uďQHvָ̋Vmhke֭VNPR22Ĥ4 dRhŸlQRMnԠbBިqa'}LvɌL/_0<<]? s9L im/r}-nQp336K4>vrOjlFXDʠn{Հ^aXD~چA3 aXOKkZRI aAFMRe#Zg:m"~|!:E ~ Bƪbc,Ҩp#Z bqɳvyhr\eh%X'fL.S60?E? %dOX*s E`0˹TTeObC Qe+8Θa=0ksgsҩF+w) =;3-إr_oKM!Uݞ/^C(89◊C}`52J RAL&Qo*YZS)gڙk&p íZ\g.вGW>x!9XTXUfN/&d'k\?"AU#U#抢9S675y5aEd,eٜMUJ5dv^8g>e{2_k.5'/^̾OQjn>2 mF&XXzc3TV+pTb"e{1VTfVk"R #9ϛG@ZziQfXfXE(/+ ù3srɺ3esJsܙ;?;wy+ &9o^w|.O^}2;W|b%u"Hφ>RQ1n&K],Rg.ֵ1}mN2~d`m d ꈽBEb^saũTq+su6i0OxxUz,W7CzNv} >9hkq|k)BUhގlzv7p ,xxJPY驪Dᬽjtg5 @de8shj*$XEb&]֡N-e񛒖UI;3պGw0Y_f^d#Vţ(]dl3n12eK;E0fÈ|NpZ'&ˠ5 daR .ΤڧT;f"^,g "s9b p?KT5 %lҝ9#gNi]^b)gKTnVDTNoq5j0c [v^m5ɭu_bŎU{G$ dGﳟ-]Y'_1^ .ìRŀeT*7bT(Uax qd@; {c8XaK2Ğ˅O<=_Ax;y h7*Ϧְ\RSzL+64pUy~a&z/05)*7r}TKT)ll%*l)aq'Q񷸑^|kby;lr@^߮=:y?]Wu췫n<>TД۷h^2 &. v6wÚ vwu2NNvCTb0D5V(`+H6ehv"%7١VdbbF{C sęC|XgN,V7(>QE*p6Efs Lis|4ExP[ {F++%#ƨ 0@8lPX%uz;3wټt[o=r7U?FUV_t~ 0AO7sLtz[$P%nWfqpvF;w9lvkʮ\X36Qy+W5\jJi19ѩSٜgnZEu;]4zmb)2 F8?+g=׏h$/Kf[K=a=ԨSjΒܔKvފ]I|̖g៟r7%x)4_7?W;߷oO ط9ѣ(2%TS'JU\5nKl6\{F $ٹx 3=3L*}r=_Yۖ؁An >rx3kˌ68kz$E6Wh$sF?*46ڷ>NwaKpaW]lbtc2ɪ-tI6AkE^LA)S8f!&n(3ҢL+B-ƦUhm0og'cO-pvC/wa{'wxom=gRK.2|/)=T붗3ʻmw$ ["7u4b\Yj2 DRHk`5Bt CYIOiVY_ NƴӘŎ؝t߱\oߙr'4X it*%OoV(I; CRf;RRl䕙RC^AOAj6Z_!OjMQSriEV& ͖bn0H˴CLus^#g7=k}Ա6P^#`#Rf8BC a\#J)|ʍ䈨ŖX,ļ`KdgP06[.#py/嘙ss9 w\%m]&ot>Lhޣ~9d,,x|qm7I.KdwhoqZ" tgiElve2suӲ9a[Vj xfӢR8gjE/v8ly z}QdLmʚYdH+\{?4z Dgѳ&Rb([f6Y3H@~g&|4UYw۶ee'~[] p;{/(Fz \7iw/j^PwcfhUdž5=;'lC隭+K${ ݈yԷR?~#Vrsq`dX-c4o!Jh!z@Rm46 A(n #f4ͨ>H! {eWN:O60L%LB`B^}2- s0\5y =_owh<,gB7CeQY's8JI6].[.mll9T>V,x7ƢP%|,s㔭7|zaN\̸ɮ]|#kh0Go9Bbz[I =*Uʨ׋*jSjx#'kNUi4+4f=2cfrÃUoGbe.:/Î0aHxI%(*+w g zZNEOq8 yFq~췏[wbrur_}%Ŧ^Mީۭu11+>nBiMqj2bԌN䴨AŘEUNA00uSԓ#iJ'/-97cx͗?8rYK54<;/+>w@'7*/U+~яU8V޶mUqr`8\kNJN6:Sr)5)VA䱕g-f3DZd1KF3hRAI)qC9)b> .:;/IV6JIBy+)'U|>3kT*ңtK"k]ΟSns={ܺ ~x?HDUN.1XywiNm&O;WTyB8 Y5 B`U zF%z5'w*V ~ dnEI gFqHt, rMWnZ#pgԕxT.XLTB;wNyf~鼁v3J}_p.f{0Y僠}J [gEnFn~a|X$* M27C3)4<_VXjQɫj5ɬ4H7 fqL O0@Ǵ'q== z3z!#]8cjr=.VJ)#KɥA.g_mB{ᖍ55?<5+eV)w3SO,';EO )^@'jp]W'( pa*v+.6đ cj(G`& w1Wy/NQjRWW&&Uv.U7 WQ!$EhyHFn;"@> zg)/4^:au2.V4a:_a5a02~zeXZԌ PUce؀.5^5!aB 3H)\&,*ZeC:V|X|eXZ2FS 4G5ϴ]h7=^bɰ`a* `p`{A9b +h2LG)$dxnwSXE/aRjZQI& DkeF߱GA;e2 MIaoJ |SV07" HA2 ߗa^A$CXCx$\i-Z^/s%ꈆ0r_չ0}G(L 3 32L)l%J?3%ڒ(~ |ɴ>&SAy^8?p* Q8d)sd/p'Qav kdpy07)'`$~*äm$/d=* Sx\2 rBkQL "z (X"x L>R j:!@58Re"Z-w'uK)7 UlZzts5ij/Wm{+`K)͝PG)x@M'Ôɞ/葉ju"ʅq NZ"pAF:ҿg+4vr颔n:2\&"Ԓ(P2ʣyh%/:_=WmT6>'0*VړV54Izyo$:TVJUļAY CEz9mj'hӖ 5pTKRn.HR\[h'몤qAVD'\SQH.:"#J)>:_B5J&G`&BRZݸ|2t60qސV:vm !:4x0fr%Oil\K9M4jRCԲÔ?ȳK5>"W*eZ8ڨwʵ| + R^Zjji'ubF&@ƛM2>~EJyJnRbaAYzd XGe%iHyR8=$m=Lf&KRCtsl[霠&7-t^i@~D+l-RFyz' 풽Ge!YSDֲI)vQv_맭&JCobswSI}aybC8P~sB6bnKk-ީ 0:-uP7P"h#IwgJ5F Le9xU GPK""/PD7C$o=]"ZM5q^=2'uEIɌ{q9>?$}GS9&dAgFdn&|"Fy6b[d_293sw 0Qٞd}:~[!X`(V||r$B=Du,ny䯓 霒ٟ,@N rRT0T{R9=Ydbh-2\J" ߋu8VMõ}=6? >&PP'En_( & uͪ(.BqAg:@xKuA8\uΣu RpL3X̭áH-:SBy䵴6k t›Pۿ]#@8*([#EqmPuH`kN<}=}SbMط5NP <u"dpk|ݭ`աh#>*0.&"|QZ|Ah bGoˀBuEh#z`  tdA>!{`+j% dG?052^7W(RN>4EtDdD0%@J+LIݭ(]j$ 2K &{a"IA_{oHHln Pj>!vwA?zzn&$`1]>$ct;){aEУ% F@(7{ ~-KaQ(Xz8rj"2Pa@ԟ/1 #=>2i $F20A BtŽhg^Q֭[ d-􇺊:]E]QY"}dᅤv|ڥV/Xtrq"qkjW._5k;\#,&2BaQѯ11d-}b_m>S;(̯}@hb:|bF3:[:@pp9'"" ( D? hoKo2C`QS4#2N(+&:m:{}-ahޅn}㫀5ɞ 'Fz 8W. 0:LyK+DudA0  oHJJVCm F:<0.PTD'J+shDK&G@N~w+tSHGlhK0UrW-$Z'],XId۾~XJD`_tAXfܹ3Ys Ky~]TϚUZ rlNŜ _Xݿ5FR*ɣv^l@LoDKyx[6Mu>T_/pԳ٧'!v3W߾ķ }+o_A| W߾ķ }+o_A? JL=IQɝ_j*(EU;i4NmD_ i"pÒZ:~/s7t 'Zr Xo@?.囹8WQڧtSDT-T![}S=#?v5W/01QN1\* 6"/sxp_71|乬~6-{HO^zgq ;4T ͞'fIW/Cn{\Up] JJVSC{W*C7~5o*z/w'2;^DUCN| ''cB>؛N endstream endobj 332 0 obj 13116 endobj 333 0 obj << /Type /FontDescriptor /FontName /DAAAAA+Arial-ItalicMT /Flags 68 /FontBBox [ -517 -324 1081 998 ] /ItalicAngle -30 /Ascent 905 /Descent 211 /CapHeight 997 /StemV 80 /FontFile2 331 0 R >> endobj 334 0 obj << /Length 350 /Filter /FlateDecode >> stream x]n0EH"@"!X~ː_K̵| 6O¦⃶ I'8>OixMtsB endstream endobj 335 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DAAAAA+Arial-ItalicMT /FirstChar 0 /LastChar 28 /Widths [ 750 277 277 722 556 556 277 222 556 556 556 556 500 556 556 556 277 833 556 556 722 500 333 556 222 500 277 500 500 ] /FontDescriptor 333 0 R /ToUnicode 334 0 R >> endobj 336 0 obj << /Length 337 0 R /Filter /FlateDecode /Length1 47020 >> stream xy|Tsͽw-L62aK*lHHD E@DE[Z]TJ5TBuiZhQޖ2}Ι~;˽瞻ss%7B:jArf,8qv`!>B=cCu^>XxRD(%O}z^=Ok=GE CM|ڎ6+@Ch%1ZD4jFWWP FO.=µW>Wh ]ƢE^|eF4DЕd&gx=ȁVZʟ%qǙ9 tGAARYK+g2pU5qIB9 xch'v::udIBh wpz hRT gBo8N P%8-E/_]Ž\\(/џpc$҃,"OrK -L4(<8_ψcH) )96`q߁?!4gVth!n<x%^0>A.%-7k^/x~)VG<>MLUf-zzFB(3]o^4~omag;'>C|E! R$YBn"?&OC=LF".nj ?a8W  7.!#tUt1w2B>0@Aw>ÀqX؅q_ f ?c}Pl(s/ҏ\FZ24MAF>&?pq&*\#7[=̵rsqNsgU/K??)L>UqVl[/]"IC h7z;cjn(G5544ESɋx= baxF'R[d39M.Fxp)7 j9W^L8|>دQ89 A/}y=n.](.:Puz4ّ-E2/d fGc~$RQٱackJ33OMom)hwHkp뺟p [M~6A k0 @9>&⻠8 Uv|CiMx,9w&Vt͉ᰳ7s 7LLG ӇDwxцnr aYpnt/:w4sŴGq$i 6]3aF*6Xh=U( Dο]X3=W#XDH|5j(" 9>^Ž\NVv>4`;aPo"A'v]-&gNN5&z#7iɟ9w{S0VϴsbӳGO7er|膦lGN({~sRgd.Br%Y@ʩ.V~"C Xjp|Xtyv۠&Ǜ3']lw\7[.< o GNaz9@l#r;x4ar">M,_{c 7DZ`z_*wx\>;{VFaðd|؆ 3-%Vr^&ysMyi':lcj.DAe;x^?~`O`2鲆pn8B%V҃8=@#1 r'X\,*vXhF;Y:u|auCy c#Lyh`)&] l8 Զ{$iX,Z\L@r|;y1%q.[3L3W0 VMs5.jPj/LYSXUg}шa_߷O]m'|I~+`WdNQHOR1aTT}"*FT4yM}6k{F%D/ 3-Sc5 %hhm1O!apA p4\1kϲ)n'82Z>KZ 6L,m|:Lj%kvԒ-6@v)}b$XԻ H z.:RQ?N;CDE+Zq<*;Ou4vUR;돧;~vjA75b_Mط_MYiH.!U~?T>?,DEX]E/f}[pd~߽( \w`Ԫ>]Zpa/5zh79|HgV\/ RPO*UROYS79C >#+?2 Te:UO5|m>h+m+3Jˊ{/6h3Kg/K.+n)`#yVݪ?Sl_)bЉ(BqT/$|=G"*xWAp) Ui/ ՇƄD3TZ: CHuc0-`bJ0xw,]qOM&B6x(^ZaC'XSEoM2n)v;Cqzg(N 1 C@; uwp;*(sazCoe5MUUTYbDc,DV'D;/6-:*uόLNih&fQ (Էf@05:<*G<`dtRԨg`_ȪyIvYʑg,)x+Kmmy,N,2K,M W2.P#LQAVA#LU`|Ej\oqF?FJe`]g$+R y@-#ݷ\ѯGo=6ҁ)vt~Ț74}/.X2k`IՈգ\^9^5 -՗:eկPX;CHL(tf/BK#*RR*7V*†DI mK-&GR\"JaI30-љ3 3 R| SP8h;$οD1GArq(] sZ]mӷ&Y+g'Uj_R+|euWYknO/0%&*RB%:\Ģ%TF q?IҸUt2Cͫj^P)hY*O1Ui!jF+9jllf`q%|793}_Xm}Gwvg܇1gw7Z'߻Q _ܧ[=_ox=YP*`q|S\"pEAF//Y  "? ;=;I׏d)_ Җf84*Jҥ!W-Q;ĝ8`t T9QeNqTjw Bo[p+>B\`Y2#1UfӉ.Ӈcta7*> OeKu.@U0K0MpjgمK(zٜ7N(X?<ƣN/l< m }m௡ f p.<2pSԋH?c$j ^N2_\q.2Q$I6R}bfee;vblN ٜnJ6Sk" ͈ͯN3`i)i\Fo/s!J/1'%I1ƞLJLIL?BH PɢuVUwTyknD͉~YVTsJf8nMϽx늧>31aܥ0~ݟutFw(#FQYz26h JeO|_PQKSCWEGW+|項4~ʥMXڗlj0Tx嵀c^ؖA6mP Ԡ+GR= BU,95w()(#Й}RS_\M 72%7/*}m*d{8Ql}*-#gO;tʭxR6\ C?eŷZ;x0{{AK:Љ%u(eE*L*m+Cv@yd|cy 1u*arADIeAD#ȐBsWT mY)Sjv2Wkcim}øq]D [Juo߿Ԟ94zYz5p&M@+^ JAR+V&k+aIdmOW%eWmR)OQ_9LcBbByҌČM-GN$I~[fh+z$LMK+&tHT Ѩ-W]R 8@KLdb2d 01ssH!EVLrÎe&.AEọf zsəaf1Íi9sJ3\25NL)mFj1EL$YMxޮU ^v /o w-t}|q-+^WR5sʀ{pgbі?e7o~A!^:@}{Hb[FaTm7BfļB*zA,FƢ.8c)D ⅖MHzv>{9&gQL,k`Efa3+SZytƸ8ˋƂܐcQx`TcUV:9NB~yukf4҂SAڦ$za[T 95W5 som {ܿ5?bm~nP")X&b<65E\(m0hm(܇ka) nx`]Ԧ r8ޔz;')`*x9XJ%qcCCr p21Y@mS&끡e6omឳXz[o_9B{nي[WorÕ~XNZ鿤2gop5?s۷SRNthnԾv<)\!XuH% q4h Uh -1wE%lљj 98 M&6EmQ1^P>E((6b|ĜsyŶP '瓲BLS^ȬSa>hݹGfYQ $n::^[oI +}WG&xn,h3<"7-:Qa>ݥ /X Q6K9B4)vh&P0^(e11$*+X̉b.IlYse?xÛػuʭ[o_yE#WJg_l{U#ߞso步83$_xh:``~D@!Wtc):1r$lK1xFz-«?H*֍:9nE- ୠgQ LVOOD(%s7;G7rwnmJg?݆o?A']`u(v:^2ƺk:p c#]*d 2ur8  1C=c@\{ El<x=6kUۉ*s% e*1K؛Q/x@ ʶ#7l(xY]aN#ѨYxu^2 rBpS<ƶAgOY-j^(ހ^e¦{?L2xp0G9$ʠN5u|6AN_'J gmƸp.Ս< _N|^ ÉmX>I׫c<ЁeUn6sw~%|jo~`1:sB m[;۟ -Ʉ$H'+łl>Z~6SݱSC]Mb9iaߙ-gZr\[3e;^ʥm+f"9PWp0p**Ua!~fև sB;Isa4He^ A"j*'^ω.nlr4@ ,YK7zI$r_/Oaѷttzm/l̗g‡ȅ"]gl^"x"[..FHxdar5ў:rO1bbi4.a EԾNg_H7hD C-,"2Lg5Θs6%1Q8 %x *!u`h^ܖơ ~)N⟾~G[v OwCGvaGfUQAZ?5e(-JҡUN*R J9WuL(j!hmXA04AUQ*·1^Oq0|MS/gn*^eu/]a4%O"*?Zeb6LI2,co}[[C3G6ؘG`{׀Ld%{/PcK,19)pbEBWc‘?Xs"A2T}Q,>aKs@rh|i_Ӳy]p7n4Q7 xl}V'E8>y3#EkFpE(M.ւfF?ܓuU&jv(uU `=gNjXBcԏj ;icа>P?ғ'.,(\;>8` X!`/Hۓv1zegnI Ib9=i&Q] 2ʸϱl3lnTw~~r: :eZ8~rdP1nC}̸p;X~dkx!Q7T$@T3y gZwNcA)O܉}ٖ=}v9KqqdqעJPp^fIl68ɕqxd}[{7xtk[{/q]rCף$!+w=fu p'Hhp.R؎-p~ Ϣ B).{]^;*Ьd4 ?mt20MW -`Grg66Ι>0}V 7{Nм)5:`]ϩLbĂ6u,*hڢ+\M3b5%i_.lv?kzjU,| |#ۇ.Uu[R>~~:whwz{$_eز"+V Xc HU7X.{Y2}\G"&sF䩬Soe.4ixjq"N0ƀwֹb׸nɏy,w=}ɼk.Kj| e뛖t}H0;\v h}v u-Q1-F ZКMqe9c/fmF Q`vAW!xpcjߤ\aA{܏s%/<ȋ– ԁu{Z&|ӹHWR T q:3P,aΙӍ4si76р!;be3wkU|.nmo^d;pEoTߞ9ᷟ;s˃O}W$o@W rQkr nQ=یk7z3;,<:ݱdJEd&ue.֖{'U1>5HAwVF?cV.\op7x|<|7ˍ[26=w{U_[__zitYf0{h7kL ~9Iqn$Uz<%n DSz*M@Q+JzG߈h;m,o;hnM_EhhDGscNtbWo`C" 6x]4k-dVO:u+'դlʋ# W\N }[Oߋ]@ G[Pr U j۠adtj^0t3I001l0e10ˆS\ffI*W'd՟~y"`0nd}xCTwI Be9dKtI%.Q`C6s2d5Wg}<@G6cugFZwnz ƴ2=4״ŎZfdjջfՎ-mv]8sӍL:iFЧч~=j7]c7Gnk Ԑ9u )9SZaN!դ`װ'liMfN-<UOCF{{aot& T19*4q!9)96 E10*ز5=+X.%srG <)QD HoHhH|{B|7,eѻяL벼Ed~|.xi/9lL7MXh(NJqTҘr :`>K]*;^j!,[b4,xYG4wb3{3#Ltusںn:O?ĶϺog}F?hJ x%};Rd!J',(< L$,f^A@4RM1i Y*4`4$3OW宑&pWոA԰+]}M`ߩsOb'];>ɥ~ĭmK׿61,}w/Pa 87#MeZك\q1JؚSPE(b 1Qy˚G(U旰@H[n[.c,i)elKKQC39idMD;6'ʆH4 E9Q/J|r _,  7= KpT$$pT $׆MLI$P1sae5P#Wb_1EXuTݱ+Ӈ>mf,ݞnϢ޼)1p&~R :d^|?KQ֌Y@HiCXύ>rBp_-,^ lh-hhjM^ ºn& jg3ƍ4]1Q5,E yûgd l:+|ьGufU씰x]]ΒwlF⒲Ք}x#mjO3Gֶ/пGF_71׈g5a|.6AYNܦHS<2W/7Ps1up)u)3f놳IдNA./bU9&|>}G&:RDa\X6눘qVkq4zWD+iNp\*G__>6t^/%-{_+k{oyE[.Mw=Tzu "o(Xi's+t A@3-0{K[9K}&}6= T6%37F6\<4rЀҸ\jD6"PIu xx ݛ>'\vܻ=gƯ~q^"=-Qy` \Oi3֭9i-w"H 6W`҆@~?al5Qn:B|<\XS nFU#)Dnx>P#z͞˯XuՐC76/v갦6 0pCNBAv FC)=vLU{bQ>#*0 g..好՛k-%ܵցTS) 1XkC*|L޵ݑ U3sS% bf #Ϣ[eKiN/ɂuii)ӺJ1})'nlg)„O VVʽSꡫK/Ht/>GS ZjӷU_ukKΟۖg+]0{'>y|l]+>IV65kߞs'z^#/0끍O%2ٕ݉$q™?"4HvudYTD s;Gj[`l`i Ԉf||jV+ MwwI :ms0c 5QMN+0rTV D,݇;l# 7w3Ẇ$f:v&XN?qU+fwHgZ>vN)g<~hc o;"i̶1Wjf~ Ē Uz>~V ǭ]3I-kr%%4*q*&(ͨ)Ǖ?>  $ ǓJ0W8.>Mb2%xSɖRژdmAgOdkн( '@'&l%:SlR";o<7:zdSG"a\>.H뜄 2Re* `"LީZ:i#0*kU6Zt&׻`s{"KԠrذM(E%58:^ޫac=PR֢~h: O" de6M&|Y^ܤZniA)zTy@}=^v_GG_3Z QȯRu: _#&W oiYRa"qE!J;vPr8qpopxc.v|ڵ&5-Q$BkΡSۛ/Z3gфd}6_o !>k"OP D.;ł,Bytc(ĸ36T;|X~!t{b:0Q|Fi}}5 5h]GGWI+]#7Ƨ;t͠*Rlrђ)"b U%"Q٢I`QqiZ@4 KH!*Zob ŋ-i%:ب:*#AW4 ]G7v0n׋Ts0_:X-h r@nE'BAsT'{?,$7FiY?"u9 j,_V/ r ,WgXuSYhP1J xM?=+ZYw=LZ5!8o&XwO[wtJJ .[ Z7ːsjvZ!'4RAVo[;0'QvfodlLZC~jKӞS'u-^n(ܧ^DFuWj<5ϐx όHS% +Ճ)_-駏 )dD4W/"gyjKFy jDCcbt&cl}/&[`o[`o?.tt3T뙓`)fa ^bk%V̾פ v4]]X Ԍ휯noxdo}p/JbۗLz/{aiKa0_og)=ߐ+aG-_ܬ ywA}$w;@bm(yT#}@KȮ*H}ē.Ec۶A{lV3ER^Mͯ{{dlXv gS+ &.lY+{Qt 8TnB^:`ΩSpO;Ye--WԷa`lt9Mϧo| 웟PE< pKNJN.U(bevp&.XV(e b6b©fdY"KIe͜a"Kf'QzVlYJW_Sh]N;NeΚT.ĉ삡$N&/t?xaw</tAژ&k;ԗ5bQ3[$}aWܗEnboЍ{ grkAwJ{h* EJo@$N5]b51LסB1O VHNvXR)}WͶ>.8y2UvKid T~:>$pX nuoi #>v}/0?F;"|c ;S7ȷҷrT:!Cl{fi/!K{\/_%S)^˺x=M q\ܿ X3Puz{Ib@oL54P:0:-^FJBL+ ~z-inn͹nľ$u Vޟ+PK_H "w>uF3HOz ya鰇tH*z!!2K%9H! XX~Y}0:]f*3CeHWde&2&ʮ L̾ X pFRW0uMe~{Ez ODi) 7DEpk.R8[^X+$d^ XwP/Ark)UTVcゲ+7s{8]p(^M..QVn6Rכ[vKu=n^6mSWUM#bJ JAG\rg"ur1&xb(]o/+fO{_Gq%\U3sF谦eI#ɲ˒uX#[Y–XأQ{$Dlb0~!@!!%a !!B#>H6|$HkF!}?UzUի{7fyճZ Ɩ_bH_*]xe;>6w\ZY÷ms5KJ&jMH+775`5,_rLrIiԔ^dؒvo[RiKˮKw(FZGJ/&"^:$_)QbV,rW;vgz ']X5;ot.t-ۜeIfeϝ5ʩ\\G4\X^I o+4dI|O镽On~[+KvFy0!/7 vGsiY;c..BOcV}ҟ^Ibfr2ay9fp幵's I%w^Y9V쾎WqkdAe~Pcn@{-!xzC[Y+_+gs%zo#=d]Wυ/ ]c8|૓w75җvM\q_~u}Eف/ko MWse:x&=Z 8[kĊ|{9R ^ՋWRNq.#eRVckN|1ۻ6jtͪ0Mj6+ekClVC``2Cc3$j!YS>-kRr._ִѣc ]TCh1ûa];m{\CvvqoyۣmB_˸wqTwSf7EK{L?*~,}~l%edwi%۳0 _.WJ/'K^ęc:Y*0[Fٯ?o`ӳX1+'rDVLug٘ɽѳ\}urSTdlm6ۖnCہ̸!n2inkYm/Հ- t2n'sfe@<*6wLŬU_ ӓqL74ө2\4٦x2 40` y\NY_d; &HٹV3f&%8əGNi_nNlgv67g×{&y\C_U'bT *5mי-q.6/NGK`"ĤKsW>F ͏:+_bnJMs5|U,<;<֟ںlrL\ m{y- 3¥-^eR\V0b,{25/WE|~:U~>Cx>K8p0r苴 kE{bwz^ ӧwe3?b77_{O|=$Je#?FHeHDbY60z=i5sZ~;ȇ-|f/ rwˎ~*aRt҆&\j7l\*]# Y^^HD 7uJ2>_݅uӶ&76"l>8ۏMeE9fIE9'"ܗAeUߍj;誘L "1+% k;k .$ dfݬ5&&L0a[W~p`8-5P[Z-nX\;5)*MH=0gboA(.ΌewՉ= qlf_qL)*J[yKs!%ҭ(ҹ}֟-*LF*`f4T__W'_77I1ZT qeֱnTElaRB ŗfh ؉_~a|PQL)qCe:/~,wuL8u'(&$Ba'$f+CZOa _aŶxa LqDM~ ץ,GP(J܉B@W.\SMҕ%ef-lǮ"܌U+ 3ؽ]s"[Hˮ4yR^-?_ێJ& X/8Jw'ia˟IF,W[xKh$:m䊅\{[4Q{Am8szɹoM;*J&C`<90JR*A-o# zW_/ﱫt-mD.R;=f+ZhEmr Ȓɀ[[۬IRhR3hiX3[v}ğ^GrrFoЛ?wl_KS5v{'ͻXJ1rf7 Oۣ`@ pma'?q|K&Ok05`ɱ'1-v?9 σGx]܎[!{ a=¦讅x? v.r.4~!i{{\F?Kz!1 I땿NH8?P q(d^t\S/L;MQzeZo73mMڋmgOgvgg]sogs-_[r]0UnV_.}ɗW叔pYٲ;++NVlyRZS55Ϯxv[PUҪ?546\(.҈:_$.RMvB-^2p mu )p$P\f \&xU7m7'W Lg7 "?.yn%Fۍ*Av;wS)Sbp8#&*Kue @l7'n"\!n&na5n#+ӟ]͐ U} Q#7`dq#wG4?q3Qe p(#)p(#5!p(r[0_9nż=mn;8¼>tݥOq<ӼLk [F94e:oKq/+8^8ĚQq/pVm󼔍n2FIVW;`2T*8 .a_Xw_TL%'L)m[Ooi_ X-wmaA}C@P>H# Osm^DE K`%pP?ƶG@qR( @rXx(kB? plTxFu -3Wf'=ez A(1c:OzF ]ih?Jztc}tCBk+yDHz+nxr`&8z9:sRN- @:kR~kOkE\1"C0Qʹ4t:&#OHh(A&5O]OM),*Y(|q-B"Asƥ[;(\\ҨQ :56%S,a*B?$R ucX a אnD$iTc\KÜDM~<8m8 ykZO{wc 2nTHLчZ/+];T.àZӌkdvR5rQ2ÜCnN80ZY=QE<,v0A*ׁ˹lc\D/u]qj)&l}y<5 >5kx*ɴGx.H.88(סan&y}^/xWũUu!^€ 6KHO1^U))qiEl AW61.D=A;:k7IonM蚚r.Q!hB$[d9sqO 6]ŭr,z 63&>j԰vmi7ӌdmXuDR:G\AWĴE,s= j`?ouEɌWBBMpcC|-aѢkըЏL-&sK.9>G#4=7x/Ku2%c|#c1xtK?_TBbsQܹKkaq[%8Kփ R>7339(6}O2}&Pc:s-T :>UdS'5PH=0I곤G@PSvijGd$'u}$:Ȉ:VmxUcdH8.1u[TS FmB1uӢh(ަKdQ;h XYUSuH,2/T=CG76P#ʵbq- 5;]S;*502j66dU }b'MmB#0lD[nC[CH8[GCP@H @@L##qmyHTXhrUK!D5u(1P B6!A>#*cC QȠb$ @Qa#:q1 G"q`;A[|L4W\ґCZ4ej0xa`;aiQ`" G @"YbI0-:6^ !-< B4NU>A <0:G$;R!3Zx\@wp((& B~MM@4 d6D2QO Q =qZBh80I`m,6րdXb1F#[P<>\]=66V5,*#az8'BǏ`L ƃl޴aM[ 6oߺ]mݸ}kbtXRCc8y *2\$0d 둮\G|y`_TP65c53ACuҠ4tT ơA |aFiq* ho"QQ2TK2E*0jz(NA1Аš#\gǓ< ;F`ssGa@u2[,¡ftc聘\cd D8t .]à?踪+Й qyl\^Z'^PDߜ86I iczsuNJR``K k0PƘzrSDA:x3 @Yc]CڰlޱkVaeڰnZ{T5'y8()8CǿoaCo;$mҝ 韥J'_XҿO.,_XҿaI’% K/,_XҿaI’Kg?/ &W> 0ErB"o/ X:m!:Ix,//;v.;Y (1#q N}R-+3`p- 菻=qnmɚuus:.] -Z,򬄧/GI⤔x]R&`Q%tiI&Tbz=;Mu#XfKM%~~A>^!\ p 43+9^f/'X iwLg`q`n"~ )N~~xQTT ["u΂@z;MId?sĎ%P7 {K3))ok&Ƞuh ؍$ƟIvg_v*'sN{ORz^7got򵇽_n.䛡`T9WǝSޫzC=.^ {1a˼-:U=y[,T2`<'ZT#0CMv:MLB״ĔgP܊Kq(6Ţ(Q%/%W WFS渋&*l&e:e үNq{ \;i(ZG'[Ȗu[fL&*L>7$v]3tMGh.;|cOdZY^ִ<^a.9_2yۖ&_3Y-]ݽQ{n{ۣwhzTZC߾ ݥ5m==[fNNGT;S tDU t;uthLJ8]dt'bm'9M6=9M,[]Lt Дp 4y:ki&p| )$4s|Iv.T R$$@_I_ӫ{۵E#<z"؃B;Mim6ލޫNݻNkmSۋm=HTZu]牬 #ô66ǻ7bZ VѿEw:u=w4Z@_rʻsUI'֊I[ѺI;zUV)rSxyZ]w^.pN+ZG*XxCm )@fE}h 2lɵ:a2^dsjmLwft!,-4PH[4ݽݽNp Xd0F+h,g[`~OL!.l=%őC)vf endstream endobj 337 0 obj 27659 endobj 338 0 obj << /Type /FontDescriptor /FontName /CAAAAA+ArialMT /Flags 4 /FontBBox [ -664 -324 2000 1006 ] /ItalicAngle 0 /Ascent 905 /Descent 211 /CapHeight 1005 /StemV 80 /FontFile2 336 0 R >> endobj 339 0 obj << /Length 573 /Filter /FlateDecode >> stream x]n0<"b0?%PKf6Aы!wq]lcیfcSͥi!޻M&֙ViOoҙ*MY0O;/X>qhګy=q-d6u5zhOۣq[ޗUdek:ibɬ]sLY8BxC@A!@ 1gI @ݲv) q,lF;@p`Q'p<Z9@Á%!#'C-ydAfYܵ#O׎<BҎ<)`Ǒ' 0<9ڟ<y㔇F=uɓP<qa5<7F{qq{mxyx<<BB<, "X> endobj 341 0 obj << /F1 330 0 R /F2 340 0 R /F3 335 0 R >> endobj 342 0 obj << /Im128 128 0 R /Im51 51 0 R /Im34 34 0 R /Im20 20 0 R /Im4 4 0 R >> endobj 343 0 obj << /Font 341 0 R /XObject 342 0 R /ProcSet [ /PDF /Text /ImageC /ImageI /ImageB ] >> endobj 1 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 182 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 5 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 237 0 R 238 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 6 0 R >> endobj 8 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 236 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 9 0 R >> endobj 11 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 235 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 12 0 R >> endobj 14 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 234 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 15 0 R >> endobj 17 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 233 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 18 0 R >> endobj 22 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 232 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 23 0 R >> endobj 25 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 231 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 26 0 R >> endobj 28 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 230 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 29 0 R >> endobj 31 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 229 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 32 0 R >> endobj 36 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 228 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 37 0 R >> endobj 39 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 227 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 40 0 R >> endobj 42 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 226 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 43 0 R >> endobj 45 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 225 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 46 0 R >> endobj 48 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 224 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 49 0 R >> endobj 53 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 223 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 54 0 R >> endobj 56 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 222 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 57 0 R >> endobj 59 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 221 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 60 0 R >> endobj 62 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 220 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 63 0 R >> endobj 65 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 219 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 66 0 R >> endobj 68 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 218 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 69 0 R >> endobj 71 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 217 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 72 0 R >> endobj 74 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 216 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 75 0 R >> endobj 77 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 215 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 78 0 R >> endobj 80 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 214 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 81 0 R >> endobj 83 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 213 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 84 0 R >> endobj 86 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 212 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 87 0 R >> endobj 89 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 211 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 90 0 R >> endobj 92 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 210 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 93 0 R >> endobj 95 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 209 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 96 0 R >> endobj 98 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 208 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 99 0 R >> endobj 101 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 207 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 102 0 R >> endobj 104 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 206 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 105 0 R >> endobj 107 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 181 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 108 0 R >> endobj 110 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 205 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 111 0 R >> endobj 113 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 204 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 114 0 R >> endobj 116 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 203 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 117 0 R >> endobj 119 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 202 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 120 0 R >> endobj 122 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 201 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 123 0 R >> endobj 125 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 200 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 126 0 R >> endobj 130 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 199 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 131 0 R >> endobj 133 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 198 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 134 0 R >> endobj 136 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 197 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 137 0 R >> endobj 139 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 196 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 140 0 R >> endobj 142 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 195 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 143 0 R >> endobj 145 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 194 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 146 0 R >> endobj 148 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 193 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 149 0 R >> endobj 151 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 192 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 152 0 R >> endobj 154 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 191 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 155 0 R >> endobj 157 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 190 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 158 0 R >> endobj 160 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 189 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 161 0 R >> endobj 163 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 188 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 164 0 R >> endobj 166 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 187 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 167 0 R >> endobj 169 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 186 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 170 0 R >> endobj 172 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 185 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 173 0 R >> endobj 175 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 184 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 176 0 R >> endobj 178 0 obj << /Type /Page /Parent 325 0 R /Resources 343 0 R /MediaBox [ 0 0 792 612 ] /Annots [ 183 0 R ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 179 0 R >> endobj 325 0 obj << /Type /Pages /Resources 343 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R 5 0 R 8 0 R 11 0 R 14 0 R 17 0 R 22 0 R 25 0 R 28 0 R 31 0 R 36 0 R 39 0 R 42 0 R 45 0 R 48 0 R 53 0 R 56 0 R 59 0 R 62 0 R 65 0 R 68 0 R 71 0 R 74 0 R 77 0 R 80 0 R 83 0 R 86 0 R 89 0 R 92 0 R 95 0 R 98 0 R 101 0 R 104 0 R 107 0 R 110 0 R 113 0 R 116 0 R 119 0 R 122 0 R 125 0 R 130 0 R 133 0 R 136 0 R 139 0 R 142 0 R 145 0 R 148 0 R 151 0 R 154 0 R 157 0 R 160 0 R 163 0 R 166 0 R 169 0 R 172 0 R 175 0 R 178 0 R ] /Count 57 >> endobj 181 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 182 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 183 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 184 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 185 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 186 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 187 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 188 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 189 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 190 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 191 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 192 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 193 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 194 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 195 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 196 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 197 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 198 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 199 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 200 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 201 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 202 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 203 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 204 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 205 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 206 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 207 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 208 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 209 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 210 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 211 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 212 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 213 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 214 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 215 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 216 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 217 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 218 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 219 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 220 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 221 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 222 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 223 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 224 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 225 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 226 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 227 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 228 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 229 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 231 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 232 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 233 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 234 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 235 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 236 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 237 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [424.6 21.6 495.8 33.1] /A << /Type /Action /S /URI /URI (http://www.nagios.org/) >> >> endobj 238 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 505.3 423.8 521.4] /Dest [5 0 R /XYZ 422.1 521.4 0] >> endobj 239 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 116.6 423.8 130.4] /Dest [8 0 R /XYZ 422.1 130.4 0] >> endobj 240 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 130.4 423.8 144.2] /Dest [8 0 R /XYZ 422.1 144.2 0] >> endobj 241 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 144.2 423.8 158] /Dest [8 0 R /XYZ 422.1 158 0] >> endobj 242 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 158 423.8 171.8] /Dest [8 0 R /XYZ 422.1 171.8 0] >> endobj 243 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 171.8 423.8 185.6] /Dest [8 0 R /XYZ 422.1 185.6 0] >> endobj 244 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 185.6 423.8 199.4] /Dest [8 0 R /XYZ 422.1 199.4 0] >> endobj 245 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 199.4 423.8 213.2] /Dest [8 0 R /XYZ 422.1 213.2 0] >> endobj 246 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 213.2 423.8 227] /Dest [8 0 R /XYZ 422.1 227 0] >> endobj 247 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 227 423.8 240.8] /Dest [8 0 R /XYZ 422.1 240.8 0] >> endobj 248 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 240.8 423.8 254.6] /Dest [8 0 R /XYZ 422.1 254.6 0] >> endobj 249 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 254.6 423.8 268.4] /Dest [8 0 R /XYZ 422.1 268.4 0] >> endobj 250 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 268.4 423.8 282.2] /Dest [8 0 R /XYZ 422.1 282.2 0] >> endobj 251 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 282.2 423.8 296] /Dest [8 0 R /XYZ 422.1 296 0] >> endobj 252 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 296 423.8 309.8] /Dest [8 0 R /XYZ 422.1 309.8 0] >> endobj 253 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 309.8 423.8 323.6] /Dest [8 0 R /XYZ 422.1 323.6 0] >> endobj 254 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 323.6 423.8 337.4] /Dest [8 0 R /XYZ 422.1 337.4 0] >> endobj 255 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 337.4 423.8 351.2] /Dest [8 0 R /XYZ 422.1 351.2 0] >> endobj 256 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 351.2 423.8 365] /Dest [8 0 R /XYZ 422.1 365 0] >> endobj 257 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 365 423.8 378.8] /Dest [8 0 R /XYZ 422.1 378.8 0] >> endobj 258 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 378.8 423.8 392.6] /Dest [8 0 R /XYZ 422.1 392.6 0] >> endobj 259 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 392.6 423.8 406.4] /Dest [8 0 R /XYZ 422.1 406.4 0] >> endobj 260 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 406.4 423.8 420.2] /Dest [8 0 R /XYZ 422.1 420.2 0] >> endobj 261 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 420.2 423.8 434] /Dest [8 0 R /XYZ 422.1 434 0] >> endobj 262 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 434 423.8 447.8] /Dest [8 0 R /XYZ 422.1 447.8 0] >> endobj 263 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 447.8 423.8 461.6] /Dest [8 0 R /XYZ 422.1 461.6 0] >> endobj 264 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 461.6 423.8 475.4] /Dest [8 0 R /XYZ 422.1 475.4 0] >> endobj 265 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 475.4 423.8 489.2] /Dest [8 0 R /XYZ 422.1 489.2 0] >> endobj 266 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 489.2 435.5 505.3] /Dest [172 0 R /XYZ 576 357.5 0] >> endobj 267 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 532.9 435.5 546.7] /Dest [169 0 R /XYZ 25.2 578.9 0] >> endobj 268 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 532.9 423.8 546.7] /Dest [8 0 R /XYZ 422.1 546.7 0] >> endobj 269 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 546.7 435.5 560.5] /Dest [160 0 R /XYZ 25.2 578.9 0] >> endobj 270 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 546.7 423.8 560.5] /Dest [8 0 R /XYZ 422.1 560.5 0] >> endobj 271 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 560.5 435.5 574.3] /Dest [154 0 R /XYZ 25.2 578.9 0] >> endobj 272 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 560.5 423.8 574.3] /Dest [8 0 R /XYZ 422.1 574.3 0] >> endobj 273 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 54.5 435.5 68.3] /Dest [151 0 R /XYZ 25.2 578.9 0] >> endobj 274 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 54.5 423.8 68.3] /Dest [5 0 R /XYZ 422.1 68.3 0] >> endobj 275 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 68.3 435.5 82.1] /Dest [145 0 R /XYZ 25.2 578.9 0] >> endobj 276 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 68.3 423.8 82.1] /Dest [5 0 R /XYZ 422.1 82.1 0] >> endobj 277 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 82.1 435.5 95.9] /Dest [136 0 R /XYZ 25.2 578.9 0] >> endobj 278 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 82.1 423.8 95.9] /Dest [5 0 R /XYZ 422.1 95.9 0] >> endobj 279 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 95.9 435.5 109.7] /Dest [133 0 R /XYZ 25.2 578.9 0] >> endobj 280 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 95.9 423.8 109.7] /Dest [5 0 R /XYZ 422.1 109.7 0] >> endobj 281 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [435.5 109.7 437.2 123.5] /Dest [5 0 R /XYZ 435.5 123.5 0] >> endobj 282 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 109.7 435.5 123.5] /Dest [130 0 R /XYZ 25.2 578.9 0] >> endobj 283 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 123.5 435.5 139.6] /Dest [119 0 R /XYZ 583.1 369 0] >> endobj 284 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 153.4 435.5 167.2] /Dest [116 0 R /XYZ 25.2 578.9 0] >> endobj 285 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 153.4 423.8 167.2] /Dest [5 0 R /XYZ 422.1 167.2 0] >> endobj 286 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 167.2 435.5 181] /Dest [113 0 R /XYZ 25.2 578.9 0] >> endobj 287 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 167.2 423.8 181] /Dest [5 0 R /XYZ 422.1 181 0] >> endobj 288 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 181 435.5 194.8] /Dest [107 0 R /XYZ 25.2 578.9 0] >> endobj 289 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 181 423.8 194.8] /Dest [5 0 R /XYZ 422.1 194.8 0] >> endobj 290 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 194.8 435.5 208.6] /Dest [101 0 R /XYZ 25.2 578.9 0] >> endobj 291 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 194.8 423.8 208.6] /Dest [5 0 R /XYZ 422.1 208.6 0] >> endobj 292 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 208.6 435.5 222.4] /Dest [98 0 R /XYZ 25.2 578.9 0] >> endobj 293 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 208.6 423.8 222.4] /Dest [5 0 R /XYZ 422.1 222.4 0] >> endobj 294 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 222.4 435.5 236.2] /Dest [92 0 R /XYZ 25.2 578.9 0] >> endobj 295 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 222.4 423.8 236.2] /Dest [5 0 R /XYZ 422.1 236.2 0] >> endobj 296 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 236.2 435.5 250] /Dest [89 0 R /XYZ 25.2 578.9 0] >> endobj 297 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 236.2 423.8 250] /Dest [5 0 R /XYZ 422.1 250 0] >> endobj 298 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 250 435.5 263.8] /Dest [83 0 R /XYZ 25.2 578.9 0] >> endobj 299 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 250 423.8 263.8] /Dest [5 0 R /XYZ 422.1 263.8 0] >> endobj 300 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 263.8 435.5 277.6] /Dest [80 0 R /XYZ 25.2 578.9 0] >> endobj 301 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 263.8 423.8 277.6] /Dest [5 0 R /XYZ 422.1 277.6 0] >> endobj 302 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 277.6 435.5 291.4] /Dest [77 0 R /XYZ 25.2 578.9 0] >> endobj 303 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 277.6 423.8 291.4] /Dest [5 0 R /XYZ 422.1 291.4 0] >> endobj 304 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 291.4 435.5 305.2] /Dest [71 0 R /XYZ 25.2 578.9 0] >> endobj 305 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 291.4 423.8 305.2] /Dest [5 0 R /XYZ 422.1 305.2 0] >> endobj 306 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 305.2 435.5 319] /Dest [65 0 R /XYZ 25.2 578.9 0] >> endobj 307 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 305.2 423.8 319] /Dest [5 0 R /XYZ 422.1 319 0] >> endobj 308 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 319 435.5 332.8] /Dest [62 0 R /XYZ 25.2 578.9 0] >> endobj 309 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 319 423.8 332.8] /Dest [5 0 R /XYZ 422.1 332.8 0] >> endobj 310 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 332.8 435.5 346.6] /Dest [59 0 R /XYZ 25.2 504.7 0] >> endobj 311 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 332.8 423.8 346.6] /Dest [5 0 R /XYZ 422.1 346.6 0] >> endobj 312 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 346.6 435.5 360.4] /Dest [56 0 R /XYZ 25.2 578.9 0] >> endobj 313 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 346.6 423.8 360.4] /Dest [5 0 R /XYZ 422.1 360.4 0] >> endobj 314 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 360.4 435.5 374.2] /Dest [53 0 R /XYZ 25.2 578.9 0] >> endobj 315 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 360.4 423.8 374.2] /Dest [5 0 R /XYZ 422.1 374.2 0] >> endobj 316 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 374.2 435.5 390.3] /Dest [42 0 R /XYZ 584.1 369 0] >> endobj 317 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 404.1 435.5 417.9] /Dest [36 0 R /XYZ 25.2 578.9 0] >> endobj 318 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 404.1 423.8 417.9] /Dest [5 0 R /XYZ 422.1 417.9 0] >> endobj 319 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 417.9 428.9 434] /Dest [28 0 R /XYZ 552 383.4 0] >> endobj 320 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 447.8 428.9 461.6] /Dest [25 0 R /XYZ 25.2 578.9 0] >> endobj 321 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 447.8 423.8 461.6] /Dest [5 0 R /XYZ 422.1 461.6 0] >> endobj 322 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 461.6 428.9 475.4] /Dest [22 0 R /XYZ 25.2 578.9 0] >> endobj 323 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 461.6 423.8 475.4] /Dest [5 0 R /XYZ 422.1 475.4 0] >> endobj 324 0 obj << /Type /Annot /Subtype /Link /Border [0 0 0] /Rect [422.1 475.4 428.9 491.5] /Dest [14 0 R /XYZ 520.1 369 0] >> endobj 344 0 obj << /Type /Catalog /Pages 325 0 R >> endobj 345 0 obj << /Creator /Producer /CreationDate (D:20070829092352-05'00') >> endobj xref 0 346 0000000000 65535 f 0000470143 00000 n 0000000021 00000 n 0000000870 00000 n 0000000896 00000 n 0000470356 00000 n 0000014681 00000 n 0000016919 00000 n 0000471033 00000 n 0000016946 00000 n 0000018770 00000 n 0000471546 00000 n 0000018798 00000 n 0000021039 00000 n 0000471761 00000 n 0000021067 00000 n 0000021643 00000 n 0000471976 00000 n 0000021670 00000 n 0000022845 00000 n 0000022873 00000 n 0000029679 00000 n 0000472191 00000 n 0000029705 00000 n 0000031462 00000 n 0000472406 00000 n 0000031490 00000 n 0000034733 00000 n 0000472621 00000 n 0000034761 00000 n 0000035341 00000 n 0000472836 00000 n 0000035368 00000 n 0000036511 00000 n 0000036539 00000 n 0000048573 00000 n 0000473051 00000 n 0000048600 00000 n 0000052176 00000 n 0000473266 00000 n 0000052204 00000 n 0000052887 00000 n 0000473481 00000 n 0000052914 00000 n 0000053509 00000 n 0000473696 00000 n 0000053536 00000 n 0000055612 00000 n 0000473911 00000 n 0000055640 00000 n 0000056604 00000 n 0000056631 00000 n 0000196642 00000 n 0000474126 00000 n 0000196670 00000 n 0000199563 00000 n 0000474341 00000 n 0000199591 00000 n 0000202682 00000 n 0000474556 00000 n 0000202710 00000 n 0000204878 00000 n 0000474771 00000 n 0000204906 00000 n 0000207172 00000 n 0000474986 00000 n 0000207200 00000 n 0000210660 00000 n 0000475201 00000 n 0000210688 00000 n 0000212394 00000 n 0000475416 00000 n 0000212422 00000 n 0000215421 00000 n 0000475631 00000 n 0000215449 00000 n 0000216853 00000 n 0000475846 00000 n 0000216881 00000 n 0000218859 00000 n 0000476061 00000 n 0000218887 00000 n 0000221848 00000 n 0000476276 00000 n 0000221876 00000 n 0000225371 00000 n 0000476491 00000 n 0000225399 00000 n 0000228005 00000 n 0000476706 00000 n 0000228033 00000 n 0000230249 00000 n 0000476921 00000 n 0000230277 00000 n 0000233197 00000 n 0000477136 00000 n 0000233225 00000 n 0000234432 00000 n 0000477351 00000 n 0000234460 00000 n 0000236707 00000 n 0000477566 00000 n 0000236736 00000 n 0000239902 00000 n 0000477783 00000 n 0000239931 00000 n 0000241940 00000 n 0000478000 00000 n 0000241969 00000 n 0000244600 00000 n 0000478217 00000 n 0000244629 00000 n 0000246124 00000 n 0000478434 00000 n 0000246153 00000 n 0000248907 00000 n 0000478651 00000 n 0000248936 00000 n 0000251985 00000 n 0000478868 00000 n 0000252014 00000 n 0000252621 00000 n 0000479085 00000 n 0000252649 00000 n 0000254067 00000 n 0000479302 00000 n 0000254096 00000 n 0000254993 00000 n 0000255021 00000 n 0000362022 00000 n 0000479519 00000 n 0000362051 00000 n 0000364967 00000 n 0000479736 00000 n 0000364996 00000 n 0000367401 00000 n 0000479953 00000 n 0000367430 00000 n 0000370622 00000 n 0000480170 00000 n 0000370651 00000 n 0000374050 00000 n 0000480387 00000 n 0000374079 00000 n 0000376620 00000 n 0000480604 00000 n 0000376649 00000 n 0000379718 00000 n 0000480821 00000 n 0000379747 00000 n 0000381785 00000 n 0000481038 00000 n 0000381814 00000 n 0000383646 00000 n 0000481255 00000 n 0000383675 00000 n 0000387325 00000 n 0000481472 00000 n 0000387354 00000 n 0000388631 00000 n 0000481689 00000 n 0000388660 00000 n 0000391936 00000 n 0000481906 00000 n 0000391965 00000 n 0000395487 00000 n 0000482123 00000 n 0000395516 00000 n 0000398147 00000 n 0000482340 00000 n 0000398176 00000 n 0000400645 00000 n 0000482557 00000 n 0000400674 00000 n 0000401276 00000 n 0000482774 00000 n 0000401304 00000 n 0000403173 00000 n 0000482991 00000 n 0000403202 00000 n 0000403886 00000 n 0000484437 00000 n 0000484644 00000 n 0000484851 00000 n 0000485058 00000 n 0000485265 00000 n 0000485472 00000 n 0000485679 00000 n 0000485886 00000 n 0000486093 00000 n 0000486300 00000 n 0000486507 00000 n 0000486714 00000 n 0000486921 00000 n 0000487128 00000 n 0000487335 00000 n 0000487542 00000 n 0000487749 00000 n 0000487956 00000 n 0000488163 00000 n 0000488370 00000 n 0000488577 00000 n 0000488784 00000 n 0000488991 00000 n 0000489198 00000 n 0000489405 00000 n 0000489612 00000 n 0000489819 00000 n 0000490026 00000 n 0000490233 00000 n 0000490440 00000 n 0000490647 00000 n 0000490854 00000 n 0000491061 00000 n 0000491268 00000 n 0000491475 00000 n 0000491682 00000 n 0000491889 00000 n 0000492096 00000 n 0000492303 00000 n 0000492510 00000 n 0000492717 00000 n 0000492924 00000 n 0000493131 00000 n 0000493338 00000 n 0000493545 00000 n 0000493752 00000 n 0000493959 00000 n 0000494166 00000 n 0000494373 00000 n 0000494580 00000 n 0000494787 00000 n 0000494994 00000 n 0000495201 00000 n 0000495408 00000 n 0000495615 00000 n 0000495822 00000 n 0000496029 00000 n 0000496236 00000 n 0000496390 00000 n 0000496544 00000 n 0000496698 00000 n 0000496848 00000 n 0000497000 00000 n 0000497154 00000 n 0000497308 00000 n 0000497462 00000 n 0000497612 00000 n 0000497764 00000 n 0000497918 00000 n 0000498072 00000 n 0000498226 00000 n 0000498376 00000 n 0000498528 00000 n 0000498682 00000 n 0000498836 00000 n 0000498990 00000 n 0000499140 00000 n 0000499292 00000 n 0000499446 00000 n 0000499600 00000 n 0000499754 00000 n 0000499904 00000 n 0000500056 00000 n 0000500210 00000 n 0000500364 00000 n 0000500518 00000 n 0000500672 00000 n 0000500827 00000 n 0000500981 00000 n 0000501136 00000 n 0000501290 00000 n 0000501445 00000 n 0000501599 00000 n 0000501752 00000 n 0000501903 00000 n 0000502056 00000 n 0000502207 00000 n 0000502360 00000 n 0000502511 00000 n 0000502665 00000 n 0000502818 00000 n 0000502972 00000 n 0000503127 00000 n 0000503281 00000 n 0000503436 00000 n 0000503590 00000 n 0000503743 00000 n 0000503893 00000 n 0000504046 00000 n 0000504198 00000 n 0000504353 00000 n 0000504507 00000 n 0000504661 00000 n 0000504815 00000 n 0000504969 00000 n 0000505123 00000 n 0000505275 00000 n 0000505425 00000 n 0000505577 00000 n 0000505729 00000 n 0000505883 00000 n 0000506037 00000 n 0000506191 00000 n 0000506345 00000 n 0000506499 00000 n 0000506653 00000 n 0000506805 00000 n 0000506955 00000 n 0000507107 00000 n 0000507259 00000 n 0000507413 00000 n 0000507567 00000 n 0000507721 00000 n 0000507875 00000 n 0000508029 00000 n 0000508183 00000 n 0000508336 00000 n 0000508490 00000 n 0000508644 00000 n 0000508795 00000 n 0000508949 00000 n 0000509103 00000 n 0000509257 00000 n 0000509411 00000 n 0000483208 00000 n 0000403914 00000 n 0000425006 00000 n 0000425034 00000 n 0000425280 00000 n 0000425830 00000 n 0000426286 00000 n 0000439512 00000 n 0000439540 00000 n 0000439789 00000 n 0000440225 00000 n 0000440561 00000 n 0000468330 00000 n 0000468358 00000 n 0000468599 00000 n 0000469258 00000 n 0000469833 00000 n 0000469910 00000 n 0000470023 00000 n 0000509564 00000 n 0000509627 00000 n trailer << /Size 346 /Root 344 0 R /Info 345 0 R /ID [ ] >> startxref 509827 %%EOF ndoutils-1.4b9/docs/NDOUtils Documentation.odt0000644000175100017510000077735410676757261021511 0ustar baeckerhbaeckerhPK;7^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK;7Configurations2/PK;7\|J|J-Pictures/100000000000029B00000136EAC33318.pngPNG  IHDR6ΞsRGBgAMA a cHRMz&u0`:pQ<IIDATx^_י3I֣9NǑ{HxsNzM21d f5AL+b03"D`HZ"l_%} `|3nW. }7ꫯ9?O|sW{Nwy=:R@ H+R@ H) Ʈ{^_ H) q R@ H) 'ЈR@ HSൃcu2[nY͛ğBL*1~o#VCQԝ;wIPa褀lNr)p2pYP?{lDUEB׮];vvԩǏ3@?"dr ʕ+ނٝ?E= ʶYD@:F(R@ T+V@*g^VQlY(?VO* - p>m :N%kɪQ@DO[ DZ\znt-EY[fIz 8jDwp4 :~jV0Yx|V;/m[§VViч&(Q@t\qǵf"mG:<ä7XͫXҥKtn(j,rFVlG1jhd\x6cfS=fj*wj[YP9=o7ԍE nUK)]=ʠV*щ}#.MI#Cz#l T0eD,̐F8l<|IYc31LQ-FXB1Y_B Dx@[PZZ('l~\(WŶ񢱞( ) Z+ J*О\ΉX~j$lݞkI M$E4N&/k Rj 炣V*=0<"% ~nS/%&樀>VB@#V-] ̀-c!-{FBKvW; dYfRy0x/cދ)IR قGva`{AR HN Rd ':g-بf~rygrĘ?8edZkBA 3YkDn>X˃7,#~s趦\@rݔT@DWOXtP3{z[_Y d{ws"V3L6Qn0( }=[:"4> p5nm9Z_]5VG$}CH6 mTR) CW@Dz |R@ H) ( QIaR@ ]}-I) hF%R@ H)0tD'R"zf ܽ{{j3V`=讠uW`/(}(7N"zgah [G>OVoY;Z_6m8=[My)Hh@G>7OV3"zt/lD&kQT@DP^)'*^f:"zK>ɑ$>"$*^%IDOw^f*\D1e sTy* $_"z#OrR\D}w)e>ή"A%IDh\F;wME"zK>%>"$*^%IDOw^f*\D1e sTy* $_"z#OrR\D}w)e>ή"A%IDh\F;wME"zK>%>"$*^bDW~K~E׿Dg:YR,Ctp E9wjYB\":0G1,cG=G"w(KDh\2Dg`7P==^uTr;wME\x W7t(XD*Itus~0ΩO]'9|T '75jNW|%` /r'TO@K DGv|K{Do;߾7 cU1(PDݧ }"SOp\|D2501^ LDOwbIct'z=Yx<18̧r ;":0ݮ) kueg^;evݱ{^x!Ӑ>Э/:?\֞c -̣/;#zg Ud Cc=w-}[T*Ӓs0m]u0r'zpBYW ID{ӧفV֞,iN7$D.Jѧ4|T fjG8%~̅oqβ7@.4FjQNU|fxFz-n?YN ^Ogŋ3G~:3Y7׎E~Y[lq֪&\"PsVѹ u@` K9 OU\#$.vf)Rze8}ssV2D}sAc#ݞ>l-$qVOaTrb}G/@1|:ϫ}/WD/קSdX Og0G$^,S+*0 IwЪ:$-}(8j1|Iw;V%;HDDQK+0 @w?Ş#OuIKU'HtaL?)y#Jc 詮+IGD`zO8Q8)Wf*k+S@DOxiHJD_Y7A3g"z"wŊ1KD2W(},_W^]ZQ̣YsїvEѳ^,q}ܹs믿ަ"z# #D{k |D68 uoL %pK>';SD;uy׽%IDۏ{i\+ʌѣu eP"0Y׉sxч9^T+ BC ,ǔ9&E2EDxQyơ^ %j<`);Leֺ饊;#D2$}8 qs}:y#-**~<̨Jd)*:X}&N@ 8 GZږ/S3K)7$\+}#G/N`D$2*)YXwVm6^z%>q~2J}*R Z a(NAM{`*S@DϧRK_0/_,n^;8)[͛Ď>ⴔkMD6*)Ȣ.ٰaeI]Mn"qٳg'R]v1:u_ŕ qq,0lH(KDJ #r)EOwU>[J穈n@*%O|@n@ (;w< `p?>"ד҈-o)Ha@F`:uPV}!xP-y|JE;@Y,fG:p\l]߰vҪ-e1('PV0UePѥ@_2-VǴ :4qxaW\1#Go"2_/]dmO/p~YTl 浀\yy7oFmsxQ<5T RX 3VZTy jxVLD'Aa`>N1Ih!!MG ~G"ˈo, BD\d VQF:8@SNMu@Y~GYqO!3e.8,vawΤȪGpիY3RR@DWRhSaJli8q c%Tn F聯BK `7P`)| g<_(*Ҭn3coM]O"z{R R@:C6/Ǽ&3H$+ /H!@a .\(_4驤) XR x&vѦyUN:&9pj8OW'4>DJ<ds#>`A; 墔RD)XmfGeɉsX4rlˣ>XR@DcUw@eS°$WX:E9`O~dڽbxs=]<">ʎBS CDxj )0Dt}&]}R0I>3|Ug͹lPOGIHcU@Dw\nثH6+Yt8lfTY*  T^ѹ͎'&GٕUt "zޤ*Wiz}:('V/_N*:tqx[[8qVwwg˚F+d &_64GWW(q*E`agx;+ l}g osma 5uwOۅ _ ;|5vvZ_p}=cai5jMtɡ %ND,H ?M@~?`[oᅡEݍϽ_'O>[M]koIPD/s!蓼̷R1}C0s˗OmƿҟkkƝ W@w|r`c _YE}W~yY >=o"NWu!+/Ej1}6uܩ~tGqfs+{ /_iK"z+%>GQU;~ <2 >ŋ`"Q:M~C{.]c͋zx 7 UE1^۔sg|fyj?XX=baD27{-\UFB W5Ot t"z+WɌp_3i#XVXǂz؜~^D'O~+ Or'MiH_He{y|M- al\u%Җ$ׯUIR(˗3 [D":|+R@t"l#> gyt7ӤL 2wĵ_X"z #};".o|СdͱP"zku`":MZXmt@3?9q$#z&m;)N/=۲!>(\{Y¤Kv/7viD|wnmJ]K'_}Iw=?O㞿!9낊m 76v}{ýX?Q"z+%>GӒD7u qљJ)s '?`/-}㝛-7ȥAŠ :X'N`u#ĭ>oQo"z<ӟ#͑N48OnlZVƙox߫7 ܼ|օ  l/SXL ѣ"`X|<cCk/n8ԡ ~9zzU]uG1,p0m :WrzVy[Y5?UoƺsNj2N83@{g ce ֽ6=r/L[kW /w3g6Ay}f 7"/Cmk{?Lk D ngWa9s>yiF<^O cEoȘjUF+!ZNdG|5 cYPNx 0]W|U s_Eth•q1E\۹:ݯ!Tu5;O&S'z0. [xouv+|>ox)XpC lY8GxD{@z?<r.3Wb :>tW'ˋ$:h ;^!uvI@t"\s+a/}9_Cxdʽ睝O|Oyuv`3r+SQxQ6 X g"ztJ kHbk7D_Eї36;kT)"z0Η %8ZԠ[0(x ⃙iв,CTk~Y GknV6-W](I`B3 a#ە$Օ9y:"rSts;ѫ:;jX6{;~va˂ln|ObjӲ`G5YNhsG8n2pρhe\$DGvK19ZW'zK:ʿ=\WN1_\ G ?a&0 6\V>{Xɨ]f>a0t BDwpb̙+dxٞlO' Nt"zhi?yt n@5hBnB'1a8~Ý2Ru.݇g<5޵S _Ts%f۳|+5yt>t`B!S|b/E|xIkPV@ ^DPCrNf#+s/#텑;(~; cegEJ%Nr'iyW_UFDѣ"m]{nNcamV;8?sk{匈f|gl~0omZmVyݹ (mt3ͣ̄~Y[lq. 3uv}^2x[yްD_q@rE==gBkmܶ5|!e^`_wÇTf%u;3* 7%O$.G8R:D)/[*C>n{/}\;"8xc_g7Dl`s aXsDUٍ}G'VqEthB [g'7"LX#3x9-3{pF(%#gATͼ}݇sAZ᯳'IṯVuqyyS ?*賸3{^1]t{cE}WgFٓW]D/x]D_w d}o>֙gs!>Yxg?,"SqիWf5_A>Ň}R3m_m(jgAtt2ijͽ:l ^@ =pS{.Y< */ZgN9Sb<ERt)0|3;hn|=0ք.xЫe>s<HWיe$ç{¥eLD!U)L0ݶpfѡ$^jse$"޿))0{G{`{mJDoOtUWyҥf9bϜ2gC!kǝ;w7Su) ͛7}uoy4,[xi i3l'> 1wo}Fl#ʎ;TM 3 }(D?v=[wYNсǏ_r:)MR?ol^oSɄk{GyhD-\T#`47={3p'E'O^N|`:`hD'\s4ȅ4cl}X ǟ, 볰G/~ w 1lqWpibDk!H7l^dUUWvu00 c 9Vj܂kDǿ̱=iw_FoyHlZ!ȥw:u!uVhj,&踖a|*+0ђ(r߬!ҷ ~‹舲:bޠ`̂ghhauOFL@RL8;0XWމOpW0w wUMD(э j8$΁\^="Diz^.ä/N<>NYIݚՐ'HrB4hӶe,q♍NpP[P[!Y0%nb"0닿Lӷ*bk׮ 1qDa730>\F5iax 'ϒ4Lɒvo1dN$:LXT"MI\+j[EDJ FEmĻ3١o*ͮ =Up>\{/u[G$hL3!yiNx۾{iKcڌ. mk~Z }9d`-KXElH w'[^*Ur#.We'+8 -x'7ӈV!̊LI]кzn uɚo&z Nڛ!k+.geJVD3ur?>=%kѹ눹^D^w̚4,}o߉*zݛn7CxUV$pbj 6:-~s]شִ'C'KO?~Οnoڝ;\O"7_@>nFtD598  ' b;NXt{&!:n(g0LQG쮥0)o>5@G JtX`->OzޞCDXg #:Ҷ04¼`gnOpe1o#> Drɡ`}QZ)4hL!n*cFVԟ5.L7I9iiFS?{~-N<~4@?~{: LʧÈYwd0w%(X>^{E`9sξjW/ IdUs9DQ\WakxdW'F8]~KG {g" SA: Y #BŌj /e9F/<^h~?p&t<~yRM+Jgai\;W՛"zlJw..*@5O~|3 7YHfғű hIcu`11! LGD} ,K.kRJE1* !92ݯ3lM&'%(iT=n6EN6*y\)x>X 6~4 +ir8nyݙ`Q6 nRy&Ho4T_Doӗi mzaleQ% t nO .lůQ6k6vx%%E"M2d&{@t ^w]t>y=K3wQ{־$V_5gAx|} H ˹>Ns}@@;o,`WDO땞ڗ|CtZd9Ϲ w[4K{NrZ5o,,9rßil.-A*9gW}C / xC\} ~:V:2QNAY5Υ2;;x0]}att%!{7^;,7x+ k-p vv`2d0O/ʂh,Xfz6Oie\\ګ6u;`$KԾz/a]hnFs"x=QDW UPܬBoY2!6:Y]pnxf72k>p(f@1hs'yEyK?vkhSjssڌZk/@5gfﲤ~Q,{[$ vDGy"/w .J)oc\cx , XPĶ6qN[E|0%av#$ mp! @ l( ox]6zn>D70JϳfZnv|;F,#K@Tn"6z\E_9JV <'b'Rsvd^':ׄq/=f} /1y ҆k$)>|?\?w.DDO [Ԟ(@jΗׅ໽ϣ/r % FtCNw}׶[ue9k,ȹTtkEt=Gf{#\*wW//`ŽEDK@<уmNx/̊++peȑ#`<IgN7C]6z"9 7t脱^{Uz/Z/K@7 AVD~pOFޢ+H6]9iEVƥJo ShEa\ `8ظ}vCeFWViW&P.p֚k.moD*)Nӱo p}̵.6;"[U]ȹ+lŐ.eWQ0)@Dt)]^Dt}oQH) H |څ :e&:KR xxk6"޵(gT 7&"]D62gD9Q`׈VjiGq?VQTѧڲ*5@;/?=m0Gno .M">ՖUV@]3}{O/\Կc3gtwwSѧݾ]iZکX{{'uŧ?z⋝4T`)0D9XH;v-V~ȑ>GͻL@3gW~]Ux)0D4*JWVT#K/믟0ѯ_O ':q*"QUX;,1ԫW>}jccv.|gG xlՎZ;C8s湗_~y[mzR` hGbe 𚰸(!pkky2~Fd2R@ LW}m*`;fi(R"ziŕo O HE R]ëzU@Do۩UrR@ U@D/ru-rI)VR 7aWUQ@DO[5 hWu ) &>TE:+^;KR@ X}T@;TWiK)D,Wvx]yR@ $W@DO.u-I)%"V:ڦSXE0 {no}fS \87T^S)t"zdo|cK]8۷=M H)0DȆNtëpM HQ) G6>dknhR@ Y=D666lǂU4) #MD&ѵkdV4) Ưن"^#{I)0 DfчFtzFU4) #[ODѵkd?V4) &٘"p^#;I)0-DBtكM H) G6>khR@ LQ=UE];Fv\ER` m[o_^ʯ~5OPOO7L'kwi^hR@ LZ=yGzp;~ <߬Hx5*SW@DlDЛSQߞ= vx쯊& #_pg4pOG B*ߎγLkSd9.];FTER`6 M]|Kyl/O~vbgp׬pIbW_Dtݯ}Ӹ/wGp}{E6I) 桀+!:-i;Ht3Z._Gёt?D#I)0'D^ ͑iv_Iqž^w[Og2,x7B{;R8|(z3mhR@ HI+ G6愈 `1n 8n1 ߼2Ζ޶ȂO|,g"zdU4) 槀"^wzmmׂ `˽]nwVER` n^UN H) f>VER` Ҽn녕u떝sM.}ɭ͛7َ3W@D}Şt(Ǚ#_~G-/evر$¶C8{yK H)0DDϊL=e]Cɓ :QH߈/"zD)P@D_BE^ZOr-nv/:ˈ%nnꎦK(ShLio[E/o׮]#qT]kY>3XI8sS[XnH-56wT-lkы\("}0,b;ޛB^r-': 0<]A_}FԊ:0{C᥀S@D!:iJInh:6Ld0M?c( ⊦E-XwXA3G4)kw3 Ȃ84qIS KhqR"ZVq!9 ,>Mf٨k k|t X HT n7ul~xW7Fq #q:$%kM G>|F\J=YqJ; iD23r̂3 JQtcT@D_Ht3I jCc> :~Y.*khXmw.XiZ1舮kݾ*@vV_4$p?/ kW[|'x+ʲ +߾: )"BnXiS{jXJtIQ5Uϣ/(p`v˾xC3lu"?2o>ՑzI) * w#:1KyQqgD'NHT Ujn{W ~0o52c% 6Dx&eB~R@ H* w#!f%@DNLio7 &nќ4c^6ͼl՛8 Kn ʦ_%`)H[q&"z7#!2``e"*zfX28偗 r< `3λO1pNFQ3ށJM H)0^Di;'᤺[8JNo xOvi(V?6O-r'\W[ ,WbzgW)9ע OX_%%"xn%'!;Cl{-Pч2.M(܅eV[K)0RD6܊Ipvz} 쥀"GER@ H)ZZbkLIENDB`PK;7x+X_X_-Pictures/1000000000000301000001676804EB4A.pngPNG  IHDRgqO,sRGBgAMA a cHRMz&u0`:pQ<^IDATx^ym%1!K2V/$A7fe%!変 lk4{U߲CH `BڵښhK e[)VvuvՋ ^)8])He<==3;g朙w~|_s믿J) R@ M0>R@ H) aW H) `RA H) T@ 4AWR@ Hف~|a~ŽC| !J΅OQYc~yBCiR };v,@Q-d H@(tFu8׮)W`@ 7nU+YߐkpG)F:HQޭC$Ϸ-(@ -..zҘe0Vk16*jR@ L3 8'|E' ɽWw"έU(07 dY%;,5( {GO2&\@Yae4p!L=H) ?Nۈot/ 拙)iM{Uq ~򪰐\2 庁+2{A_mkF5pUaʴ3!g1;PVX4NФW H)0L@u<˞wC !) [a-H"ƒw!jd7Y!hL3ȅ[yXE\ {R@ *kTp֮ i F$W5{wffirXh?mRRx/g0g`(м{$$1P?3%R@ H*0\` P3x d.-кc06%xQV!j@Њ0(F23;$) (T` a4>8w_yC_90PZDc.>/lH{m@f r]~t Bb,: K%R@ H)Pe do7uAFBrF,|޲pu4L kėf2dǝ6,d[K) pȝ77|a4m9K\f ukF7Vc\̘fT|\ٖۘ52-O&l@)  􍁼¼ rJb4>Ll_iq-yQ =G~1A rA7 qhnf SR H) @Z@iQiR@ H) @_ud/) R`b R@ H)  qg) R@ {@ H) b!,R@ tH) CT@ 4QWR@ H1) R` 8R@ H) = R@ Q1G]}R@ H) V:u>R@ W`qqQO) SO!@)>gϞ?~\ H)0p37{) J) K)i@?)PQ1P}jR@ TW`ĽT@ R @RbN?x)  ub =@V@ $u٧K) @ JK@zJ) :H $** OR@ *ziPJ) T H)i@b )PQ1P}jR@ TW`ĽT@ R @RbN?x)  ub =@V@ $u٧K) @ JK@zJ) :H $** OR@ *ziPJ) T H)i@b )PQ1P}jR@ TW`ĽT@ R @RbN?x)  ub =@V@ $u٧K) @ O>~[G | ~yࠌIKz7<;ozWzV_=33ns/1:{7>G9~Ҁb1ɗU=(|Cw{O /?4mUV}UG @ q8ٺuz嗿yvv7J䒋i;7aaa@b²Zx7@#GlذСxl۶p^u՚3gRHx<[3ЩS`!;\ęȑ;O[Z7y,.ލzڌ6޽DH26-//% @_?#K t+<]w-{obw`k{I<D?.1Hv@@KKK^;=Lzŵkg4@0Y6FZYy0-gtgN43s-,C`A#!1P@ ljBvᮻo?4L3'8xH@b-\x D >e5` no 鉁@UzcL(̇z晕2b:oMB TP+u𚟞yǴG&تGQb?فj24P@ޫ30j.vn̊g 1Pezz fڼyѣ['mС涊@UarO !Ss `X(ؘ@!/M>71OO  2_ڥ^"MMUq4;dž.>v[vk*,V7T+_ T>PAB8=¬o4=}ǞC2%Bh(nOL4ò'^*ByMq 4@8jE|鯾{/~岵 2"{ٌeӋRO8#, 1+. @$u̞D^?mܸGXpǎ#w܁ŝفۿya8ڭyaw ua ڽ{B=/K.)= 'f.-M03,'H(J``j$CQr^ ,$7eT @C{?WJǠRYf,^ W'naCx<#,=*a@Q0̒{e# ؐpsM[ /Ճ-T@1 0dTh!(afhԕH}߇^ i~~^vu;704At&/>FRsXt.s+c^L7#BNb 1Pށ#7+Ӿ\XH 4 `PHo.%K 11)[@|`)\ԩ{8HE0)Hd#2k~UP/6B6 f\qߠCz$`/1:Rb %81:14.2%3[ s³'\O8^r\8ځx1 %sRF"!P&бV"VWseB"tQS!z9(l󶓁8 Xz"n%9@T'A\$:jHs E1a-2cؤR" JF_q17F-\ Y[OȮnc4IJCS F P]M0T:qSc hO>OHC1_Wc%' kUxuYz!Oe 8{tlٴ3!=Fv@F@t`/%A1P8Ĥl!D9( ?ơ p E)80_\3uԩm2YrڴsE붸|q?"~W;®ݸp]<`u8snk:g5K8)#g]I<eȸ¢i8':wq#6ùo o .2&.ib;k$1z%"F⵳E$Ԁȣ~5; =1um,.B.`ܼ֘9d3Ř$ف"v!X&&F 6cff3 6$ͫ\}{ k `k 8bSX,>Lp=Ȗ+(+z)AK@S!A$ܹsoPƤ@.[@pjO1{--8*/rٌƤ믟~䑥ЏW]5O*X|!YvD Չ -bzdDb ~uA{uo2~b8al{i+km=^"㮀5 8@r-ʌ9eF2fkF v#84 6lQ1@۾ ^0@wKufU{=Lꏻg*RƵvnS^1_R]hYJpc:\·J,z oz%ɲ `:j$Uw~0kwe Ƴ KќC/mXy/Q.*1 [/xZp*3PSl1ў ^d4 Kc_9ml%1#cJAFUGN=r 'q-nY~h^!"6@Ł;b)S}i w[6|h)d sуF# Ghd2"-I d2"(;PP</$*EFǯO]1nDT-sk%7Vnt#1P T;p:rȆ [W2`;`\Hl≭sפ0,EaXS }YlavTa `ŵ3 D~r\13e@?YDQZMPZ a h&AvxhU 5/ j׌JӔ5pڷo߇?l\@x=4Xd׮c`ι֛.^.troSdžhH 58T1 c 9'v zp3Զx zcjtS Sj-V TfU@)d "?@8疫@V!ن s><2 (?lT1dՍ P)_n3hs2Eځ8k&l[nL:! =੩YUaٹn~f 厊<!pT^5h. 5@RGv* *}E5 DoQQ lMƏ{0Џg-{b;]()MBiH*rg2J]{@#*F[2/&H@KB1P Z1;v㎭1Mيr߈b3Шq4 ..Wzp`M:6W13%g # x1P.yb D:v%@{“@eyc~\P e5@UKSڢ<ވb0PvkňN^#<SKڮ%g לf!7^-Bӄ؁,N1c{"Gmuvʒŷ.Əfzsڱ㛭g8ƔZv0/eV pBd FS*d؊"K%Cw<8_#_zꩧ?Oz O_՝Fʍ/a0hq5ӗ]vl[?SSS/իWcJڳU f͚qukňN=c$mC4cs9c>/Y, ځ e|x 샊"~] Vu!LG-_W慡.ػ@*AQu;˜,#*` wCS;fE)QA!v+^u(3cvl,'b]16}y[LxqPviB1Ө7܅\% >̍uIB?h} O ͹ovJeG 2(1>Ĉ҉;)-Avt/62 ri3ܔ.YFk= wb ݭrp/6s)_BQV_X$0{Z\\4Wրv#@ޮvq+;ہڡk~u z@T"Q AYY#;;_ dǏ+[oM02@Ƌ+>i j]'e7}cB 21?EW\AɰeG`ɐ3uʺbmj)(!%a{M_XvgxAjx ۆ_hÃƯ8߸q'j@WmJUsVWFpb -I26뙈4w!Jh2+6pZH/ 22/"s՚h?v1P[ dla aD^F(YĝP$Kl P\O\.b,Å~ܔbfk nܐ2B# a9i`!qx!=y E~ df"*T̞6iIXWv )Fi^`4WrB~fsr Ablul;0^R#1P=  1va@.+PY,ָ r&Z Jϲ^@bQEac*x̱e_4/sEN.0#Ȁ)ی~׻CSŤLC _qHJن41>1kvB-j[X,~ܭ[X:@OT@.a 4K6bfZn dL w'CӑO@6T翙G *c6!v fwz?_Z="!;VQ2ϳ"Ⱦn'OSPEH¢4@7rCjlc ET ܞpꦓf8aie 0w' }a@'%rKu'NLcb c^-"]= sYb  @ЀNp}zP5(lS#Na 3P@H\KF"Ȳ{S]@0Jݵ 8'a 7pcӸ`ӓc@4Ā0_eL mBuFUЄ˜ )#2M $"_F4!=7ç8 ]cS"/ra*pXڭa^]@Y&sW=e-.?n@?wH2Bk&Y [Q T74Su"!;vd 9 Wu\sd y^gu4,yzHM7m IMsEp.~f #on7q1ہY@@."ىDJرmn_iIڐܔ#+gLP>s܆ ) 󸇻hpyrCA!7-@/ HhN1* '\G%yyC&^k$two^hnmU;-"b˂p鐌b6G˟|lAjKEÀt[0vP(W[@0p M_'уńB" j8qW"{Y3Ҽ0 ҃r"D 3F,ȌI c'ċ*8L@;"qwcH( y zpwc ` C0 2X&1ĭ:71'˶WXk}(z ۆ\.aGO?pjJLbGyv X6T^1eBaJB{緇0>' %Yc @ỹyanQUzX}^ [dSr՟f,"*1I"Ma1% mMyf4 >5nfv \AiWԳa[xV"ĪT-}axܹ{۶ЏզxFlFXbfЪO D i\Z &3ol+uEKg1xjK\XC& vsqF؁U)Z`0 m7Sc w w⑅\lS'c <2vQ$zXLSn]6"G$H $c#! mϤ}eJ/4 F Fb.s~qX|~_^UGc F1l(] \)#w'*U` LnZ3&hiikE>!X-T̕WN%M(2lA@,Hh!టbɐ)qg—*d~|=¼r ~饗j 5,0Av `gMa`t̜c@W$I KF0 %™*B6%mCc[)&;Pa $DGxr]ZID r/ޕwPw W5eH6\AlVô;;K,P $* -@à&@4W+@¯%7WWрzOMC /fzcw8J@-Y`%E%2A. +R=);nذȑ#M"K@b!Na@f  ie V F#$kEOclD)-DUz]XXظthp'ha&T47=Cv^7>R(_Y /r2~a>0N8^fyy994YH TCK :Ѵ3*N$X@46$^!&\5㯤Q d,j ./u9`TJ5v8A > ӢC!v!qWpmYQ]׮ {WufCmm Оa `# -9y5ٙ#( rk('5pL.d"HW8\1!`(u|F\D1ɮrc-˿|7@kف)1PpJ 4Dj0_ ClpS F0,=nW2AP<rˎ}`H;] @bI3M0@|5ƯD_;oh!q_9ҐfH<D'9јĭ[ rf + ف$@b{yC]Bppc1 ab gi,tu dC"zpX2.Vf3JPƱ}¨'%f EX`-4$ف읍HĻC'`04O8E]frkWl"=N=;-/!u}0šAE $E $(ĉ7P ,4V"l5o)l@( 4S(';PT52/hr(g|Syf0 kHb%BD1P-b 1@Q@@xuv.ݢYnib=XZfG5U (UrdrMǏGKB`f}+V={fF !da3~vXhCKu6 Y![t%h to>{+|jNwj꟯:O-:*֌MHv .lڔ`6`M6`0luX?+SN10h~6rG@Q3>H T2#>4 "w|D CREWYv1?j +O^]tˌTfC<$8fkּ طo= F T';P36:jQLᐷ]1?.9APH xs.3R Ey𙙹l怃 >H"LOyI$8z@-bO}w8V=B<;1]TyM[՞-υwԬh: oE&$n5pR+uG2c wZ@1Wn%(']c}C/rcՍȑ# * f}= i jۼV "JbV!)K yҥJT) jU@ $E>6o ZzulK)@TQk<iG%W H @RbdbT^) *+ kqB kL1Pk)(@b 15TYFeR R1P_cUZ@՞>Y#LAՔT.) "@E@՞>Y#LAՔT.) "U|85k0ξ񙞞La7>B"H $** б\XR ~"Qv) @5@TQkU{舁"uSv) R) I "CE R@ D* kqB kL1PG )K)H $** |"Tv) "U|5flPEU@ E R@ D* I ">bH] HH@5Na) |"Tv) "@E@O1P.@bƌ ">bH] HH@b )PQ1PG )K) 51@O1P.@b 1(#P٥T`?x'Wx=gϞ8b!.ڠ*<ėRwomuwr)VDXYYk 0Uiu}~)u@]IFć~oI6BuwV1PgN =Q@ ԓH7^{53{P.HN+ R :|xiizU]?c )]@ɷ\1ѓ.@ Sۥ@a)E@]5Y I1PFS}]R@ ԥR[@qT')@]%Q Y1PG)&n]I+ jbMZ&(R <hb6&h>J6* j㨨MR`H 4hb6"hZ#1,G 4qW@{g,גưu|@1P AMV@ 4WMP|U-6R`2 &jR @+kE( xu) @6B14[ ԒP3` vt\v"1Ѐ_]P@ ԊaP# pe)*@5F HBھ} cǎ HuU H5t@}4lٲj*кup͵L5I)0 @zzztJ ghd.M) jJ>֣>js}*)OGLvFE5I!) hRM 0|a R@ U@ VO&@! t'xBI)PF1P+pܹÇ/--I)PAB bO*E H)0F1n (&vFCb ЃH SfR@ H ҤU`д%BeU:) KR@ $Ub D,f&8HQ&,*` fkbku@E4hbVKG%@b%h0CJ) jـ9R`p 7hb !hCK + z)0x@")oFԑR@ 4{[ +cu* ;Pl) kR@ ԡUU µRJ) R* JʒRb) kp!*HH *,R@ $T@ P yʩ¤(d` !F1Pz+@bx UUUQMyH(*I H2 ʨR@ W@ ^ᔨ3uT T*S Hp@Z)buO( QOyW@ pKPLp>E@)TTR@ TW@ T];R F1Pz+@bx UUUQMyH(+ܹs^ZZ^ "P@ !*&z@b(Y Hh@) *) $2I)L1P2)UKH(*P H @A2)) M r](R @1PHJ2B1n@1) 5T R@ TQ@ TE5R btZ$) ( *J)^1PzMU! BTR) S@ T/Yk$NuU 5RQ 5,@@DS) * J(Rbb)5( AT)@bD H(n~CTP{֡UU µRJ_D랈Q@ J)(^ ;p>E@)TTR@ TW@ T];R F1Pz+@bx UUUQMyH(+I oSX RM%@y@5v裏>|3???;;;77ǯ:uj%KIA1P ȗ^zC}ܵk>}R1PJ5Ul9\SYd}QZ1PiɔA H 9d $#`?YG@ɤTAR@ TR@ TIgʚ 4bҒ)I%sH-..4OW1PzMUeQKiHg>MMQY1PeQ H$ 8Bh R$@?bh UQ xf 4۠r@SF) ( J"c 9pͳTXѦMϜ9.ؚw_jڵSj3Qpԯz͎G=ђVOMM\T?jW_՗W`VP|) Q@ѹZ@=|-9r hQ!Vh}QbRwB=_GGzx;$}p1P;wB $P@ @ĶNQgV~"\m=b 1P?dB 41 DLMb 1`nvuT Q@ FVr}oeJtzc@bjhX1PÂ7Q]gw{FsbZ~5l=:%iUb_K` `#,pÌ̧ @+X$JuǪ)0q@ 0_LsSbj s}`B!CccUbAtA3Uc 7O T9R ?F[-Ҝ<"(۶yفRݖ*G Y1PGb:@3_qq61P$%'UhbPu4g`;y@1 D=((FUv)@d-.i|M *ėQ `\wݖ{DIs+*bTvv4gHbXh^XP@ukZuҜa$ cӦT&T.)-@4g>heJa*KNps*hbvKT@3_&,TK/*{g*hbM4gM 4esJݖJ,ڬͣSm=c ͙@eiZz1P dR ?F[6ꪩkgfc.[}+++L1P5)K 4Rhp@uX.LbD7W@ 41Hނ1zի׈-bjLS6(#KJI) 5+Q-*K3ҋZ@Mӫ@ Ӊ'6lp I†q IVXNL:  !L _1PǨt @%+ɓ֭û'%֘<\2Yc (_q:;")oy&H'Ԏ+^Xq !ww~ezmVbob-U@ Ԭލ&U@ E~HBx سɶm{%G_mvkY85 V@RRI@MP]bZ޲e˞ ف3$K<`^]"SAuX4YrA %0ʈ~h/_*\ 4IK Ԁа YO{xA-ܔTmJ,3g ]bzzy}~!x$jߗ( jFFk5 (,@ @ "!TH(( [ӟ' 8֬Y@͐9B $P@ @ĶWR4h鹁yPj"V"1PPp27IGK6s)gu֘v@Hl-H㓻5}:@0`R@FFd7rWۥZAH Ç4T@= dL xۣ=M~4)fZn8~ nMqnl@H#02z@,@B^us[Mui z8exs1oxԜY=Hod#dd!,~1c&Е<@b;@ &':&$.1P᭨R+ 2R%YH*tQ?^ )4 C"`]o)dj]FIe KAbO%RQ@ ۡC:1 4 健',=OHoiO2[QZ@X/1xl2|B22XdCS]b|52qa:\Zd{r, `e98d!4b2V2U;7 j`hrM>Vkyj@=|hKCU@ Ñg NrHtCa!p;" 'W@9LJp]DQ,ˆZ@.DXsPWWMJ(]_aQLtxu1Pp XJ _0e "j'5#k. X1PV1e9M,2q1z&,|a=|hKCU@ Ñm7de 6)b>+ե+ -P7b刁@ ;T';PPp@=Ԁ.MdIc-܌J"TbRr& 柌:"@= xoYoT6=s 4x~/_17H ~(P@ ۠lOeX\d :+H@PZdCS]b|<핽cui{@H $K]S@ 49k9lTr`14\ =`p 5dyńxy݊H $p+3"bI'#t:_#$ƚѮM|aHȅνTb 1,uI LN1䴯 Dm[S{oܓ@2q;*J_hQ $PR` z8 H]/@4cWفoD k)@-ͨ@~. SDAB1/L w K015b1(Q^)0@@=@"y`܏=ĽNB_a!TVċ,@H y )bx!1 =lfl3PK`u8q6`apтP G%R%)09@Ӿ3]Wnh Kb 1dž CT@ QO@ v`S@=|`KR`r &}m5@ɁBb 1dž CT@ QpPya D tC1P7ƩT+@Mb177:"Q@ Ԍ΍"jTT&fTC@7ucJR TJ$zs3#R@h-bFnMeb 1PknF5D tC1P7ƩT+@Mb177:"Q@ Ԍ΍"jTT&fTC@7ucJkfnag_\JA%];355V47~P~+ N񳸸JץSNq[קtbIR@ HI) W H) bIR@ HI) W H) bIR@ HI) W H) bIR@ HI) W H) bIR@ HI) W +p'Ooq^xWG{OƜ;wN2(J#&hv)0N 6`w* Ml߾=&Wk *ub8¶] ٲeKaQ 8"Ah6fIr;Q H@!*)I'xυEr J"3.P}Eu8vU F1`ZcoܬiWQ6 fbQ#'f㷢#)ւ!@od |uXֶ\uWQ*֘+elǎ3$B]7,h@vNhfЭ Ns$$ م%zsp_*X?^iOnsd?YbJ2[biek*|ae2E, _\s1nّ]ƯH`nE5X R1P/UY+X__i;&ZS4TE77 t y 1#j7庁OPbpy`MP (ƔκiJ!Nh-A@=GnZ1PW d/Zmsi_{{0NYB/4skKձdQ;^pA`E.ܔu:”(2PƄTQR@ 4U@/ r~Fdhr}g4ې\N6#'l<ےm0 ~'(LD^3`j +zG~UcR`r &jE 3JaifEO}F1 Dxr?fXNF_g a ,FGTtw)@$5q 30œ;8Ϛ̺B/̍or}aHIx"C2Q 6j=c b +Z5܀ڠ`pg/&_ͰnVp@d s.w-FHqU2oS7` f*@Tml;'C Nh 2ֱܙl*?(֝6Vx"N2'-ƦwsFP!Wo@4nQ4) S@ T*Y *F_͡1+ _qݸ1Ѵ0빱EeQK WJg-Ҝ j&bE>7vԕ_ H5R@ H) ڤMH) M) jJi#R@ I1PFCmR@ H) R@ ԔҪG H) hz[_6IENDB`PK;7:**-Pictures/100000000000027D000000CDD6F94B42.pngPNG  IHDR}BDQsRGBgAMA a cHRMz&u0`:pQ<*IDATx^{-U}A Ar)K$BB%/GꍢMV X 殹k0wr߶ϕ X+4]sܵV Xr noҞ:}>V X 殹k0wr߶ϕ X+4]sܵV Xr noҞ:}>V X 殹k0wr߶ϕ X+4]sܵV Xr noҞ:}>V X 殹k0wr߶ϕ X+4]sܵV Xr noҞ:}>V X 殹k0wr߶ϕ1W=oWv@?]sܭKSNx=u[=o\V5w뢎yp_n}o8]J0w]s.޸UFs7r n]mo U5wݺ0wy]s.7w]*`n] q殹[u|ϛy0w]s.]sw^vsܭ:]sw 殹[殹;/u\kE殹`^]sܭKsܝ:5w뢎ys]0殹k֥kKnuQk.Ws5wR5w祎k7wݺ{5w}̫ku)`Rǵn]=?/;]G^ySJ(`n] ]p% S9*0r1#^f(~$n'z|-.Y~ 殹[cq0SB$#6ƥ#w^9wXEjK&7~$G _r4Jsީ~}wo+\)`uQ;<ޱKp4$n#Ib:ZLġ8.XortE߹$*+/=s=O=xiV`殹k֥XA26FxkyC]ĥa+Gێ};q19zv- n]mDW wIƆ8BmG8sn ,渤߅Ex9G µsn4JMܕCe7f:IU.'~8sn4y,0wajs\Y7׻]wE[џ "]^Lw[)]V-.;nWkVxù(1G6ƙAqqHd[Ŗe/ezYP3Kn8}=}ǽP}[_W en] by9 6,wenq Z^5Gz Oj TۅGWؽ5wNmS#q  ܥ卿W_a:ۍe뉹[-M_w+}Xѵ ݩz9ǤJ̣ʀ1py܍5w殹(3;J%wo~ۅ!^_;xzg88p%=3IƃvɈ+a7w]s_21|9 \q9*C\sќMq=tɈ4O>d;{?r~‹/ɷGNӢ׿MsIL*;wy3~7} @gxVL+^..yفMܶ-u(O<%G?d'9Sp/?o_w}?5wݞ l4'ަV:Hu\f[ nOt1S!d钆ݯd7MNs6w&.wkn B&6w+.~/gֲSj`n~ܝ.l݄n(~߭;pC݉b}ORWcU8sw6G}ɧq-.D5;WƓfDI{8;ǜٹS@nOb )?$̏ZJo41gsn*~w ]smnՇ621.󧏍eF6,GjpwĘkN^<3M1 Mbgsy{^xnK.^G+C W6ys,%$0(E3&.3.G~sqWڱ}w R;lM^sd _!2yX0#*ΜdQ433cwFg^wq$ثֆ#f݄l块$XH+^=HICD&1D22劶Xܝ(36.T-^-zեg+vP({)=x=߽7)$Z qrJHxJŘڥ"swq݄C"y]_yw*3|"ADr^& J˔r11n\8;/(Th.`"l;4!P{E8^I ̘TbyƔ]XX2㸫W7sީGqհKnN0 kؾDV-X@6/p+@t6rSऑ"JK+WčSB.n:Ɉ^eGzݝo|o޿oҸKL7Td-m;w )z,nnaܪ:̖`Q9i FFU8ݬ/ߝPx x}"wq_#ԱuS. :b'i%" ܞWyչ/[9$if5w]ݒMs:xOv"q<ʐ26!Y牜ѻ F7dd$ wc/Illn_EnY~Up-vT?;(gRFNQ;Ki7XTÿtƎQؓw8OJB8KOKFk0wKaBqPҾSlGssbtr=c(n?8[38^'qN1:pl`vjX;*&W)l[r ԅﭡX@sw {jξDXn+FXvbh -܍,GJ`UxUH@ucŪRp *jgаP¡NŠ3GƖI׎qfP-J|MmRQk-[1V*ΙWDo2f='hP#K43ጒX_9HJÞ{)8Fapm8/;tR>b'Ih#s2c91rLPLB2T@ZCž-=I>P\Oݡ!S>0wYfކ([?Q"ju[Pd%UZLN)=.)\/#w5}U+ ׫%Qvr+ԈZʗgO`es4j5|UZ%=GIw3*0:wIAFC ^#S1ew H3<\Z7_9FQSJMZfG""ùŞ$4$Ae~X,4(Jײ:eJkY-N 4Jf]Y%^Q=Nw LG6ƙ6`2q].YGc9ifaZ>M)s]{dy̜|1Μp>RJtQ# 'A]T T;-KOd8!}X&dYYYI$؝dmdpBHG&kyY[#wsv[r7yD ]d4w۹ oJ21Uo1K.woLF6r6r%odvB-նN­b'܏˹>S\=1Y)Zak[!(uTMLTć{ixqqf"3.Ga cԪHH] ^B-1i-ֹTm1A4F5qAQ%sеR`" ]~W\@ L4jL+(׈E.mwQ9$`A՘6_Ho&k]Ƅ㰟 ,|%Gc!1άHIx%E3KrV@t wթJ0V*"q 8Uz=,RIJWЄYJ479hyHV&r[3W$l9b g*0"w*%N8!A둹'٣Xq!NIorJ<ѧsi}L6*k;#8$Y {5s L\53]69%T4&UE:-qW"%ymZlM_X&ccɭ82ݖy{1V=W{J FZپ]bsH ^$8=-=ğ(˒[X3wg f+.ݸ^} 5s>&UrQG#ӺKC̥'2r7!܍D/l.T5wM-ç23w,\/˛L^'X{N1%VŦ'8c΍Lrk,Iɓ7Iο$nUkNGulek~6cB\/!qsLJ6I^<UcEy=fa͆Y@TjtWg*k}70@(\#&NXZj4U S)UI )FǸ:'fd 5w#ӺK6wWI2UhnKn#ī%b;IJW#&9팭4;Zq^b0fU gm,~g'&Uό@Ó~s1b6nDr,LESq7F`a;ncr3~w8+.u+.xiu+@oQ /Btm,]%\⸛RW7EPJqR0OMReU%5i~w8RB{ S\8<6>?stZ,jl@eM4M.ņ$=OlS] Fbx^ݖ3C֜m*X]ZUPlyF;.ww lUQ-wV.P'&`Qo%r1ƫ\>1ysj3?Oas VY"VOW]Db m&gg׾qDS\Ώt[zHCZ$MʐC& ]-ʋ|}"$bjX}{)71?KřasUQjB\)'P9r7R.7bHV-ȥ$%:E'Fy"ؚMF$wS4s87ΰ1&#QZ殹۽()q+MeSѓYMbʈ9Ycnw2M3҉ԨqUm.ؙDT.qR~4ù 羈u%)_q rM{b!.G.jX 05;(P61n@T>1ѲKOɡQMPL-6Yc([2%dcbM^zo?Q>0_sݒ^JZ@7RZcy޽'bC% R@sU9p] Xb;NiV91U~U1,3kvVPn @4s͊9*IGj]J=f!ۛ:X?s$8K]sr$ɼ$M7 f9u 0Fif0wł[`殹[RMg4wWaN;}Qqc2wV U=fz~恏殹;lZzKNY}nh Kng]swAeH9n-ù;qc^D sQ*WdCNrblBw&.oG{ns &Q@|?xZ9T~w8pw\.(ԃ7Utgj튤9QfdJ7r סOK<^+璙}(ڎ=hRH+tpMRQ1J9d5TMν9khWt&OcMq]zj@cL_y#>g5g=ۖHiT{Ub$n.S[ 3zAV SVŹ:XE[SQLwHK 4^;O>U%漩4H:3X*$SQ1UZlٯ*ׯ_{볳ڤرesμ?}CLUX  O<6\5WK4$&F%*{R&)$f*R4QMk'Q)b"-V`prNꛤLM՚7ok׮"zWtllt\k[ŎOZ>NP"B믗ZҭNE!JQnl~{%heIkAh'7NX^g*XGd<^lu׮}Zyy!ǝ;/ޭys2on^ɱnl7*1gj%HLJJLUԡվWe2Xb"YT7on/ qɱn,>`\C*[@3ۢ'h@`*c4&WA1Kވzhg1f߅E{t뻻vu\z֭[ V3`x3% .PO*zL%Xrg͠,5ٹz6@9SXG韾;__5lUQ3#m伱b/}0 ;'m$nw6Tu<0}v/+ 8S`*}ҥ^x|~h'WCdAy 1WUtleeN@eLm= N&[vUf]["L~ᖥ) =ahaxD[e6_ 0UBL]Ӳm8f;Swl|Ԟ?HLltNJ05 g6P^5S0 +UDG9PEBު^%PUM2+*+[m}h1( Wg3\)Nzk֦GªPeU[r^4v =TSW7箤9[SQ3Zr5&OKpfFcFh"Bݗ +\b6 ||!GajlV/DX}6iz6v I=l(G-͏ c T,>bG$ݴg>4|Qr/i4c.']Ѽ[k^LYW۔&e1d_k냮{egH<W9 OL+QJeQ[1WL>dTPX"0 ҕ&iH/8Rf6TZt~ T&*ĆSEZ`e{1F"Kߣ C2'MR짅dS9 %%I!:xE82a8Ta#eFž`%Uŕ7v8 n ϟ>`o6|j֡fUnmU'a 5kwVD婬t;P)1_ͣʾ)(hmleKIh\~eIlx[Ṣ<*d+{ULm7 ADV,6Sx,b_*G)Lt1_Z:Ys-O, TZr&$Lu. JzF^*@!G|"v^Sdz0*p4|=yԆVTT3 R9S[bR/Sq bWX|T"(]g0S)`RcG- Wߙ̻&.O@FC9K%f@`ݬ)X)j"T͹]Beի<[۹%АB8q&}W{g3ٶbAeqnn^Lh`z:W,ٿx ix+DQ|CS*3ՙZA3YF-ںO7Y VTg`WtPorÂYjV.2p:S˴[I{~ Ono?J1fcc?ڙsER!Z>j z.CF{ceK[lF^g hԖ6LmOk'))$S/?*<.\8w/|󛟝ҥ)W>13e (8v6a՟D---~ VAcX1TGoI]][[{cwc*I*S!G?!k%r#9IIdRUV;g'P,j>&RڄXɣKK,%'mjA_ANjmJ7"Mx]nFӘ iL1:E?W=*șڛv^YE D-112}aW#_p@UR)ptdWQ b wxje3_X,϶a*_]Z٣:%tRo||*%_-,∘-pe"Kr#ʹww`G'~-b_)ʖ0oԒbp+P$K (! 9/xN~7Wۂ"xz p*`Il O,E;_vCױ3\aʽIzYIXh"ee|S J&+i w7M-7sM'~-SzR3:Pǒ,S $DLOL< Yo$ZXZ3j[)mcj]l@Mebn%Kq K,N@a'NqpT{33(+QRt̓MdU۩{Nq1_}%A9̤ۻTQfE}4~iL Ehs=gZ<(Z=LJ#D9å27IFgsoK:/J r'?:h>|_4E9kh]?8&8Sp SoƍORmUhM" bC=WjI yk?2j0W),gj!-(Y35e/Ԭ*#qwuNH=::"x!T 5/SmQ)Np#UP2^)&n3fj$ؚm҉@A Jo ] mbևRc3LE/2U!/}(ltxn7׮I?dO^?;J3GN(~}ᇽZDVﷺ@jm(j"FlD1m mH66]+FаO_Lmh|WL]?+Ӿob=bP뫫0,2J;{olm==cI"r6GWҗD_s{.F3r;ќ/2JYD,,WjT.wpLf_f{8SL9R kairwP(J/ *d VTL}#9U\-d0]Muڍ6+<tUPkk(n1oٙZM.rA4¶iCM+Pߵj$_r5ڊw_zw._2s0ԜL_ʘj7T:fhZ󥄾_-mk/JinVR3B,5@>dRN~ؒ.bҥrr?+|bfbP 9LY_=C(Hc%͡mJizo.+Q?SC Q9O8S˜5֔Mcl&qNSUT*ȑ13vo5!M4.icKs{kFvᅼԻz~řx7?ˍ.5trU<И:MMM| 43*""l6}hw:n̓yRԜ_ʘjɍFu$FE=ɥc֬b#9%Oi68ax^#jB|9SCf]XW5 SS{s$SȥӘmC}O:ogU|`ݙ?XQLUsT4 Tk2Fb*Z-ER3]7X񨇫.BI Nb40L2C<_ڧdTUo|3|Wb`ȊvT9`=̩Ep#iHiGD(SjENT_yeWJ#F^io&Si̋飯-Т }!2X< S3%gj?dԞ2u٭E"k3U5e_r&qMnSf TVDmd4Y `!㸖lna l:S˜u~43ՙ:ic~c b fjpS( f}ڬiֆ EkbB/EnT6SUϦ MLɘ%s~43ՙ:imxo$Wک2OKK_C8I q ˔vJJqNG%׈Er-rn.%}šTk יSbή3ՙJ993[__Vo޼㑽OLQę:>=MLuNmlu4 l^ogjpX;S{Jr:S[ Ry/`ItZgjN ۙZ :3u6|z™L6IۼGq;v_(>!34U H3 tv_G<# 発 z)V^b"dLSO=K%PX¢ۍɈ<5t:SOGϨ洈q:Sg6O_tdTgU$Lts7"əs %k\A7wK~ 8Sq[K(Lu9suXt٨CVa}vv_[9vwl2bPLbr]"7}$Bddeftllt\beOZnRNisgXwݒq`'o/LuvC7.ڵkXb' yt+To_w]c-=88B ,|ve-@s%:yڔp@,\xnq؎#t{X g nm=-N&c:1LbHJ xj~o΀ZWu޾ GAa{vƍߢs!K)h!t;SD$ ɿvk5|E2;FNcw N],k>?NPS 1;%Zt֙:%*"i#YtFpA42`$Eyb; :zVww|AIb(X葝 JKA{1Pkxƍk~Z>u77F;SG$Nf(  B0]xr8ksVVC,yi\ؘL?dt u<7OXGD\,GȜ;8+gs/qxx؉]yb@zE.vS~N}Ij#3Έ曻uU9p犠8OyIsÝZi Ӫ|/8N;"$eh1X?X loQ@&d rN>z$ܹ"(}Jj홸:-T}@;jm瞹$p̞~,F 0r(bANLo,qȺՇK;?RgCSJ>б O o<os6wUSUr6=fjdD]S橌\}9̰}*u= KK' U1#O?q:S˴l|rRaJ0-f ±vئ1O>G9LS="ETgjE@iT0$ E܅TŐY9jLaBPVyf0fɳ EȄ4wcیS="̋5 8S~.P0 Kr.π(kԐVJ&o![BpnM0f {RCt S="ɡX2m)QV?ɡQddFs}I&3SS[ [ŝ`G$y2J2HU08d1}/쇣Ve~SἝ \z\9̤ۋ٩TFޤaT;J43\*kziy<; `@x43[XVQae*->j8]h2/6h:vi +՟|JySir /uf3#+$SQ1UZlٯ*Hڍ6Kˎ$EVcN^;SFɑ1x.*3+sVTe7(wyI.K)Cߧ1U'8Cߣhֹ~hL4FPN'Sa\iTo|x!eS!lhdFy.R$?sYr8V<0O%Zp7C]L5W>S#PqSL51/0q4f軞 ׽Qؿ35u|I`MF'e]W''%sPv6]N^RdZnyi,7W1Jh"Ůj:f|eVqPCvҘXw7ؾnXcLU􊘪ՋBTy׬9P%} 7f( }U(93d;|"@(TvS20$)Q>~kc#]"쒥׹˰ޥUִC4MةyUjCRmyjb^6..0lQ{H,BcuoI3' z:c i\H5SO( D%ч6vVv]}RyHlT کSA~"_3bB6҆i)o"=#1)NZi$N"*--:3atߍ4j}U`wůG1Jh*qmX)u)BUs] VUQDd%N5p/WL*UR7kʨ^%qpT( wnI}*y3]VRߝLgf}R()HiVdds׌Q429pSG@dT%St eo[e;sss_d^:[0igyz[\2>OD.ZfnY˯g*x7Ggmw|Waz~Ҥ|Y˯gzi^z>KX| F Jh) 짜"k0֖混N=@?,.c;ZX3rF6_ns m3HG#_ ի9cyEaLzƣ!v;5=<;{VFZJ{i5Cpo2e]-f˲vPA-ӗDDSҤyuHOohc(̳NBƟFIzDl,yu9z?v#yٙ#c,^朗QrrOɍ";bI\=X#r#B/ ync7 MFZJ{i5V1c` #0Vб %7{!WpEhX<=cK1cH1C4WM/oFUt;U,Bg?z#b1iToiF_D|0{?,ԡj8 *AԹVt!z),ZUO ' /2\*[XLjDZ'>9 Vb`FCGYv Pg2fS=ps }`x+IQx$̦Ie sĹ3Q}Y?d01@1d%N5Z²YJ?CSI*Bf@e*xTR AN꫑9֟tƜT=p^04c+ToN-ǪS4+7Ɇ(@6(bߌ #rRg!TIql\+FkX*-}X. yÔ!V:~ɗ*DcY](̦1kH,rJOaCVsfdLn}BdP=wP7Tx ]*n* mfjg, gB3 W*( HlS@a@:+_Vv qIW:cc m͟ V|+:y_*عC[_?XzoM?tƜ:/ glaXxpRsmKF?ݎjyM? m'e{Gvw_s*2zE1V02`sS* nz_{kc5_XʗmB mقX38): 5 ?Cf<;] [8Α_{0pH9$OR^W_^-,}{{8õn݊LEv #(a,r$^d3ϘC~ Vj<=m}E_t.Oef ݟ>!H a,S$3_ً~Jxxw!BX.@P+&z3P }Z?2p01\>l\BL("a'9LOx4|2f!vp!CBn8Essam4ZBl к<76(QE>Ԋ̝V)cȚdMS~"vLCo)r2j.?:d6d(Φd=<c3 Q2lnn"n> к>ZDm并 D S{ ]F<@a4|&0S掊%[ `K,59"Bg5>ctO~*DqLXRf-ndD6)LL%efKJWDИC(d ăWFK<41SY'\U&?++w i4 d[Q $_ymQEM"VT}*M1̸H1QgЎPd኱1pB|0OIS cNEU:5@H*7]ԎtoC)q#i3!EVNev*>*bLaC ="1g%ccsZ[DH֩*B/C30p*bmh`O7lV6 U1z^{Qpƪ` w]NgwIGԣhU㱟j i)=lz cNnʬEըæzoi⊼z4 f@@ބ3{ #c  !0@|k˸D/`4$@H8+[Uϔ$cPi xfVN-]yXE31 My/F?A|)ܳ}MZDhmwX sssAAy iSEymNi)մl3 Bq8韔؜QhG ~i?0V[?/ȁ~]5<l&nx1kc%6Ƨ&33H7qn߮O9AK<|/~k*c5yRSlw/_Sj S7i++Gm7薧zhӞ{ދ95!o.,cМ=$MƊS1ݹVswǧzy^cck}9V7X8qFjssw P7QGI7:yLQ^t=PcXe; |r'X1M֖zX2A HGAc/8͵ӗ\X\tUՙAO~> UQ1(lx, - ]-2#ƒa%"ca^ԋ Pwه(vVǀQH(Mݵɸ-6h@Q^')MOCΦ|.Ք d^*LA7_ *R߈d#Q nާ/zt;z/Zb@v2HKi/-乨3Vqy~(co]qV 澯 >-H1qld>ȧ>{:Pf]Ja f *d: MQgZF&ͰpR׊K(O@"6$%Qcq \2yK;?Er-ۡO'a:fu t.Xc.J-}fU7:c :c5xm7F(vƜ(Q7""od[k1gQҮSe~#GzPk9cumHNcsU02nsj&fVwuWȘ2gkTkEʔ9cX̺0,˜L35S׵51Ve_1eΘ3V6"> xΘ3pi׵x7ot;tH٢l(>tYS0C 5r#$G43(6)T+NVgl&H ]bI`*+C?% TIc6MoCꛍ1 AY]W $R2BD`XN 8}xp%E2h2F&~s_!*w51^!zu % `2Sl|" I9Y+Kʺ̰%xR2htdR#C!xtV[9ΙEqP (;h-,$H5DfJ4H6" EE xƀC`Ҿ*Ҩ 5 GS1CczUs.1f.˦ cr,RB/4Y"XRBƄ RF2'nǚ#41U21#<@IF\2:],a kaf0o/2ւij&Wm,cz|dGWzmcxya@e(O@f| G0X%lWs$GQb|=܎5YڵXZxN\g,5Yڵ3F3ZgQiצYΘ3V1hE1glF]f9cXm8qƜvm9cVsfTڵi3F3ZgQiצYΘ3V1hEŃMdz0zoVE=i?JV9:Z 8X"*Xz[W = wیmz_?N3_~NWnl++_DyWíOȑ;z&HGhm`{{(XlUyOdo4ޠJz]>B"VkX9rTl <&g{{H zBTsO߹n,pD1 =ytJ ᰋĵi˃ DU YYu(y||X Ei3.r|Z>X$ooe7 SJIENDB`PK;71 -Pictures/10000000000003020000023B3B04764A.pngPNG  IHDR;ܻ>sRGBgAMA a cHRMz&u0`:pQ<IDATx^meY1nxB04v;Nwp*2u!AtA0pMD0Q42"N1V :`15(>%tTU["#GgTpԟpKO^{z巵h_{﹮o?B@@@* (((+T-+gnPPPn:PPPP֩] ,O>o<ׯkÉ`Uc/UEiz+z(PP)kЙ3gۮ3ǡWӗ5Hf*0… +(4Ӥp@@)@ 8j[YJp+h/.ѹSB%;c*yY\MD/@@NbRp&^J&qm a% e|si[V!z6T_Xt.i|;Ӹ,?-NG.>Gv|V S%것/Cp?JF@X Clmv<%#` *(>Չɐ.sc]jF׮.U|ȬP1jvX}l+N~E9jh_}jD@@ebPdFQ ~%i.a VEa7oXAx\FWWTO)}}) &A2e[N7CdXpA>((W`]$e)ΦbCG U ,Q~1yP rk&g9*9@;ݗa.3(Y8c((kS`EE46K( C~۲S 9errpf =*m%kA/zA&dkrJu#GdAkY_@+ =Ípd%6SIS;i@ *!O9 ~+N17I C)fj)m}D$sg.< @A L(4 9~}^bI6T1ByUWE1&[i5LcL^wǚ=綹񱺏?uXK:eٷi1یBѶؠ\Z[# 01ϼ+P-UQuȮI;7&+q\Qnd|ԤA@@X) -L˷ơX ՜g4i6 N(70"XyEnPVvW$A@@*n@@@ A$; \h7 @GPPP` As}rPPP`PGɎ(((0W>9ڍ(((Q0dG@@`\F@@[> 4TػꫯvPP tk{O9PROjzPP`-:>dG@+2x Ah tT P`Pއ((ppC"^ Ah tT P`Pއ((ppC^f/R0 @@ A` T Pr\yK0 @@ A` T Prl@E*((Q0 B A{ Z4opS{)((Q0 B A{ Z{ HH_4P:*A(R0cCv@8`P!p nj/_4P:*A(R0cCv@8`P!p/t @G 0Z*u}Ȏ(W }߽T5\p?/?` `/(ϼ:1L>AG*.(| A{ 6ht2ZEiؠ Ah tT`p mˣht"LS:yAþ C')οW W?50cCv@8c 9.ɺ f +jޤ.QK_cPNuzcھ :xEPPc`H諿`1۬AHGt0d:QyuDzᗯAH[T1PIMR ӃAOu5Ȏ(Q`@ c7bh9}\"ƺ;ۚTطRd`A@Y(0,$Fth";HEuyA&L\T%ʗ`I%\Q_UaYf^*A`,z (Q`X 0!0l Hae dLKpS} RWT囘9Z)utIf, B1(3)L18Tȶc.ƕzkPT] 9*+ץH;[]A`,z (Q`p d[KaU#uEQD%e M1 _1(XG ^ UDegY]}r^0#}3xmw}Z_!ҋ鿸@^v֠<4y^#U:/ˁҞ)V Eb:"KٵրH )P֣H*O5(GRbDA$䠟ؠ(:=>଺'J*qf!AGNQPF AeȞ-HxzXrSl*Ғ5G|wjv0 $֠^ A@(0eX)0h#[䈢x,T||%@CmC`Pk rF0h%(})0*i-g֠L'fL6NQJ@*±st.SqvTZ C`rPP(0*eS#ey~,@BJHmf~T+ h? 0 j% @_ A2J|T $@ŧd+Q.b5EQrOdCr.|@.D)swwOQæ@@& AA.XS]yАAu:ONlPUAc PP`~N.=8r(}gz \L-ȟ۫StUTp+ b\((})0WkE AҥE}$kֹ$cOƠx댮b]?_ݹ1*׏rPPި c)ȢsQ$Rj̤£  ASaU)$pG l C}A9I9rA#ԩPPtlbcwP89bdϚJ( \0h$_6.* SyC%0N)&sSz"O3WE!FG((*:axo5X5c ;@c[ CLL0*^ }jR.3Uu=, LAT [2VF Sӯ2oAY]B8R=N7V!kuL<2VBCPP` A&aH׽ rN 838Mn BCPP` Af?u_P $gС1jD}3bKTTTQ}KT_kvG]N\U^tb@b @hި8q592(۰%H&(]G&\u0> d*] )E:j|U[#T#_ۜeF2^(sV#NlCf 2YX7R+~TZއ5fRd,k]C` 0踘(puŬ«^'";b𬊊Ϫ6 oԕ9f'#^ɸhA6&=+Y`HUN3oZRx&e]Hy ?@@>1H#!y%N\fTC )3TɄ"z Q^&d1;287OՉM650QPP / AnbmXcl L8N2tZǍl[>~ھ'̇m&00h#|l ;'U ޮ@1ڸ1˾OO^~PP` "]Q:hX)*6p-1H߾i$Ԑ)f'=4@3MXOebPbN٘֠o>xjz0h-G@Aը7GS-U RZ%Db9ª[n-0[nv}߁"Y\,$GTqQ OOf+qNL][>"=D7(sW5(BB0(Hc#.33xW&R$_-&U1(&6vKǮ ~@n.>4c8 iUQS&8(V\ EG 0yyi"^ۓ\^"3Vm *jMB w?/ty`( ]0h* x8 d<]`!H6dDo.[. 1)O }Zs|(r&AρAsh? tQ Z& *MRQzom}0ou4a P]@Ӯ:cп? M ((E0 Z))0H֠?t{kԥ!/ LA0 Z)~$пv ASh tQ ֋A6)H ҉P:ͷ((` 0h$Э B`( ]9aˆ,=whј` 6J=X[Ooyv*vӊ߻W {GQP`NMc[؝~/>}Cbv}q[Pw}=% i b2};D(sW`6$ۏ1(:2pm$pw2 L_0hψLm8/Yi. O0h}Ϝ;XP< @W  `[(P c3SW__ EX`9w<b 6*A@hF5N"-c;SPPP ARz?cP` A34 `ái((pS0 ӧ!XE U jPfUBrAZ 4Է6N:utt]W/x̙pB,A@hZ:2@#2˗/ˌ  @+V QɓM BLAb -}!- ~ AEjhbdyg~k)QP`P Ȃ) Y$0"}a P j!YP`olRΜf %~gv&& @.* $@?|ӢI((V0rC=xv4'ܳ X$E. hy(ƶ"w()Ep NzS@΋rx P~"ݛ(^x 4jB@`kU(0Cu((r 폭/,ŋǮPP* A|)P`l%Xi9ƮPP`[H $S w?(Rk_8 :U @E0/ F!mqPPk8fUBrP ^@@A|P` tttA`QVN BӞQP`8'N t@(V Zb!$СB((F5>uy: (0H  MIP֣g͝NT B}04 P` A+x 4CP˽EGyDB/\L;QP` AxżnZQZ6h= M0hnO.Tm8/[q[((0E)>ڴB0s(W :#( `⫀(#+,8աV_ҥKh((0`8:S 4R@QҊQj tS QWlwR) PP` ǿ~zot/d^5>3VmWW(uOvkv%`#(U`!t]w#J8špAn{A1NuQ˗/a+uA|^Ϣ,ƍrPP^0/+a{$b3z'ѹB V$;N.\0ЍLXz1m1v<@  rUeFY\tG(#xejL*=2Vĵ׸Zz 6T+Nޥ۪ĝ+®EvH7 PsH(-XiL F؜=V96(,N+.MG?V9 A:&%xx5Y܀ &NMBzEдf'ܦ FT(de~c( P`!Ie6S\ߖIʻmYM*jF ETƫuM͊O=E hy9PPw֋AKm)VZjy6if b(Xᢗi:J ] @0OJF8 k+W0-r;(SP S (CyĄA!B@Q0G1) T@QҊl:(PVV.=;((09= wPU WOJC QV\V $&h 4T瞓AH[6LO2@@ (030\@ +M4ؤ!((З71;bNP+pSܫW TA~P`_9H U-AjR@X`8iA ZLOč AZH<A,0ǤR@)A(^b Bǎ AY0<w ZNZ qȽա b ha1Hkym4A@ZH<Aa#wT(P P B船 @C)gUҥKjCԋ(0k 0+0  uODQP A}-_S uVdDP@{&Ar@*gU`"A( W0 B L^x5GogDQP`|Cྖ/O`mV5 L h0S{L;#(+gU`RAhQ@{A#~@ZH<A RxЉ'FGPf@{AV,4.f A_q>r7o4`  4kl~PP` AG5Y n2i&@N;O=n|Ч?}e_ѦW_=1ϊ^˙C.%.QӧL3OyIϟz챳>];wk/xx['(ܹS OW\Vz)P]H$L }ֹ4(>GJY*|EGaR Z*VrɔK1 BqzcPk'>qW@{==':]zAt, CO:'WqAOܸfkxz꩟R\;jwz-f'xb_0 +`QTx YC>> 6PUQfa;AVk!eYB o>kՁpPłAt,à_~YYzN~CO|ӥ7G~`t/a1HgfcP҉¨5E/=A2DJRy([|=["N^ʞ ,I$%ӹg27;ZրA_x3G=]Wÿ ` [7]w[`8=\0H=BE<^TdyU_rZ/VTtҏyB"Y6cPA AGa ȦUo ,+[Ŀʢ?5EFcP.#k^1H䏔WVJ\F+f/28nďF;}7OkP))2ԍYmY؛ӽ Љ' _.\M$v2AMzl"6(Fݘ]eo\2('Z9R/A)|kA;&%L$,ҕ V7n|`*H'6bD_ӵڕc3lﱉ5tA":c_Qd5թ&q3F/ڂ~!(S0HG,ЛpS#H7ə%s8V_)>KV)ˬzTˏ5!_] twhmM)2ns _RF$) 'Ť;iǵviZTIK+ \F+ j1M &M:3E8]d.ƇjrOkNdf"SUE$$+׿w/6h9T-`SȨ4q\]5hQi滾~5{ LV 9TEQ8LVXY,-D~&b]AŖw'z( u䛆'A^lvɠGI&Y¢Ssv.O:tʕ3n;ԧs+B_t.p9yS+/W1Hv Q.S%#  nhrǎ导][I䛆 6DkQaib 7dݭA{/|F[S2+|2t`PCl ‍Z8vȘ # &@w#zE4L3ysʰe\wSlPk8Az(߾sxsPl4)&,CjҔر;Yݗ~ۏ)ygՑ`۬Aa bBeQ'~间\_`PCl _8aJL>j(&:b;jGA61VzcdʗKK5F#>k,@4wt1A=QSo RдR&,;j fWm,K`PGi}d1x2]qvJ12Z(G5"Rd¡d)@ ;l4'U@3x/h %sL7 yrI vJ/97_.\2uϫϝFdɟ/6\C]v ?_C`: TɤXl {3oQfQZQ*|l+!$A<._=w)VB ))uNwob&dFbB Z - o D,7C4ckPm׉)1Ș \$ٷv;"ox/:ZQiAѯ]|3^JtpjEI|[ĆǴ@Gٝ4N4oF^)d o6{~mӕ_"ZE?gQm]Tؤ,]_Et;l[3AbS|.ߍmH!:BWy冾}d/-Oɰ$ӗH5 AmܗuujD3UM% "6H UK㕇AT{ U˻ptLaG&{y*a'+SnxLüC$q{sK_zyfC^x^?B uI [x_`P6oOīy lS?xʅ^Ѥo[fװOdDnLىAJ.eބK"Q3uX<2?1CzvDǠl0 5qƠ^~ (d| }rԀž;o[[܈|$6{?^{YZ'DPd/yוk,%fwo[3w{w ӽ0h۾csnhP5MѮELSYk ST~bCZ9 9%4cdpO'PQcwTZQ)t habREiѠ^>v9h=5dQ fg^ǠmUT1(Y_NG N,JŽTGV+d jX3:"]Uqg[a1(.3p#T0귅}36&E"kh Bi f9Tf++ ?/PdR# l̙-PyZ`ж-ƢXsimؘRQ?cWZ7Ià`N 7{?瘁bUlsyg7:z'8  C!0ʎ3J&)Vʸ(JڄU)Mu8'F0TZM/ A2丐fK@Y1HjQDmub\W2o^{Mʆo,[neyO_0H̑|às 0>mKVCmW# }_h _LpC;S*K6 E CbkU8uh>/`PI  [m֫.'>q{X5{]g\/D O|dyc^_{]QډVܝ_# ~  5iֆ6I寧{^;Z] Wi;44GTѺ0SlT*3j l{ԤsTw eF D6Q#E"e~d⊌:D]bqH\ma1HFտyi|ΨDFC=ɋ iJjE?^DF${}S5s3z($V\ o6kl6Z4EiOvEAc>n5, '8kuY7H So4- O{rďSDd#Q9C5TDޮ(dL w$Tl1rV'ϒU\sbv?y'ϪV+beu>mG0Z9Q!@b;:|1{9 kIwigv=M}0H?gXuI^飇xy^7m!ұQ$g :<_+!K'3P> T6bፙe~їŕ\Wz'&kȪ:]߸#_QunUn@1H+t5 4L51#l5y5q̞2kXkRLj·b9<?ՈJIf^H7SV=*{m3{waA}b O1bx"@'Gh ڹb_SlglabAE- ĉ鸈.ea1Rz;Ndzju1AaH[Jnvk-Ξ={ԩ{n# uA'^_LJ[}tƹ7rP$nz'~zN8^5up `P AyWXnbjzSŠXV WApC3fY`Pd'Nkb"iD a6|AqGG0 Z!]B|**HA3?~٥6?* A ס0湃AaXD(GjW$cBa9)nSVg~劼6c !)9/m.k+N&1u'|^(Sn"K FDMnΨ?|C]\-*0:(A]yA;4'bbmbEݸHO^g[|t^ TۿqĹ`PЌmtwsUE745wjw0 Z/c+:'_bѕ @J_rbq 2G.-:M?-z̢InpiQM2Ny!TRoo{?a:A;MLӢCaPsbP,pD%ew6cc /`Ɨ t - yx%‰#yg1*iNGMRQC| Ck-v_EƍvU_ZY?L9 Ow_댲;Aiu(6uTw˞b _녗n#|щX.$vFcPC-xja.* v}{oO|LD-v˾9^CWª}MQA`AcJ $0_d_ &[l=)mU rAJ [CbY~EAo/~&MbwoL7GbWAwv/GF 0ӌ]`ySՌ>6"|%2V1ȉͨ7"&9>kG555zOug1oXX 7yX#pW(bԮxum.,~&|bUEͫn HߏŠƔodtzޭA52G;1H;ے{z "?/@-Wq@ r? cߙ.zxK 02ռr9"* /6w 9s܇yE'M 94O٤ގi 0hc'>q;w9#7RU.*8wtvp~myX\`(^6#e 3+'{Ċ1(O,l #'ϹzWRJݖZSnBUiOZNH 0w@}cXUhPڅK„.Љ8h%A$6ZA?cW b{[kz,pd n q}[Es. ^֠ j"] 1f6z;zeYb  pmB.WA99zwFld-,vn1b?6ay7^or雧lX{d+=g\lKaβQ-Mя<N>8WzOwwuz;O\mH]W=ɘE A^G~}6Ȅ+wGv;"Gu{az0 "u|.uN (;"']:WqIf@0\5UK*[=0XAkۚzSUmZlݪZ#}_.$45^1qBҾu~Mkw)J1UcKu ARn$b2'&y__ @R0_SH`P#.A{}7zF+J;f { IO=Oh8 DHHh鰅ɢEQIyo^mRQAˉڋu"]DgkCs'S$DA'0(|d*y7۪GY(hFv82x *F߾"} H?" U{2AQN_rt<ߙb^)[:=\t2Ziaڪ, lY1RSbh^*%7؃&r\R*UTMSѪ{v aMC|a&n>-Q/#ߠAE6CbE$c,b%1+?o:6m"0cxʳ3嘎n7YێmU1ʹ ƖAa~lSŠpZeYM˦y<=m')DZ/1 KODVAsFL=98ae/W/`%Ip87b?RiYqH]tڵsD wD)dɟ|bȕ&7bk 9xF0>dcsǠub֘Hb)blp$,Cn"(ƛ*"63sҢ<a 4S=qxBT2]wkSWz|R3%lɽkJ&e4 3%A` W6k,Ÿg o4Nw0ZVA:ʕ+ŋgvt nNv{b#xk+Q`PxL9%#|q8;5j^Z1h9AH`?HsYcTL}a`8TԲ* qF $nh(GT#1$6 }Yt.uGDl.FFܘeBNw}NN>+'zGU0h  ѱoN[{H)LUaBuԩ&tu6 m i"0H;inA66םE:bZsG~+'={i:֠q"0 "<˿|&"K3l `qB8VAǵd-rǯCO_{9=lLx~Pz=C-Cx~1( /F-9sISПAt,`4~kbcqXI054N_0Z։A^.H&;΅AzsO9S-PcY?|;;wRq:%0 4޳#occ j /~-+ 4SL~C+NДiu{ۏ,'g-4_DZA`٥;[!꠮EqvZ3jUAok "4ίrA`U0hpmw8!m{O/pӫ0 =UfZ4N6 gg)wug@jx'~w{{b&n8I2A v_#Ō*z/;^w`д,X`8֪0ȦP_;. \õP(-(Nqk81Hw1#Fׯ_:uꇞ}i 5hbRl kaW~ A&RA Ecf "6hg/ȐS&sϞ=y_~EAXt>b:8NSͨ{N q BQYN֠q:bʊu^zƍOOWm /|ʕst]ϟbi A`PcPPS;~'>F!ceypPPb/ME~[oܹq/_GUS{~&Q;=GGtB[,fFjH{;|oŶ}{=%GKmH>n.He!N/j\O0hZL!)0Y Q)yAJ@X`,-/e.w(0Ch&* DBhh LS0 B L.^ *@`P!p& 6 MWd4tP` A` W`򘂦6@I)G39PdU'@`<&0@`P!p& 6 )hR+A`i{LAsi! h Ld ::::qĤ(W P w=C@I)'ka)0 )H.,Oc1((0`ijqzLjAX`P!p4MV` AG0 B Ll zG2P~0H -1q/((0`88 j@X`P!p4MVcvNAS0 B ^z%LAcvԅ(<CdM4l4A2uL @{A6)P~@EUt%LA씹)@1A.PU;F]hLAJQM (0/4C^vƍy5֢ Dh P R((: Hv[S ,N0hqZovQ͡ 4Ԅv2R X0o FN81P@`дCMA*((("# lBcTF((>U|M)hχv ,G0h9ϒ;Y׮]ɍ LY0hOQN8ƛQP`\q6إMA+! tU Q_d5H6~4@@` )hBσ ,]0hO)hVOƢ [0hϏ/IbВn{A@)+Mжu) SVmPt8/LAG UPPFS Mj*B:< "((0`ȂS lPS_ @8`AdRK $`]PPT SmB b  4T Pt٩\MWd4 ((pN( tuA@_0h|ͩ)H& A";M{1r D0 S) ٛo]T1U@@*P|^׮]kb zϜ9s׷^.\Xd< Է )Hi @?˗M3 PP*5d(Ч6o}LAb 'm,@X`к?w $SlBפz~抑Pv* ҿzoSI%@/7gmֹ{jL)Q'^K԰&rE;$@ W*a^NbG_qS+^좑^],˲) $A@J@X`_<9bQaSAwkfzyt79$;R'Fţ 7B2@@ ,߳}hβ^{M}.:R2JXC>{gW쑱p5.<'s`,xԉӻz[wXSgqost@7?$[SDL[5Z"J/QP @ ,[Ѱïv%MA`K>*Q#6KZ[20H)rߎ:W.Ȣ@CWZ8ŊvtQ><>^z饽LA"e£ (T`d(\㫁#V C8d ܐ*Tfd4%P ^f}d+^UÒ'jtiFMfj|}2Ƨ\>mFJyToMeU D&l[R;e U/^B8 Ĩc9>Cmw1W>/ K%xs+KPKqF7l5(B|fmL*hqF=Jv\ユ(@@. , r4%]WRT1H`KFx%2m"WMAx\lDimHQ.7cBU)l]HlE]J‘)H7+%/ @  '1TQ a ySkAT>WŠ` TQ^p"F^Nx6{REA$4V@X  GTl)#D:=SSXblwq. L5^`8Kmu[N)7T 2>5G~!)haϔAX %%p(G"S,aS*e  jZNC[P/ߦѧ{Eu&-{ݒů[@X (:x<&y;LslPX88s41.h[p$|OT ȱAaQEAuh 4 f܆ABL9Q{,ͦ^6{$@ ՌmɚԨ@5vnRQ4m,P*ojV763,6i)7 :X/yՀ`٩L׮])H{h.(() $\.zi7|SОPFR IyUdaᴥd@]CJ@  LS0hυV-AzJ^Ep3 ,Q0hO{ )H6i4V A|'P`45 S R( ԟILA|PP` AFp~ ţtZ(kR Z^RٳZ9ZGU! Q jyPF^z S@`,ISМmEX71;bNP+pMAW\Yq­ lA~P`_)~2`h6} E@+(^-wHh] (sR j?k9 (0H31ͩ(W P0;E@)gU cMAׯ__7@QP` A` W 0_WT6XkO} ,ZH<]s1nF Z h17<::^F`P!py h_Aft@u+A(^aMAz'QP` A}-_ ~Zee@QP` A` W@ dZwOݣ ,˳mpG*MX1Ͳ((mU%[;~;HQP` AXPEa ZCPGN ;nP@80h?~Z((1LA~wA((0k 0VK?s uGQP {}@dA@`З3?|\DžVGM]wۇSGhлI)?,wb0??-G@~:zTaw᳟͟tA'O) E@+08i^*d&5NӘȦ 0hG@10HίCaM>-Ðp ;9'ci:@@*0iؐ,3F ]?W?8)M"WMj8nK&?ZI|;o=7"/Ah9 H0Hܓf=# 0:Q F H)kWA%sz}( B*AAKE]ՊTN5r) $ 44v?C D@e(0,A1H "I'[ပT5Ak:w@e(08eJi$~`l ʞLQ֠S<-Rf/  4A6I^br(U` *,=AUHHT`:"YuAuCB-C`Pw gpg!b⁔EA:q@e(098E$-DZ$;a ʶb@*AQ(gg c6Fmwb;a{ャoNT5[F'] Y0H[jI^ٵ~bWa^(M3PQH#LdƳ뫱AQH5BS,h:kc 5j G2 9W!9`{tgN+A((0k6. d:J1KEɋ5# 4_u/[C0ͺ((P0(V<m.ơ1HttZG֢IC_7sUL"O5Pf0(Y{!m~kd&Q {=-`K k2}lL4C~)ؠY}4P0Hc϶=PqJA MA`}( ]Yb"Coz 3K$}dj#_tkUk̪LhMdSNqͽ(+W`s|i[L0>W;ޱ+>ҹ&Oo8ŊJ%g9A4Cj&_!0h((0w;CM8,W&6\bs?Q)u.~k `Tȓ#A0?NvM`{@ڏ(r 1cM֔P"m{&J^(A&$ӌ(xANv܀NLAQ9YIEv{b#w8Ǡ^ eǠLA`z@nP` A`PK@_ˑ6TA VJل% EMG Zy ,@0hT@W,4}[hؠXY%lQDf&?r0:b)ڹtwjt] -PV@W R=a>[?|]qbLeNLYl5Ȑ#/y~1`jE9a{> AmU f"l$-#(f{Η dBPx塼Dж2Cҫ.q4Z 5($ԜƠePut읷6 3U9+A}@aP:_Kr i(`8U`̧uEGfx@ @$R!SuX*U'+LYpgj=$Tlk:pQ;lW,Q IR]uW:v z1_|@YjlnUxbHY쐚:V1"6d[-.Vl߼Т2nEs_O5I.(?{U;G$uqU1(¨-kB1pG1ʡA@]1BB0(HD}\" !ٖL*3ܣObfE(\^yjSͷϢ((У`P0H ; vQe ,cP,䥟 ӎU(Vʭy,S(@X`b1H+1qyC ҕ @J_s98P#cuhInpi` Zy ALB:}\]*-eA((`д3g A`_}=< A`;yQ@u{,Sl֠Yw[4PR hA(PfA8fx@i ڀ,>==zju,pgkq¸-^9j S,KA}((3 x oY3|֭:Iye#`PWA՟i ()E]dPPfAcx۠m]{b*6b;&e 6z8FQP` )fđu'y7xޜu5kHϺc((0s 3HyQ_wУ|E,aAf PgN$$ԼߪA'OwXA0өf4N?E-((0S y1>S}kQ@N@92: B` $޻TJOojLf/6譮NA'(8F D-0a*UlK$P0hbQP`^ ~jN!aO13@f <'ǀbs';LHs0A Lɻ@. W?EkQP` AȜ#hosЏΫs=yX— ¢c:8+5wI%0渢` CX@SǠ)csa ˜ ㎂bP5H#ŒE> #@ 5h^E@ mf6$ AI\dیP,,00<.)Ou89i¹g:JF@y)0 2?Ua7g 11ҁ>9pПe6{tQ"*&\]gEu$Dz^=E@Y+0u ɂj`ؠXLhKAsDwd MyʢcrJUT1a uEQPGATto6Oj/?=c $_նe}7&+J+y{2( P1֠bXu֘gyݠ$ K|ͣO_?sFm i۶C庣j$ H˗Yr:oG^޽{ٜvZWzR$I|ؾ}ܹ[u&;}dN6;;'Œ$U5';>5u_[L޺u+"%izp$Idx5 %j$Ps @EZs+Mwq^'E/ L/CQ9aa~~%dY͕$J6lo w\Q!\tH@)%pu&;}q/&fnܸaUfRvq5Z<  {Y;ueFp3'd?+ڕ^K5wlՙv \wi5^t@i$0?pؕ}zXQ4=[ j.d.^Ss&AG`O._(n޼91Ѭ9Ϟ96"[$ͽL[mj+0G8LK`rBf>)pId\jݛ.WWWo5W0Jɤ .X IхK% …cc{+ S_}U1ZskݻPâ$ef<E{* S!In{:* Y|׀&IbN$ӹ'aw|;~E1GU<㱞pg"}yFDDqiu~dt@9$0pLE*#M_[{H@ů`I?0cm(9l w׌<'N5{p塚즢 9 PG&u<,)TŔL=>֭[AJ7◿\i6g->V])4>KKKp܉2;gJ\VqVɵvfj@hT}8qu3ҶN/4D&u9%; e[>OZ}v27 _*}?;b{F v"I2+48jB~Cws߱VuM>QHfقۧ6O^*Ӄ\n 8y'''i["bډv8`65gDC+˻2c$ncݗe;qƸ?T_[+yō7d>/=HvH:`(SthF{g?us;GM6:Sؤ{!|33{wǡ7M_\_܁{לR< tB54/Џܔ*( ^%BpYXXXn8e(v~qCsf9t/پ)ԧȳ.{v>sssd:}e }c̑]_|\$|p]pϪ/%LC 73 L10|FzpL(y4ק;[x)yUr qL:Raj42S]dlZU3>iSG僻\$3y&w=dpNPΔy.c»ڪZuLBq R].}>*8\pE"Z H4.OW`%;"3# =w.^ϕ4w@Sps͔SLOw2:LeqE|8;,JpGِgF;'?U nΔv|aٳg1bNwNw6+/я&qkSXpt?%{$Qtv,`;j4FK<_#5Å6+958=+YŒa,AAMRE d+gjyͬ@QzƢB@24q%)wկSXpt?%C{zd^uuszlk9p=jf%ڂ\?{{$QfJSI_*UGL#_@Z6p+MOBb@0%af\ qgy;'q۩{0t H XLi]>8yݝ4^r 2n{]05bd7[RckX-8!lIOGe,,,htGN.W.&^^;$@o6j4dCkv,Ip fSq7с; @Ʊf|EpX#kMMwUFx"HnT$Nswe`_4SsSVչ+isHD^{ݧvW gG=ni\ۺ%67^txus;uZ&(o%1^PU~pw'pĂ-[&{B9wɓK&K%8=XCUSۉ ;o4('''Vj*ţG/{=! Mą͂{8H-"j`w=ʥ9P 1<< px❡B]ӵ8>Bɪ w3 ދ^+$*I a4tjyal1ˉEf7S Ns7 Ӱ 5ovoRUI@@2fRӡ5ML|p=0-U$I@Z P'͜ݒH9:(C8xڻ !wT$I d dBaej7Um$I`mmZ .P}N $ H!K@Q!t𘜚jjB5^I+B>Jk J;f|.rd zx$I h }>\p$C= U1LŅgwoƉܹ[##)Bp";eH@@ʎ}o]&peƵ[=T$5lM(B Qƌe`ry!ٳ=II s $CCg' 4H@`V6+䁦[aƂgKnH@9$pꫯ.CF È; j9`Y]C%pOI<, 7qgw#Sv;!\p{lln2j$Ps  ewj I3:kJN93/s?N2K6Ti X4h1CCm|po25Xt@$ʩ? K}éQ5_vҫ-')n+͛7uk5W>hH;sE*dpvW*PFgJ7X|o./ 5N"I@(12G{r6)rteR"ؼyvʐ =.;[ׯ_H@)% CL͸ =K٭hI@@Q, { eH@$2=0JLO?: x"Rj$Pg dgwϯ<{]$PJ !\yќIˑuB.KٕhI@p%`:/!]O$ O۷O4 \JgJp/_V%I QH瞛hC_rUIENDB`PK;7ňmB;B;-Pictures/1000000000000301000000A3E91BF746.pngPNG  IHDR]A:sRGBgAMA a cHRMz&u0`:pQ<:IDATx^_lyhN+Ŧc`!iR +0.4W6l*\ 72 .`D,l D PXƁ nPTlF-+*7BVw>y|93=pw9=O>.}dY@dY@4 dY@dY`,pפ]WdY@d~0YAdY@d ho.YdY@;ϟ +WxW^裏rcMNT'Hnu8ư{%dY@hCӁՎ{:tb!-gG`*rS0_<H JY> GkqTFY@dI(ws_` #?Q-d Bɉ'PNh4:@a?C%A.GdY@hg t@Ւ%;c37R@^{c)BV1+̰^alQYԄel33g#ko{C: =e ѭӭEU, g ʱiL,4C>$ _3T$loP"d?o&8h?hࠗ|uc 5,@ P=Cz2u-, M[` (bonA1 A9a*R2X;8@L8l2Hf^1m`5@WBo!(M*/ ,0H L7EO}a&P·5RV1"WV!#@r3*7%[~fPX N³bQru+ , $[` QƿM07(%Eb Gd1+2#k\4S)nF(J1;?bOeY@v@0=DNSdK$3}m4jFp(Hg@,  P|jY< (pifJL1f@hTS zPZy n| E= bY!dTl WedY@2GJ i9 =쥎 F,ˇ]!|!u]cЃ4#` kaL7]g5^dY@Z`h Ĩ^gMx S/sx| @ʱdd4"8){ۀ86-F5\ch+gM1KM!MZC, (ڐ /D ?^,TEG-U+pQMbɱ, @@R2Y@dY@@Y@dY@(PJ& , hPS# , EJdY@dY`P vbdY@dY bHC), , bAN], , DZ@ i(%dY@dAY@ 4۩dY@dH " d, ,0( u;u1, ,iNwj, #;;;O, tw-~}?_#m,P3>xƍ=j, @@?Y b^FdY@@Rbnvjj, dD "{%dY%)lJY@ NMdY b 1,h1Pd/d, tb_)@i1P7;5JdH @@@,M 6tQ, fV,i1HH(Q2Y@i1P`ăZ% @@b Y b^FdY@@A RuSSdY@H $ $Z@ (, ݴ(WJ0PAZ@ NMdY b 1,h1Pd/d, tb ]T) ٩U, DZ@ $- eLdnZ@ +%( - fV,i1HH(Q2Y@i1Po†.@*Y@"- E2J& @7- J| xuSSdY@C i/_>Ws{?Xjjߨfenmmk׮5ul.1P>/?ѿikl͛7~xwo]ɤmo}s{'v}L7Pϔ `>~=r| &deO,Yls-r\zu%wY3oleV477C"9B.\תbs1hK 4ϝ8qnSk/y\s8ڡ2p23 cmmDr2e{et3hSSshcc,@b|anz!@o `O_>~|"pt0H Z{.^gf$ÝJn%?A*= X<=) k)'ǏM ᒡAOM͌7;H9c:zZ1 㞕߇sZ`_v <gD $to^@^|U.3ׁOF gCw}g_8btv&j}.ԩ +v@"W @Iev_^^}( OPfH 4wWe_LTi:MO/{). ܁˗O6},…grH 4q}CM&!P_ /kΦUdcc L3?hQMh~~A1h t)Pb0FB&+{Gx1E TVV~Wc/} jjڌdǎ=. ^|_ʾKhzzv2?8rn@ *kΦUa x>G_DQ8L# ϗ^8ߝAVfku_B^1P;g]Lz^uÕ`f%-A )ZTXg eC||X:ͳquCn9UTU)f%}?{v9ܹ+J?\4"@i} e(C2PqabўyA`':eC V(=,a}S'zP |+-,-YJHˈɐ@ys&5i7Ӌzv):@xc%X }ljl3,alffK/`ޠ_n1ЩGQ;0rSK TE4@o?L}ĩ7޸JAvXOf)$HnFZ;8`-F "6/6n2CK/ \^4Qafu s g_(EK"`%!|.2?B77?‘' >2lv&C.`r/yCjJn㝀BTyQ ToA`A{|fqq4@WÕݻ>`61\@L9a ^"xP>p`/WB| @( Mf |AA Yf!Hygg0Lo@\wǑ;xS†a_XclF00;(1PrbO`lAē`d8hi xh~Q ai/z~8VWW f-?yVt |-@6F  ~x8NWJ`Ơ"wg妬PH ;E΂)LrF41Go׈   n7H죅XOM#ZZ"%nlw &lo\Y$ F؁B*eqxJ6gEBF@_m61X11& P1Xkܒ&έ7 Y#=Yv$6 5H $JƩBQxr圠L Tql&^L0oҘl2` B4 |C1!PR6" ؇  ޙ`+`uh?jGp7ZB_͈w3bac3,' GlV!/AJvD:8p0D`++,!1 jP[}atWe=V8\ȞՁp07 yQt6ߚX/̂x?ؐbB!cT#g;޻7R@,O>i.1PYIKM"D"a(&hE 0܀Gn;[8fA9աqA\/x@d>xc@_v  қBccGF0KV#,9h|չ͘豾08c/)5oWp*8kX8gcAuL _Xl.]ZX8ceu H;Z Mv\؁`yF XC@BWL,}01PӔA `? TE72-`I;gWG Y05`nϞ6@x{@K PD"x. Eee,lY٪zU6vW"D(R NA>XDA]HKk@V&0\ږaL ӧ3n"5#ć>Dh,gS"/NdVk@ei&-}ʨiMJH+%J gG|Gja_= M=ub'` !Dz0<* K&EDT;uuMhw(~=PYmgQ2}L&^~ʬwzh(=:{Pq)8rRDHxCOc0@KKݩ.1PӔAGTb_ ^jw-~ж8bm b`o<&:K3j`l'NJ˥a0! sϞ¢7Ƨv|:l0l~KS\G%ciA쏫 ䷂f%l GNŝ 'lA9zG7*[& $Lem|D3׍l efx,f UH $B~ И>V,pi\TE jpcs]qVxLyjK ƅ2Y5 {\;ϟ:u[]6^}#x,2rs=TJ0s׮]M߄{b ˶L14$t`bY`'/΢WN8Mu*2ի7D.O9|J;`#NܯUA3!ސ zA@*7hʍle:G)!{vi{<dzo4' 6PaW%q@ !"*Y`B +Z}Yke||qv!W)6+b}ZnW\AQЙطGX 5!v81Q^0 /%L@-ʏ4"Ud |P μ ؂ˌTdq?tH.u 8!\#\@ 2MxE |Lt G XCqؠp/> >%Ne+BcЂXр j4E>ƃO>?Uzf|zYFze`6*6;_@ t ladlOE6M'{=hx#PAUֳV@k3PZYLJQ39P6 mЬ@f`YY7o\N73%}Ĵ?@c[3E[cq1P>(]d gWOoPĵ ,J3IGJUT61 T6ҟ=ʚ =5nH*c:G :JjxdA< 6'Y{e4"Td c^Q ؂Ɗc&ΦY-4kh,Cx'6Uv2@ TL[ DBNȨ  Li1`60!2ct2xgc@Hi2(_XCc/*2*~bdS{@A2l6 ;;OwglK@&20*@ZݒYY146,^{ Jq$>&Z erBg_^}Ȱ﹘&5@ @@Jh("a i`%Q7"I  1 Gו $Ds=ܹZbT! p[76>Vqr`UJ_xa#{ ++}.5Z1i0r0Fc (R+pWc@lx<ɎPر {E$|7T/ ˜vs1ZD$Ŕ>q⸰7HHza b t @ԄG[laa F^E}#(Y1 z@E^4e`lL9ȚVQWԠh 4֣b}㏁AΛ/W!xtbQ>g B4zU#[deWK%/.b14!4"K(4q8 A,e[.DT/`1Ď 4o )KBO&> N&ܓNQ%!J`&ׂe'2@E@io50,acHI^Oxa !d sg*7P|Qd5R]Rna\х {ݛܒӧ/c3PQ T߈)ah}/4VϨH2X;` P2y Q>enا@xo ^t #YZZ>ԄvvnΈH \ {Ԇ9kko bzعow4I7s7'MB&&۰\HՁ?ó}Ձrȑ#>8kInX! kU盱%N}x(MNc6xL`&ϭ\jN.?^Q!rI[n(Aq14"bZct&)l R$Zej6_?;u8CkS)zȦ4h($O]Ar"{la~72. #޹m5%-VW}|˸-(GF&?滒qh}o$[~ ׿yĀFu"1 C)I>=zZ4cMPo ˭`&碭A빖 q  Y\Y׃׌ 0!H7GzI`\밖.r] mؐP*dBǸy@o`ƙ,}.mWQny d% PG"gJ=XiXJTx $R^72bG|Q"S$@M<眏Lu_#SCKEVEXR z`#p߷HSVg ņy[e60&Vonl{$[e "q !,vG٤D~оqܘO3wy3Kw7+Y$d]fSw TPzaٕYo v>I3g<a[.kK٥U-#vl`7=_+@Q] EDp(0 *)SYej.]17 g3_Fi@de *츑1p l(7{@6x_H ,b&gおELBqQ Đ ]WLI5>kH^ԖFYbE\M,>NHb!ۡR-Z!h |D \V>=e?ⷆU4Txb[ee@t1MxŒyu'u(FYLCҲM Ɯt֪d&bN ׁB[c  R[%(C)v+#=ȆGLC2۟E:z4WF-@ԁŏhs2ESK &IH62>$[>X'8)? { sС}'N3g E1)NN: E6 nbY(M2 t< rKAv_)qPqVM\2H>=2-h8 7Swbc:9(P."38o-ShHb e s9D GC:16b %cPsTA߫WWUԢ@<0@e:0"h:v??a$gS3 @ׇO$@r(: 4kh?@Q *knϸIJEr /| ,N(66dk@8f iÂ_RNcfxx¿HFj~A)0=kkS1ll[|m08&^yŞ[cu0Mu:9u'z d+pJMj07n[2UtIt!KT΅_^-ohx2;ˠ` X nQ6jH\/9 r*  ڳʲa}b 6MY,c d1ɼQUaktARFQ*2( Mv-` D2hlٯ 'bfble,N,&.z6u ;as'ZVB.#wV1do ՁXN܄@k" @І)A8J6! Sΐ yb#ŀtN!A.P $KK@U<~LR*ц:n50Pw[9mXCt33|eF^6%e$@6>b#W@xYb7{B\ '~S_ WN\ ek\w) #A%MHޞ@11`( fDzB!Hoͤ*YЀ`E+mSҁCm2$k3)"EF+u~ٳۥP ؖ?O_~)Wa)~xN|gY$2Pp2dud <M(XwcxQd()ٌ>& Z"@xc7"c9 7%W}Yl!9Ǝ{ƃΣ siw3O-_K;*1PC㐊@@6-% g6clNE"-yb,n@ԖO t(KYSXIF_C C}+y~4zM 1TgRa7hnJ7&GRcS@@,` 2¿##64X5s1erI T'b Rǫ I4L|`VQ%Qhxÿ8HZBFX[7>4ر^@b^"-t@@ v ٬c+E9ǖ66o'\"Q`T2Q&\b8ȕMbI?93J8p 6\phcҁz~LT%v0R +zxn/0jSz@HrcKVԁPrSS3=]s|atqҁŔFK@]/oǛ7oV4Tn+tx٨u76Ԅ,&ep 쌛N0. fRAb 1P<@SJ¸v:"^G3$dBAdSah$n>2OĠ3*A'S9l~ܵk@1D+*TJ&K,P:x 0E$" Zc<23NǢL"@JMGf:⋛Oy*Qta|a 1P;ȿ!M<@gT[zr@@b ^w xBJt.o?5 /E|a]d51P;](x2Yb& sxO~)jL-]ӁffOФ^:77{%nP ڱ (Md9}ѣc Ibv5|./֭E_*Y_Zz n1P!1P;](j?r$_匽'{W_H44Hlo_B'-Օ٭uѐaI N?%2P]ȏ&@X4a@t,⓾=??K^h0\,888O@uH e[na.@ 4$@l^zIjd䭭'OLM=[[2޶˗O޽ҁ ٢@/x# ~~`wYvH ܰX" E9LR;szp%H;;;ٮO $%~VA` U"G[xg$ !Ǐ/L//lȹۘ0OZ[[\!^x!lnwoiA8pxnrg匏>:qys ́&CYS?nPt|Hb1PJhdC)eY@@b Y bwj, L@6M &@- SeY`- J|uSPڴh{O], b 1,h1P߻?_&b_z@{eYdD ,0%LUmZ@ 4ὧ._n1HHݟ/ n1PMAuub =u,w @@@}~Y@p T&Ԫ6- S/ }H $ $Z@ Od (צޠi1Є|Y@@b Y bwj, L@n*jUMx˗d[@ $- {[@ kSoP]ݴh{O], b 1,h1P߻?_&b_7 M &@- SeY`- J|7nZ@ 4ὧ._n}.}dYN߻_dOA4IENDB`PK;7+,PP-Pictures/10000000000002D9000001367BC2E278.pngPNG  IHDR6;sRGBgAMA a cHRMz&u0`:pQ<PnIDATx^}_gU#€,emz%!@'d&dZQӑ%1-f7U4(#daZ a^y"<`#B@!FEB@!  _jWz*oꫯ#z_|~~&j;ZFGl[ "@AL`~VdMuNݹ0d݉0#!zyͰfc̨kjѯڹs8W^xVyu8D1-ꅆ%1Z;)dH@]xŔ,CMh"[7'7`]e(߀[XqJkO T?rp0dEFT]WKy a؃@6HvSɔK e'ն0˗/LNL6G@^EŦEN%#5V!.)"*^l͛|o\l_iM`ee߭,9F2"+;Kր@ irz/=f`nL6U .Ů @^VX7='[~ue*N|58FS@r{JBlshM0Vj*jwpU.oW+IZ4qfw><-A>2Y/)cf>y:f*Hysn+%Hր@-1cmL`{IȡoCSRmowHaq彗yЎr 6k3k_ 5獲1Z}a1H %;>.aA~ HK(/c zMUV_oA,hԭjW0.68 D27}(cBpaG3* fcv2BjF_q@V"F2Iɕw FXmuUpdT3L7[ FCC AL t:5+W])I~H}4op>.`SF9Watx.f<# v_D6i@;C)NCH\Es 1d#q@V" pblV}:0WæfhͿ(Y귀@NC\Y =e*MS濥xO)mZ7Ak"AQ[ACZp|خJ⑟nH. .pc:̼sAo9[c鷸 07(j sZQRE|`CeҸ|Hx <99НzOC5i A6\-?AE{^44\\Hq FӜڹīM`ui{Li\ 2{^ȡA$9|Oa$J/R \f*HP[ ,f-B&.bsu#/(FW `"#*:#E {[PmLa>;ƽ H=wP;slMƢ :YٯHLڼ܃˞X"VM-~ߧAid:g軵Ȍ"Э]0w_hB,,dy !!4b&M40vWEz $qKGؕU EE(LPKG_*L$LGūg&O5|À^^N ڐ&E?{9b [ 4q͟&$tXGogUU+9vZh#6Er#,B@! @"! B`}-B@B@u" .NUB@! ."B@! ։:W%#p_}jG?([W4vr?#.uRxWz?_Vs.ŪNCƄi숋,cnP+#pw "ͳ+4v>#.RrkD@5ߤj"]S TRl=u;5v4vڔHWT~)h>|[ON6%.1_ O5.SScGcMtEL嗂SͧKjS"]S TRl=u;5v4vڔHWT~)h>|[ON6%.1_ O5.SScGcMtEL嗂SͧKjS"]S TRl=u;5v4vڔHWT~)h>|[ON6%.1_ O5.SScGcMtEL嗂SͧKjS"]S TRl=u;5v4vڔHWT~)6=O׾M? (yܗK9o9qUJ/|?+{a|9IP@!Cʘk4.u翀162s;"=@=#ϧė\#+c|Df0v162s;"=@)\"5\)p!!Nid2Tci]\Dcg'.2ގc\~\حq㯐FSQ F}O œ7",x}rg0vNnkɍOSg.Ÿ83d'#_1.E@; I!bAn+ G"S!z`|LT\dU$y> -@ hZ脼l? {c-]Z//=%9EP$G3;h`"#*& '3"5o򋐗}>d'oȄcE&iPݻ_?ȇٌIlc!\Dcg;dU1IE '~ #<%g[KL>+e:"$Gwف]}g?22I;vڹNrIpdKw=%(u@*J8r)ɀy[nmll̞y'" `Hs ;h`"#*&%)hH2σ3&IM1Q$h 3jL"l(}rrr̙g޼yscsLT\dU$X|Ee H>ʱ Y>J'mxȝkE&9}jLpsW-b'1: rWk%&n'2Nk7(H 2S<|*.[I6ͧ+=-md# 2DsV\deAƷBc'X)dNcG\d4ϋ$S`r]9P`Ni^,LիWaoHVEj8#kNcG\-uA`)4ߘ$b7" [Lc'X)dNcG\$"0tUx9ͧӵxkD)|\Ĩ7#.?UrY̆i>iJ>zHD@\9ͧ=Mm"]r)AD\dNcG\d"Ӏqse9ͧH.\ݭM1e4vEF̪fr$:ki>(|zz"rҥ(i*VL\+b*4j>]77 DZjHAzd/c."F:B@\dZ%m@btYb@!;9|*h! .2.B 1:>1Y+p!0]Ew\A@瞥N ifHYW$ # .2B`(<ޑtC@ "2!HH|"u9MNRKvZ"T+?"p{vibչg]{DpתD`\pw ",x$Nt%Ġ2B q6EbFܳD "1@A@\D\D\$f,Lp$<@SI epD40Ԝa˱!+O #<NŒ b]"""-Fg?Y,:<<F@3 " I8- [q'"x/.~ENS83nB<EEE&cV_hmu޸q)A֦*E@\D\D\dc,БEy6&vB3"""ͼ/_"Lf</%պB)d0:or>)|}xG R]J" .".".2=eX-{JB,& óMLtU)<k@1Lܱ܏3kHYt20`Q"$C(cgsmreLǬ3g>JwA( 씩.'TcY7fKxHp)*+wq(9b&ƍ}!vwF{ۨWA0Dr(8C%,)B^䱖1\D1 /Y"""˘׻%shlwEo}LryPHN5\ZuvOe .2d C /l,ۛGG+&(6q@&ATqZXn/]CpѤEoܹ|r}lcgC^ 6<{"-\~ "+"d x_0{JE. )LK Oի_Bh|N"y.;mq:0ϋrr w~ԆhidR.nfw%bW|x[{@5D! .".e(k,4/Bi߰㯐FS|0?1`Onگ}V&T""%a٨g v1N"BgEjrP/Z|z, [2@8>?y,uAQeHU;W{ok{{c6gt-::o&v} FM\="~<>/7Y<%;}V8tmlO\gCTU#"b"h6pK2 hH2σ$!M1Q$h 3jL"lmQ8r>Ɲo|Dt3c7|(Y8@ȼsO)w5 ƊmOrqXF`n_4¶=LGC9a1G g6 jA\)|&0]}~J8)AB%.la `1+`a-Im:/<~ߗTHhc 5cQD2tYgAjh ( ){(RI0yc ؉=Cf/O?7s{/r_LyIx jf/|\Qh\$sdIycYEMaAhnצSxG@M pU x>b^" CR ^X~|O 5CC汷1|_U@mlp*wQed4.c=IfBRC@\$#oy,״ƔIZ&U&A;Zh3^p{`&5#b!'(ћ?g$B̙@v@K/RNۣ0b_.O\$ Iv p $34wq^IbبτE~2a;ᮅ_xxWX%$qoЛ?,='XC徇$) =/*wQe*?>s2fXq\$ !XqHF o:}4F瀧~aGSH:TEj_)y=o_؃88~~Í(BzXS!..+N.Q&l ^p=n!j7 Jb x$dG=<:$ En6{q=+g( ]mH|=wEE&E F&,N}U&lXZ:Ud' pe5RVQ wʐs*|FH AX 8B&.ϴ_521E1qi,љ+"X0@#5S'On%G]6I6eԁ\WZY و4|E|x2z}я>;H+a_"=(lħLؕ1Esd  ?6c$2>ղY$IY5U Ƃ T\Qݻnfv" ;;z\(.".8. a1o"n O21ʼ$zMNxer VJ<|YkuE\mL&kg%!q>,sjG3%EEELX1"/**YObH p3 Isdžw4$tJSτi'F">rpp4;ż[Z~N~ aǿ1bKl"'.".2/VkhɄ}GO`mH<VVz  J.92|̉,~; 7Ix뭷Lg_曯/ |o™8U_|EUFU ,]Up-*b\jL%2a~VX&8";9opDU (ۘ2""ΝH?eK!c^k\/^xy_ H0Am ݠoBB$/zjAj  xT+ 7ԳJk{'Oލ2]9~YaÁEE:Wᄦs.:`X3q.i\t1.uϯh"tར\ˏxc4T|6ckK'.|⪭SKw{կ},W ^pG""k@%]A8ߛzkSTFYumġj-@,;od˗=Y,ж]Nw+ Z$cb:mK)ޤ9c7gbnU;b4z.D1NqW&&FîURӉY.U98_z`a gxϼn*U~IGlF]+l;<(W ij ")zͷD9޻`k3bZt4T+e?(k}Z,V ]ae]T[>z53~%iM,p%)k-\xWRdɵ d*[Smy6niYv*X}Urߣ n߽M(PԜȸۋ#GU'o¯Ȉks1FU%PX{ t YWfn,;JRInf^[eAj" .҃y' ,+"K"X lr oIyO*1\%Ō0W/m.o$)x0~1aDAfk3 >4X]$xyE0RTE|J&h֭U(+c ;$4h@jbИބ_$a/A. )"K"~\$`姺B`Hbleғp!a+:\KBIT-1\< ~mXmo޽=U.FkUս1.RЀ[$Ƀ]*:lЄ \*EEhcY7fKxؽ:X)F/̇9bY \+ HF5+tzW' %~n`-CGc_Vq/*' ݵܢ+;q+@r=w^kX.bh<< ,_B^E̟c4rÀ \?~Abf91xx)1Z.b3 hg}4;">m]25Ѡ>UIC ?~^{C^| + YʒhN It"R"LmX!7:XBpKpa6׋DMY">ߠShkzwt"9xyc"wzJ4 "\ļ(ֱ㚸,*b=T.0I@ENeu"th6$@#"`W7qy a-+eS@\dr!\m䔄e>pp-ae= skyQ/xdh% x={hl *{Yjx2}r!.A XhH,rLT2kW\dw"xS x F|Iq]˅@"\^> KQp)|Iz&AdE1FDzX "xJG7jBL\> F3Q3PIxc;-jI6mOJb嗿ď?'08Da8ELT =YA,ɪ ٵx3p=,15NEHu}>Wf3VT[>~_=.׺\d4p:-gGSI@.BXMF>@DkQJ7oTB/cHL".⭑nڈj't:e'90/FGĦ,E>G}*~hQӅ[Q\q̝ϻqqƓZc k2$IHE,$AIKz_ I7UA) ޓX^ ?B(Hr.<<+9LAJ3/]h9"ݗ?5V 3FVO%G{BG}49AEL /4ߠ Fj0O JB1qXJD\$VP>+6|,ѦAjԙ<1:ܘGoH_]}Njc[+w-\īt7ۄ]E&j"]͛&y',.|Η@!P;>>&Q_bsz[C M~]9xCbBþi*e<5".E,K*%Xyn lÁrF!Y,O^PHA'ȯS<%XY=aLmzN %hM:p5Kw n&L;*(GK%\/>>Fa\k%Y}شcu8i":"8]Е4H1}>q!#Q "pzzz& \&\ɞe@ (f!;Y2& I-U0:C`O]x.XRᦕ!\+gѫ1Zm "D D DGU!\U{wsN`6Z,HTI!0%nܸ~ͼDs3D1o\&,wƯ}g.c4P$kQȩuui\Y]>mer}\]~\HZZca IEX#[GGDZEHW! _edK"",KW&|X(Bc|f)&Uײ7rUY(P%`![vrGWgY4"</$ig]U9}..&u($`*A*Fqcc/Mv78ϲ U+kzzϚoldI 4.oʅOlnի9>]Uy! J%t=߽~\~vkGGzY7\:{gd]%@ "2!P(=wؒӓ} ,9<|Jrc45y#$ngcg|pwwQ8fr!q`JH1z{}L'`w+Vn,d':N<4p-$ǼK86!D%@*ER!)9B wOAEН;wHrNv >-rȽ_&B?dݢRrG{*y86,@" !PCw%HA!Gڏ @ uJ9CShGFL !P C jS,K2UZ $S >z],X"k^ #|w*""S5<7>7h! :YM,\&A@\Df!ֆ@*U,舀HGT\$B`)+1B@dW@﮾B@H]#f~ڵ6R B@D# . x{fIB?"ӕB+:߽kT^!qB! ;ە*-5"^5#܊)"@)c|wq34! @?Eᦫ@,:=)B`,|=xD@G>A!0IE&mR||򵕆B@5" .FUlsCrl ! ! .H!e B@NtK tLD!qhD͛gp`B@HE"R1!.B@C@\nJ.B@F@\7tY.Dޯ>B IB`︽{~PY8=u{%D%# .RV?"t! ei#4)ER>|FB`{"":߽a#m8"euH\D绗5fG@\>)|B`Ս"%s^h6B@qzR\X.*F! .RVgEt{YD!0/EOqw/kH! fHY]*.R[[[Z-VB`.Փ"EqK.loo@ E! fHY).Re i#|)oEJ"vޗe"F!0;ERqscvvv9::*8B`ձ"":߽ mX"eh\_oo Br_^^;,6B@Y# .RVE1!߯{_d1D~ "8_,6B@ .RV'E?,RSE7*Q"O#sE_.HY m@@\~|q҂o›˿sEOK? ixo4ojĀQ<Et{Y@!HEhY3O` 1vW|;*HRGHXj@r9w/KE@\gۭoy&?N@P|~\ .vBOhNE>˿˲~i#R)",bD 05|_ħǒn  {EXղB`k"p@ dd "^bJY)E>_)KE@\_ . K !?`IyOjIz>0zC=(ɎHWJYgeB@,qz]\ĒL.`) `FHS~+ r!ĸ8{Eʲ{i#)E<`n_4¶=LGC9a1G Gz8)F@\>5&8֌Fɘag ( )Eʲ{i#)G" 2?F>dvHYv/mX6"e$v0|ȋe& eFe# .RVO0@^IBSEʲ{i#)E5 )F@\eFe# .RVeF!qwA\D\B`Ջ""eYB@G@\$?]jb/*+"eHY)mɏqEE؋ ! 怀HY(.".REJ! @~Ecܥqq.B@9 .RV/eF!qwA\D\B`Ջ""eYB@G@\$?]jb/*+"eHY)mɏqE6>|v-eE`=|]zFeB "'ݻ7;w#]%iI ! 醗J ! iI ! Xy7_u\J[-M2/"4ڋ 6W_5 _Uh>M wl9L! JF`A\<U|9x"*{ܹ^{o _x$ANeAc^  !e G/`e@$\I B@@@\\2FT.zc`X_٥ \hQmNGE * 2@7pU&&̴șhQA! :>jlTK8~mtW_>0(.l`y p.ya68j7hߓ%4_|CE2^cwMjѳ`xB#BńSD`\XدRv̅,.o۫S:dZA32Wuz>XW}c_UpkZM>ŕ]{?Mj !K0 "UP6(?*yႶ7E,Bzp*~2UBE/re so+ZPG N;¿ ^Ue-MfK/jlWAM .N|DrcUV$"zafPᕮr& i"ȄH ]7 g@>|&.Œ (0uR>*T{$W>&1@>@PX\IJj!5!8\k(\lj͋w͇ I?vyiKBpEj}%Qfu|&.bK#.,V#UZiKe\2[rNm181O (c+č>%EZS;,g֜XdZo$SKQdi$i%"ϏROq^`.Rd1:3䋠V5pԓ>#YjVK8p~x=[VJo.Ot"(-]=FCRgH{:or@! @rEŒw(wbaHׅ ^Z&> :*I>T}N ijezX iTG]ʖPlUa69W_l``XZ;iғ6Cp&bIB@H ݄B@,qv.BE)!B`,p! E i" IENDB`PK;75,,-Pictures/10000000000001F3000000F19D4E1BDF.pngPNG  IHDRPɣsRGBgAMA a cHRMz&u0`:pQ<,dIDATx^Ař@(1a31lGC Fa cDF`$(r %,mrZ\|H>B.*}jY=Uk?kR@ tJ?Okr_1;;4ȮR[ l>+\v{饏֭μptrR@ HsMM͞=Yvݶmŋ!!6Rc <̋/8͛'_{~ޱJ)PҥKw99`۱c"@ hPI6n) LT~g92/wiR@ \|}Ә' \1Ԁ&PJ6n) :/93q/<WheDΌcuT HW~rd~Z uH)=.\stXǹ31->vQV@ =BDH}1e>'Xy%=[Cg-:MNEHswN@[]*7-eXǹ#@1dž1#:e)=j!rb\A{lWE nX D-oqd+&'4ɋvM#:q)1#:eԺu\"oLƷ+T@TI?v9mSW"\w ~#StRK t1is,} KC\}*2s|e//.hJ ):e)%ɾ{cݶ5a'I غu5Pffԉ*ߏܸWذ%4XчFg]D7&E. nU D޽yqO=;$=a'>I ;) wŰM;Z[u=ξ% # ?lhr5eQno {='_7OL~Aa# $a]ͷsтGSmvF"{7z)Us4{ i܏vYc:ڱ?auVodOLg]VC:}ڥ'EhZ'88g'=IU3}<6<; 4 Q@jKQPAEW pq%[q*E u) *|e8P~TvQ cW H/֯_W$ac:~|>t`ecϮ{L H(Œq,N c;vbf,i.W< G3uT)@ ٳg]ϝ;755[n>>ӗ#PF%ls8ai^q >sruYd!@ :^ǔ)|/:`ӧpe^VzvP ZAUshU@N.--O||Bڙ]dT*#@Uq ` B׋6wO4w~Ϟ9|xD"{R@ V^3N7t̙ZNpƃ7(Rhe1YX!̩n6i.W<<-;vs睓.]ً0RW糳0?Y:9LvXlXY)G߾UJ(fP}I)l&ZXX(4Y: 2{=yDvQR@ PKg+3N䀔bSF޿|QC 9# Xnifj oDg~j) ֡"1E[;`9d Mv6@\ TL`z+wJ@A+sVdcM)r{8dچچsVK])++5Lۆeɓ݃rh"{aF@^X:ln)[yY))0R5ғ"{Y')<h&ggT"{iTQ M577Wn))eiZUg]V~2 Zs{UZQ0H֒m >.[ qժ2z4>^AzF)p`zClʽgtSd_\/Om*~0W}[-|| /+T"{@Lv7^HS#Qd^9|x>ّէ쑓 tC\ZMvጦ郏=f'W@9g4ވ5 'a$!> TECv@ 8zD^G2Av gZѐƮ[+ԐV;!;~DCY] r{UqBΠϖok)GBvj=XkǺGv?\V4da!UtNѐ33,=D~~VeIgkӧ3!U'NW4 Ke$Ɛk˖Zj$x饏֭ yӊ,wa]bd$׹s禦fQOٿ[gFyNZC4$C,A]pd'퓰zkBZ\p22Ew쌆>EC{Na]b3dd566^~睓eI}׮/~@ߢdǕ{O +qiKn 'c | gg 1 ^օ*Mr{!ظ?{YNbS1LtThr8EB.]>ǙYAAMLnѐ'pEVBd/ Bk"hL'l8yS{|[[d?4f^mMSJd/҅ {sP(nzVwǰ')G-qUſg\:qC[gGN aX&[)EDU1,#uK31"+}}CR;. jX=|x/2#{(0"]d^#~qp |?ﰭef6.Ԍ رO8an97{ਰ!y|&oLiX텻S ۶MՁKOv_VWZ 89 ~g\4tzn`.J>v쿆z)6*Cu>KO<2BְIsOxuvx߾gE_ ǖ_}s"[6l޼o۶rHzooe+6u?lbV|_O8:$mZKanf^\CXPZk>6; b6{MDp玼 &"{KE (`L'I,ve@6(?Y]+<7pc*ԇPQė&{$bgff{5 / dFbu%-(PGl \1pe]OHGMw:xgQdOǺ CFR'kh)0fO=s )tVcUV/=8kIfVx͏T631@-wR5L]=oȞt4on6u;!Q7s7i:g9PQ )J}Dˈ BB+(g'{ݹc~ *w[bYd=% 9qkTNKg4k=3T!;#!Ffd!}͎pQ,^m(UaTuݥ6Xa5s3L=t`, {qmVy67x4x-ŝtqSa1$\: YY5sl1-zc>٣Uhܮ,6 .t ZAd's"m I[8o,hffa:3 Ý La,I5? e2Ԍqb|cȵ_EyX]zK8_rPgPqOVW-{.Mcn{ 5n2F^a/nԧ=QupVڍ^ nhhN +2r+IO4IvOs''bt`}ٱ?K_x*9J}iڠG(V4޼JeaB琝f8N[>>D(T7-h2lG-Xb03Bot'ч̗>wCi+WD_fBL7N 5S F*&nT%;|/4ՙp]1 J5-!{ |;$}Ɇ4XLW${YĘ cەRnA]&''S&@گD2<Ƭ=' DQ'-#̔64&)2.31VhM#= ;|ٛyUnsf}׮o 堐? ;Jf=X̎wvni~yLYAv uO&Hiw[ 9w'Q-ZȖB-x6 ؂,g#8Nwմ #r{ }!$$c.t6kHKE~'m֤k #9p>ؘyc#jSi]do6lux'?hGc?NU{P&)u\)wBw` QL7Av#5(fgg1|7`OOuP4RE~N㙓Pc={ rWT~ݘNȕ1}z̙8 $L0k1HX_4oLfa{tdc?{n.i|S]i Y B ٹ<igŕ0x-yU{q;]LgbVgw8Cc~gfN=n~v>J{cTT%Ev=T_h"iwne,V<4Y q9"beȎt:g,yN N gi-"')쮿uNlL9o U2!GJ>RLJX+>\Z$S,>|g`Z@<"JC}H1K5}Nb l[ [ >ʱBsz*1?EF";8X DnޞznN"Hu:qr"DB53/`FHs h}=@Ŋˋ1IO*]13CNHZ%mv:=enc"h@N8\,)#' (>-3`T'<3BTЀ|ɞnb݅5']к>&C{S8d2 WV"{osb"{XQ̌@tnw Pߊw3inDr3{c(A3g$xOFk6141u<ٳg"ңMFʜ-@BZ+bxvYPżTE=r DRi),sDž&P]q>샲gOtw;a]d%yY iʡeɓְ(qoJdW}!Y s ꢘ%NL =&{13 Xb%;:fWoapAݗu7tlvd/ug<)wD@]d7٣ls(! ;$qUmnĮda1h;=S*"{g -2X?e}P^d6ZDi" c d{ӦqDvs%1e "r雽>(:3raΌ //XG"!陙4778wΟ8X??Wv7E7WNv*E8N<_tgL(t^օ"{dǻ1xf|0ad  Qۧ.GNx<3{)Bv]FdEvyfD^!,p?H~cTv[+XoE.L;# P)FvyfBCnOdo婯s"{dWL}7TZvE-iaD?1]y YdoHFd̴ ۟kyd˗/O}d/{Nꦛַ|DgW!x ޢR[ (LOoEvTF _ԧk,j\@%䙩$_*m̌ 9FG"<3]"{ׯ/jQ[zm>V˅kTdI@| t3h׺j.h%wꌥ@:i!OZ?<_D`eE`R!)Wi!a>}e;ٛ\GS垙vpO|pW"{ÂpR 3Z;?;t|^doRmK t^vzfZNv?sʕfFތ:-̴n&SޟMg"TUNpK;wN5 )7y/XRW 3pBCAdU^5.z@K<3";!o?opi@, 3-3ߞ/RdyJZgsdhgY㺈u6@ 3QCJ)FEvf;lE D H+i?{>h5ewxDR@ TW`TdG# 1 =T^}`) :38;FyL-Q aќ5u7w? rdžPl.uC H(졸\}4IGR% -EG5h"Α^I)P^]d/?zTS Hv* EG5h"Α^I)P^]d/?zTS Hv* EG5h"Α^I)P^]d/?zTS Hv* EG5h"Α^I)P^]d/?zTS Hv* EG5h"Α^I)P^]d/?zTS Hv* EG5h"Α^I)P^]d/?zTS Hv* EG5h7ݴpgǎr?/o;IENDB`PK;7n"{Њ88-Pictures/1000000000000265000000CD02DE9EA9.pngPNG  IHDRev=sRGBgAMA a cHRMz&u0`:pQ<8IDATx^]]Օ! (ڎ)tRLv"dH()***ahW2JSt'-"KZUJ`%PJ'+O&/]R"o0Ysk{>WGZZ{]~域5w|gtt4p=*^#w[OxzP*ݯL}_~s:'oP@G粒tseA \^愎#йcx#=e-eI?=mx,_#&^Z58eX mxY[UÌx)^ڗ*^bu/b%1ecY)fKIj\)x8Vx)^擠/ :mK24>x)^6^t# ^$5K5®&RL&)K%^zu8~KRH/K=x)^/KBc8'.# ^uՒ)$%K<xYxQ/-]/Bӎ xIW/x)^&v%/vIz;pKr3x)^S# ^z<[# ^p~YDNUr# ^JTcJ/:Re1ԸRKqBR'A-^nu,e6i|.RlF|_Cp`az# ^ÖA_(>ݭ[wpٳ{\-^d@=\=A#YX2:c_qwϞ#n^kfQb?9x9XJU#({_0W4Go,,$5q碔wLcy*P5 Xi+Dc%^Z58%c*cO^ g^ EhK/p]@^:. $ KУG4(pda8@x@TdG / Q=*^a5Ҽ վ/]*Ozc;X^^[j0.\q,&&&fgg!%r~`WVV$5༤imfc?{,vDrΝ;»ӗ.]My/KJD} KX`Y@^Ҭju٨q؍Q Ě-vpG`mm'/'''/^(^K2,=8/3[A*aIߜz7^@  =͐Bqt/,>*t:iSIߩS>{Ȅ(93/",31iLz r㌿GK[/Öp奋1KVSF]ں*p֮\fI'[ʞ}0 %;m߶`̀I[lqy Xzf^F@G&–3޺2B=%#2dDSaA\d3S0`$7~/1AYWN^B!]p0+>9 (ʙfCS4Y&4hlՑBfRyY ~jWTQ;-5W5w#O ne0ZZ0c@`ҰаX;wm^N^7`uPΠኅ_iE|;/f%?΢y@ Gsq.2d4*&G- YN^ ?j/gB0,gZ=v쬎 #=̜˵p1#ZNfϜ9* æ;I "f;\v-:{*"Lb%V8OKmͮR,ef/KN&zI Ԏ;<}CF`||o;vt\. ,[B(,QNN^ڞ\+PWlK*i r-&g6R!i{>q KX:aF!x)d{4*Y4/mz-N raa=* Cg k_[yťh9iKy_c<}bzd{ %^VA&HMqffzrF7@k~?c'O>J ~ቡ.gչϣmZiZ߱XeyO>yf7xb*D2/Lh FБsCbJ76^[;C+ANOO/@U!'ww=~|c`a+LAgY>`_u#2*03D1 sA=sKK_D;Kcm^W#Xvpp-'@6pJ,yxZ˼km#12) sbSoz՗]&]d1..ƹre dKKw:.-MmnbL@[\B3YKkSCgl_dn~E列ueĤĿ_YrĪBay˓I x)^^~>1?D*puJ@0>)$dVǎ-a}Nf6;bcݯfŭLЮ6}jlN ^qb}7}DOGGGa?OI~̴CFDٳg&s ՜/ JU3PoAӚ#K+5xΑwwiO'޹}_H, /lefedҗ۳,^6iIX0` z'0mI*+PIG&@Ng'x1Vdo/KeeKLJf̰ҭ0229 $@ 81Фm&a%A|ަJ~t\КpReAzR+/sj\)^6ɑi> N6t N/B'9-F/Ӯ]vx6B۸@'aPpeO~cKf5U _dXi_}d*HVl/c  hu4-#;]DG/=[Ll/[2>k޺+z7OvǟH3=qr}՜*${z|Oc{ }'2+s+>C9 !`pBvrV͙8Ĵ%z1;LĂ1?{ݱc6񲽼D)I | ē "+1+'o /y -$HRc4<0={f9hy-W쟥~KU9&/a2HbhDv4+Iʒ^AhDVV[,z/:H&`Ya9ݕW,dq_cWyR T¿8gB(6/;5gt/yt̫~WIJ{N. vhHI:&܃OW}z`'t-_p*[__v̉(/!0KgbQ8Oh,n=3nV&h;RzAͩS\XIAP*o%QR*k \W:s-0 H: _%Գ DyG]*!IJx śX d!,-ꬴ%y `*c&Ov= :;Mym T١43K d]^4G$%<$+[2ѲŒ)`nzU^LOeFO2fJ%4zJ}%/m*4Cke)9?ɓ'+&jNG', N;KB` e?Z<<+6fz$=л0 |RuiXcmk>5u2g$<;]X7}4G>kkk###Q&MteX9X|bM8MX, Ҩr(Ǟ1F/f-޶m T%TFdaJM5;pA T=Y݅R#X2FfI69/#A b<ߚhV _beX/*2'xAp&cJs9IKbY5/sFuݻBk}4@!=saߐ y`Sa2|x` !f*tXX&,_cyGp8(@J].nZ.']jg<@=xٞǡGO766vog!9#{vUF`# ^Gi`=ŗ-`桍x)^M*^10`CcU~GLⶹT\ռG@/ cc5" 7ؗ,hiF@/KVm'SBQ~~ǎ+^mz# ^zzxvX' <%xyK=CRVyx`ǂ ϏY{^%"-*yۘKXY9F@/sO Ǹ./ %$Q dw;̠L޶@\2>8u# ^Ua//_O(I "ӻy{,jAV2F(=gv6J{jk# ^zz@8^&vGnf %Q=եme-A^" fQHs+'2} 4zP>x9t!hҬE#ã3֫\BxI3~KnI.҄K<3/2p϶`|}eCsҦfe=M_?]?r/Qo2~.uì{/]#xk(m4RmW ÒY\km%tJX^ _ jЅ K<9v6ϗdQW*v:2^q/+*jV# ^%[KO*{p.X}Y*V8G[zluKlXJD# ^r{0loWnuiXRk$?et{Ka_=tm/-02Y5[܋sL񲅏L,^|¶;4T\{`ǘKe1xY5uW3p `dUIL.FG7*:d2#+n'~z>N)59GⓈDtV@ѕ3i* NNa0eNYjK!ģȄ,ffX$d7ڻBpe C`aE in0i'yxIz`zeٳs$UF|j4 +?V;aMF{idVC9ݽTm7usJxN";M$a_”} dz5Bh]SSxGP %f(](D VOwU+`L ˔5G{P DʄŅg81^g%c`$nIAi^l6I+잣 J;xYVՑ  |o0{"srrKR 4R'j)ybӍ87WHjL [;sٔݛUq^`ߜt:wlڂtAXCv :ml亻&w4\zKGe! =*D MJ_^|Br*ey'%%Z,X#K9U %o|Ӵ[ ^J,1 xB: αe#y%d$g߾ox)^q+,8P̢RYDE,_ Ri5:.--"bJhC=TVSJ&5gu8$זxY)Әxi"x?hmRpX.?Af(d( ,{lxLOI.#«_!JT!ׁ9thuaaR%ߛ嵔_&x)^AsDR/oyF(0flٍe;`)^W1ʮ!eFEc2-HBeiKL jt_lUYYq[5^w$sԂ F*0?Ҙ`yyR/?.CS՜~Y2,e=*feK<'/aFm #p}gΜs)!xx)^&zjfڹY2¬Kc!ey`)^e"^ωfEWSuJ)=rY~ G:tӹ [ ONN\-_FdSK!lګS/et'~n/ozKܻ˒t*_QѪud-R%3XU"lfj>@ezϞ(nm\rY=@XR2݉O}ȖS`LvWJ%E' 83o1I_]z;W#^օ'LMNvVV6u?81qTw}}}H_{U Lݹ5cU ֖$iTyD/kp4(\^Z[;f [30 x)^Y<C؞"ݎ|'O&yI +ryA@ԋK (8ŋKlGұَ6:7_ >OxR^˜A>$ F`; c;<^^[ᲈU:b% `xP]hdᐵEhlG1ex߆PnH>[ouii)ϓ\ >򲂰ݭ[wpٳ{\-^d@=\=A#YX2:c_qwϞ#n^kfT,HR񲙼ݕ$ &Z("zz%>iCrw F W\^C~uH吅&>.\.r,[ʱ&1^+@z$%tΜeU~˦ҳB칐(FbnX$OGع>!Z$ă8Wxʴӆ%c*cO^ g^ EhK/p]@^:. $ KУG4(pd&% 7`Y> _H/lPiV蹃ë=Rʷ%c4%47YHʊsq˽,``a%! Q^" Y} ag^,+ Z|AeI K]|͒#(qƒ`W,,d /˪V+/,a i(p4&`Qt9ߚgϣ_[rK2+hF dwb\{vZϩߠYIϾʯȋd][ҋN=.//M9-(jb.|4g~ /ˠvxbP. vZX{,4xzI\^HW4em=Koz'/=`O, XfY,?S{;݅>+8x mQeώ~o"*[is)*3BŜJQ3 x5C K,/̙Pq>>ck>;\ bi>hgT4X&\*P$(Z{fяc5[ CJgZ,YzJ{f#QhafL'?k/ˢT b294/A:FKol;qc%M㮿5`l.͏I+`J ^NT: %%ҠK&٘~)0Isj(J6촸n`8@ "ĽhjOh0)N吘\YYI*^_kp˃~46 ʢK3RD9 XW$A9ĭ;R/ewmT!DKJ;,xY,/{9٩4/IAKW/$M_KR62$}l>ݵOH# .䥽KcF+7RؚԩJxF}5^~:iyi=~ِݵIOMyJ Փ i+\"X! KFmo8iK;LX;K8F"8 c fͱ"̳nOy0wk(֮Sy;_/iV5ֺKM\۬9&r I9.r;p=IDG n%VX !pCbsSE K\QPKwְ/؃d;]סx^b'@u*|5Kz UK鷌X^;bl'VgZp i ^)t!1.<^үb .Jke!4FH$zdpIEe힍68/pݢpӣٌǘA>h Z+^+D ͹ːYJp|MHMvFkfƄKKME2Х, 6PyD#kw(-96U#V*/=mpQ$lQQ B1LJFs-]I[^.@d(_]l[MQ6-wݺzAH&^/WDJ Ki%ib8YhN lĒ1meuQ)sYӈ:⁖O6{RKvBcx^"Qbm?BʐFՐ_Y+Ob[HwϋU#1nEc55ˏxV.^JEyrL^`.Ih5L ȱp@ˡLn`nI/XȔlM6&Kڙ3eRЪaG '/cHt^13].A6Ii6ٔ݊j݊؝`˰BtR #Y*#E񒳛<8+ị_ ȈrRL!.mJ*^mw5e1icRlܫ1# ^z@S# ^p~YDNUr# ^JTcJ/:Re1ԸRKqBR'A-^nu,e6i|.RlF@/ILkRek]M6xLRZJ/['p⥞# ^z44R#!^F+V/Z p_3GxzFF\p!R%kn 8|ƹ?)gd (IENDB`PK;7j2E2E-Pictures/10000000000002340000015DC7C3960A.pngPNG  IHDR4]`[sRGBgAMA a cHRMz&u0`:pQ<DIDATx^mGy#^uN\bN^|$OB^'`ȓp,cj',09RX`SXH#NHED\5*V@8AT#|*Fj򭜿\Lf{vwfvvoٙok9<R@ H lgJ(pڛVơ?!8SNMDe)  N`h^T* 8 NR8'FY쫜*&@6'IpR@ $8( ) U@p') @q NSqW9UL Hl N$(NIp*Qf{5SAR@ $8 NR@ Her'I H)PT\j(VIp) 8 N5b_T1) ) 8 NR8'FLI)P$8I) S@pkžʩbR@ dS@p') @q NSq2۫ RX'IpQ;O)/ٙ#}X NTm^˷7z* 8 NS(*&8 N$8)(NIp*QZaΣyv,Zx 8 N,'YNz S@pk%rTB;s'Ip$IOAq NSqEYNJhs$8 Nd9)(NIp*Q(IS pu'I,'=) 8 N5e9r*ι$8r大8'FYۢ,'YN%9Ap'YN$8(Kx[$˩v8:N$Ie od9\Ipd9rSPT\,mt|e;^ob|"Kϩ<:Nr{>x۫B j.8 NSB8Z.l#zvc9]p*o'Ipyp7'|`~VLO܂/?7_E.D$Ϗ\<˲)Hܾq>؟(8 %\pLp@YN1%8A4DSCĞ{.d""MiNwөS@pp"ӯ?z $0f_qo Dž {@5 XR2giѼsrsv[57־}OszIUx'IpJ'Z?獭 ߸T4fYbaDف??pr(*`nޱ񞛿wQ( 8 NSB8q:c\8<<_fES8~9o/5 H UIIpiٱN 6"o< ڤ9JOQ ?>TrG$8 NrN2W[DNᅡp”rB?X5w U'8o|t:髪C~ug,0a=nUhLo~E NNo`,ï8hٸ\`0Q{!y^l$r1ց'8?yC,wOjMQ@bJ NNE'%đ:wim{fɌ' fӮݻj޿r'Ip N6g˞z$^O@u`q9+m_z$8N*LްN/PIpFM<ci|N RCIp^a-N UJ_U'$8 NpbGzݲg?:*pD'Ip*NLf7r!Y)85v/܆4!~-ÇܦnOpb|R9bX@5j8dȫ6POӻYNfEEX`(!IpNx ۴3n3RGȢX{ᾞpc$8Xud'ۯ j291g*N')JGpm`Ð3-qpZ8Y>$g*\/{= QTTbApt@r@l;Q\ rB6'8 NPB>T ܝgC|TTbApJkC|-' YqX5̋$8C NSr8=J HdU휓NL}{Dp'8 N%@%V')9:8d[3 }"șv"RmOpb|')a'LDrp;v(;{!߻=3BTvJ ^|_$8XuplXp%G8 &.: pj[yǷO*IpK1=[32EC|7֠Ϯ[y{z"*NܽCmOl^Qk08׳5" jtζ~,AyqkUp؄O,K.~#߶COQ ?)AM>=mzipb%|ܸڕ4G,%F̶ʇS+N 83!E'3')62dpB{yoS[54J;ڡCOF ܟ0ǟ`,r7[~cɟP, ':Ыp5\KaM!kB+$r ~b8CPӔFmXmUZpᘛM, Hzǣeg4R?s'lI5:!gaDK7N.l : Wsja"<׉)Ip'4K̿ 8k8j]\70PsN-'.㵓L$$84f'YQOݩ 7VlÜ]49YWO|EZ(%8 Nݺf%8NY֫ r=)l4sN͵n7;*O$tS@p)5Fd(5mS-?rg.uk!cHF7B0a`> NSYg N3o3aNQ8\,%0a{zikՓLlBa=}4zWNNnU$#̔j8^GpA N!@ 8 '[dm߀Lfq.,':p?-3`]6TSVS/ES_Rd r"#0Lfs'[h$[JŭxOÕjUO>r ;m^cIH'枷70`0o7)b 'g Y1l8g?17|/-7X U> N!h&9,ۓ6jj( T "ݵ!u( YḘm a`8Uڐ{j_e[~9ep%o_*iFܫ:<󓬉+*b !+^LLAi%8 NYe%8!R |l'@3bw~jÇaC|3l]!ւ<%(ݭNcepm^CAKpfE+8OH ] 6Qx$Ts#`3cɐPb9y+pQuNa)9%<ŀ!r+B<9@8Yf]48'@R+E$zZN"DNSt87'8pg7WGmD8و"q8KzNŚ0t-w#qx^sn傓?z!8 N=Df< Ӏ@nX2:=7$6kå"8 NSB');gܘx\oփ KcUc30hUKq3L,Wpv34Kp)S2"2{/۹BxeXrC$8 N2*NN0>o{Xҳ؟ݮ=KptV$8Eqe>~d} Nd6M21=”瞋/gpSgfNk ?>O`j $8`~?h 80Hذ<NF2$,+X`U.{HɜDϑruչ.x[xR4Sl(?7֜QzckDd7.,F6_ 9;'``NVWnN>y`{3_$8 N 'N{,B 'GP a6ܕL /+Ip6IpJ5[SMN̎Epr l(j7ޜ?I)s*0ۮ/{LpC&sC&-/7@ F\_9ۼ”Ν,oK7o2>?qPIS>!b|NF Ftn~ p2[osN.0|om3Oj2^p`#O)c ,Ez-  ::8 C~:D7ϋY.:Dg7o!%g8$8a"Ip)6r:NK#u%0ɦ')-2"i,N\š<߳eO=ApZ%COsa<唇RqX/Ewd2E "Zp`#O)TR/],Xޑ#?Crf9H)fgϢ>** r5 8!XQ =Ö(8 Nd% !- 57]s)?aQtIpɺ\:\ s[8 K_ }kCw> (8 NS)pb "d c̈IwJ8%cȄAq#]oXAb2*E]Z]ކK'"&ؽc˟~tNre)PKw s'8`R5v@,Ј.ypO܈|Lz!pSwpe8"'\S8˶֎ @H'Ip*NMBj`  N>Vߐ%sW!$(0$8 NSAQ %#Vx^-=w#;&$8-oK%~N/YNs6C+8EFx N$IS "ml1ELc'IpX>$$)nkSPl$8 N,'YNiA[P46eIJd9jMpB;j7V>$8r)@8}n7Te'd9r޽zwlKC-g[7Ipd9r_N@Ũ7eAr$˩OA]E| EZ۹)N'I,OA`Qlt'IpXx$OYN5!ǂʊXGI#8 N,'YNqQ0׿'T܈68eGd9rj NQ8k5Vn'Ip$˩S8%pWB>dw[b'IpXzG,hECKą.{2}R N$IS QDp08`XOfT򹲜d9OFY=rj`dd|Bn+¯sJIpd9rte'*Ip:>!Oxr崴aҔ Òj,Ipj+_Oໜ0 69ahIphСj6 t[Ή:z\p==NcW{X0kR2MA.sCwe(.IpU g4]ydj$8>}ڙΕPaOs '\/puK'I H 07yyd X'icG Uxt{pME-Gp') o!8 N*Z Ca`mʔ'\>b̛khIsN"/P{'SfA'IQ_z7f6&Z9pB򛒂ऎI H_+@M5dp#CRItg%N:&) ~2q_ӹ~{^IVۼymN>gϞi:\y)R@ ɓ',ع ;*V3glڴiǎ=Xc+++ \!r 4ɨ3~fS|MȠӌ7we(.zӀ<#p,D3PpyR}Q^~5 8A|#}K(NUL ,T~bc p0J+V">SD1ȡ4 Z~ޝ&F:ն/Cpjΐ)pرix0NS p͹dZIf *kbp #ƸMp*JRFFu[[[EPץ'\5u߸u,_N5WRiGW>xSi\q['N5V RSAgONPY?ojS HFn}:a1fMb5OښA4"*eLX45@j.|AJւSNUXAsiw6C.8RRH "Uv36j$Vr)H4hD8nwKkH͟µRJ)P ꚰ&fN?6C)P(% Fs[ 3[8igIp QIi@BM-͉'i9%iOT"% `ЕM',99a=U N=lIu T؉198ߜ8εg')NQ.3T1Ў9kǒtɓ3% ND)3IpBtX]]}{glmkzڊf簸[pCWv ?tv"-\pj)XMio$8o!a 8p"jS+%OSL̶ '|_%G0$Tआ.Z+(2U2aG^^ jiIn$8-J |>np¦D!$S+Vr5'OS'L;aS\s*:͟-D Wr[ܲ˯*t O[)Ip<0 'Xȱ}Wz/rvą~S\)xӕh'` 1 9VV>3ozӁ}DeƝ`M?. ?4c]\Tm\||Ɓ NM a~C^q[u0ÇqKIZaCb>}~^-~B;H-(}>'45y6 6% |:z̍7"0Tja%q"u6o^;6kFtTՅ '_JxҖlq绦*@$*+ES Ugnʇ/5FrZ"WSpLG(.ES UgnF'G{>ةTc42lJqgN>=)EP oyˡ9=e6%zT0edXQjD{h NچͪĕXp1?xPVJ*Ɠ̦kr1g[6Csj,CP`tpN|,=EܻHٳqUn"\v07 Q&Urc]_as%tpyb!rew1CtMZY6n}rkyZ R%Q`p7 b fmTHLA} "&i 2|)E/ N9۞ʪxd.=_ܷH! BG^]9_;7B}񴡻Y];*8?JYSI:' hE[?Xߢ%v{C-xkSەx{R{҅~ȴts/_-qE@IÓaLo 2DpT𦥔* 8ޛ#KD;QAzX<3ECAX+8.2Dإi_ cQ))Q\iN czz q,`ҽkfMĺy_ _ [rZڮ` N!7)JQ/+Fn=q^%{[g\A׉NjŭnV"C]&S DX1QXՀO^ׅSB )&p[fV {#+%SMBѪoxv7)>rd:Y_i]kT !blNO`]NT 'FBܸfY,ip bS:EtAZЂSC4+ 8-CCxz"vaĕΔ|vgNλ1z=R`VSu;p8`Dу# .I#yx!Gբ yhcX7̈́wd8y޵a@p:>J07)V8yo@;v&H jviюp R`]RaCRN^ '(*Ԓ΅M6f̘́`BZBim~gSNx?(eN%ad/wnʧ1JcuS}S P@p gپ}װQǏm Űng>s|:%FqD>3TG};z]p*UZ) 8 Lt\+n^>R+UC/EyKz 4+ 8CQlܩE/e;@!C[1[-]V%1ZURpjծP7OsDn+gq3lh[=]SeUAWGSF* 87ש= '{: aJV5:+RS[Efz+_[MՐdByL/{٫_R5Ґtw"ܜ /Otְۉ|)yS+ԭ]鬲:l 3O0sq (8unZ: n"b( 8PQy 4PR SdA NȮB@:t*| NVIR SUHb+{)[)*/S UPi@Ut4hR*#)PSA觀O?-S@p*B:S@ N%-T)T)#Q@pɍR5@/5p/{ٶ'|R7_ P | DIENDB`PK;7*%%-Pictures/10000000000001B10000009165212078.pngPNG  IHDRidsRGBgAMA a cHRMz&u0`:pQ<%IDATx^_l՝ǽB,T4)ؤ,-6a/RCKt(8M & Bi2҂xҪUԗyX$?^%}CZ۲dfܹw5Μ9s3sW_}5|駧N>y嘟K  l3y׮"f&} Fރz}imm-gYLpHOx;;H";3D6*N~<S@b;A38dS]v #-&N%V,IPp-_x<%#A!J"b y;ĻHi4p N@ SF<χ%cGxpӐ1Z[Ɗt󩧖WWWc{J.x$0ByK{N s<S@lxɟvgxcWfgNh+WV>o™e;Q:tIESu #s=DFv,ѳwݵ/g,F}HNQ8կUkW7z"v&nxOJ0^Y_) c߰(&N|:T/!jKn*Y Q1E'6&Y^b j>VZ#E+)RsϽ/15W_=I& s.FvdSJ5Ustll=!'c,(&شM,hӭ0љ-Q(AQBoBc B1M5?Z2{GG|zf: {_WkJ(?빔L@ ۆPcyyfvv-J"(}|m;!DNX{CDt9>hko91Я9ZU;ZL(}Mu@)$ #JH*;:_O"qlun̙žDhFqIX23DȘ$ NFgbLkS8& Pa&mFks^Gx{;hbU}mP.IԵO?=oq}YγgW~zy U]#LqadY@'31Z&&P 6&hxުvU( ĄLיHf jn4"9,Z:UaOha QeKDdhA^z1?]p0{ߛu{6h4dߤS:lhHXG|ZݓcRnA ht6AIx~NQbc,RX^}J+_v]XlNFgbLXȕV85!t Ia}Wk͗th%`h4 A7SNdE牉rƱwP_'NNȎdt&DG!W 1V#J#&6 XD;a!(Zp@zJeP &B8/kQY ~!~^bWFsl&@GP#Z2{)2*@BGf"H9ڽ6FTd,??ܹ-G8)Tp3&t? /09,%Ygw9{ZkgfgbP- hc:aV&T*jDrD^NO Y^'L,Xes}}TiNƊ(q~J"f 6ǹYD i&RFLXqA-Ư0ޒ>&hʊ6 eqr,i+c6bvˉo6_'cELD uLCu"t4Ki=14"&k=K*Z]~3j&j6An~gX3љIjg~J? @<zġ\KAUt)EwF}rk 'dbHCgbӱ>>OjOnӟ42`5k"ViF3љ McǎI&V݁QܥL$3mgRlFkOOOX3DbV`b2uQf jNA W)_H`T2AW6YkCEd31Is&:ɢߋp&BF¨3P}&͠V%V,-<2™% :ӕ(;E1ëe "3oܟ{bVs7˶66i0P IT[E_Kfk" g%'&&ޖnqxn33{8Xb|4-[| MKv3D"*b $>kkk#=j%.m).,6k:r2Zpߔ0XX\&J6,ɓȑ.B:/X};,L%ʺw:LdοEhT2\',lVKLAYX1\ ?e}?n+^M;/L,K':ldbh*KQtbXc"FgwWgbvUP)fYjz%dlp z[pкNgj^"]L777omL͵qo@LlVjB=ьe)tR'ⶳ 7+`3lLgb@d2Q5 蒜q@UbhV})GX̹*6hX=ϝ9Y)cjqǝ)da;V(2]E͘5DZt8wnj; >zRzHRm mSC/EI;E%DJ9=Mf V!;oD(011WcolS;qb饂Xۮ̆U"PhXk kpЖ j*Chhk~C=dB^E^Ȫ֞k4M)GpT3O{ Q40$1H"O v7`m~z"1?ϟaqnؕ^Ca7X"M!fbh'M™izGrna 68ʥh5M D[o\I|+vmkʇ/vr KkTa)Cgb:LLd&ef̆\xq!Tj>>Xƈ )Ԧ`]XM .D(ǎJqptwXЙLg%@m Fb0ĥ)k|9q*SO,zdB:*)"~CmDC(3ёQC!t_U,uLt&Qw\*dڟEٱԎd۪*s h=4|'M5 &* D~ڡC7h[ ס3љ*LCGLYM1_ l*¯FJ('̿WXmS9d`_zBLܻw.%tKDhuCg3U&6U@DWV]}1=z#++𗳔d7|;>+l-\ŧjס3љL,$Ycvv"A}fB&g _}bEMʬ7Izͽ{b\Dg3&=:^r`'_xC{]g:qjj'sˮDgbLzXbeGE(,E/q}hU̎\2֨Χ^>{v /ЙLt&DҎNOϕ|&^|c`DTEj1Cd >yLCD~ۃcO\Dg3e&8ELKLo1`)tC+j4 $%D\Dg3e&2˱"P<_&8ul9LD=(͊ gZrMawojV?u:֘T! yA&JI$ 1Ko-剉j}LkiruLt&:[c NB 6BG#r&j(ᰞMᇛa@; *:t&:1quu˂KN=K4DmÁP*`?yՀ{'C&ЙLt&JG&G_u@M,}:t&:19>L+K[ʤLߺDgb Lzv_/(^WC2}:t&:YEaZmjdcc{kAxlfX+LD{e~y״WV?pt!\5-?%l[8eP\Dgb 5;;NtF*M[{t8z2uLt&&/b$pxS$07WYԑs=DFv@QIi'UV%2DgYa+R e|'S驮LEk>yk֌ۧ^siifstTpDM $L+|dJyxU6Ê,LnMOWvǽ0 xkkkSSZ}Xj GzL3u%yxdF\+="m2'N2uSQoβ3/`5$G ))Lt&&21--P^1P2*$kȜ??G/🎎ތKbHYqLT6L_ʐhAj_ܮ*a0]-1Y}2hܚ $vΗi$3љ}ň?Jxv(@m/$@6N/,Z|9b^;2!#g5!;M|>ʠCM TPe-1136.=vOLt&mnn( ͋W R`͠ :7R;C}hjjIJ򤖲Ik%L`:sbHf21~%&fՇ&O T-n+4A%M 5Zxg]tk$F 3%dN0QٽĸN(Rx!3Dtg8W7%?(ٟ5 ,̐[,afٴh%25'X0~ %hU#$I%Uj)zb#)MRlNYz‘UMΡ|hOR.HeV0a9Q̉",ayKN?tg$o@DovpԪE2e=LnkfGxW]C'Hybbk{C.H.Aw҉%,7@Tew_ \.$dbYg~!Q>\H cr)(Y hK`fׄ`FOi $F:vׂ|D |8Y5i1 {&J-Wo_?_wŋS$ {]P>4} g>/kwVc9Ve aWcsWqtnbiOcc-7'Í^UON&QEQEQEQEQEQEQEQEQEQEQEQEW?_x[d׋Gx_H"]O:` ֡|]xoŚ%ϟ6U'l+b-/Xt{n嵞' A(gG7 iuquo Q]DIʇrM}8 yT߳ioe侵{6̊!+Jc_{o ĺFowqqam$RzBwgSla᳂?s'bl f]_$0zum"O,=K4uH 3yȍ'9_S\x_2~: O㞳6ڌZϬXJ__~wCέbF:]'$ֿ>OYg}.Գ9- m5oGy\כd(it_ʿVue)ӃRd(Գ?2j!ujN ' @HO!\Ѓ@Q@Q@Ix5.seQ!C\DOQ'sF @(Ӊ'f *?3TQEWq.5~*ӭC.5_X*Wo2U( <+IxUXf$e$ ӑ_/g4dN!u#t+_k$~k4[c0=I+M~ {e֣4t!y_s@A_z޻XO4芑;e\}E} /j=R S`x6UkzͤsS?˜pFbm_JClmiӢwӍq]\=0AFEPԴ\?__#ߴgnuGmC  Ok7v\tF k'nlI+W7mk?l &ψ{b,KMP|{Gilyh{]S'Ÿ)wٳuF{/%G$ Ox#dp76Ml׺N}k匲}mӿLߵWo]=?Y|ZDҼ7>? x]n>"6[Ԯt_9wm6k*Zm/)v?{;'&:\?!|$< 5 >Lְ΋ vVqq"4c)؏ۚ4?>8!ϋ^~ӟOx/o>(|>񮑤̶nkT7vwjKm_Ji?o ~wO BUֱ/QYxQ5Nx S `JQE5Eܜ'?ҿȣ d7?∑yZp県=z|¨BCeܑkx:1{R 㯷>R/Aʖ hPryڝE^ҵ;*G{iVDdb 0 >TxEa uD7?.5;W5g9 =½Gŝs?Z3G#'ʤi|n?ik5[{ܥ|_f~@/`??[;zZk91$?x?쇽}_Jy^?Wa_eP\uXꖖBx ?y+iO^X~wvsNcslÒ}k_ľ!_Ýn),(~_Y߀~&nVP;]ˠa9|dl-o-7(xcqs0[kU|K]NJ2=0|kIܒXSwßtw#}&0?Ÿt%ݨIP>҇{Z:q-}ϥL QYW=FQ;+'a{qʾ[ѿO&spM2<˻K+]K"\3GHh=c87Fog5E< 9cZ ?~6hz߅5庁$ n~u  [^ CFn-Z0C6 {346ֹr cJU(=?Z?fEf}нVCItT3m,tً߈A5vɧ\ _n2zGˣ_xZtwHC\$ހ+U?]?Hu ?I$qI*G"O@f_; #CLP?(]?51_7w7S*jvjֳ] <@nz5|$_5{KReh%Y@7k'x7Z4}VkKS̪?vqҿғ |KK^5ogb xJk;Uԭ(-ydv T9$ր9:7π^/׭1O"2  ok c{_5Iu gx8爰d8_3_ΫrJ8>t]3 P ſ~;P/=Vlhh{0ڿ?ty7W9R6[''[U+}:[V(aFww!BI$*ʱNLWgwMm&tF Nlq@9[ :^i߉t{n̏2FF ~w2K5@$rW߶C]xR63j7M %Իv_h~Zxi'5E'?WAm?]ERB鸑RҾZKi/T[B/0HǙ1%ֹL=ԇBz>?P ??_`ĺUYf2 9_Rxc /x+heJʣ'>'@zt s.߮H~.Ok T?_0r ?XԴ.6ki^'R!AJ:׏%oك$ָ$-RdcT3W;!DZ4b{|2ZeYќbr_+Ϧym#4,0*A W7n/֣Zm>7hF p1@.U񛣇_L? _}{~+..ڍ'q,n-} ^gCx2IHUְs_ѿuĖ<$LCjr8<\L_  ළ/Mdk^^Mw3x1bMnNy6Ju?? e(t'i}ƿ`|@иR<%9r7~>T𗈬ṆX} W~m3ƿ;4DR8 /$Ȑ; $??tb.0HTq^=n|wI"tiv]@[ <:`Oi|5Mks"2ZLɵv D?3V7(fXXd,7H!nO}96ok4".If^~?,cpZNR y𝶒"xs1W_&)i}hļitFug6ʞc9@.y-o`hd!`kMwu|G4rpCy.oej h\LcT9U4X >À$e# G-Fh wpsp:{|?VtajCR9U%+c|98ܗ8<<BAk:k[.9aX"B { 2޻1x Ev=Ip'&^0>qҾc3>xhE:UIE\|gkt5K g+x6/~45:֢˞P-O3 Ehܟ/g85yzV' O :e8(>llmmRUMkW4FU&Gv $ztWMVO*oz^ү-f-xV870Tu_Q=ZhO0;3zW?⯍Wjͳ~Z<ޟʾ. O$H;1.ziaYXBj*YA)JAk~ŚUoBӚN&d̪N:`cxWsⳚ@wt{?4I5GGŴ *~|>TX<-%͊I%=zd/>;y (%ŬnBt^&-F}3[h&!z8:c -?NiI=}j%/+޼{YH#bG@q__N?O_G ]7pimZ-j-c5:X_Aw Ko*ʌAX0#€?W Sߴ ]^j҅;9ֿD*_5f]CeV,1Gژ ƿOhXPO,Z<1{mS1\E"E3'˵J8{Y5+Jgkv,ŝg'$uU̿fݷlicp?@9{_Zoi^"yn/aTdÀ}ekw.Dx,+Y>6y/WjuOI% Š:~TEPEPEP Ѽ|zxlĝ7zvW0HWbpU bᖙ,b)O c[L|a>@/P>_c>>>>!xR;]_]M;<]ُ'@>4￳W< 6-223Ǟ;||# i [#6X>^u_ dVρ[Jc&f?]F%,"tq@)|U7g=֏smtbs,{ FczY@$rY%7i* kL~W?gkuhF 0JlrIP:t~9@T7\})ÀP_Nǚ\ǏĤly7(+* +o֞zܦir蟳_ H?rKx2Wo_ ۳U1 E5 $q#wT-d2K <~W5lxKOs^Ci;*X؀>y?0֬< _ZO&lʤ2krYK`/\?`x%ν{xr+x^mp[xVl_0P\_Z'?|U]L {0m?P?8s_5-ͱk{#rQE7??俎:>sLyN'o%{WX[MgksܻHde9SR[nv"x;U%|~`~nZPܫu,c0=k|JէO#H<)Xb料n-C#1 (';=+W\va=.4n2P;ңU* }0֕K 93ʺ1CNxkt2r_15FzW*dhQ HڄsߚA;x)4I*0U#wPɠk܁~ϥMgX N?ѿ¿SYu ser1l˫`ըLfGY&}򨱖#84$zb`wܟҀ?o6:^<L7"T zQ i6>[FoenD:i_ ;%` "T=^+;4 c!-r0c^zt &Pjogol,Z '8GHO~pU蟳$y4kPD _Z@ѼelڍVj+0G}0復u0G8}hٿgp?m=?_U)?el$:gLpDg>4 5VѼ}uKns<=Oҿ'=)}a[p_"̓g7~TQ 8z"* IZCOX"`IǾ+օĐ JKju ieM~!RhW*W ?ࢿ7‡+:HUp| / 3Km*A9cFA1؃Ҁ?v|?#S7F< w?5 &-:/kw $Y_p=Ƞׅ5T5+y I܌ ?JWo_5 &[}*P] )֕c 1_8#4QEWjk2Ӊݎiֿ/+/2xsec q/soss[1.qֽfݿ'WſGgyaȰl<5Z>=?-^%¶wZ0Z4H& ;W?q@n~CWz> gx@܅x+Z k[(tb#ۜ|+P~EiW,//T L rYOzS- !\HX;ckV jw-HO+*5;翾%f=v''޳$Rh)}zƮnrNcRM'^&ubG`&Sh45@ntB 9+# =Eg+ -M>|=z|ыle#`c~Ì84᜾=xoU6SXɱBT:s_~ٿ 62ޣi7퍦ډQ,]iΙw 2 #t%YJ ~~TmtOgn1w)@FSdPnp/[>= ayԅܝ%xV)hmɕe*rC{G%x6qSvgrI$ɠ3TmKP,33s>Pt遊n<?\0j|pcTW'~ i֓L̑IDAG|>iKcnxsI׵ .&kaUE$ڀ??6NJ7:l]G?c$ ȸ#޿ԯv+:U<0Dk;s;?x N֭ydy!vWYzWR0 (]c}y>_%u V[(DŽ RH&1fUrgW:;A<Idc1lc߲yt77grͺ"I'>fVKkO 7QHwEmh=x35+2[7ڍ!'W2& +B1)%TZn?!ouZ-bF w|rS>5 :)fxm$G k<'kz伵F0DV ާoOxQpʍ+0999h7-̟ Omj6 m4C$w(f 0G+'_:mo#-`6 izާ NA7c P0yS_|}o myIq9AC<aa !խIP-axhe37&園I0Eܟz-Ϳ%|4x66_M5 m_~PEPEP/|;f6ul:kGK$H~+.<&c]:դ2?+&ĝo h,N`)fQOa@âAkZ{ [ڕ4lQ\>FdbpV?nω?i {%5kr]VU*>oI?3g閻BJ8+_/MGSTt-V5{$̊MrNcggڈoŦ[,DHs4:# 1 x>r?O}7IxG"-,ng ܑ3uU9Wߴ|oO6W0IYF7_ i+ot}R;[$)SYo!?_[DQ?n--shY@>W` z޾M^y7RB iIq>"|`mj÷jvr"N%qP?&5഼ hhÂ~=kRKA2>^8?_ 14XP0C$(5G hxmYm%ksuǡG )r+?_OoگN>ƯŲ \FkjomoL//& dl@@>WGo~-u*K{IRT6(Ru6R4wVW:I :EUH摂,z@!Z6!d"^i\c'ں__^+vsE=J"hɎicᕁ~h/xSRψ--eWF^{#_o-|/B̷+|Y*=@7; _οisQ<1\-jX㕑Y,%HVAG}Mx^̋#Ke4J|q@Z7z-t ٤`DI?@kѵ (kKmUFs ҼACIyA4]@!}amm c/7^gy:K(墄P߭Ī𱍗 ) P+ţxzt @0GN(,'_#Shwrv"'_؇kA8-[},Qo|q>xL3+"vw[Ɏ}cVoR_/Ŷ5־%xPOqw!fs<ֿ*f5,26me=hη`ο7܏GA:7Wߡ:} )gD@^ }xDF%͔*b@X@1h;29띃ljY\JGҞks[$kP}PF<vR1tūy.<*KL$ָ) g/$`Ck/Rq@w.eWF$II'W9bN? kRd{1u43,rr)BI,y"BbH,ies}4vQYps~$?h^u_.[IYQ.:fjc61N XiRI3NwOG?~thV0][ď2[Į]FrAPgxOLh ܑ"=G_UL P:R9UTS#b?|kK$B|/nXm5 <3u]0`NrzmoeV}:{m'Hx;FpH~>tPO &5ox~L7D-eu @1r֏_跐i2\;#SAֽgƿO Z!2;RAR Rjm崨~e }޹+ lV#fث0:WV2|d;sxyw+JR%ßD=bV 2BH玛=~~R5&5yU[wgv,ĜI$? f?ul<9mZuPRf_zBU9xo7ux"ْX?-X෉UTRxs_g_񞯠܍*K=ؒ+\c<gOsiZ YUebkS?`+@ѭ $yc5rX/\7W ,Icao UPWP`qPEPEPFx5~xsF"cqrpS^kne5s$8E rON ~h|{~'Yb%]Ə #Rm;q#H|#bIy>WK5ދe"bDq9q~7wg>%@W>j(y{\֡I5.B P~_L_?ޗVIbesֿK" H#DTp8ҿ, -xA?'oS[?3E~K^`eXA=jV8z׃x 0meS<'< _C5Il+8nJ( ?fOZ$XQNqNMu>+7ź,L(N20=E{_ad_X ;No6d> ]D6&)L fTLJ! ܠs/\] i4,1xEQ<_LS_ MLm+db[HQcB0>tUetqe9cgV{N%M{xlrTZ"?SmZ?h >}w_P3AQB Hp8/χ h쩫]SQH4BA;0mc]f\ye3>L1Wn55⸵@Z fFI0Mi6`P{QU}~K Sαnt߂?:퟈;{wxf-cGNnfE< (-ݨp70' O'KO_]fᦕ"\i~ҢqG'+^l$~`W X_W7acUYZuv9,mkd+x#5^Q@N+7h~ CIW:tX<'᫻'Zm]Xgyd7??V}hDDDl6w-Wg:272 #k^?G$,#]س$8NHq_٧mJ_6JN929Ǡ+75OxLY.n/nR$forֿw o7goksymophJ6 +XPfm-T[hDJ Y 6 R|YO=ƑPx3 ' ֿ~)fjZxcKKw[,źW};>-i|?KyUY"G0zWg__+]:EV$`|"*3ҽ:QES4J@ ֟Ex7_o|Q:sk Y=|/fmVG_hs۞+e^h? di.3E_o=Zi%ؐ_qQ@OٿF-:h#ERQ\^*,rZȪ0A8x@ JUA Z((z yߌ~x#6[xBIy9;w-z5k c6M[h5 }rS޿>>?|e}u{6veX h6[PW5Ӗ.ƽꆾU?O.$T8< _7gR[[xWJTԡJ;~|:QE_KDh6ҽ>mXYK[H P0Qp?ojߩuQEQEQE|E8|֤sZ 29S_@/Z98V[o*7"/}GA\ Xۻ,cu_ ߌv>O-S<~ZH+;0A9X)Ư@ϒҀ?-̥_7O\?Dss'W~ҷú##gֿPɪiX.$r@ɜ [|NIky=?,6$27 rSmm\u\_> E}v c2ր?m/OĽ(^\cR?v0_`PTr?4{-:Y T"KاZUwiy!5U8~~4ْXxc:auw&C$ ĜS_CW|3=>@Z 8jz=QEQEQEQEQEQEfjm+$u+k ?Z֯|R,3Lr~E-x7O~-K^&-!g$ՔPRx[+Ti!%B(I!XI8ǯs_ ںֵ}o t \\6`=WjwVm bXDVi `r:PQPǵli^$4WiZ)0ӧ#Ҿаz~Kl ﷍:zrO"?-*\[WvM[9bP= ~7? ^6n#mmv]_CWh|S"FmHll"$T8O?y)|:<9cOF6Gx 6,r_X\ ù}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ eWe bM"Ms%l2Q@ Ab=.?ݶ.xHz3EdMs-?& i E~xF y^1kV>jp$Q@D @zm1-[[1(68mkxY Hr&?Š(^#^G#?¶-46m%L}0(4((((((()P}jp֐\IW]¼/H,9?(8_ؓx#}:-{> |6"-(ҠmGHH <314:gu%6<EŸ D?ܯN+E-(-!@Vj( Py(((((((((((((((((((PK;7 layout-cache=JAØ\Ә\tAZSY[+B^@b#6v"m,,`!6Nؙ]؟afwkű{K;14[[ˢ7)ܶϑj(qq6I'|M#ק#iUљd'Mk7>ȈϪykM^YüƧ)Xve[z]?¯ŋ1rv(/!SD4HUQfۘL1[eeVY1PKPK;7 content.xml}rH} ׶LZ/ԘRVMڒrgW[h _$AADuWV<<#>w'kt[F]ӳlwCodbhNݰizni7w5"߽H`."4/uSj .~%WNYc~>mSϒq7ӖOEƶTWӜxv>kpqn/hyFmv7&،-"a,M/ V-iH҇mUh>~a֐j4-,O 1g/,qzz 위 sr 7?%ϋ ۦXe0ykybR\orkoW[1c{_ vh?h d!^x~6h.?'w2r7ԥ McAWK;vIu06Xٟ.6SWsv 䗗6ph$= U޻U.`hf׉mVoTifZtn&rR>m#3~ R֦uA|2b&oD{G3GE|K6~sAk-aZ͔6L<~1"TqI(n#|F(w7=7>簾k/~He"0U$zAŸgdsj׫)q:6{oH)zFQ]UTR{jrXR9JaURjҥu jRuJv5q?S5SUטJ6sǢzҝqRA;0FϷA zzrg"w~Ʌռ3Id8$>b{bd#/dgWiՏ!/~O"}4b~̺Zbk=IC!|ޒS~;P}P7`R%؃H쁊՗[K,JaU{KR9yPuƞRxZ7*O-/&Z閭%| X֊SH0"q>xPJ+{N4jp4h _KXI-o%Y'eYo1&ّwgoÓv(wk9}%)dӱ>5M[.hnЗ#p|%ZʯO;gU$t/P?vS[W9=23L)^T9\U:Wké͍:6Sىfz\RjjٙtI>QG-ВouxuT' k0-!]4h21ԋbRd+R6GBpG,uZ7P_bhzͧy4"4l1iuQ$ddwG χ/;!muϻad̽FPa} z5VA]g诌3dOq g >jQ|?%06q84 >Yȃ=d_}a: CYPػ_Y{97 Ϋx}^u[Ѡx{}^NUy?^bWye7aϫ^K {u~ o^^W@ 1k3k2^`zͲNi:mX a6ӆJkQg85ΨqF335ΨqF3jQg8g85ΨqF3jQg85ΨqF3jQQ3jQg85ΨqƁp>Y~G\?MG{\jOGs`ѳ689~>{zIGSltĻo6(t W4Ne8y_t,No"5X`Q&I4 X_Q6rz% STz4jQ#iHF5QE *jPQTԠ5(*15AE *jPQTԠ8@E:MzAl.&n=kKgD]Т]ZvpȪEc)%+^88Q~ cءݻ,Q%3˵:λw_.f,Ë4W$ͮ߿d1MYCI\sp{$`Y`BqhtzfԞBz"Z,Kb9R;̧ 6ȧAQhp}nn럋iC< E\ f]%]Zz'XLH^h rOڍgFsLx/<@cx! ?~X(wډyN  pF\7! nE'ڷd]h)J3_b[+ΰ5C{]th=]d}x "2:JƯ_n<xhk_.z x659q'hhnlݺʼk|o:&2a:8fZپ+{WcGNЧtI ¼zp1LkD#y%)CR1'?tY5U 028 SΊ:7_x.t?SGL}z܏O_ӁփZ>~￾QZ7/(J՜7Ni َ-= 4SZsFV%!>GNh/@eɛjlwx 8 S=JPdʱ"8$ "} (UQuXR_D#m!k01&F;;Ӫ(!g%h~ mA'L6R^ nH_<#4ɉۗݖ_oKmXJܾ$Gη0j\>̨˂فfZZiAT!TFĞ6Lm/lZ)h_CW(޶E ^oAs ŧo'0 pz 3"{uZG#t?"^YbYa'Ds~D2:BO %QPk:@$|^OJ`}҂h (|pw^N}OV8{@2$ ܃ٌC~JWl(씕x6(Ɯ#4aAe۴/ǧًӜ%IZȱ@[NUo[S$.fRkdC,{pB/VMxnjT*;*Q^dS5VofwGE N+Z717E}3/4  tM"[ʑc);⮴ !+(ͥ&> M,4xE- AzKIPg@cI np]}x һ%tѾ4Oxu#xΗr; IT{-i n@^a6Tw3|K܂QL[\Kh]­v 1XD]D[S;"g)<!\:@A ! *R{sX]9L."Z‹<&E{[8hl_Roʕ"3o+>׶tNzsk[cp{0z]W$,x}ԒIGy8漴܌ X%w#( RV;Zq&1`otw`:0'r"*AOyK7Vh?cFͱw sX< l vf|Rll (ܚuSڗzK{/Hvz7,V&o6t;A^gBҜYJ 3^b2IXq\xMm0) Bk%lAM;J/2^XOB y^^|)QﺧNꭠz*K\ŵ/˳L|$HdED|ۋ)\[L3$Y۠j bQAb-nO4cBM|K7Yԁg>R#;q OsCR|N>Yo #Qi6z<߼7F[1a\P vhhWdUb?Nr=H1J!0(2Ey݇Y{!(#&e&:ľFlTui8L5տ($fIx#L$ }*`9-BpFC2oT r?דpМ L@Cfi̴I hLI 5 !\T ]G:%79-l N +G.X#f&2 c:1S7eŚB^qLcJ]k%!6rs#E'* m`7=T |/4EeLSjlRrŢi7_.ET,E 8֡+$Z36wMcÚt;cxZ!Ӕ` g&զaQJ"tȳܼQyu[\7ƮⴼM{}J] $[ڗ[&蜛u_#U&+Hvtp wQkD rtURi5cO6Bx63pq܁B:}~XooCVPRz@}x5=+UD*,G"p0^ &w4ͺuH}SE,F`|v3nDb%i;H$]]lFz*rJSپq2o}e_-UD]n!2 .h<+[ ^ ҢhWbF/a,}I4;cӱel&|)^GnTh(kJ<' iD/7 X&ެXl9s #}uWA_W([JHxkVĔ#F0.蓸ԋg(1["zfA̠O rN9ejʮ%JʯSIఊh jb坕xd,۸x!un+e.܎nF*9!ovfZWf_Й6Fke/OapUglogKO_>|Wu~Σ X%Q+[$q!:dp/ ˬ( m H.z, 1.Yy8.0 6LZFrHAN2zك8!6J Fk5lU@/z OOo& o+)}EnT/tcbye܎qοSJ`BD]ւ+,,嵤biTHa%~2~F7o)'}MQ ve 7s"B&+ #SYu{NK*a Qr. "jcSH megjpWەj[ ac&@^R%B: T* YʄܜiGLIȁӢ&^I'j %5y^q"I*P-4 p23Kg˞wz 0"r7ȞG2z,8/@9LT1c}'}+,vVx%JPphIeyَŹfpj Wہt۱ -!>s%Y(M\>zd_bU,a~~e:kzGZ_w/qpfVT6H"c^@x.CLlNJdz5@H1'1śx$ڧT;1NRf *f)Ak[рaޥ-<:@\ɜ=o$lŞD2ZY.buC.{{e)qDP<@ETTUtFcZ乡FT|t]##Ze1vyWUÕ75>gEbXF* (XqSf(Y!Ik"LIRٷ _;!8IEnσ/wCwI}p=U+IҌ~Mv fCFn@, sɓg[l8,@$<"<Av%ަ:f4׌mffȠ$TL3䎵d6H} 7 4ΏzֳR+9Ԥ0r;;c qfTRwMOIzBFpHd^2DdʚK7e Yv >,q&$*xݦ7Gf6VEM@d6?0Ħ%:EQޱ43j>GEⅯG4ӦVp0KG"34NSxk޾8-x(GOƄ \:tjt2a|?Aq1v/ `6`tkECq=e=骚cύ9o;=umǃ۩C.@]zŢO4s؎~ک`T CS @ɓB4F塬O⃜UdȣN=윴D,([/%rg27N*;q}0T%q̈cH%gkLC((*G[T䌣Y|}|`FyQ}dժԶѐggIV0+ X0BeW$QR^Jnj$ ɖ0\\PZ?mKڍ P)\GS@BR' ;(R (1EnωR= J @Dn#TJ2}% p<|%Q>, LO'1Df 83Ǭy]/PYCDQ b>1$xPA&kyfk:#4 'U/W)Wu!ڂ[D/2ٗbZ)T)ZT ![">!1dU)ڙxJ]8ֻd )! -r̓Ḇ8zՍi:NlՅ=/& 31ڡbUA W$t=Zـuk裪NirzS e]yFhEc}@X}E!]:oyU4`T2dɼ /dTmU8X2-V_c]ÖoՅlω?ajoW6mh{96fx+&8œOXH3ԗ%wD1b|/jƤ*WI+51!JgYaEҋʉZZMg,oO`Z!4J'v+g˰Q!0TvRސg<[˾ qfﴶ/٨"T-Yg}| 4;F")&X+\BKy)ro.ꪴ1>/' agGptav1[|^]Ysx|"x˥a:PNY? fW,'S^]r2`A`S|3gR]Y֋ F&ZLL _bW/5vHWPvg>s-OR[B'Ss%Uh]Ѧt^j0bMy%yޞۙMlvYqP?(xP\ EZ%FUNIszT>sqGkS}}6.(XMK 8J&b+rv̜Jh?޾җ*0!&^wDC?b2BVi1bVi[+ z9'{n{`V6444ɻo./'5d=0haaahm%%IIM)548q|(xęԥOIxvJL>xD;UE2ϯVgֲC5#Iygv&PȟGL9ЉgQVQ=3dNlj|ť? TPł}+VUX~KT_pWVBh]ROH٭m?ŻT( ٺ?ك[Q1d~r(aAN@E(Rٜ.)v'Er=ʦ0PdFԧz`>;6MC9y"7N2Ms_iU, p1e\'L?b=UȠ,IMBe4uMǏ7%0TN'~vᑭa"z[1Ė?!6}X15/w^+e. ;dQauY0/H)G&sq@)a:HcڟkIm0`3^؜ZXYjr?} vDj$Q:×Dlylkqw8Cg"u/~Ob<" \i@(\ouf uEH]S4_k{GAy/R|p&B,%!b٤f%Z꿲@6C}9.$_y쬉$C,qqGk{X` |>Ah,`cˇj3ԗ?kEjh5Mh-mC W&mضC';y]VD(MmB V9<ݑ뎇o{}O#EP'I︙ږr!>jM?Qq|!m[o.kC!Yض4VŇ`9 7\/F(>Ulв?QF%x,*Xoі$ebSG`d{3I;bP5߃YrlaHûQZzei .f1kU3+6e(5("|Bw`~0\=o2@gHK ٲ$~ͯ ߤa(͈;R ~x! b ߬353X8`ih0MBﻙ=נ !B |~E~U&uD>yL!r6ZK'B0r_`Z5K1f'בhGR!fkyMSf 34J^(k{TJONcY&J/jYqN.c"%$6TҎVXޤaCx&~ `Kl͌wŽA΄Y֚ pMEj#֔;IY yC b7dJ`1ñy򋘶K~ׁ{Q./_D="EԳQ{n{hgʒ*6L lQ4$;Κxj VCdB2SVmUhҤ:|:|>I,]ڱ8Gο׬bS+WD6;1y9VWyҀn~ތ1[y Y-ƍ(q] vF DU<;?^.IkH`)Wyf H_HGUN^f|VXTsTپFú} XڡvK8>҂h,甝7v2;5=xZ|}ЌY84^obVuAMo#fj>Q0:]O}̞-՛ћ=Xɛ*ߴHb渟~㶙lP?Kic?]ܭ|,$ ø&qlH֛kJGvS$P%Ze6~TD!R7y Qm(ƩJa$7  (-ސn"a';}>3=ȎUԝ%݂(=6E06nUcvFF`5#0z$#f^Kށ?筏ȋYw0լ1B %u؆\sy{qɭl: //> -G}y!)k um(W+XQZwSCa- @$}V@$E~'w6[ڊi҅T6kѳl:XaύҢb`k|[rg'RmSY{z)7h?ZUOr/mܚ)wuys?ĕ5R^^@!|mq`DwT0?^ ?K5ğ:0Ѷչ,{a*"\q4~_݉/43">ZŖ50lGq>\ė?W^f7#ogH*!Dlװ|˻kAH|$}KJ&QSȓ~H6c|Xz0drd±^ Ӓ;қQVK;݌u3nƿ6DPڂ^-cCj8IJ9 uA Uu ,iΝ› M8/+=Ɓ|o&PeUL.qDқhK%o"+5L [IviC#a"mu[o7H p?4k gPKi[B& HPK;7KAmeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m1$Build-89902005-12-27T16:05:41Ethan Galstad2007-04-18T09:42:13Ethan Galstad2006-12-20T13:00:24152P1DT10H4M43SPK;7Thumbnails/thumbnail.pngŕ?{Pnu*9"De.D68D\KlfYV!]d܊ZDl\fmo߿|?Hm땔4};w%<#e 9ΛY_IXǃVq,36_prAG#RSd;7ڡH"*;G&XF$u\4HǼG5 6)&kM"vJy^:!a 1"k(;N͉TtYigT85*RO3TMݲ~-I1W`unmm-}J* ^`֓&w^STq O̍GQWl=8d* bdX&(kO]7BR`;6U Հ,&YCkMj}`siR[`U3xH[*D͙qv$y~42ɌnCc`IPpu}3^/ޜ~)E]Pzԡ148wp؜k΂.5\ֳGI\MK3FC8>)N"%(hJXdú"2NV " "ldOA ̊zϑ'{Us(,Jī /ϛܐXGs#-/⡚^O+rH:BZ9lcd߯j,W3)I/=f h@Isus?c{ߡu1gR 4FPL :L'ߜtuP' l%t3"[~r=V%VJp+[wf[{o8 599!ۨappS<- o2./L\§ /.d-;h0W>?gNjAHH2,zsϼ$U!uJ܀濥{ )6 ?̞g@O/|,E;9\yRD6{q~{9IT@0[s@ӁYFϦj kȝ$BKLUvT,xLRAQ!|rmqkr1]QV IT| /bN]j3SEX2[_6EVlao]IUL| 2~Fk⡙T-71LT}ъNY,R8e'05wd8Ɋy\qG5 mƿᖀMpe~ SZB@#=Ub`}Ϟw E["(ᄀ'XISM ':2ӎձFëDclkCsjͽ<;[hwl{?+[?iF{Cu7d Etw 5/3Uw;2/cؑV2 " g<9oEgagȭn{+TmvfW/'HRWbݔ! PKԩbPK;7 settings.xmlZ[s8~_k'lKBKEƍ,y%9+ȅ5xvd\ץO 1oQ5=JC< Z"v*J7Fia>K,Vz3[,GnA)c#npuunڌ=PV/Y1ƞ .q9+Քz؊_0X?= fZP,KDOZ3{g#xcFƣ(so)N s٩>// [PTS{|3沍=vqfģW|#\<8ON ../images/

Nagios
ndoutils-1.4b9/docs/docbook/xsl/titlepage.xml0000644000175100017510000000675711253216103021435 0ustar baeckerhbaeckerh ]> <subtitle text-align="center" font-size="&hsize4;" space-before="&hsize4space;" font-family="{$title.fontset}"/> <corpauthor font-size="&hsize3;" keep-with-next.within-column="always" space-before="2in"/> <authorgroup space-before="2in"/> <author font-size="&hsize3;" space-before="&hsize2space;" keep-with-next.within-column="always"/> <!-- If you add editor, include this t:predicate attribute because only the first editor generates the list of editors. <editor t:predicate="[position() = 1]"/> --> </t:titlepage-content> <t:titlepage-content t:side="verso"> <title t:named-template="book.verso.title" font-size="&hsize2;" font-weight="bold" font-family="{$title.fontset}"/> <corpauthor/> <authorgroup t:named-template="verso.authorgroup"/> <author/> <!-- If you add editor, include this t:predicate attribute because only the first editor generates the list of editors. <editor t:predicate="[position() = 1]"/> --> <othercredit/> <releaseinfo space-before="0.5em"/> <pubdate space-before="1em"/> <copyright/> <abstract/> <legalnotice font-size="8pt"/> </t:titlepage-content> <t:titlepage-separator> <fo:block break-after="page"/> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> <fo:block break-after="page"/> </t:titlepage-before> </t:titlepage> </t:templates> �����������������ndoutils-1.4b9/docs/docbook/xsl/titlepage.xsl�������������������������������������������������������0000644�0001751�0001751�00000026577�11253216103�021445� 0����������������������������������������������������������������������������������������������������ustar �baeckerh������������������������baeckerh���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl"> <!-- This stylesheet was created by template/titlepage.xsl--> <xsl:template name="book.titlepage.recto"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/mediaobject"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/mediaobject"/> <xsl:choose> <xsl:when test="bookinfo/title"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="bookinfo/subtitle"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/corpauthor"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/authorgroup"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/author"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/author"/> </xsl:template> <xsl:template name="book.titlepage.verso"> <xsl:choose> <xsl:when test="bookinfo/title"> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/corpauthor"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/authorgroup"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/author"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/author"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/othercredit"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/releaseinfo"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/pubdate"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/copyright"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/abstract"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/abstract"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/legalnotice"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/legalnotice"/> </xsl:template> <xsl:template name="book.titlepage.separator"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/> </xsl:template> <xsl:template name="book.titlepage.before.recto"> </xsl:template> <xsl:template name="book.titlepage.before.verso"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/> </xsl:template> <xsl:template name="book.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="book.titlepage.before.recto"/> <xsl:call-template name="book.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="book.titlepage.before.verso"/> <xsl:call-template name="book.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="book.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="book.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="book.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="mediaobject" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="title" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="division.title"> <xsl:with-param name="node" select="ancestor-or-self::book[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="center" font-size="20.736pt" space-before="15.552pt" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" font-size="17.28pt" keep-with-next.within-column="always" space-before="2in"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" space-before="2in"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" font-size="17.28pt" space-before="10.8pt" keep-with-next.within-column="always"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="title" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="14.4pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="book.verso.title"> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:call-template name="verso.authorgroup"> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="author" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="0.5em"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="1em"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="8pt"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> </xsl:stylesheet> ���������������������������������������������������������������������������������������������������������������������������������ndoutils-1.4b9/docs/docbook/xsl/fo.xsl��������������������������������������������������������������0000644�0001751�0001751�00000001625�11253216103�020056� 0����������������������������������������������������������������������������������������������������ustar �baeckerh������������������������baeckerh���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="euc-kr"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'> <xsl:import href="http://docbook.process-zero.de/xsl/fo/docbook.xsl"/> <xsl:include href="titlepage.xsl"/> <xsl:include href="http://docbook.process-zero.de/xsl/fo/table.xsl" /> <!-- fop extensions --> <xsl:param name="use.extensions" select="'1'"></xsl:param> <xsl:param name="fop1.extensions" select="1"></xsl:param> <!--<xsl:param name="fop.extensions" select="1"></xsl:param>--> <xsl:param name="tablecolumns.extension" select="0"></xsl:param> <xsl:output method="xml" encoding="utf-8"/> <xsl:param name="paper.type" select="'A4'" /> <xsl:param name="ignore.image.scaling" select="0" /> <xsl:param name="default.image.width" select="200" /> <xsl:param name="admon.graphics" select="'1'" /> <xsl:param name="default.table.width" select="'75%'" /> </xsl:stylesheet> �����������������������������������������������������������������������������������������������������������ndoutils-1.4b9/docs/docbook/xsl/html-single.xsl�����������������������������������������������������0000644�0001751�0001751�00000002640�11253216103�021673� 0����������������������������������������������������������������������������������������������������ustar �baeckerh������������������������baeckerh���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="euc-kr"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'> <!-- <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/xhtml/chunk.xsl"/> --> <!-- <xsl:import href="dbk-html-common.xsl"/> --> <xsl:import href="http://docbook.process-zero.de/xsl/html/docbook.xsl"/> <xsl:output method="xml" encoding="utf-8"/> <!-- Hendrik: uses images for note, tip, warning,caution and important --> <xsl:param name="admon.graphics.path">../images/</xsl:param> <xsl:param name="admon.graphics" select="'1'"/> <!-- Hendrik: use the following relative image path --> <!-- <xsl:param name="img.src.path">../images/</xsl:param> --> <!-- Hendrik: we want some nice navigation icons in header and footer --> <!-- <xsl:param name="navig.graphics" select="'1'"/> --> <!-- Hendrik: don't use image scaling --> <xsl:param name="ignore.image.scaling" select="'1'"/> <!-- Hendrik: Here we get our CSS Stylesheet --> <!-- <xsl:param name="html.stylesheet" select="'nagios.css'" /> --> <!-- Hendrik: Copyright Information on each page --> <xsl:template name="user.header.navigation"> <CENTER><IMG src="../images/logofullsize.png" border="0" alt="Nagios" title="Nagios"/></CENTER> </xsl:template> <xsl:template name="user.footer.navigation"> <P class="copyright">© 2009 Nagios Development Team, http://www.nagios.org</P> </xsl:template> </xsl:stylesheet> ������������������������������������������������������������������������������������������������ndoutils-1.4b9/docs/docbook/en-en/������������������������������������������������������������������0000755�0001751�0001751�00000000000�11267536772�017140� 5����������������������������������������������������������������������������������������������������ustar �baeckerh������������������������baeckerh���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ndoutils-1.4b9/docs/docbook/en-en/introduction.xml��������������������������������������������������0000644�0001751�0001751�00000010070�11267536772�022401� 0����������������������������������������������������������������������������������������������������ustar �baeckerh������������������������baeckerh���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE chapter [ <!ENTITY % all.entities SYSTEM "all-entities.ent"> %all.entities; ]> <section version="5.0" xml:id="intro" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:svg="http://www.w3.org/2000/svg" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:db="http://docbook.org/ns/docbook"> <title>Introduction
Purpose The NDOUTILS addon is designed to store all configuration and event data from Nagios in a database. Storing information from Nagios in a database will allow for quicker retrieval and processing of that data and will help serve as a foundation for the development of a new PHP-based web interface in future Nagios versions. MySQL databases are currently supported by the addon. Other databases will be supported in the next versions. The development for this will start right after the next stable NDOUtils release (1.6). Support for other database servers may be added if there is sufficient user interest and even more user who are interested in testing.
Design Overview The NDOUTILS addon was designed to work for users who have: Single Nagios installations Multiple standalone or "vanilla" Nagios installations Multiple Nagios installations in distributed, redundant, and/or fail over environments Data from each Nagios process (hereafter referred to as "instances") can be stored either in the same database or different databases than data from other Nagios instances.
Possible Designs
Although not yet supported, future development should allow for data from any given Nagios instance to be stored in multiple databases if desired.
Future development: One Instance, multiple databases
Instances Each Nagios process, whether it is a standalone monitoring server, or part of a distributed, redundant, or fail over monitoring setup, is referred to as an "instance". In order to maintain the integrity of stored data, each Nagios instance must be labeled with a unique identifier or name. You can choose the name of each Nagios instance to suit your needs. For instance, you could choose to name Nagios instances based on their geographical location...
Instance names based on geographical locations
Or you could name Nagios instances based on their purpose...
Instance names based on their purpose
How you name Nagios instances is up to you. The key point to remember is that each and every Nagios process must have its own unique instance name. More information on how instance names come into play will be discussed in sections 3 and 4.
ndoutils-1.4b9/docs/docbook/en-en/NDOUtils.xml0000644000175100017510000000704511253216103021303 0ustar baeckerhbaeckerh %all.entities; ]> &name-ndoutils; Documentation Version 1.4 NDOUtils Developer Team Nagios Development Team Docbook Edition 09/04/2009 1999-2009 Ethan Galstad 2009 Nagios Core Development Team Supervision NDOUtils Nagios Linux &name-ndoutils; is licensed under the terms of the GNU General Public License Version 2 as published by the Free Software Foundation. This gives you legal permission to copy, distribute and/or modify &name-ndoutils; under certain conditions. Read the 'LICENSE' file in the &name-ndoutils; distribution or read the online version of the license for more details. &name-ndoutils; is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. &name-nagios; and the &name-nagios; logo are registered trademarks of Ethan Galstad. All other trademarks, servicemarks, registered trademarks, and registered servicemarks mentioned herein may be the property of their respective owner(s). The information contained herein is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. 0.1 2009-09-04 First DocBook Release Credits to: Ethan Galstad, Nagios Enterprises: original Nagios documentation Sébastien Guilbaud, Olivier Jan: french Nagios Docbook version (for ideas how to do it) The Beginning Design en detail Examples Installation ndoutils-1.4b9/docs/docbook/en-en/whatsnew.xml0000644000175100017510000003532011267536772021525 0ustar baeckerhbaeckerh %all.entities; ]>
What's new in &name-ndoutils;
NDOUtils 1.4b9 - 10/16/2009 Requires Nagios 2.7 or higher, or Nagios 3.0b6 or higher Improved writes from file2sock to ndo2db by matching buffer sizes (Opsera Ltd) Add in 4 missing tables from clearout process during prelaunch (Opsera Ltd) Fix for Solaris 10 which gets an EINTR on accept for the 2nd file2sock call (Opsera Ltd) Fix for not retrying read on 'EAGAIN' and 'EINTR' soft errors (Opsera Ltd) Improve error info by showing failed MySQL query in syslog (Opsera Ltd) Move database connections/disconnections syslog detail to DEBUG from INFO (Opsera Ltd) Allow external commands table to be trimmed with a specific time limit (Opsera Ltd) Support SSL encryption between the communication partners Support for long performance data Added installation procedure with "make install" or "make fullinstall" Fix missing output fields in hostcheck and servicecheck tables Workaround small NDOMOD Buffers to handle more than 4k chars (tracker id 21) Fix unescape of strings containing tabstops
NDOUtils 1.4b8 - 07/16/2009 Requires Nagios 2.7 or higher, or Nagios 3.0b6 or higher Added additional error messages during failed startup Better MySQL library detection (Ton Voon, Herbert Straub and Nagios Plugin Team) Removed Postgres options from configure script, as it is not yet supported Compiler flag fix for building on GNU/kFreeBSD systems (Hendrik Frenzel) Added lock_file option Fix debug file permission race (Lars Michelsen) More error reporting if debug file can not be opened Fix wait for childs on SIGCHLD Added long_output support Fix missing SIGTERM forwarding to childs Fix fmt specifier in ndo2db_daemonize() Escape custom values in 'customvariablestatus' and 'customvariables' Fix ndomod doesn't execute rotate_command properly Fix several compiler warnings Rewrite ndo2db_init_script, install it with 'make install-init'
NDOUtils 1.4b7 - 10/31/2007 Requires Nagios 2.7 or higher, or Nagios 3.0b6 or higher Makefile fixes for compilation flags Fix for bug where service check table always had same start/end time Added sample init script for SLES (Bruno Quintais) Added --with-ndo2db-user and --with-ndo2db-group configure script options Fix for configfilevariables table not holding multiple entries for various variables Changed/added indexes on various DB tables Added some very basic debug file capabilities (not complete yet) Fix for handling (backwards) system time changes Fix for missing SUN_LEN definition and strtof() functions on Solaris 8 (Christian Masopust) Fix for segfault when importing duplicate log file entries (Hendrik Frenzel) Updated to support latest Nagios 3.x code (3.0b6)
NDOUtils 1.4b6 - 09/27/2007 Requires Nagios 2.7 or higher, or Nagios 3.0b4 or higher Updated to support latest Nagios 3.x code (3.0b4) Added source OpenOffice docs in addition to PDFs Fix for segfault while processing host status/event information
NDOUtils 1.4b5 - 08/29/2007 Requires Nagios 2.7 or higher, or Nagios 3.0b2 or higher Reintroduced contactgroup associations with host, service, and escalation definitions Adjustments for data structure changes made in Nagios 3.0b2 Fix for missing math libraries during compilation (Dominic Settele) Changed MySQL db table types from MyISAM to InnoDB Updated to latest Nagios 3.x include files (3.0b2)
NDOUtils 1.4b4 - 06/19/2007 Release Date 06/19/2007 Requires Nagios 2.7 or higher, or Nagios 3.0a5 or higher Added note about needing 'event_broker_options=-1' in Nagios config file Updated to latest Nagios 3.x include files (3.0a5)
NDOUtils 1.4b3 - 04/10/2007 Requires Nagios 2.7 or higher, or Nagios 3.0a3 or higher Added missing 'alias' field to hosts table Fixed problems with marking old, non-existant objects as inactive Fixed bug where host and service objects were not being marked active Fixed minor SQL errors Added DB upgrade and installation script (Ton Voon/Altinity) Updated to latest Nagios 3.x include files (3.0a3)
NDOUtils 1.4b2 - 01/19/2007 Makefile fixes for compiling ndomod event broker module Fixes for Nagios 2.7 and latest Nagios 3 alpha code for scheduled downtime changes Fixes for problems with DB indexes in 'host_contacts', 'service_contacts', 'hostescalation_contacts', and 'serviceescalation_contacts' tables Added missing host_object_id field to 'services' table Added sample SQL queries for fetching data (look in the db/queries subdirectory)
NDOUtils 1.4b1 - 01/07/2007 Added ability to drop privileges (see the ndo2db_user and ndb2db_group config file options) Unprocessed event data is now stored in the buffer_file file before the NDMOMOD module shuts down. On startup, the module will read the contents of this file and send the contents to the NDO2DB daemon for processing. Better detection of MySQL libraries (default path) Removed 'should_be_drawn' field from hostextinfo table Merged extended info definitions with host/service definitions Added new fields from Nagios 3.x, updated to latest Nagios 3.x include files Added stub routines for adaptive contact data Fixed several memory leaks Documentation on database structures
NDOUtils 1.3.1 - 02/25/2006 Fixes segfaults with empty log entries and missing db prefix Synchronized version numbers of all utilities to 1.3.1 New update-version script
NDOUtils 1.3 - 02/12/2006 Removed 'ndo_' prefix from default database structure Updated config.sub and config.guess to latest versions from CVS Configure script fixes Added missing 'address' field to hosts table Different version of NDOMOD and NDO2DB are now created for Nagios 2.x and Nagios 3.x Memory leak fixes Misc bug fixes
NDOUtils 1.2 - 01/10/2006 Changed most protocol strings to integers for better efficiency Added check for client/server protocol version Added support for TCP sockets Added INETD support to NDO2DB daemon Fixed bug with processing of contact notification methods Fixed bug with processing of live log data Changes to MySQL table structures Added some initial documentation (PDF)
NDOUtils 1.1 - 12/27/2005 Changes to MySQL table structures Added support for both original and retained object configurations Added checks for Nagios object structure compatibility Changed syslog() message types from LOG_DAEMON to LOG_USER Updated Nagios 2.0 include files
NDOUtils 1.0 - 12/23/2005 First public release for comments
ndoutils-1.4b9/docs/docbook/en-en/installation.xml0000644000175100017510000002364411267536772022374 0ustar baeckerhbaeckerh %all.entities; ]>
Installation
Prerequisites In order to use the NDOUtils addon you'll need to have the following installed and working on your system: Nagios (see below for versions) MySQL
Version Compatibility In order to use the NDOUtils addon, you'll need to be running at least Nagios 2.0 (stable). NDOUtils will not work with beta releases of Nagios 2.0. NDOUtils also works with updates to the Nagios 2.x branch, and the current Nagios 3 branch since b6 stage.
Obtaining New Versions You can always obtain the latest version of the NDOUtils addon by visiting the Nagios download site at: http://www.nagios.org/download/ Bugs are bound to be present in this daemon and updates are always being made to Nagios, so its important that you stay up to date with the latest version of NDOUtils that works with the version of Nagios you have.
Compiling Compiling should be easy as pie. If you haven't already, unpack the NDOUtils tarball: tar xzvf ndoutils-1.4b9.tar.gz Change to the ndoutils-<version> directory that has been created and run the configure script: cd ndoutils-1.4b9/ ./configure Compile the components of the addon with the following command: make
Installation Since NDOUtils 1.4b9 you are able to install NDOUtils like your Nagios using a simple make target. During this step all necessary binaries will be copied to your --prefix path, especially to your --bindir which you specified during the configure.
To use with a Nagios 3.x Installation Since NDOUtils 1.4b9 you are able to run make install direct after make. This will install the different binary files which belongs to the NDOUtils Project to your specified path (--prefix or --binddir). make install will install ndomod and ndo2db for a Nagios 3.x installation per default. If you would install NDOUtils for a Nagios 2.x Version, read Section 1.5.2
To use with a Nagios 2.x Installation
make install-2x will install ndomod and ndo2db for a Nagios 2.x installation. If you would install NDOUtils for a Nagios 3.x Version, read Section 1.5.1 That's it! Now its time to configure everything...
Initializing the database Currently, the NDOUtils addon only supports MySQL as a database backed. Support for PostgresQL will likely be added in the future. If you aren't already using it, I would suggest installing phpMyAdmin (http://www.phpmyadmin.net) to help manage your MySQL server and databases. First, you'll need to create a new database called "nagios", or whatever you'd like. Next, add a user that as SELECT, INSERT, UPDATE, and DELETE privileges on the database you just created. Keep this information handy, as you'll need it when you configure things. Finally, run the installation script to create the database tables necessary to hold the data the NDO2DB daemon. The script for doing this (installdb) can be found in the db/ subdirectory of the NDOUtils distribution. cd db/ ./installdb
Configuration Its time to configure the NDOUtils addon components. Sample config files are included in the config/ subdirectory of the NDOUtils distribution. First, add the following entry to your main Nagios configuration file (usually /usr/local/nagios/etc/nagios.cfg): broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg Next, install the sample NDOUilts config files: make install-config This will install the distribution configuration files to your sysconfdir (usually /usr/local/nagios/etc/) as <filename>-sample.cfg. This will prevent to overwrite your personal changes. After adapting your personal changes to the newly created config files and rename them: mv /usr/local/nagios/etc/ndomod-sample.cfg /usr/local/nagios/etc/ndomod.cfg mv /usr/local/nagios/etc/ndo2db-sample.cfg /usr/local/nagios/etc/ndo2db.cfg Edit the ndomod.cfg and ndo2db.cfg config files to match your setup. You'll need to specify things like the database name, prefix, username/password, etc. Make sure the following entry appears in your main Nagios configuration file (nagios.cfg). If you don't specify this option, Nagios may not pass any data to the addon for storage in the database. event_broker_options=-1 To save some overall performance, you should think about which data you really need from the NDOUtils. Nagios itself produces a lot of timed event data which represents the nagios internal scheduling queue. You can safe yourself some trouble if you unregister your ndomod.o from this events. Just configure a less greedy ndo broker option like this: data_processing_options=1048573
Getting things running Once things are configured, you can start things running. Start the NDO2DB daemon: /usr/local/nagios/bin/ndo2db -c /usr/local/nagios/etc/ndo2db.cfg or just use the init script by execute: /etc/init.d/ndo2db start Check the system logs and make sure the daemon started up okay Start Nagios if its not running. /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg If Nagios is already running, restart it by sending a SIGHUP signal or using the Nagios web interface. Check the Nagios logs to make sure it started okay. You should see some log entries that say the ndomod.o module was loaded successfully and connected to the data sink. If the ndomod.o module didn't appear to load, check your Nagios config files to make sure you added the appropriate broker module entries to your main config file. If there are errors connecting to the data sink, make sure the NDO2DB daemon is running. Check the system logs to make sure the NDO2DB daemon is working okay. You should see some log entries telling you that a connection was received (by the ndomod.o module loaded by Nagios) and a connection to the database was successfully make. If there are errors, make sure you specified the appropriate database, username, password, and table prefix in your ndo2db.cfg config file. If there are errors relating to being unable to run a specific MySQL query, chances are that you either didn't create the appropriate database tables (outlined above in the configuration section) or your ndo2db.cfg config file entries don't match your setup. You'll need to restart the NDO2DB daemon if you make changes to the config file. That's it - data from Nagios should now be getting stored in database!
ndoutils-1.4b9/docs/docbook/en-en/components.xml0000644000175100017510000001432211267536772022051 0ustar baeckerhbaeckerh %all.entities; ]>
Components
Overview There are four main components that make up the NDO utilities: NDOMOD Event Broker Module LOG2NDO Utility FILE2SOCK Utility NDO2DB Daemon Each component is described in more detail on the following pages.
NDOMOD The NDO utilities includes a Nagios event broker module (NDOMOD.O) that exports data from the Nagios daemon. Assuming that Nagios has been compiled with the event broker enabled (this is the default), you can configure Nagios to load the NDOMOD module during runtime. Once the module has been loaded by the Nagios daemon, it can access all of the data and logic present in the running Nagios process.
Loaded NDOMOD Event broker Module
The NDOMOD module has been designed to export configuration data, as well as information about various runtime events that occur in the monitoring process, from the Nagios daemon. The module can send this data to a standard file, a Unix domain socket, or a TCP socket.
NDOMOD Capabilities
The NDOMOD module writes data in a format that the NDO2DB daemon (described later) can understand. If the NDOMOD module is writing its output to a file, you can configure it to periodically rotate and/or process the output file using a predefined Nagios command. This can be useful if you want to transfer the output file to another physical machine (using SSH, etc. ) and send its contents to the NDO2DB daemon using the FILE2SOCK utility (described later). If the NDOMOD module is writing it output to a TCP or Unix domain socket, it has some resistance to connection dropouts. The module will attempt to cache its output until it can (re)connect to the socket for writing. This is helpful if the process that creates and listens on the socket needs to be restarted, etc.
LOG2NDO The LOG2NDO utility has been designed to allow you to import historical Nagios and NetSaint log files into a database via the NDO2DB daemon (described later). The utility works by sending historical log file data to a standard file, a Unix domain socket, or a TCP socket in a format the NDO2DB daemon understands. The NDO2DB daemon can then be used to process that output and store the historical logfile information in a database.
LOG2NDO Utility
FILE2SOCK The FILE2SOCK utility is quite simple. Its reads input from a standard file (or STDIN) and writes all of that data to either a Unix domain socket or TCP socket. The data that is read is not processed in any way before it is sent to the socket.
FILE2SOCK Utility
This utility is useful if you are directing the output of the NDOMOD event broker module and/or LOG2NDO utility to a standard file. Once these components finish writing their output to a file, you can use the FILE2SOCK utility to send the contents of the file to the NDO2DB daemon's TCP or Unix domain socket.
NDO2DB The NDO2DB utility is designed to take the data output from the NDOMOD and LOG2NDO components and store it in a MySQL or PostgreSQL database. When it starts, the NDO2DB daemon creates either a TCP or Unix domain socket and waits for clients to connect. NDO2DB can run either as a standalone, multi-process daemon or under INETD (if using a TCP socket).
NDO2DB Daemon
Multiple clients can connect to the NDO2DB daemon's socket and transmit data simultaneously. A seperate NDO2DB process is spawned to handle each new client that connects. Data is read from each client and stored in a user-specified database for later retrieval and processing.
NDO2DB with multiple Clients
The NDO2DB daemon currently supports only MySQL databases, but future support for PostgreSQL databases is planned.
ndoutils-1.4b9/docs/docbook/en-en/ent/0000755000175100017510000000000011253702163017706 5ustar baeckerhbaeckerhndoutils-1.4b9/docs/docbook/en-en/ent/names.ent0000644000175100017510000000116211253216103021513 0ustar baeckerhbaeckerh ndoutils-1.4b9/docs/docbook/en-en/ent/version.ent0000644000175100017510000000025211253216103022074 0ustar baeckerhbaeckerh ndoutils-1.4b9/docs/docbook/en-en/ent/documents.ent0000644000175100017510000000060611253216103022413 0ustar baeckerhbaeckerh ndoutils-1.4b9/docs/docbook/en-en/ent/urls.ent0000644000175100017510000000357111253216103021403 0ustar baeckerhbaeckerh ndoutils-1.4b9/docs/docbook/en-en/ent/protocols.ent0000644000175100017510000000213411253216103022434 0ustar baeckerhbaeckerh HTTP"> HTTPS"> SMTP"> DNS"> POP3"> NNTP"> IMAP"> IMAP4"> FTP"> SSH"> DHCP"> NTP"> SNMP"> ICMP"> PING"> ndoutils-1.4b9/docs/docbook/en-en/ent/plugins.ent0000644000175100017510000000215211253216103022071 0ustar baeckerhbaeckerh check_nagios"> check_hpjd"> check_nrpe"> check_dns"> check_dummy"> check_ping"> check_icmp"> check_nt"> check_snmp"> check_rpc"> check_http"> check_by_ssh"> check_ssh"> check_cluster"> check_fping"> check_mrtgtraf"> check_ftp"> check_smtp"> check_pop"> check_imap">ndoutils-1.4b9/docs/docbook/en-en/all-entities.ent0000644000175100017510000000104411253216103022213 0ustar baeckerhbaeckerh %protocols.entities; %plugins.entities; %urls.entities; %names.entities; %doc.entities; %version.entities; ndoutils-1.4b9/docs/docbook/en-en/Makefile.in0000644000175100017510000000154111253216103021160 0ustar baeckerhbaeckerh############################### # Makefile for NDO # # Last Modified: 09-13-2009 ############################### prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ LIBEXECDIR=@libexecdir@ DATAROOTDIR=@datarootdir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ all: @echo "" @echo "Please type what you want, possible targets:" @echo "make en-html" @echo "make en-html-singe" @echo "make en-pdf" @echo "" en-html: xsltproc --xinclude ../xsl/html-chunked.xsl NDOUtils.xml en-html-single: xsltproc --output ../../html/en-en/NDOUtils-single.html --xinclude ../xsl/html-single.xsl NDOUtils.xml en-pdf: xsltproc --xinclude -o ../NDOUtils.fo ../xsl/fo.xsl ./NDOUtils.xml fop ../NDOUtils.fo ../../NDOUtils-en.pdf rm -f ../NDOUtils.fo distclean: rm -f Makefile ndoutils-1.4b9/docs/docbook/en-en/example-configs.xml0000644000175100017510000001667711253216103022736 0ustar baeckerhbaeckerh %all.entities; ]>
Example Configurations
Single Server, Single Instance Setup The easiest configuration occurs when you have a single Nagios instance running on your network. In this case, installing and configuring the various components of the NODUTILS addon is fairly straighforward. The following diagram illustrates how the various components can fit together in a single server, single Nagios instance setup....
Single Server, Single Instance Setup
Here's a description of what's happening at each point in the diagram: The NDOMOD module is configured with an instance name of "default" since there is only one instance of Nagios that is running on the network. While the Nagios daemon is running and performing its usual business of monitoring the network, the NDOMOD module is sending configuration data and event information to the TCP or Unix domain socket that was created by the NDO2DB daemon. The NDO2DB daemon reads data that is coming into the socket from the NDOMOD module. The NDO2DB daemon processes and transforms data that has been received from the NDOMOD module. The processed data is stored in a database for later retrieval and processing. This example assumes that: Nagios is configured to load the NDOMOD module at startup. The NDO2DB daemon (which is a seperate process from the Nagios daemon) is running.
Single Server, Multiple Instance Setup Another simple configuration can be used when you have a multiple Nagios instances running on a single server. Installing and configuring the various components of the NODUTILS addon is similiar as to what was shown in the previous example. The following diagram illustrates how the various components can fit together in a single server, multiple Nagios instance setup....
Single Server, Multiple Instance Setup
You'll notice that the diagram above is similiar to the one for the single-server, single instance configuration. The main difference is that there are now three (3) different Nagios daemons instead of just one. Each Nagios daemon loads the NODMOD module at startup with a unique instance name. In this example the instances are simply named "nagios1", "nagios2" and "nagios3". Each NDOMOD module sends configuration data and event information for its specific instance of the Nagios daemon to the TCP or Unix domain socket that was created by the NDO2DB daemon. The NDO2DB daemon reads data that is coming into the socket from the three NDOMOD modules. The NDO2DB daemon processes and transforms data that has been received from the NDOMOD modules. The processed data is stored in a database for later retrieval and processing. Data from each instance of Nagios is kept seperate (using the instance names as unique identifiers) in the database.
Single Server, Single Instance Log File Import There are two reasons you'll probably want to import your Nagios log files into the same database that Nagios configuration and event data is stored in: Historical log file data isn't imported into the database by default and having a record of events that occurred before you implemented the NDOUTILS addon is probably desireable. The NDOMOD module is not able to process realtime log entries from the time right after the Nagios daemon starts to the time that the NDOMOD module is loaded by the Nagios daemon. This "blackout period" is unavoidable and causing log entries such as "Nagios 2.0 starting..." to be missed by the NDOMOD module. Thus, importing day-old Nagios log files on a daily basis (via a cron job) is recommended.
Single Server, Single Instance Log File Import
Here's a description of what's happening at each point in the diagram: Historical Nagios log files are read by the LOG2NDO utility. The LOG2NDO utility processes the contents of the log files and tags them with an instance name of "default". This instance name must match the same instance name used by the NDOMOD module in the Nagios daemon. Historical log file data is sent to the TCP or Unix domain socket in a format that the NDO2DB daemon can understand. The NDO2DB daemon reads the log file data from the Unix domain socket. The NDO2DB daemon processes the log file data. Historical log file data is stored in a database for later retrieval and processing. The NDO2DB daemon will perform some checks to make sure it doesn't re-import duplicate historical log entries, so running the LOG2NDO utility on the same historical log file multiple times shouldn't have any negative side effects. That's it! Pretty simple.
ndoutils-1.4b9/docs/docbook/images/0000755000175100017510000000000011253702163017363 5ustar baeckerhbaeckerhndoutils-1.4b9/docs/docbook/images/fig7.png0000644000175100017510000003314711253216103020727 0ustar baeckerhbaeckerhPNG  IHDRPɣ6.IDATx XTwN\rxa4PIԼdBi1R4411)MhJIy9!39d xa&0'|[3gaa33Ϟwkv^{>VǗ.]!"SS#BBB4w=@33gϾ#8mh>|ڢEKK`߾}D }#d R e26ng IO5k kSBi6DLΝttE5vZqq'"sȗ=7m5O7lٲIh53gƍ.!brJaMMӕqry2jXym؈m=U@@ ]2k׮V÷~ti)V ~zҊOCǏwi9~WkkBWY :HI&"}{he7m<|X`ʔ՚~zҧ~rhJ$]:umvig'EWn[ZZA{y{ 9xpAܹkɒ*ؽ;=*jVLnwۯ hTUUݹs]lCĤ<'t *)9P($ `mTU᣻O߾rsss'''{b[!22Yiw-],e /!"SY>ݻ{>!0.\(>ܪDE/}R~PCfBɮ[SBZ3مU|R}}=`֔JĶBdsz}z?]PPe5S..X<ե]ѧ']+(;ܑvvV]ߑS&Ɣxxԧ']+bPvYSVV٩^rywMAee~۶NNcFЩSl(;q㔪BFkEEYݭJÅldd۶v0u>>cjkZp[/)9^W/jj.քO(;cƦ)) egӳ':+VPB>SE 0ktZ@@4`.tw^F$(MLKMM9߁d]~pz41<\t>4ݻIkk厎ʸ?J}x3O__|fa;n#H~z<PvYS_ HI4u!1%&*;V}!C&߼y8J$966IIY\lvY4P;ywhS72i=$聁Ӏ'.?3s){ll%jA[0_JKKe2}EMSoR^}zsM.aӵI^鯲2ܹLxryK HI9U0v?NN?"hnϮ]=W( ϳGe UUU999%%%/_ζkzvN/f8V*7NQ(jÇ:vtٰa y~[[}o4tj>Wuu #S\e IҥKk3gNjjB!7`^eKLb_&N\޶Cr_2ޝD$$b'>xj|s߇ t|ڋlƐ_\|lel 9Q&H<6nsvMޠ1JZe:tNa7nT9gŊezf3ב:HT$[kmbb8L"3mWB}zzgd$䟾vM*WWW(;@d~嗫WԾ}{WdưAAs/\8J#,ʕyOӰ m;V:O>;ɷN޿ ;M-M m><͟w~kƷ96izD;%%eĈݻ)޽FixIP4gC=<s Gnk5-Mqu eLUUՒ%K-ZDO;)j Lodҥ|MxWra'ZFB*>th>=/\yРPv@!I9r_~I"gРA¯RΝ[)]قqvvz|*=xPeSLyf\\ŋn< 8qZ{NW(;pt2:NNNcCNRG.7r T(;et,x?fe'>!&|˱c-\d233_{W6W3 yF cY6!ii*rDzDWCP.@3k{53_eU |h<ɔ)ʋpKQeKk{5訵kFhC{m~{E1Em/?aBṼ9rdZZk{rT[>-ec^~ej{Se<5}׋c+V$deی?~0Ο Oǎ}*zђydGPtؖ<"9yϏ曭AAV]pz,fy$%8sWvQj{ƐO4{aa ˗VQQ3Sls,9:JŶXI18{6mccλ|yهZ amÇ.r0GegLO"#c6mZ?b0_e'FTrhhXZ`4̤0fᎎ=^z)oJY(s璓E$4Kܕngf„m6"chNx͜5}ŊȆ̶0C )**mW_k\. 3^e'${c*** @m/5);#<| Ȇ@7eʹ>eD->u*9,lIȆ@p sDeyg͚U*;ʆ| 'dC5[L"g?n]E);H>u/@mHXIm}=d_b"&Gn<:] dV*2,˨Yk.Yʱ^?efMfmqr-MىNQQiM5ِ:OHH^(: };E隨-ZslHԹ2w kرqb[!2G|ۦA$=Xs¿622EFl۶Ilsh!WUUy&b&&ʕݙ|r\(;#4tS/8.5=`Xgmu6=Ol+DfϞ&L]Kpի?YvbQ !w܎"}zkyeo?'!ba_ ۽Z۴i<޾}sSWV'&Zp[e)UUVqk&ct"/oop6wq>E}$b⋩t eJIf]+~U(j=w!LJ^^of{{|o.82ZrX[T,cЯ_c[ic1x{&?M $.>cG!C&U(&+"b._ߗ>4p͚GSvũB1O>&J9'S ١C$碢3gnSYɔvN6oαɦǞ=jGu$sۡ\ߵk#~[uL9ؠғ{y{OOK[PT󻜜z¼-[by:cEsrv`<{|FPv`87o)) Igm㯿=,oo[Խ{gWTv |g?#=ڱcLV%Oaaߐ@ӌ6Mx.sgq6m1 -A,Xm/ڰ^z7)o)LJ..:q"3 ktL^v옹d2`eP_ja/opjO0Yg>8 s͔un:o;FsO3bw.ΛuOص^zRXXس'[7c'OvqRNQQyڵ 7,^OYUUhWt$})~9[H1i/ 1Lqq  vqe̘66XkW?ͻj!i&V{yɋ'q;,Cg6Y\?yiXUm/9{yIO1aB\zz SWcylVVRf灁$iiKضJuŧ@فaݭZsloEQVxt؛ۜ25Os<5@Eұ֫R+kX#ًvΚ5+;;;444))uPXxWbȐ}/d37ݿm||g~m[+X# B2>ݻ{>iߥGhF {mG i*0S+j{]SS%]4%MXAIV:f|hLF3k$Nyh-Iщ4D4' C"ZTD1WogJ~a9Ue)) N'Oe٩8P߽{Yx&FՊ|qDM1EGufIdwʩO5Nԇ 3j[* ΚT98thILvX1gPk824akkŒQ:S@j,=z^UIgj6M"ǘEN$ O<хm!7o^TSvvй^?憇_xѪj{5RV̕+=z ]&+P۾v[7O?aa+I峳/u%9yB!㔕/lqAV||W_?pZv\0ѧxv.gMxYﶓǕS>a^<+e1b[%%+t"7KNΤ6Ȇy%%P#ۛj999={ .ڵ>=ZkPIFsJ:q"uΜ]x9D:9OSzV.S=wOf$!{66䪧,36Q-[b;DF&Hcc/]ʡcǶ30\#jc?: )&y<3{wWsCMjN{Y瀀ڧN}^WwkȐُ?p.R߽g_9gݡ+.cU+;kgX|Ĉj>Kr@Y:y08[ym&P(ll[C/?U#RR~[ɩĚ\>}%e={>M?x+䛓޵eq 22X(jT C<<_^,Գx?doܨT1}~$0),PBjHNpX7,¤2 R|f_$9T^x"ګU{N~=ˣa$)SRV0}o\i͵DYYeNy2>ߦM[}zvԣ,Ae*NHx^SIo޼B~}fG?^ uT쫻0Ȕ]+>'E ? m۶5QܶSƌYN>; ]Α4WTdԔt:Rioq{ˏܹS֭]nZx,[ƍH=3OGt:jmJhԸO%j:``a ) ͂ͤV֤gȆe;Zu6J{~ Ȕt ޽{}ݸq H㇆.&V^\܄wì©S.Z(**i$4HgIߵPXH6j͛7ٳ'..NÆjYFV{:tdNAGiDɺnk*]ig6lr±ΝS 1 =}*}>@~g2@zx ai/;S'\:q"Km"0'O9N"W^3gG}d"}qƷVPK+/h{]($&τIƌ" %%IajjʥRGs<{fذ~Pf?k66O|guK*,F |NGkk۵kzkӦ-hQvQV&Ќ]=X;ۖH:sh̽{ c|0}ذpNZ/m,~!)ذ)ذZΜÆe%h#;{kzz /̳p-Mx}')-j{V}&1`HIOeyw~a9Hͧ$z*/VAUu8U0vTqNNrm-NSEM?xllՒ5wtI3]3b9߿_IUUֽٳg_IߧM|e˖A[//Ȉ_UmqeW5}W \rN BCeryq#K>> 9;H[%fM6l:uaxZԞ`͚`pU=춶ZS]}yҤFj,X!/^daضX>/*kHs jU.+jAM˪pʨC3&g ,sg7OQ?#PܫF]MCXw|X=,,)83 rHRj<0?Ԝx6cnk0gԴ͙Ǐ);t~us`j{L)Fv튉ټygΜ)Qf3Mg%t|B!7ʲwfNdqW͢%%=<< \k>*!C&wL=Eucx,Vف3tRv_Ў_N}g+C^l]SRv`_NYQ,lll֭[7rȘ!C 2#.KAAAC6,gM-— R}4˸iVnܨtu4eJs$)) 騩CI^Pv!U!M ''̙m7}U [yz\RͲv1nƽ{g!H_vs|NΗl?rAAE,ъn}{ٛ49th4s'Ŝ*!]]:KW;Vj߁R_/oV]Xn;{V z;:uV[I,i*:8޸aUcoP{r6Dm߳gGݛ7ǰꜪl/C몳N1M~jف|#ւ GGIZ"霙С;d}ԏiENn8KdօώYM6La'N\;j%߱rIԤћ 2'twb[!2nnyy$~}Ҥȕ޽{9lMKr8Uy嗽$3flb&7z'TYG=zPg4%4TF!29Ȍ> 4…׍;&)BQ!cto_>=/]8H4Qj2~:t-T#WSF+__c>{'N|B1&|i''q3ܿ I!]] V0gg_-o]\B?)䞫dMK׈zG2rKs8Ù3{S.T P(Ȗcj=__j P<AdF7dR77#,Tk{$\ccI"Z4KzD  OEpquWwJ@9@Ji^p [kG9?I4Ԝ~viO55\Ae2Yug..JWaB`m燢>iS {CAc$99Il]:nn W2"9? {V c+)_:I^pk.4D߾FY5XF*zq8/ǖԠX%m,m˿xPݻ2yE0跱ǡ0)^w+Ķ@BWc̘yy kr`,@BLRI s'YoJ;k`c+^da޽۷T q-OzXRcZ;yvKzD|0ufZ)%&f4SɳT(dEEYR9o_/.> +۵ViCUYO>d'(BMn> {2bY6 aa+v:SO<8,'ggC~|F|lU|0kaDEDD4wq36mC+ qoJԩ,]/YH"pLO3.Һ=EE/#F}F񡕆…jS֟U]gփW݋L3fY4=`Vh/8ѰBm׹s=@W}m\%9dq_/[Z4 "3&n}3Y].Rs4%h>Pq&2C]AƕU曵ys $amX6V ?ԩ_ѿ}VED6>|X -m5bhLCuյӭKk3y,j=`͑Gygit$utR^+|# ]=\iiKΜ3ڸq F;bcϝ$W]3u?S=`o?FV@x"̜_[sJxkx#o/P]uC',:rDYc%^95gH5de%ѱ?\tr\uHK9-dR+:#3!!!J) Mloܨ"SUw:0+{CuϜIT5ܝzGF&cY}vA@^9:ʂ߲%ZE4ݻhzTXgdfw̘ ^qʔUr> NP]u #87o^!gh;Cu!}w DbިQQ5f++BBR: Ug,`RYߤ1%|Ev, X_ֶ̙llphzz<[`0*2Cw* ;|IVmhicrrv)Ut54;[Ϟ=ȶцꪳv&DY ~DڵaE}Wu˖޽M`%ӧ[|dfi|ܸxkN$iǎ{Wv:gBN3fl)orh4+eom%YI>`!upeL_ǚhEf&MdّQQQ3^{؆ϛo;Ҹ(ɓ䭏dpP Qgt;wܤ$ ̬\Ķ|1~ݘ>}FǯY/G*oM692::#3@+WvGGw嗽uum7p8$)򄇇4#3@+&HR"0Df& %ȌueAdڀ` 2cU@XXPvDf,(;"3c:8X1Bl3r AW)O6AX*ޝq}œ# ,@d"A4kPȌ%e<Df,(;@Vۊ0`PF.T*PvZWddo#3mL:/ֈuѠ 2¾b ?;V1:uFE}atuW[Pv@#Ȍ`g'yse2;oSCȌaic)#cYdd̶mZPv 2cOJ~q[AM<8'^z)lNNN>41 O@భ[7z: pq:*jڵKnAȌlEϛ'啉&: `8}ӦJeCBҦk##cuF0@h7⸽{ӌ'`1gvcȠ4#fCBgC~tc1#LSaِ'G$%yBҩ466#66 e DfdMesnPPv AdIlݻ).nV6$`Zi*':~|SS eVqp8m4ɓ={R 8h!'27?ȍU~jPv@ˁLe4V(;@'2# Pv8 2c:1Ad@"Ȍсe  (;@d(@>Bw^Pv9#2SUUBq$3Ekd>""𫯾=YE-(;|ь̔ O>#rk0wիph޽|#Z$BY7  cu59PvSZZus[0w:ĩ$(((8vXQQ:r6쀲Z *BBB/^̩D-,,Y`ئPv@kE" WeW, (;XPvee'-Y{`66YYIuu ~K,#C򝒲[7OE*"esdB!@k"66\B:Ckk厎NK_8!]SOOv#_3G$' ?s&'޴AM./۰ag)#I)) {1Em =MC؉B _uAzz<}-X4` sԏ}|NNOm(;Zڵge~Ry킲r==ڶu޵Dҙ6߻k{[%g3uBQ푑|SٳwqzeK, (;XPv4`i@ҀeK, (;XPv4`i@ҀeK, (;XPv4`i@ҀeKi߾i#gAiiwIENDB`ndoutils-1.4b9/docs/docbook/images/fig1.png0000644000175100017510000006076111253216103020723 0ustar baeckerhbaeckerhPNG  IHDRqaңaIDATx \T rQEJA*.hP3o(9'E5MIɴP@ *?3_Yf 3|߯q^{kpg}Zd$1mf].Ӣygڔ}wi6} #,ܜm]#獅ߖ2%j] wrkjˤAP_wI&O aV.0  0 02 0L0 0 k*0 4 MiOZϗa;dud;_~0L@-*_ݕu}C9gz0D9tѣ_L'ڴ7k20 4qP2Jd#~SrLـy0͓cpLZ5T=e{g3zO]}jOku<6,) ic=BWtv@'*| o)öM¤{gsRiɸtt})Ab2F&,^H$P>_/B%wѤUR#zI`xaw'>$|LGވ$d!$B&QM:7|?nc:O+0֦¢;aCN:M*~YR+qH47O]:; ~rׇ?͈'*Ky" &W]LXd̏Gq ۏ{Q'W%UMn1̯GAa=m̟0-X>5q{HTi>񆤒I]3nД݂in4Bߟ{/7[ Q47IDCAac UiәRd?ZT`sN&/2 r}2L FCPyzw[+_R #E"6(TMdVm4CПj~ {J!P$ӂy84H "+W\;]|Pl/߈a)<] o&Сb{g4UŹ/X+WͤsyduǶ0PŮ0=fr uA#"[ɺ|P5q|C&1)lc x)qևtj ߖҡs;q­Vքi>gc='DJfߛJU {nyO Ԛ8soTaX $pb ڀ0LBMSrM|j1DTUWr'rVic=*ɊimnBxa-#{>"%U󯼥(|I b`񓣐N5[:j-'S]w5;zL-TVݧta6)<,T#HQU38JmW4&GklFCiiiFFmW[^^&&iԔ=<nmmmHe c]h UZF2 c$4f[-2N'gp@W]?abҊDWSz% Ixŗ/֝ahz(~^< %Ƕ,UYd TKVVց~q?ttW?Nh< 茏؅Gx(,lC1b\Xk CSx}aFڪܥLst޽ :G;m@@w|T{'%}ݷ+-,y1cƘ FS Tsrޘ7oW_}xf 4hRG.N5]bk;ɩKԤx{7lӥo5mngMm Pyo&??ᄈwi,sqfddL0Ksfwq􉫫MD6$rt-/Ҕ|.Y`A~&%urR4S~cǒKzr~HT۴AkU7pprrJLL]} "**VŨމ}þIYwL5Kߥhۗ٦ih*M".nI,8y1C j||I9cI/`b*?^H(cvq2:9t6` Mo8CW  rjTzOIC{oݺu+G-1ncL:ihh8Ef..rBJ9H9f[SWzV@S(5~PÇ++%9+Wv]gB( Gj<"߄4e+i|"X&&T${*g_d) O"xIU8KHu 6p-!'|5q!2=!JTH1Ij⦍U^˜[ɉӧԩS9j1 t#g~IKex9bjvPׂ5`PP;a ̖^o!ɌZzĮ㜴 F22č4KEOnV4CW?G…cn 5iS;x!ɻf>)T^aqix.*W6vG#9dQģ8" [gy8>NJ ]<>_: JECS!Ұ=l(z!};_(JC BBB9j1,3Ƶە% v歱Y L v wmwVR͕Ou\Ohߪ0pxQЅA>E"N m֜7_XOR-wsˍ74he], $ߊǗ-;6zt/(|֡ѣC y,?q}(|o.VV0iyڊunAMeRJT֩Y .6`'÷%x50DerZi²{/ɹKMlbRS RR rvAA=/07ŋo*j0M:5h񌬛ʥOU`5J km0p࢏Ϧ@gxB5JU˔*wAe}HڛZ =%nn6F]LNI)SHPP__`R8[n݇: Q%U KP`d3v}uG/jZ Xuy?5@ NZbdn-i>kA&,Ns CM.KbeLp|K mﴺ*E *!-۵mcv{"] 7P6.UMBTVQ '#&5 `+ *c_ )TXSk唖V wi>Q}BB9 MOOYZ.7=ȃw\xE|yHڮncT39rCܕۗ[X]UF}uL41MYM, ާ611l1Ivvp )Hn[t(~TJJBq;>>Ҳ/vAj"UVV ZbF|uΜ}|VRFc 3'#|Y+!C-}XXGh[ee (h^݄-Nؘ9;w{!"TϞyš%a]YSСN#F)P)'RH$ꂕԀYZܸqW$I#F(#kܫK(g||k(Ějp0j]Y!l@`vnW*`H%M )7.v}}-=ί;ۨξSQ;|PBAQnnGuTJ3QVU/b;,8ϞVTT޹re Sh,VԦX 9*mnjڪ$PP;;G-1 SJYP+mx`SFIIEz8#ybtu#b$I5 *5Դ5G-yf\+,nPZbU;WZߥ0~wojbmm&~Y VQ[ήYzbnnްݟԁs?ϯyZ]J HYV*] .pتw)&)T'UJnG-1 SjK,>|^i 0L-QY usqgj<YReeejj*mWTTT?<}:ny37(}>},,gUbnn^2CYR"88&ibXS ZʺuB,Ϟ=_TTڦ#xMlsV1Kh;::g2=z?1b45((:JG,Y[H5iQKP|x Ez^^NBB]Nۛٵb:f,q<|+tnEjj[aϟaġUVyzzrF-aM5NORjjjbbɓ?=ЭC;xAAmm=<k*|P-PqLmh⨥ʝ;wFDf``9s ZGuCΛ&} &'Μ9wc3V(W롌s6qy |1Zn?k.{oŁ!U]XXW~y2ѣG;ׄe1TXS[5m^^.ټy/aC/FFbD:N&+šRhiƭ_WY<'M3y+^wqi"XS[pϝۋUQQBk]aԖEG-pƌI U<#֭lGGG}a5ѰQKm۶˟6` oк ^ekj LL,_X6)9jǎ<0ô XS[. 8r䒇dž3Onmmְ4,*+߻§&cXW]"aM*+s37<~6w 9|xc: w4H> c]81Fbcc!2rd-st(+СκO0aWF)SԱ <BC9s- {]|}4Oit ˲襤?/K*U5׬I27c/ (c5zOK)ky6>Gupݟ<5yLݢڴ169((:<

JtIA\Caass qJXM_ddD%rIIyڵ˫Ku:J@z,9bj+g SgQ8!Փ'sE"' ORj޻vMQQ)ncc6܅{!`q.]*#Z =K履~JorǏwbi6;v3nQKGmHȷ?iT͖^ T ,vΖTSVzLI+N"AA;7vk$/ٺ̾} N~;ӦƏCMO *$'HhkO@@7I&Luº!PMI%̓ i3f`:ٸ19_4ߧ[vZqIVWQ5.K:ujpsyp7~[ZZ5Uz򨥲r_}z݊ [L >QB@ga6Ki:I`D07CW X+ H*?i=GY醠z`_?SKZb|(,,7 ;{^3}WTjj3!;5]j-t ?~<?zԨܺUS4nڴ o:Iz cN;tHA)j)x5h^-'@;iuk(%- ҐXD#3i[^^NД9TURpVeՕ~'CGLE:X¡-z!i#$'"+_Oζu^ Ĥ;_K/rO?]Y4:v4,Esν{j"A} E)nxQ_ֶS[8_.]7A#qWt"Mʐի׬IM%yp!pq"tYG_[LhF-]vǎmڴY|9SO 1b…koPY\:g{A__{{{Ks{Jb䳢wUݼÇb#'?OMYlyRHJۗ!5iqB5**URyT|'&N q^Tjy[a+~W8!'Xl6tûed(b||azd%۷2@ |(^>Q\V)p :DEHH,T0RM6#O8A>1Oeꈵoi qrj1.B`!]/ cC֡'4ߺU&Oi8$&8}:{ЈU^HiFJkccSAutlzux$ !8l4J^"#G":5 vl)õAHS.^@Y|(v-qN6_W\z)[/Ľ_b2Z7n\NO?|$Axr?4݇4[sڌ=:=1[/d˜1xźA-*_ݕu}C}VzBx")z! ZWޠJZI3DH<{ cq9H*=Gkt"jMf(b<Ѧ}^Ƥ`1D גM.fKO!$Swnn%ϩD$ɪ6 }&ßyƦR*M'eXϚO56pRGamm}IMe }VN|I*K]%qqPCHR/WRѱZ߭".I}D-_:YYALL8m'3=e{K)SП.HVZu<6,×GIz:ЁNUmAk'޼]su ;Xyo a1I c}]TTPfOMQBx%523oSt̸$@pmtt})Ab2F&,^H$P>_/B%wfFjgWI.%lܝ\\r :t25y#atX `G7\_"2N@]ŽJ9,+!OKwISKgO07yGQD@b #U7 T.Qd^ԉ{r!jta~= K% *>t 4S:b.aC<Zr!RJ&IPw|S0ASVwh,͜Tsf+ahU> F%})j# 9ZS5;T,_6uTVV6x`9 T_X1! jDqZ$e,ƍaKӡZ!QJW(((={2 \OKcij5"::TZ)-07 M:|B^Q EzhC1'8rl[x^uKfPu8TpWzӦW]'^$04U w)KMMwAw&MZl4Vm5.58.\h4R* QZZ2~ V[%ugΜ#'>|h}XK`MAZY[g3LK&U]jHyv@o]g7sRS lI[[%CO5LM[yf!C,^Ue?dBaLR*g޹s1LM7{ѣEu1ݻ7s׮_--;NަMYS uGOyR~QYy{NV={mͧ634Ԕ*e c4(߫*I U]]==;q3!!/%O?]1550!xhjDZLP8ٷo% -u5;ZuPc/XKXM[ 4!XL"=)1gpyP-NĔGD~嗻ٹ=W]8))ʕ|Nݫ&yRt{]UR=th_U?X=;WC}򪏳pXQ߄5 ~L.cMJͳ؝4|d5`Q{R" HeR]#7Mt#Ýҥ_j)6|2{Z=xhe۶Eλv7vPL[ci H3 ؿy[SI5 1a>"QWR3|5O`vJmr?y/>\YEֱE04W45UWQjS;456jʓ7ECH:$HlVhdd OlX>'hF X-cIejifKf-b_}5ݽ|pƬ6*lqfN$%APQ}@_Tg CMZ$9Z->#} Tݷs+WCVY:۷'{/k+އ8wYq O04UtˁE]QJ+ +lu [b1E<+&M̨Jh Z06M*:ZDu[*Eס -.ξ; 6^>.j DˏS냵@qZ{Yy2I bD"2WVvn{> /Z64z/U$QD1rm1)ʔt.>-&v ,zAVf=uh ߖȂZOwZ, >> }?<5B GEC͛emٴi4wNG:R?g?R¬J?E[5}Z7nLwEZ 2UV"U e`e`ynJ= Xpg-Rt\ifѭy80q5xjc"Yz|Ykmޓ*jEp; &s4f19k'S팜jJ©gB3J`!l{vM& c ͙..!?9d {UPU<0a2>pb9#U-phh֭bՙ3C/UuiiU<ՁϚ*0ZwkM4{"A#ꈥuu3m':v}{=/`w!t;Xةٙ&Ѹ6wxQz\i.V_} 'DҡZe g,$Ujdʓ 5}֔I5lFRZdBF&-YST?~<;;s續8l?ں<=AI rpuŢE^~َ|ShDkBSL@Bō7"bI"WJK>qbLD)MMLa$*{GWR)a)/Yj~`p6f Vss2ˆ-C `dNaV\4 9y"ꢩ4jS 샪MG)=s uCx?_:Lr@b` Ѣvan-#Y!8Ap-b jwdaj.G;e> Jn=:)A?EAS$$$:u@{xx!CΤCAdjgBJ񁼅'9s īWK p(駟ruAVii7tܢS1oŵ^^N)C3E{u˄M<:98P,nUh`tϒ =& pT-$QCcfR xDǥaRf6ESFm=vjG&W>zLmW~ZUQ370+ a~~~PS{e=Qn]Bw/_OB4'g΄dR&rV(nd{5kB-+WG9Z;}ζy4׀ augÆǏ__62 @apʏnƌΜ uT5 U[׃ ?Ml>yv4WZ59r/[j$neY|^]=ckklـE7l83xK[›5՘i9:rHHȦ_~ãsZ/@Gng[Z u'G1oĤռy^c3f޽?-#IŬY ?9󅷷#yMM-/Q($'>w*ttAAAoZLK`ƌ/_TM೮];e묩Is# *BhZ켼G9:>`řT/E$)),-gd\7g'QQq9''"F;_yT#Α}V!RU@c#Ϟ]TTڹs{N@gbӳsU>ٌI&ɬھ[RRq=h'v ŷ{?ss+(-ܗa[̛Wݻ3̞fM56 e$[-酅p+**RRR(aXXmWT}l, z>~髇geΜw6H>];sTP"1;zuS{hmm6|xZ)JHȋ97.:8XuZX::o#\i-TTЯ7}}%_x?NZƏ>:2tBQjaD4e[&]Rϝ׽HaIL=y}r&Mߥh4/e5PVS=+WT"3VAAi..qrygn!{{NI)>%UnyoVllPi'jkk!4T{z(lؐ*-ӽ_b>8__ZZPIL݀ +] ?{/$% {zܯJ &􁇪Ch?Q*#ξ xMݽHVVm}n$mxm/.~(7OI̓F/w}2;uj SZZmG$1 / 'DN U/^.--VԆ]י:;vkvI&G!kI ٳ&A- ArSvwqvnokkQH`H_u^Rɓ?5ZsUݫV%v`ɚjHpD0eŊ!dZ[.dF)A_եw7!!`  D S?+478;hG{{ ;;ŋ.֭g6mJgk?Hb9q7>ТE{1czk:mH 莏Hʺ_ ԩ4Ch;9*I;E-BAin7ꫴ?O tt#T#i>@ov~2a ||u萓S{|*K [JJ*wVT74Ch{ΜMM[R;@ y=B ]bMmpD0hdDp|heˎ!qU- QkInn@RR?]8pgv6]>iA 6>_:J ߖ}YW'''A]fG$1g|=tWFͷF SMRӀnT8j\Wv~~vvք4mBl>}*QKT]Á MfG~1UhӾML$p!{(' e+`#UMKؼÇiRwN$_$%YXXŋ?D?5uo|JNԞc=0OP9"1be1nkPx(J{J*{ ڊhY]6jQb M4C$YO!|B5;w=NCS#{Z[C} HbXO4%HxVLڄūϘJuKEPؾdrTYέ.XIgSLh&I3!ѤUR#zI`xaw'>$|LGވ$d!$B&QM:7|?ne$h C4UXt҂Xx',XsI_/3_QaYy%| B̃jԥ'G~}.5Y0x1I1й>uѧ&sВ{*/ސT2Ikm[3FISk*Dr0)>eMSqDq>6&*P_y]Uv:)*KféE9w餜j" wܷ~I!QAn<]/ )"Q{WoJZMkZ6h{g=f&R1ɴ`~ "H <>0bۋg#71i 'O7›I:;t Ff,fҹS8>r!eG$1ƍhGa}Hmp(:'+joM G?(My<9V$R2/?7JQټ'U%gWv{UاlřS|6w+UJP$!Sd䦄#5M5?PRU]98ȝYa&+w% axⅵ.vOTͿC'-IOB:lLlLuaqh10S}v[uҥpDBMS"%8yX0FjTkgCqڮhL֜ ޙBim{U1a5UpO)>_&h ZԞ{eԪ m!E qirM}kt_MCq-`U/ ..UJ0&##˭ "KC}D3GODq2v<{,F$bD~~m1DJaj+l؀|Ъ|@JRR&F$"4sƵZjEUw$~^sݩb BR7!ԪxI;wܾ}iӦqDضԽJ#wZu04U w)NyEѣ+++9"atcmVsR#))IE yyy]V'`4ՠza]\\G$1qt.>>!U1XSV:Xr/ô >(\gAhn&S;_820q6{ҹ<TZVkw__+W֙TkAo/Q"6Nфӽ_ N٬$_O8!ulXԎ65pC :,yh G)O["Ie4(?ϓ0-AP|XW ƽJ"6irW-?4eV)9"߄R=[P:f*Hа`m­ 98}z0ϫQX5\5O-LUgᰢ 1Vk]PX{|>2T0͖[6aTFMMz?Jz*vCpjIAؿ+5a/Y 8꾒i/ި|۰Sm[ɋ԰xI*T֒To!'Sll̜;DF˿t(+С5ĂM+#)}CC%meh0MUy@0M{MU

vLQP?< QSo.5=QQ)|p?Յ7˰d4f",RZaX|`[+T@R +&-j ccДECftv@(TI{hq|P?^}:?Ob)Ty%³5`3u; "Ǽ*Wz:7ؙ9xPՁΜFo|})eٽ[ـzu 6VU$QD12vsL&ˣ&cB`KibnfBVaFֹgLP돊5 ~t*fv\@ DLDK7L$SY 8Tc> w/7[̊;ٌ dzdH$]]m>dpV]}HD9sm.e{>D ~!/?G޽WQ~~rͦaږt裏Cj-"7jl/oo{_;-ײmk\M~j%1ɼbZY{R%U8CrQ!ۨ=)}i3̘ݵ)vFށ 5%vT_3yPL4ʥ[g;JZhԽdzgD]Z,R?XZY7y$/=o׷׳2 ::H= w!t;)L<];/mߤeMR APW"P-`F r3R*NARDQL2IA>kJFܺH*;ǰUr>KJA0F L(U;j*L HyazXPp6f M+$)C|=C BGo :E@V(mTҲckyoȫ>N_B_-VE ,P h Ӈyi3rD`u1BF-z51B<'~gvfj*40:gI|vGmL.7I+Mt\С <`! FG: ƍ93!@9s īWK NR"+(.|P" MO)N = t"̡ĸ6͕1ꢉX?<;%ҋDuT؃|=pN(wфv嗨U5sSɺ C2UI1LE|t#j:[vhՙ$65.\33H"]?_5tRffxlw[XGݻ)d@ *w(DHR|>9'5SPӵU} +; };72!OW*ڵ>#%šݵXSazAg.$GLнW萘nZt?˖cm>$ y' Q vQKT;rdψSH'\%ZqCC}Rthl@bmBؚ%ƇRpV?[bMeaꌣcի4Ks?<|t>tϞU▕=!r Y@P;,[`cZK@wnןbq׮MCӦOz^~)B>qwٴi9!$\OJIr`ZaMeaD6T)W!ItZqHnW5aaTaiXSaaheai;9J0~ڴimbR Xދ] g}vv 0Lpy30 0 k*0 4 0 02 0L0 0 k*0 4 0 02 06?BiVXX2 0ۻc68r.@ ')Mo(`jt2C"$IG]D``k"NM:$C{)In2%RiI>M_BR$hF:NZ SKh*4el쁦WWlO)D1|ThcskӷyFwNhT4ryOsz)ϯJǝU[[[33O/T8 ln _ _FFXA ~O&sp0SS 14.eم09t]Oֽ CCj__XéTLT*OLx4}Yh*d&`DE1R.'>slWHeiS, ,kddJt8- vf"&#n EQTU%UxBZk^XHh/?[tȢVkl$Ә#2n, fs)(p+g ?W@Z[,$IitR$r+H1ݡ(v+bFIENDB`ndoutils-1.4b9/docs/docbook/images/fig2.png0000644000175100017510000002520411253216103020715 0ustar baeckerhbaeckerhPNG  IHDR!Lz*KIDATx XWׄ֐nQ6FDH"2Aq(.EuLcNDD7&Q$zEihm " (*$O+AzSO?T: =N-0UR[[P((]SSAzF H$!+ 1OfF*..FB&ᳰ0R(NiK{{}=D}/99+o?,~^Pɩ@|J3'3Bq)//$7 y?ӯ_7d(?njاkxܰML+,TjrÆp ~~>}||Vu1ƴ@T9992YjZه|}8;ێ{oo'+V&22Q{wc49K^{tK|"T' `TQ.#455aw 4mZ̄ 7f1Fڳ'0rWllW-]#Hdd,۶+ [/_HC)++~-0Ź2j5X$n=x5^c?P1`Ж|ryѡǏ;w]|k1Jݽ,] +{c _tE' %gYc74dI+bEeKfvv 1P^洧5kOkXr_6i={Ƈd1F`ݺYotwO͝O͍(~7rgr4ggk1$',vۻY_<6]*u vEh*32Jegϖ۷>}[ nVVd1ǶmFZb([wIo..wDђ o᧥oߎ~ʕôO%r{Yc@Wӧ޼9B_48ͨ{&ꭴ&%ã[ǐUZ!t=uҥwi&$E&{ ~}AvuH6hJA~&!(!4 +W 9vE( a}t֎Y'O9ӳC߳#0a€>h[aa{I͑:o'[g5![4z$B xevA:7,}gJK3£笕ωBKl4Ƛ\?-zyWmlTrCc(pS5hRKaA >|ڵgu{}`W,A4hjzY&3+/Oxh3@mUMaϞ-kFpqwԲCYdRRjqm"BD3w:7ӳ:3JB 1嗝R{_68..sg{c(11ߴ)\a۬Ho$&*:vW``ODN0H SPEHX>N/—ߥgreʜ9C֮b1Z=MJ/tHu, ˫ \>>28P */@>rG㟟~1>^ݯI$k1hN{n_gFgE/vFjf[j2)2e~ S_3BJq wkWf̊\p?n(aPfhmoF;Сaи}>a,hܹh8*ʛiLcdfEPY24Dޱo.0C2 @^Vs Ky;|xcڰƇ{A ^WD9WWz!- X f8XcL㤦j tXc> 'LO?;wsk:1扜>}zҤIo޴iӊ+75ooGݩ)ǽrvQѭ#o6iArLe4}و ctf͚####(H9A1kJt͠Fi,ÁQreѣj͛u(i$dfB`ց5hiY$Ğ(ĥ9sLK+Yę3UfY4zsX1k P{iO,uaiiFm :yUVa ?<8 Cshҥ!!̆9V"3Ii,aժT1K鉥V &oˆBCQ+cSZ*##t b 4f ;wM4pD!B[+Txص#R9h(9|l)B=k7Oʷ:Z;ݍ|%`{$CS~܀5kB2dcˊC_yŅbi…v1D(88@H//. Qhssmpt27-Q8sE#e3?54HH=yBAE=4z-!-,F\\#4ׯ׊@KC%C@\~~hJG>#"+=NYuC׷;ɆZXxKΆ!`C.*Y(rmmmTP>CUc-)i\ŨpXN8P$4\ry#1j#bR9@ꏡD m#kΜD cҤ~+Sʠ~X_]O"R}uq`֭ srzڣ$>~!AZ=v,z› >݆zgqt9!G/Wr( ":W:Գ k aæ@nhPg(W+ Wһ5ʇկGkCXtVLO6Mg<~ȈZ?fhk2k5`NZVC5`hmZX+MϞt5Z?z?fA`},]V^ٸŲ?~^ j隴rձn-\:mڒȱC _?,lְaγgaY|Ϟos^ZV +*ve˶=|:}zѣuȥ/;8tYk1L-qr 'a}ɗ=>Ӝ#iK6+ᓘBP|'aaaܥRoLٳ%IGl|qRrJ>+:ۚ-:uJMMEtu`)++N[Ho..RZ {ii_ze+\4WL)?3)2֏o4BR411aQdCvڵ N]ZZ\\j do/ӳse ƍJ(F&2fAMX?AcC:v1eE_#vv֌~/$̏^)/ܺn$r2=x oI; sɌF^re)DzuY:Bz?򺙙T$$dTTT*E:H^zpdG݃d|BʤN`?K#C!P/6@Q? qiqX +˫UNXVv;)Uq\a5 *tP7@aCx;UW:KnAg>a " 5ĩ '(KW *\)}Iݝcqq}rgK`57ʧwVhC%8: >t菬'8)t;3{!. !J$ WH``ؽTZ}?H_&^D6uX$#.OzECu4ȁ#[ȑR|[2Mö4ݰl}d/Z !0e^Iܭk ;ţg.acdGԘFtI"NwqG=vY72`v0hPcH%`h@ ͖m>!Bu!iPgW$Pԓ 6E  B\{.OͳXE`hxwF GW t[nEGG?lk i{ղxP߀U]]24<ѣGǎm' iaϵX`ݻ7n%܂=;?+e4vjժ!Clٲeɒ%F,f1# DQ#,n A'8nO9rdhhԩS.]~;;;kX9͌c4znȁnߛCDcBs4~^D#0˷4'OOό˗ /7z,+nޣ,U PΝN !h==:m;mllm&J̙þ-`p͸#wӭ۸(ru>ޏݺyJx\h;Ϥ ,h 8PEWմo0)}( #.SF0KfÙ0a7ƶ44?uy"7(C6Oz߶ó)Hܭk5@wӳJP|zJg%#GGǒs:)=+d(UU-yN,A<=h8Tظ7ŰC'̇ƞxstsԠ?DQ=s 2;DHK3R#|^!!kӞ ;b%IV܂R}c[h"pQ\5@ݏ KiЏ§_+=Ii(*F qxA95{ *PP7y[֍4crzѹ ͢CbM#vf3ۘ'Vxs CJ@1ie'QSi73bZ5~B\c o\w}'4 Q0IF``? Ԗ;0܃5"f}#Q[[P''tiNM ho/qd>1'410ؾ,~U5=pX9Cs*įQ_ B,R%~ois WՏHTaKڇ@88,y(/@`>Ќ[5^"i @9Фo rՓ[VVE5}X)) ^H]T<ꚣAWk4\\=7qAթSQ4D'=COr:g4057sNdr=}L!S&2R=ZN&d2كZN*:!p/|߽Uj>=8Y./_%Æ:uYc֎o:t͛ϟoJ馪>noo3}z߽{5+։,dJʬYjjzk)IZo\`L&*um_&NIVhM N%Xܻ758'G/Y.Xc-uZo3\`ZTB1ƦM(\֭bEЎGxyރ83H }cQQтS"ZN4Kz_:rkaUqܙ6[3gNfH7hC[?Yc-+׿bP9tHak\;{NiLC|kՋ%_fg'i|Amm'98f`װ[f ~;vd mHp>mj䂤|Ss\>皲_c)ߨPTz{;IWtiБ#ԦM;& ]2YizReƌ?^<ܼu5֪oܸas_,MDC۰lJJ1"6p} BtϯJxle2JKkRR ,M/pn 9t 9sbnnu邳SݘkӘF) ./M/g8 h"nh_5sM{CP酇{rPѣxkcbU'y@$?4D{C0ZkQb Sܭ|QXc#,>>>Wr(k:1 &p({XcL#^aP(3}Z1FEEE:(>-tN:%󳳳/_\\\,B+`1MSEdd$}E'M.婏72:a1&HkQXc cZXc cZXc cZXc cZXc cZXcQkn;:>o\rãs=k›BUս{6{wҳk1>S$^tCگ_WAyOVo l9w6,[9sLK+_"LtPeH_:d1-uhhH7*3lvP>cyPI;Vwiܘ5Ƙ S;~}k!nެY' l'ufQ:}cĉ`H/A5SN"K.1YvYJ*⛠2$`/`}Ҿq6m KVIp-z.t$ {-]zJC̙~:Q^ć+Cc% "C\ǎѲ!+49N8@lȝ;7 "B 9|,wY86صk]4$9Y{AIlCJuuq"}W:~|?Da  A i1Ȉqrz^VVԒS.6h ݋\l5#l" wJqBuKHEX 5jߖ->9*mXc@ihFt8ioI:zbݻn9x PI g$uPXdH!h A5yүh qO&k1+=C h!!n11CȼZԎׄHT6N\\mKYii>V.uT zq]~(= cȡstN<|L e#xh?Pbΐ!=HP)^wDH+l;vdOAŷt**֨c:.=A -Z5wݺGC|h;&4}lO#~1DŘ@WPrk֜ ~t|s T`ԩ":|MMLZkx7|SAz Ц!0BAq`F@mPIC!DV$Z<׮Ո%ϜeHA5ri/[,eԨ}bp$cE+j FI5Ƙ|$}  ʺNJ{Sߋ;iGY(PP 4kD-H_KP_E G'(Gwa "(((&fUxM^Q Yr7߇5ʄ Q}-[ xO05$~1>^!w?ooS333wp⭯^aa-]/\px+Fz56v'—c*99y#M*um}6ᗌҜETԘ1cڼ9NcKcdgݒLLaéx׷5}:ꊋoAT׮ͽqհ0i@@Hlԩ =;BmŊJoyyyee%II/\85~~P];/ΎP\P(*kk]RUPPp'3c(8uԁM,5Ƙ қVP@uH$%WVTWW dI}%vC͖\^GiDGHc. ~..>:NE412ߢ:\PSSOkn#QZb3J%FDy^pD"*VY)I0IENDB`ndoutils-1.4b9/docs/docbook/images/important.png0000644000175100017510000000033711253216103022103 0ustar baeckerhbaeckerhPNG  IHDRHQsRGBPLTE!!1199RRZZss{{ pHYs  tIME 7GIDATc&0@hN$ _AMo`w``D'0d0T:Gȿ8PW=CIENDB`ndoutils-1.4b9/docs/docbook/images/tip.png0000644000175100017510000000062211253216103020657 0ustar baeckerhbaeckerhPNG  IHDR8ksRGBW gF[?͕Hf\J[LNTF|a8lͩORU>~*!q$tޟI$8IENDB`ndoutils-1.4b9/docs/docbook/images/fig5.png0000644000175100017510000003157111253216103020724 0ustar baeckerhbaeckerhPNG  IHDR}BDQ3@IDATx \UOD&1G-95Mk6u 2-pq$B`"2( ` HR3t+hF}&UgC}^w&H!  ....................neg.d V-xo)h|uA&nHfʗ)yE%[!tκmnEɓn>&{Gb4tPWI`ggsR;$C{؛&mO|],͚}s>ݜ_ vv:I9 َ%ӹ*~3 C}]M't]PĦSXO\-"瑉EG󹓷'Q2"etaC7G0IGI:SW1kW\>u%*@U]K\%U…T#^J^yȵuZhRVȗ^&]Y=›P$]RKc}ɎWɠP=ɓT~dڎɒ\12 T.a5⼸dk'mϝA:;xwqV?VX*u=. hM 'K$tŃSHJ&ܫe)%ryJEm,]ތtNv:;)3=fagk饗c˺ݟxB7?:~T:|/WnOun3] dV}{%,MKGjdP]-k.4H)ȦzЩUdoޗf(+wL Q=UʗA{S <6,FpeiMVF]#N io*]Sf3d-͚ph. RpL+eW zGbix+S]>;#dQP&$c,zb_z Yn7`@95u% LyFJM=&oO@ӏ>К*<]]ŠV3=~*};X[P=#5$joK3t0L yx9sg9wok}0) tNxW]}w(=>&[_ Ґcw'O1~u.`/߷~]PCz{؈Ś}|p$SsnXp4*>Ƈ.eiSf $_ͽ_xz||LM`Jgmm-KOOU^દb/9P4V1i/WC ,44T[eܹsҥK+m^\\\H6l0aBiiifƜK''],5:wF]e֮[ P(3fj>5ouG5>7دOkN[i5qD=)4իuE}S^WAzcvL9߯O|O>hwp2Ŧv~_2ewPeܰ3צ/}G`݂r/ǖc;K7(( ͢vPWq5o5^T\v:|lg=97>u WW,l~j_Gtl=[VH9ZFwIT^t_x)xi/h0U&D ӑ\ XI!khG+t񺓶' SznGa.>'ps >a ݄ gs?G[~)؅I+sN1eNډepܷLϭAR ;? xVfE{[+hbvmw\jpe @BfQʼn^-ENdJ)-V-} @S1$ՠ'Hb΃k֘A^֖dlX1LK ]s=R xw6jV986Կ,cosޙ tp6ޯ#Y2oAK=/)+zHS>HT >g`<;؟ Kg»*˴7B1ټFM teB*mnbnՠ -M .SKk_߿Z}S>G~bi#.! JYuYs+^Gt4@zWvLoC?Wz GE9` [&5r 2mZ4eVΝ >o߾@eHҳA33O'pɻ#٣dESx x7%#G$^ӠϿ=lV!UbNG&WХn$1J7]Jd/z{¢Hi1]%%v+F7^t57=BY~QC^C7 p&޼yKC|=5i铄J?^ K a(}EtJN;r-(!YVHڍB!].ȅUlUEdL5p_4~nJw-\sH"Y#uN@6#.ojV[KÏUpDkmݶ) [?b /caQ1ݽ/E\P?s-1)L˼B]!Z+ vwë~EI?eDž EɈgWt_YaNi-O./jV/i8=kV3 S18vv~ݞ<޸qT܁L[RӺFn#EGZ =sbޢOأcxLƯO /׎?Sv< 7TPǞܙ_g(鍢UiGشiM\>)Uh^Dy\aK훙)221e҃~ؙi.))(gӦ^|%&誫$ɮ"MLu1ΉU%rHoR m BX#Ib~O͔FTd?JU\z#ϥ F?~>μa\%iʏq.ٯm槺#U;6/:h^{\IWkߢ˾)&ZH֟j6Ҫt1RN.yrج;TTq;\T|RRH" ʊC"w铥KstK+Lt idLpff,,)ɕmKw̘'}'OwZYS )tNI* mg=2(A%{RK7\ڔ_^.2Ew'/I*>%H֭HtK][GqWz~_lx+bUgٳ!Vڻ'0 TO 2=g**}-g*=CHB!Pɠw+"Կ/!%sJuN)*|,t']) ɋRND)>Kл*zQ5ZSo %s,[\|Gxm ^d&R#gCbc߮J߿Y_Ԇ ɑ_E|$ (uҼ㍌Ut7d6n;u :3eG9~2XVͻ$lzz١,'@VkfAAg(=v 1.UKabbg^7ө(N[A@bK3./ ^J4GUUW1Ӈ{\d`qD߫Rwq:")q]jq6>VBʩ.@'>>xғX>gG)T:٘MiV1NI'wP4L99dCwu58@W~PLb.OBύ]ǤOOY!2@Ί<=z9y4J R[Qa1 h΍,Xy5ΩJx 1|ZT)ǎSvHb/gcwŸb6Ӳ~33[&tSaZhP]?3ynW+$~F9<1j\dw?~H0*Vջw:sQL¶}챥"Fۺ.LK;BFihJ-KSS˸A)ERJqu j;kj[lX*jU2ٓϤ9ǭd\tƫ4;bJLz!^:~R#w~e[SS;/|CZEUg26}9hƋy.C*U xúj=l`@zd l!4&} tfHS\^Zs#-Ghn&Eʒ,!cp쌲R`Y=4O&?+7LW,EM4O/g)d[E|P+nEæ{Z[0tCu8Jճu%W\kkIU:.jW9.$_?ޓQzʊж3K~wAӡ*3=`fY _xma]C3;Y.*s$Iyr׉>o js*v^퍺@a =zTw*[sN`ryyiAAUFZ@ˆ+b8HIZռɐP䮨2y;:E- 2tT}l&v5eFU @ogabEobbľ}39=gΏUoBLJ/V ݫRcƈK“^Ǟͤؗה֑4Nuʼns("cAN.%A6KO/&#bez^@Â7b227`KT}f{WXMU9KR~ oQŚkC_Y\6 FEfeŻХsuӨz@U@."=$bܔ\;PnoR#G|K{.K&0II{bbVq([=͞jS Ďw'k,D;?`ػՠ(3!ci|,)BXiiGz'zBm.yX+ꢘ7eyFO05#ˠ.m9!k{N\3_,.5W:Y|i;!X_4",-TSލ>]AjRK^ 8"T2ĉxZrYYǬՂ"c7@ߴ@JL[k^iOW;1;sže\6~uF Q[-)HbE/I)ƍA]ʖتe'>[.OHޝj?/Α*Go#qizMqw-7Z EUٟY4DQs||h-sV"yw)w(*֔.XҶm'Z^t Q%"Ua}|4gT:wPZdV0#7C+~ߚ;`H&=zL>|xѩS?t/1q co!€+n<#WEHTxϞݢkR[$Ճ-5c,3"}yxjh²x3y1lغ ވQ-Tꘘ%GYZ0fN榪=;nf3zfIСk(=dAdA {M nGRܹzerv۶A^9?\OVV<\Xj * LLe6&UYz%Cv[H0.hXޑENV:ؿPM+؟NwAI-|yjT8 Fg]P+zFzW:.]PgL v!R|1灥i)^-Cۼ{4ʔ|4 <6;#JwjmI '_SqT@Kfߜk7痂]tR΃kB|#et.2~P_~h$?dӉl~/]**x!iTn..V$Wydb|gQLHd1{{PM*LcR(.kzl̚Oq PU*uWI$Gpa24UEwE*4 Ng/݊>uЭM\Kޟ4JHcKNp/E.Ma(i.)dGҫdP(LJfXI*?|wQmdISPKK^umLU*Yaq^\Y v[ò_]Qg%Ʋ?3hАX*u=. hM 'K$tŃSHJ&ܫe)%ryJEm,]ތtNv:;)3=fagk饗czo,^歖fwk&[..}mYisH YEr}Pi,KSM4\VB6:`h@6itqV8=q#`dž,ʨk$i!m8^\wFݼWVwcd&gBrd9kW ʮ>R1Y;.W|v:G,#LIR (YP 䫹#K]_BԠ~jj ']==%<WmeK62=@9xiH;şN\GS de@ 6b`_P]](²es#SN\-Z?=jV%'ie5`&b,oaoty~ۼ2|. zّRP4|ӹR󹟝=]e Mx6|WڑttIߜϽ|{yGM)=KR;鍐*70.@.0Z5fN& 2yLw遫}mG:~k݃[qKA0yǛ ]P).0د2>{XjG~& Js>(#,qU{>ݣ<9ӆn<@Ɲڒ;qD K.}ד.d:=>֗z[*zցHqUB~l=Jd=VxϑQP67}2˼rz)9|uuH~I҂0.Z@Qϔ^N i|J퉫ESw\[{nBZzSs3I|.K%u0yʶSwtQ bbdi֬trԬ+%flg=녛Ȧ~SW%z9t0'U5˥C/Fд1ta&!NIENDB`ndoutils-1.4b9/docs/docbook/images/fig12.png0000644000175100017510000013104411253216103020776 0ustar baeckerhbaeckerhPNG  IHDR;ܻ>IDATx XT?xA Q@,PBDSRf}ZKw>)R4i&OpBRq|>VPPh)m0M>^G-nN<)Q'MTPP`ooOK.]`-[+ ?0t¦q!N A}5k;Rz63P!Q~.*8)踴,?)o /A̙3ͣM/^䤢nߏgWGqJTCѣGӦML&QL]T?,@ j1Ht¦.P䝔A8dffҙN B9s游VDonbbd$%%ER!DFF (gPҢe*|l::Edjj Fu)ʚIܹsN'֩S/'6y+4?4@s$Q̕qPHHHs9qIjj*G lh܅#ʹ^)ivOU{ݻwK#M<Dg}ٙ)lܸꤽx1-> |FblA>*CZxm:4%\֭[aK8Q&Q^?~CSW@1>L>I1qÆ ӦMj@{j1NjfZdIYYY3gN]#;v2 eFVnD1c@ xORA2hhZumڴi:UH޽5!/P QUiiiH +%ˣ5 h1.ގJJJӃp2;e:SI//f6*Tťu6OpͿɓ'333 ^oҤa݉ŠG{{ ChIHHhQx… EdaaAɀbcc)4zShꧬGQQ5Zr}X9?Qj'ME_3qÈbPN(P.),,.ׯ :36%%eСyyyܫ47H-XTRQQA9sH͛Go)񀑎|mkkil…GYMEX@a¤p5kdeeǔ(>L&l'\֭[7t-Ġ={ҩ^5leiZ$_222**Jsxrչ~zևsx%V|d!-Y /! oooɓ'}T?&`$H!B #F 1b) 0RA`y' cֽw/YZZ!D^<;u[``-WZZ`0(F 1b) 0RA`H!B #F 1b) 0RA`H!B #F 1bAEW!í :TxMqn@`Z>UZ]M\ZڧJ(pqnv-~t v(գ4:3s̬ꓕ=t&S|V}];wrencPA?8/6+nWTтIGWnѫuмPCjxeAAg\w ޾R,x̉{gNM{(1dy$O,bTfdGϑf,K~%_-* X%)a;3vQjc @+DA{ذ+Cs 4/ިϳ|cSeOpR^_WnQ`RZϕ(֚m6{ IAzD1WRN" G9ũ'^O:VhT !Qɩ|lq0L@dݷ (䛔\lB;E?qVK:B[%wT4Y ^ug| 塕03.nCG1HY_>qH؟o$ס,bݷտ>Y }=ylS U^Y5}i0'AFkׅ cgj@_$An :Mm^d],E<>.ϜWXvODhYܷ$i?nhJZLGx@gόeAǸ7pai e'FHLN(gppqfs.]%;ul7/,8Nմz;i םc&Z"%ű(. c@1KCWrOXOӞPŽMhrFyeN40󻒬K7-ϧݙz,?D]4c$_/T!7*zB 3| Աi2umܣŢZ㎩YWQ[r֠U6tP96{2+?PXz1bAvt센=&Mܨ (:ԏ;7A!!1i1$L.(3C%l4s>s`OJ Z:DM&Hvלks@c`1{]/96˼ h Aѝy49|oyyI)={ 6UTXxʕʕhŋ{h/g7U,)L[--]F\ԹL#h&&=]\0\[^-Сsiܾ8ǎ(QbTD))))mJO_Txk(c~J|Qx蘡 hqW(PO2h8zK6yyyܫxG>w#IoyYGhGDii+)?drM>Gb<^}9WӚ}\2+hwu,Ǽ߸qml<(Hj)Q~xtf6+-7mn5@ Сܧ#ŠڼBر0I&55ʏA- 7}4pB4b޽gY{+`bfv,XcffiRD+^߻iZl:@ w P.W\7Цaæ2|}KJ2-H 6;;9ɓGDžj }T-!QI1-m%Y_?D&zUjжfŠ؝훕X0Q.h -嘷- %;ƘXP(pC qٽ{G Okǔ-p\|r NKDd a.I{70TZ]i7{cpGBNCiIO^ LȈ0D9:Φlě sb~*PUuK"q;6C99hh'7$I6wnN:ܡChJM)H8ؠ?ׂ وf,KNG_u"޽.A/k/qI uJ!IOhA?𶨴>ˌO:'Q$"h)Z"mkiyŤnl;Moz+Ҿ. oVfP1;GSxަ,P-LmyA^]ܝ:~>ѯOޥ=:ul'Tkj",g`Xxآ#)ٮ9ыcg Ŧ*M*1c/${kWgΟ%b6iֆ-ЯX?n@VlJWݼG keSi!f%*q|~hʹdf-zpPȺT++dӉgӏeBġ 3^JShY+ShNGolDQ| ^5cY\oڑ~(e&rrbʛSҾ;ƞ87;B4ټb v{Ir z/XфS~jyH8'+}D^x( 5 Gㆦ=d htDс~ǹWn{,v ^a"^oݷ;/*aD19A:y8ۈTw؎*g~/#G?\yEzQ {{_33[^#~;_^R7 ٻjUE)?\{>}VT|;77`/,<޳]^ÔNy(:uV*Q ʪ--b ^H.2iՕ6oY$eҦqnJ7CΝ.޽ܞcezm+'ND>FxD5Sɋ}}v'[rʽb8je~7lX1t'>dCFD-B1H ~zb_Qh8*ϡ֛Q%}8Jvq پIZc%g5/lؕ+&PڗbO޵H@µlYKO_5xOvn51Ҍ߶lAo?Ξ]ELCnh8z88sǸ@II&g}\rsJ9ii+)2P9혐0Ђ8*4bPQip9_s^^Y%9I(|c݇ J>Ot5ЯWG>-gEʽrK|O> gX DRS)=B-JԂAZ1J&7B?S$?^xn<%ĠKjll<<=W&$Sr#V1ZVĠ;olT!tńyxZ񁯾̑]i. ^u$W{-( =z/ У Sϝ6ljv&СAaohGZIa1w+Rxު wUUVjhA-tŻ Mwt,8Ǭv2EoP"(QܻYi>ROW> -ZX:FYg󤥭mB Š߯^y9//YL_Iͯn dC'xS>{՜8yP]qJq4FַZ) ѐi"He|&^]];}zMq񩲲|I1[r3Z|qǗ|:06͊A GxvsI̬sڧOKMOH㏮J<#65z4ɼ@w Dj KphWG}yM:J5Y8;5upqЀ" e Q$ܯٍ(FɓGׯΌnĩjhn.ݓ8s  kV Ա]]qG3JJ!CD Qm4O' y=膛[Xaq(Q\U;Mz\sSR 7,dgӃhBa&hI~Pa1zt]:q"sи].TT`t}i Ku=>3tp1wlr wUWq(Q;ӈI6u,T`˖TW(t1e#GBgk@(͞|.tT `e^P"^W (ٍa̔^QVv+c^B=C P{mIO!hGsF @Bm֣Hin[ws4qۿ<եek6JkƎ!Q)VV?֭\")CaK|\9J3h6Di]EK!}8!`pi盶.;j_@1C #3jp_. b)w^W|9A`ºgV}`xC!Q lHEq2TTZYkIG)빼vEwʢvK|CB^k꺜9%uC*}&dȘO_-jsdm0Śi 4NU '޴Z=1lZ<8={~D M\pss{՛JN!Qw[#=  c-S+xaGݭհT2DSzlޙpлA/CL c%a$T2RdQi4g /+˯$)zBg!` &e]I6y!w CҌzqAn޹S@Hx)ǎ T q ?fW\9?Ux(}FFlN.]2N((HztW>|1*AV=tЋ%Vܫ!07olޒmgؼb-Ӧb^O a.Hرׯ`$~jUU9?[~P>} %UWWt"J6S V鉭 /~WB5TW̽{7NdŠO6t^cP24#շ(XA1.;?E,==3wḹ}ѐg砜]ߢeZСkj&4 UT!nudA~q jnf==IFg?NZ GD.uká2ss{"J$ڧޗQq)>o_g^0 8:͛Y#}iݠo,BF B?+AI(Mc'wΥkQybP;t*M*- ::wG JM[ 'd1g!` =f bĐۿыV>r`}7bϏsg^=yaݎ3>IG hZ{ **}z @E0=9f-̜tɵOxpO󎟬\k - á)f8!5vY ǠNۅqQz[[K3ECl2aLڒ(tkܾoW'J@C  w2: M!І!hbnf3zp%^9ВnZ:NmP q}߆r57  qІ2!Ж O>bϢCA hWay61A|; nǙ @[歈Y?'$w+ھۙw ;11d//Cm@ jEkkn Bm ~4B_=;/MOV1fwxɄl 61gޙ;zGN_w['//qf'ݺuw[YGz?-,A6ew6ުwCY$dȘO^~U&B hY?ؽ{Yh" 073׫Gzzz~~\.ws)ȪO*h &jM6d2}7 1^ 6[NmFC hŅC 4KDDDrr2: b@cǢC!4עEN8q`}1|||֮](Jh( 9a„۷C t" 1k֬L>]mA hk׮ݸq#b@ hRt!!!Gws~tf6}7t\; 3IӱZT*_dt ӧXb۶mAb@Kd!!!111r\MZXhhh\\\tttRZ5 &tEDDC5C hy!!^̙S\\߽{-[hF 1@|||ryC:,,,3g uLcu 9rȫɓ'y933* \vu4 Ann.%'{{hm !hT*]|9wh.Lhi!qB xѣGu:# Rtyxxx(鲝F1@GΝz={rssi!](!hbd 8ŋ5&&&j1B Ни褤$խ:urpp}b!SsΥg-1@ w C2L0jAaÆu-F 1@r_\\\hh(:1@! \.wrrJnB Џ &l߾=88Xm0RAv@tbޠC@g }ZxqHH_]c@{)00pڵQQQAORt!!!GA1 =C T*}7(yzz9F1@.\m6 ]B ?L!c*EGG'%%-1U@!3f̠uV}( ro޽QQQ2LhZ 6[NmhH WWWfVѣN:Dt^mmm5))_{9,,PSRR$x?333++4((2,!!mk#1hΝ~a3cSSSO)mRDZ5or978((ABףZ^/`l"##'L}`}-k1N?̙3&&&!Z(%| J-ܹs'ZN˼La}ɼI!LA8t^^L|ᇴR6j36>>>NNNk׮ DLg߿N)pЉ=z;!!)+:sϙ3gt&.++˗/u˩NqE]:>)=>e::_x1٩P&&&JknZ]]M?^9tBYcRq37-YZH+((]jQo??L%nݺ^jMT!}TrڴiM;vsq eDiJ{q(Ȱ&8t@AttS۷K˻wﮪ4i0YYY,,,boGZZ3:)#At,GGLji_JNox/xJHbLIN˗/sb9K G\yyy&AQQGF7sǏNGmڴ)B5RM3 $QtQ=m6QQחNI tbK,Q$$$P1j@]`Br*x$Q W: & @mi$6mqsse˗/S6ĸfaHAu gK.=sѣ8Ȟ={::[:t#0g\ԫW/IHH0'66@I˿K/jYQQ2<|>f J/_!1Dghe:Ud:K(Θ1cnifɒ%#ܠE~.\ =gP#iĉ(asWWW_~tΦ6y(CPy&ddt'O]2_RKBznŋ9 iBzݺuS;/J^J{(bR%t$\K/\E !JM6;H7ߪnӫW/={xFx[7!8 8hހJQj0% =o6XAfʔ)od~@?L& O^ Z\AMPW QZߜa_Y-) "yNuvyC6A\)@HJB| d7mUC(::Z<1O巪z{2,00pӦMhYA@ Ǡ۷|vhA@.Q W; 10DDD$''oذaݺun @`C(...44B-1`,ZB-1`:99}QQQRT0xA$22r„ ۷ow[ b!qrrZvm`` : 1CƠA%qX\ǧo߾k׮E hD_._<$$ȑ#b'00pڵQQQÁ`xR):1 {h $JΝsy'''}7 !иؤ$} !*L!Ã`C(::BM`d2ٌ3!A-$$b޽{׭[ &BCCe2`H ^DDDrr !(ABM[lyxzz:99}RT0 AmDdd o 6iڵh Bv+}ݸq#b@C Rt!!!GwsZ;ĠɩyгtN԰Ċ{մɶfhJ]6** 1^ZAkҳy{WLR*-TZ@:NbI禎:Jl2tKsVƥ} {e3nSOenE7YHҐ|\ݧMonm4k׮}N!C!-Æ95}7sw{Wn֝?vyyy j\| ^ӷ`]\FIxٹ}ХK&6k]Ġ؝asXǰz,3묡d[&&ԛ~z\IL֬?,< NJJjԎrsػZjXkV\|>>~F|͛7--bп%m41}Ŕ*\t ]RRoϞ=OFz}еkaúqyK&O6r{.k˫]pvwx_~;6Ǐ;^~N&+؜g)J]sfNt7@Dlb_l2#^'DTCԖ3oz R1z}kAS% RF ?X{ k͎_'ԂsYN<'N8C.]5̙g&d2QJÎ%ZXX^^~=/&9^A{]])oܨ`ġ2PP+-F#>x eS?|x,3f!HMCaWZ0QD,ʭ˒[:Bۅ濟򰺦[ׄ!v**jV:ݼ_Qq&?xp+&f"zjFFFvvSR='֩!I)*?Q6*-j. Fݺu1/YZZjP187;\{S[2!,9lN!)' Gk=$( D)mu7~GJ%rg5b5Q\my.IGD ֌zv޽jժA5d:{z.A^7YϚ5Qx UG?~رn:ըQw v5T #q6znFFٳ2:^^Lꪺ(+(7!aE7)W^ݼ?b̘A'ZGE5, ԃ~έ].-EV-,((strXg"h+mkiWʿO>MBxvgtQ&NBTۦ=p^ )& F( VE H0;ƾߕϸunrՕκgCb 6Q0ިWqCQ9DyHRdjh f޽ݖV!"""99yÆ ;jjj֯߸lYz_5Vw"{ӧOcàU,ڳBOmi#GEE-tLf"݄ /ؑD+J%^|2S9gHQ~,5-NuT˺ow5i*])&M>sB@(w+Zv}?O]8}z /LV/s@p;w LL,ݐIKj۶U_gl=@͝;gm(Q\xk;3 =ܝefsR*ljRg5w4\ڷו*$mԌoP~XzvN A >w.ܞ~U-̙3w^WlU둞uJ+wbȈ-.Nw+"((i@d2իGΛ7[wO|\q];B=к*1xJ(IIL>Ȃs Q<'B ~^ՖWVݮ~9E+/M⑲K 9"̬YG(.wCZ:;99/YDd{щ_mӻ+F^~* ,^P4Nyyyimxt3O7tȪ^yD 7~'ܶR1[K3a*-ΪGa]ZV[*_O{bTICFitDfB2=?_e[M^Vdd o꧃suߪ ;{~j7ٹnZ@'J<8B>vlŠSN۷_vw[ZݻҥNc1j0=9>ܽ#\f/QV.h԰D/ IBㆦpc8Dt =x!xLZʹC֥RfBflc!v@5W?}+V9^|EVݿ\>sftpNKK !cvDDuu[[ ;={~TT3~koos׮&RX#9?s rn/6@Ӊ%gz;ihS;ɉR[RhYk&?ܦɓ7o(-WZii)%7رc j;nwt[M?edg={ 3kGS1ȘfݹSgOFi99yo_R͛4c*/ޱ®]9|NN}SRJ\X#cFqߙp˵:uli`dgsaD2+;Qԡt:$g)P ]M;%gOvT:4h=s9I~^CUV:W\qvخgwG臏O߾}nJ1(33?NNN}БC5=FgzΞ)zTR22ccS:Cz{Rk:u6~|炑#y_ڔO :NBFĘ'BFkP?;E؞z.6dÆ!C6zxL`z#G>7ߔ.X0`?M+ˍJAD)xN^]hL4݇r mmT[`pD|򐐐Ç_xQXw﾿5zx 8^xc] _zi-** ixܺRMREEYpǏyTw{W4Ç?rȫڴCsv)Xi(ܾ}e2uEEyr7/ѱ֣FY99m>?eddeW9B+W*޽ox\xɝsW&a09r>׺=yܹ?/СB+J!VWWLm=bĂ< h^gYTիS=2>}9]e'Ֆr?t|G6[ iv)`)jg4nѣ'J 쪫M-Kݺc)g=[jթ̒^b9hP;(]Tvo--.K)XS43jxUdMc<Ӊ0qFn@ veZAӅ++˿sA>P]N@J(ov89hEl=49{vK$^T(J*QQRiGc[ 5GX/c{yb[v4thѣ&!<4<ܝR$)/,99RQ]\YZv`$QyqͽvȲCC-_^%CCcIEËAыpOj&qC xStD̖{kե^W\G (Ig4dgsZx ر }ϫ}65@w/-Z4RmqrK?k HR{5.֭[ ; {5hYCh,8txo˗.ݾ۷:v3 =&LLGo#G|~?a U1fj"1/%fNK7sgxSq C+E]\ܙ&//);{D1PiĉҬ=\]dr0??'N[YYUV]<(kjjEF: Ii߾vѣ7TDHnرkGo߾A`ݫ(KvBJVqϽqQ"Џj`o JOn?|/{Fl؁ulQڷ3/A3ڵɠAªWZZ?q//0FFQ_ 2I M}gqqyO)(H򊱳3]xZ-SJ6eecF h&$2))f…ڵ$>\uuٍgpC-ҥW_}f͚w}WXY]]P{^lS%cRl=JK 3\SS7Hj{'H۾ ,CA~xtff O7>|tcCvv=d2FiC?~\O:b  =LYy11BBN"v341\BAbP^^Rz*a}k {O[EϞ={MyBI׮2]8 1vvULCMsnIw 7Vշx*"WW~c͚Ӄ?j oiQYY5M>kÆ-5WZhrMZf!+w3eʐ^O!oǎ ]:u}'h%bh=],JLjnnbP[r7$ ^P`m=M7F*gg͛y?ߨ]zGK6=7,YJ!6ۛܬ4PQ Fsoyye޹ vf4Yhd4y7O})fd dԄ2B~NٳI[>{22j'RPî_J~j]L8HyyI| 8zkiR\NoGXЮ]'>N>~.Yˑ剉=.]2=}jރ/hO]zuKլKQMMuν/:Jg4w͛Ylκ*o!5JmnU9sZo]ߓ~(ƍPdyEQj%.!4ߑ.Ϝhcmv45,1jz&=zzVF\pW^YUVϗq1IDeZkD8XYdH}^^2m! Jj'.*(H5[Mp'tݻo٢뇉 Ϲl.]~tiPZ]8 .\XfP¿e~ 5 "R=C_wRX9t(X|(=ifAOZ@ِfyyyO;jjj<rZ9xp:;8ڱ֩>=[㏿?q;wwEF=EtƠ{J0d2x޶Oyh)R R]߳Ν{2==0SI+<6KOIr?gϮ*=ȿ(9:ΖJM)+W.*v93Wp5ȕ+Gדݮ!,,,o3gy?[~իѓ}{z6랍7ͥo޼:FFF s7D]3KiiSQQ0;}zDI4xcԴCH~>2ǎ\+Eo<3-_E/̅w;JHD٨}g8q{Ϟ)H (@y3g6k0a&'O="#s¯w){#n!`癐菷;PoYx瞓|Tx9>[~遙YGG>\M:333K~_w#FU-y\:יAzs'?uקZI T۩R~~12**=}\hhGIwzj짩S&+`FgҤ[vLlw%j92j1cBt.8]L^4n߾}#FTat AJ(䜫dw! A< 뼵 ^CvlٓV,fcm!jBt*x~!Qgl钲,.ϙtH6#K<^@l?^Ѽv1+I.l;K_5 E*zlٲ_fj91ԩΥ54P3c)~rTNN"eΘ_?̟ΡCXvhU#uviC֖Ȇ>䓌 `ĤpRyZZxjU2\]tS\mg9}r:559qFٳ˗/wh # ڹ/U#c1ڞ2|ϲ-mMe5Fl$Ykes|򋫹HrS ]Ι*طZJ6I E5P#W])؀y/+UȔAw޵ÆAtm2jg}}C3ɐ** \)z[5z###XՈE@y`ܻ #pzޜG 爵]Rz.[0=z()9Ǥ4Ϗ(66633m战ytrdѢ$zzc~nۻTTTt7 4iRJJ;=:X)@2QT\PВ99EIM#!rq ])FEg9ر::-̋0Kbm>An.8AB?<@V[x:2MjW8iC~#LwݫHQ*UFdN@ 0ǕԒӋ4 kmpm(/Ϯ̱ūssYwtѺt/ p4hbxQ%H66|D"ٗp;;!Cs$͔={DSΝ@z2圪=6֭ze ČךO)'>~L_Sߝc&!agr *Ƙ+%e(3&D|~ FsLwحBt8i^Njq(ZIHPtl4cY׫[TL7.qzaB2I_..{y\Q\H5H4`ذ@|Nܔ{\JDC\W.9r$O!ݻq4>چ)}Ɛ!tIzz}+-O{[?ot{y-:=H (ÆpKW ? *G&(2mS݃MjD  jP~qAЫM|qv}%<biiݮG2k埆Oч]pȑ-NV(گ: fӦ]ox9yOQw,.z<=gzzay]}}q f8_lEV}+ͼx諣,eXHK-jZĠɿwðt w"S%<ӤA-UhW^{q\ٙ$x'.[̛1&[ظ*ƺX0/S7Ӡǫ/ \Mqzx]W!qOOcUANNɣ.(GH4k.9rPxJc)CA66}zErNuv_nmmW__<&ibCE+>"`ab]=\:7L2?zK@|#+Un}Nwl>q"g۴}]t)֭ YݨQ}>bavd[zR~yP*C崣U&wۍ}Ѱ ag춘(?~^ses8jԨ˧*m1u:Ao-Jjznbo,Lz2.4NsB8!byø%-,Sp;ju7ܦe]^#Qν{˸X\4E ).ʕ3j#jxR*/B8+PXQ[ȥ:^ #Qttt_pr#w_3;={2WZ5Jct6Zϝl9Q jwOlv'i}j {ZwӚ>|-_1j)'NDb.OυtH<7g=| PI1FQ)'V?v%*R= @tG☑= l7EO_ -]ʪf\n߾JWWV^Zҭ[ieʝNIAHBlooOtcKA-ݻ!w#):V"ӈ+oD3AD_%)ϐ|dʞScƄ:}:~2\()iHnlHs욚sNLX_t+vdXvWZOO39$}^YYզm7ij#߻% XHllCZO!2)+a"L.VVYY;B*eԁ8;򰚈!]շ iRmtC)}c0e&w4! uN/ zs3gZףGaFtkk(b!1#m/CNAv^-SmVb*J!+b1ηi=Snl46֪k )y h֭W A :~qpԩA99ʘc|}=Tid3γEܺU//fߒh*+?X@f;j ^UiPG ͔)S,YbtܸWvKÈwtE~Zt֦՗ zs(*^oߊX:[3yS01Frg:$L:{к;.R.PQ`54ԐrϜI_]ic745[i,+-wAAbQQ2ko&2հ8%e%sp][K$P'։"/.؜Ġm<ґ# 6j նqnbh|ݻ; &2!Қ>vͥà0$:**ʪ`(]Qq?~cPaҝ}' %%NpUg jՕ?v\7tuUmi<--ʪo;F NTeFX޽ӧcg6 E:qoHs<=[[-n WyӧjԨk fu"e򰗝9(B { qOKY]]9w.<z8DM @{ݹs;oNr9ˇD hڗ_nU␽ 4<7+wbْNNdauu%uu֥Iszx8$$gO̙3~3~RQѵgW Arݻ# Z \*d3sG^Tl7PlP/Hڭ7o^8p~c7m]%zJK-SmCRBݕ]txllxl#Cih>ZC86Hg1:>4%&\t҇^c ! 2p 4.G>tyvn_ 'f};99JqP%2eL77H)W{v] HG<]+ +PUCsǞV)@BzOKr-et4V{-tIacc5|zTzZEmmիV }qC?AIt%Ss͞yHOv&Pǹ;ÇRU;;ӫmwo]{хaĉrqUVD!Sj;tR]%&Q"*JN9_qWL5řPI1].~z t rIrBaa8:F*ך5ӧp++%qs(qY@z׽{oܸ#|ZcI` Ə\&[ّJHzFe=ZTC_Q&gȔ& Z`6"-/Y]~nn~oSH(\owuadMͅv_ja- 45Րp~"鰾(F_lHe2'M8}:(ygkՊ8==~3d@w\]Tc2Uwvڵ$+ 6}=|8!-D./]tpm˖ '8=9ꡫbbfr+R(MSn]yϤI.ǎfjvV IHzx6.^ qM7]^?ҡMHИes|U4i?Վ5].@OR#G^}+ٺ|pA%Ҵt-](2I ?j stW^5v\iz q|!}-كN$"sx嵨M`r&L[`zA ={vUuu#wܼyDoP:!a.ӈ.CJJnpo iHnd$1eߢ:_`K?vcٱC^\LeBÇbNt 'xT"v~/_ز'Cz&HU 9"-,7r}#kDžeeysɗG-c0nn_x!2Uo$SEwq@2DbD鹐剫%KKTˤ%%]\&J6?BZRZz ,=VI_oZd4hŊ5bqb$$ҥt 7rÃeVqL۷+}eeԠe@TXX'Nd[.9ĪD&Dթl!hfwֽWyMHY]%NU++Gqat6v66}oܨ߹M޸Q֯[믟)לм\'egkIOgǎDX-xO5T4˖/OkSP"SנKulEE[ܹɚ@~}}U%aSuL.E E͠z^]6S>'N 1"|6\p,MMM"3ѥ ң3gِxOVuIlx#]`Jwjl8ѥ[df-[!z)y,*Jnk< $LbC1u jjVfxK@xzɽK^W_*wׁp $2TCiG_")S ]8G?4e"˔q~ #R4|+&f4pss;x+tnSf+ WWm4)Ǜ8MB&;30,̏,DSI17mْ@qqT_j^؋LH,q-v>~ Jm,fOuw kL/`i鐰gK?j}Y4TI_v?RxаaWDic@%/_ ay dP""q; rh~Cq!C}t"o%Vv[QQ;RbS61h-zF^b264|x?|IJ?άYJcF'$̝=۽܅Ʉ .*.y`WpN~~Cz *wW_* `4L"Y)\|֫S QL[܌zڠZ _\N/)M6xzPno`W)7x<*'S-++ή~C`U@⋻Ɂ>\!( ٥t}0rUVϴ^={v{|i8ij0C6\߂[j$ݢS AKk7G <;|\9 ,z}Ԩ厙Zrwg){8)1bINN1mmaC?y6"j?䓻ʑ~V$&9ig<"hp_7_V$gZ[;6H/sVV=oݪ_^w))elWVVz?W9+@FxBUplE2@R"[>]k O:"4(--޽u#7w3&\]ȟn̑N\mJJo4?zP?T"+' _sG<:+f-T3ZjUTܵk.]B 5eڣݷoEzz3Ϭ'srހe~|ʄKrԩm !-xIY:jPCC͛W=<:,SנbO M}Ý{!؊>PqUM1r@p! Eth|;x琠\fbII Ȅs'MZ/T=F$745LZrg^HQUT#RXX?ŋ"ܹnk]XdA$43d;ȁ^|qw@2vdϑ#QA?O|Ѣʏ_R__%jKMgy{4T}R>yƌΥB (SNi0] ?LL].Vߑ&oGmkiC286{盛r,~ʕ nggD:EDV!Snt6r zuvʕ"PM G64=|6??)*ju0ML]d*+[Y&Wop M6,V摞Rjz]тvP(}WK迧O6MN95{vo(44(g (*+dJ2F ݻKZtT+0p9<|C.5vlno?=:iҒ֋ߞmk |1^[*PN'ae4| 82eL4> rqrL{w>}_˓de:1-mE1<ŮΥ񔗟×=DO/{i&Cх$=_?'}V!LҿuV]V'NP :I&ccy,S R"wI#+vL7FEpBjjjTTT^^ԣ>zZcCZ!7Sn~?ڐ! }}&ȧKyf=Md?fJW^ yҥdZT̉Eo xݚ t?.nC#'T 4(fAV1R}bof/˶5MT1 PL3g :w550tj3>⌺JU}\GOr3qb%Kv8K~PSswoO6Xt&Q $CeS tzO=5b%%ut9d1 -Ñ^k!b–ZٹsݻwO8A۷oOJRw7okm{JxMH\/=)0DiU-QwFzhPII]GmL3 aQN>6=8g~8¹W^ .Kmmmtt7ǿILL+EzUx~r+ϝ׳bD K 4Ҙ@=iMZbΝ͑"G zؐEBcϟ|Hko={ %c 4ss͉| jϜ=/TZ7d ggoӀ`8p@+HJ``ah<{țZʥoXgVHo74ܵn춘"m Q([nĬX\3f 7Vݫii;{'1ᇳS|l|ûwc7u#"ly_UU2˖-ݱcʔv2_zj_2N˝kּY]d'eȮIvvyXXƟ)0w , rtt\ti+yKN_im3|򹌌)SVrNCCٳG 0ϓK,qqz~~C"cZ{ge>kH4hÇڱtooiִz܂ ۰B,oo܂M.+K={Գώv4v:K'|rÆ?_Bdy睇v1s>u*~䕝0~Ĉ'ϞM}?|?//؍@TQQQkڏGǍ0aP"R(~*̼ͭzD3L}晅Ϥ/: ,///ﭷұc嗗=5سg i w%J "+++77wӦ/N:sرf=?p;?7ߔN7n mAX,QQQKQȑ#njy;E 0ɣg>%%ٙ9(PΝ(oΜI//g#;qsooo3pȑj%yyU ?p~jk>w˜1C,cm , oSFTTDh.Aԩ֓I~*aCCCaa!%>՚ 2e޽ۇ QA۽$ӹUwO>}st8aw=u}䑱cϙF| ӢeVX>C-tG=, *?[욛 xz aп51dgg[ 8Ͽ͛7ڹʒӾW޽;}< 2-+C@%%%+LC4 zݼyحpV" ,͛7ӫk ஠qց`il߾^#""0uAX 0v[ԁ`Qܹ]A ,hooot.@+(22 P(+2y@' BGW hBغu# 6vC`pWҥK0'A=_~%wYYY-`N@0{y h+ ̛(kk+V!`~@0c0?A1{챶 3vC,`&%%+ 4se`c7hf wxxx-`@0Kxߌc7F7vK0?F5}kkk8 J QWofΝ;׮]kyA1̌hon 7 4vC`N(O>{̙n = ̉Xc7,hfBغu#z]A1@ǁ`6lݺqҥnX ̃T 2v[B`DEE+ 43 555///22]AGAQQQ+V0vC`dgg兇-`Q@0u{=kk배0c7, h&MaaaRR@0i6oL ,0vC`pWPHH4ae DFWh&Ν;׮]k  on X, LHc7,h&BgΜi% 䈏5vC`Z([1]A`hAm xw.]j HMMxbtt4"** ]Ai@0RSS"##4S!**zŊntAyyyn tA7o 3vC  &%%+:hg`c7 ̅ BBB<<<Z@02|FDD!`LjkkF1ٹsgssի@0g@W###@0 "66{̙n tQA*2֋Y :@0 b֭ ?>.^o߾111F|A nإK֮]K%%%@@0}ҥK[/6|'Or:;;@Xm߾^}}};={G:K.TKzMLL 5ܽs枉@mNNNDpp0\y O^z-[2ARSS򢣣t$??_vww Ѡ{ov5iiioӇtw&xIfΜi8Ya vnٲ֭[|9Ovx"ғ7B退Ԡ(]@ϧ t @ď^c7 |',)))Zxqkt9!!}-ЇKzEe FcW}bCCoxz;/^1bԚAW\!}> .|NT``ZZyZ?:jmhhaxVTTDŨ]l2ʡ|JH ommmc_~>"":PF5?8wГ3 YKTT=NwމGrll,%tٳgݻ>ƹ[ mS!)Q LM!K,oexaaS5Z?a 4jC z*رO?9@mm-={A+{0Gp2___z%?'ŋGAOb_R]]MrSE-BWo?HL8bX~9sꫯjssslllrvDUIT?ٺu+%xXn͠W>fj!/z֒ǥ)m^r[oQmt*J>sI;vL:b V4$S]~@yMTב͛7+~dڍj=/ 99W^G,?Yf?CLoٓ.<[(AtWKגj6^^8fG9 S2Uw{eA MK.2,[[3f{w#z}]GM2}$@$%%Oұ+H,rdL zjG/?ũؚ5kZyGH@K`9Yd#Np`ΝUxO+7U#((Hk>IΝ;IZC>}755qB>T__ϮCse\ku> ")))$$tZQJKK+LJТoC wرC:l <#֭[9qD1 HG9dЮ^y$挋S 8j-}>iiiZ+%Ō۷s$ySO=oj#~AOhh(OI~5`׮]aAJң'C]U#Sɓw6f1~$T^.o= .$KS5H.}IE?!s^}U6!4ӷ]O8O>ZETËtVmrڵkI1ko6},@ sիW!~hd#Soj $]3Zjbo% iAc@q`2Wrqhi̙#V3&boS)Jw:]S wy{{w|;B4VskWϱ%E4 DaVvj) ͼyj =ɄDbʁ([z{{Ϝ9m4 χzMWUU! Z0e]A 8p@UUUtt@; ݻ{, Bjjj^^^tt@; BTTā+(<<]A`@?uXX5A'Nk tg6oތ 0 4rrckl7Ҝ¤$7-SFA@w~[_׫l޼^@  7jkkSSSCBB<<<عsgsssDD@'Aht @?pWի @444DGG{{{-t8p@sssdd @( b֭3g4v[h%>>*66 6At rttDW :Çm@xw{# :D^^^tt@ @;I({]A`@h'RkXX@hjRmNAm7w~2vChm4m~Au 0k Aq&Pb@_?V`ڄMx цN:\k:i# cB[v=vmVBMQ5J45+ рο:(O/{ Q >(xzތ~O 55E]A`tܠ'm!5( h+-1v+,=&+h$OghlO[?`[{7?k r!М+-#64#|Gڭl~u*gL^~H8ӡf%R'!xVt.x1[Z+o&ؤн X  {IDF2ߍB+=cܴ\8ж5A㇕ؓ|Hhk;* fK/;rFWZA8YDoǾeU|wdL&qT6e{>tGhP"T4D +*aع/% roKs+Ü^x6FK5^?7ydJu|.پ7K8tlAL+{bhιJ>1At۵ai ;j[>`pW  SV Ý_;ybHg琦!DNƉ.BTۻ=G)#r/ǹN :`Oחj{++^ˡ3I)cI[*m 9*jn4i!*6t]4joS$F|Ӓ:mMC'SS %eӱV}_n~:Nvۚ ^oE?Rkyk3d*ՠ"Ghj8UIpJ1d2uJcqpr לQw ]A`yt:Ÿ>)&hؾ7KlX0žm~qZ^6V-݂pt'jQx^F8WF>${XL[=b60:ҚBW׀R~k_okty.ӥ-Y4+tژ* 7ۻWQrl/1dcy4Fs0ߧK+yz+߱] 0+hotb "}atDDE4 GsDiV&S3D!l0el10Uou< }b~_O]½2q抁Ì>޽Y1cB||„yMMg~_vYAK/oZ]S?ByxtxmL 1ɚ^'/3ĝWh@@ʍt7ܦšk׊ be7eO! iWI-=:m o@GV}ktc~$SEvk+[ 7WPD ggWKO麍w`i}}WjYPG>RvDDEE΀n~~kF+h,5HѠyqFƖ䠠mnnev-SȚpL5=9.n$eɯ|ջ+V֭vMM5ee׮u;VGcG;o$悹j0+$%mmY_Iݻ}z8GBSQCWgB*,)9G3EdK@K9k֮@|ĉSР~SU1 `pA250p#p С~KSfcc-^zMM5ZY!2$4Weed NoHF%%k:usQQqMHdzv9isuu%Zy iPAA\IX7t@Z{.%$8= `Ø1O"C66eKonvS0+Р. yʦ_׮:sTԇ'+kL ī._N:9TDuI,Oׯ):zJJMCggR9[|NyI(ixg6BfC}mݱ!ۈ~Bti)jj y ׀ 2䞴py2UCكCx2PR$>> ?1!0z?~uQQ2ČS\F4MjNtI-!Ù $wʆE37zo%'(L%Wx3;\$Nzcc=)TJJkU/Rzʥgu҅ &^H-.>J>DDQw ]AХ7@n$- |1&d" 55kScƄJ%@*-v%Y¦z[+zӠWd[드2 mߛ^Ut@P_~O M#g45T)\%keKT)7CkjN)QmdwFm]cca-݈J9.U55+ĽDN0 |ٱ/˺o^3vCt*֠kd'?"1RT:pÊ5,qUTe'Q<9z+iC0+'пq;Us_liIQW⼴M1rӧBM' g9Ia5H1rs.$$(\qz6}җ-{2JlL>-D[N>$M<]RvŅ9fCx ֚|zFjދXCuj$o~@'Vܿ]#̄ع/U#c1ڞ2|ϲ-mMe5Fl$Ykes|򋫹HrS ]Ι*طZJ6I E5P#W])؀A஠es]ӠY%7d$57sUB':zpIҦ̼2# /a58x;W:ۡCC—SQdJ=q C|Le< F0;թbt&>3`p*H7 `:O\p܅~xud<57ʓp!|6jFy3Ɗt^=DZRi7"sbb><^ATXkL{nkEfyyveeU/^͞P(RzV/,)9>`۠AcËzt+ksD"C_ 3-=s2ī_?nq)!<ݎgj rekUxz.o̐!^/++$5&$hҤ#GN#Aa^ >JSک{n'%-Mʼ]N]8V8-1ћW>ۣGS7yVq.]dQ̜& jE:' j!rUpb@_s?Kqkj츸 % šWv ~(gyIO(7T,K65ըm7vCh|0rF~VQ ‹A1rzya@ :vDr2P&1j}E]%|wErSc_߱NS(X["&m~u/3ݵ_lڐsTsq݃զhElz!JӫL5Lvm`Ƹ89dEA0 _%L=ΕJw±5QcNjm2*z3 hcK!oj@\^"^yU)dHxUh/e.(GHxT)j9#GNآK*u !&b+`vM8Ďf>džK* \ q,(d_Qm<]lLZ$/mpqN\QSZ*?q"g۴}]t)֭ YݨQ}>bK]؎VuV58sҨN5€b$]"%ļ1"LhsGr~׆Y}z<ҾѫC=#laddli߈RIq{jb.ٗnD|9]-rѪPUG^ 05:Ao-Jjznbo,Lz2.4NsB8!byø%-,Sp;ju7ܦe`TLWʹwtVQQ$Ɓ\99t&56rbذ_xtTS9ۦIzZžݴ淲=m@K{fGMM.)'NDb.OυtH<7g=| PI1rqv3$SNVIX}E #$rG_:]]v/{kg(Fa<^6$$#}gcTr3.F}i̘вSOOYYq㖫%%-i6}vA q￶8ȤH2XYfe EhRjb -誾}]غ6:š0e&+ L|jjdSQ YQuuH:u4fx觱V~fxkK ǩ9d?t tQA@E @4h,zPjlxy)*Ꚛe w`<2jQ|t/㳬>}:V1' /ߑFf zwWEBjҾ#g[iᓚe1(Q__& oۡA@iiᮮ7.X04AUp]!M)WQWLM-L@œ4\Uww?V;ߖ Z:űyn)&,Z`]>-kmm˳y.ͽW.%Sɗ7fеPJΗI-R% ES#K͍z4osҠ߆p9>?h׆Y77<b#$qvRV1fL e4(%eӱ5`y:NR.>*QNEG?AR%8rRyP66i=|Ѓ0 s0u /^i疎~^It")^ )w*F$ #451ơӥyKĽ>OxU/m4ѿ5HhL5dWFRci[fذIz~Ο?3<ʏQ&r匸v^qw֓ﷳsjiA_FxXg>T"Mj϶qDyn)k~yҏ?<"g72˸ҙyedE$!0nn_x!5+kgSS M2CdZgtA@E @. 4n 7P'tzqGr7A@ le(D Q6A@ le(D Q6A@ԻA.]s{ ||IENDB`ndoutils-1.4b9/docs/docbook/images/fig6.png0000644000175100017510000005166711253216103020735 0ustar baeckerhbaeckerhPNG  IHDR4]`[S~IDATx XMigT Q&ET#bCa 3y 3r r&q(爊J(!;36kj^{ݛZ{|0wUk֋hZfgyzz ]75[&B)KOANdrs@Nt 99 ':@瀜rs@Nt 99 ':@瀜rs@Nt 9)_:î߅~Splh-tE0@ '#ݜ:"zٹErs@Nt 99 ':@瀜rs@Nt 99 ':@瀜rs@Nt Tqw'6fOc0 'Pu彦-dzi駨@@Rlw&<>rT Ϻؓ(þ؝ɴrVvߦv6f߿["v7DnnPi7oPkݰt)ܭi3@fD:+B{ekcr.;R>R :9B$c}3S봒!Cne~.1釘L) a݆DI^!q7]l?vu矚6$HZCq7]'LlP3OY$KZ5@I%e"~hnXsz޸ɻsFx6,f hչHNN LF.o WѦ)Cîs"dyδgx wQlڠKf T s ߷Ԧ>)4"i4݊tI3,bf"=Lc4f2ܝ'd*)ʼٱ"ȿ}\bFzv!D˭۵y  Zx@RwsZ4lc&YGᶵMI9/w{ZBz#;kJ.+.x;I:gK`(%\x?֑>'LZ&dR/y9AUrڃ7!QijZ ֕G gӞߝ9)K"%E. Iݯ%3iw;ivV`X7e7dW(aX A vfCh=sUyE l]YI =^I{Q|G>xU *9*٤2?Kr yI:3Opz^ƒd)agC1}:Z/)BCGE Ϣr~:uٟ5%sj?xeVdoyOT Tuu )oaG~=Ǟ9Ҝm#5P?.xbBko" ‹PTy̓(ZW5^tTr^cAǖ5υKt3#,OΈݿp]|LRЕ@` ' IY/EiXBg]IN,mSɬ'!͆PRSQW:W骭?BmETn>S%1?:=LrdP4a ˃ ݬ{ݚִ?Ca-%ecB;mb7p`>-E^KDEzJ vE0T 'A*[Gtlknf^_7s$C(x-g0g/pvB! 'PT:䖰WkkO$3m>,>BڔwN׬iS?thE#Vİ["wߨm"n{;ژג~S-ImQˤc=U~v7 7\Z2N/i.܉@e1Ԟ*{~/qz䆰{ ]twJ\n'ܺrիgzxlҤ)5Ľ{ǟ=K6m&q '$H\]98t)3++ҥTc.]yn5Q6ˉ}ߧm=Kթ>[ma|OtfbHtȴ˗ 22hgy}~'Jk߾l>|xʭ["vi mzu7x/yMqqKMrJxdS? 'j$\bd`ÇTA6"O0y$&H'..#I6u'7"#GzOfj& G$Ygct Ql"f5ܶcartBN"C=oRnKL|FZtheV>/,uyIB@6{~SFga[Ka_ vzrƳhWW'gA`l=TϺVag2c(<ڻz>t'J^q2@c 3r;LurDV4ƹ-@.-f>c6K$'HT{}4YN/f 8lI/o{{Ez ?m1B GPL$vZHZ#{= c2C@(tt|?֜=dbd: r"ҁ="Sm=I\4[ވC+{UDc =]HE[uo s'IȬx>FppIQ ڭCqd,) `̩U^JJ#Wc;~-mwܹ\$խ뤰̾}33X699H` 9NOe;wp߇¦%䅤L\ջKSUj扤*$_žU,c/dN`T8o}_#sʔ?wtENĢƄ## ^g۸7w^)6,?b^|Pd>~.&5@f ;˰'o2U@ԭ}y{./^e]7IZ]me XG!̦Tړ{e:vVZ 萜D8ę)D~Oځ%2ѷ{ sĩ[ FSFuctI}&:#A~wW;HtED̟ g 0gPhC,gWo¬q,ߝFlbɼ3۟jr.)өQݢ5wxݚ6`iKnHNUo0btNNdñ)8t=!g_e n>b%y`''q~h7R/p4daNe:w"M?\e؞ TRNZy};{W~sֳe` ` Jވ;ΧrKlӉ"6ŎrKqW=tՖF矈/BvF&!S*޷_O 9gȕ2Z5i*S)|A.U~'$` ұ f*+{aYY ]R^zܒw5I}C] gU,;9{娠 ɹ 19Q5 `_nE-& giԹrؖ-i<޿*NN_/Ie^+蟜*u#);9s E8*B:t'];tG EА"#GOs 1l#gg6mh紴Sˈ!-usQ,ԩNNE(̬* PNff !Ɍ<2Y"h[­vzvӦNdbLl"L 5nuN_SӸDkH6LN,;ːKfbòꐱh_NkyM~K&l,&xL5.'O|ͤ׻"nHWq7oTnS:7+Hll Md.S:hL*@H PN"05g}#/_c$?`yqjk.cgӳgIE~II3nuP!aJv@B=0>d\'6vL?ՑңXe$n݊G~Bt`@NrYyOc:\&JY]\/8,¤Md@NrCq'OeCTA,_NeeN\]mҤOf3ܛ6-.++A5)\Pa9UtdDDɩOaeF+`mdJ`DҔ2HolS Gt@`y1 z^@NduZeQs=K}˳.;5`%s2Ô SµK7 qhh34iҭgy))+Xs _\]ɤ =rd.$ &{?-WK?vM%3&[X矂b11h+)O>@Ujˉ4w9777a+@2k27 ů;O Ob+W!̉6?].? l|ۇ>:C 2-KnvD&sb,4nOT`#'IO{Zl54BPV ]$ɪnv66KSސt`x萜8tweρˬAA'!Z5y0e2r"qҔ[?q'w8q쎺֐CFcSX2-2r?v)培;I$ ڳWUM#2/P MȈ>d萜Xć.q|*UWvZh_sa l]*d6jϡ@M)/s>xP{T$Y5v7!{WŒۼ>lִSLN-8X/eCJJKJrr5)[+bN6v)YIa"zb2Z8/:E^eg_b˟I$.(3TɩTNH "i"ZJ5nnIWgF)Ib=D?$"貾ہIt 1{Y{WxI;IE]d̹bo`89$1$P(<I[ 'E ;11Sиj[[~ޮ=#̀'n٨nXsS:*íbqER?Qz˕|=bOrpfKcw&YO-32YFAJfJm2gOlh5C;޼AuZQ_DruVΠ(vɖS}H;TFK1H5j*F| ] $*NL[Jڇ Tdb2٦/u%w'y"tV٦9֝j$7 i y+tvUdG9jAV IV 1%<}$a䗔}5b!΁yv&Nِ>)4eW:"{891#3Ͼ-lX\EN ΉeO;Ӟ=^;p.dۨ,ǥ$VY L]rՂB(1Fck);.s6kgt~s r8h++ w+&6zJ2/Gv2] 7j7ZrբK.-Mj8(HEOQrmmrR ޟ/MBR ߞ-<[7Oy M9Rα2o&@3P0B ͜=a2`rlh%#6/"T, J4Wߟ~)>JJr99Q!t.~9tTdp,*gh;]_̡_i^_2VQgגH=yb&rUsndBʛdoX;;_φsgNlF4g3 ?:HyZ?gx  65^ϣh)^T@{3`*÷g &6x  ;ǺwMfI!jh9ٻ̐PQK$' 9bOcsS;Ւ!QTAZ]r@0ԫV5w Rc B~:F*>hiWG-Aӳ iٯWˈ#MLp9 hc(.y;hڮg/iCԙڱ|:Ddִjhp`33ϭ +-NNۣeHh`p< h6%R.m j]|S Blk詜%2SW{]ڽ"w3UhzM$(*Xr۳iI3> -0y3wW0ʷ-o}ߖ[KIUg~l&=;p=׋9lV.9:p՟h9/jL,<В<_~lWe3M~/  n`c1;jz@`tuæ=z)tJ,HL~n[Il6gD]~ɿdҮKf:7?@K >,>4¤J#;qMk~ Zcr:Ĝ>N)ZI#\{TB"uRERQ黅%-CL歜"rcKk[D7{Odž}i[ς{( $r}k^)s^(HlcF"EmCNbpӟ ZRB_,RjOlOF Ǿ:Zؙjhz&yX\igSDjZRNynkVG7L~98`TLhޑt~SLiTWr*ϟ#.KʃD!3Q0T Գ6τm>mF!*oú7`I)bӟEcFA)uٟl"sI\xq3hj@gV!&6A$Խ)lkPĞ9y6~Nz6}&8{\w PbcO?ڧ5MdW{ P3w CTl~᫯~8OPSӍ/wΚ;ˬ(>C'crTEb'U .H%M[_ɟ Pu r7VEU#9ADvФj>̰]ɰU!{ntdAv#a9*Mǃg춯_1NـO iy 3lР^i$2T '@%-e8-X7JG G'rW䀜g/:Q@$Y`*M7~84ȳu#ukį@D'CrTX]ISu;(̰US+F ɟ Pd{E>UK ɟ  P3WeŻ Hk > /??iz4(?5}X|hI=W't]*)IQHh4?)@1^bi$!9)}C] gMf bYT߮#V.U0E$$; '#%QB,}ٺQ? I,fB'rkYgnXOC)\|3ɟ 7iyCfaKB,?=ٹE>Mc lN܎O@f3a[]]C ?tOH@N;d&'61x±5?FXyn?޽"g -(B'=r?sh [Q[35%s,H@N/S<`ϬݴO:\'Sb47o0@N)6ĆO4hA']r>,~/q܍|FT.]#o# 6e%O: 1O _pɟƆߧϳ {y]좷Dum3.wuh䴼3vׯ}ty_Gg$%4ӻ̿Q@f̤֓SBisVH$,OvnѰ/i!n{Ig?ն461^ ' Lؖ͟a* ?},ɟraӍgFo߭}?YYjA 0`?getK4b^$ DbF_H)OgLu`8{y?ugFBȸ0sѨ3wOl,2O@'-󁩩5uj ]ڸIF 랽{BWG1YOO$<觫oS7IfǀM]535bS?4ZtVav ] صkW- .ʈnmΜ9BWb{za&wG!?'&&~4BllI<==`&M@~ =z4hd9`$$$MpS9FEOO5 ޓ>]TU'O+W:R\\뛓s1}X̴j*+++K59>}$''ٳ'c兄M&tu uV6~ Idd$}ӧOwF '1cDEE-[l„ B!?ڵѣGS+t  =ct>w\xasbbbOGA/Z'.\6i$!fjj*t%xO>z˗,Y*t]KqqUP39sFF AxxxHHH߾} cÓH꧃r5] 'cǎ=0dPDaɉB(MJuؼyGbRW݇o>?U &99M7N2m?U ݅ԫW/33d_@N(C---t钡 ɟ.R\\LlRW4۷o6@*9s铞:!??_*h $7={*tu@*9C03EGG/[ S\HTY 't3fDEE-X/ɟ*0sL6ŋ0lHT) 't˗ӝQ=37׊Iu 'g۶m!!!d&.@ @NLxxxpp'SO7 %ɟTr@Hbcc'Mnl3KO9  lRcǎɟ.\"tt aHNN{,::zٲeӦM^۷oMMM^b$ɟ 'B~~sm7ihANNNBB_1OU!66VfMzzzqqw?ANTh5}1@0OF,?~\~}RR76ngNǀ?ANTOaaݻ3fذa0 ]CP?ANTGrˍ5O'L` / ?ANT'Oo+tucɟ '`nzhBr@K8G~͘kIVɓ'O>-S؄8zjY""f+V<~XI3 :4&&f{y,** r(F Q6GE-7n@LLL 6iRVZuر0.1fBBd?ŗ/K/O7n"%cǎXr@:ueii;hP=[|Fi 9ΝoW!Oxp&99Yk{iݺ||N;vL#!?)77_C}͚suwħO?|F:#i\:K\<ܶm7.Rر""fdf>\HKs4nʨgT}}#k{м4-d4@ʉfMH~XF'ȇ:b~q&o%y?th ݼ=巭YR'ݸqK׮_h,:Ι3[},[!'t]! |PoSSn݃,p;wFѣiӣGEE#7 [wwשS7n|u+GGi)9j+WDm`cHߝƔ;v}ip}c6BZVMvCP?&=z\~qIIIjӞ=kO/''EfMq3凴lӤIG է<._qi38*ꨆt`T~(Y~=];@-sQ BjHt"Cqqk^rIfi_iãL+ݸq֬YgZʕ9tySuUA#m;h߾ !!/Ϝ[$T%> Юݠz= "66ukAz.](.;}z]JJի6ږ8 ]sܯK$n6VNܾKTEHwy'tbM(n>U B%D*22$*jyqq.ɉdkOfn>y/ F{v^Ybo?DImL#1qN6Or'OG!'f)oϤw.^psXJxN|mA,UN<1wܸqbrߧ 9`D?eˏ4ݧZG,~-KR\b)VMBjyeHj#))Ag#,*#FpppeoBNnjP#ef:sթcojjqLXNNJ˖=T/a9t߼۶M77W2;VtqHm驮Rily@oڴ}rr2qqF4b޽?y|^qqat,>"#Cزy覒N ztnƧq*hyݻ7rw<7nS23>jݺ7Ny„o߾bd n+U+eˮNk99w 6lsڭ v҄KS[q*hF\"I 9`,;ZֶgE&&朷2Gib޻wǏ+nM۬RO`|{td( c!--ɩеF*nm:l FSAJ@-rX 95lRZLnn}ōPI&5ޭ[Uѣ[*pbеDggDNHȉʱiQr-CIΉEjMJPkjjZNzvmw奺&&VYGi޾}kiiZ>!\+ɢ̻wokPll߿rX(-}[!X&?䃛7OGJq2;^>2)~ Ze<( }A*5+$X7#}ST2Bcc7; i'J33" ??^ tҍ6s ݆sHrtaekZzvA)8n]U]"puA߯_W,Hj+GGwvO$jjzy_F$3B[ᇮ#+/Qe 'RML23$O5rESBXDY8ҥ5Q5*̬Z㿫msjثWs߸q~D|G.!?Q@C?o޼bjj!Rˢx(G1F%t)܋b2 Q`kkcu+yIOь=1tr?YpU[SSLQ5n Umv[9lMyi3o~hG텮X[bqU0(n]z[m؋ls@‰/#G'LSDG ] fW.yy SI۵kk988IMU ANTnN:u>77_[.$ ׮w\\\r6mj*M]X6#36]ԡ 'b88gfV]}heסHr>4(f}Fx󦸬rW=:tBqOBW\RkjjV\Օ(ꉂ˖]Y8jղYFMkѢe"kGI*SQäQ!##sD@u`DE-I$ZǗm۞jDAdgKdfbӏR[hCaƦҗ d1;FlX:+H.WUHhҤFLT֒grI槨rsS[j!! CZzM,l7;6#Gm<o(IrweY%"{qqGݙ/"3.Qʕw٤u,'{S+oLj+cG5TeU%'!~j5}|&S q<}d9~DGJYԀ,+{]T/ر/FpQEf?~33[Kzجn?RC+hLʧM6 +hܻ..;< #3-[u0QЕ+ b)OC:"rDASXH$Um-+=X=##5BAA:R?xp sYY8ŋ\wwIho0##.)GI h%7+W%7b'ORO^G 5̒ zxh266ʕGTVVVnnnt*FjYQ謤nߎ}D b0˗USNJoO@D҈2yH'ڵ܌PzMzҥ{!᱔E$eqqa2aήyufݥ\^n#ܽ{zU.:fr۷OdWj?JFN2=Kj' `ߧxy [|jbUG ӳ8 F=)!ggϢ"F~X%ђzђ mvOf9`̞=3.na+|؍#F11+#"isشiNEwFL̆ɓng3 >ȤIkָ3K-)={{ѣ5E P;{~WOi72F/.Τ9` :ʕI哒|R]GLTF&&9BZ^ rs@Nt 99 ':@瀜rud, :BWDdg| k?_A>B5IENDB`ndoutils-1.4b9/docs/docbook/images/logofullsize.png0000644000175100017510000001227711253216103022612 0ustar baeckerhbaeckerhPNG  IHDR2btIME Z pHYs B4gAMA aNIDATxyg-یBP)DK)Z"dlS"e$40y ^(Ku2H=g<}9sLF޳~~r ŇCmٲZj5j7ϙmZy#qFz=̙m,Y駟Η//'O˗/oڴiŊ))) 0 <<+EEE-\ʕ+y͝;7ʭ_~Ν;P˦Z Gy|ߨQuʕ+yͻ뮻Te)66b.B1+EX 㰝L]vR @dnҥL^>~9ss@/^%ի׳вY'Νؕ)S6ƌ3ƍ裏 2kܸĉ,XΛ#v,ZHVUN'sfvw\t)000>>>44l-:`ٳgnj믿:C\27o^ͮ DOSS`Apg`oϚ5kvؑ2\sjժ'ǐzbL|PIZVO5I s}?~A#1&,JڞmRsͪk6 k paeY QPD \bŤ^|tJ8\r:udɒ۷3_}ގテHB]ϟ^UÙ-[lɒ%'NXb"E'_b@>C RJ@d/G*UtڵO> m v1um۶q^z>}ݧZ۷obB d=PN|h *T( 䔔Q|VZUPY`3lgtںu.]<#'loɵj՚2eJ]F['?VӦM_mxx8fI*7pT!V ~r͌Z ce^/`k@x,gT"!`EX|۷opp0$o̘13""__x"2#m۶e<.bJJ  Ck& mM=X*аaCktB,sQF~p4|pO2;JKKk׮ʕ+׿/"EMȥݧg|jW+ KyJ)_>HC)*Vzu'BkA&m8kgΜ׺r|frl`7>>^@!B沓}{.3SjҤyf >ȦjNVo$]zOCp`ּd*[ƍXk(?n۴iס /[,YG7T$:'aZpO<GNs~NjH6UBV'|HJj*&UOUlH#G'/pjae KUuY6qmׯ V0B4 WAӀtI$7'2yشi/b{-VKլ/Jܹ |:tЌUΝ;W`]Htt4Tz˷ *|gD/gb8_M=I b[FEwk&$$\pԕ-I5%cgu֬YSk1n_2{]t4hyc=&N\O>$3"[NWxJJ#Fh[L|5uY]vWU\vp.>￟O:u9;\ƑouѤj&Х۰N`_A:u"݂GGQ֬Y3i-(_3%J>'u+ݙ;wiYG1vX@10Ǐ 4>Lݦڵk=c_>{y >dɒ^ i|?ڠ4hNv]̞=:3fhfk×.]"gҴ0l0No8?M2892,el>\ڨ̜j~u}mvر`Voo]g4ϧUti(hѢz4x4gž#$Yfdd 6Af#o߾yӦM>k6#0e;dwM% F6|˗$xivLFw&bxgraÆQ8JCH (c[cĉ%3wӧ6,T S;BR!EK߿?XoW_`_X_ 2y֭3g[It `Ujb&2a'ߐ7iN X)))b*Iu&y`GUZ E/Pm跽l!ܙB 9YhpaM~.?hEZڵkQ#)`Z{rfu%ՃsF*J^R%u)hmEi~{S9Kv߾}iƩIB0oBvժUmCy*GtJ-I&yVk ϧ⧠ (f*>YF4{ /zlG/D3;,\ƾƓIèjpڴi.5_^zƐF &.ahHhʖ-) %^=tMf͚є!`BjԩO]v~9w7VZx5w)l޼YLx>Յ2)ʕ+UG|O!!!^ƍgv_r|ĉPc#x >lüQ EGGmUpo*I˗//*NT{B#Ԃ2}Ƌ{a k:OE)SHTK*UH !1 :?Akoѽ(vo蔕)x<)g!Л cݒJsIs[l\X>/y7~UU`x{`"%4~Gڵms4}vʃK9m@w4RK6mlǿpBw"Vĥ[Hm;?o% ̙3mE-{ĉ@\;^f|3שS'U=zpr|r$EO݅{A-߼ ZK.UaxׅRʸ@=$jn2gW^V`N0td0hΟ?[ nk<8TM;+W:u* XcǎﯷI?x +[PfNJ1,ypz+hھ}-k}Ĉ*jo3fy9~rb<Fvju00S5J:A =d؞!X#Ru8J(1x`UU;NL2dxrr |`is 6r-;y |0C:1>@a٬ m۶DϟطfȾ}Cݷo>̃!qzڇJ RhB')QIrA9|t%jjȐ!sIIIPwq&`8fX^=ܿjj; n֬YXXXŊ5/3-oRТE s'am ȅ @|/N;A|{;@͛_^°aF)e<.wٺu̥wڵs1<ӧ!xģG%&&VwրÇʕ+, }$# *VuRlgr޶fNW ϋ|Y'>S=b Eռk֬Yݻwe$6ߖr)wZC;wx4};{V\ϷdY$!5006"xDI& 4{/Bϸ~(RE]+HXخ8$υ)R(99Ec{[nooL.]J&A͊+n޲nhѢEB@xELdyG.I_-ҥK :E 4q_ y13!R_3l1U]-3eǏf MP(}K:,JӦMmwi~:pѣGPJӧO'%%e5h"P.VX_$w M1`< G\ٳgbb"J!msIHHi | ٳg;rELN&=<2'xbjjCh!-- Sb ߿hh( vW ۺuT5&޽Am'MԺuk[,W?tĦWFiCrP枙 V['׍ƒc0dZuԩ[3u.cw:..te˖ov_): =g!IENDB`ndoutils-1.4b9/docs/docbook/images/note.png0000644000175100017510000000075211253216103021034 0ustar baeckerhbaeckerhPNG  IHDRb$bKGD#2IDATxe!0 E}K C tAQCACQA+g4mɌoK. qc  D="s %dǜH1y%M8fK wֵ>i6g-NpYtL#ߟ ab;U#2V} ԣrVx]zTT1O H4]o zΧg"ӒNHlUu߯9m4Ls.Bk#J˭QYk^tIIm5B*;a6˗/C]v#PqH YYżyP¥m6_`ivœiKQAhedt-ZԦ.T3gΈWɥE$#}}}Ek^rPyܹ=:??a(RC5_\ ƚ1c4n8Vu"QY2RK9 D94/OGmׯڵkՑC5Af={Vߪ\RRWZW`,{g߾}RtO4s(bM5*֭[y{{kU,DEEw^ 2wvҥG$+ Y~Az 5N& &K>&>(GLyC;b(}BWXt钘#QbwWPּÇ߸qCd[5PCUl /,$rU)l޼!A)>3MfC+<==aJT$2PFyxx`g钰nUrgHj~AQPL2X ;G`X}vX" )))X^`͢ړC݊CCC"VeIL뼑E2 wTS6m3gV5E J.;K^ܨ3!YXgrڴiRnfLqfϞmv>!>щd9δ;ɲ w `Y&b%"),dZ`` Mi֠kЧ+=66VS3f^ۑYDƐ:vdWg-[}BH=A۠%*BBB.ͤ-..裏.\S?^>|8/ n2Ռ$FrTmˣ @Y`}%w||P3(9jU뺾2O[  =8/6l/CJJ5==S~BHuщЛ0[êԧԭFaiIU%:lCi!0sXfO]3;UɝRWB3@B!N!84:! B3@<׮~o8?j?غ.ҸںONX߹)..߳ _)H^v֦GjGPT2NHhrom] '5[ 8 4:! B3@B!N!84:! B3@B!N!84:! B3@B!N!84:! B3@RUN])Y޶uSVMʣ'kχM7nXX}Mm) ??ܭKVjjoߠQ =9 j q'~iZLmnq+%׷.JJ}!:9qᫍ~ kV\pIkI_4өuT;9i7jWLGǟўW~TD٤պ+o"S;?5[2F'ztB ֢S6a}؀ng.|  G-U|Vlt̏ |&$5grgqR[|Y[ҽe?ؾ΃'";^[U:S#F3\\u`@juH~;ڝ*p9,`>7YFKHҹzֺmת 6gJ0>T! p`ۇ|bkoZ l :_3gfl6tKR(ҽ1.Ls )8W"y;^8PuBlHdᷓ=WZT?MH JV艛_T*=ЦÍl|g1~J R@RCLC T3:5`\Ed؀nH_`X/Z{D *Uvaz7!V5EMq1z!.Ueg\Le',k֬i׮ݾ}zc~LȡdoG3"o_{im@櫊~zw0U#4/8W>Z6!ESC4:!U,OL+Ejwf@ppC_byX/=oW!A}'g⢃t~2ޚp7<Ӿ4lbdSLs=dC{H=Q^^<(((55Úk:3d^woG 3!YiZjo R}|F?N]e(M2CRU̺袀+>bV[Rp_ Q7M5`MeW 1EuO:5!!4fÍ~Pvd0vuoHMNN5Sf 29#2!QǹSm l垕;D5 ?;rsf0xI"t׆&l15EL4[Bb=8XTt9TxU !8uTxxx~~~\\… qNlN!NŞ={^|[n1!փF'aҥ;vuqU !PīKD N!_uqm !ıa9htBq`qN4:!8$g9htBq&ܶmۻޔQ\\|%d$lwm0 T wUǏuVuܸq߈׭[qF-[e>M 9d3PZfϞ EEEyyySNſH._ ;s̶m4C"rš "Z]IHt+;ϝ;wԨQX=zt~~iӐ4nKsfjg9c Io\D0B&:rVFΝo!xT:{999HNjhwZ qnoܸ1sL,teHByN>}իquxwl]bUp5nݺ~z6)_~ t:Ǧ$hl޼yPr˖-׮] ɧ<==F3h[={.>+F/))ΫV‘ܹ{NjEسO>ZܥyҤI+  2*&֭[DW E%%krr2#W^]tt7HG %%:5ktܺAyp몟F'Ơ>dȐ4hmf͚v" ꂧ6/]]d FvFFGUPM4a_͠ÇɱH8o~\9-Zh۶-$::Z}JΕfᯞF'̞=;55uʕB}9wW rYpssS+xzCJ yCx]K>+ ЛZyN(ܦ%J -xEpi7-Tj4%q|Ν(:ׯQʾAi̘9sϛ7^nۃ_7l؀K'gqnlqne LLLdjfe(\i"z U'??D+`tY1OP#vU *((6>gffV 4:!v/Ϯ_:1Ѓm;Ϋ~',YR\\h4J C!*8/77kwYf#u˖-P&̇7n(,,4m!ۈU "Dzl2i/evww: _tF'2d^{FwV.]oUȑ#b7aaÆi甔,/X@fA4j*A-Ӆ!f&M2mK7{A q$`ԏnԇdp_ii)Aچ)4:!b 6{8P:gԨQ,k4YbHơvx`+a>ߖ&BF΀d!wfnݺT79Ҭqxm@ QAp* ,Ww %rtptfͺ9 4:!„ @;N ϏGL-!&"7ti&0hqqG}t…Vñ>,,L3fLNN&SHIIIk$G2m6,;>RP#P޽{ܹ}2@5)ѱ838GA ...o`+#PR2 IMs4M*!w ~М*c1]?3 N1ydqhߎ;8! 4:!v &$&&.Zk׮.!qNBaaWAAb_FDD^z6MT;vDEEa~:IÁF'x饗RSSSRR u[TW^y%!!u2蜝&!!!~~~LbRZZ~&''{^xxks0# ,Y2k,[4\htB!Ck.))Fsqƻw@Ķ#...*'sqN ;%<<<..7ޠv;F'N@0??3yyy=ŋqN eʔ)0ŋ9)aÆS6n!!!.!F'~򊈈سgOqq1g9qqq~~~iiivl]"B~N]3{ԕ+Wr>QۂJjWYYYQQQɜ'!4:!v/"իW/\_Ĕ)Sl]BCb̝;g]~=]bTÇkBjN3doo^{m„ ӭ ;ΉcAL6-&&7jEFF84:!s .ѭCvvvXXح[qN1c`v7k֬i׮ݾ}l]B Nc0}tċo^GGGoڴ)(((55sǂF'1]!ٳgsRg8//oԩ 8'N mQׯlB0 4:tիO:9 q$^z]vmذJKKNʎs8C Anݺ3f:u*<<&ʪKKKeڵkǎ35m}|GUիW?OӦqd1qϝu):'4:!Ntd meVNNso޼V{=7oԣG YDFz6o_S\\VPiv7H}߲]˨{>>>(v6mj<^^^kOk+׿)֥p~itBIIIݻwSRR Ν;_XXݢE;th~Ϝ9isU/c!+kמ˗.]oN:>X?h a]S[~m{`ӦM|f ;lNsԩ?<<_| y^^^^ҭ(0V1]GMN}WTt-77?ZV֗pO 񦩭Zl.111=z  8{ٿCh?~]-v!!]8v5'K^XXOUV{ׯbtoook!vtѕm[7hTqp&M ޽{eq"bPj^J[6'~?MNYw;Ȟa-6P6m۱Eka?sSM*>v+J:DŽ6Ԝ1?!w%22|͚'sS;FE]BlF. =G5(G)y{mò 3B]͏?=cIԮ%-JV߆ftG.߹su$uy~XVC-_' TFii?p[N#::F'DlFm7ʷI)6E{Ts>/s/kh3 b6I])T WGQQx/G+ݐ z^ 22N"{ ٮ`'=,6p.Bdz96pDZ}^4˅KZԝl矪뙾>o111.ϧ~Znڵ%J6g ye/6l$+|Vy >!̙|VhU5Vh#Bze^no3tYkeݛ;wnjz2&786ollvW}~ѢzʕNuq#裞¦kBlFuˊZ&wp'^5on+j ڝQ2(˱ {Qi8q[+{)OϿDޫW/{(Cswom{?(xѵݻO&%mtΜ';bٺ\itVcy_N)kVѧ `;,dt/,-Hs/o@l 5ٰS=ѣGPP5IBQѷvq_^w=:n׿|͛ݣUw̼saxsX#ԻunϯbH]ea 0-jrA/ĥJ?<[##?f߳gOjjo׮ݣ>cI+=gִ\]]Ҿ;jxӱ{am \{/>|Ϊ۰9m\mRHB1/Y%v\ߐmqDnM*7Ě!A}'3<2O*x{ &=M? )iŮɦ{ ;[k`ر>33]d~l瞚Mi``G3b-ȑn޽ٳW=<8rs/~յ'Kp,-[6yaUQZz{ҏJJZ$ yʆ^P?zn9ct_ѬmG?AڊhՂ09y{L5#;t7lJ8 쐮 2k, [?3-"==r޼ ?sf|{a)4z}wtУص!SqvXlu_c9- (ĉo;uowP[NJ4G"{YvckVZQ,5ڮ s :w:ϪdO,+̂8(f'#w>CuoF疟R&[Aas8ΚhlljG?}{_&zklvDžp?#t>xEFJNn: 7ٲ%+ iI[ϬC:dO߮*ۚad$Mgڏ*R0ڤDmI8VZݛKo{Ԩ 6իhQa>|z~:4_^]ꫫ_ۿۻUN-p?5ʢS{ܴ݃r= ]*jEWd&Y/oެ{?t+FI?_++ X_R^Gm vj bS95L'xiI]Rqv={gg_fϞ}&Lo?l[]‘0eAwvx_.0=jH|,^DDmT$íw"#~}?yaڡ^^׬9v׏N 2ӴoAko2{p=Mz y~tx-0h [uƏv2BF'qv jOlS]}hxF}ه*Vtpvǯ0}qq d9 = &AAyZ[kѢQtRRp)* NoCƏ?v8uko翧_޶_?Z!äT.fT_Rs."s={0OPz/C!! ' kʠqA~\ͨq,FVֹ?<=~8b5mTKP/ }jXhԪĠ2ƕ'g]~ݶz8|֦迼yf9y~ʐ_pitbK8ή }g>|:{W!rVG;7bAAɡCg[h?Y#"UGо2PPPp#G\ ;uJFEVV}܀ĠdC^/~yƚ7nP't葙4C@m;&)!5saJCExUF'vU' Qfhݿ\fn8лcp|͛7-WΣҩSk?t/Bh?۷ogee_Y~mȻM6٤o t_o;\UMڱOeS}Ҥpj䯰īٿ= hjلtM}a8cgRk:V6DE5.PY8PxيUNj@;¯y恦%S64sN!k*ңUQ;Go 3!YiZjo R}|Fxk+t屟Ifhtp]uaǙy#֯iƍlEUQշ9:>eh9,.L/s`AuoHA68gWO5Nj3/..>ydem"q6ska{v(Y.io8-gGַ7olFPN@@vP*@Ǐ7z'Nw}g–6s|_`͜8:F%F3Lj5ƍ񻹹uEm=}tYYϒ|5)WπMlo͛7_xđ111-Cb8q,H?cmY0:'N,[,666iF|Z&bM1cDGG5j۶m(:tu͜9388jg\g@z֭J(V_3`oqvo/q~~~FbGf9i8Y;~9"uE3 :2td!0@\EZn]5piҤɐ!C׿IF]v׿^h87774(,!KL!ͰF%%%f1m76MtdmahGrrr._ܡCx;oү_?TMI:V]+eB ʹ`(|ӦMH]͂TxE JfZ s"T83v@JHYcƌ j$aҤI;woA%ۻwou,C 1[s"wޱu)e!Īou!v%c% E Ѷm*m` a7COAf+JH$P+)#xE[lG+-nݺU3xq-z4C;VRuP/gϞ-ųpNQ!{Ԉ\苁| $oqp4 } &HAA;^Z3F6LeDPXpn+0otJqџ9sh Ay̶ӰBok˂Zy% XUJm4DzvnZ%UE_w7\pAYB VvY@*A{=ERUK] r Q[*YNsy[7B|~ͩXwxfR_F{b:A%@ n!ЯYQEO Tވwi9ݻ7 1>>l_j  ZrرR[Ynqj]fqww{"X;)]&|P2S;^$F|joBfʹ,`U3##C X'">0:,, '|ҥR9γDw=i|ή?ɹ۶ӯ hر)zFZRR4KV5+*qV8u=P #a䨈ۊ!/_ӯ_?(Vګf$_P2w'O&yg4 `Q٪qÇ2r*|7ngj\/Bs>o<:]Æ 6mfggu0Cۭ[G_ƍGRR"zO6%0::w\j$ ja|{vUfff対ꮹ,^A!@5T)M~n+̘1CIQY889p9N񎘻2A})8U EgmJ /=A bEEXYُ[|nx]#uF !IѥZnBgn*(999۷߿jF 1`4K/"?&ArBBB}bDfǏMȥJ dzsUѣp׮]fA 8F fTf?7n{2dHaat^ġQA6,^PY]}ZcX)[o"7"4C3>>[RRֺ݌}$)}:*uΣ$(Vqq.}l^ĮLVN /}XX0Vs5j.:9D=Z~XT鸺8 ˛ jiގ3˞[ltْT%q)[eū֭['7,ܷ(F;+gf4ʀ[6Mz /]|vtlU{nvرK T)OS> Y[0x;Xvr>4`T0l;uh&ReIX@Q =Dƍ,'O.((_i1 єѩFS9Wr>dŪhmO=OS63fNM`)WfbY3"Kqt1vl*M{?pƏ-[Fyx4El>Zy׮(W{%+# Y`b`lEeXs  Rg8C@VX˳(333sssvV9+クnZs\44hP޽7oެ@֟9B'5eYSZddd8p`׮];JL|#GojOF˞?@G^*V?rmV Yn]p!ߨ+,^*/MQQT 4cQ65بEC@#Rׇ@ؐz׮]} N`kX<;;[.ʊQsچ*m;inO-GlKQQ,={ܼykzO]pķ*)a_YF8nO76Ԑѣ`,2.; 3gßz+bX~Bzl}ȀDd`C@ԃ?L?p[ S#t0;Y ƍ3gD jX6["8Mqs|Vqp\&OJ C0|aOL?{P4Cսz6zYُjg7tn! D߱3|o_cSll_IyܧwssQkR:qʔ$IIIмy -[Ba)Ь?L x ##p-(R5;|WWWP*58N(//7veI&Ç!`YHNΓh8&== K^eBsi8c9ʕڝ8,w2 ǟtKRpNٱ !Q05A;L#UW_}"'sY*ѷO]W(jZI>jv2Y0 4:!6%55uYYYF7mڴZkf/~E #bL66vl*xS"u0~tDX3f@("N8 h86J2htBl ?ړ'OGFFV=f\ TH44<:!F4ܯ_' -#8޺WC-kY%%e?xx46 25 Y,Y2ChxLL ٥GΞ}@#Kb*{BDSe0fGIvGGGKs^1-1U=|STTtmoob ќ-@{FoCڵêJrc!MO<Ē%KN8QB5*Eiwҿ j|AbK%<䓷nڸqcll+W_u9Ggoj>f#! r6l؂ $hw$.:^+F'fdddgܸq> 00#7o|l]4Bj\i`FnR[ׯ4 ~ժUro7*"R7QYhtBl.: Zlw^oKG1Ib,O萧W|G.\0! qzZ̵"C@arB-[_qFзBb6l0aVp߾}mX0B,>Uae9obC@Qi-hSmktx??ݻwqq*@bU&Nq_fb_4!uK=`ƏdɼW_}纍رw9{ٽ{ ƌy?׾DAR ^^^IIKKK-t_ۼ쇼.&wB4:!5>gxE\hh=4EEWvD+V{vم7oޖe,4s R{ ! 7ë^-^WZZe.l*'VTj zv!AR=vl=&4:!ՠgx%F' RTiӦ%&&ڵBP3BH@b <"" 3BH- 5k\\믿nB%htBc3BHա 1éSs{B,@bu (b gJq\htB~3B 8+!ѡ gF' Jqhtp gF' Jq2ht F' JqJhtҰ gF!㣮]f8?O?:=:I3B ;w3Bl]'J٬7Չ9+!ĹkNfvu)Ku /pWBCG𚖖FB89@щR^^>udJi9:'8=4:qB8+!Bg(<<:_dɬYl]B4:q*8+!B3B24:q222FGip B3BFG3B@3BF' gx%#ht{tѕm[7hTv+J:DŽ>t39x3 gx%_vN9rhAA>MsmMzo~?yLXv-oQB67?rkuyΝ#ƀHr>bj :Yh0[8+!1m7ʷI)6E{Ts>/s/kh3 b6I])T WGQQx/G+ݐ z^vaÆqWB 0,6p.Bdz96pDZ}^4˅KZԝl矺g _߮SXK?@{J!9 W"JmDh}v@Mw:mwft!=km_O : !ĨgC~墵*~ѵ;>n G-{fzlf ՚7(z؄48u޴iSB `՘s=gקSGZ~)c<ؾ΃'*K6z Ya! .KKR(<+K#GFvBqzhtãUw̼saG;"Fwܦ_Őw"`nU[q^K~ty3Me'bCht{,O;ojwfz\{w{wr8"i&?b͐ f'܏tH- GO~3HJs6}wb0ȎBM4 'U[RZ='oϕfd&5M ga!C;3C{ʬ2AQ2f+"R /vܞzWBq&htC!!@B!N!84:! B3@B!N!84:! B3@B!N!84:! B3@B!N!84z9wٺNNim[BN]ZZj89[l] Bqh3e[B BqhtB!ѣxٳ b=<>+"°0k%@ ѭ/ I+ԷZ[J8qGl7cӸq1N#*kFIdE ˗/U97l0,"l Ǐ+j…R'ׯ>/$qF3g`79oEB.V3tz(gAK.!8)4JJJ`UVA<" l.] ̝;{[x۽{QF"oHe˖ڝI&uy߾}Vk Y`iA4FĦ0ߠAls֭x{{#e͚52By|>rt̘1'Qhٲe J5k,`w N#[$d:-׭[$&&o߾* ;>.g j~ 蕢o ,\pA<[?HS68{@gAA W,g!Q;B$ ݸqc J}쌌%V+*46!wd|WQEfffUիWk˞^*rZ=?pN ( XFMB΃__~Bih* ~YH36{`&(rF *=a;v HwU]kjqӶZ%ݻ;p\= @r88p v᲌SsU4W .^tRXs֬Yj)1cp8L񫌕֟={VBUTj~<^~ڴi2BHFИV+۷溻k PѼy4s-H65ydQ PeлS˹\TKXX,YZUO4Kce5m< ٹsgHn^}Sy9@Bq>hw+0(gŲ,e0<<'aOVEܹs.\΀f'8o֭ؤɑQƫNJJW>F1P03~ޥ "ӷI A{$SW)8B+P&%%g8CBBT5T}i(X[… P쉀RvE&N=-g1ʀ|a^X߿>rsrqM%Ohui1};wʧ3ȑz{{\ivvvNN===at9B?WuWWW#qv1`6#?r,LRxxxXmP 3]/h鑚ot όSNBCN+YsB1F'5aԨQ2D:sڷoϛ!,4: 2UmG!,?r_\UIIENDB`ndoutils-1.4b9/docs/docbook/images/fig9.png0000644000175100017510000003132611253216103020726 0ustar baeckerhbaeckerhPNG  IHDRid2IDATx XS׺.)2(2"*V+Զס^QlԣUOqCSՃWAT@-EAQP@?Y!0%ߓ'k"]kKfjPXX3d] *++{0߽{BPҸ}ShZ|HcP(JB&B9hQ^6P +|" fŊիV-Wp(P_߯4Yٳ[||Xl"mm4(AZB&]%i!.yƌhUB(iM*ht]#a3a*N:& Vd(-7obc-e<1ѣcƌQ(xO77wLUi ==KyذًGRMP44qMPPZq8((Vk&//^UP(& ??v>FxJ;8>|j"D8%899G]]Q1`Ϟc?$ Li¡8Ɉ}~r4:J=՚̙E֨v4RPR򇍍̫9r$:.TPԙjMLOO쯧QhT gGǑE HL\L5BQo5q;:v(*ڵSNNFll<׮,8PԛjM7Ĕ긗D@_߀fǡPQ!ÆEͨ_Q?U( 1ng$@" KQ  h\ރqw\JMMuwN\5aK|i'oѣ:|d2B,پ}}!7GroFEYgn9pU>d% YLwwק[nQj XZZ 6>>YÈ Z? ~ ĉ0?s>{n(JFFFZZڹs'aA--aEDѽ͚ r`]?s{HO:A9\##7VU Ƒe4osLjT.vCP.؛ׯzLkRʣd9ޗ.!xD9TÃz1gB 6ۦ~ee? zz1c<8<)pѠP '~~6\]Ş¢LO/IO?xSi?jq8[g5Aaa:$Q|*e^B#2۩Y.y*uI&|tu9u0tb6c^w Ϛ5kÆ PF4z[lڰa]׷'^q%'BB`hO$hWUj-X\MLLcc~w~~~+WW #E_&OvJI 33W |mާі-I+&Nl֬ىUUݻ 0<{Vnll;_۔VAvvvtĠ ۷gRpTuˇ Z>eMZfN|R؝:~T[C̙f͚]vAi˛={rbنrptbb>񧟼 6ޓ&NGdWWx6 F5 3++k˖-4Hi\5͖p(tn&k"#Z܇+r_솵 4Hilrizk߾Hm)trRTJϞwd7o%%4Hidf]Y>"@PϤENDJ~VTuS0$ʊ)-{oo7wNCb PÝ;lܘ5m[tb'ڗ|걩334h #ad Ni߿iZ/G$ .Ŋؑ3}zfޖnξu/-;C=5l ͊W{e7`#VV.];㏉m)-KlL!x^DF(*zpw7usޫWjWZZIfݔ..<<""k ֮ع3ZǏ=xߚ(0}Eicaon gLI$hԐޖ'ONR͛/^??Vk|Q![x2vO?6IG4HQ-=v[GGOp IS(3G!U(F|[ٹ[cQRY#Ѿ0 k{v3u &ܺŋwdHH`fQMDFAef&4++w\3 #EU9Jd ^yy<\P?Pwn8ohKSBҊϜ)9$&~"i&: ыr=&  #E|}Ʊ3 //hezz $E(A4>6h"f"? ^vAAEjjQNBR/|Xn`y~oS!Lj>}9s"j #E̘1`>osV sЌؖ>)^Lq["Cc}}es{EyGPii%{KNG^b GoĜ[y23JǏN =ɠ! 0.++qșlɛ7Æձ #E9a3ũS}dīIIFF ؑWkC@GGbx6dKͩFl]Rƈv ň]ml F]09y2bʔHWW>ɋ}}bc]$51-mɑJ #E9@"ȔW_5:Qs~iBv缫WyFl`ʜlOVymǚS+XXjJm?ч*b&*`HСFmpzsl #1%%.;;]iAFt>B6rZ&#bڴCVV 0\Xy e5W5!$3̙6ĉǎdMAA 6m$x΀a[]1=}p={xyD ~]Æ-60x/phć?}{c7Ʋ?q^^3mlF2b ݷodSjhh8Q3/^XyN┬v67ǫiJ{շPWWk+77SK2%D|ll,Y+I315o׮SAAݢ #$wUoE)c񂴅d̟`ge(4Vvb\ӣDIwljEE))Rd0E{1 I5L UxEF0OťK>BBD(횕CEs,7oVH={;^O(X3{ʔٚoƩSk++Puꂌ`ʱXwЬg*(8N}:ٳgvV$Ĩ̶mۑ髉&2bc 8 JZP[V%?/߲e(DnnmrɐeI$ zd$:-R@yb[ɬΫ0 V;`} Mtuuzun̥O[cZ# N. 覯w "SӜ(,_:<SW!|bĈx 2bWN@VC#؛SNMda|~UnnT|/R{w2+*x! @|ɒӧ12l.[ O_lQ!d̈=Vm. O".fanRլ܂{ 7Ц.ze \ɓb dȒR/$婵b0@BGhpf%;w vم kQ1IwwY1㳰^]=E nnw A+szђ0 ԋG ࠤf5v6'o:;O$ǰΞ=d~MjZ1b(!FrnW>){ Yʍ%^$ ϋt`žW?]Ng.|yD VOAF.qYӡYR qjϗL"[Z~ȈÑ$طok*>^N$XɈ*.ٛʱ%uu[УB5QMd]YY JsGXQ\|N&^xhVN+ "㳐ܵo޽ $AÒ [Y%S%%t/CvG?Sr s,^ʟ¦hTAFGG}1byٲemv5/K>j`#~IChPMT+gϞֽ{1c`/ <СϓcY5ujŞd TQz y2dMIN29pO?ewQѲY2_.K1flEZ?^`mݥgO v::vmP:VVVN0TݺueB4<^N7PTt6sd= ۰סCW.]mP{IE6U9ڻw Jvk޿uK/5'ugܜ/@5u#:\remy<و!$&^;.Gŷ.Ay4h&>>VOO! YӦ-ǎuc^G\PMl zD"$y0pJB{;)ft4z$ԾWz1uDXMrYy¤IijHL?\1$v% YJ4RmGN޽%X? $׷uP/>}xCjɘ1{U= ij (jZ홷rI&--f,ĜDF++hSH씔\( ť4hMy}>ؒس3DǎڐNVeC7pc(ɫ={ؖ-J%H;(c4dw2׿fĂ }T֮"Ĺsc'OBΝˀB-9{$ǻ3buAɓ0ĸJͭ#GD bŌx.lZ? WKtS˖r Ц>}~*/_aǏsZD`Btqho[lq8a!IQQIE8PR4|9'0p{>,ݼǏ1+V^j#BСj3?""ed!mjVVPP.XdcQYd,hjdjn)ll>2pTG0 7Щs \Qfvmk.7w萌S3#v" KF'gh"d]f8IۘDWmڴ8wL=gڠApa Q`ZQP=%6d: լSYHՔE>1 JfMkDPj%g:Q칑Qں 6 D ^P۸ IIlH8&;u Қl-zfW [?پ}mC@~˖Hhb+ RSȟT{ 9vspl7vkQW΀6²KHzLӯ]&937hAAv_~9Ȯ.p 2GC`d{?}z ,2omzif~#3s',15o]Uk4tHi9@$P&,IKQ= $WeKJ{d1im_J!;MرͲܹ}죣cVܼG JKLJ{{O5Jy YYIkC`RfD:PZ4][t~ ԅc99,wt߼9dɒOCJ&;vvGPPqᄒSR~(ۗ.3U+W_rw*DFn\:pi9`Xb069pj5zvFj" R(-jM*pYzMu$;׮QO&4)[i pjvqc~cRB!ă;5/7D0N<~W3ى׮̘ON}}222C D>m5c8??u߾?}C8oOMMxq7Ν<ק,Ǧ!WhdC~Ŭz) R( &ѿY _~2p AtvW -/ 81lsiGYX8ɯcbbs)C 5"\Mnn|+O Lmm?d_߾d6ޗ.16%u#Q#{7Դ:VV6W5:PZ)"Mtjʘ`|pE[d*4!_GOӶi:PZ5"MϿ޺ua„5uV+ R(jP(,--26VHTIeW$ŶP)^̸\9ZXixٻw,-ii隞cm:"~ظ_d"`AƲe?jWtMQ"5|>9CJc̘Pl-+W!)|o&|;\:hGMU6:400+..CJ%:~##zn׷.RRnoڔ1+Wn"NVUr sHه,iՒI&dl$Ayǎ E@ʊ)OOϬ]]T=.呗۹7{g %gMEv^}'ὤŋ{&_Y-ّnǦj?u?Ɠǎ4tHQƈrG YAС&jVANO/̬8}O;QئM<i ۵뜒sjjy6/?~GEEՠAd6ɜtz*{q$naISstsA ɟy/*޽{͛i;wgD˞oJ-F 8\T4ƦkwU!dd:w,#㖋pOHcֽ{< 2"uF*Tբ 7nKKe$в~S̉⇠ccml<[:vvI_&w/krp&=}{۶ztY?GgJF__ #މ$;;;++ܒ촴x{{sKPIG_? ֖ Y%U'wO(`q[y[XXW`_OС ≵U@bF|#̺ŋP†BC{ĉ0 ׭ A{YYsתN+VXzONB`-FR% \1|>?77mIhOfg˰cUGG#3f4FjCK__ߴ;wޯ߈:kʇ!>}|l& P7_Ԑ!PVd> (hJK0bA+BQWC=z4vb~~)|FE'N`iJ"Ʉ`ff/ZkW5MpM`'FEbutK֎9M'3'㚙~%?PW=w0_2D hq8LkX3ydD9Ymls[ _T.vN4'hY[[sU= ce/ -rs]]w?/ BDqWi(-Rs~ 6`\xWeEPTn[eeM۶Eݸq|Fq?nxĂW5#KKw ()ɱ^(J Gw:ձB;2%g_'o$iojTAUa*RxWėܑ˽*_߼ݱ(Fnnh^=pȐ˗O|~dĊ"L$bIɥ޽}jfH,/}!4K$S44rq "yfq"[6]c\3*884} *i" {n4Isuˆ 24t)D2 %qJpC(nƈ+-''2b~|ju^N#)qEEۑlĬۿ[F,y%Q+R(|6H1*jœ1Gp[J:h"Ο=`'޻W{YYnpCP(-4+@"O7Ca61!p 3hP.$&l7Ĺ|m%%O edfٲ VV.EErݸqfB@5qxM\>lMEn600 ˑ(RM(|u-u;?>]5tv:|xGV.qE9Z&xm2tBQo5w0 Zqm[Ԑ!cF')df]AA'V3]`3C rժ7qhҊ;0*aZBd\؛<ޭ]fu.#˗Oɜ̫W3&S(VA&jLsq,+";F_ F[`N  *@Ko'$@M`VV͹{<9? AD8r$+11^0LCw#~mS/ |oAH{{Hb/Ͼ2(>>AAmmr?7Z[^^^RgQQ?}p~{cci(=`XvLwIs E'^wAԌ={z啵LaΝ ,\yPQ'D ҫuueôi^ii]AuLT0T;uɒaѢܹ+.n] ~2&huwyaf (%ӧ/d#LR\;m &Lp,((3g)AqGDmʱf S\3mA9v;wAԌsѻdraڴ׿|eA ??|0IeeA000ѣQQ戃ӽ`#3gv:>99ߡ#N:urӦh{0%%'-t^?|8t ; jAQQ/[XFWܽ דPQJKKx „ PQ** Ulv70fLA5ʢELa8;w3_C; jAeСn߿[̙-; ==P>P(DqGD)--t/TA01RUU Re`0^0L}}ر Kaa!; ͛FFnLaJkkAS2mmm#FhIN]P[[kddٗn􅎎6 "; N}=Ҳ2ʤ ML"#SO+/q6>~~(X'&J^2y+eOIA9i! s='8{nno-ZwEWV"yf~^EqGDimm"Aff3A@[[{$%EDrr>(,Yɵp*/K8we(pV\ʡCNn`Mxbb\fPjj(:|~ȑ䀈i |.[[RX̞fC](;O+чa޼pSShӟA⛛zz?A\v5x$ 0B?cYr% tիG.r˛I44PQu[{ZO(4e@7l^n۷σXlrք@;PjOudU2*'iUȂf].y;TRR"ZYQq&'2]~yQS׳gFqGaxbN' jk.ꀞmsY3Y} ..˛9}:^Ύe.~DCC<._υooJZcA܃ᬆyy 7NZ'EA[RLv.Bٽ;GZAé,֐~[+s666(:KL52U&`Ϟ"w1>%7oʃ=i1ca>]eī:p rw*(S|kM~ dRپ}>)5/zLUV}$==j~a/Pv=lUVMP5NNN`ϕ=׵b̙3ݧ 9iGJڵʞ=Baڦ7NH[>}dZ\O;PìYoҋEpU./J߆q}˖ԮZtw3ffw tԃUVYF333"El^{Uo.[EKK7=}`N8ܔyDk\n|ă^R]YYy.(wt\B,t]\:Hy\ԩ د 0&(@h?ߣAP5w ޻? hii$ edFNk_?|g֬ zA|A$B ->-@%EM%_} @df.lBo*:MM\A &@)qn`;7$YYYb(2z\\FF_ƁSG56宨&cSP8ۙ-[EAT*08@YœJlYΉ9?U,,{j#ER]$Dioo?zhRRSgyyy!BI}TWƌUh~vvv$tDfee555?~ݺur^  68`=~BDS" *@ S}߾}$xwHHNi3Ԃϯ26./ Օ98L[F." ̒J)Swll&iqDyIDN$0ۿNipppgzg:;+@p{Ao,]* N$ d4333''G}O}}}l]:=Ke3ƺAwn#N$3eee$rwJSpwA --?ڋ;./S80}|XZC YWP\K N@IQ deĉ۶m R #CY܁3 ;[rג#H"Hx $oppl$DE#$~0 zF?jiNX8ĝBI9YYYd.99y wJƆd>b/b'n̛7ϝ^P9qJO>|T_ihwu-;2)AA~GSgBB<*'I|O("T ooo???0bOw3& ttIC|ގnl|H&ʘ8q͛CCCkz;nܘw,, 09100ӓ7Ͼ+i*'(DS#>? `#Lh'NĮ] W Q?)QM.<|X2bĘ#z |XQk$eR///u_š5Q<0` cL敞 ՕKM(B^"[wpXW7;]]CCo7)p=8vu^H9~<£Gp6s/#Ƚ{yy>y‡:PUg $ہY!33}}T*d Sm 5r`#Lk ©S[n,UQZR8K<{YnIK! %!-[XO8?ѳHiiqC$ԩ++G߂CCO PW*+T OO>L]vJ{DxxX\GRԔW_ [nb//u*wbJ),L"quذg||] `e ,@cA׷|XƐCBp\Yy.<=RbLLF(å.(CwJ{LW˖-vC7񞆆K 60Hhxd -Ѕmhh c:IuRY%77w\L/-m겥dcOXI!L uKA (;#UM%e%$$Ni/x--;<%w  `eU*%K)IY!w,{&($`Ss1R;da{(;PSsZjde gO<|IvWH.^A^yxĀE_Y_zpȑ᧟jw6{CC%Li0ue ֝RD#=])bNM~{`;?~ooz!\ P烾WUTX;d-+ٳ'u XRk/𤋮< ゅMJMڣJĴ5k-%E B'ߋ3R2TR;@qG-SkZeRb7K'y}IB07pyNL{+KXXyA!-M;4#әU66WoqF*QFPPP)E)qIfl`vP(505ekI;r nj*{)qd7t {UUˮ@;毖vtܪG6^#(O>RDځ>h)++񉊊XHyK!;:l.6Kn[X_ߒs DǏWDz>ظq]%HM;H>AWeN) Zq_oܸt/D/%LjW_}Aϙ3S"7.Ye#*-l R5[n566/z-|lB);1Ƹw،垞6mڸ1f41B|\ii{we???\aG)QF!!!C@J܉1xFwߵߘǯ\rp[GTA+$*"Qw$EIGJc ,xGrїKg$sVVV;wMMM~}"NxAn]cAFF'Μ; {@US A"ȽAAAn```XX]M (S۟})UhIʂ+jM$y@UDzY<]Q0P*-bH$b@AMWD)(S;}0n Aܡů){s@١-AFd1t/z@SSɓ"d:9coN^ E:~<}JB1WAR%*GΝ;SRR~_n{pp03;DQ[ %;vIGhn(K*hJ6Dq:Ojm6ۡP_.'S D~Μ(J Sjjĉy| 5^[[(+PP(y+V$@geX? _~٦Yk%Aˏq'XI_UI $Db0D;//~})r] 9론O??p`#H5k-:1훚In,+T \,''8Pb&DqY=jXظì(#l [Nځ$PEJG Ě{TT\29YMu{PsPv~ǭFuLtcfGG?mpPRrw: ~wrI#'I}A}dyu9- BH2&2$2t@oB`r}w*:Z~!P(q㔿N W^y35ڵ#mѺlF{tLMM)f09P߉stG$// xxD&EqG!a әeׁC~tGC6=hڴ%IIR;; fhʬ$1@ BrtG3^3EqG %/@ ezzELa^|.**|&CqG!@YPP^殅הduVUP(xH />~<A:sĐ}xpZOK7 ͞nimM%R\,}nB#E(tu4}pwҤ../!T_vL[{$y њI?Wf6ɓ6G?~#eRR :P ’aa 8ӑ̅B>I& Nrϑly9w88پrIK溵Apq =gN76L쩢#'ʕ<>>Ν44 ѡ P( eQQ~```dd7|՚.\x%ڴ::}]p'%K&ObEb킏>bbbyX) #{6( (Nb(Lr}R҇9dlkkPB:@l%r?E;=RYkBb=zBqGhʪ*cc_wgς߿gb(; ۷}_ hn\pb`==L"Ϙs+qprpX&Ǥ+W2n߾@dt^B> hhhP(0UDDDttT9X!!!mmm#F(}\Pmwz׮ŔeWT\x먨P|I$qlM8 uH (rh}g{[)XBA]nyNNNxxx}=Ҳ[[G?!LMЎqzoqRzB?6ʕO<^] -|=uuG}h=Nj5Գw^RӽhkB#'%%En~Ń$E&a@<3ߠ -(q|.vUp[t[Ė{ᥬ oUUUrv)¼yut+]D:S߿ ;i44z:, ]TkiiVʽ>4:rr;'O%`s8lԜ77 I)I³g J3jP)Ml%>kr_߭|Ŋć+Xut<(;̮`&&v0O|3 QQqrJ9QqHx#WVҋј+4mPQ}xJ'bpV\}O4HM bb\{7Иv??ZY#Ll7N>o^8h%ӧ?77 $74ܕN߻wmdwوAkǠY$Ō>d#8 pлV:@{AU9.nRmMH'+*ԞS$/=ܰ{J.' ֯R5ƝąB_?F{>a3 xCQQujjn))MMu /gx:jvv4({ttpYYPbooJ7H=""΂ᬆyy pvinno 7wGдf**IQQ|}_wq߳_(lذ{IF_8!lyssGJ'R1ȴ`77 뎎>99u"i鋋;>j0R(~~-}o 픔yDk\n%JLf zmcveeSvQ"/%A}wqY~`=b54f>0[O|ǎ#gӧ?;8˖e˖?QQLLLtu8eN``O_Ͻt)Y\\^=x G:9b zQ i$w]Yv $e.싫 ̙sՂ/! z`eeom<kRl9PRVA!((ڵKaY .\ +\]]%#6]:~&}a '"&A|9=MAȈÙvفL1X,#?…EERPQ'{oCY5_}|.^L~%0IAqGD6/.Ν6͋0A8{6ҥ<:(63' f̘fb"}A5㏣e/s[vv߮?~PQ?6mמ^0[LMIENDB`ndoutils-1.4b9/docs/docbook/images/fig13.png0000644000175100017510000007123411253216103021003 0ustar baeckerhbaeckerhPNG  IHDRgqO,rcIDATx \Te? A.~4D7LԴ߮nZ~mܵvͶe5DRP@0~.( сO'P*ip`zc-eddrLp¡C j ٳgSHII-vyBxcJұ 'ݎt T^repzk(ǿЭRɲ˗{ @Dd̙Fi/P͌2PKK˸quvv޹sGgCV-D}?~bwBHV.ill t…ٳgAMMĉl[pqqjzqX$***;;#""T*X,6Z 駟+(%wSSSzkʔ)y:C@x.--z*W{6-3ˋ>[teP3f Þ\ӧOVi$ ;垞k!ruutOΈ4ȨthL_/~'ׯ_wYIJEWQ=t#Ft N m/Vxx8{fG p@7 D,)P@>ǍGח>5fΜPݽx;wJ(е"?? -4~7njiiz(4ӧwjG!IIIbUMMMTP.nx==I1PXXX賟>ΔJ倷`%K/ )ijՊׯ_/++ӭߟtj@Q3D# :~i43P_"""lll*++Y!tfY2{2P'رD=⣐AAMZn fP{ Ha%3j{0ob󛸅j.]D꭭=Қ)@47714ZzVYYY\\L:::-z/9s&՜Iq$))Ia fs|||Xgg38UUUnnnwrvvJBouuuHcXoOϳ@ X e+WL>=<<\F{yy[@}ɓ'S8v;MOHHϨ'N?(4k7ΧQ=ZJrt̺t64JkG k(66^Ι3G]>~ᖖZ++ &%%%UVV4j^RNϕ"#AtmWWSg…666tNb\EEzfpBѱH3MR n Ʋh=H⤡[}i_2-FG⦸K} ǯD3 -0 2#d 0G@`!9Bs ̑Eqqqcc}bqTTЭY\&hڍ%L75RT!C=dB`+i `8s 2#d 0G@`!9Bs 2#d 0G@`!9Bs 2#d 0G@#HRЭ,^0{nH)n0T^^^B7~srrn9.t+LJP㶶-HqTTX,j 4|u3Zb-tCƸܼfwJmnȈR֭c--%Bzz~m۶;Bvzsݺ4[1?2qJeQQ^CC}kkkv$>ݛ;8HL?۽gdܸsGɎ$k__ T:eB2$c=?ޝ#e[ܸQG(&&>.nN\\܀E@vI+\ '礏Ofܶm[L0@*g/ϔU͛##( Jl/F7=C(+>C&wx^/G}>zBV-L*EF.ݻg(t,%%?8u?EGw_xЍ2>M*}9q~~CZZ?˖-]ve=~ad )y*meeVV\Ͻfܺukcƿ^z.4? ݻwXl.kFB(r|߾y}֮MDB7jpR_/4?|>woVgg϶m o%>\Fbgȧ{Ҥ_{ȋ/Nת?˽~= 1EE~…p]AXyWY*UY[__sryRN//^L8q^txg)@ѐZ{իWv daaKΝ?OIIo ݨ~A˖M?YآE!^crh>:iigϖ.[6iǎl1R[{a 镁:ʺ;tlei4*j}^v6 {:Z5Ѝ&9JlR?%G6.ƶKKK.vh֓DCC^-Ȱ䜌\4CSXľ,"b} } _[H%JOÇ*Ϝ0*RwƷQ)/yF˂A11^<3z}G)pΌZ0f #Rj߆%5AI_s K E r.tes[_(M=*so$(ѭIΛF\SIK;;<דD?|^w:rrNDFBRhtnw!'^|?ѻ_|1>TUUmYY5'NVTR*rr7}Ee#̖2C .,Pnͭiϝ;ݔx|}||ƿ}M9rm+#~$&~SBY? }e^NVΎg̦͘_QI4UIVNXIb.? _;:xSJIK_pC%Y4/76퟊):"dJU[뭖M߿V*O^묩нtt˫ xpC駟ᨙu(?A+CCcܳ-V}MO7ԩ'2^۷ߟ߰cG}jժ)?>L_mL FJeeN %D%S.U]188>W"dYR΃C[Tڧ~paɓ?J(uw;&Ujy_Ɯ{#)stwp AAqs(PVgl%V!%s !JW6QURZQqSݺkLb?aF7KK: "s + s]<|˖Dػׯ754 舰&P ;xVYS'>isgzff݋W\j"#ؼ^3MiE- @~-Y):@; =uMZ66ؒ;IeXfpA|e ]]J=+B !3s":C+Rr0P( 457W:jESXI`Ģ|3~'&&s\<^5J, e#щ|_ ;Yi,k R/gRv(YZX-iihjaS +- nZYd,BQyATcOww+(h5;* ClƎ#owWώv gV:Vb\v{$-0މVեYXX aTWD7ࢢo.7H/riiC&!F>lΝtFDĚ53Mھ]=J g1VP{Gf9ʿ^.]:i߾uÓ6 g+h(t*,\42K͸@ި>#9*iAx&$Q;EkFʼn$-mwWvnAy܅3R 7n6Qdwǻ1Æ򰠓WpikUM){h&s嵂+2 ʎvWoM}\^K1d RlXvN#{jqU'Lܰq㤎{ݶm[XX*4yymm]V<ȝ<~|cSSQDhCko~g\w)-?хl7.*:)D,1f=ޥ %_ϐ5_k&''\pss{cxvzk%*(p~h61nqԲgt4n ^\uEDFFsOj h,3A\fuyr?g#9tDՙK!k+kA@ZIQS K(TהSI< IYfR&F\^S& ,*?~v&%=b7 X)reDbu) EUUa;J2SPHC>vC@uc#eJu;z7 X6q#s{t46HPl <*eF*Q\-Z$suk QQQS طo=;P(۷:/ޱcT6Ӈ ?S| {{% ŏ,/?_VXuvuV*C3ҧωBݏƂGb5H]2lne {;"_RCjoC bML qƨܻS.\x}weffrbS.6mʐxTeux޼yٳg謬lWǎʕJ,~SuELCgP?c~xOrÃ:vI-5uU̦M-ZR2ce,4S?Gdcs `%%BJ5..`[R6ԍ1+Vܺukr#^tZS{UQ?eQEw{TH5>lmZ .LOO?pBh}WOOOGgŏ-<,I?s6rZŸz 6ֶVb[MM6Z::{{U'.1CRuACT1{;ZXHJc.euKKqԭ"hPbb6|H5ɖ3g^aq }[~~6ŶÍwĺOhjF{1O!t+(@ g`jLʳH-kgEǽ_Ei-?)o+,ʔj LW.$$p2(bIY![*M& N^A6[*dDqqF1WNN^=%695uomm ]?ujGAAjXX}?x$8?nE$, ĺp8e-3;] гsgkWg23f';L*`ӻy2Vǒ֘h(!UC\;ƲepW0VwwaSu)/YHi x;}͈ eX^F]-ToM)ޑAw13WZEMj:3dJ3"&f䪪|z>'&>EE{ؘw]ԡo/R;9D?bBy),X͛MI7pn$H34CyՃl&gg?p#Rgq01=G7 Z:9c:^z ƍ޼Y%t+_~{pE:0t_N?86mVYYi?hbRpqugѤR;.t %@ͭtLDF`#^ͽT]JnS:f}9܃R$~wDl?)7U-Ԓt;OƴiJB&W |HH,>w? ӢEF6ᆳ9ܼg ֭'YP )uܺˆl E[[\^{稁3'QXRm-K*e 𦨉.d WxDѺ j}D~*PVVn4<3KKI[1D|"'fHBwTf {φ=2nIfqKuMyͦNu,vqrkj`7^L_Pss{fT7j'yŸ` ˳0z!}ϚB ݷZy 6yX>'ƻ3 zZw vU e)85o_%[ .ׯ766N<ёᒐGKy==JKoI~WȨ^' 1 #hHqN̵,5/]~;JU'^ÞjlULZ ~.}~s=R{lP7 -l7nQfD7o gNNNO YXH{5q~hmk+1ce)FD`}SU-X7-//qxJBlhd $Y8oLiEon$_X $IBF\'<Ƣ]Hya׮簱ZYNbw ս+̟vLQ8!8Ax A>x~:裏q@M]L,RR#Pfi)Cm-*HOCӌ`?8 7k׮O?`0[[_&/d۶m/2 wWc$@p ɼ^=Ox?0펊&GfT5ʮn: eUaD?64^ZYG@֩T(aM-'\t_z-quvfpRyOȏŠ_uM[.ef1Kg(pZ欞 O!zK66L] q Qvlmbq*4ND3 tcm=[E`(զx1{)$&>2:v5k eTTvM~FYY{τ3=M(4s)C \v-VX/I!SL*IepoTJ|1(F2FM{rAB0ܐ~ 6I$bn|4; Q@,¥,߰䡻E<{/I/SҲ܍ڐo{d.dqihcWZzjoT!v|^1o\U;TzCY_"M*걱emm"¢zPƶKKKgG7.U?WWe˖Zc9ޫWd~cǢw7 zeen}}tH$/^LvwaoR=A1H,@ߝåKy2E9Ϛ1 O_e_kp.0tUH'eDYZX*JEu}DX @Ԥi 9,HQ@Sg/j˪FB$bkfJE *Waz}-<޵[X (y]hts=!fԅaa EC[R eݻW-2{bSl/:]BgZmxߠÇ_>qb]Ȋ=|7r(*۷Ecؾ=iiixVҿy 5 w#,垦T C\[Ve{{KX~Q^^rV_EM3s OwuuPCCJMB|KKIFƟ\%o33߮UIOW3*LEEqq ~DHT(w}ўYSY}&.U:{yԝCEUZϳ(paeblYj-;rR r.Q ov$K6ۻCk$GBQOhM= `&Nía~7W_L~Ssʕc,ݹ R')iݨ Qr*FꇃL VBEHUj< ^zر_~_6ldee|tF.&mÇ\=yyW϶cSa{ųYsc '#JV{cs[M}8u&B Lr=FO^ֿ6E{Sn֏F,ww7B>|%QfZR%%=G1ʕ,In\^cN*wG?Sv\zB{ 2,- ~TBIV^(Æ @, ;weۻ{Vg1|g񄃃gf;7<+u^!99' /cӉPaS/Qi\dSSaBB禘 ^/-^0yB(ǜ?s|޼eXzJ/ޥS…!\'жm)lpJ&'5[__O?쳢ENlrٵZ ѣ4NdsZgqٰ"͜Y3&S+(/6zrs,-k*S2J'Oc#ryP򜆆b_,w̝M [rSC}(./0?OW{nwOHx*?wn[]"M ,\PIeWDoMUTDa2޽YY.^FQĉXzvLz3@Rk|hM @*:x?( 7h@N_ȇNib #gN cP9}@/cm@F!lʤ Òd 3rKZf!mζJ `22Ÿqf7+ʏgcVrr \`jVJ?nn˗mlڔ7TDP Y֖^eXaoq,`K @ Hš=L*6֗\R˞Id=> qfXI6Ś\ ?|yD6lݺ( :~npٲ%JW>Vƺ~ST'we XD!cp]/t9Ȱ3Yvs/M|W)ϓ_Dlkz=k_ nN_nnįVwDv_G&va:uzuubxzNjh(04jjfƆ-ڢ 8ɜB QDn:̈́fRY5嗿8v=}Mt%'Q^ann;Fuq_Nbs"N'= )QDM D_lnMlX7 +lia64鵟}x\}uXK$\ y =mnTOm8ޙ/WpG^"3[['WREE꒺j;nx>yS]YEJ3U[0|OZUu<3odUU`3P}}nD3$ZwogϒX;)s̘6%%-+W]Q|G+ wqY-Ξ]K)!>][?{|?dv2Rx(Lv#aMZ(s4T?ww7dfyrJBZV6Kn$%';X"]AY!U );ʎ^Whhѣy"g_.6:Y޽٬cD-&jxک[=JI)-;Y=o![Q> 픍(*ĪF){Eo5Zk0 @@NSU+WiEphOwaIzIK9 *oājgFEa=1|(CwKkcuM9ŢR$NB#_.^>'҄(f'7z5b:lb$VRy.d>|!C TYvikymwׇ^Jݹs1ҥ8-,,URTAղ~Խ~~ EÆ |.kIↆb[[7ȼLpbc,ށv--K["G3&{75ַݺ)sE%J<13W[TW`IZ[7XYZMNgZ[Hڊ;n}GЇQ|_?_Xx>3SW%>ζg %:9iR`߼,+W,\,)(Rz0~`2,4âꛛ-7eK p@ wL>V>ؚMZ24]:+UHHY+23_}ڂV塬%rrNPk'6lc2Y[W_8'D[uZjb_L*0d v톡"#8|^feYhT߬1IP(R D `6mz65G8!))-{Msv%'UƲqS>qVc?C0w֭ݹ3|pd٫n[x3dtNɐp0t+ڶMb|ߥP(mlks{`b?G#}3f,=w7r'Ϝ`  o?QQb#L6$DO칺~۷?+x +tLwgZ3dw@D#<`҅ 賍s22zy믿Ѝ0&oo={P(9u? >^xxp7[7\kjϞ-7oſ_Z ~˵+V1 $Roۿu ex@T*]!˳ӿ\LYYռy3gDG{9dB7pUUmVqRSJJ11qO<{ j!!~\wY .+#69K&=!RQgg_ں5͛bc&NtT$JFlGQvvJCNE/򃂼|3D>"@pצM[0;p-- ӑJ\"**;;RQkkkvPĂL&`4ewWHbge(=,봶*oh%XS≏y ?! ߕ,G膌q]]nOn0]K{a/t`c5S0xDH.WU8qBH$CZj5#Ɲ;Jv";Y֡fu+F'Wu|_j?y7n0vSOYYYܗ-}.//OP݊O*K*وR7*AAKKVYi^#GΝqƁK`G0TH@:}vڱ F2d @~~Ç頦>@W2u1 A q@ @@`jN ]A`z@`RZ@ t;t!򶶶 0MOOOLL`Ftd2Ύ322^|իW *0O@`!9Bs 2#d 0G@`!9Bsd!яS.|#QNMY,ZLP B* 0/q=QTB`p0 T*␁`Aج^0!,,,2#d 0\GG5n zzz*++8 F#d 0T*}饗n!!9BaL4^@`p666V@s  P(v+t[ 'H(ahpb=@0J!9BI5n :::ߏ10!lllV^N p2P6l(**M6-\PX STBƚ+W&'''$$444,Z(==pJ>L" ͛7ŋp СCt#t`AaL4 קn޼@`t@0rܹ3++B7d 0\GG5n AT]v;v   SYYa`t%%%=М9svޝKg܄n5@`8TK/ ){ϟgg6m$l`Ah=R-FB,d 0D  gccj*[`d 0G@`p bqqq Fd 0D"u`4BÉb(  SWW'- ؿ?Dh Yz5:`4BYXX`RR@`p**;;[C 2NTcDp 2c`Bs 8~xmd 0\OOOee%h J/Э02#d 0G@`8 2fժUB@`! ݻbccn $   2N,F)d 0G@`:md 0\GG1&F#d 0ի 2`Bs STB`p`p:::vCJŋe˖ > L6-++lmm[2 F d ?3!2 +N ]\Ww@0 !lllΝ^Fd 0PdddfffGG@0 !,,,f͚N p+@0!A۷|n{uvv=z2Lf&^W_]p{!t[o#t+Ơ{~/͟#ٰ:p`l6[ۑ>oH8qm{㑁d?yeeed[+Va0R t|!)89yop7}t@S7Nv={֕UsB72g?{g{o xkbf '>~1gF765AHqq 0d FXXlѢsAX|XVp s  ≏WxsA@--%}f|ꡇؽ{fQ2sA`NN5vR 0%d ȑ )M Üy ب3 Y(t[`y @sn^u& #̃ H("bɏŶNNB7 2,3&Rr{tL_" kצ.v@0`< h^)!H9`2NNX @0a< d vڂ3.]JG @aiɖrooW ٛ^Xl=Jd 0G@;(˼D $᎒icvVCz$Oɚg]S-mwC=*[(,+9jI+ "(e~u{7|?3^~sPRR~Lg Nc2fsCCCoeWV2_ŋ}BBvyܹ"uƌ s,*[,XNcx*ڵи6"b] }ٜĀ6CC_T@!t B:Gjj;z;Yt9W eƍ54XPD`+~}ZMt7ՂWi uPMD ȱK+qJ uucVFqZ@t#GDFF"a6oYxPYy@hڴ|mBĉs|_]_͍E[PJHuٜ/ _~k%0XڇI`JH17Aǎ9xww"BHDHFz;ѿJ\|nPr::e >,gԨPgC8H TNZ^h)k2^!A~JVT A Ё!F7.ܸ@rܹCnI}()tD}@WT7N.LLpRԽelLJklsd55&Oe~}|q]t B@r  3Cwn0蛚/wqqܹ]|t5*;؉%m~gwuϞ*QQ﫝TP !!ϫkM@>|]; .mFk )XNgg'.Zјk6&O=:P]}Y,i(NolC%}K*9픇ktБE#usc@qP_[sk2P͋/?oRNUdW!C[[lUjkqWdLPFz_g׮ߪR k*|{0|x#$*HF'D4۶TWؼp6|U[6w17//Y L4eijrr<4k28p jH;җse# MII0aBoC;CL@ d\մ,p0ldƍFuS~[Ҿ >am$҃b(,|K|eij: !:؎aW:I +rF<2VL YgΔ!h'oȝf+o..!!q:ݛ-v~?e2HU)ӭ_MMCC_4wÓc9/hl5ÆUR/VKo݁.*G]SSdӠ> yeB@CI5HO|%O4c3f*hڴG 6ر) 7rS/Y⃿Cd-)FK5nͤ3{xh`eJK$F~Y'kɞbKG B#\mՁƌ 6mKNҸ11ń?D=2D!t 'Bf$i Zn~7@Y-w&vEJ]֖ʅ6.&̞G|I`^~kH̹suu^^ڱcsV0MQQك uv<<|[Exh׈Dɉ6lX ==G9n{_eBV{͛O"QTrsH݋]"=&ӁvCbDΟ7,ೱ|ݶ-f̘'y󒢣߾zBVueݺu1 gsO[@/n9# Di:~ "ЁMΝ+ߺ5ԩ"/q?Т,P"|Y^dg'~?jt0M˻9gJKs@wyhG=OG3f&"@8`!2ȑZɗ6VHIEEdѢ Xk66VӲB:~~zE u^pwR%+rP\奺TҪ@yBB@3ˉ>{0|^Bb>|S^/]:2rDhUTXNpixmcrK@D`6 LndZkTԛmr֩_Z%ȑј,LAX:U$iӖ75]=thfΜTDZz?/g 3g&M!@"xV1BNPВ 2Mpp$>?Фh|eѢ!IP޽ydSOv𠾴47 R(e5k֭1ȟ?CUu ڽ 4>V^G ~N MAu?T ^ZPٜ UvBH'\}{ȊBt;tLoZ .\`ҥE gllAZmرc'^usv9+kt%;e0!M!vP J2dZu(jJW޽1h!`7nRewt1xOeezI1Bm@G{.s˖Y#9 OOєW_}@2EhG ϟ7ڔ1HOyy(O8&ľ}(-EBQ%qwx\XVx[cƄWI򻼯H8З_)@;D~?88δZ-НS75%8 `fx]SR&;;oYWweKBŒnnCeԻ!g@gt7{;B@D:ǐ!ޯn=MM\]=~8YPtu%ЁHP0ȲhBB@BqF@BqF@HeeIU?Tkk T>lWWk)3B!}:3".ZrfA60TW*.C"gV; o<֭j1B!sk|ɴZ<=pi۶٠&oOl|ҮMƶ(r#B!gTVl?̗il?C# z굃(K& =H<2 p#6 =ꆇ/񸬬hT[[%03gоÿB3C"7)-݉شѣڰc 8W֖!KWTIy.bZd PoHr3qLdhBHC"7@䫿޽^s9==Vh; *-w8!Dn"c2%;D/Uϛ:զIN.sqqh2]\:u(//`Ӂ!$t 祸xDZc5γfN՝pҹiizh6zD믷,޾= 4'BQ@Έ,jcUhQ,AfnEz ȑZc/mAAs֬@ l?hO֋/_4{3!s@ΈN^>~ΜF%FPK&ha!+Ёȭ8qf^^rj\_ɁnHBB"f_7|՞k?W !w@C@zx!B!B!B!B!B!B!B!hr=wA@ B]w wB&@c_uuuoGv}>wގb!B:FoGAz_(!@"B3B"B3B"B3B"B3B"B3B"B3B"B3B"B3B"RUU۱&ޭ^2L H#B"88՝LccӧGHDH%>>`0t/N)))ٹsgzzzWW/^pdG sL2% ɓ7w0H͜ LE=*8W\)HLL8BHB"d^hh(diPfff[@$??%AWs @ !}:!4b;35?vZ[-ӱuSN5$UjPDccSFb=:.._ׯ_ RډMtJ8^IIIILLDz͚5W\:tm4K1@x|\wߕ3'Nt. .LMMݱcr geeQ-KJ@e6'66_Ǐ/'J;҅fׅ\ZvR-lܸq)L$9.ejI R yJHH(**"##j&Ix͑; O<4He˖c{tpcQ!!7 c !}:! 6i8r۵aFoDg̘ݕф ,m^z5l^@[lA~RR ]VcT`GqD<Y.sNyBn:zTI8efW4sYYx ^^^4|ENFGЁѮ^IX,˗/@yy,Qje˖Rkժi.00077wiiix㮆wi3Щ,jw Cz}FFF;dVVVDDĆ d.LM:nׯ_UP  Bt BXY$9 .A1UVAdiK@mfyS #90*YV)S4?joE˄ZLL QVMh"hɒ%ܹs{ĺpcSRR@;@]dHYтgUyi'OLB<ԕA$N>?j(B~Ϟ=HDDD@~i)GU/*ƍє] ^fΜ};A2 ď Wf`K?WK-^X)&%UDFzVh~ QD_ЁM٭qZ j;7Vؚ]S tU777b6WvwҿB!B!B!B!D4WIENDB`ndoutils-1.4b9/docs/docbook/images/fig11.png0000644000175100017510000004631611253216103021004 0ustar baeckerhbaeckerhPNG  IHDR]A:LIDATx XT?rqrQD4D )t4v i&jV L%I.%(" (#kݞa<{ 3k]  x  0@AA"@AA"@AA"́>BAtr5k5jƝT)N>'M$H<==ʕ+/^m6:B gI,Y PFrr2:KW^~=;1$$3f X .<\pHuAa<8(\46c…s .pKr_ 7Jx]$ RxE|WQAtr>qS>b>O{!ʂt\>`Os4Ctǎ˗/JX/Kc8vֳvZX''=lC_999pupuѣ= p<؆vbnj@151bT"ɰ;wج74*%8d6AA@U|x. nԩSY=Ok &p";%+P ۅ[l:, ,Pk`:t6ҬfE8N@l6*..Ke }_6dee^6cĽlI m0Q-)J \?]@ƌ3}t777J @& U*++A`;w@eTpBx a˭W_ʡ DwTu˗/B+s{y}vTK #^K=<ۘG'> CBB0T ?;ڵ֭DPƍ*B*DP-3JA87%Ϛ5 ^L&ك}?2de[lxA#́l54??Ғ; 8uTQQ9VL/q\w0U46f\xbܣrymm-?{' Xt6҃fw>[6ˌB:6CK1 ]*!! @AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"Ͻ 4] 2B ! {w6vK!RPAtPh,  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S֡çr݊O!27vC#W~:c8<\+nx-С~9nE555S?|^jwO~<=j,lf ͕7jPes!jG_jUsgE]=9:r|߾{wbf춴5 _kN@ @nE'&Qŋ 륥32&<\)CNN/YkF uׯWi,sq1n\08pHO$/ gڵ映))rr-,,lonA@9q"c>..>>BsQQ̞lˉDx(0YˉYYS*k7 I$,+""BICCΝ߬ZiB~ܡO>)vG%Edfffdk@_0Qz?>ح ϓ{ Ĩzl7`E={ڼ $>~װaB{;.99Gܥٰa A} :.G{^z583.13{+F׮Ueffd|ᇫs&Lj``@A(ٶm #i[֬y6v[[lݸS㶊 ˵k׶n?1qKGxxcmw}-[7cnc8?7|]œ]v^cV]Bdo} iYYY˖vDBcȈD˖ݻϿKw'xyyEnE)Npሽ ۰!hŊff8EPĉz4vCGnn Ofj}?ڙ7oxDǴivK܎ycGoXbذ|w}ADt\]%ɓ';] !"%<~@>z0$J4:| 1vp7]p; 梢Y[ead| 7dH,o5h!px\Zɍv=GKuk6_T[8jd_=,DCQxy84߫,!Ѭ&IKxUr tsS 0]; v߾@eeJY9vlo@33Kɢ0xH"IG+6h>RyM\3kkQ@tk,+tO6ܽ[%=:v8:Bֈ?~il,U4w36d: Fcmm>tho,lhe:rfC-lݿO0S8 os_9sɓKm`ܠ_2Ѣ5LXX&!Ob F#l+#73 8٥S1uP_2I)˽{%`abw%aa||D7&bWPcXZ*LQ~~b cQVVfiiӽ 12ٵ^\ջGzkA* =[D,_0bVO^Ӧy"+2<+b`OMM}AMGPh777N!P7o=_S,03s!Z`:д5A(p&@ZLbv&D ^ [I@ C*-"Awwhxbff 6#/.N-С3aF\ܵEii>}<ɉ_CVK RLۓGBQ9 ]W'5'|rL0_QAA0#6TT\wPNqtJ/*,ζӫ㭃.jhx+8&Nmzyy6lmh,. c3\. 3aoNN֘*$/ؑS\|o`eX7L""m3DMWW^rݽ_c9#5 h瀍㽳Η~e*1{7F؆i{xqz"X%Xmhhh(-ѬQѸ=y$ٺuFYY᧟^n)Yf=hd2+xJ*-%$d-{f9;(ґ#sGǠ*Gp!d+޺ߵ72Y&@DJ9scA"5ۍGz(4nJkyX>1i^U6/7K;: *yc! @f͒H$p_knxx3۷%= ES qvn݆:;oR!ԩS0c ȷOHjDĉ0FG;,r<{+ Gy !6iYYNMv}j\X]_dz0iaa&g,p{ڞ}9Pp'Vv]͒DwPesSTTaG Ks+hoii('? slm5j.>}_w.s5( sNu$w~QGQz8^^tv; KKK#~A2A:q{xc,>R12h{.\3>$*z`qryNP(dǏo $wM Vʌ=޽vjCC޳gwЁvppN>  qR8{zAA¡C֭ްQ/hڴ{ѣc yƍԔUIIͅjF&UTTP[`dѽK>y:b!voL'"'k 7@@ ]?;"F %&>|xBQ#";.vے3?k\@Z5ID"ڵk׭[6 ?f(&L,6kLfip"(a3 qݺYI@rrv7bm: T4\phKoݒ ƟZcaSQP+WΜI iJyK=uyf```E2}ѣG'''{zzwNJʪ&K8WŬc..ya2 INQ^FTSكOmc7$xD4ɓ'&5/-*/63),7P"$AӖuBdL<`'YP;)DoZ)܏nrs ztN><,ls NL׫]ܼT*LcA {zrСu={57۷%ҽW)'>~11>GT@zw!yA) >^q.p[ ΀7(Ųyq/ZM~.&noaQ ̰ſ+q k68%̌C9rK0ldw2(*PeJJNmҥb4ztx({+J@hkII:yA}{ŁSS>;ùPôiʵ@Wv ;&#˭ .`;l /_~ =eb НZ9=re45vllp;S**gkMo0e:.eee"~rL--ʌm#3gnP(fǺNu bCЁʔc? fpDŽꘚWq@Xpb||0jzc:97n_}fC&k 3g[Xز!CBbÎ| 3rTCɓ-ݾ]t9#/oOD^8Kc2IKh?wm߾~rN Pc/pS$ Nđurp{ J:Ո;.EZPjbKB @sٳg&P޽-慉Dx;, 5)LYwM 9Ps-;Ѳ),$ݺYmѥQnD\V RD([HZEZX DhB55m@GMdi5lO+A EjcJcG5.DJ%}08otC;[p7jj.0=vo[e-<{А[VVfVL}5kk=Cr -ʪmVU,--j/_xj !ܧ{o.8&) Tr.PJe&Oo.٣Np_qB7uܹ\V^qAj2eAiЄj@d׵ H_q˖-nIBw1a{wv5h=K? 2,={J)SnYxւ8w""b24'Ovj߸ ־3*U֦WkBE-R;?mbG;\>;|0oeˢUퟷ#EcG.^_lj&Ή'bccy;w{wpеC;;d̶޽{wIw1X?rյV&#2"ɾ.eP3)`䤤E,iPuu<խCD}mػwk%IpꙋKcXbYy/q̺ [A. *o>ShPTSSmv݅uuptԖ\zw]>ۡwV{N!ܧ{o.5&Z6'Kw1sS ؂_vbKB,^=ܒPl|SѱeWLk>?YxM ܸ=aX>rƥ6;sX<_ ؘ`?Q~.Вe!=%&ƤA9Ұ!0$H RoCHȚfBmFBm,[+ok_{4 ֶ)Z8"vh\F\Bp1+Q9P{ߪS033"-oD!яVt#bI@3WesKrw3`3]hQbdJl:  ۔tJcUr6w!޶xHn0Ӄ,0ImXt𨦦۳'3Ex7>}|N\DSƎuz<@ fYU f%`uOvn빂%N^ep]`;w2qqv^W=7# Ԧ1itDEEmذA~kkǏzi#GNŎq'!Ǐoa$feWV;9GƁ'y&gmVmZZ+inNNX~8*PQLOWvD &:`iUUljm_qqQ>'%--Jcǎ7oُ޴QD6T(Sy7Gʪ?p"W}c{A8u7P݆iȺG7^r>z2r6x:q3Xg6tޏ\0_ 2qնi҆°;Sv={jkkP _~9\vn>KKEG[ ^Mڿ%f ^1//wӠ{w_{C(m_ $$@"n~1 + _TW:^|rzwO8ϿzG9tnIT} >g??p0wo+D0EEuu f灪4%ڊ ThC\K @_|w{wc&>M- +0yFX܏%7!xas_sC|3$P̈́7 ¸†峮}=CCO1>5kmbc`?OH>p닊c d!z@н+zetJ_$>--:{v;ͼy@Dɇco/..N7_%DSM1jDr7!6֭K=a'@5΅;џp@3qc8W\~5v 2@aZ6dtoZ˗7́au?zMRTVƼzXzKPGM2G 0o6a>2ԓ;/ ܛo 99 \,NmmN^7d-P 9=03Sssw X%IҐ!SWJ?ǎU~ КzWW2,#&ftϞ1A`*66XŋGB ))Ҵˏq֯? DFz&%I8k۶IZ.dI2lC;vDfg\3zHdu옔5C}}4M0. Cᶻ- YAҚ%!}{C6 aQ> =#JF Te =i)Ϧ\qqôB3~$́@Xi7~C f%2"A^VvY4ibq /s6$uq .~{,ֽCAlыl9[ 3}ׄ TbSUUfggrBɓzIq#;Opt . wWY)q L%LDnZO1%j2%-P-mA,4;`"XXtGɹ<3 Lhɒdp ϒ׌U6v01gcdKa LqqJqC9#%EF,ğ?$K#P 7}ɖ{c?8Ptl2N8|~=?nO/R-x]YcNfoI NtY/^V\I4 70 IW$ K(tT*5(p7/o2/4쪪k ͭG%Vbذa&@(oyywGa|@wƣpE 8LǧZ^2F@,.j,lҤ}%!!s |3f( Jdg &f<#VZ.B(n=K7 fv}.6ׁJKR!&%)oaaMVVh { $%-ү> d:B֭+M./|9_VR__׬gpsOKѬSdk}[ :8̄ ([L˖:xv Y=$©aן(\x< bٷm7Ϛ@X g샢ل !$ 2Y@8{07 ӗbx(/1yi[u }rlyy69PkTQqӆ.]̚.\KJJOϐ%K~q..w/H>.$f~k6M6p =Em%'+8M4H$f>p`ɞ x POD’? +ٷ/? 10йK@˗ϿzG7n.DP(𧴴Q57M"91I 캖VMCS6o-ZtF3oonOJpΜmjF~}XsT];mrd H 7a4<+%,M}K #C4Bd8;`/b WC\3q#{`C*)ml=ɴqff=m)+kZ`eP;@}]ɝQѧ+FG]3h(uaںU8n33 *X _q9Ǡ{5àBꪇGTsBDtaWuA6o2 kIIY{0I4 *oFdR"œ4ymx{3y-租9 5I 8DId(&@%FCÇ?|xjYKoڤ }7E/[X,fKO^d,OS af'd&`?3fǣAA+?HPdW9رuul>]G0)>ԃiZ%""bٲ͜Ґ g{  <@_KY2'ưE{p+W==Cή?觟އ^}>>mɊG}|G:qs@҃!C9iT] zzzR@4AtJȁL 1pyKܒ FXΝ|3\vy'ΟZ]]Եf}rVUoZ۹-ÇKeF>a x(_/~\n C-#ogdmF={Z/JD;h-ˇi9XVCSL9S!!I߿=++Az^)45؃2Zꃮ#:H$ih?p:.thO,,¶rЯ (7sٳ +48ܼkCESxe#\ܰحX[Y -;XOo ;tߜ=nB< &݊na <+bdeeϚSVV}9ܾ~nn~E퀀`3goonn{#Ҿe&?| c00%%׌(""¸-1@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"Y ~- P(4v+ =`^(@IENDB`ndoutils-1.4b9/docs/docbook/images/fig10.png0000644000175100017510000004334011253216103020775 0ustar baeckerhbaeckerhPNG  IHDRev=FIDATx \SW3ZYD `QR@EbQu:[[[G֥Rm B *bYDeFE;%I Y y͹{"ovY{Ϟ:rCB!%JCע; ] t,'t0tM:9X,&_={3 ]ObbҸe0WCפcaU Uqu 2t  #|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_a|TWgZ ݒ1/o.%:4Np !2W98x' '$^oee8gΝkiiQ2q68xDԯGvvQQ면iB$B@ox>}?`)MM, bbsqdrKvCj3䴷oNk2eq`gEqq2èB$BOC@ V0+DLÇ/;)"d\R׮٬̗9'V0?ʄ966=exF }WA< ?k 85,lmb$;}Hwջw,[DDl3d)6*>PfEtn8ͅxD'|I>ps-1"* ^$>5KNBmEoe$xQαt1O2Uµ [A*ܗ MxaƵ?VN_q)jbqp_F#7t (Mh9qᜩPک8  ҡ瓜*7"E/aD"=s4L~ FlfŦ)Ǐ={vttFGR㐐˴=zj*CWP r䡇O1%̋5_,!QR## VNۿN>Xs֬Y&F虘/9RRRiEӥɓL@羜p/M_q(a{UmCafQkgMY^B 7^̲,eJC aÆԽ{&J8p9s---<̓'O=LKK СMMK++;wF]aMMlgFF¨Qo߈Ht<+kOZ݅i,r(v̔4 j~d`ȰC̊ VH_5o ]/V/ }v˾ lHSsq33 Dgj%@vv}laa%d,>9U #lр,)a?8qb%=='hx2=Vu_@JRKdN|s e -.>Tog;"9Y Y??22g\hee5@* /o@ԌYY!KR ҡ瓘˥ ߒAi~{d_=߷sPZzڵ￿~Ӧy_~+toΜ9_dƖ:tQMjR9 $;pW% t#=m?ǎ-vq UrwO{z[Y9xf[S^KYlFG Yq &p-R@4ȗvڔz *>Dw9u>X6?\tGm}͂D´[ nO.I9*0,@fl)S>ER<<&.G!ܻ7/?Y; % 5똍BNv_C̸uNgbMʣp<>h`D`nM/;4m]惉˗SG^'?=Hik[Hz}{rA]2-\Hc ;\vQ8,URr), ]v6@N%7"\XQq*ݷohxWH$c .dţ؆+ɯ-H`vZ\FGGjdۍ#glz*Tlw3,,$38G o2sgKa)WNcc [oRK@ꌌWa(MT ';lYf dSJ++؃)#C4&NK&YCNMLܵdbvW=3dH47ܽ[!S]wwd"&vݾA*cU5^ZQYQq0/Y%;:2q%Rf|i躝K KFx2q(Mu֭qgTGxzNϸ|h 龾Q*7mxy6; Oy3'00_ / LO_ٳY/ッ"I&‘l0|WܺE.54n:OH#N駟jKMuɂK!|k\\ ȉ X<#2Ս beaCC%F̲Cv.D۷g .BxV bW4Di {YG!ev@ȗ~;]+Mia߼QQ{uTNϹs+;=?(hLkLYWRTjfփ"?n * M`863랕5+w.rbqYDz̽߈@*NVõuH enٲ%)) iڵ{Ԩ9_2FCC?ypܸ%s~)33~K/_>j(ԑ0V:2aDxQ$IyOrIϱ kks_ߞ@&Ǣ=Iw]<(Hj?){p_)SٳG>}ݺK&MXƂX\g j)q ;^~bAܢ={W$"JI./ٿP\\ka\t\q@?G$À<FYjY&Ty£UUDJ+*Յta%ܮ]{:8hmDS#;{﫯nTm?y~KKKY0:LđiiiN%Ñ{z Ez %"Ѭʬ {N.?>"##[;ɗSJ1t-{jݕ/ tذSSSi,6Vtɰ}~YDD?cw CjzvveZډ-83fΜ|I% :RX,޼7}Xkt"\xВݻ6̙3oYk6L( j筷T2$|߾`u%ueΝ;}ΜEExiƊ[m.?W&?Bp|1VMjkKT3f~~SSSg̘z-*hŊ7Ҧ۷ "Z0sfTR)%!!#kaFCΜ$_-e.X0磏BH ܼ9ק/ JKKk[[Mw4Y~1eʔdȕ+:aRhE.A[޶/\|I233kZ+OTT22Th9uB+hEwl9EVVȗ ))%8}!eyx>SRR!_Bse^tcs˗`>b#7ٝSL^k_xDp\=^ =;wӬBhU̜nٿK/ ~!Wj픤^曟/yUߴ7<23+/]~2kĩx2?^KSҥlT(kР/ws D!5i7mAU|82ri } AA--ŽׯRYyҁmzd#GY[RҰd7'zDKu0u^CNRrwO?N!>UeAWwFDx.^#gO#wʿ#}Æ,c´۲`[œ'֭'K7n|>Ɣ8+CB$ ?|a~ժ3jkK}4,oj>eArr2%KF'_?̘ᇇ@ׯK:,+*?~5 `mmDuxvS]]H;VVYnn=w< " MMj=o&_.%%%nnAx:/kw꫿7v ??kW˹kBΝUUEbq+8}>\eg%{y׮]|)'Nlvq ;dC$I+!(YUUŚd##yx/'2[]⇹S ]ـdgKǾ}{$ji Yo@Pj}04ϯӥivDYsbӏ?viiot17X)gnWPl ] K&Kյ>B]ۼ9J 5?GlYvjח?RKKa׮uuuenkk'?:ujJJ ?1)) 1Ylh_zjDI v!#Ȇ xkk YϞƶz:F4I2WA2@Pό^bx-h/B| 2_2t-$C ~8vre2$%E fELŋ..8niyj?yrvZ7q~= ~DaZt~Q6.k~,HMqΜ$w^#GOHW (#ԈSz٢EX 3~lyu_D8U>b/EwU!:,ee{ҴMs"T13^xK>L*Hd$DSQ Ka>'kI;D"QWt"е #ΚdSrݖo;%,!߯5sF/^Q\|¢رέN9CKqW ] pwu:"\&,4ihZk?h(hssٳg'%%577˜Eˡ1<Ε|V̬௕2"8SPdgW $$@z^fMիǶkU?rj+ 4t-$ d۷[8֭b6 VE}vtzDxaa uWaOOf;:zJQfff/KILLLMMMII399YX~X ZP iJe} *u1Z[:?22}P]iiCQtNvu/|c 8 ׼%_.7!\;RFƟL9sWW S>fHMer~v-SJQVřI޻nݹᯓ˫w1>dsquԨK4Q \ΝS~uǿyf-:SiV~=ʕ!C¸e⥃ߩX\z]WG$8uq~,B4Qzr4ȭZ~Ĉi/2̺hu{jZ) Ԁе0ȗ& |imAw1 ++wPS0 |iӹ{wܽ{K66o&_DG|i&]-oeOXKڵ붶h'/=h@ׯw% |IF,mmmRA %nm*bV $o>#$u3&~{0)>;Z)UA& D ޵bqLʭ[JP-,zx 8r4kAn@(wuV / - TV &H?5"?dV<_?ʌXn*2"&fd$rǬ؋_z^ Y0Y!aa q;?hVa/ -"BV(tup̖JG:R(++1 -|}#3 BRVHq}իdyaH  +V^b1^%|Ihn".ıYTTUU7vX,bV.Ĭc^d(gD ۱uŁ*-n;7 N DyʀXMqh !Y%V1>?Mq־K baaI&%pU>zk!BT_Y kd`D8xpc_ _f))x+2xWHf;^.Al6ܳgQ_<|d[}a/PSj%UŅ=ɒ vA$ML:ąp,ei# 3X?bu_倒̊?`lu:`󷅭m?u;APdYYlWɶI;6,._R[[*%N[w{):HQ%{Ǝ/>'Xvذ( +ZnBA/MGGN7ҹcGt~Ti.e{zq#䫤B\go{KɓG,1t-P 3Ϙѷ 05ȗ&CYFLhZ,0 6n<~UD*pvuK޾wAAkaںpcƒB $Q\|^^ˌr<#yqD'h?.z4r'!GR-N x&(>^p8+pѢd(311U/M333ss D6f–~]&?ܳg۱R ] l;[`11dBd~8į^^l_?^w[ZMZ)J,ਕ]ե>}ȑ#*s T?/iB$'[,XDXXX{X+F"/_-`_n¬%ץ5W $Y)PN~wTYZjEQE!3HGߟ:u Bƺkxeض-/#" K&/-50bEx-Kdk٩"/h E4 G”,ۻ`Ճ i!Z͉ 9a2bH 55ۺQ&R?Br, 32!*B4])J0#&VđPAc~q^ngdH Nd-xpŷX&ϟ %zY$PFjgcekvϿ7>hkU,w(_44To^…Sa"}i+>}?gp9 EcDX̣( 89 -qwФ'OZjj:/!еZGߴUeƶFpeR\0з߾wdԩ^ӦpS7oΆ&'^""LL̹!cn]__ =B>eכodJVp =vA 49Lo1o\@ >Ӣ"PC(ڵ66΃W6z@ґ{DWWt&Z2QfDIJ~ʀ8X: <8ToεJC_޹s_ڪAAttꙡF[>me H /0*(P~ ŷ˶ֳ-ګI‚]=O)|B镭Wٱi{Fa`˚RSS2hгڪA(f.Ν[__" T|iҌ3N$:41J5LO(gwիaac[% Yj#rȗs}ܸ3id-և 8HZ|iwo@01J=r䔔|[G,, [쯳gFС/^,++sFhN1CBcooH]j3d+WNˢ_P Rw/ AddO?/3Ը̙K^”!Y%!0!|҄ "Fu{'OZ~`mjO$K]C$$gh":xyz5],/󧙗4i&8ХꞋ Y[ ɗd1c]F СK_%DGLB;TUUjY֭;s֭\\&|IHg޽ߐ/=֭v*ǣ|Z&[pv9s.EE?zxjFMnwn쥑QKBBdde>di/$4ܾ}i& 9,5%>>EG/94A+4R+?rm`"KBP(7.T ws4Y_9v,AE_FGG)G Ѯ,(Pts?dRfQQmRRѣ,YX;E$ꫯȗT__Pek|u@S+_5٥==f f OL  $_O133xrڻm8h͜I;Y+FDJHgy䤤VVffn  }}%'$jf!"?**ANG~+*Vޯ!*o?URd}>c[~R'5+럽{o+ï>:>~\vv6#|K ٳg k_0)\JII >L`Ъ;))͏QG֐h߮}*Tvann͖_1!;t̋66B_$bff;HQK vؑ6 R'c9JDE۷\)4hPe*R#]x+,,d)P/[}CB-1!;^$\/THMM׿w^;99+ oL￿X^.<Co>4? L8ՕXPPpʕGFF*D!@uu~>~^防T@:]uN޽/y&^Ξ=T[WW|!gGܹH4EH'EvfemfHEș8Q&Lnq(%kDӣ/R$KB$UFڌ._~W_}U I@x`A~<pjXDIw36Dw!YH؀gR mJUp G}̊mq*k 'K{C'|iܰvWD*fɒG>c-UӴ >z=N(}Qw8Fim@ b48x_&Xd.; lg-|-j6w+PaD.RAh/ ۷lnnVUbUO|BEy:qbsl,Tg5N;{lͿ!^@s]`ff|[ii?n&˜1qwD2ޭi|M(s֬YaHt_HA$3)ٸAwow>;F|r.`xɲcB4tM×QGjȴo̘1C[- ZJBB1 "QˇelAUQQY(¢s͗BO쀐/;::mwU…Z .[Evږ:=" >L"Oaa6m@2 B:I:G9273T bP kߚV,gΜ/'Yv4' D &{uʝEW.Y-ʋ7d2ǃ,zNcrZ&hx#]vWP ,ܳg.Kyh'{wψ [+IeeѳwVa^^SBCװ9jԛNN7o\9uRVVf^wPcfփ?sV,>c>V|zņ9%;X8mOWsT)%drӉ #4%|2Ky);a{Fqm7 ]wގ?v츤;Np=:w ;vls_"75cbC$Z̩Y"[Ý/fge OP뽶eGտo vS/H>,!K UV;m N(ȑ#:R̴HLG^m LNJoj=Xй/OfIF{CuD%VD{=SOspc@a[Yɵ6^s,y~L_8{Yzӹ6߳ ȴz{{]622nz a"ȷ"ݹsgl޼y$K@du 5rCjbqp_F#7t H(Mh9qᜩPU[% FQ=/$&&Ci~wygq,;>z>ɬTfl+x+KYQ3ňk^,_:Z {cB, {y"Jej'Lk 'Kł*b}0څsܿ!ަ&TJK˯U͝] rVO?3Ҹй/= E֞ytdKܗOnsvfuqreѣu}/PLIIP(6OOO|^Ô\?$'Y:C,cJkVͿZ YBJ{ aG6Gf) 8!Ydw榿^Rh ooSN;w4mm=´E.M, rbiw4}šV MlH^Y`Vͩ*KF#?];? ZT(j#\:,AjGCdRlaٷo .xnuyy{X78N>/lL@3z Ȁpņs+ 97?ǮUF>e6 ؙb!NQ[[4wn`k~wkjtiG}H΁@rx @ɽD47*F)SDWXY| KL~֌YY Oe팂|T-9# Yd9eʧ?ؾ}xyyisvv1, KkSUuQ f 8q+&[liutU<*<0nzZd5Ddz6S2W 7޹s--m5U ~s+`ѐK0jk;0 :| D`g..Eb!KDcGdgY]aH1̊'Nu+/6Vl:d"6~ {qM8>th:w+7/]]V}S ?iz/.>ZVeifփ)%ʸItnȗAha~E.4A{ Kmdk)l5VCd)n,—2#C[Hhj6gDe+lIwĊS/nHčd*qq99!w#HAj]z/ &FZP\95L$=='}M+*2'tN# ͪ|@",1*Th7vwDHAݻ!OXՁu6)6`^GQxw4>֤ _M 6L ^BfgE 6HI]--q0uꧬEܙ"EDUY'ܹÇ/,+-,idA$B@/=-񬿓/sraDxOh%A7YkeevIIH9"OE9P)7,m)K[YI+diʐ/ 0 cރE(,< ?D m"dHAfĈkt=qb%C!ܹgkqL~Wנ>}p#Ξ3 RJCu00گcQ KDJceM%Abq ]6=N*QĉE.@ąE:TbAxD'QùScƬUSS- .o3.$k(߿Ϳ4ȗAh6=v`g}|b<='pa @^Rrꢗ ȏ-G},("yǯ 9+ ]_/B8eʧHǏ@IG}13boP/ _l'%-U^vQApvuLʔS !_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA.=mBf'KK 333Cׂ ӳͪU4t-:?6t0_<IENDB`ndoutils-1.4b9/docs/docbook/images/fig4.png0000644000175100017510000005722711253216103020731 0ustar baeckerhbaeckerhPNG  IHDR6;^^IDATx XU׹ `D#8D$WC$ Qbhb%D{HF+QohqX{A!bhHcQ4 18Dr3Cمaiii~X1cԩӂ F|ӦM;x𠺡(fΜ}*O7n?[Ȓ˗@Ncɕ&{t;6..(dqׯ˥Y`Dᵒ $ZTf@\.y|ᕡ!ތx6 "">/ۑ6 r>}` "@ lݙ$Ɉx~}eff"F}u>ސR,? vL͊ėhnذ=͍2fs&xBiiu~WZxzyUP_rEh/ 9кyXrcǎ'OƃE!E~o>iFFRGAλd1r*"(,,֭[ӧcvn: DTqljsKyx0 W]]3 HRKUռoKM6qqqX]p!䈊/rHj"?&|쥡עރˢGՋmHc 7^jlڴ ?\2h6X=44T oƳɂ!LJ:G>,'zFTX ]ua)[U6 @mUVd7gϖXjdp0b̙آI¹ wRSSg͚ Hv7[  |n/{$vevyҤI9n>vܐ.Aby `֭[z.ٛ;}G#)Dh'KL[D8벬^(!$$bYz= $^%w-xAI/" 1*p,@uGy0@${πV/  E‹BT^]6(P;K]5Cߏ"'"+Q(Ν;~z^~{QhT'R gϞia}ݧ6AŇN^Fbt(I!2Iڌ\ \"7ٿ?V%%%aҥKúrΝނ#F-"YN@$ qݻOYi`,ciӦi嚥6n ,~-*2SDp`ԁS KD.Z^/) =zT 0|)FÍ%؈S%ODj_(}P^rEDW $q)}Q-(a 2GW%AUIf=JD=9yaԦ16l%#Af͚%e/ׯR@ػwǰ P[5"#Ǵ9e{ EҪiӦ[GZ_͕rGO^"֣G|8Ld`%[ŵHR\9x4 q]A\>\OF,YdƌZg #6_sE5jdx xgyEDZ‚QX.#!iXQ]G [)lD ٞaUwv 7lGj+* m>BNZeVv8K #պAu !B̄ZB!fB-B!3!BPB!LEMIIɋSܹc!ܗzl+SoxͻC-Bmrrr;󟋨PR xvGvOw~wZ<4GmͶ˹pZY N=M!B̄ZB!fB-B!3!BPB!LE!b&"B1jB! !B̄ZB!fB-B!3!BPB!LE!b&"ْo~WѲy4QO|vmUk!nKݽ;뙒lt=8!&_>_xNQ':w&&Kk!nKݽ;ӎ$\6{I]a)jBd)r\k0LB܍xw6 $!]cvӷ6\+WoXo_0@l6kwAtz&@I݉a#ߝZSN;)c8@޿ }Ƅ~}Ol/<]eYdȎ,ۏJ17,~@0%q{vGPNʦG;u !nŸ/ړ C Jݑ>re^~{雇{<;䘲+ij_T2V977% ,?G.=:?~N.)Ao(@آ'mwݩOEq C[#;C^w9}zq6߼K^B~$Z5Cl3u%3#j{ Af7*جiÖ͛}eQaO@-Bx=B"S]QB T׮߬P}P) *QS[>:rih,#^ɠ[A;!ؾ}{S6"PF9קoL{$6J/u.'Ft e\i~dYki2TR-bccXm|w<jB܈?'2PW9/V?`,{!71/}d2ɽ?(1%Yꕫ7)((xg/]sݱ(|w<jB܋rpR7xg}z ؗ>GH\dJF e#F+׼w-8ƍg̘ѰaÜ .d[ZDP^:%ڢcu^X.|M!'vE7 6GmIj"\oY+1" R{GJ PQQy氰;wAb υZ_0\2GC3U~I= l/>SGI ղ S5>?5s/Ft DB,}ڱ8CIIILLLAA3-[Wu@ xݩkE1U(g8F?ĵ;nnZW7luhXu2Q}N.B>|۷zɓ'׿u4Os"x0y0\I5L?fEk&$$n:333,,ls ZfPTHέwBmq<+!G9DEEhljZ'5'"@-B!)Lw! !Yty`͛7{qgE!111ZBm222۷oܹsȑfCjB!6]vmfE!|Ͷx9"B DHC-B!ڵkڴit! !J^ze˖nݺ">!_<66OMMgE!ħ),,9r3g,Yd9!e׮]'Nlذ;d!> !(AdΝ;v4PbٟdzVT\v-k1grf[sԵǽ;7;"&&&M6f[Q=׿ul EAA>{ҥ:rwCwZEFFmE ۱c_{5m!nƍg̘Ѱa> :Nj՞s!{@0ve˖eddxV***W^ ͺsΠ -"PU̚5k͚5o&SVV=qTV-"PUhb(l 9t&t /`9!HHHIIIom!DrrrAjB؝;w.[EfCL"S! :ujzzʕ+9RRR2a:Z/$::Um۶%''Arss~m:Z䥗^y뭷Xk׮MHHhݺuff&$R5"x'C Aij*jߡ"..nQQQ"!މ/1=JJJbbb f̘l2Ze񉉉"^ry뭷&Ol9TjBT9wCP̚5 ZdiiifB\Oyy3 B<jBN(/_ΡӧOAx:"x9χYv-=&222۷oܹsȑfCH! ZfͬY؆,]t޼yv'E~Ν3ϠͱF<򸸸lq"x?C A^2e < 7MPL6M=oBPL2^CeŘ'BPg?KNNʊ6,山bESRR|MjOpȑgΜYdIRRRWP+hB?>ݟ]vM8aÆ.g" !>EzUVm qK/;ɸsΎ;m!u !>ʶXh${(A"/bzzu-Zd-DoB-BoE=s+ B|jB| <3ow***W^MPsK֬YCiH|jB|)S$&&"&q3f4l0'''22ls1 jB|????A$,,lΝAAAf[DP̚5k͚5/NKK3B ʯ!GiѢŐ!C222P4rܳz"XC-B2+Wf]6!!!zE]BCC  zrr2{ ꔊ͛7GEEA!="4/8YRRRSPP0cƌe˖QbZfȐ!aaaڔ)SXFÇ}6ɓ6wZ_KHH8ֈ֭[gffBm!n !Δ)S^{djBBZ_??fϞˏ;\D"mܸqoA-R{222y:<"qdHW_}׆KΛ7/88x֭t!IE!-qF{V3 -"c!Tұc5k̚5111sTO"%%%/Osنx?s_J~i 9sPߺu+ٶxAdΝ#G4B<O"999ڝEmdz;ҷSa~_ IȮ]BCC6SxiښmsҳfA <3[l UBB\kB2dH֭7l@-qA@-B/rBBBFF ÚO=v8qbÆ BK!|)S,\7,//_jUAAAllF/ҲeBCC!D8 !.Z=ܹӥK}dKf5M8,;pSSS B!knܸ믿6pȑgΜYdIRRUPB*2dJ\]odeeEGG(w}rE!H.SL2ѣG:tH&CBjB?/EٶFrrw}=z'N!u !{Ϙ1Eli ,`ҥK/ :RPBL1Թ/36JBBe Km۶g;mdh ^(+ɱ={>~!S@4lʙ3 iW^ђ?Ogy~~hx枟3繈"ǛC =Mۿuqƙm !>3#=i0ӎ@=,=K<c )rdWԾ8BDDx"_4KۉI~?qqR!@; &Wq~{4 {hqSR0?r֐+ӧg;~`:!vÖWAa`!U3';(BD]L Q_fMld+æ c1~~~׮*+٢EcmqG:C>:Ee{><}"S]$vS MoVBcx{_-wBP9-1ˈWMv 9\q! ν/իW AAA/;Gyf-8vHQQw_m!ķӎ7#v`̓+]kW 5K?IdY~ ?4H`@þ}d$.رchhh]@\N@Og͊d غgϜf[CA-R F˞S;es V=ꀬ?}.]*Xr+ Kߨ-w=S ?(1%rE?'OmxsSYY ?~=m}|""Ϗ葸"?=/đe#NZo$-,DGGjyy&~իՑ#ݻw +8{qܹ>}"۵/}:mڞCֻnoO5ks?:z8?\8~;s-$נ-h" CmQ7 :}t/,\Y\PB]}MC6QwRƼ E,v)W QF#--%O>qDjj]v cw=}+%8F| ed|}~ժ?^|GKv y>蜺ɆG\jӦYvPTja(kVn|x*|/3uT4Z}}c+Xg'>"q.~>ňiK߰vZ- ҤH 5򃞰fooO= 2Q"J4]}8p&8vӧ]6suQRr-?RQ翅 ޽% /Dk)SիoQwI'{pЃtj*`x:q~xxwܴүnKJ:0ujXqq u1f靗;jY{fs~IK ]7Ы؎ׯ.RTTTdgg?//[6 yj@^,Z_Fg̙;?ԻwjPoǥމeUes?BƆBqFzR .?ԩS.]ܬY?BsEQ3OX,D3u d4 F\ϿǧO۰<($yxxg55D;\ 1W2`@p>^|͛G9/1%pȑ;w^N:M>A' {w V Z=,xGBBBܳݼc\w̅Pz/CJKK{XZnݩSM6jw%PR= K<<_~avZĪR2{X̅jBj=a;M oE8< :XzX,byj!Nn 4{XC-BHb6;;=aca ѣDTTZxٟOms#Ͷ{ {>̵+W7nw|>E1sa)..>sÂ{X7Z$&&M6f[m76݂l'-;4Ɣ;2uԧ~Zzj4]`E\ >,x=EU(d޽{Xb֬YyڵkG}S=,}wܱaW=,2J{XoZ_ [RRO؂k( 7o̺u (++S*8{ԧOaQӿB4jB<qp60{(@ٺu+)6sL} "ӿ*"򚥵QFfS=ѬΞ=9~xx8*fX p7nܡC^^^^DD3?Ce3nݺz9s ҷ~1qmylqvϞ=}]zuj !W?^G, ˎcBjF7nܩS/_ܿ6a"E9;w޽{Q(ǣ.oOKKSoŊnUȡٶmۺu4Kܽ{w.3o<$کS>}HO>zL]jU@@$ߋ;i<([aFխTɟ/4xwM2w;?3Ξ=׹sgC/${Xq!.Aq偫-`0Çe;DÆ C&.`/J;sw$PDƍc9$$W=ztϞ=333oon+ǿ\ѣGC)͛7Y\ފ6nzРA ;zt)y ڵo߾;wBy!ĵ8"(\b]&qCիWm\+QlƷw!FkO)--A:yd)\-ZE;2#@R^z%KӦG,__8ӧ/Bd֭bۜ9sDNW`-SqwSTTt>|8) pBc}"'ѡV>}Z-C|d{B[P'^nR&a%SukH(9P4J,Z .i@ӻwo 9Tmۤ7ߠ.RIcTQZk67ei&q46S j }F eBDYbA@_~"Ua-J4[N iQ4wH.D)X!~_W6&$$Hk/iE!BαL˱EP/!1R pBR@+dffBgHY " ӫW\bRK) |@-yy-ŋرc! %gMpD՞ZG*wAomo'A YҳgOZ֭[n8jt!xwpyǪ ~It&օ&@Y4$(*F,XONho***Afخ %A=HRdee)UiQ.D {mׇpޱzyǪE39PPg5]׃ԃ,j1i={1zL> HOjjjG\N͂k[/d՚5"X$$Ԏ;)DPDڨQ#;hӧ"ݴiStta;ηXs<JW4KA5g̘텅߻g4OSRr'.W9'fvo"7oGTm+G( fRqiD;vl\\ɓ'ՠG(Ƥ]ksڷZP>Q2G.ZlT1bz|BBBbqDuzDXDpB ӧOw>.eСCQ98֭V}Ūɠl{* tѢEΞd:%K@-]=޸zS_vr9o3zt疕;6fZDߋkTC@ ,X 99yڴi  *84J(%/\Pe,/zA 44 JDՀ]+V%;uK>!NH쬙\Q%$8+*Rhȸq7ydV)0IGQN\ eeei!ϤI=DO@^,Ztp#mעEg]r  ZD:5MWF[E600o߾%Dѣj8LJ, LEz$Fe3 '.9J\ Bܢ?`\JCǫºuƎЏB3g$emذA?!RII5֙Wz5j}C]xiӦ"z#m^Lh+//6ljԨQvnݚ4ix6LA >֭vpS_i\\e]ZJeՃs׳g, 5zt|el#5Q =A6]{a,/Z"Gβ8͑-}le՝GuK?.eF|L-Ppp o`WGx`@ǫ gRptXGX9s&"8=fYoџn3AlFy@ @a@@^3f{Nav̙7oV(́+nk/GΝٴ͢Zڋ_NN\dd[{Qt W~o}{e"`:wR!N"=~+YԆ @rrJc޼y1#yV#̱ekLr v"'Wi1D\`Ǯf 2.MNp|4S ]?8Y\#Fj@RR'h# pGwٺ5{5Pzד&K *sK:q> 4fM(E KErXJJNDD Ν2kV$Ϊ! YիQ=Ȇ DZ.]s?\K.UYd6SڕϞ=;lX @6k'"fllx%dшSVVց>]&~'N\8z rA@̙$55D:V9Tj#ׯ=| X;?%EaCBĉݶ?q!6d)}&҇Cj'DOs& Pۧ`:6mڈ… !G:t ݻwsQgmf%nz U+ kS[,FI-b&^zG233 dː!C~k 6$rndW c90)Ҥ!&8GJ քVذa@` ~)7oVhNTXׯW򪉌 W}+P>8m䤥l~CmNV皥1q:3ҥK˖MFٕ{DWj(;r||<ӧoذ!//e }ZOuY 3))C{) RSSe.hҥF(ԥvUk( 'ǽD/:e 2t|+‘v"Hfo6'm6 si>5d6eeeؑ͜GE!8#˧KDa)pR5pW9IDQm9ֻѣ_@:hS)ݶԋ*OC9j Y-*[V~7j˭[,*GF;s{WشV9A(Lcȶݻ4>}3wn&KɎC&NꈑD!vvMދB%ثg8E$m 6} Pl2??_ߧ7!fPW/ςvwPl5y">>^i&= RեQ98lA?}t遒K3'xm޽d[hEBn݊_WSN &mZD|>|Xi&ς@)u1:E1i$q>C VXO|5 D)Ql0ܹs2ω~bT\)TH@@L"f(լmN BdK.]~=Gxx 6ςaA ~NҾ}8Q\g*ުUZocڵ aaa;w By3ϴnݚCRi0y֬YP~K.co@-q9PЊ#e"ݻkߟ̵j22RiBjj*ݻvw1uaֶ۬2 S?gRXҕRyquw͛7oɒ%I3x`+WtjB TDEE۷Ozd egf$Ātj!8LiߟJrez,{łJtc\7xgܰN@]{,3dݺRRP֔8p]KLL'_)/YzO?z9qLJS!}-d˖11okZœOz8,uPP3GTTRvÇ;V2r_\Z1jBܔz=((()i>~Oٷ_r'ۇ? .\+(|GGF+D;7BA}79{G 'O,J$?nƝ:h$({6HǵkwN,o!A΄k׮W))̶bZw gAVΜ9YgΔ{o`F6mw:+"5dΝW.Cs@|}eI͚5ڵτ ]ڴiqi qEq/s| MXFsNv?]"Vd98Uv8jhOeY,7hРW>XPX!&B-BY:qxQb6cZw㻻'l 8Z%B'B-Bj|wBDE1N!!QGBgA-B9)Pb6;!?"7j|;w9ls!dEWa|wBq+E?s|wB1jB 5{FFFǎ6BjBꃕ+WΞ=w'C-BH#C|ߝB PRp|wBq !uEEEEll}8;!8Z:A>cƌUVm!/"gyB3Pb8;!T jB\ w'B-B>| !:P8;! jB\w'C-^?Ν;f}))]w'@-^hwJ?a!^NH- !P6Q[r.\Vzp|wB="N!Zj !ąPR=8;!jBw'C-Bp|wB Eq N!u!U !! 8;!)"8Bw RPb^ziٲeߝBjBl !~!Ĉ}ĉ#"RP=ˇ !~!p|wBE|%_e&-h62=ڪ!2SP㻿['O6BE|jsgv8>1Թ/36JBBe OaaO>ymN! Oѐ)gΤ. 3]s7ד=e|wN!& 1`Wް޾aցv@M.ddd=aÆyyyߝBjSN;)c8@޿ }Ƅ~}Ol/<]eYH9?'v /"ۧ$N!C-@F|ўON}PT~WiGxoy1hM9+ij_ !"DNM/D|PFKSp8A [+u w'wZħ m )w9}zq6K /An1ly%Z5~"DeΤޏ Љ^MllִaM־2lꨰl9qD[b:"|x qE~Hz?A:߬P}P h^T|=:? A}tHh,#^7}-sŵ}w'wZTptiG?;KzI蕈Yӆ奈yW{,Zn\?rs"PmO:꺃_6g@1h_ޣҥ{!71/}S[LWMĔLȑ+WoԏyK(!"rpRsxg}z EE#qE&~"2 *z^#D.(F8?7*\߸I!jRIP[TbN %iTlW_,}`#1;#E-b%FD]U2kB!fA-ׯFfˆ~f_vzxχ[2SGIE7־2Luvz-by_uB,}՛*!ZG`臇W{M+f.7wBѫ'wBEH|Ĕ̃OڈU ͶBGB-B͠[xFB!"&@yvv_B!> !B̄ZB!fB-B!3!BPB!LE!b&"B1jB! !B̄ZB!fB-B!3!BPB!LE!b&"nO2l++W=mB*q/bbbڴic>App&BZĽ󋌌4 B!!BPB!L|H={͛7Сٶ@YYY-=qDVVVDDDppü=zX? HCaA=uTxxxnp.` oݺu}V !iiӦ|ɒ%t޼yFbf.=zŪȗ wxl4K|'ƍ2\nH%ϝ;*!x>E\Uf[Q=PzO4I ȅKb^DDD^^])k)G:wpEjm0\^XX\ٳf+V4nޚ6mBCCBDdsBjJPl7QVVv 7oDYe]NHu tz{pppF[0JKK׭[Qb5..Q6lP)vH-,WVf/ſwEL>‡ 54tAHbm@@Ro6];3w\,ϙ3ol^ !xEPq? UVӧ*ƌ겴`ׂ FCO4 e*HԛUq8Q'{FP DPH3u9qleŊE7D!^jRBC% ?wv;6222>>*(P@ܸqcR`iӦ(?PDIJJB-NٳR"DKq"j'JW YW^7d3>j%%`ѣr!Ui.*Jag~PcI.]t*~n$j(Q "GNY@PHL؋sٳ%{Q єC 8hVVX!TAn sSSSq墰 ڳ Yڢp… ˔ܠ &x1!>E4K+EEE(5"ǧ=P' ܽ{ R޳VP_.)k̔ '_g%ZGQVVAa:B;yd>y+ +e=Ҿ" z;Y$c]vŒիWKC(9ow ! i`ٳKWk-"]-IIIRϛ7|мysCjnn… P6Ǽ>}ztfmⳒǢED赈R vIYfɰ%H 0i1 5z3(Jn{_'YtRD*FQ/uDavʗ5O<ݻwڴi9H! D|/ -)))hD r5lZwXX\t5!/4K]cǎ]bE~~>*j EFjY,B -K|͡Y*(`LVVW6~Cmرc.8zh;lذ3gjw=-T,N)SLEJNgղD\^^98;VZ RB>EluܸqRngQ-_|֬Y(d8WҀ]@%^h}v0ŅSO*9fY~b!PkcKskůVKP|J# 餑 Q3]I[=[nWBP~-Ua7E=;)rk;!x >E6l *J 'Ȭ%M6Eq/PݻW ѨQ#J?~QQh0c {h}#|^!s۷N3:tE ԣGr֭[* aٳg֗1b e@'):~:Uܚ\ o"h9jw{=>({*}ćD2 ǰB|"RPhY׌YEư?( :{]3 c*#;:Xyu6xUW \{9NpB5|HB! !BPB!L?z IENDB`ndoutils-1.4b9/docs/html/0000755000175100017510000000000011253702164015443 5ustar baeckerhbaeckerhndoutils-1.4b9/docs/html/en-en/0000755000175100017510000000000011267536772016464 5ustar baeckerhbaeckerhndoutils-1.4b9/docs/html/en-en/intro.html0000644000175100017510000001407211267536772020511 0ustar baeckerhbaeckerh Introduction

Nagios

Introduction

Purpose

The NDOUTILS addon is designed to store all configuration and event data from Nagios in a database. Storing information from Nagios in a database will allow for quicker retrieval and processing of that data and will help serve as a foundation for the development of a new PHP-based web interface in future Nagios versions.

MySQL databases are currently supported by the addon. Other databases will be supported in the next versions.

The development for this will start right after the next stable NDOUtils release (1.6).

Support for other database servers may be added if there is sufficient user interest and even more user who are interested in testing.

Design Overview

The NDOUTILS addon was designed to work for users who have:

  • Single Nagios installations

  • Multiple standalone or "vanilla" Nagios installations

  • Multiple Nagios installations in distributed, redundant, and/or fail over environments

Data from each Nagios process (hereafter referred to as "instances") can be stored either in the same database or different databases than data from other Nagios instances.

Figure 1.1. Possible Designs

Possible Designs

Although not yet supported, future development should allow for data from any given Nagios instance to be stored in multiple databases if desired.

Figure 1.2. Future development: One Instance, multiple databases

Future development: One Instance, multiple databases

Instances

Each Nagios process, whether it is a standalone monitoring server, or part of a distributed, redundant, or fail over monitoring setup, is referred to as an "instance". In order to maintain the integrity of stored data, each Nagios instance must be labeled with a unique identifier or name.

You can choose the name of each Nagios instance to suit your needs. For instance, you could choose to name Nagios instances based on their geographical location...

Figure 1.3. Instance names based on geographical locations

Instance names based on geographical locations

Or you could name Nagios instances based on their purpose...

Figure 1.4. Instance names based on their purpose

Instance names based on their purpose

How you name Nagios instances is up to you. The key point to remember is that each and every Nagios process must have its own unique instance name.

More information on how instance names come into play will be discussed in sections 3 and 4.

ndoutils-1.4b9/docs/html/en-en/ch04.html0000644000175100017510000000554711267536772020123 0ustar baeckerhbaeckerh Chapter 4. Installation
Nagios
ndoutils-1.4b9/docs/html/en-en/components.html0000644000175100017510000002065411267536772021546 0ustar baeckerhbaeckerh Components
Nagios

Components

Overview

There are four main components that make up the NDO utilities:

  1. NDOMOD Event Broker Module

  2. LOG2NDO Utility

  3. FILE2SOCK Utility

  4. NDO2DB Daemon

Each component is described in more detail on the following pages.

NDOMOD

The NDO utilities includes a Nagios event broker module (NDOMOD.O) that exports data from the Nagios daemon.

Assuming that Nagios has been compiled with the event broker enabled (this is the default), you can configure Nagios to load the NDOMOD module during runtime. Once the module has been loaded by the Nagios daemon, it can access all of the data and logic present in the running Nagios process.

Figure 2.1. Loaded NDOMOD Event broker Module

Loaded NDOMOD Event broker Module

The NDOMOD module has been designed to export configuration data, as well as information about various runtime events that occur in the monitoring process, from the Nagios daemon. The module can send this data to a standard file, a Unix domain socket, or a TCP socket.

Figure 2.2. NDOMOD Capabilities

NDOMOD Capabilities

The NDOMOD module writes data in a format that the NDO2DB daemon (described later) can understand.

If the NDOMOD module is writing its output to a file, you can configure it to periodically rotate and/or process the output file using a predefined Nagios command. This can be useful if you want to transfer the output file to another physical machine (using SSH, etc. ) and send its contents to the NDO2DB daemon using the FILE2SOCK utility (described later).

If the NDOMOD module is writing it output to a TCP or Unix domain socket, it has some resistance to connection dropouts. The module will attempt to cache its output until it can (re)connect to the socket for writing. This is helpful if the process that creates and listens on the socket needs to be restarted, etc.

LOG2NDO

The LOG2NDO utility has been designed to allow you to import historical Nagios and NetSaint log files into a database via the NDO2DB daemon (described later). The utility works by sending historical log file data to a standard file, a Unix domain socket, or a TCP socket in a format the NDO2DB daemon understands. The NDO2DB daemon can then be used to process that output and store the historical logfile information in a database.

Figure 2.3. LOG2NDO Utility

LOG2NDO Utility

FILE2SOCK

The FILE2SOCK utility is quite simple. Its reads input from a standard file (or STDIN) and writes all of that data to either a Unix domain socket or TCP socket. The data that is read is not processed in any way before it is sent to the socket.

Figure 2.4. FILE2SOCK Utility

FILE2SOCK Utility

This utility is useful if you are directing the output of the NDOMOD event broker module and/or LOG2NDO utility to a standard file. Once these components finish writing their output to a file, you can use the FILE2SOCK utility to send the contents of the file to the NDO2DB daemon's TCP or Unix domain socket.

NDO2DB

The NDO2DB utility is designed to take the data output from the NDOMOD and LOG2NDO components and store it in a MySQL or PostgreSQL database.

When it starts, the NDO2DB daemon creates either a TCP or Unix domain socket and waits for clients to connect. NDO2DB can run either as a standalone, multi-process daemon or under INETD (if using a TCP socket).

Figure 2.5. NDO2DB Daemon

NDO2DB Daemon

Multiple clients can connect to the NDO2DB daemon's socket and transmit data simultaneously. A seperate NDO2DB process is spawned to handle each new client that connects. Data is read from each client and stored in a user-specified database for later retrieval and processing.

Figure 2.6. NDO2DB with multiple Clients

NDO2DB with multiple Clients

The NDO2DB daemon currently supports only MySQL databases, but future support for PostgreSQL databases is planned.

ndoutils-1.4b9/docs/html/en-en/ch02.html0000644000175100017510000000477711267536772020125 0ustar baeckerhbaeckerh Chapter 2. Design en detail
Nagios

Chapter 2. Design en detail

ndoutils-1.4b9/docs/html/en-en/ch03.html0000644000175100017510000000467011267536772020116 0ustar baeckerhbaeckerh Chapter 3. Examples
Nagios
ndoutils-1.4b9/docs/html/en-en/ch01.html0000644000175100017510000000750111267536772020110 0ustar baeckerhbaeckerh Chapter 1. The Beginning
Nagios
ndoutils-1.4b9/docs/html/en-en/example-configs.html0000644000175100017510000002274011267536772022440 0ustar baeckerhbaeckerh Example Configurations
Nagios

Example Configurations

Single Server, Single Instance Setup

The easiest configuration occurs when you have a single Nagios instance running on your network. In this case, installing and configuring the various components of the NODUTILS addon is fairly straighforward.

The following diagram illustrates how the various components can fit together in a single server, single Nagios instance setup....

Figure 3.1. Single Server, Single Instance Setup

Single Server, Single Instance Setup

Here's a description of what's happening at each point in the diagram:

  1. The NDOMOD module is configured with an instance name of "default" since there is only one instance of Nagios that is running on the network.

  2. While the Nagios daemon is running and performing its usual business of monitoring the network, the NDOMOD module is sending configuration data and event information to the TCP or Unix domain socket that was created by the NDO2DB daemon.

  3. The NDO2DB daemon reads data that is coming into the socket from the NDOMOD module.

  4. The NDO2DB daemon processes and transforms data that has been received from the NDOMOD module.

  5. The processed data is stored in a database for later retrieval and processing.

This example assumes that:

  1. Nagios is configured to load the NDOMOD module at startup.

  2. The NDO2DB daemon (which is a seperate process from the Nagios daemon) is running.

Single Server, Multiple Instance Setup

Another simple configuration can be used when you have a multiple Nagios instances running on a single server. Installing and configuring the various components of the NODUTILS addon is similiar as to what was shown in the previous example.

The following diagram illustrates how the various components can fit together in a single server, multiple Nagios instance setup....

Figure 3.2. Single Server, Multiple Instance Setup

Single Server, Multiple Instance Setup

You'll notice that the diagram above is similiar to the one for the single-server, single instance configuration. The main difference is that there are now three (3) different Nagios daemons instead of just one.

  1. Each Nagios daemon loads the NODMOD module at startup with a unique instance name. In this example the instances are simply named "nagios1", "nagios2" and "nagios3".

  2. Each NDOMOD module sends configuration data and event information for its specific instance of the Nagios daemon to the TCP or Unix domain socket that was created by the NDO2DB daemon.

  3. The NDO2DB daemon reads data that is coming into the socket from the three NDOMOD modules.

  4. The NDO2DB daemon processes and transforms data that has been received from the NDOMOD modules.

  5. The processed data is stored in a database for later retrieval and processing. Data from each instance of Nagios is kept seperate (using the instance names as unique identifiers) in the database.

Single Server, Single Instance Log File Import

There are two reasons you'll probably want to import your Nagios log files into the same database that Nagios configuration and event data is stored in:

  1. Historical log file data isn't imported into the database by default and having a record of events that occurred before you implemented the NDOUTILS addon is probably desireable.

  2. The NDOMOD module is not able to process realtime log entries from the time right after the Nagios daemon starts to the time that the NDOMOD module is loaded by the Nagios daemon. This "blackout period" is unavoidable and causing log entries such as "Nagios 2.0 starting..." to be missed by the NDOMOD module. Thus, importing day-old Nagios log files on a daily basis (via a cron job) is recommended.

Figure 3.3. Single Server, Single Instance Log File Import

Single Server, Single Instance Log File Import

Here's a description of what's happening at each point in the diagram:

  1. Historical Nagios log files are read by the LOG2NDO utility.

  2. The LOG2NDO utility processes the contents of the log files and tags them with an instance name of "default". This instance name must match the same instance name used by the NDOMOD module in the Nagios daemon.

  3. Historical log file data is sent to the TCP or Unix domain socket in a format that the NDO2DB daemon can understand.

  4. The NDO2DB daemon reads the log file data from the Unix domain socket.

  5. The NDO2DB daemon processes the log file data.

  6. Historical log file data is stored in a database for later retrieval and processing. The NDO2DB daemon will perform some checks to make sure it doesn't re-import duplicate historical log entries, so running the LOG2NDO utility on the same historical log file multiple times shouldn't have any negative side effects.

That's it! Pretty simple.

ndoutils-1.4b9/docs/html/en-en/index.html0000644000175100017510000002220211267536772020457 0ustar baeckerhbaeckerh NDOUtils Documentation
Nagios

NDOUtils Documentation

Version 1.4

NDOUtils Developer Team

NDOUtils is licensed under the terms of the GNU General Public License Version 2 as published by the Free Software Foundation. This gives you legal permission to copy, distribute and/or modify NDOUtils under certain conditions. Read the 'LICENSE' file in the NDOUtils distribution or read the online version of the license for more details.

NDOUtils is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.

Nagios and the Nagios logo are registered trademarks of Ethan Galstad. All other trademarks, servicemarks, registered trademarks, and registered servicemarks mentioned herein may be the property of their respective owner(s). The information contained herein is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.

09/04/2009

Revision History
Revision 0.1 2009-09-04
First DocBook Release

ndoutils-1.4b9/docs/html/en-en/installation.html0000644000175100017510000003323011267536772022054 0ustar baeckerhbaeckerh Installation
Nagios

Installation

Prerequisites

In order to use the NDOUtils addon you'll need to have the following installed and working on your system:

  • Nagios (see below for versions)

  • MySQL

Version Compatibility

In order to use the NDOUtils addon, you'll need to be running at least Nagios 2.0 (stable). NDOUtils will not work with beta releases of Nagios 2.0. NDOUtils also works with updates to the Nagios 2.x branch, and the current Nagios 3 branch since b6 stage.

Obtaining New Versions

You can always obtain the latest version of the NDOUtils addon by visiting the Nagios download site at:

http://www.nagios.org/download/

Bugs are bound to be present in this daemon and updates are always being made to Nagios, so its important that you stay up to date with the latest version of NDOUtils that works with the version of Nagios you have.

Compiling

Compiling should be easy as pie.

If you haven't already, unpack the NDOUtils tarball:

tar xzvf ndoutils-1.4b9.tar.gz

Change to the ndoutils-<version> directory that has been created and run the configure script:

cd ndoutils-1.4b9/
./configure

Compile the components of the addon with the following command:

make

Installation

Since NDOUtils 1.4b9 you are able to install NDOUtils like your Nagios using a simple make target.

During this step all necessary binaries will be copied to your --prefix path, especially to your --bindir which you specified during the configure.

To use with a Nagios 3.x Installation

Since NDOUtils 1.4b9 you are able to run

make install

direct after make.

This will install the different binary files which belongs to the NDOUtils Project to your specified path (--prefix or --binddir).

[Note] Note

make install will install ndomod and ndo2db for a Nagios 3.x installation per default.

If you would install NDOUtils for a Nagios 2.x Version, read Section 1.5.2

To use with a Nagios 2.x Installation

[Note] Note

make install-2x will install ndomod and ndo2db for a Nagios 2.x installation.

If you would install NDOUtils for a Nagios 3.x Version, read Section 1.5.1

That's it! Now its time to configure everything...

Initializing the database

Currently, the NDOUtils addon only supports MySQL as a database backed. Support for PostgresQL will likely be added in the future.

[Note] Note

If you aren't already using it, I would suggest installing phpMyAdmin (http://www.phpmyadmin.net) to help manage your MySQL server and databases.

  1. First, you'll need to create a new database called "nagios", or whatever you'd like.

  2. Next, add a user that as SELECT, INSERT, UPDATE, and DELETE privileges on the database you just created. Keep this information handy, as you'll need it when you configure things.

  3. Finally, run the installation script to create the database tables necessary to hold the data the NDO2DB daemon. The script for doing this (installdb) can be found in the db/ subdirectory of the NDOUtils distribution.

    cd db/
    ./installdb

Configuration

Its time to configure the NDOUtils addon components. Sample config files are included in the config/ subdirectory of the NDOUtils distribution.

  1. First, add the following entry to your main Nagios configuration file (usually /usr/local/nagios/etc/nagios.cfg):

    broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg
  2. Next, install the sample NDOUilts config files:

    make install-config

    This will install the distribution configuration files to your sysconfdir (usually /usr/local/nagios/etc/) as <filename>-sample.cfg.

    This will prevent to overwrite your personal changes. After adapting your personal changes to the newly created config files and rename them:

    mv /usr/local/nagios/etc/ndomod-sample.cfg /usr/local/nagios/etc/ndomod.cfg
    mv /usr/local/nagios/etc/ndo2db-sample.cfg /usr/local/nagios/etc/ndo2db.cfg
  3. Edit the ndomod.cfg and ndo2db.cfg config files to match your setup. You'll need to specify things like the database name, prefix, username/password, etc.

  4. Make sure the following entry appears in your main Nagios configuration file (nagios.cfg).

    If you don't specify this option, Nagios may not pass any data to the addon for storage in the database.

    event_broker_options=-1
[Tip] Tip

To save some overall performance, you should think about which data you really need from the NDOUtils.

Nagios itself produces a lot of timed event data which represents the nagios internal scheduling queue. You can safe yourself some trouble if you unregister your ndomod.o from this events.

Just configure a less greedy ndo broker option like this:

data_processing_options=1048573

Getting things running

Once things are configured, you can start things running.

  1. Start the NDO2DB daemon:

    /usr/local/nagios/bin/ndo2db -c /usr/local/nagios/etc/ndo2db.cfg

    or just use the init script by execute:

    /etc/init.d/ndo2db start
  2. Check the system logs and make sure the daemon started up okay

  3. Start Nagios if its not running.

    /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
    [Note] Note

    If Nagios is already running, restart it by sending a SIGHUP signal or using the Nagios web interface.

  4. Check the Nagios logs to make sure it started okay.

    You should see some log entries that say the ndomod.o module was loaded successfully and connected to the data sink.

    If the ndomod.o module didn't appear to load, check your Nagios config files to make sure you added the appropriate broker module entries to your main config file.

    If there are errors connecting to the data sink, make sure the NDO2DB daemon is running.

  5. Check the system logs to make sure the NDO2DB daemon is working okay.

    You should see some log entries telling you that a connection was received (by the ndomod.o module loaded by Nagios) and a connection to the database was successfully make.

    If there are errors, make sure you specified the appropriate database, username, password, and table prefix in your ndo2db.cfg config file.

    If there are errors relating to being unable to run a specific MySQL query, chances are that you either didn't create the appropriate database tables (outlined above in the configuration section) or your ndo2db.cfg config file entries don't match your setup.

    You'll need to restart the NDO2DB daemon if you make changes to the config file.

That's it - data from Nagios should now be getting stored in database!

ndoutils-1.4b9/docs/html/en-en/whatsnew.html0000644000175100017510000004643111267536772021222 0ustar baeckerhbaeckerh What's new in NDOUtils
Nagios

What's new in NDOUtils

NDOUtils 1.4b9 - 10/16/2009

[Note] Note

Requires Nagios 2.7 or higher,

or Nagios 3.0b6 or higher

  • Improved writes from file2sock to ndo2db by matching buffer sizes (Opsera Ltd)

  • Add in 4 missing tables from clearout process during prelaunch (Opsera Ltd)

  • Fix for Solaris 10 which gets an EINTR on accept for the 2nd file2sock call (Opsera Ltd)

  • Fix for not retrying read on 'EAGAIN' and 'EINTR' soft errors (Opsera Ltd)

  • Improve error info by showing failed MySQL query in syslog (Opsera Ltd)

  • Move database connections/disconnections syslog detail to DEBUG from INFO (Opsera Ltd)

  • Allow external commands table to be trimmed with a specific time limit (Opsera Ltd)

  • Support SSL encryption between the communication partners

  • Support for long performance data

  • Added installation procedure with "make install" or "make fullinstall"

  • Fix missing output fields in hostcheck and servicecheck tables

  • Workaround small NDOMOD Buffers to handle more than 4k chars (tracker id 21)

  • Fix unescape of strings containing tabstops

NDOUtils 1.4b8 - 07/16/2009

[Note] Note

Requires Nagios 2.7 or higher,

or Nagios 3.0b6 or higher

  • Added additional error messages during failed startup

  • Better MySQL library detection (Ton Voon, Herbert Straub and Nagios Plugin Team)

  • Removed Postgres options from configure script, as it is not yet supported

  • Compiler flag fix for building on GNU/kFreeBSD systems (Hendrik Frenzel)

  • Added lock_file option

  • Fix debug file permission race (Lars Michelsen)

  • More error reporting if debug file can not be opened

  • Fix wait for childs on SIGCHLD

  • Added long_output support

  • Fix missing SIGTERM forwarding to childs

  • Fix fmt specifier in ndo2db_daemonize()

  • Escape custom values in 'customvariablestatus' and 'customvariables'

  • Fix ndomod doesn't execute rotate_command properly

  • Fix several compiler warnings

  • Rewrite ndo2db_init_script, install it with 'make install-init'

NDOUtils 1.4b7 - 10/31/2007

[Note] Note

Requires Nagios 2.7 or higher,

or Nagios 3.0b6 or higher

  • Makefile fixes for compilation flags

  • Fix for bug where service check table always had same start/end time

  • Added sample init script for SLES (Bruno Quintais)

  • Added --with-ndo2db-user and --with-ndo2db-group configure script options

  • Fix for configfilevariables table not holding multiple entries for various variables

  • Changed/added indexes on various DB tables

  • Added some very basic debug file capabilities (not complete yet)

  • Fix for handling (backwards) system time changes

  • Fix for missing SUN_LEN definition and strtof() functions on Solaris 8 (Christian Masopust)

  • Fix for segfault when importing duplicate log file entries (Hendrik Frenzel)

  • Updated to support latest Nagios 3.x code (3.0b6)

NDOUtils 1.4b6 - 09/27/2007

[Note] Note

Requires Nagios 2.7 or higher,

or Nagios 3.0b4 or higher

  • Updated to support latest Nagios 3.x code (3.0b4)

  • Added source OpenOffice docs in addition to PDFs

  • Fix for segfault while processing host status/event information

NDOUtils 1.4b5 - 08/29/2007

[Note] Note

Requires Nagios 2.7 or higher,

or Nagios 3.0b2 or higher

  • Reintroduced contactgroup associations with host, service, and escalation definitions

  • Adjustments for data structure changes made in Nagios 3.0b2

  • Fix for missing math libraries during compilation (Dominic Settele)

  • Changed MySQL db table types from MyISAM to InnoDB

  • Updated to latest Nagios 3.x include files (3.0b2)

NDOUtils 1.4b4 - 06/19/2007

Release Date 06/19/2007

[Note] Note

Requires Nagios 2.7 or higher,

or Nagios 3.0a5 or higher

  • Added note about needing 'event_broker_options=-1' in Nagios config file

  • Updated to latest Nagios 3.x include files (3.0a5)

NDOUtils 1.4b3 - 04/10/2007

[Note] Note

Requires Nagios 2.7 or higher,

or Nagios 3.0a3 or higher

  • Added missing 'alias' field to hosts table

  • Fixed problems with marking old, non-existant objects as inactive

  • Fixed bug where host and service objects were not being marked active

  • Fixed minor SQL errors

  • Added DB upgrade and installation script (Ton Voon/Altinity)

  • Updated to latest Nagios 3.x include files (3.0a3)

NDOUtils 1.4b2 - 01/19/2007

  • Makefile fixes for compiling ndomod event broker module

  • Fixes for Nagios 2.7 and latest Nagios 3 alpha code for scheduled downtime changes

  • Fixes for problems with DB indexes in 'host_contacts', 'service_contacts', 'hostescalation_contacts', and 'serviceescalation_contacts' tables

  • Added missing host_object_id field to 'services' table

  • Added sample SQL queries for fetching data (look in the db/queries subdirectory)

NDOUtils 1.4b1 - 01/07/2007

  • Added ability to drop privileges (see the ndo2db_user and ndb2db_group config file options)

  • Unprocessed event data is now stored in the buffer_file file before the NDMOMOD module

  • shuts down. On startup, the module will read the contents of this file and send the contents to the NDO2DB daemon for processing.

  • Better detection of MySQL libraries (default path)

  • Removed 'should_be_drawn' field from hostextinfo table

  • Merged extended info definitions with host/service definitions

  • Added new fields from Nagios 3.x, updated to latest Nagios 3.x include files

  • Added stub routines for adaptive contact data

  • Fixed several memory leaks

  • Documentation on database structures

NDOUtils 1.3.1 - 02/25/2006

  • Fixes segfaults with empty log entries and missing db prefix

  • Synchronized version numbers of all utilities to 1.3.1

  • New update-version script

NDOUtils 1.3 - 02/12/2006

  • Removed 'ndo_' prefix from default database structure

  • Updated config.sub and config.guess to latest versions from CVS

  • Configure script fixes

  • Added missing 'address' field to hosts table

  • Different version of NDOMOD and NDO2DB are now created for Nagios 2.x and Nagios 3.x

  • Memory leak fixes

  • Misc bug fixes

NDOUtils 1.2 - 01/10/2006

  • Changed most protocol strings to integers for better efficiency

  • Added check for client/server protocol version

  • Added support for TCP sockets

  • Added INETD support to NDO2DB daemon

  • Fixed bug with processing of contact notification methods

  • Fixed bug with processing of live log data

  • Changes to MySQL table structures

  • Added some initial documentation (PDF)

NDOUtils 1.1 - 12/27/2005

  • Changes to MySQL table structures

  • Added support for both original and retained object configurations

  • Added checks for Nagios object structure compatibility

  • Changed syslog() message types from LOG_DAEMON to LOG_USER

  • Updated Nagios 2.0 include files

NDOUtils 1.0 - 12/23/2005

  • First public release for comments

ndoutils-1.4b9/docs/html/images/0000755000175100017510000000000011253702164016710 5ustar baeckerhbaeckerhndoutils-1.4b9/docs/html/images/fig7.png0000755000175100017510000003314711253216103020256 0ustar baeckerhbaeckerhPNG  IHDRPɣ6.IDATx XTwN\rxa4PIԼdBi1R4411)MhJIy9!39d xa&0'|[3gaa33Ϟwkv^{>VǗ.]!"SS#BBB4w=@33gϾ#8mh>|ڢEKK`߾}D }#d R e26ng IO5k kSBi6DLΝttE5vZqq'"sȗ=7m5O7lٲIh53gƍ.!brJaMMӕqry2jXym؈m=U@@ ]2k׮V÷~ti)V ~zҊOCǏwi9~WkkBWY :HI&"}{he7m<|X`ʔ՚~zҧ~rhJ$]:umvig'EWn[ZZA{y{ 9xpAܹkɒ*ؽ;=*jVLnwۯ hTUUݹs]lCĤ<'t *)9P($ `mTU᣻O߾rsss'''{b[!22Yiw-],e /!"SY>ݻ{>!0.\(>ܪDE/}R~PCfBɮ[SBZ3مU|R}}=`֔JĶBdsz}z?]PPe5S..X<ե]ѧ']+(;ܑvvV]ߑS&Ɣxxԧ']+bPvYSVV٩^rywMAee~۶NNcFЩSl(;q㔪BFkEEYݭJÅldd۶v0u>>cjkZp[/)9^W/jj.քO(;cƦ)) egӳ':+VPB>SE 0ktZ@@4`.tw^F$(MLKMM9߁d]~pz41<\t>4ݻIkk厎ʸ?J}x3O__|fa;n#H~z<PvYS_ HI4u!1%&*;V}!C&߼y8J$966IIY\lvY4P;ywhS72i=$聁Ӏ'.?3s){ll%jA[0_JKKe2}EMSoR^}zsM.aӵI^鯲2ܹLxryK HI9U0v?NN?"hnϮ]=W( ϳGe UUU999%%%/_ζkzvN/f8V*7NQ(jÇ:vtٰa y~[[}o4tj>Wuu #S\e IҥKk3gNjjB!7`^eKLb_&N\޶Cr_2ޝD$$b'>xj|s߇ t|ڋlƐ_\|lel 9Q&H<6nsvMޠ1JZe:tNa7nT9gŊezf3ב:HT$[kmbb8L"3mWB}zzgd$䟾vM*WWW(;@d~嗫WԾ}{WdưAAs/\8J#,ʕyOӰ m;V:O>;ɷN޿ ;M-M m><͟w~kƷ96izD;%%eĈݻ)޽FixIP4gC=<s Gnk5-Mqu eLUUՒ%K-ZDO;)j Lodҥ|MxWra'ZFB*>th>=/\yРPv@!I9r_~I"gРA¯RΝ[)]قqvvz|*=xPeSLyf\\ŋn< 8qZ{NW(;pt2:NNNcCNRG.7r T(;et,x?fe'>!&|˱c-\d233_{W6W3 yF cY6!ii*rDzDWCP.@3k{53_eU |h<ɔ)ʋpKQeKk{5訵kFhC{m~{E1Em/?aBṼ9rdZZk{rT[>-ec^~ej{Se<5}׋c+V$deی?~0Ο Oǎ}*zђydGPtؖ<"9yϏ曭AAV]pz,fy$%8sWvQj{ƐO4{aa ˗VQQ3Sls,9:JŶXI18{6mccλ|yهZ amÇ.r0GegLO"#c6mZ?b0_e'FTrhhXZ`4̤0fᎎ=^z)oJY(s璓E$4Kܕngf„m6"chNx͜5}ŊȆ̶0C )**mW_k\. 3^e'${c*** @m/5);#<| Ȇ@7eʹ>eD->u*9,lIȆ@p sDeyg͚U*;ʆ| 'dC5[L"g?n]E);H>u/@mHXIm}=d_b"&Gn<:] dV*2,˨Yk.Yʱ^?efMfmqr-MىNQQiM5ِ:OHH^(: };E隨-ZslHԹ2w kرqb[!2G|ۦA$=Xs¿622EFl۶Ilsh!WUUy&b&&ʕݙ|r\(;#4tS/8.5=`Xgmu6=Ol+DfϞ&L]Kpի?YvbQ !w܎"}zkyeo?'!ba_ ۽Z۴i<޾}sSWV'&Zp[e)UUVqk&ct"/oop6wq>E}$b⋩t eJIf]+~U(j=w!LJ^^of{{|o.82ZrX[T,cЯ_c[ic1x{&?M $.>cG!C&U(&+"b._ߗ>4p͚GSvũB1O>&J9'S ١C$碢3gnSYɔvN6oαɦǞ=jGu$sۡ\ߵk#~[uL9ؠғ{y{OOK[PT󻜜z¼-[by:cEsrv`<{|FPv`87o)) Igm㯿=,oo[Խ{gWTv |g?#=ڱcLV%Oaaߐ@ӌ6Mx.sgq6m1 -A,Xm/ڰ^z7)o)LJ..:q"3 ktL^v옹d2`eP_ja/opjO0Yg>8 s͔un:o;FsO3bw.ΛuOص^zRXXس'[7c'OvqRNQQyڵ 7,^OYUUhWt$})~9[H1i/ 1Lqq  vqe̘66XkW?ͻj!i&V{yɋ'q;,Cg6Y\?yiXUm/9{yIO1aB\zz SWcylVVRf灁$iiKضJuŧ@فaݭZsloEQVxt؛ۜ25Os<5@Eұ֫R+kX#ًvΚ5+;;;444))uPXxWbȐ}/d37ݿm||g~m[+X# B2>ݻ{>iߥGhF {mG i*0S+j{]SS%]4%MXAIV:f|hLF3k$Nyh-Iщ4D4' C"ZTD1WogJ~a9Ue)) N'Oe٩8P߽{Yx&FՊ|qDM1EGufIdwʩO5Nԇ 3j[* ΚT98thILvX1gPk824akkŒQ:S@j,=z^UIgj6M"ǘEN$ O<хm!7o^TSvvй^?憇_xѪj{5RV̕+=z ]&+P۾v[7O?aa+I峳/u%9yB!㔕/lqAV||W_?pZv\0ѧxv.gMxYﶓǕS>a^<+e1b[%%+t"7KNΤ6Ȇy%%P#ۛj999={ .ڵ>=ZkPIFsJ:q"uΜ]x9D:9OSzV.S=wOf$!{66䪧,36Q-[b;DF&Hcc/]ʡcǶ30\#jc?: )&y<3{wWsCMjN{Y瀀ڧN}^WwkȐُ?p.R߽g_9gݡ+.cU+;kgX|Ĉj>Kr@Y:y08[ym&P(ll[C/?U#RR~[ɩĚ\>}%e={>M?x+䛓޵eq 22X(jT C<<_^,Գx?doܨT1}~$0),PBjHNpX7,¤2 R|f_$9T^x"ګU{N~=ˣa$)SRV0}o\i͵DYYeNy2>ߦM[}zvԣ,Ae*NHx^SIo޼B~}fG?^ uT쫻0Ȕ]+>'E ? m۶5QܶSƌYN>; ]Α4WTdԔt:Rioq{ˏܹS֭]nZx,[ƍH=3OGt:jmJhԸO%j:``a ) ͂ͤV֤gȆe;Zu6J{~ Ȕt ޽{}ݸq H㇆.&V^\܄wì©S.Z(**i$4HgIߵPXH6j͛7ٳ'..NÆjYFV{:tdNAGiDɺnk*]ig6lr±ΝS 1 =}*}>@~g2@zx ai/;S'\:q"Km"0'O9N"W^3gG}d"}qƷVPK+/h{]($&τIƌ" %%IajjʥRGs<{fذ~Pf?k66O|guK*,F |NGkk۵kzkӦ-hQvQV&Ќ]=X;ۖH:sh̽{ c|0}ذpNZ/m,~!)ذ)ذZΜÆe%h#;{kzz /̳p-Mx}')-j{V}&1`HIOeyw~a9Hͧ$z*/VAUu8U0vTqNNrm-NSEM?xllՒ5wtI3]3b9߿_IUUֽٳg_IߧM|e˖A[//Ȉ_UmqeW5}W \rN BCeryq#K>> 9;H[%fM6l:uaxZԞ`͚`pU=춶ZS]}yҤFj,X!/^daضX>/*kHs jU.+jAM˪pʨC3&g ,sg7OQ?#PܫF]MCXw|X=,,)83 rHRj<0?Ԝx6cnk0gԴ͙Ǐ);t~us`j{L)Fv튉ټygΜ)Qf3Mg%t|B!7ʲwfNdqW͢%%=<< \k>*!C&wL=Eucx,Vف3tRv_Ў_N}g+C^l]SRv`_NYQ,lll֭[7rȘ!C 2#.KAAAC6,gM-— R}4˸iVnܨtu4eJs$)) 騩CI^Pv!U!M ''̙m7}U [yz\RͲv1nƽ{g!H_vs|NΗl?rAAE,ъn}{ٛ49th4s'Ŝ*!]]:KW;Vj߁R_/oV]Xn;{V z;:uV[I,i*:8޸aUcoP{r6Dm߳gGݛ7ǰꜪl/C몳N1M~jف|#ւ GGIZ"霙С;d}ԏiENn8KdօώYM6La'N\;j%߱rIԤћ 2'twb[!2nnyy$~}Ҥȕ޽{9lMKr8Uy嗽$3flb&7z'TYG=zPg4%4TF!29Ȍ> 4…׍;&)BQ!cto_>=/]8H4Qj2~:t-T#WSF+__c>{'N|B1&|i''q3ܿ I!]] V0gg_-o]\B?)䞫dMK׈zG2rKs8Ù3{S.T P(Ȗcj=__j P<AdF7dR77#,Tk{$\ccI"Z4KzD  OEpquWwJ@9@Ji^p [kG9?I4Ԝ~viO55\Ae2Yug..JWaB`m燢>iS {CAc$99Il]:nn W2"9? {V c+)_:I^pk.4D߾FY5XF*zq8/ǖԠX%m,m˿xPݻ2yE0跱ǡ0)^w+Ķ@BWc̘yy kr`,@BLRI s'YoJ;k`c+^da޽۷T q-OzXRcZ;yvKzD|0ufZ)%&f4SɳT(dEEYR9o_/.> +۵ViCUYO>d'(BMn> {2bY6 aa+v:SO<8,'ggC~|F|lU|0kaDEDD4wq36mC+ qoJԩ,]/YH"pLO3.Һ=EE/#F}F񡕆…jS֟U]gփW݋L3fY4=`Vh/8ѰBm׹s=@W}m\%9dq_/[Z4 "3&n}3Y].Rs4%h>Pq&2C]AƕU曵ys $amX6V ?ԩ_ѿ}VED6>|X -m5bhLCuյӭKk3y,j=`͑Gygit$utR^+|# ]=\iiKΜ3ڸq F;bcϝ$W]3u?S=`o?FV@x"̜_[sJxkx#o/P]uC',:rDYc%^95gH5de%ѱ?\tr\uHK9-dR+:#3!!!J) Mloܨ"SUw:0+{CuϜIT5ܝzGF&cY}vA@^9:ʂ߲%ZE4ݻhzTXgdfw̘ ^qʔUr> NP]u #87o^!gh;Cu!}w DbިQQ5f++BBR: Ug,`RYߤ1%|Ev, X_ֶ̙llphzz<[`0*2Cw* ;|IVmhicrrv)Ut54;[Ϟ=ȶцꪳv&DY ~DڵaE}Wu˖޽M`%ӧ[|dfi|ܸxkN$iǎ{Wv:gBN3fl)orh4+eom%YI>`!upeL_ǚhEf&MdّQQQ3^{؆ϛo;Ҹ(ɓ䭏dpP Qgt;wܤ$ ̬\Ķ|1~ݘ>}FǯY/G*oM692::#3@+WvGGw嗽uum7p8$)򄇇4#3@+&HR"0Df& %ȌueAdڀ` 2cU@XXPvDf,(;"3c:8X1Bl3r AW)O6AX*ޝq}œ# ,@d"A4kPȌ%e<Df,(;@Vۊ0`PF.T*PvZWddo#3mL:/ֈuѠ 2¾b ?;V1:uFE}atuW[Pv@#Ȍ`g'yse2;oSCȌaic)#cYdd̶mZPv 2cOJ~q[AM<8'^z)lNNN>41 O@భ[7z: pq:*jڵKnAȌlEϛ'啉&: `8}ӦJeCBҦk##cuF0@h7⸽{ӌ'`1gvcȠ4#fCBgC~tc1#LSaِ'G$%yBҩ466#66 e DfdMesnPPv AdIlݻ).nV6$`Zi*':~|SS eVqp8m4ɓ={R 8h!'27?ȍU~jPv@ˁLe4V(;@'2# Pv8 2c:1Ad@"Ȍсe  (;@d(@>Bw^Pv9#2SUUBq$3Ekd>""𫯾=YE-(;|ь̔ O>#rk0wիph޽|#Z$BY7  cu59PvSZZus[0w:ĩ$(((8vXQQ:r6쀲Z *BBB/^̩D-,,Y`ئPv@kE" WeW, (;XPvee'-Y{`66YYIuu ~K,#C򝒲[7OE*"esdB!@k"66\B:Ckk厎NK_8!]SOOv#_3G$' ?s&'޴AM./۰ag)#I)) {1Em =MC؉B _uAzz<}-X4` sԏ}|NNOm(;Zڵge~Ry킲r==ڶu޵Dҙ6߻k{[%g3uBQ푑|SٳwqzeK, (;XPv4`i@ҀeK, (;XPv4`i@ҀeK, (;XPv4`i@ҀeKi߾i#gAiiwIENDB`ndoutils-1.4b9/docs/html/images/fig1.png0000755000175100017510000006076111253216103020252 0ustar baeckerhbaeckerhPNG  IHDRqaңaIDATx \T rQEJA*.hP3o(9'E5MIɴP@ *?3_Yf 3|߯q^{kpg}Zd$1mf].Ӣygڔ}wi6} #,ܜm]#獅ߖ2%j] wrkjˤAP_wI&O aV.0  0 02 0L0 0 k*0 4 MiOZϗa;dud;_~0L@-*_ݕu}C9gz0D9tѣ_L'ڴ7k20 4qP2Jd#~SrLـy0͓cpLZ5T=e{g3zO]}jOku<6,) ic=BWtv@'*| o)öM¤{gsRiɸtt})Ab2F&,^H$P>_/B%wѤUR#zI`xaw'>$|LGވ$d!$B&QM:7|?nc:O+0֦¢;aCN:M*~YR+qH47O]:; ~rׇ?͈'*Ky" &W]LXd̏Gq ۏ{Q'W%UMn1̯GAa=m̟0-X>5q{HTi>񆤒I]3nД݂in4Bߟ{/7[ Q47IDCAac UiәRd?ZT`sN&/2 r}2L FCPyzw[+_R #E"6(TMdVm4CПj~ {J!P$ӂy84H "+W\;]|Pl/߈a)<] o&Сb{g4UŹ/X+WͤsyduǶ0PŮ0=fr uA#"[ɺ|P5q|C&1)lc x)qևtj ߖҡs;q­Vքi>gc='DJfߛJU {nyO Ԛ8soTaX $pb ڀ0LBMSrM|j1DTUWr'rVic=*ɊimnBxa-#{>"%U󯼥(|I b`񓣐N5[:j-'S]w5;zL-TVݧta6)<,T#HQU38JmW4&GklFCiiiFFmW[^^&&iԔ=<nmmmHe c]h UZF2 c$4f[-2N'gp@W]?abҊDWSz% Ixŗ/֝ahz(~^< %Ƕ,UYd TKVVց~q?ttW?Nh< 茏؅Gx(,lC1b\Xk CSx}aFڪܥLst޽ :G;m@@w|T{'%}ݷ+-,y1cƘ FS Tsrޘ7oW_}xf 4hRG.N5]bk;ɩKԤx{7lӥo5mngMm Pyo&??ᄈwi,sqfddL0Ksfwq􉫫MD6$rt-/Ҕ|.Y`A~&%urR4S~cǒKzr~HT۴AkU7pprrJLL]} "**VŨމ}þIYwL5Kߥhۗ٦ih*M".nI,8y1C j||I9cI/`b*?^H(cvq2:9t6` Mo8CW  rjTzOIC{oݺu+G-1ncL:ihh8Ef..rBJ9H9f[SWzV@S(5~PÇ++%9+Wv]gB( Gj<"߄4e+i|"X&&T${*g_d) O"xIU8KHu 6p-!'|5q!2=!JTH1Ij⦍U^˜[ɉӧԩS9j1 t#g~IKex9bjvPׂ5`PP;a ̖^o!ɌZzĮ㜴 F22č4KEOnV4CW?G…cn 5iS;x!ɻf>)T^aqix.*W6vG#9dQģ8" [gy8>NJ ]<>_: JECS!Ұ=l(z!};_(JC BBB9j1,3Ƶە% v歱Y L v wmwVR͕Ou\Ohߪ0pxQЅA>E"N m֜7_XOR-wsˍ74he], $ߊǗ-;6zt/(|֡ѣC y,?q}(|o.VV0iyڊunAMeRJT֩Y .6`'÷%x50DerZi²{/ɹKMlbRS RR rvAA=/07ŋo*j0M:5h񌬛ʥOU`5J km0p࢏Ϧ@gxB5JU˔*wAe}HڛZ =%nn6F]LNI)SHPP__`R8[n݇: Q%U KP`d3v}uG/jZ Xuy?5@ NZbdn-i>kA&,Ns CM.KbeLp|K mﴺ*E *!-۵mcv{"] 7P6.UMBTVQ '#&5 `+ *c_ )TXSk唖V wi>Q}BB9 MOOYZ.7=ȃw\xE|yHڮncT39rCܕۗ[X]UF}uL41MYM, ާ611l1Ivvp )Hn[t(~TJJBq;>>Ҳ/vAj"UVV ZbF|uΜ}|VRFc 3'#|Y+!C-}XXGh[ee (h^݄-Nؘ9;w{!"TϞyš%a]YSСN#F)P)'RH$ꂕԀYZܸqW$I#F(#kܫK(g||k(Ějp0j]Y!l@`vnW*`H%M )7.v}}-=ί;ۨξSQ;|PBAQnnGuTJ3QVU/b;,8ϞVTT޹re Sh,VԦX 9*mnjڪ$PP;;G-1 SJYP+mx`SFIIEz8#ybtu#b$I5 *5Դ5G-yf\+,nPZbU;WZߥ0~wojbmm&~Y VQ[ήYzbnnްݟԁs?ϯyZ]J HYV*] .pتw)&)T'UJnG-1 SjK,>|^i 0L-QY usqgj<YReeejj*mWTTT?<}:ny37(}>},,gUbnn^2CYR"88&ibXS ZʺuB,Ϟ=_TTڦ#xMlsV1Kh;::g2=z?1b45((:JG,Y[H5iQKP|x Ez^^NBB]Nۛٵb:f,q<|+tnEjj[aϟaġUVyzzrF-aM5NORjjjbbɓ?=ЭC;xAAmm=<k*|P-PqLmh⨥ʝ;wFDf``9s ZGuCΛ&} &'Μ9wc3V(W롌s6qy |1Zn?k.{oŁ!U]XXW~y2ѣG;ׄe1TXS[5m^^.ټy/aC/FFbD:N&+šRhiƭ_WY<'M3y+^wqi"XS[pϝۋUQQBk]aԖEG-pƌI U<#֭lGGG}a5ѰQKm۶˟6` oк ^ekj LL,_X6)9jǎ<0ô XS[. 8r䒇dž3Onmmְ4,*+߻§&cXW]"aM*+s37<~6w 9|xc: w4H> c]81Fbcc!2rd-st(+СκO0aWF)SԱ <BC9s- {]|}4Oit ˲襤?/K*U5׬I27c/ (c5zOK)ky6>Gupݟ<5yLݢڴ169((:<

JtIA\Caass qJXM_ddD%rIIyڵ˫Ku:J@z,9bj+g SgQ8!Փ'sE"' ORj޻vMQQ)ncc6܅{!`q.]*#Z =K履~JorǏwbi6;v3nQKGmHȷ?iT͖^ T ,vΖTSVzLI+N"AA;7vk$/ٺ̾} N~;ӦƏCMO *$'HhkO@@7I&Luº!PMI%̓ i3f`:ٸ19_4ߧ[vZqIVWQ5.K:ujpsyp7~[ZZ5Uz򨥲r_}z݊ [L >QB@ga6Ki:I`D07CW X+ H*?i=GY醠z`_?SKZb|(,,7 ;{^3}WTjj3!;5]j-t ?~<?zԨܺUS4nڴ o:Iz cN;tHA)j)x5h^-'@;iuk(%- ҐXD#3i[^^NД9TURpVeՕ~'CGLE:X¡-z!i#$'"+_Oζu^ Ĥ;_K/rO?]Y4:v4,Esν{j"A} E)nxQ_ֶS[8_.]7A#qWt"Mʐի׬IM%yp!pq"tYG_[LhF-]vǎmڴY|9SO 1b…koPY\:g{A__{{{Ks{Jb䳢wUݼÇb#'?OMYlyRHJۗ!5iqB5**URyT|'&N q^Tjy[a+~W8!'Xl6tûed(b||azd%۷2@ |(^>Q\V)p :DEHH,T0RM6#O8A>1Oeꈵoi qrj1.B`!]/ cC֡'4ߺU&Oi8$&8}:{ЈU^HiFJkccSAutlzux$ !8l4J^"#G":5 vl)õAHS.^@Y|(v-qN6_W\z)[/Ľ_b2Z7n\NO?|$Axr?4݇4[sڌ=:=1[/d˜1xźA-*_ݕu}C}VzBx")z! ZWޠJZI3DH<{ cq9H*=Gkt"jMf(b<Ѧ}^Ƥ`1D גM.fKO!$Swnn%ϩD$ɪ6 }&ßyƦR*M'eXϚO56pRGamm}IMe }VN|I*K]%qqPCHR/WRѱZ߭".I}D-_:YYALL8m'3=e{K)SП.HVZu<6,×GIz:ЁNUmAk'޼]su ;Xyo a1I c}]TTPfOMQBx%523oSt̸$@pmtt})Ab2F&,^H$P>_/B%wfFjgWI.%lܝ\\r :t25y#atX `G7\_"2N@]ŽJ9,+!OKwISKgO07yGQD@b #U7 T.Qd^ԉ{r!jta~= K% *>t 4S:b.aC<Zr!RJ&IPw|S0ASVwh,͜Tsf+ahU> F%})j# 9ZS5;T,_6uTVV6x`9 T_X1! jDqZ$e,ƍaKӡZ!QJW(((={2 \OKcij5"::TZ)-07 M:|B^Q EzhC1'8rl[x^uKfPu8TpWzӦW]'^$04U w)KMMwAw&MZl4Vm5.58.\h4R* QZZ2~ V[%ugΜ#'>|h}XK`MAZY[g3LK&U]jHyv@o]g7sRS lI[[%CO5LM[yf!C,^Ue?dBaLR*g޹s1LM7{ѣEu1ݻ7s׮_--;NަMYS uGOyR~QYy{NV={mͧ634Ԕ*e c4(߫*I U]]==;q3!!/%O?]1550!xhjDZLP8ٷo% -u5;ZuPc/XKXM[ 4!XL"=)1gpyP-NĔGD~嗻ٹ=W]8))ʕ|Nݫ&yRt{]UR=th_U?X=;WC}򪏳pXQ߄5 ~L.cMJͳ؝4|d5`Q{R" HeR]#7Mt#Ýҥ_j)6|2{Z=xhe۶Eλv7vPL[ci H3 ؿy[SI5 1a>"QWR3|5O`vJmr?y/>\YEֱE04W45UWQjS;456jʓ7ECH:$HlVhdd OlX>'hF X-cIejifKf-b_}5ݽ|pƬ6*lqfN$%APQ}@_Tg CMZ$9Z->#} Tݷs+WCVY:۷'{/k+އ8wYq O04UtˁE]QJ+ +lu [b1E<+&M̨Jh Z06M*:ZDu[*Eס -.ξ; 6^>.j DˏS냵@qZ{Yy2I bD"2WVvn{> /Z64z/U$QD1rm1)ʔt.>-&v ,zAVf=uh ߖȂZOwZ, >> }?<5B GEC͛emٴi4wNG:R?g?R¬J?E[5}Z7nLwEZ 2UV"U e`e`ynJ= Xpg-Rt\ifѭy80q5xjc"Yz|Ykmޓ*jEp; &s4f19k'S팜jJ©gB3J`!l{vM& c ͙..!?9d {UPU<0a2>pb9#U-phh֭bՙ3C/UuiiU<ՁϚ*0ZwkM4{"A#ꈥuu3m':v}{=/`w!t;Xةٙ&Ѹ6wxQz\i.V_} 'DҡZe g,$Ujdʓ 5}֔I5lFRZdBF&-YST?~<;;s續8l?ں<=AI rpuŢE^~َ|ShDkBSL@Bō7"bI"WJK>qbLD)MMLa$*{GWR)a)/Yj~`p6f Vss2ˆ-C `dNaV\4 9y"ꢩ4jS 샪MG)=s uCx?_:Lr@b` Ѣvan-#Y!8Ap-b jwdaj.G;e> Jn=:)A?EAS$$$:u@{xx!CΤCAdjgBJ񁼅'9s īWK p(駟ruAVii7tܢS1oŵ^^N)C3E{u˄M<:98P,nUh`tϒ =& pT-$QCcfR xDǥaRf6ESFm=vjG&W>zLmW~ZUQ370+ a~~~PS{e=Qn]Bw/_OB4'g΄dR&rV(nd{5kB-+WG9Z;}ζy4׀ augÆǏ__62 @apʏnƌΜ uT5 U[׃ ?Ml>yv4WZ59r/[j$neY|^]=ckklـE7l83xK[›5՘i9:rHHȦ_~ãsZ/@Gng[Z u'G1oĤռy^c3f޽?-#IŬY ?9󅷷#yMM-/Q($'>w*ttAAAoZLK`ƌ/_TM೮];e묩Is# *BhZ켼G9:>`řT/E$)),-gd\7g'QQq9''"F;_yT#Α}V!RU@c#Ϟ]TTڹs{N@gbӳsU>ٌI&ɬھ[RRq=h'v ŷ{?ss+(-ܗa[̛Wݻ3̞fM56 e$[-酅p+**RRR(aXXmWT}l, z>~髇geΜw6H>];sTP"1;zuS{hmm6|xZ)JHȋ97.:8XuZX::o#\i-TTЯ7}}%_x?NZƏ>:2tBQjaD4e[&]Rϝ׽HaIL=y}r&Mߥh4/e5PVS=+WT"3VAAi..qrygn!{{NI)>%UnyoVllPi'jkk!4T{z(lؐ*-ӽ_b>8__ZZPIL݀ +] ?{/$% {zܯJ &􁇪Ch?Q*#ξ xMݽHVVm}n$mxm/.~(7OI̓F/w}2;uj SZZmG$1 / 'DN U/^.--VԆ]י:;vkvI&G!kI ٳ&A- ArSvwqvnokkQH`H_u^Rɓ?5ZsUݫV%v`ɚjHpD0eŊ!dZ[.dF)A_եw7!!`  D S?+478;hG{{ ;;ŋ.֭g6mJgk?Hb9q7>ТE{1czk:mH 莏Hʺ_ ԩ4Ch;9*I;E-BAin7ꫴ?O tt#T#i>@ov~2a ||u萓S{|*K [JJ*wVT74Ch{ΜMM[R;@ y=B ]bMmpD0hdDp|heˎ!qU- QkInn@RR?]8pgv6]>iA 6>_:J ߖ}YW'''A]fG$1g|=tWFͷF SMRӀnT8j\Wv~~vvք4mBl>}*QKT]Á MfG~1UhӾML$p!{(' e+`#UMKؼÇiRwN$_$%YXXŋ?D?5uo|JNԞc=0OP9"1be1nkPx(J{J*{ ڊhY]6jQb M4C$YO!|B5;w=NCS#{Z[C} HbXO4%HxVLڄūϘJuKEPؾdrTYέ.XIgSLh&I3!ѤUR#zI`xaw'>$|LGވ$d!$B&QM:7|?ne$h C4UXt҂Xx',XsI_/3_QaYy%| B̃jԥ'G~}.5Y0x1I1й>uѧ&sВ{*/ސT2Ikm[3FISk*Dr0)>eMSqDq>6&*P_y]Uv:)*KféE9w餜j" wܷ~I!QAn<]/ )"Q{WoJZMkZ6h{g=f&R1ɴ`~ "H <>0bۋg#71i 'O7›I:;t Ff,fҹS8>r!eG$1ƍhGa}Hmp(:'+joM G?(My<9V$R2/?7JQټ'U%gWv{UاlřS|6w+UJP$!Sd䦄#5M5?PRU]98ȝYa&+w% axⅵ.vOTͿC'-IOB:lLlLuaqh10S}v[uҥpDBMS"%8yX0FjTkgCqڮhL֜ ޙBim{U1a5UpO)>_&h ZԞ{eԪ m!E qirM}kt_MCq-`U/ ..UJ0&##˭ "KC}D3GODq2v<{,F$bD~~m1DJaj+l؀|Ъ|@JRR&F$"4sƵZjEUw$~^sݩb BR7!ԪxI;wܾ}iӦqDضԽJ#wZu04U w)NyEѣ+++9"atcmVsR#))IE yyy]V'`4ՠza]\\G$1qt.>>!U1XSV:Xr/ô >(\gAhn&S;_820q6{ҹ<TZVkw__+W֙TkAo/Q"6Nфӽ_ N٬$_O8!ulXԎ65pC :,yh G)O["Ie4(?ϓ0-AP|XW ƽJ"6irW-?4eV)9"߄R=[P:f*Hа`m­ 98}z0ϫQX5\5O-LUgᰢ 1Vk]PX{|>2T0͖[6aTFMMz?Jz*vCpjIAؿ+5a/Y 8꾒i/ި|۰Sm[ɋ԰xI*T֒To!'Sll̜;DF˿t(+С5ĂM+#)}CC%meh0MUy@0M{MU

vLQP?< QSo.5=QQ)|p?Յ7˰d4f",RZaX|`[+T@R +&-j ccДECftv@(TI{hq|P?^}:?Ob)Ty%³5`3u; "Ǽ*Wz:7ؙ9xPՁΜFo|})eٽ[ـzu 6VU$QD12vsL&ˣ&cB`KibnfBVaFֹgLP돊5 ~t*fv\@ DLDK7L$SY 8Tc> w/7[̊;ٌ dzdH$]]m>dpV]}HD9sm.e{>D ~!/?G޽WQ~~rͦaږt裏Cj-"7jl/oo{_;-ײmk\M~j%1ɼbZY{R%U8CrQ!ۨ=)}i3̘ݵ)vFށ 5%vT_3yPL4ʥ[g;JZhԽdzgD]Z,R?XZY7y$/=o׷׳2 ::H= w!t;)L<];/mߤeMR APW"P-`F r3R*NARDQL2IA>kJFܺH*;ǰUr>KJA0F L(U;j*L HyazXPp6f M+$)C|=C BGo :E@V(mTҲckyoȫ>N_B_-VE ,P h Ӈyi3rD`u1BF-z51B<'~gvfj*40:gI|vGmL.7I+Mt\С <`! FG: ƍ93!@9s īWK NR"+(.|P" MO)N = t"̡ĸ6͕1ꢉX?<;%ҋDuT؃|=pN(wфv嗨U5sSɺ C2UI1LE|t#j:[vhՙ$65.\33H"]?_5tRffxlw[XGݻ)d@ *w(DHR|>9'5SPӵU} +; };72!OW*ڵ>#%šݵXSazAg.$GLнW萘nZt?˖cm>$ y' Q vQKT;rdψSH'\%ZqCC}Rthl@bmBؚ%ƇRpV?[bMeaꌣcի4Ks?<|t>tϞU▕=!r Y@P;,[`cZK@wnןbq׮MCӦOz^~)B>qwٴi9!$\OJIr`ZaMeaD6T)W!ItZqHnW5aaTaiXSaaheai;9J0~ڴimbR Xދ] g}vv 0Lpy30 0 k*0 4 0 02 0L0 0 k*0 4 0 02 06?BiVXX2 0ۻc68r.@ ')Mo(`jt2C"$IG]D``k"NM:$C{)In2%RiI>M_BR$hF:NZ SKh*4el쁦WWlO)D1|ThcskӷyFwNhT4ryOsz)ϯJǝU[[[33O/T8 ln _ _FFXA ~O&sp0SS 14.eم09t]Oֽ CCj__XéTLT*OLx4}Yh*d&`DE1R.'>slWHeiS, ,kddJt8- vf"&#n EQTU%UxBZk^XHh/?[tȢVkl$Ә#2n, fs)(p+g ?W@Z[,$IitR$r+H1ݡ(v+bFIENDB`ndoutils-1.4b9/docs/html/images/fig2.png0000755000175100017510000002520411253216103020244 0ustar baeckerhbaeckerhPNG  IHDR!Lz*KIDATx XWׄ֐nQ6FDH"2Aq(.EuLcNDD7&Q$zEihm " (*$O+AzSO?T: =N-0UR[[P((]SSAzF H$!+ 1OfF*..FB&ᳰ0R(NiK{{}=D}/99+o?,~^Pɩ@|J3'3Bq)//$7 y?ӯ_7d(?njاkxܰML+,TjrÆp ~~>}||Vu1ƴ@T9992YjZه|}8;ێ{oo'+V&22Q{wc49K^{tK|"T' `TQ.#455aw 4mZ̄ 7f1Fڳ'0rWllW-]#Hdd,۶+ [/_HC)++~-0Ź2j5X$n=x5^c?P1`Ж|ryѡǏ;w]|k1Jݽ,] +{c _tE' %gYc74dI+bEeKfvv 1P^洧5kOkXr_6i={Ƈd1F`ݺYotwO͝O͍(~7rgr4ggk1$',vۻY_<6]*u vEh*32Jegϖ۷>}[ nVVd1ǶmFZb([wIo..wDђ o᧥oߎ~ʕôO%r{Yc@Wӧ޼9B_48ͨ{&ꭴ&%ã[ǐUZ!t=uҥwi&$E&{ ~}AvuH6hJA~&!(!4 +W 9vE( a}t֎Y'O9ӳC߳#0a€>h[aa{I͑:o'[g5![4z$B xevA:7,}gJK3£笕ωBKl4Ƛ\?-zyWmlTrCc(pS5hRKaA >|ڵgu{}`W,A4hjzY&3+/Oxh3@mUMaϞ-kFpqwԲCYdRRjqm"BD3w:7ӳ:3JB 1嗝R{_68..sg{c(11ߴ)\a۬Ho$&*:vW``ODN0H SPEHX>N/—ߥgreʜ9C֮b1Z=MJ/tHu, ˫ \>>28P */@>rG㟟~1>^ݯI$k1hN{n_gFgE/vFjf[j2)2e~ S_3BJq wkWf̊\p?n(aPfhmoF;Сaи}>a,hܹh8*ʛiLcdfEPY24Dޱo.0C2 @^Vs Ky;|xcڰƇ{A ^WD9WWz!- X f8XcL㤦j tXc> 'LO?;wsk:1扜>}zҤIo޴iӊ+75ooGݩ)ǽrvQѭ#o6iArLe4}و ctf͚####(H9A1kJt͠Fi,ÁQreѣj͛u(i$dfB`ց5hiY$Ğ(ĥ9sLK+Yę3UfY4zsX1k P{iO,uaiiFm :yUVa ?<8 Cshҥ!!̆9V"3Ii,aժT1K鉥V &oˆBCQ+cSZ*##t b 4f ;wM4pD!B[+Txص#R9h(9|l)B=k7Oʷ:Z;ݍ|%`{$CS~܀5kB2dcˊC_yŅbi…v1D(88@H//. Qhssmpt27-Q8sE#e3?54HH=yBAE=4z-!-,F\\#4ׯ׊@KC%C@\~~hJG>#"+=NYuC׷;ɆZXxKΆ!`C.*Y(rmmmTP>CUc-)i\ŨpXN8P$4\ry#1j#bR9@ꏡD m#kΜD cҤ~+Sʠ~X_]O"R}uq`֭ srzڣ$>~!AZ=v,z› >݆zgqt9!G/Wr( ":W:Գ k aæ@nhPg(W+ Wһ5ʇկGkCXtVLO6Mg<~ȈZ?fhk2k5`NZVC5`hmZX+MϞt5Z?z?fA`},]V^ٸŲ?~^ j隴rձn-\:mڒȱC _?,lְaγgaY|Ϟos^ZV +*ve˶=|:}zѣuȥ/;8tYk1L-qr 'a}ɗ=>Ӝ#iK6+ᓘBP|'aaaܥRoLٳ%IGl|qRrJ>+:ۚ-:uJMMEtu`)++N[Ho..RZ {ii_ze+\4WL)?3)2֏o4BR411aQdCvڵ N]ZZ\\j do/ӳse ƍJ(F&2fAMX?AcC:v1eE_#vv֌~/$̏^)/ܺn$r2=x oI; sɌF^re)DzuY:Bz?򺙙T$$dTTT*E:H^zpdG݃d|BʤN`?K#C!P/6@Q? qiqX +˫UNXVv;)Uq\a5 *tP7@aCx;UW:KnAg>a " 5ĩ '(KW *\)}Iݝcqq}rgK`57ʧwVhC%8: >t菬'8)t;3{!. !J$ WH``ؽTZ}?H_&^D6uX$#.OzECu4ȁ#[ȑR|[2Mö4ݰl}d/Z !0e^Iܭk ;ţg.acdGԘFtI"NwqG=vY72`v0hPcH%`h@ ͖m>!Bu!iPgW$Pԓ 6E  B\{.OͳXE`hxwF GW t[nEGG?lk i{ղxP߀U]]24<ѣGǎm' iaϵX`ݻ7n%܂=;?+e4vjժ!Clٲeɒ%F,f1# DQ#,n A'8nO9rdhhԩS.]~;;;kX9͌c4znȁnߛCDcBs4~^D#0˷4'OOό˗ /7z,+nޣ,U PΝN !h==:m;mllm&J̙þ-`p͸#wӭ۸(ru>ޏݺyJx\h;Ϥ ,h 8PEWմo0)}( #.SF0KfÙ0a7ƶ44?uy"7(C6Oz߶ó)Hܭk5@wӳJP|zJg%#GGǒs:)=+d(UU-yN,A<=h8Tظ7ŰC'̇ƞxstsԠ?DQ=s 2;DHK3R#|^!!kӞ ;b%IV܂R}c[h"pQ\5@ݏ KiЏ§_+=Ii(*F qxA95{ *PP7y[֍4crzѹ ͢CbM#vf3ۘ'Vxs CJ@1ie'QSi73bZ5~B\c o\w}'4 Q0IF``? Ԗ;0܃5"f}#Q[[P''tiNM ho/qd>1'410ؾ,~U5=pX9Cs*įQ_ B,R%~ois WՏHTaKڇ@88,y(/@`>Ќ[5^"i @9Фo rՓ[VVE5}X)) ^H]T<ꚣAWk4\\=7qAթSQ4D'=COr:g4057sNdr=}L!S&2R=ZN&d2كZN*:!p/|߽Uj>=8Y./_%Æ:uYc֎o:t͛ϟoJ馪>noo3}z߽{5+։,dJʬYjjzk)IZo\`L&*um_&NIVhM N%Xܻ758'G/Y.Xc-uZo3\`ZTB1ƦM(\֭bEЎGxyރ83H }cQQтS"ZN4Kz_:rkaUqܙ6[3gNfH7hC[?Yc-+׿bP9tHak\;{NiLC|kՋ%_fg'i|Amm'98f`װ[f ~;vd mHp>mj䂤|Ss\>皲_c)ߨPTz{;IWtiБ#ԦM;& ]2YizReƌ?^<ܼu5֪oܸas_,MDC۰lJJ1"6p} BtϯJxle2JKkRR ,M/pn 9t 9sbnnu邳SݘkӘF) ./M/g8 h"nh_5sM{CP酇{rPѣxkcbU'y@$?4D{C0ZkQb Sܭ|QXc#,>>>Wr(k:1 &p({XcL#^aP(3}Z1FEEE:(>-tN:%󳳳/_\\\,B+`1MSEdd$}E'M.婏72:a1&HkQXc cZXc cZXc cZXc cZXc cZXcQkn;:>o\rãs=k›BUս{6{wҳk1>S$^tCگ_WAyOVo l9w6,[9sLK+_"LtPeH_:d1-uhhH7*3lvP>cyPI;Vwiܘ5Ƙ S;~}k!nެY' l'ufQ:}cĉ`H/A5SN"K.1YvYJ*⛠2$`/`}Ҿq6m KVIp-z.t$ {-]zJC̙~:Q^ć+Cc% "C\ǎѲ!+49N8@lȝ;7 "B 9|,wY86صk]4$9Y{AIlCJuuq"}W:~|?Da  A i1Ȉqrz^VVԒS.6h ݋\l5#l" wJqBuKHEX 5jߖ->9*mXc@ihFt8ioI:zbݻn9x PI g$uPXdH!h A5yүh qO&k1+=C h!!n11CȼZԎׄHT6N\\mKYii>V.uT zq]~(= cȡstN<|L e#xh?Pbΐ!=HP)^wDH+l;vdOAŷt**֨c:.=A -Z5wݺGC|h;&4}lO#~1DŘ@WPrk֜ ~t|s T`ԩ":|MMLZkx7|SAz Ц!0BAq`F@mPIC!DV$Z<׮Ո%ϜeHA5ri/[,eԨ}bp$cE+j FI5Ƙ|$}  ʺNJ{Sߋ;iGY(PP 4kD-H_KP_E G'(Gwa "(((&fUxM^Q Yr7߇5ʄ Q}-[ xO05$~1>^!w?ooS333wp⭯^aa-]/\px+Fz56v'—c*99y#M*um}6ᗌҜETԘ1cڼ9NcKcdgݒLLaéx׷5}:ꊋoAT׮ͽqհ0i@@Hlԩ =;BmŊJoyyyee%II/\85~~P];/ΎP\P(*kk]RUPPp'3c(8uԁM,5Ƙ қVP@uH$%WVTWW dI}%vC͖\^GiDGHc. ~..>:NE412ߢ:\PSSOkn#QZb3J%FDy^pD"*VY)I0IENDB`ndoutils-1.4b9/docs/html/images/important.png0000644000175100017510000000033711253216103021427 0ustar baeckerhbaeckerhPNG  IHDRHQsRGBPLTE!!1199RRZZss{{ pHYs  tIME 7GIDATc&0@hN$ _AMo`w``D'0d0T:Gȿ8PW=CIENDB`ndoutils-1.4b9/docs/html/images/tip.png0000644000175100017510000000062211253216103020203 0ustar baeckerhbaeckerhPNG  IHDR8ksRGBW gF[?͕Hf\J[LNTF|a8lͩORU>~*!q$tޟI$8IENDB`ndoutils-1.4b9/docs/html/images/fig5.png0000755000175100017510000003157111253216103020253 0ustar baeckerhbaeckerhPNG  IHDR}BDQ3@IDATx \UOD&1G-95Mk6u 2-pq$B`"2( ` HR3t+hF}&UgC}^w&H!  ....................neg.d V-xo)h|uA&nHfʗ)yE%[!tκmnEɓn>&{Gb4tPWI`ggsR;$C{؛&mO|],͚}s>ݜ_ vv:I9 َ%ӹ*~3 C}]M't]PĦSXO\-"瑉EG󹓷'Q2"etaC7G0IGI:SW1kW\>u%*@U]K\%U…T#^J^yȵuZhRVȗ^&]Y=›P$]RKc}ɎWɠP=ɓT~dڎɒ\12 T.a5⼸dk'mϝA:;xwqV?VX*u=. hM 'K$tŃSHJ&ܫe)%ryJEm,]ތtNv:;)3=fagk饗c˺ݟxB7?:~T:|/WnOun3] dV}{%,MKGjdP]-k.4H)ȦzЩUdoޗf(+wL Q=UʗA{S <6,FpeiMVF]#N io*]Sf3d-͚ph. RpL+eW zGbix+S]>;#dQP&$c,zb_z Yn7`@95u% LyFJM=&oO@ӏ>К*<]]ŠV3=~*};X[P=#5$joK3t0L yx9sg9wok}0) tNxW]}w(=>&[_ Ґcw'O1~u.`/߷~]PCz{؈Ś}|p$SsnXp4*>Ƈ.eiSf $_ͽ_xz||LM`Jgmm-KOOU^દb/9P4V1i/WC ,44T[eܹsҥK+m^\\\H6l0aBiiifƜK''],5:wF]e֮[ P(3fj>5ouG5>7دOkN[i5qD=)4իuE}S^WAzcvL9߯O|O>hwp2Ŧv~_2ewPeܰ3צ/}G`݂r/ǖc;K7(( ͢vPWq5o5^T\v:|lg=97>u WW,l~j_Gtl=[VH9ZFwIT^t_x)xi/h0U&D ӑ\ XI!khG+t񺓶' SznGa.>'ps >a ݄ gs?G[~)؅I+sN1eNډepܷLϭAR ;? xVfE{[+hbvmw\jpe @BfQʼn^-ENdJ)-V-} @S1$ՠ'Hb΃k֘A^֖dlX1LK ]s=R xw6jV986Կ,cosޙ tp6ޯ#Y2oAK=/)+zHS>HT >g`<;؟ Kg»*˴7B1ټFM teB*mnbnՠ -M .SKk_߿Z}S>G~bi#.! JYuYs+^Gt4@zWvLoC?Wz GE9` [&5r 2mZ4eVΝ >o߾@eHҳA33O'pɻ#٣dESx x7%#G$^ӠϿ=lV!UbNG&WХn$1J7]Jd/z{¢Hi1]%%v+F7^t57=BY~QC^C7 p&޼yKC|=5i铄J?^ K a(}EtJN;r-(!YVHڍB!].ȅUlUEdL5p_4~nJw-\sH"Y#uN@6#.ojV[KÏUpDkmݶ) [?b /caQ1ݽ/E\P?s-1)L˼B]!Z+ vwë~EI?eDž EɈgWt_YaNi-O./jV/i8=kV3 S18vv~ݞ<޸qT܁L[RӺFn#EGZ =sbޢOأcxLƯO /׎?Sv< 7TPǞܙ_g(鍢UiGشiM\>)Uh^Dy\aK훙)221e҃~ؙi.))(gӦ^|%&誫$ɮ"MLu1ΉU%rHoR m BX#Ib~O͔FTd?JU\z#ϥ F?~>μa\%iʏq.ٯm槺#U;6/:h^{\IWkߢ˾)&ZH֟j6Ҫt1RN.yrج;TTq;\T|RRH" ʊC"w铥KstK+Lt idLpff,,)ɕmKw̘'}'OwZYS )tNI* mg=2(A%{RK7\ڔ_^.2Ew'/I*>%H֭HtK][GqWz~_lx+bUgٳ!Vڻ'0 TO 2=g**}-g*=CHB!Pɠw+"Կ/!%sJuN)*|,t']) ɋRND)>Kл*zQ5ZSo %s,[\|Gxm ^d&R#gCbc߮J߿Y_Ԇ ɑ_E|$ (uҼ㍌Ut7d6n;u :3eG9~2XVͻ$lzz١,'@VkfAAg(=v 1.UKabbg^7ө(N[A@bK3./ ^J4GUUW1Ӈ{\d`qD߫Rwq:")q]jq6>VBʩ.@'>>xғX>gG)T:٘MiV1NI'wP4L99dCwu58@W~PLb.OBύ]ǤOOY!2@Ί<=z9y4J R[Qa1 h΍,Xy5ΩJx 1|ZT)ǎSvHb/gcwŸb6Ӳ~33[&tSaZhP]?3ynW+$~F9<1j\dw?~H0*Vջw:sQL¶}챥"Fۺ.LK;BFihJ-KSS˸A)ERJqu j;kj[lX*jU2ٓϤ9ǭd\tƫ4;bJLz!^:~R#w~e[SS;/|CZEUg26}9hƋy.C*U xúj=l`@zd l!4&} tfHS\^Zs#-Ghn&Eʒ,!cp쌲R`Y=4O&?+7LW,EM4O/g)d[E|P+nEæ{Z[0tCu8Jճu%W\kkIU:.jW9.$_?ޓQzʊж3K~wAӡ*3=`fY _xma]C3;Y.*s$Iyr׉>o js*v^퍺@a =zTw*[sN`ryyiAAUFZ@ˆ+b8HIZռɐP䮨2y;:E- 2tT}l&v5eFU @ogabEobbľ}39=gΏUoBLJ/V ݫRcƈK“^Ǟͤؗה֑4Nuʼns("cAN.%A6KO/&#bez^@Â7b227`KT}f{WXMU9KR~ oQŚkC_Y\6 FEfeŻХsuӨz@U@."=$bܔ\;PnoR#G|K{.K&0II{bbVq([=͞jS Ďw'k,D;?`ػՠ(3!ci|,)BXiiGz'zBm.yX+ꢘ7eyFO05#ˠ.m9!k{N\3_,.5W:Y|i;!X_4",-TSލ>]AjRK^ 8"T2ĉxZrYYǬՂ"c7@ߴ@JL[k^iOW;1;sže\6~uF Q[-)HbE/I)ƍA]ʖتe'>[.OHޝj?/Α*Go#qizMqw-7Z EUٟY4DQs||h-sV"yw)w(*֔.XҶm'Z^t Q%"Ua}|4gT:wPZdV0#7C+~ߚ;`H&=zL>|xѩS?t/1q co!€+n<#WEHTxϞݢkR[$Ճ-5c,3"}yxjh²x3y1lغ ވQ-Tꘘ%GYZ0fN榪=;nf3zfIСk(=dAdA {M nGRܹzerv۶A^9?\OVV<\Xj * LLe6&UYz%Cv[H0.hXޑENV:ؿPM+؟NwAI-|yjT8 Fg]P+zFzW:.]PgL v!R|1灥i)^-Cۼ{4ʔ|4 <6;#JwjmI '_SqT@Kfߜk7痂]tR΃kB|#et.2~P_~h$?dӉl~/]**x!iTn..V$Wydb|gQLHd1{{PM*LcR(.kzl̚Oq PU*uWI$Gpa24UEwE*4 Ng/݊>uЭM\Kޟ4JHcKNp/E.Ma(i.)dGҫdP(LJfXI*?|wQmdISPKK^umLU*Yaq^\Y v[ò_]Qg%Ʋ?3hАX*u=. hM 'K$tŃSHJ&ܫe)%ryJEm,]ތtNv:;)3=fagk饗czo,^歖fwk&[..}mYisH YEr}Pi,KSM4\VB6:`h@6itqV8=q#`dž,ʨk$i!m8^\wFݼWVwcd&gBrd9kW ʮ>R1Y;.W|v:G,#LIR (YP 䫹#K]_BԠ~jj ']==%<WmeK62=@9xiH;şN\GS de@ 6b`_P]](²es#SN\-Z?=jV%'ie5`&b,oaoty~ۼ2|. zّRP4|ӹR󹟝=]e Mx6|WڑttIߜϽ|{yGM)=KR;鍐*70.@.0Z5fN& 2yLw遫}mG:~k݃[qKA0yǛ ]P).0د2>{XjG~& Js>(#,qU{>ݣ<9ӆn<@Ɲڒ;qD K.}ד.d:=>֗z[*zցHqUB~l=Jd=VxϑQP67}2˼rz)9|uuH~I҂0.Z@Qϔ^N i|J퉫ESw\[{nBZzSs3I|.K%u0yʶSwtQ bbdi֬trԬ+%flg=녛Ȧ~SW%z9t0'U5˥C/Fд1ta&!NIENDB`ndoutils-1.4b9/docs/html/images/fig12.png0000755000175100017510000013104411253216103020325 0ustar baeckerhbaeckerhPNG  IHDR;ܻ>IDATx XT?xA Q@,PBDSRf}ZKw>)R4i&OpBRq|>VPPh)m0M>^G-nN<)Q'MTPP`ooOK.]`-[+ ?0t¦q!N A}5k;Rz63P!Q~.*8)踴,?)o /A̙3ͣM/^䤢nߏgWGqJTCѣGӦML&QL]T?,@ j1Ht¦.P䝔A8dffҙN B9s游VDonbbd$%%ER!DFF (gPҢe*|l::Edjj Fu)ʚIܹsN'֩S/'6y+4?4@s$Q̕qPHHHs9qIjj*G lh܅#ʹ^)ivOU{ݻwK#M<Dg}ٙ)lܸꤽx1-> |FblA>*CZxm:4%\֭[aK8Q&Q^?~CSW@1>L>I1qÆ ӦMj@{j1NjfZdIYYY3gN]#;v2 eFVnD1c@ xORA2hhZumڴi:UH޽5!/P QUiiiH +%ˣ5 h1.ގJJJӃp2;e:SI//f6*Tťu6OpͿɓ'333 ^oҤa݉ŠG{{ ChIHHhQx… EdaaAɀbcc)4zShꧬGQQ5Zr}X9?Qj'ME_3qÈbPN(P.),,.ׯ :36%%eСyyyܫ47H-XTRQQA9sH͛Go)񀑎|mkkil…GYMEX@a¤p5kdeeǔ(>L&l'\֭[7t-Ġ={ҩ^5leiZ$_222**Jsxrչ~zևsx%V|d!-Y /! oooɓ'}T?&`$H!B #F 1b) 0RA`y' cֽw/YZZ!D^<;u[``-WZZ`0(F 1b) 0RA`H!B #F 1b) 0RA`H!B #F 1bAEW!í :TxMqn@`Z>UZ]M\ZڧJ(pqnv-~t v(գ4:3s̬ꓕ=t&S|V}];wrencPA?8/6+nWTтIGWnѫuмPCjxeAAg\w ޾R,x̉{gNM{(1dy$O,bTfdGϑf,K~%_-* X%)a;3vQjc @+DA{ذ+Cs 4/ިϳ|cSeOpR^_WnQ`RZϕ(֚m6{ IAzD1WRN" G9ũ'^O:VhT !Qɩ|lq0L@dݷ (䛔\lB;E?qVK:B[%wT4Y ^ug| 塕03.nCG1HY_>qH؟o$ס,bݷտ>Y }=ylS U^Y5}i0'AFkׅ cgj@_$An :Mm^d],E<>.ϜWXvODhYܷ$i?nhJZLGx@gόeAǸ7pai e'FHLN(gppqfs.]%;ul7/,8Nմz;i םc&Z"%ű(. c@1KCWrOXOӞPŽMhrFyeN40󻒬K7-ϧݙz,?D]4c$_/T!7*zB 3| Աi2umܣŢZ㎩YWQ[r֠U6tP96{2+?PXz1bAvt센=&Mܨ (:ԏ;7A!!1i1$L.(3C%l4s>s`OJ Z:DM&Hvלks@c`1{]/96˼ h Aѝy49|oyyI)={ 6UTXxʕʕhŋ{h/g7U,)L[--]F\ԹL#h&&=]\0\[^-Сsiܾ8ǎ(QbTD))))mJO_Txk(c~J|Qx蘡 hqW(PO2h8zK6yyyܫxG>w#IoyYGhGDii+)?drM>Gb<^}9WӚ}\2+hwu,Ǽ߸qml<(Hj)Q~xtf6+-7mn5@ Сܧ#ŠڼBر0I&55ʏA- 7}4pB4b޽gY{+`bfv,XcffiRD+^߻iZl:@ w P.W\7Цaæ2|}KJ2-H 6;;9ɓGDžj }T-!QI1-m%Y_?D&zUjжfŠ؝훕X0Q.h -嘷- %;ƘXP(pC qٽ{G Okǔ-p\|r NKDd a.I{70TZ]i7{cpGBNCiIO^ LȈ0D9:Φlě sb~*PUuK"q;6C99hh'7$I6wnN:ܡChJM)H8ؠ?ׂ وf,KNG_u"޽.A/k/qI uJ!IOhA?𶨴>ˌO:'Q$"h)Z"mkiyŤnl;Moz+Ҿ. oVfP1;GSxަ,P-LmyA^]ܝ:~>ѯOޥ=:ul'Tkj",g`Xxآ#)ٮ9ыcg Ŧ*M*1c/${kWgΟ%b6iֆ-ЯX?n@VlJWݼG keSi!f%*q|~hʹdf-zpPȺT++dӉgӏeBġ 3^JShY+ShNGolDQ| ^5cY\oڑ~(e&rrbʛSҾ;ƞ87;B4ټb v{Ir z/XфS~jyH8'+}D^x( 5 Gㆦ=d htDс~ǹWn{,v ^a"^oݷ;/*aD19A:y8ۈTw؎*g~/#G?\yEzQ {{_33[^#~;_^R7 ٻjUE)?\{>}VT|;77`/,<޳]^ÔNy(:uV*Q ʪ--b ^H.2iՕ6oY$eҦqnJ7CΝ.޽ܞcezm+'ND>FxD5Sɋ}}v'[rʽb8je~7lX1t'>dCFD-B1H ~zb_Qh8*ϡ֛Q%}8Jvq پIZc%g5/lؕ+&PڗbO޵H@µlYKO_5xOvn51Ҍ߶lAo?Ξ]ELCnh8z88sǸ@II&g}\rsJ9ii+)2P9혐0Ђ8*4bPQip9_s^^Y%9I(|c݇ J>Ot5ЯWG>-gEʽrK|O> gX DRS)=B-JԂAZ1J&7B?S$?^xn<%ĠKjll<<=W&$Sr#V1ZVĠ;olT!tńyxZ񁯾̑]i. ^u$W{-( =z/ У Sϝ6ljv&СAaohGZIa1w+Rxު wUUVjhA-tŻ Mwt,8Ǭv2EoP"(QܻYi>ROW> -ZX:FYg󤥭mB Š߯^y9//YL_Iͯn dC'xS>{՜8yP]qJq4FַZ) ѐi"He|&^]];}zMq񩲲|I1[r3Z|qǗ|:06͊A GxvsI̬sڧOKMOH㏮J<#65z4ɼ@w Dj KphWG}yM:J5Y8;5upqЀ" e Q$ܯٍ(FɓGׯΌnĩjhn.ݓ8s  kV Ա]]qG3JJ!CD Qm4O' y=膛[Xaq(Q\U;Mz\sSR 7,dgӃhBa&hI~Pa1zt]:q"sи].TT`t}i Ku=>3tp1wlr wUWq(Q;ӈI6u,T`˖TW(t1e#GBgk@(͞|.tT `e^P"^W (ٍa̔^QVv+c^B=C P{mIO!hGsF @Bm֣Hin[ws4qۿ<եek6JkƎ!Q)VV?֭\")CaK|\9J3h6Di]EK!}8!`pi盶.;j_@1C #3jp_. b)w^W|9A`ºgV}`xC!Q lHEq2TTZYkIG)빼vEwʢvK|CB^k꺜9%uC*}&dȘO_-jsdm0Śi 4NU '޴Z=1lZ<8={~D M\pss{՛JN!Qw[#=  c-S+xaGݭհT2DSzlޙpлA/CL c%a$T2RdQi4g /+˯$)zBg!` &e]I6y!w CҌzqAn޹S@Hx)ǎ T q ?fW\9?Ux(}FFlN.]2N((HztW>|1*AV=tЋ%Vܫ!07olޒmgؼb-Ӧb^O a.Hرׯ`$~jUU9?[~P>} %UWWt"J6S V鉭 /~WB5TW̽{7NdŠO6t^cP24#շ(XA1.;?E,==3wḹ}ѐg砜]ߢeZСkj&4 UT!nudA~q jnf==IFg?NZ GD.uká2ss{"J$ڧޗQq)>o_g^0 8:͛Y#}iݠo,BF B?+AI(Mc'wΥkQybP;t*M*- ::wG JM[ 'd1g!` =f bĐۿыV>r`}7bϏsg^=yaݎ3>IG hZ{ **}z @E0=9f-̜tɵOxpO󎟬\k - á)f8!5vY ǠNۅqQz[[K3ECl2aLڒ(tkܾoW'J@C  w2: M!І!hbnf3zp%^9ВnZ:NmP q}߆r57  qІ2!Ж O>bϢCA hWay61A|; nǙ @[歈Y?'$w+ھۙw ;11d//Cm@ jEkkn Bm ~4B_=;/MOV1fwxɄl 61gޙ;zGN_w['//qf'ݺuw[YGz?-,A6ew6ުwCY$dȘO^~U&B hY?ؽ{Yh" 073׫Gzzz~~\.ws)ȪO*h &jM6d2}7 1^ 6[NmFC hŅC 4KDDDrr2: b@cǢC!4עEN8q`}1|||֮](Jh( 9a„۷C t" 1k֬L>]mA hk׮ݸq#b@ hRt!!!Gws~tf6}7t\; 3IӱZT*_dt ӧXb۶mAb@Kd!!!111r\MZXhhh\\\tttRZ5 &tEDDC5C hy!!^̙S\\߽{-[hF 1@|||ryC:,,,3g uLcu 9rȫɓ'y933* \vu4 Ann.%'{{hm !hT*]|9wh.Lhi!qB xѣGu:# Rtyxxx(鲝F1@GΝz={rssi!](!hbd 8ŋ5&&&j1B Ни褤$խ:urpp}b!SsΥg-1@ w C2L0jAaÆu-F 1@r_\\\hh(:1@! \.wrrJnB Џ &l߾=88Xm0RAv@tbޠC@g }ZxqHH_]c@{)00pڵQQQAORt!!!GA1 =C T*}7(yzz9F1@.\m6 ]B ?L!c*EGG'%%-1U@!3f̠uV}( ro޽QQQ2LhZ 6[NmhH WWWfVѣN:Dt^mmm5))_{9,,PSRR$x?333++4((2,!!mk#1hΝ~a3cSSSO)mRDZ5or978((ABףZ^/`l"##'L}`}-k1N?̙3&&&!Z(%| J-ܹs'ZN˼La}ɼI!LA8t^^L|ᇴR6j36>>>NNNk׮ DLg߿N)pЉ=z;!!)+:sϙ3gt&.++˗/u˩NqE]:>)=>e::_x1٩P&&&JknZ]]M?^9tBYcRq37-YZH+((]jQo??L%nݺ^jMT!}TrڴiM;vsq eDiJ{q(Ȱ&8t@AttS۷K˻wﮪ4i0YYY,,,boGZZ3:)#At,GGLji_JNox/xJHbLIN˗/sb9K G\yyy&AQQGF7sǏNGmڴ)B5RM3 $QtQ=m6QQחNI tbK,Q$$$P1j@]`Br*x$Q W: & @mi$6mqsse˗/S6ĸfaHAu gK.=sѣ8Ȟ={::[:t#0g\ԫW/IHH0'66@I˿K/jYQQ2<|>f J/_!1Dghe:Ud:K(Θ1cnifɒ%#ܠE~.\ =gP#iĉ(asWWW_~tΦ6y(CPy&ddt'O]2_RKBznŋ9 iBzݺuS;/J^J{(bR%t$\K/\E !JM6;H7ߪnӫW/={xFx[7!8 8hހJQj0% =o6XAfʔ)od~@?L& O^ Z\AMPW QZߜa_Y-) "yNuvyC6A\)@HJB| d7mUC(::Z<1O巪z{2,00pӦMhYA@ Ǡ۷|vhA@.Q W; 10DDD$''oذaݺun @`C(...44B-1`,ZB-1`:99}QQQRT0xA$22r„ ۷ow[ b!qrrZvm`` : 1CƠA%qX\ǧo߾k׮E hD_._<$$ȑ#b'00pڵQQQÁ`xR):1 {h $JΝsy'''}7 !иؤ$} !*L!Ã`C(::BM`d2ٌ3!A-$$b޽{׭[ &BCCe2`H ^DDDrr !(ABM[lyxzz:99}RT0 AmDdd o 6iڵh Bv+}ݸq#b@C Rt!!!GwsZ;ĠɩyгtN԰Ċ{մɶfhJ]6** 1^ZAkҳy{WLR*-TZ@:NbI禎:Jl2tKsVƥ} {e3nSOenE7YHҐ|\ݧMonm4k׮}N!C!-Æ95}7sw{Wn֝?vyyy j\| ^ӷ`]\FIxٹ}ХK&6k]Ġ؝asXǰz,3묡d[&&ԛ~z\IL֬?,< NJJjԎrsػZjXkV\|>>~F|͛7--bп%m41}Ŕ*\t ]RRoϞ=OFz}еkaúqyK&O6r{.k˫]pvwx_~;6Ǐ;^~N&+؜g)J]sfNt7@Dlb_l2#^'DTCԖ3oz R1z}kAS% RF ?X{ k͎_'ԂsYN<'N8C.]5̙g&d2QJÎ%ZXX^^~=/&9^A{]])oܨ`ġ2PP+-F#>x eS?|x,3f!HMCaWZ0QD,ʭ˒[:Bۅ濟򰺦[ׄ!v**jV:ݼ_Qq&?xp+&f"zjFFFvvSR='֩!I)*?Q6*-j. Fݺu1/YZZjP187;\{S[2!,9lN!)' Gk=$( D)mu7~GJ%rg5b5Q\my.IGD ֌zv޽jժA5d:{z.A^7YϚ5Qx UG?~رn:ըQw v5T #q6znFFٳ2:^^Lꪺ(+(7!aE7)W^ݼ?b̘A'ZGE5, ԃ~έ].-EV-,((strXg"h+mkiWʿO>MBxvgtQ&NBTۦ=p^ )& F( VE H0;ƾߕϸunrՕκgCb 6Q0ިWqCQ9DyHRdjh f޽ݖV!"""99yÆ ;jjj֯߸lYz_5Vw"{ӧOcàU,ڳBOmi#GEE-tLf"݄ /ؑD+J%^|2S9gHQ~,5-NuT˺ow5i*])&M>sB@(w+Zv}?O]8}z /LV/s@p;w LL,ݐIKj۶U_gl=@͝;gm(Q\xk;3 =ܝefsR*ljRg5w4\ڷו*$mԌoP~XzvN A >w.ܞ~U-̙3w^WlU둞uJ+wbȈ-.Nw+"((i@d2իGΛ7[wO|\q];B=к*1xJ(IIL>Ȃs Q<'B ~^ՖWVݮ~9E+/M⑲K 9"̬YG(.wCZ:;99/YDd{щ_mӻ+F^~* ,^P4Nyyyimxt3O7tȪ^yD 7~'ܶR1[K3a*-ΪGa]ZV[*_O{bTICFitDfB2=?_e[M^Vdd o꧃suߪ ;{~j7ٹnZ@'J<8B>vlŠSN۷_vw[ZݻҥNc1j0=9>ܽ#\f/QV.h԰D/ IBㆦpc8Dt =x!xLZʹC֥RfBflc!v@5W?}+V9^|EVݿ\>sftpNKK !cvDDuu[[ ;={~TT3~koos׮&RX#9?s rn/6@Ӊ%gz;ihS;ɉR[RhYk&?ܦɓ7o(-WZii)%7رc j;nwt[M?edg={ 3kGS1ȘfݹSgOFi99yo_R͛4c*/ޱ®]9|NN}SRJ\X#cFqߙp˵:uli`dgsaD2+;Qԡt:$g)P ]M;%gOvT:4h=s9I~^CUV:W\qvخgwG臏O߾}nJ1(33?NNN}БC5=FgzΞ)zTR22ccS:Cz{Rk:u6~|炑#y_ڔO :NBFĘ'BFkP?;E؞z.6dÆ!C6zxL`z#G>7ߔ.X0`?M+ˍJAD)xN^]hL4݇r mmT[`pD|򐐐Ç_xQXw﾿5zx 8^xc] _zi-** ixܺRMREEYpǏyTw{W4Ç?rȫڴCsv)Xi(ܾ}e2uEEyr7/ѱ֣FY99m>?eddeW9B+W*޽ox\xɝsW&a09r>׺=yܹ?/СB+J!VWWLm=bĂ< h^gYTիS=2>}9]e'Ֆr?t|G6[ iv)`)jg4nѣ'J 쪫M-Kݺc)g=[jթ̒^b9hP;(]Tvo--.K)XS43jxUdMc<Ӊ0qFn@ veZAӅ++˿sA>P]N@J(ov89hEl=49{vK$^T(J*QQRiGc[ 5GX/c{yb[v4thѣ&!<4<ܝR$)/,99RQ]\YZv`$QyqͽvȲCC-_^%CCcIEËAыpOj&qC xStD̖{kե^W\G (Ig4dgsZx ر }ϫ}65@w/-Z4RmqrK?k HR{5.֭[ ; {5hYCh,8txo˗.ݾ۷:v3 =&LLGo#G|~?a U1fj"1/%fNK7sgxSq C+E]\ܙ&//);{D1PiĉҬ=\]dr0??'N[YYUV]<(kjjEF: Ii߾vѣ7TDHnرkGo߾A`ݫ(KvBJVqϽqQ"Џj`o JOn?|/{Fl؁ulQڷ3/A3ڵɠAªWZZ?q//0FFQ_ 2I M}gqqyO)(H򊱳3]xZ-SJ6eecF h&$2))f…ڵ$>\uuٍgpC-ҥW_}f͚w}WXY]]P{^lS%cRl=JK 3\SS7Hj{'H۾ ,CA~xtff O7>|tcCvv=d2FiC?~\O:b  =LYy11BBN"v341\BAbP^^Rz*a}k {O[EϞ={MyBI׮2]8 1vvULCMsnIw 7Vշx*"WW~c͚Ӄ?j oiQYY5M>kÆ-5WZhrMZf!+w3eʐ^O!oǎ ]:u}'h%bh=],JLjnnbP[r7$ ^P`m=M7F*gg͛y?ߨ]zGK6=7,YJ!6ۛܬ4PQ Fsoyye޹ vf4Yhd4y7O})fd dԄ2B~NٳI[>{22j'RPî_J~j]L8HyyI| 8zkiR\NoGXЮ]'>N>~.Yˑ剉=.]2=}jރ/hO]zuKլKQMMuν/:Jg4w͛Ylκ*o!5JmnU9sZo]ߓ~(ƍPdyEQj%.!4ߑ.Ϝhcmv45,1jz&=zzVF\pW^YUVϗq1IDeZkD8XYdH}^^2m! Jj'.*(H5[Mp'tݻo٢뇉 Ϲl.]~tiPZ]8 .\XfP¿e~ 5 "R=C_wRX9t(X|(=ifAOZ@ِfyyyO;jjj<rZ9xp:;8ڱ֩>=[㏿?q;wwEF=EtƠ{J0d2x޶Oyh)R R]߳Ν{2==0SI+<6KOIr?gϮ*=ȿ(9:ΖJM)+W.*v93Wp5ȕ+Gדݮ!,,,o3gy?[~իѓ}{z6랍7ͥo޼:FFF s7D]3KiiSQQ0;}zDI4xcԴCH~>2ǎ\+Eo<3-_E/̅w;JHD٨}g8q{Ϟ)H (@y3g6k0a&'O="#s¯w){#n!`癐菷;PoYx瞓|Tx9>[~遙YGG>\M:333K~_w#FU-y\:יAzs'?uקZI T۩R~~12**=}\hhGIwzj짩S&+`FgҤ[vLlw%j92j1cBt.8]L^4n߾}#FTat AJ(䜫dw! A< 뼵 ^CvlٓV,fcm!jBt*x~!Qgl钲,.ϙtH6#K<^@l?^Ѽv1+I.l;K_5 E*zlٲ_fj91ԩΥ54P3c)~rTNN"eΘ_?̟ΡCXvhU#uviC֖Ȇ>䓌 `ĤpRyZZxjU2\]tS\mg9}r:559qFٳ˗/wh # ڹ/U#c1ڞ2|ϲ-mMe5Fl$Ykes|򋫹HrS ]Ι*طZJ6I E5P#W])؀y/+UȔAw޵ÆAtm2jg}}C3ɐ** \)z[5z###XՈE@y`ܻ #pzޜG 爵]Rz.[0=z()9Ǥ4Ϗ(66633m战ytrdѢ$zzc~nۻTTTt7 4iRJJ;=:X)@2QT\PВ99EIM#!rq ])FEg9ر::-̋0Kbm>An.8AB?<@V[x:2MjW8iC~#LwݫHQ*UFdN@ 0ǕԒӋ4 kmpm(/Ϯ̱ūssYwtѺt/ p4hbxQ%H66|D"ٗp;;!Cs$͔={DSΝ@z2圪=6֭ze ČךO)'>~L_Sߝc&!agr *Ƙ+%e(3&D|~ FsLwحBt8i^Njq(ZIHPtl4cY׫[TL7.qzaB2I_..{y\Q\H5H4`ذ@|Nܔ{\JDC\W.9r$O!ݻq4>چ)}Ɛ!tIzz}+-O{[?ot{y-:=H (ÆpKW ? *G&(2mS݃MjD  jP~qAЫM|qv}%<biiݮG2k埆Oч]pȑ-NV(گ: fӦ]ox9yOQw,.z<=gzzay]}}q f8_lEV}+ͼx諣,eXHK-jZĠɿwðt w"S%<ӤA-UhW^{q\ٙ$x'.[̛1&[ظ*ƺX0/S7Ӡǫ/ \Mqzx]W!qOOcUANNɣ.(GH4k.9rPxJc)CA66}zErNuv_nmmW__<&ibCE+>"`ab]=\:7L2?zK@|#+Un}Nwl>q"g۴}]t)֭ YݨQ}>bavd[zR~yP*C崣U&wۍ}Ѱ ag춘(?~^ses8jԨ˧*m1u:Ao-Jjznbo,Lz2.4NsB8!byø%-,Sp;ju7ܦe]^#Qν{˸X\4E ).ʕ3j#jxR*/B8+PXQ[ȥ:^ #Qttt_pr#w_3;={2WZ5Jct6Zϝl9Q jwOlv'i}j {ZwӚ>|-_1j)'NDb.OυtH<7g=| PI1FQ)'V?v%*R= @tG☑= l7EO_ -]ʪf\n߾JWWV^Zҭ[ieʝNIAHBlooOtcKA-ݻ!w#):V"ӈ+oD3AD_%)ϐ|dʞScƄ:}:~2\()iHnlHs욚sNLX_t+vdXvWZOO39$}^YYզm7ij#߻% XHllCZO!2)+a"L.VVYY;B*eԁ8;򰚈!]շ iRmtC)}c0e&w4! uN/ zs3gZףGaFtkk(b!1#m/CNAv^-SmVb*J!+b1ηi=Snl46֪k )y h֭W A :~qpԩA99ʘc|}=Tid3γEܺU//fߒh*+?X@f;j ^UiPG ͔)S,YbtܸWvKÈwtE~Zt֦՗ zs(*^oߊX:[3yS01Frg:$L:{к;.R.PQ`54ԐrϜI_]ic745[i,+-wAAbQQ2ko&2հ8%e%sp][K$P'։"/.؜Ġm<ґ# 6j նqnbh|ݻ; &2!Қ>vͥà0$:**ʪ`(]Qq?~cPaҝ}' %%NpUg jՕ?v\7tuUmi<--ʪo;F NTeFX޽ӧcg6 E:qoHs<=[[-n WyӧjԨk fu"e򰗝9(B { qOKY]]9w.<z8DM @{ݹs;oNr9ˇD hڗ_nU␽ 4<7+wbْNNdauu%uu֥Iszx8$$gO̙3~3~RQѵgW Arݻ# Z \*d3sG^Tl7PlP/Hڭ7o^8p~c7m]%zJK-SmCRBݕ]txllxl#Cih>ZC86Hg1:>4%&\t҇^c ! 2p 4.G>tyvn_ 'f};99JqP%2eL77H)W{v] HG<]+ +PUCsǞV)@BzOKr-et4V{-tIacc5|zTzZEmmիV }qC?AIt%Ss͞yHOv&Pǹ;ÇRU;;ӫmwo]{хaĉrqUVD!Sj;tR]%&Q"*JN9_qWL5řPI1].~z t rIrBaa8:F*ך5ӧp++%qs(qY@z׽{oܸ#|ZcI` Ə\&[ّJHzFe=ZTC_Q&gȔ& Z`6"-/Y]~nn~oSH(\owuadMͅv_ja- 45Րp~"鰾(F_lHe2'M8}:(ygkՊ8==~3d@w\]Tc2Uwvڵ$+ 6}=|8!-D./]tpm˖ '8=9ꡫbbfr+R(MSn]yϤI.ǎfjvV IHzx6.^ qM7]^?ҡMHИes|U4i?Վ5].@OR#G^}+ٺ|pA%Ҵt-](2I ?j stW^5v\iz q|!}-كN$"sx嵨M`r&L[`zA ={vUuu#wܼyDoP:!a.ӈ.CJJnpo iHnd$1eߢ:_`K?vcٱC^\LeBÇbNt 'xT"v~/_ز'Cz&HU 9"-,7r}#kDžeeysɗG-c0nn_x!2Uo$SEwq@2DbD鹐剫%KKTˤ%%]\&J6?BZRZz ,=VI_oZd4hŊ5bqb$$ҥt 7rÃeVqL۷+}eeԠe@TXX'Nd[.9ĪD&Dթl!hfwֽWyMHY]%NU++Gqat6v66}oܨ߹M޸Q֯[믟)לм\'egkIOgǎDX-xO5T4˖/OkSP"SנKulEE[ܹɚ@~}}U%aSuL.E E͠z^]6S>'N 1"|6\p,MMM"3ѥ ң3gِxOVuIlx#]`Jwjl8ѥ[df-[!z)y,*Jnk< $LbC1u jjVfxK@xzɽK^W_*wׁp $2TCiG_")S ]8G?4e"˔q~ #R4|+&f4pss;x+tnSf+ WWm4)Ǜ8MB&;30,̏,DSI17mْ@qqT_j^؋LH,q-v>~ Jm,fOuw kL/`i鐰gK?j}Y4TI_v?RxаaWDic@%/_ ay dP""q; rh~Cq!C}t"o%Vv[QQ;RbS61h-zF^b264|x?|IJ?άYJcF'$̝=۽܅Ʉ .*.y`WpN~~Cz *wW_* `4L"Y)\|֫S QL[܌zڠZ _\N/)M6xzPno`W)7x<*'S-++ή~C`U@⋻Ɂ>\!( ٥t}0rUVϴ^={v{|i8ij0C6\߂[j$ݢS AKk7G <;|\9 ,z}Ԩ厙Zrwg){8)1bINN1mmaC?y6"j?䓻ʑ~V$&9ig<"hp_7_V$gZ[;6H/sVV=oݪ_^w))elWVVz?W9+@FxBUplE2@R"[>]k O:"4(--޽u#7w3&\]ȟn̑N\mJJo4?zP?T"+' _sG<:+f-T3ZjUTܵk.]B 5eڣݷoEzz3Ϭ'srހe~|ʄKrԩm !-xIY:jPCC͛W=<:,SנbO M}Ý{!؊>PqUM1r@p! Eth|;x琠\fbII Ȅs'MZ/T=F$745LZrg^HQUT#RXX?ŋ"ܹnk]XdA$43d;ȁ^|qw@2vdϑ#QA?O|Ѣʏ_R__%jKMgy{4T}R>yƌΥB (SNi0] ?LL].Vߑ&oGmkiC286{盛r,~ʕ nggD:EDV!Snt6r zuvʕ"PM G64=|6??)*ju0ML]d*+[Y&Wop M6,V摞Rjz]тvP(}WK迧O6MN95{vo(44(g (*+dJ2F ݻKZtT+0p9<|C.5vlno?=:iҒ֋ߞmk |1^[*PN'ae4| 82eL4> rqrL{w>}_˓de:1-mE1<ŮΥ񔗟×=DO/{i&Cх$=_?'}V!LҿuV]V'NP :I&ccy,S R"wI#+vL7FEpBjjjTTT^^ԣ>zZcCZ!7Sn~?ڐ! }}&ȧKyf=Md?fJW^ yҥdZT̉Eo xݚ t?.nC#'T 4(fAV1R}bof/˶5MT1 PL3g :w550tj3>⌺JU}\GOr3qb%Kv8K~PSswoO6Xt&Q $CeS tzO=5b%%ut9d1 -Ñ^k!b–ZٹsݻwO8A۷oOJRw7okm{JxMH\/=)0DiU-QwFzhPII]GmL3 aQN>6=8g~8¹W^ .Kmmmtt7ǿILL+EzUx~r+ϝ׳bD K 4Ҙ@=iMZbΝ͑"G zؐEBcϟ|Hko={ %c 4ss͉| jϜ=/TZ7d ggoӀ`8p@+HJ``ah<{țZʥoXgVHo74ܵn춘"m Q([nĬX\3f 7Vݫii;{'1ᇳS|l|ûwc7u#"ly_UU2˖-ݱcʔv2_zj_2N˝kּY]d'eȮIvvyXXƟ)0w , rtt\ti+yKN_im3|򹌌)SVrNCCٳG 0ϓK,qqz~~C"cZ{ge>kH4hÇڱtooiִz܂ ۰B,oo܂M.+K={Գώv4v:K'|rÆ?_Bdy睇v1s>u*~䕝0~Ĉ'ϞM}?|?//؍@TQQQkڏGǍ0aP"R(~*̼ͭzD3L}晅Ϥ/: ,///ﭷұc嗗=5سg i w%J "+++77wӦ/N:sرf=?p;?7ߔN7n mAX,QQQKQȑ#njy;E 0ɣg>%%ٙ9(PΝ(oΜI//g#;qsooo3pȑj%yyU ?p~jk>w˜1C,cm , oSFTTDh.Aԩ֓I~*aCCCaa!%>՚ 2e޽ۇ QA۽$ӹUwO>}st8aw=u}䑱cϙF| ӢeVX>C-tG=, *?[욛 xz aп51dgg[ 8Ͽ͛7ڹʒӾW޽;}< 2-+C@%%%+LC4 zݼyحpV" ,͛7ӫk ஠qց`il߾^#""0uAX 0v[ԁ`Qܹ]A ,hooot.@+(22 P(+2y@' BGW hBغu# 6vC`pWҥK0'A=_~%wYYY-`N@0{y h+ ̛(kk+V!`~@0c0?A1{챶 3vC,`&%%+ 4se`c7hf wxxx-`@0Kxߌc7F7vK0?F5}kkk8 J QWofΝ;׮]kyA1̌hon 7 4vC`N(O>{̙n = ̉Xc7,hfBغu#z]A1@ǁ`6lݺqҥnX ̃T 2v[B`DEE+ 43 555///22]AGAQQQ+V0vC`dgg兇-`Q@0u{=kk배0c7, h&MaaaRR@0i6oL ,0vC`pWPHH4ae DFWh&Ν;׮]k  on X, LHc7,h&BgΜi% 䈏5vC`Z([1]A`hAm xw.]j HMMxbtt4"** ]Ai@0RSS"##4S!**zŊntAyyyn tA7o 3vC  &%%+:hg`c7 ̅ BBB<<<Z@02|FDD!`LjkkF1ٹsgssի@0g@W###@0 "66{̙n tQA*2֋Y :@0 b֭ ?>.^o߾111F|A nإK֮]K%%%@@0}ҥK[/6|'Or:;;@Xm߾^}}};={G:K.TKzMLL 5ܽs枉@mNNNDpp0\y O^z-[2ARSS򢣣t$??_vww Ѡ{ov5iiioӇtw&xIfΜi8Ya vnٲ֭[|9Ovx"ғ7B退Ԡ(]@ϧ t @ď^c7 |',)))Zxqkt9!!}-ЇKzEe FcW}bCCoxz;/^1bԚAW\!}> .|NT``ZZyZ?:jmhhaxVTTDŨ]l2ʡ|JH ommmc_~>"":PF5?8wГ3 YKTT=NwމGrll,%tٳgݻ>ƹ[ mS!)Q LM!K,oexaaS5Z?a 4jC z*رO?9@mm-={A+{0Gp2___z%?'ŋGAOb_R]]MrSE-BWo?HL8bX~9sꫯjssslllrvDUIT?ٺu+%xXn͠W>fj!/z֒ǥ)m^r[oQmt*J>sI;vL:b V4$S]~@yMTב͛7+~dڍj=/ 99W^G,?Yf?CLoٓ.<[(AtWKגj6^^8fG9 S2Uw{eA MK.2,[[3f{w#z}]GM2}$@$%%Oұ+H,rdL zjG/?ũؚ5kZyGH@K`9Yd#Np`ΝUxO+7U#((Hk>IΝ;IZC>}755qB>T__ϮCse\ku> ")))$$tZQJKK+LJТoC wرC:l <#֭[9qD1 HG9dЮ^y$挋S 8j-}>iiiZ+%Ō۷s$ySO=oj#~AOhh(OI~5`׮]aAJң'C]U#Sɓw6f1~$T^.o= .$KS5H.}IE?!s^}U6!4ӷ]O8O>ZETËtVmrڵkI1ko6},@ sիW!~hd#Soj $]3Zjbo% iAc@q`2Wrqhi̙#V3&boS)Jw:]S wy{{w|;B4VskWϱ%E4 DaVvj) ͼyj =ɄDbʁ([z{{Ϝ9m4 χzMWUU! Z0e]A 8p@UUUtt@; ݻ{, Bjjj^^^tt@; BTTā+(<<]A`@?uXX5A'Nk tg6oތ 0 4rrckl7Ҝ¤$7-SFA@w~[_׫l޼^@  7jkkSSSCBB<<<عsgsssDD@'Aht @?pWի @444DGG{{{-t8p@sssdd @( b֭3g4v[h%>>*66 6At rttDW :Çm@xw{# :D^^^tt@ @;I({]A`@h'RkXX@hjRmNAm7w~2vChm4m~Au 0k Aq&Pb@_?V`ڄMx цN:\k:i# cB[v=vmVBMQ5J45+ рο:(O/{ Q >(xzތ~O 55E]A`tܠ'm!5( h+-1v+,=&+h$OghlO[?`[{7?k r!М+-#64#|Gڭl~u*gL^~H8ӡf%R'!xVt.x1[Z+o&ؤн X  {IDF2ߍB+=cܴ\8ж5A㇕ؓ|Hhk;* fK/;rFWZA8YDoǾeU|wdL&qT6e{>tGhP"T4D +*aع/% roKs+Ü^x6FK5^?7ydJu|.پ7K8tlAL+{bhιJ>1At۵ai ;j[>`pW  SV Ý_;ybHg琦!DNƉ.BTۻ=G)#r/ǹN :`Oחj{++^ˡ3I)cI[*m 9*jn4i!*6t]4joS$F|Ӓ:mMC'SS %eӱV}_n~:Nvۚ ^oE?Rkyk3d*ՠ"Ghj8UIpJ1d2uJcqpr לQw ]A`yt:Ÿ>)&hؾ7KlX0žm~qZ^6V-݂pt'jQx^F8WF>${XL[=b60:ҚBW׀R~k_okty.ӥ-Y4+tژ* 7ۻWQrl/1dcy4Fs0ߧK+yz+߱] 0+hotb "}atDDE4 GsDiV&S3D!l0el10Uou< }b~_O]½2q抁Ì>޽Y1cB||„yMMg~_vYAK/oZ]S?ByxtxmL 1ɚ^'/3ĝWh@@ʍt7ܦšk׊ be7eO! iWI-=:m o@GV}ktc~$SEvk+[ 7WPD ggWKO麍w`i}}WjYPG>RvDDEE΀n~~kF+h,5HѠyqFƖ䠠mnnev-SȚpL5=9.n$eɯ|ջ+V֭vMM5ee׮u;VGcG;o$悹j0+$%mmY_Iݻ}z8GBSQCWgB*,)9G3EdK@K9k֮@|ĉSР~SU1 `pA250p#p С~KSfcc-^zMM5ZY!2$4Weed NoHF%%k:usQQqMHdzv9isuu%Zy iPAA\IX7t@Z{.%$8= `Ø1O"C66eKonvS0+Р. yʦ_׮:sTԇ'+kL ī._N:9TDuI,Oׯ):zJJMCggR9[|NyI(ixg6BfC}mݱ!ۈ~Bti)jj y ׀ 2䞴py2UCكCx2PR$>> ?1!0z?~uQQ2ČS\F4MjNtI-!Ù $wʆE37zo%'(L%Wx3;\$Nzcc=)TJJkU/Rzʥgu҅ &^H-.>J>DDQw ]AХ7@n$- |1&d" 55kScƄJ%@*-v%Y¦z[+zӠWd[드2 mߛ^Ut@P_~O M#g45T)\%keKT)7CkjN)QmdwFm]cca-݈J9.U55+ĽDN0 |ٱ/˺o^3vCt*֠kd'?"1RT:pÊ5,qUTe'Q<9z+iC0+'пq;Us_liIQW⼴M1rӧBM' g9Ia5H1rs.$$(\qz6}җ-{2JlL>-D[N>$M<]RvŅ9fCx ֚|zFjދXCuj$o~@'Vܿ]#̄ع/U#c1ڞ2|ϲ-mMe5Fl$Ykes|򋫹HrS ]Ι*طZJ6I E5P#W])؀A஠es]ӠY%7d$57sUB':zpIҦ̼2# /a58x;W:ۡCC—SQdJ=q C|Le< F0;թbt&>3`p*H7 `:O\p܅~xud<57ʓp!|6jFy3Ɗt^=DZRi7"sbb><^ATXkL{nkEfyyveeU/^͞P(RzV/,)9>`۠AcËzt+ksD"C_ 3-=s2ī_?nq)!<ݎgj rekUxz.o̐!^/++$5&$hҤ#GN#Aa^ >JSک{n'%-Mʼ]N]8V8-1ћW>ۣGS7yVq.]dQ̜& jE:' j!rUpb@_s?Kqkj츸 % šWv ~(gyIO(7T,K65ըm7vCh|0rF~VQ ‹A1rzya@ :vDr2P&1j}E]%|wErSc_߱NS(X["&m~u/3ݵ_lڐsTsq݃զhElz!JӫL5Lvm`Ƹ89dEA0 _%L=ΕJw±5QcNjm2*z3 hcK!oj@\^"^yU)dHxUh/e.(GHxT)j9#GNآK*u !&b+`vM8Ďf>džK* \ q,(d_Qm<]lLZ$/mpqN\QSZ*?q"g۴}]t)֭ YݨQ}>bK]؎VuV58sҨN5€b$]"%ļ1"LhsGr~׆Y}z<ҾѫC=#laddli߈RIq{jb.ٗnD|9]-rѪPUG^ 05:Ao-Jjznbo,Lz2.4NsB8!byø%-,Sp;ju7ܦe`TLWʹwtVQQ$Ɓ\99t&56rbذ_xtTS9ۦIzZžݴ淲=m@K{fGMM.)'NDb.OυtH<7g=| PI1rqv3$SNVIX}E #$rG_:]]v/{kg(Fa<^6$$#}gcTr3.F}i̘вSOOYYq㖫%%-i6}vA q￶8ȤH2XYfe EhRjb -誾}]غ6:š0e&+ L|jjdSQ YQuuH:u4fx觱V~fxkK ǩ9d?t tQA@E @4h,zPjlxy)*Ꚛe w`<2jQ|t/㳬>}:V1' /ߑFf zwWEBjҾ#g[iᓚe1(Q__& oۡA@iiᮮ7.X04AUp]!M)WQWLM-L@œ4\Uww?V;ߖ Z:űyn)&,Z`]>-kmm˳y.ͽW.%Sɗ7fеPJΗI-R% ES#K͍z4osҠ߆p9>?h׆Y77<b#$qvRV1fL e4(%eӱ5`y:NR.>*QNEG?AR%8rRyP66i=|Ѓ0 s0u /^i疎~^It")^ )w*F$ #451ơӥyKĽ>OxU/m4ѿ5HhL5dWFRci[fذIz~Ο?3<ʏQ&r匸v^qw֓ﷳsjiA_FxXg>T"Mj϶qDyn)k~yҏ?<"g72˸ҙyedE$!0nn_x!5+kgSS M2CdZgtA@E @. 4n 7P'tzqGr7A@ le(D Q6A@ le(D Q6A@ԻA.]s{ ||IENDB`ndoutils-1.4b9/docs/html/images/fig6.png0000755000175100017510000005166711253216103020264 0ustar baeckerhbaeckerhPNG  IHDR4]`[S~IDATx XMigT Q&ET#bCa 3y 3r r&q(爊J(!;36kj^{ݛZ{|0wUk֋hZfgyzz ]75[&B)KOANdrs@Nt 99 ':@瀜rs@Nt 99 ':@瀜rs@Nt 9)_:î߅~Splh-tE0@ '#ݜ:"zٹErs@Nt 99 ':@瀜rs@Nt 99 ':@瀜rs@Nt Tqw'6fOc0 'Pu彦-dzi駨@@Rlw&<>rT Ϻؓ(þ؝ɴrVvߦv6f߿["v7DnnPi7oPkݰt)ܭi3@fD:+B{ekcr.;R>R :9B$c}3S봒!Cne~.1釘L) a݆DI^!q7]l?vu矚6$HZCq7]'LlP3OY$KZ5@I%e"~hnXsz޸ɻsFx6,f hչHNN LF.o WѦ)Cîs"dyδgx wQlڠKf T s ߷Ԧ>)4"i4݊tI3,bf"=Lc4f2ܝ'd*)ʼٱ"ȿ}\bFzv!D˭۵y  Zx@RwsZ4lc&YGᶵMI9/w{ZBz#;kJ.+.x;I:gK`(%\x?֑>'LZ&dR/y9AUrڃ7!QijZ ֕G gӞߝ9)K"%E. Iݯ%3iw;ivV`X7e7dW(aX A vfCh=sUyE l]YI =^I{Q|G>xU *9*٤2?Kr yI:3Opz^ƒd)agC1}:Z/)BCGE Ϣr~:uٟ5%sj?xeVdoyOT Tuu )oaG~=Ǟ9Ҝm#5P?.xbBko" ‹PTy̓(ZW5^tTr^cAǖ5υKt3#,OΈݿp]|LRЕ@` ' IY/EiXBg]IN,mSɬ'!͆PRSQW:W骭?BmETn>S%1?:=LrdP4a ˃ ݬ{ݚִ?Ca-%ecB;mb7p`>-E^KDEzJ vE0T 'A*[Gtlknf^_7s$C(x-g0g/pvB! 'PT:䖰WkkO$3m>,>BڔwN׬iS?thE#Vİ["wߨm"n{;ژג~S-ImQˤc=U~v7 7\Z2N/i.܉@e1Ԟ*{~/qz䆰{ ]twJ\n'ܺrիgzxlҤ)5Ľ{ǟ=K6m&q '$H\]98t)3++ҥTc.]yn5Q6ˉ}ߧm=Kթ>[ma|OtfbHtȴ˗ 22hgy}~'Jk߾l>|xʭ["vi mzu7x/yMqqKMrJxdS? 'j$\bd`ÇTA6"O0y$&H'..#I6u'7"#GzOfj& G$Ygct Ql"f5ܶcartBN"C=oRnKL|FZtheV>/,uyIB@6{~SFga[Ka_ vzrƳhWW'gA`l=TϺVag2c(<ڻz>t'J^q2@c 3r;LurDV4ƹ-@.-f>c6K$'HT{}4YN/f 8lI/o{{Ez ?m1B GPL$vZHZ#{= c2C@(tt|?֜=dbd: r"ҁ="Sm=I\4[ވC+{UDc =]HE[uo s'IȬx>FppIQ ڭCqd,) `̩U^JJ#Wc;~-mwܹ\$խ뤰̾}33X699H` 9NOe;wp߇¦%䅤L\ջKSUj扤*$_žU,c/dN`T8o}_#sʔ?wtENĢƄ## ^g۸7w^)6,?b^|Pd>~.&5@f ;˰'o2U@ԭ}y{./^e]7IZ]me XG!̦Tړ{e:vVZ 萜D8ę)D~Oځ%2ѷ{ sĩ[ FSFuctI}&:#A~wW;HtED̟ g 0gPhC,gWo¬q,ߝFlbɼ3۟jr.)өQݢ5wxݚ6`iKnHNUo0btNNdñ)8t=!g_e n>b%y`''q~h7R/p4daNe:w"M?\e؞ TRNZy};{W~sֳe` ` Jވ;ΧrKlӉ"6ŎrKqW=tՖF矈/BvF&!S*޷_O 9gȕ2Z5i*S)|A.U~'$` ұ f*+{aYY ]R^zܒw5I}C] gU,;9{娠 ɹ 19Q5 `_nE-& giԹrؖ-i<޿*NN_/Ie^+蟜*u#);9s E8*B:t'];tG EА"#GOs 1l#gg6mh紴Sˈ!-usQ,ԩNNE(̬* PNff !Ɍ<2Y"h[­vzvӦNdbLl"L 5nuN_SӸDkH6LN,;ːKfbòꐱh_NkyM~K&l,&xL5.'O|ͤ׻"nHWq7oTnS:7+Hll Md.S:hL*@H PN"05g}#/_c$?`yqjk.cgӳgIE~II3nuP!aJv@B=0>d\'6vL?ՑңXe$n݊G~Bt`@NrYyOc:\&JY]\/8,¤Md@NrCq'OeCTA,_NeeN\]mҤOf3ܛ6-.++A5)\Pa9UtdDDɩOaeF+`mdJ`DҔ2HolS Gt@`y1 z^@NduZeQs=K}˳.;5`%s2Ô SµK7 qhh34iҭgy))+Xs _\]ɤ =rd.$ &{?-WK?vM%3&[X矂b11h+)O>@Ujˉ4w9777a+@2k27 ů;O Ob+W!̉6?].? l|ۇ>:C 2-KnvD&sb,4nOT`#'IO{Zl54BPV ]$ɪnv66KSސt`x萜8tweρˬAA'!Z5y0e2r"qҔ[?q'w8q쎺֐CFcSX2-2r?v)培;I$ ڳWUM#2/P MȈ>d萜Xć.q|*UWvZh_sa l]*d6jϡ@M)/s>xP{T$Y5v7!{WŒۼ>lִSLN-8X/eCJJKJrr5)[+bN6v)YIa"zb2Z8/:E^eg_b˟I$.(3TɩTNH "i"ZJ5nnIWgF)Ib=D?$"貾ہIt 1{Y{WxI;IE]d̹bo`89$1$P(<I[ 'E ;11Sиj[[~ޮ=#̀'n٨nXsS:*íbqER?Qz˕|=bOrpfKcw&YO-32YFAJfJm2gOlh5C;޼AuZQ_DruVΠ(vɖS}H;TFK1H5j*F| ] $*NL[Jڇ Tdb2٦/u%w'y"tV٦9֝j$7 i y+tvUdG9jAV IV 1%<}$a䗔}5b!΁yv&Nِ>)4eW:"{891#3Ͼ-lX\EN ΉeO;Ӟ=^;p.dۨ,ǥ$VY L]rՂB(1Fck);.s6kgt~s r8h++ w+&6zJ2/Gv2] 7j7ZrբK.-Mj8(HEOQrmmrR ޟ/MBR ߞ-<[7Oy M9Rα2o&@3P0B ͜=a2`rlh%#6/"T, J4Wߟ~)>JJr99Q!t.~9tTdp,*gh;]_̡_i^_2VQgגH=yb&rUsndBʛdoX;;_φsgNlF4g3 ?:HyZ?gx  65^ϣh)^T@{3`*÷g &6x  ;ǺwMfI!jh9ٻ̐PQK$' 9bOcsS;Ւ!QTAZ]r@0ԫV5w Rc B~:F*>hiWG-Aӳ iٯWˈ#MLp9 hc(.y;hڮg/iCԙڱ|:Ddִjhp`33ϭ +-NNۣeHh`p< h6%R.m j]|S Blk詜%2SW{]ڽ"w3UhzM$(*Xr۳iI3> -0y3wW0ʷ-o}ߖ[KIUg~l&=;p=׋9lV.9:p՟h9/jL,<В<_~lWe3M~/  n`c1;jz@`tuæ=z)tJ,HL~n[Il6gD]~ɿdҮKf:7?@K >,>4¤J#;qMk~ Zcr:Ĝ>N)ZI#\{TB"uRERQ黅%-CL歜"rcKk[D7{Odž}i[ς{( $r}k^)s^(HlcF"EmCNbpӟ ZRB_,RjOlOF Ǿ:Zؙjhz&yX\igSDjZRNynkVG7L~98`TLhޑt~SLiTWr*ϟ#.KʃD!3Q0T Գ6τm>mF!*oú7`I)bӟEcFA)uٟl"sI\xq3hj@gV!&6A$Խ)lkPĞ9y6~Nz6}&8{\w PbcO?ڧ5MdW{ P3w CTl~᫯~8OPSӍ/wΚ;ˬ(>C'crTEb'U .H%M[_ɟ Pu r7VEU#9ADvФj>̰]ɰU!{ntdAv#a9*Mǃg춯_1NـO iy 3lР^i$2T '@%-e8-X7JG G'rW䀜g/:Q@$Y`*M7~84ȳu#ukį@D'CrTX]ISu;(̰US+F ɟ Pd{E>UK ɟ  P3WeŻ Hk > /??iz4(?5}X|hI=W't]*)IQHh4?)@1^bi$!9)}C] gMf bYT߮#V.U0E$$; '#%QB,}ٺQ? I,fB'rkYgnXOC)\|3ɟ 7iyCfaKB,?=ٹE>Mc lN܎O@f3a[]]C ?tOH@N;d&'61x±5?FXyn?޽"g -(B'=r?sh [Q[35%s,H@N/S<`ϬݴO:\'Sb47o0@N)6ĆO4hA']r>,~/q܍|FT.]#o# 6e%O: 1O _pɟƆߧϳ {y]좷Dum3.wuh䴼3vׯ}ty_Gg$%4ӻ̿Q@f̤֓SBisVH$,OvnѰ/i!n{Ig?ն461^ ' Lؖ͟a* ?},ɟraӍgFo߭}?YYjA 0`?getK4b^$ DbF_H)OgLu`8{y?ugFBȸ0sѨ3wOl,2O@'-󁩩5uj ]ڸIF 랽{BWG1YOO$<觫oS7IfǀM]535bS?4ZtVav ] صkW- .ʈnmΜ9BWb{za&wG!?'&&~4BllI<==`&M@~ =z4hd9`$$$MpS9FEOO5 ޓ>]TU'O+W:R\\뛓s1}X̴j*+++K59>}$''ٳ'c兄M&tu uV6~ Idd$}ӧOwF '1cDEE-[l„ B!?ڵѣGS+t  =ct>w\xasbbbOGA/Z'.\6i$!fjj*t%xO>z˗,Y*t]KqqUP39sFF AxxxHHH߾} cÓH꧃r5] 'cǎ=0dPDaɉB(MJuؼyGbRW݇o>?U &99M7N2m?U ݅ԫW/33d_@N(C---t钡 ɟ.R\\LlRW4۷o6@*9s铞:!??_*h $7={*tu@*9C03EGG/[ S\HTY 't3fDEE-X/ɟ*0sL6ŋ0lHT) 't˗ӝQ=37׊Iu 'g۶m!!!d&.@ @NLxxxpp'SO7 %ɟTr@Hbcc'Mnl3KO9  lRcǎɟ.\"tt aHNN{,::zٲeӦM^۷oMMM^b$ɟ 'B~~sm7ihANNNBB_1OU!66VfMzzzqqw?ANTh5}1@0OF,?~\~}RR76ngNǀ?ANTOaaݻ3fذa0 ]CP?ANTGrˍ5O'L` / ?ANT'Oo+tucɟ '`nzhBr@K8G~͘kIVɓ'O>-S؄8zjY""f+V<~XI3 :4&&f{y,** r(F Q6GE-7n@LLL 6iRVZuر0.1fBBd?ŗ/K/O7n"%cǎXr@:ueii;hP=[|Fi 9ΝoW!Oxp&99Yk{iݺ||N;vL#!?)77_C}͚suwħO?|F:#i\:K\<ܶm7.Rر""fdf>\HKs4nʨgT}}#k{м4-d4@ʉfMH~XF'ȇ:b~q&o%y?th ݼ=巭YR'ݸqK׮_h,:Ι3[},[!'t]! |PoSSn݃,p;wFѣiӣGEE#7 [wwשS7n|u+GGi)9j+WDm`cHߝƔ;v}ip}c6BZVMvCP?&=z\~qIIIjӞ=kO/''EfMq3凴lӤIG է<._qi38*ꨆt`T~(Y~=];@-sQ BjHt"Cqqk^rIfi_iãL+ݸq֬YgZʕ9tySuUA#m;h߾ !!/Ϝ[$T%> Юݠz= "66ukAz.](.;}z]JJի6ږ8 ]sܯK$n6VNܾKTEHwy'tbM(n>U B%D*22$*jyqq.ɉdkOfn>y/ F{v^Ybo?DImL#1qN6Or'OG!'f)oϤw.^psXJxN|mA,UN<1wܸqbrߧ 9`D?eˏ4ݧZG,~-KR\b)VMBjyeHj#))Ag#,*#FpppeoBNnjP#ef:sթcojjqLXNNJ˖=T/a9t߼۶M77W2;VtqHm驮Rily@oڴ}rr2qqF4b޽?y|^qqat,>"#Cزy覒N ztnƧq*hyݻ7rw<7nS23>jݺ7Ny„o߾bd n+U+eˮNk99w 6lsڭ v҄KS[q*hF\"I 9`,;ZֶgE&&朷2Gib޻wǏ+nM۬RO`|{td( c!--ɩеF*nm:l FSAJ@-rX 95lRZLnn}ōPI&5ޭ[Uѣ[*pbеDggDNHȉʱiQr-CIΉEjMJPkjjZNzvmw奺&&VYGi޾}kiiZ>!\+ɢ̻wokPll߿rX(-}[!X&?䃛7OGJq2;^>2)~ Ze<( }A*5+$X7#}ST2Bcc7; i'J33" ??^ tҍ6s ݆sHrtaekZzvA)8n]U]"puA߯_W,Hj+GGwvO$jjzy_F$3B[ᇮ#+/Qe 'RML23$O5rESBXDY8ҥ5Q5*̬Z㿫msjثWs߸q~D|G.!?Q@C?o޼bjj!Rˢx(G1F%t)܋b2 Q`kkcu+yIOь=1tr?YpU[SSLQ5n Umv[9lMyi3o~hG텮X[bqU0(n]z[m؋ls@‰/#G'LSDG ] fW.yy SI۵kk988IMU ANTnN:u>77_[.$ ׮w\\\r6mj*M]X6#36]ԡ 'b88gfV]}heסHr>4(f}Fx󦸬rW=:tBqOBW\RkjjV\Օ(ꉂ˖]Y8jղYFMkѢe"kGI*SQäQ!##sD@u`DE-I$ZǗm۞jDAdgKdfbӏR[hCaƦҗ d1;FlX:+H.WUHhҤFLT֒grI槨rsS[j!! CZzM,l7;6#Gm<o(IrweY%"{qqGݙ/"3.Qʕw٤u,'{S+oLj+cG5TeU%'!~j5}|&S q<}d9~DGJYԀ,+{]T/ر/FpQEf?~33[Kzجn?RC+hLʧM6 +hܻ..;< #3-[u0QЕ+ b)OC:"rDASXH$Um-+=X=##5BAA:R?xp sYY8ŋ\wwIho0##.)GI h%7+W%7b'ORO^G 5̒ zxh266ʕGTVVVnnnt*FjYQ謤nߎ}D b0˗USNJoO@D҈2yH'ڵ܌PzMzҥ{!᱔E$eqqa2aήyufݥ\^n#ܽ{zU.:fr۷OdWj?JFN2=Kj' `ߧxy [|jbUG ӳ8 F=)!ggϢ"F~X%ђzђ mvOf9`̞=3.na+|؍#F11+#"isشiNEwFL̆ɓng3 >ȤIkָ3K-)={{ѣ5E P;{~WOi72F/.Τ9` :ʕI哒|R]GLTF&&9BZ^ rs@Nt 99 ':@瀜rud, :BWDdg| k?_A>B5IENDB`ndoutils-1.4b9/docs/html/images/logofullsize.png0000644000175100017510000001227711253216103022136 0ustar baeckerhbaeckerhPNG  IHDR2btIME Z pHYs B4gAMA aNIDATxyg-یBP)DK)Z"dlS"e$40y ^(Ku2H=g<}9sLF޳~~r ŇCmٲZj5j7ϙmZy#qFz=̙m,Y駟Η//'O˗/oڴiŊ))) 0 <<+EEE-\ʕ+y͝;7ʭ_~Ν;P˦Z Gy|ߨQuʕ+yͻ뮻Te)66b.B1+EX 㰝L]vR @dnҥL^>~9ss@/^%ի׳вY'Νؕ)S6ƌ3ƍ裏 2kܸĉ,XΛ#v,ZHVUN'sfvw\t)000>>>44l-:`ٳgnj믿:C\27o^ͮ DOSS`Apg`oϚ5kvؑ2\sjժ'ǐzbL|PIZVO5I s}?~A#1&,JڞmRsͪk6 k paeY QPD \bŤ^|tJ8\r:udɒ۷3_}ގテHB]ϟ^UÙ-[lɒ%'NXb"E'_b@>C RJ@d/G*UtڵO> m v1um۶q^z>}ݧZ۷obB d=PN|h *T( 䔔Q|VZUPY`3lgtںu.]<#'loɵj՚2eJ]F['?VӦM_mxx8fI*7pT!V ~r͌Z ce^/`k@x,gT"!`EX|۷opp0$o̘13""__x"2#m۶e<.bJJ  Ck& mM=X*аaCktB,sQF~p4|pO2;JKKk׮ʕ+׿/"EMȥݧg|jW+ KyJ)_>HC)*Vzu'BkA&m8kgΜ׺r|frl`7>>^@!B沓}{.3SjҤyf >ȦjNVo$]zOCp`ּd*[ƍXk(?n۴iס /[,YG7T$:'aZpO<GNs~NjH6UBV'|HJj*&UOUlH#G'/pjae KUuY6qmׯ V0B4 WAӀtI$7'2yشi/b{-VKլ/Jܹ |:tЌUΝ;W`]Htt4Tz˷ *|gD/gb8_M=I b[FEwk&$$\pԕ-I5%cgu֬YSk1n_2{]t4hyc=&N\O>$3"[NWxJJ#Fh[L|5uY]vWU\vp.>￟O:u9;\ƑouѤj&Х۰N`_A:u"݂GGQ֬Y3i-(_3%J>'u+ݙ;wiYG1vX@10Ǐ 4>Lݦڵk=c_>{y >dɒ^ i|?ڠ4hNv]̞=:3fhfk×.]"gҴ0l0No8?M2892,el>\ڨ̜j~u}mvر`Voo]g4ϧUti(hѢz4x4gž#$Yfdd 6Af#o߾yӦM>k6#0e;dwM% F6|˗$xivLFw&bxgraÆQ8JCH (c[cĉ%3wӧ6,T S;BR!EK߿?XoW_`_X_ 2y֭3g[It `Ujb&2a'ߐ7iN X)))b*Iu&y`GUZ E/Pm跽l!ܙB 9YhpaM~.?hEZڵkQ#)`Z{rfu%ՃsF*J^R%u)hmEi~{S9Kv߾}iƩIB0oBvժUmCy*GtJ-I&yVk ϧ⧠ (f*>YF4{ /zlG/D3;,\ƾƓIèjpڴi.5_^zƐF &.ahHhʖ-) %^=tMf͚є!`BjԩO]v~9w7VZx5w)l޼YLx>Յ2)ʕ+UG|O!!!^ƍgv_r|ĉPc#x >lüQ EGGmUpo*I˗//*NT{B#Ԃ2}Ƌ{a k:OE)SHTK*UH !1 :?Akoѽ(vo蔕)x<)g!Л cݒJsIs[l\X>/y7~UU`x{`"%4~Gڵms4}vʃK9m@w4RK6mlǿpBw"Vĥ[Hm;?o% ̙3mE-{ĉ@\;^f|3שS'U=zpr|r$EO݅{A-߼ ZK.UaxׅRʸ@=$jn2gW^V`N0td0hΟ?[ nk<8TM;+W:u* XcǎﯷI?x +[PfNJ1,ypz+hھ}-k}Ĉ*jo3fy9~rb<Fvju00S5J:A =d؞!X#Ru8J(1x`UU;NL2dxrr |`is 6r-;y |0C:1>@a٬ m۶DϟطfȾ}Cݷo>̃!qzڇJ RhB')QIrA9|t%jjȐ!sIIIPwq&`8fX^=ܿjj; n֬YXXXŊ5/3-oRТE s'am ȅ @|/N;A|{;@͛_^°aF)e<.wٺu̥wڵs1<ӧ!xģG%&&VwրÇʕ+, }$# *VuRlgr޶fNW ϋ|Y'>S=b Eռk֬Yݻwe$6ߖr)wZC;wx4};{V\ϷdY$!5006"xDI& 4{/Bϸ~(RE]+HXخ8$υ)R(99Ec{[nooL.]J&A͊+n޲nhѢEB@xELdyG.I_-ҥK :E 4q_ y13!R_3l1U]-3eǏf MP(}K:,JӦMmwi~:pѣGPJӧO'%%e5h"P.VX_$w M1`< G\ٳgbb"J!msIHHi | ٳg;rELN&=<2'xbjjCh!-- Sb ߿hh( vW ۺuT5&޽Am'MԺuk[,W?tĦWFiCrP枙 V['׍ƒc0dZuԩ[3u.cw:..te˖ov_): =g!IENDB`ndoutils-1.4b9/docs/html/images/note.png0000644000175100017510000000075211253216103020360 0ustar baeckerhbaeckerhPNG  IHDRb$bKGD#2IDATxe!0 E}K C tAQCACQA+g4mɌoK. qc  D="s %dǜH1y%M8fK wֵ>i6g-NpYtL#ߟ ab;U#2V} ԣrVx]zTT1O H4]o zΧg"ӒNHlUu߯9m4Ls.Bk#J˭QYk^tIIm5B*;a6˗/C]v#PqH YYżyP¥m6_`ivœiKQAhedt-ZԦ.T3gΈWɥE$#}}}Ek^rPyܹ=:??a(RC5_\ ƚ1c4n8Vu"QY2RK9 D94/OGmׯڵkՑC5Af={Vߪ\RRWZW`,{g߾}RtO4s(bM5*֭[y{{kU,DEEw^ 2wvҥG$+ Y~Az 5N& &K>&>(GLyC;b(}BWXt钘#QbwWPּÇ߸qCd[5PCUl /,$rU)l޼!A)>3MfC+<==aJT$2PFyxx`g钰nUrgHj~AQPL2X ;G`X}vX" )))X^`͢ړC݊CCC"VeIL뼑E2 wTS6m3gV5E J.;K^ܨ3!YXgrڴiRnfLqfϞmv>!>щd9δ;ɲ w `Y&b%"),dZ`` Mi֠kЧ+=66VS3f^ۑYDƐ:vdWg-[}BH=A۠%*BBB.ͤ-..裏.\S?^>|8/ n2Ռ$FrTmˣ @Y`}%w||P3(9jU뺾2O[  =8/6l/CJJ5==S~BHuщЛ0[êԧԭFaiIU%:lCi!0sXfO]3;UɝRWB3@B!N!84:! B3@<׮~o8?j?غ.ҸںONX߹)..߳ _)H^v֦GjGPT2NHhrom] '5[ 8 4:! B3@B!N!84:! B3@B!N!84:! B3@B!N!84:! B3@RUN])Y޶uSVMʣ'kχM7nXX}Mm) ??ܭKVjjoߠQ =9 j q'~iZLmnq+%׷.JJ}!:9qᫍ~ kV\pIkI_4өuT;9i7jWLGǟўW~TD٤պ+o"S;?5[2F'ztB ֢S6a}؀ng.|  G-U|Vlt̏ |&$5grgqR[|Y[ҽe?ؾ΃'";^[U:S#F3\\u`@juH~;ڝ*p9,`>7YFKHҹzֺmת 6gJ0>T! p`ۇ|bkoZ l :_3gfl6tKR(ҽ1.Ls )8W"y;^8PuBlHdᷓ=WZT?MH JV艛_T*=ЦÍl|g1~J R@RCLC T3:5`\Ed؀nH_`X/Z{D *Uvaz7!V5EMq1z!.Ueg\Le',k֬i׮ݾ}zc~LȡdoG3"o_{im@櫊~zw0U#4/8W>Z6!ESC4:!U,OL+Ejwf@ppC_byX/=oW!A}'g⢃t~2ޚp7<Ӿ4lbdSLs=dC{H=Q^^<(((55Úk:3d^woG 3!YiZjo R}|F?N]e(M2CRU̺袀+>bV[Rp_ Q7M5`MeW 1EuO:5!!4fÍ~Pvd0vuoHMNN5Sf 29#2!QǹSm l垕;D5 ?;rsf0xI"t׆&l15EL4[Bb=8XTt9TxU !8uTxxx~~~\\… qNlN!NŞ={^|[n1!փF'aҥ;vuqU !PīKD N!_uqm !ıa9htBq`qN4:!8$g9htBq&ܶmۻޔQ\\|%d$lwm0 T wUǏuVuܸq߈׭[qF-[e>M 9d3PZfϞ EEEyyySNſH._ ;s̶m4C"rš "Z]IHt+;ϝ;wԨQX=zt~~iӐ4nKsfjg9c Io\D0B&:rVFΝo!xT:{999HNjhwZ qnoܸ1sL,teHByN>}իquxwl]bUp5nݺ~z6)_~ t:Ǧ$hl޼yPr˖-׮] ɧ<==F3h[={.>+F/))ΫV‘ܹ{NjEسO>ZܥyҤI+  2*&֭[DW E%%krr2#W^]tt7HG %%:5ktܺAyp몟F'Ơ>dȐ4hmf͚v" ꂧ6/]]d FvFFGUPM4a_͠ÇɱH8o~\9-Zh۶-$::Z}JΕfᯞF'̞=;55uʕB}9wW rYpssS+xzCJ yCx]K>+ ЛZyN(ܦ%J -xEpi7-Tj4%q|Ν(:ׯQʾAi̘9sϛ7^nۃ_7l؀K'gqnlqne LLLdjfe(\i"z U'??D+`tY1OP#vU *((6>gffV 4:!v/Ϯ_:1Ѓm;Ϋ~',YR\\h4J C!*8/77kwYf#u˖-P&̇7n(,,4m!ۈU "Dzl2i/evww: _tF'2d^{FwV.]oUȑ#b7aaÆi甔,/X@fA4j*A-Ӆ!f&M2mK7{A q$`ԏnԇdp_ii)Aچ)4:!b 6{8P:gԨQ,k4YbHơvx`+a>ߖ&BF΀d!wfnݺT79Ҭqxm@ QAp* ,Ww %rtptfͺ9 4:!„ @;N ϏGL-!&"7ti&0hqqG}t…Vñ>,,L3fLNN&SHIIIk$G2m6,;>RP#P޽{ܹ}2@5)ѱ838GA ...o`+#PR2 IMs4M*!w ~М*c1]?3 N1ydqhߎ;8! 4:!v &$&&.Zk׮.!qNBaaWAAb_FDD^z6MT;vDEEa~:IÁF'x饗RSSSRR u[TW^y%!!u2蜝&!!!~~~LbRZZ~&''{^xxks0# ,Y2k,[4\htB!Ck.))Fsqƻw@Ķ#...*'sqN ;%<<<..7ޠv;F'N@0??3yyy=ŋqN eʔ)0ŋ9)aÆS6n!!!.!F'~򊈈سgOqq1g9qqq~~~iiivl]"B~N]3{ԕ+Wr>QۂJjWYYYQQQɜ'!4:!v/"իW/\_Ĕ)Sl]BCb̝;g]~=]bTÇkBjN3doo^{m„ ӭ ;ΉcAL6-&&7jEFF84:!s .ѭCvvvXXح[qN1c`v7k֬i׮ݾ}l]B Nc0}tċo^GGGoڴ)(((55sǂF'1]!ٳgsRg8//oԩ 8'N mQׯlB0 4:tիO:9 q$^z]vmذJKKNʎs8C Anݺ3f:u*<<&ʪKKKeڵkǎ35m}|GUիW?OӦqd1qϝu):'4:!Ntd meVNNso޼V{=7oԣG YDFz6o_S\\VPiv7H}߲]˨{>>>(v6mj<^^^kOk+׿)֥p~itBIIIݻwSRR Ν;_XXݢE;th~Ϝ9isU/c!+kמ˗.]oN:>X?h a]S[~m{`ӦM|f ;lNsԩ?<<_| y^^^^ҭ(0V1]GMN}WTt-77?ZV֗pO 񦩭Zl.111=z  8{ٿCh?~]-v!!]8v5'K^XXOUV{ׯbtoook!vtѕm[7hTqp&M ޽{eq"bPj^J[6'~?MNYw;Ȟa-6P6m۱Eka?sSM*>v+J:DŽ6Ԝ1?!w%22|͚'sS;FE]BlF. =G5(G)y{mò 3B]͏?=cIԮ%-JV߆ftG.߹su$uy~XVC-_' TFii?p[N#::F'DlFm7ʷI)6E{Ts>/s/kh3 b6I])T WGQQx/G+ݐ z^ 22N"{ ٮ`'=,6p.Bdz96pDZ}^4˅KZԝl矪뙾>o111.ϧ~Znڵ%J6g ye/6l$+|Vy >!̙|VhU5Vh#Bze^no3tYkeݛ;wnjz2&786ollvW}~ѢzʕNuq#裞¦kBlFuˊZ&wp'^5on+j ڝQ2(˱ {Qi8q[+{)OϿDޫW/{(Cswom{?(xѵݻO&%mtΜ';bٺ\itVcy_N)kVѧ `;,dt/,-Hs/o@l 5ٰS=ѣGPP5IBQѷvq_^w=:n׿|͛ݣUw̼saxsX#ԻunϯbH]ea 0-jrA/ĥJ?<[##?f߳gOjjo׮ݣ>cI+=gִ\]]Ҿ;jxӱ{am \{/>|Ϊ۰9m\mRHB1/Y%v\ߐmqDnM*7Ě!A}'3<2O*x{ &=M? )iŮɦ{ ;[k`ر>33]d~l瞚Mi``G3b-ȑn޽ٳW=<8rs/~յ'Kp,-[6yaUQZz{ҏJJZ$ yʆ^P?zn9ct_ѬmG?AڊhՂ09y{L5#;t7lJ8 쐮 2k, [?3-"==r޼ ?sf|{a)4z}wtУص!SqvXlu_c9- (ĉo;uowP[NJ4G"{YvckVZQ,5ڮ s :w:ϪdO,+̂8(f'#w>CuoF疟R&[Aas8ΚhlljG?}{_&zklvDžp?#t>xEFJNn: 7ٲ%+ iI[ϬC:dO߮*ۚad$Mgڏ*R0ڤDmI8VZݛKo{Ԩ 6իhQa>|z~:4_^]ꫫ_ۿۻUN-p?5ʢS{ܴ݃r= ]*jEWd&Y/oެ{?t+FI?_++ X_R^Gm vj bS95L'xiI]Rqv={gg_fϞ}&Lo?l[]‘0eAwvx_.0=jH|,^DDmT$íw"#~}?yaڡ^^׬9v׏N 2ӴoAko2{p=Mz y~tx-0h [uƏv2BF'qv jOlS]}hxF}ه*Vtpvǯ0}qq d9 = &AAyZ[kѢQtRRp)* NoCƏ?v8uko翧_޶_?Z!äT.fT_Rs."s={0OPz/C!! ' kʠqA~\ͨq,FVֹ?<=~8b5mTKP/ }jXhԪĠ2ƕ'g]~ݶz8|֦迼yf9y~ʐ_pitbK8ή }g>|:{W!rVG;7bAAɡCg[h?Y#"UGо2PPPp#G\ ;uJFEVV}܀ĠdC^/~yƚ7nP't葙4C@m;&)!5saJCExUF'vU' Qfhݿ\fn8лcp|͛7-WΣҩSk?t/Bh?۷ogee_Y~mȻM6٤o t_o;\UMڱOeS}Ҥpj䯰īٿ= hjلtM}a8cgRk:V6DE5.PY8PxيUNj@;¯y恦%S64sN!k*ңUQ;Go 3!YiZjo R}|Fxk+t屟Ifhtp]uaǙy#֯iƍlEUQշ9:>eh9,.L/s`AuoHA68gWO5Nj3/..>ydem"q6ska{v(Y.io8-gGַ7olFPN@@vP*@Ǐ7z'Nw}g–6s|_`͜8:F%F3Lj5ƍ񻹹uEm=}tYYϒ|5)WπMlo͛7_xđ111-Cb8q,H?cmY0:'N,[,666iF|Z&bM1cDGG5j۶m(:tu͜9388jg\g@z֭J(V_3`oqvo/q~~~FbGf9i8Y;~9"uE3 :2td!0@\EZn]5piҤɐ!C׿IF]v׿^h87774(,!KL!ͰF%%%f1m76MtdmahGrrr._ܡCx;oү_?TMI:V]+eB ʹ`(|ӦMH]͂TxE JfZ s"T83v@JHYcƌ j$aҤI;woA%ۻwou,C 1[s"wޱu)e!Īou!v%c% E Ѷm*m` a7COAf+JH$P+)#xE[lG+-nݺU3xq-z4C;VRuP/gϞ-ųpNQ!{Ԉ\苁| $oqp4 } &HAA;^Z3F6LeDPXpn+0otJqџ9sh Ay̶ӰBok˂Zy% XUJm4DzvnZ%UE_w7\pAYB VvY@*A{=ERUK] r Q[*YNsy[7B|~ͩXwxfR_F{b:A%@ n!ЯYQEO Tވwi9ݻ7 1>>l_j  ZrرR[Ynqj]fqww{"X;)]&|P2S;^$F|joBfʹ,`U3##C X'">0:,, '|ҥR9γDw=i|ή?ɹ۶ӯ hر)zFZRR4KV5+*qV8u=P #a䨈ۊ!/_ӯ_?(Vګf$_P2w'O&yg4 `Q٪qÇ2r*|7ngj\/Bs>o<:]Æ 6mfggu0Cۭ[G_ƍGRR"zO6%0::w\j$ ja|{vUfff対ꮹ,^A!@5T)M~n+̘1CIQY889p9N񎘻2A})8U EgmJ /=A bEEXYُ[|nx]#uF !IѥZnBgn*(999۷߿jF 1`4K/"?&ArBBB}bDfǏMȥJ dzsUѣp׮]fA 8F fTf?7n{2dHaat^ġQA6,^PY]}ZcX)[o"7"4C3>>[RRֺ݌}$)}:*uΣ$(Vqq.}l^ĮLVN /}XX0Vs5j.:9D=Z~XT鸺8 ˛ jiގ3˞[ltْT%q)[eū֭['7,ܷ(F;+gf4ʀ[6Mz /]|vtlU{nvرK T)OS> Y[0x;Xvr>4`T0l;uh&ReIX@Q =Dƍ,'O.((_i1 єѩFS9Wr>dŪhmO=OS63fNM`)WfbY3"Kqt1vl*M{?pƏ-[Fyx4El>Zy׮(W{%+# Y`b`lEeXs  Rg8C@VX˳(333sssvV9+クnZs\44hP޽7oެ@֟9B'5eYSZddd8p`׮];JL|#GojOF˞?@G^*V?rmV Yn]p!ߨ+,^*/MQQT 4cQ65بEC@#Rׇ@ؐz׮]} N`kX<;;[.ʊQsچ*m;inO-GlKQQ,={ܼykzO]pķ*)a_YF8nO76Ԑѣ`,2.; 3gßz+bX~Bzl}ȀDd`C@ԃ?L?p[ S#t0;Y ƍ3gD jX6["8Mqs|Vqp\&OJ C0|aOL?{P4Cսz6zYُjg7tn! D߱3|o_cSll_IyܧwssQkR:qʔ$IIIмy -[Ba)Ь?L x ##p-(R5;|WWWP*58N(//7veI&Ç!`YHNΓh8&== K^eBsi8c9ʕڝ8,w2 ǟtKRpNٱ !Q05A;L#UW_}"'sY*ѷO]W(jZI>jv2Y0 4:!6%55uYYYF7mڴZkf/~E #bL66vl*xS"u0~tDX3f@("N8 h86J2htBl ?ړ'OGFFV=f\ TH44<:!F4ܯ_' -#8޺WC-kY%%e?xx46 25 Y,Y2ChxLL ٥GΞ}@#Kb*{BDSe0fGIvGGGKs^1-1U=|STTtmoob ќ-@{FoCڵêJrc!MO<Ē%KN8QB5*Eiwҿ j|AbK%<䓷nڸqcll+W_u9Ggoj>f#! r6l؂ $hw$.:^+F'fdddgܸq> 00#7o|l]4Bj\i`FnR[ׯ4 ~ժUro7*"R7QYhtBl.: Zlw^oKG1Ib,O萧W|G.\0! qzZ̵"C@arB-[_qFзBb6l0aVp߾}mX0B,>Uae9obC@Qi-hSmktx??ݻwqq*@bU&Nq_fb_4!uK=`ƏdɼW_}纍رw9{ٽ{ ƌy?׾DAR ^^^IIKKK-t_ۼ쇼.&wB4:!5>gxE\hh=4EEWvD+V{vم7oޖe,4s R{ ! 7ë^-^WZZe.l*'VTj zv!AR=vl=&4:!ՠgx%F' RTiӦ%&&ڵBP3BH@b <"" 3BH- 5k\\믿nB%htBc3BHա 1éSs{B,@bu (b gJq\htB~3B 8+!ѡ gF' Jqhtp gF' Jq2ht F' JqJhtҰ gF!㣮]f8?O?:=:I3B ;w3Bl]'J٬7Չ9+!ĹkNfvu)Ku /pWBCG𚖖FB89@щR^^>udJi9:'8=4:qB8+!Bg(<<:_dɬYl]B4:q*8+!B3B24:q222FGip B3BFG3B@3BF' gx%#ht{tѕm[7hTv+J:DŽ>t39x3 gx%_vN9rhAA>MsmMzo~?yLXv-oQB67?rkuyΝ#ƀHr>bj :Yh0[8+!1m7ʷI)6E{Ts>/s/kh3 b6I])T WGQQx/G+ݐ z^vaÆqWB 0,6p.Bdz96pDZ}^4˅KZԝl矺g _߮SXK?@{J!9 W"JmDh}v@Mw:mwft!=km_O : !ĨgC~墵*~ѵ;>n G-{fzlf ՚7(z؄48u޴iSB `՘s=gקSGZ~)c<ؾ΃'*K6z Ya! .KKR(<+K#GFvBqzhtãUw̼saG;"Fwܦ_Őw"`nU[q^K~ty3Me'bCht{,O;ojwfz\{w{wr8"i&?b͐ f'܏tH- GO~3HJs6}wb0ȎBM4 'U[RZ='oϕfd&5M ga!C;3C{ʬ2AQ2f+"R /vܞzWBq&htC!!@B!N!84:! B3@B!N!84:! B3@B!N!84:! B3@B!N!84z9wٺNNim[BN]ZZj89[l] Bqh3e[B BqhtB!ѣxٳ b=<>+"°0k%@ ѭ/ I+ԷZ[J8qGl7cӸq1N#*kFIdE ˗/U97l0,"l Ǐ+j…R'ׯ>/$qF3g`79oEB.V3tz(gAK.!8)4JJJ`UVA<" l.] ̝;{[x۽{QF"oHe˖ڝI&uy߾}Vk Y`iA4FĦ0ߠAls֭x{{#e͚52By|>rt̘1'Qhٲe J5k,`w N#[$d:-׭[$&&o߾* ;>.g j~ 蕢o ,\pA<[?HS68{@gAA W,g!Q;B$ ݸqc J}쌌%V+*46!wd|WQEfffUիWk˞^*rZ=?pN ( XFMB΃__~Bih* ~YH36{`&(rF *=a;v HwU]kjqӶZ%ݻ;p\= @r88p v᲌SsU4W .^tRXs֬Yj)1cp8L񫌕֟={VBUTj~<^~ڴi2BHFИV+۷溻k PѼy4s-H65ydQ PeлS˹\TKXX,YZUO4Kce5m< ٹsgHn^}Sy9@Bq>hw+0(gŲ,e0<<'aOVEܹs.\΀f'8o֭ؤɑQƫNJJW>F1P03~ޥ "ӷI A{$SW)8B+P&%%g8CBBT5T}i(X[… P쉀RvE&N=-g1ʀ|a^X߿>rsrqM%Ohui1};wʧ3ȑz{{\ivvvNN===at9B?WuWWW#qv1`6#?r,LRxxxXmP 3]/h鑚ot όSNBCN+YsB1F'5aԨQ2D:sڷoϛ!,4: 2UmG!,?r_\UIIENDB`ndoutils-1.4b9/docs/html/images/fig9.png0000755000175100017510000003132611253216103020255 0ustar baeckerhbaeckerhPNG  IHDRid2IDATx XS׺.)2(2"*V+Զס^QlԣUOqCSՃWAT@-EAQP@?Y!0%ߓ'k"]kKfjPXX3d] *++{0߽{BPҸ}ShZ|HcP(JB&B9hQ^6P +|" fŊիV-Wp(P_߯4Yٳ[||Xl"mm4(AZB&]%i!.yƌhUB(iM*ht]#a3a*N:& Vd(-7obc-e<1ѣcƌQ(xO77wLUi ==KyذًGRMP44qMPPZq8((Vk&//^UP(& ??v>FxJ;8>|j"D8%899G]]Q1`Ϟc?$ Li¡8Ɉ}~r4:J=՚̙E֨v4RPR򇍍̫9r$:.TPԙjMLOO쯧QhT gGǑE HL\L5BQo5q;:v(*ڵSNNFll<׮,8PԛjM7Ĕ긗D@_߀fǡPQ!ÆEͨ_Q?U( 1ng$@" KQ  h\ރqw\JMMuwN\5aK|i'oѣ:|d2B,پ}}!7GroFEYgn9pU>d% YLwwק[nQj XZZ 6>>YÈ Z? ~ ĉ0?s>{n(JFFFZZڹs'aA--aEDѽ͚ r`]?s{HO:A9\##7VU Ƒe4osLjT.vCP.؛ׯzLkRʣd9ޗ.!xD9TÃz1gB 6ۦ~ee? zz1c<8<)pѠP '~~6\]Ş¢LO/IO?xSi?jq8[g5Aaa:$Q|*e^B#2۩Y.y*uI&|tu9u0tb6c^w Ϛ5kÆ PF4z[lڰa]׷'^q%'BB`hO$hWUj-X\MLLcc~w~~~+WW #E_&OvJI 33W |mާі-I+&Nl֬ىUUݻ 0<{Vnll;_۔VAvvvtĠ ۷gRpTuˇ Z>eMZfN|R؝:~T[C̙f͚]vAi˛={rbنrptbb>񧟼 6ޓ&NGdWWx6 F5 3++k˖-4Hi\5͖p(tn&k"#Z܇+r_솵 4Hilrizk߾Hm)trRTJϞwd7o%%4Hidf]Y>"@PϤENDJ~VTuS0$ʊ)-{oo7wNCb PÝ;lܘ5m[tb'ڗ|걩334h #ad Ni߿iZ/G$ .Ŋؑ3}zfޖnξu/-;C=5l ͊W{e7`#VV.];㏉m)-KlL!x^DF(*zpw7usޫWjWZZIfݔ..<<""k ֮ع3ZǏ=xߚ(0}Eicaon gLI$hԐޖ'ONR͛/^??Vk|Q![x2vO?6IG4HQ-=v[GGOp IS(3G!U(F|[ٹ[cQRY#Ѿ0 k{v3u &ܺŋwdHH`fQMDFAef&4++w\3 #EU9Jd ^yy<\P?Pwn8ohKSBҊϜ)9$&~"i&: ыr=&  #E|}Ʊ3 //hezz $E(A4>6h"f"? ^vAAEjjQNBR/|Xn`y~oS!Lj>}9s"j #E̘1`>osV sЌؖ>)^Lq["Cc}}es{EyGPii%{KNG^b GoĜ[y23JǏN =ɠ! 0.++qșlɛ7Æձ #E9a3ũS}dīIIFF ؑWkC@GGbx6dKͩFl]Rƈv ň]ml F]09y2bʔHWW>ɋ}}bc]$51-mɑJ #E9@"ȔW_5:Qs~iBv缫WyFl`ʜlOVymǚS+XXjJm?ч*b&*`HСFmpzsl #1%%.;;]iAFt>B6rZ&#bڴCVV 0\Xy e5W5!$3̙6ĉǎdMAA 6m$x΀a[]1=}p={xyD ~]Æ-60x/phć?}{c7Ʋ?q^^3mlF2b ݷodSjhh8Q3/^XyN┬v67ǫiJ{շPWWk+77SK2%D|ll,Y+I315o׮SAAݢ #$wUoE)c񂴅d̟`ge(4Vvb\ӣDIwljEE))Rd0E{1 I5L UxEF0OťK>BBD(횕CEs,7oVH={;^O(X3{ʔٚoƩSk++Puꂌ`ʱXwЬg*(8N}:ٳgvV$Ĩ̶mۑ髉&2bc 8 JZP[V%?/߲e(DnnmrɐeI$ zd$:-R@yb[ɬΫ0 V;`} Mtuuzun̥O[cZ# N. 覯w "SӜ(,_:<SW!|bĈx 2bWN@VC#؛SNMda|~UnnT|/R{w2+*x! @|ɒӧ12l.[ O_lQ!d̈=Vm. O".fanRլ܂{ 7Ц.ze \ɓb dȒR/$婵b0@BGhpf%;w vم kQ1IwwY1㳰^]=E nnw A+szђ0 ԋG ࠤf5v6'o:;O$ǰΞ=d~MjZ1b(!FrnW>){ Yʍ%^$ ϋt`žW?]Ng.|yD VOAF.qYӡYR qjϗL"[Z~ȈÑ$طok*>^N$XɈ*.ٛʱ%uu[УB5QMd]YY JsGXQ\|N&^xhVN+ "㳐ܵo޽ $AÒ [Y%S%%t/CvG?Sr s,^ʟ¦hTAFGG}1byٲemv5/K>j`#~IChPMT+gϞֽ{1c`/ <СϓcY5ujŞd TQz y2dMIN29pO?ewQѲY2_.K1flEZ?^`mݥgO v::vmP:VVVN0TݺueB4<^N7PTt6sd= ۰סCW.]mP{IE6U9ڻw Jvk޿uK/5'ugܜ/@5u#:\remy<و!$&^;.Gŷ.Ay4h&>>VOO! YӦ-ǎuc^G\PMl zD"$y0pJB{;)ft4z$ԾWz1uDXMrYy¤IijHL?\1$v% YJ4RmGN޽%X? $׷uP/>}xCjɘ1{U= ij (jZ홷rI&--f,ĜDF++hSH씔\( ť4hMy}>ؒس3DǎڐNVeC7pc(ɫ={ؖ-J%H;(c4dw2׿fĂ }T֮"Ĺsc'OBΝˀB-9{$ǻ3buAɓ0ĸJͭ#GD bŌx.lZ? WKtS˖r Ц>}~*/_aǏsZD`Btqho[lq8a!IQQIE8PR4|9'0p{>,ݼǏ1+V^j#BСj3?""ed!mjVVPP.XdcQYd,hjdjn)ll>2pTG0 7Щs \Qfvmk.7w萌S3#v" KF'gh"d]f8IۘDWmڴ8wL=gڠApa Q`ZQP=%6d: լSYHՔE>1 JfMkDPj%g:Q칑Qں 6 D ^P۸ IIlH8&;u Қl-zfW [?پ}mC@~˖Hhb+ RSȟT{ 9vspl7vkQW΀6²KHzLӯ]&937hAAv_~9Ȯ.p 2GC`d{?}z ,2omzif~#3s',15o]Uk4tHi9@$P&,IKQ= $WeKJ{d1im_J!;MرͲܹ}죣cVܼG JKLJ{{O5Jy YYIkC`RfD:PZ4][t~ ԅc99,wt߼9dɒOCJ&;vvGPPqᄒSR~(ۗ.3U+W_rw*DFn\:pi9`Xb069pj5zvFj" R(-jM*pYzMu$;׮QO&4)[i pjvqc~cRB!ă;5/7D0N<~W3ى׮̘ON}}222C D>m5c8??u߾?}C8oOMMxq7Ν<ק,Ǧ!WhdC~Ŭz) R( &ѿY _~2p AtvW -/ 81lsiGYX8ɯcbbs)C 5"\Mnn|+O Lmm?d_߾d6ޗ.16%u#Q#{7Դ:VV6W5:PZ)"Mtjʘ`|pE[d*4!_GOӶi:PZ5"MϿ޺ua„5uV+ R(jP(,--26VHTIeW$ŶP)^̸\9ZXixٻw,-ii隞cm:"~ظ_d"`AƲe?jWtMQ"5|>9CJc̘Pl-+W!)|o&|;\:hGMU6:400+..CJ%:~##zn׷.RRnoڔ1+Wn"NVUr sHه,iՒI&dl$Ayǎ E@ʊ)OOϬ]]T=.呗۹7{g %gMEv^}'ὤŋ{&_Y-ّnǦj?u?Ɠǎ4tHQƈrG YAС&jVANO/̬8}O;QئM<i ۵뜒sjjy6/?~GEEՠAd6ɜtz*{q$naISstsA ɟy/*޽{͛i;wgD˞oJ-F 8\T4ƦkwU!dd:w,#㖋pOHcֽ{< 2"uF*Tբ 7nKKe$в~S̉⇠ccml<[:vvI_&w/krp&=}{۶ztY?GgJF__ #މ$;;;++ܒ촴x{{sKPIG_? ֖ Y%U'wO(`q[y[XXW`_OС ≵U@bF|#̺ŋP†BC{ĉ0 ׭ A{YYsתN+VXzONB`-FR% \1|>?77mIhOfg˰cUGG#3f4FjCK__ߴ;wޯ߈:kʇ!>}|l& P7_Ԑ!PVd> (hJK0bA+BQWC=z4vb~~)|FE'N`iJ"Ʉ`ff/ZkW5MpM`'FEbutK֎9M'3'㚙~%?PW=w0_2D hq8LkX3ydD9Ymls[ _T.vN4'hY[[sU= ce/ -rs]]w?/ BDqWi(-Rs~ 6`\xWeEPTn[eeM۶Eݸq|Fq?nxĂW5#KKw ()ɱ^(J Gw:ձB;2%g_'o$iojTAUa*RxWėܑ˽*_߼ݱ(Fnnh^=pȐ˗O|~dĊ"L$bIɥ޽}jfH,/}!4K$S44rq "yfq"[6]c\3*884} *i" {n4Isuˆ 24t)D2 %qJpC(nƈ+-''2b~|ju^N#)qEEۑlĬۿ[F,y%Q+R(|6H1*jœ1Gp[J:h"Ο=`'޻W{YYnpCP(-4+@"O7Ca61!p 3hP.$&l7Ĺ|m%%O edfٲ VV.EErݸqfB@5qxM\>lMEn600 ˑ(RM(|u-u;?>]5tv:|xGV.qE9Z&xm2tBQo5w0 Zqm[Ԑ!cF')df]AA'V3]`3C rժ7qhҊ;0*aZBd\؛<ޭ]fu.#˗Oɜ̫W3&S(VA&jLsq,+";F_ F[`N  *@Ko'$@M`VV͹{<9? AD8r$+11^0LCw#~mS/ |oAH{{Hb/Ͼ2(>>AAmmr?7Z[^^^RgQQ?}p~{cci(=`XvLwIs E'^wAԌ={z啵LaΝ ,\yPQ'D ҫuueôi^ii]AuLT0T;uɒaѢܹ+.n] ~2&huwyaf (%ӧ/d#LR\;m &Lp,((3g)AqGDmʱf S\3mA9v;wAԌsѻdraڴ׿|eA ??|0IeeA000ѣQQ戃ӽ`#3gv:>99ߡ#N:urӦh{0%%'-t^?|8t ; jAQQ/[XFWܽ דPQJKKx „ PQ** Ulv70fLA5ʢELa8;w3_C; jAeСn߿[̙-; ==P>P(DqGD)--t/TA01RUU Re`0^0L}}ر Kaa!; ͛FFnLaJkkAS2mmm#FhIN]P[[kddٗn􅎎6 "; N}=Ҳ2ʤ ML"#SO+/q6>~~(X'&J^2y+eOIA9i! s='8{nno-ZwEWV"yf~^EqGDimm"Aff3A@[[{$%EDrr>(,Yɵp*/K8we(pV\ʡCNn`Mxbb\fPjj(:|~ȑ䀈i |.[[RX̞fC](;O+чa޼pSShӟA⛛zz?A\v5x$ 0B?cYr% tիG.r˛I44PQu[{ZO(4e@7l^n۷σXlrք@;PjOudU2*'iUȂf].y;TRR"ZYQq&'2]~yQS׳gFqGaxbN' jk.ꀞmsY3Y} ..˛9}:^Ύe.~DCC<._υooJZcA܃ᬆyy 7NZ'EA[RLv.Bٽ;GZAé,֐~[+s666(:KL52U&`Ϟ"w1>%7oʃ=i1ca>]eī:p rw*(S|kM~ dRپ}>)5/zLUV}$==j~a/Pv=lUVMP5NNN`ϕ=׵b̙3ݧ 9iGJڵʞ=Baڦ7NH[>}dZ\O;PìYoҋEpU./J߆q}˖ԮZtw3ffw tԃUVYF333"El^{Uo.[EKK7=}`N8ܔyDk\n|ă^R]YYy.(wt\B,t]\:Hy\ԩ د 0&(@h?ߣAP5w ޻? hii$ edFNk_?|g֬ zA|A$B ->-@%EM%_} @df.lBo*:MM\A &@)qn`;7$YYYb(2z\\FF_ƁSG56宨&cSP8ۙ-[EAT*08@YœJlYΉ9?U,,{j#ER]$Dioo?zhRRSgyyy!BI}TWƌUh~vvv$tDfee555?~ݺur^  68`=~BDS" *@ S}߾}$xwHHNi3Ԃϯ26./ Օ98L[F." ̒J)Swll&iqDyIDN$0ۿNipppgzg:;+@p{Ao,]* N$ d4333''G}O}}}l]:=Ke3ƺAwn#N$3eee$rwJSpwA --?ڋ;./S80}|XZC YWP\K N@IQ deĉ۶m R #CY܁3 ;[rג#H"Hx $oppl$DE#$~0 zF?jiNX8ĝBI9YYYd.99y wJƆd>b/b'n̛7ϝ^P9qJO>|T_ihwu-;2)AA~GSgBB<*'I|O("T ooo???0bOw3& ttIC|ގnl|H&ʘ8q͛CCCkz;nܘw,, 09100ӓ7Ͼ+i*'(DS#>? `#Lh'NĮ] W Q?)QM.<|X2bĘ#z |XQk$eR///u_š5Q<0` cL敞 ՕKM(B^"[wpXW7;]]CCo7)p=8vu^H9~<£Gp6s/#Ƚ{yy>y‡:PUg $ہY!33}}T*d Sm 5r`#Lk ©S[n,UQZR8K<{YnIK! %!-[XO8?ѳHiiqC$ԩ++G߂CCO PW*+T OO>L]vJ{DxxX\GRԔW_ [nb//u*wbJ),L"quذg||] `e ,@cA׷|XƐCBp\Yy.<=RbLLF(å.(CwJ{LW˖-vC7񞆆K 60Hhxd -Ѕmhh c:IuRY%77w\L/-m겥dcOXI!L uKA (;#UM%e%$$Ni/x--;<%w  `eU*%K)IY!w,{&($`Ss1R;da{(;PSsZjde gO<|IvWH.^A^yxĀE_Y_zpȑ᧟jw6{CC%Li0ue ֝RD#=])bNM~{`;?~ooz!\ P烾WUTX;d-+ٳ'u XRk/𤋮< ゅMJMڣJĴ5k-%E B'ߋ3R2TR;@qG-SkZeRb7K'y}IB07pyNL{+KXXyA!-M;4#әU66WoqF*QFPPP)E)qIfl`vP(505ekI;r nj*{)qd7t {UUˮ@;毖vtܪG6^#(O>RDځ>h)++񉊊XHyK!;:l.6Kn[X_ߒs DǏWDz>ظq]%HM;H>AWeN) Zq_oܸt/D/%LjW_}Aϙ3S"7.Ye#*-l R5[n566/z-|lB);1Ƹw،垞6mڸ1f41B|\ii{we???\aG)QF!!!C@J܉1xFwߵߘǯ\rp[GTA+$*"Qw$EIGJc ,xGrїKg$sVVV;wMMM~}"NxAn]cAFF'Μ; {@US A"ȽAAAn```XX]M (S۟})UhIʂ+jM$y@UDzY<]Q0P*-bH$b@AMWD)(S;}0n Aܡů){s@١-AFd1t/z@SSɓ"d:9coN^ E:~<}JB1WAR%*GΝ;SRR~_n{pp03;DQ[ %;vIGhn(K*hJ6Dq:Ojm6ۡP_.'S D~Μ(J Sjjĉy| 5^[[(+PP(y+V$@geX? _~٦Yk%Aˏq'XI_UI $Db0D;//~})r] 9론O??p`#H5k-:1훚In,+T \,''8Pb&DqY=jXظì(#l [Nځ$PEJG Ě{TT\29YMu{PsPv~ǭFuLtcfGG?mpPRrw: ~wrI#'I}A}dyu9- BH2&2$2t@oB`r}w*:Z~!P(q㔿N W^y35ڵ#mѺlF{tLMM)f09P߉stG$// xxD&EqG!a әeׁC~tGC6=hڴ%IIR;; fhʬ$1@ BrtG3^3EqG %/@ ezzELa^|.**|&CqG!@YPP^殅הduVUP(xH />~<A:sĐ}xpZOK7 ͞nimM%R\,}nB#E(tu4}pwҤ../!T_vL[{$y њI?Wf6ɓ6G?~#eRR :P ’aa 8ӑ̅B>I& Nrϑly9w88پrIK溵Apq =gN76L쩢#'ʕ<>>Ν44 ѡ P( eQQ~```dd7|՚.\x%ڴ::}]p'%K&ObEb킏>bbbyX) #{6( (Nb(Lr}R҇9dlkkPB:@l%r?E;=RYkBb=zBqGhʪ*cc_wgς߿gb(; ۷}_ hn\pb`==L"Ϙs+qprpX&Ǥ+W2n߾@dt^B> hhhP(0UDDDttT9X!!!mmm#F(}\Pmwz׮ŔeWT\x먨P|I$qlM8 uH (rh}g{[)XBA]nyNNNxxx}=Ҳ[[G?!LMЎqzoqRzB?6ʕO<^] -|=uuG}h=Nj5Գw^RӽhkB#'%%En~Ń$E&a@<3ߠ -(q|.vUp[t[Ė{ᥬ oUUUrv)¼yut+]D:S߿ ;i44z:, ]TkiiVʽ>4:rr;'O%`s8lԜ77 I)I³g J3jP)Ml%>kr_߭|Ŋć+Xut<(;̮`&&v0O|3 QQqrJ9QqHx#WVҋј+4mPQ}xJ'bpV\}O4HM bb\{7Иv??ZY#Ll7N>o^8h%ӧ?77 $74ܕN߻wmdwوAkǠY$Ō>d#8 pлV:@{AU9.nRmMH'+*ԞS$/=ܰ{J.' ֯R5ƝąB_?F{>a3 xCQQujjn))MMu /gx:jvv4({ttpYYPbooJ7H=""΂ᬆyy pvinno 7wGдf**IQQ|}_wq߳_(lذ{IF_8!lyssGJ'R1ȴ`77 뎎>99u"i鋋;>j0R(~~-}o 픔yDk\n%JLf zmcveeSvQ"/%A}wqY~`=b54f>0[O|ǎ#gӧ?;8˖e˖?QQLLLtu8eN``O_Ͻt)Y\\^=x G:9b zQ i$w]Yv $e.싫 ̙sՂ/! z`eeom<kRl9PRVA!((ڵKaY .\ +\]]%#6]:~&}a '"&A|9=MAȈÙvفL1X,#?…EERPQ'{oCY5_}|.^L~%0IAqGD6/.Ν6͋0A8{6ҥ<:(63' f̘fb"}A5㏣e/s[vv߮?~PQ?6mמ^0[LMIENDB`ndoutils-1.4b9/docs/html/images/fig13.png0000755000175100017510000007123411253216103020332 0ustar baeckerhbaeckerhPNG  IHDRgqO,rcIDATx \Te? A.~4D7LԴ߮nZ~mܵvͶe5DRP@0~.( сO'P*ip`zc-eddrLp¡C j ٳgSHII-vyBxcJұ 'ݎt T^repzk(ǿЭRɲ˗{ @Dd̙Fi/P͌2PKK˸quvv޹sGgCV-D}?~bwBHV.ill t…ٳgAMMĉl[pqqjzqX$***;;#""T*X,6Z 駟+(%wSSSzkʔ)y:C@x.--z*W{6-3ˋ>[teP3f Þ\ӧOVi$ ;垞k!ruutOΈ4ȨthL_/~'ׯ_wYIJEWQ=t#Ft N m/Vxx8{fG p@7 D,)P@>ǍGח>5fΜPݽx;wJ(е"?? -4~7njiiz(4ӧwjG!IIIbUMMMTP.nx==I1PXXX賟>ΔJ倷`%K/ )ijՊׯ_/++ӭߟtj@Q3D# :~i43P_"""lll*++Y!tfY2{2P'رD=⣐AAMZn fP{ Ha%3j{0ob󛸅j.]D꭭=Қ)@47714ZzVYYY\\L:::-z/9s&՜Iq$))Ia fs|||Xgg38UUUnnnwrvvJBouuuHcXoOϳ@ X e+WL>=<<\F{yy[@}ɓ'S8v;MOHHϨ'N?(4k7ΧQ=ZJrt̺t64JkG k(66^Ι3G]>~ᖖZ++ &%%%UVV4j^RNϕ"#AtmWWSg…666tNb\EEzfpBѱH3MR n Ʋh=H⤡[}i_2-FG⦸K} ǯD3 -0 2#d 0G@`!9Bs ̑Eqqqcc}bqTTЭY\&hڍ%L75RT!C=dB`+i `8s 2#d 0G@`!9Bs 2#d 0G@`!9Bs 2#d 0G@#HRЭ,^0{nH)n0T^^^B7~srrn9.t+LJP㶶-HqTTX,j 4|u3Zb-tCƸܼfwJmnȈR֭c--%Bzz~m۶;Bvzsݺ4[1?2qJeQQ^CC}kkkv$>ݛ;8HL?۽gdܸsGɎ$k__ T:eB2$c=?ޝ#e[ܸQG(&&>.nN\\܀E@vI+\ '礏Ofܶm[L0@*g/ϔU͛##( Jl/F7=C(+>C&wx^/G}>zBV-L*EF.ݻg(t,%%?8u?EGw_xЍ2>M*}9q~~CZZ?˖-]ve=~ad )y*meeVV\Ͻfܺukcƿ^z.4? ݻwXl.kFB(r|߾y}֮MDB7jpR_/4?|>woVgg϶m o%>\Fbgȧ{Ҥ_{ȋ/Nת?˽~= 1EE~…p]AXyWY*UY[__sryRN//^L8q^txg)@ѐZ{իWv daaKΝ?OIIo ݨ~A˖M?YآE!^crh>:iigϖ.[6iǎl1R[{a 镁:ʺ;tlei4*j}^v6 {:Z5Ѝ&9JlR?%G6.ƶKKK.vh֓DCC^-Ȱ䜌\4CSXľ,"b} } _[H%JOÇ*Ϝ0*RwƷQ)/yF˂A11^<3z}G)pΌZ0f #Rj߆%5AI_s K E r.tes[_(M=*so$(ѭIΛF\SIK;;<דD?|^w:rrNDFBRhtnw!'^|?ѻ_|1>TUUmYY5'NVTR*rr7}Ee#̖2C .,Pnͭiϝ;ݔx|}||ƿ}M9rm+#~$&~SBY? }e^NVΎg̦͘_QI4UIVNXIb.? _;:xSJIK_pC%Y4/76퟊):"dJU[뭖M߿V*O^묩нtt˫ xpC駟ᨙu(?A+CCcܳ-V}MO7ԩ'2^۷ߟ߰cG}jժ)?>L_mL FJeeN %D%S.U]188>W"dYR΃C[Tڧ~paɓ?J(uw;&Ujy_Ɯ{#)stwp AAqs(PVgl%V!%s !JW6QURZQqSݺkLb?aF7KK: "s + s]<|˖Dػׯ754 舰&P ;xVYS'>isgzff݋W\j"#ؼ^3MiE- @~-Y):@; =uMZ66ؒ;IeXfpA|e ]]J=+B !3s":C+Rr0P( 457W:jESXI`Ģ|3~'&&s\<^5J, e#щ|_ ;Yi,k R/gRv(YZX-iihjaS +- nZYd,BQyATcOww+(h5;* ClƎ#owWώv gV:Vb\v{$-0މVեYXX aTWD7ࢢo.7H/riiC&!F>lΝtFDĚ53Mھ]=J g1VP{Gf9ʿ^.]:i߾uÓ6 g+h(t*,\42K͸@ި>#9*iAx&$Q;EkFʼn$-mwWvnAy܅3R 7n6Qdwǻ1Æ򰠓WpikUM){h&s嵂+2 ʎvWoM}\^K1d RlXvN#{jqU'Lܰq㤎{ݶm[XX*4yymm]V<ȝ<~|cSSQDhCko~g\w)-?хl7.*:)D,1f=ޥ %_ϐ5_k&''\pss{cxvzk%*(p~h61nqԲgt4n ^\uEDFFsOj h,3A\fuyr?g#9tDՙK!k+kA@ZIQS K(TהSI< IYfR&F\^S& ,*?~v&%=b7 X)reDbu) EUUa;J2SPHC>vC@uc#eJu;z7 X6q#s{t46HPl <*eF*Q\-Z$suk QQQS طo=;P(۷:/ޱcT6Ӈ ?S| {{% ŏ,/?_VXuvuV*C3ҧωBݏƂGb5H]2lne {;"_RCjoC bML qƨܻS.\x}weffrbS.6mʐxTeux޼yٳg謬lWǎʕJ,~SuELCgP?c~xOrÃ:vI-5uU̦M-ZR2ce,4S?Gdcs `%%BJ5..`[R6ԍ1+Vܺukr#^tZS{UQ?eQEw{TH5>lmZ .LOO?pBh}WOOOGgŏ-<,I?s6rZŸz 6ֶVb[MM6Z::{{U'.1CRuACT1{;ZXHJc.euKKqԭ"hPbb6|H5ɖ3g^aq }[~~6ŶÍwĺOhjF{1O!t+(@ g`jLʳH-kgEǽ_Ei-?)o+,ʔj LW.$$p2(bIY![*M& N^A6[*dDqqF1WNN^=%695uomm ]?ujGAAjXX}?x$8?nE$, ĺp8e-3;] гsgkWg23f';L*`ӻy2Vǒ֘h(!UC\;ƲepW0VwwaSu)/YHi x;}͈ eX^F]-ToM)ޑAw13WZEMj:3dJ3"&f䪪|z>'&>EE{ؘw]ԡo/R;9D?bBy),X͛MI7pn$H34CyՃl&gg?p#Rgq01=G7 Z:9c:^z ƍ޼Y%t+_~{pE:0t_N?86mVYYi?hbRpqugѤR;.t %@ͭtLDF`#^ͽT]JnS:f}9܃R$~wDl?)7U-Ԓt;OƴiJB&W |HH,>w? ӢEF6ᆳ9ܼg ֭'YP )uܺˆl E[[\^{稁3'QXRm-K*e 𦨉.d WxDѺ j}D~*PVVn4<3KKI[1D|"'fHBwTf {φ=2nIfqKuMyͦNu,vqrkj`7^L_Pss{fT7j'yŸ` ˳0z!}ϚB ݷZy 6yX>'ƻ3 zZw vU e)85o_%[ .ׯ766N<ёᒐGKy==JKoI~WȨ^' 1 #hHqN̵,5/]~;JU'^ÞjlULZ ~.}~s=R{lP7 -l7nQfD7o gNNNO YXH{5q~hmk+1ce)FD`}SU-X7-//qxJBlhd $Y8oLiEon$_X $IBF\'<Ƣ]Hya׮簱ZYNbw ս+̟vLQ8!8Ax A>x~:裏q@M]L,RR#Pfi)Cm-*HOCӌ`?8 7k׮O?`0[[_&/d۶m/2 wWc$@p ɼ^=Ox?0펊&GfT5ʮn: eUaD?64^ZYG@֩T(aM-'\t_z-quvfpRyOȏŠ_uM[.ef1Kg(pZ欞 O!zK66L] q Qvlmbq*4ND3 tcm=[E`(զx1{)$&>2:v5k eTTvM~FYY{τ3=M(4s)C \v-VX/I!SL*IepoTJ|1(F2FM{rAB0ܐ~ 6I$bn|4; Q@,¥,߰䡻E<{/I/SҲ܍ڐo{d.dqihcWZzjoT!v|^1o\U;TzCY_"M*걱emm"¢zPƶKKKgG7.U?WWe˖Zc9ޫWd~cǢw7 zeen}}tH$/^LvwaoR=A1H,@ߝåKy2E9Ϛ1 O_e_kp.0tUH'eDYZX*JEu}DX @Ԥi 9,HQ@Sg/j˪FB$bkfJE *Waz}-<޵[X (y]hts=!fԅaa EC[R eݻW-2{bSl/:]BgZmxߠÇ_>qb]Ȋ=|7r(*۷Ecؾ=iiixVҿy 5 w#,垦T C\[Ve{{KX~Q^^rV_EM3s OwuuPCCJMB|KKIFƟ\%o33߮UIOW3*LEEqq ~DHT(w}ўYSY}&.U:{yԝCEUZϳ(paeblYj-;rR r.Q ov$K6ۻCk$GBQOhM= `&Nía~7W_L~Ssʕc,ݹ R')iݨ Qr*FꇃL VBEHUj< ^zر_~_6ldee|tF.&mÇ\=yyW϶cSa{ųYsc '#JV{cs[M}8u&B Lr=FO^ֿ6E{Sn֏F,ww7B>|%QfZR%%=G1ʕ,In\^cN*wG?Sv\zB{ 2,- ~TBIV^(Æ @, ;weۻ{Vg1|g񄃃gf;7<+u^!99' /cӉPaS/Qi\dSSaBB禘 ^/-^0yB(ǜ?s|޼eXzJ/ޥS…!\'жm)lpJ&'5[__O?쳢ENlrٵZ ѣ4NdsZgqٰ"͜Y3&S+(/6zrs,-k*S2J'Oc#ryP򜆆b_,w̝M [rSC}(./0?OW{nwOHx*?wn[]"M ,\PIeWDoMUTDa2޽YY.^FQĉXzvLz3@Rk|hM @*:x?( 7h@N_ȇNib #gN cP9}@/cm@F!lʤ Òd 3rKZf!mζJ `22Ÿqf7+ʏgcVrr \`jVJ?nn˗mlڔ7TDP Y֖^eXaoq,`K @ Hš=L*6֗\R˞Id=> qfXI6Ś\ ?|yD6lݺ( :~npٲ%JW>Vƺ~ST'we XD!cp]/t9Ȱ3Yvs/M|W)ϓ_Dlkz=k_ nN_nnįVwDv_G&va:uzuubxzNjh(04jjfƆ-ڢ 8ɜB QDn:̈́fRY5嗿8v=}Mt%'Q^ann;Fuq_Nbs"N'= )QDM D_lnMlX7 +lia64鵟}x\}uXK$\ y =mnTOm8ޙ/WpG^"3[['WREE꒺j;nx>yS]YEJ3U[0|OZUu<3odUU`3P}}nD3$ZwogϒX;)s̘6%%-+W]Q|G+ wqY-Ξ]K)!>][?{|?dv2Rx(Lv#aMZ(s4T?ww7dfyrJBZV6Kn$%';X"]AY!U );ʎ^Whhѣy"g_.6:Y޽٬cD-&jxک[=JI)-;Y=o![Q> 픍(*ĪF){Eo5Zk0 @@NSU+WiEphOwaIzIK9 *oājgFEa=1|(CwKkcuM9ŢR$NB#_.^>'҄(f'7z5b:lb$VRy.d>|!C TYvikymwׇ^Jݹs1ҥ8-,,URTAղ~Խ~~ EÆ |.kIↆb[[7ȼLpbc,ށv--K["G3&{75ַݺ)sE%J<13W[TW`IZ[7XYZMNgZ[Hڊ;n}GЇQ|_?_Xx>3SW%>ζg %:9iR`߼,+W,\,)(Rz0~`2,4âꛛ-7eK p@ wL>V>ؚMZ24]:+UHHY+23_}ڂV塬%rrNPk'6lc2Y[W_8'D[uZjb_L*0d v톡"#8|^feYhT߬1IP(R D `6mz65G8!))-{Msv%'UƲqS>qVc?C0w֭ݹ3|pd٫n[x3dtNɐp0t+ڶMb|ߥP(mlks{`b?G#}3f,=w7r'Ϝ`  o?QQb#L6$DO칺~۷?+x +tLwgZ3dw@D#<`҅ 賍s22zy믿Ѝ0&oo={P(9u? >^xxp7[7\kjϞ-7oſ_Z ~˵+V1 $Roۿu ex@T*]!˳ӿ\LYYռy3gDG{9dB7pUUmVqRSJJ11qO<{ j!!~\wY .+#69K&=!RQgg_ں5͛bc&NtT$JFlGQvvJCNE/򃂼|3D>"@pצM[0;p-- ӑJ\"**;;RQkkkvPĂL&`4ewWHbge(=,봶*oh%XS≏y ?! ߕ,G膌q]]nOn0]K{a/t`c5S0xDH.WU8qBH$CZj5#Ɲ;Jv";Y֡fu+F'Wu|_j?y7n0vSOYYYܗ-}.//OP݊O*K*وR7*AAKKVYi^#GΝqƁK`G0TH@:}vڱ F2d @~~Ç頦>@W2u1 A q@ @@`jN ]A`z@`RZ@ t;t!򶶶 0MOOOLL`Ftd2Ύ322^|իW *0O@`!9Bs 2#d 0G@`!9Bsd!яS.|#QNMY,ZLP B* 0/q=QTB`p0 T*␁`Aج^0!,,,2#d 0\GG5n zzz*++8 F#d 0T*}饗n!!9BaL4^@`p666V@s  P(v+t[ 'H(ahpb=@0J!9BI5n :::ߏ10!lllV^N p2P6l(**M6-\PX STBƚ+W&'''$$444,Z(==pJ>L" ͛7ŋp СCt#t`AaL4 קn޼@`t@0rܹ3++B7d 0\GG5n AT]v;v   SYYa`t%%%=М9svޝKg܄n5@`8TK/ ){ϟgg6m$l`Ah=R-FB,d 0D  gccj*[`d 0G@`p bqqq Fd 0D"u`4BÉb(  SWW'- ؿ?Dh Yz5:`4BYXX`RR@`p**;;[C 2NTcDp 2c`Bs 8~xmd 0\OOOee%h J/Э02#d 0G@`8 2fժUB@`! ݻbccn $   2N,F)d 0G@`:md 0\GG1&F#d 0ի 2`Bs STB`p`p:::vCJŋe˖ > L6-++lmm[2 F d ?3!2 +N ]\Ww@0 !lllΝ^Fd 0PdddfffGG@0 !,,,f͚N p+@0!A۷|n{uvv=z2Lf&^W_]p{!t[o#t+Ơ{~/͟#ٰ:p`l6[ۑ>oH8qm{㑁d?yeeed[+Va0R t|!)89yop7}t@S7Nv={֕UsB72g?{g{o xkbf '>~1gF765AHqq 0d FXXlѢsAX|XVp s  ≏WxsA@--%}f|ꡇؽ{fQ2sA`NN5vR 0%d ȑ )M Üy ب3 Y(t[`y @sn^u& #̃ H("bɏŶNNB7 2,3&Rr{tL_" kצ.v@0`< h^)!H9`2NNX @0a< d vڂ3.]JG @aiɖrooW ٛ^Xl=Jd 0G@;(˼D $᎒icvVCz$Oɚg]S-mwC=*[(,+9jI+ "(e~u{7|?3^~sPRR~Lg Nc2fsCCCoeWV2_ŋ}BBvyܹ"uƌ s,*[,XNcx*ڵи6"b] }ٜĀ6CC_T@!t B:Gjj;z;Yt9W eƍ54XPD`+~}ZMt7ՂWi uPMD ȱK+qJ uucVFqZ@t#GDFF"a6oYxPYy@hڴ|mBĉs|_]_͍E[PJHuٜ/ _~k%0XڇI`JH17Aǎ9xww"BHDHFz;ѿJ\|nPr::e >,gԨPgC8H TNZ^h)k2^!A~JVT A Ё!F7.ܸ@rܹCnI}()tD}@WT7N.LLpRԽelLJklsd55&Oe~}|q]t B@r  3Cwn0蛚/wqqܹ]|t5*;؉%m~gwuϞ*QQ﫝TP !!ϫkM@>|]; .mFk )XNgg'.Zјk6&O=:P]}Y,i(NolC%}K*9픇ktБE#usc@qP_[sk2P͋/?oRNUdW!C[[lUjkqWdLPFz_g׮ߪR k*|{0|x#$*HF'D4۶TWؼp6|U[6w17//Y L4eijrr<4k28p jH;җse# MII0aBoC;CL@ d\մ,p0ldƍFuS~[Ҿ >am$҃b(,|K|eij: !:؎aW:I +rF<2VL YgΔ!h'oȝf+o..!!q:ݛ-v~?e2HU)ӭ_MMCC_4wÓc9/hl5ÆUR/VKo݁.*G]SSdӠ> yeB@CI5HO|%O4c3f*hڴG 6ر) 7rS/Y⃿Cd-)FK5nͤ3{xh`eJK$F~Y'kɞbKG B#\mՁƌ 6mKNҸ11ń?D=2D!t 'Bf$i Zn~7@Y-w&vEJ]֖ʅ6.&̞G|I`^~kH̹suu^^ڱcsV0MQQك uv<<|[Exh׈Dɉ6lX ==G9n{_eBV{͛O"QTrsH݋]"=&ӁvCbDΟ7,ೱ|ݶ-f̘'y󒢣߾zBVueݺu1 gsO[@/n9# Di:~ "ЁMΝ+ߺ5ԩ"/q?Т,P"|Y^dg'~?jt0M˻9gJKs@wyhG=OG3f&"@8`!2ȑZɗ6VHIEEdѢ Xk66VӲB:~~zE u^pwR%+rP\奺TҪ@yBB@3ˉ>{0|^Bb>|S^/]:2rDhUTXNpixmcrK@D`6 LndZkTԛmr֩_Z%ȑј,LAX:U$iӖ75]=thfΜTDZz?/g 3g&M!@"xV1BNPВ 2Mpp$>?Фh|eѢ!IP޽ydSOv𠾴47 R(e5k֭1ȟ?CUu ڽ 4>V^G ~N MAu?T ^ZPٜ UvBH'\}{ȊBt;tLoZ .\`ҥE gllAZmرc'^usv9+kt%;e0!M!vP J2dZu(jJW޽1h!`7nRewt1xOeezI1Bm@G{.s˖Y#9 OOєW_}@2EhG ϟ7ڔ1HOyy(O8&ľ}(-EBQ%qwx\XVx[cƄWI򻼯H8З_)@;D~?88δZ-НS75%8 `fx]SR&;;oYWweKBŒnnCeԻ!g@gt7{;B@D:ǐ!ޯn=MM\]=~8YPtu%ЁHP0ȲhBB@BqF@BqF@HeeIU?Tkk T>lWWk)3B!}:3".ZrfA60TW*.C"gV; o<֭j1B!sk|ɴZ<=pi۶٠&oOl|ҮMƶ(r#B!gTVl?̗il?C# z굃(K& =H<2 p#6 =ꆇ/񸬬hT[[%03gоÿB3C"7)-݉شѣڰc 8W֖!KWTIy.bZd PoHr3qLdhBHC"7@䫿޽^s9==Vh; *-w8!Dn"c2%;D/Uϛ:զIN.sqqh2]\:u(//`Ӂ!$t 祸xDZc5γfN՝pҹiizh6zD믷,޾= 4'BQ@Έ,jcUhQ,AfnEz ȑZc/mAAs֬@ l?hO֋/_4{3!s@ΈN^>~ΜF%FPK&ha!+Ёȭ8qf^^rj\_ɁnHBB"f_7|՞k?W !w@C@zx!B!B!B!B!B!B!B!hr=wA@ B]w wB&@c_uuuoGv}>wގb!B:FoGAz_(!@"B3B"B3B"B3B"B3B"B3B"B3B"B3B"B3B"RUU۱&ޭ^2L H#B"88՝LccӧGHDH%>>`0t/N)))ٹsgzzzWW/^pdG sL2% ɓ7w0H͜ LE=*8W\)HLL8BHB"d^hh(diPfff[@$??%AWs @ !}:!4b;35?vZ[-ӱuSN5$UjPDccSFb=:.._ׯ_ RډMtJ8^IIIILLDz͚5W\:tm4K1@x|\wߕ3'Nt. .LMMݱcr geeQ-KJ@e6'66_Ǐ/'J;҅fׅ\ZvR-lܸq)L$9.ejI R yJHH(**"##j&Ix͑; O<4He˖c{tpcQ!!7 c !}:! 6i8r۵aFoDg̘ݕф ,m^z5l^@[lA~RR ]VcT`GqD<Y.sNyBn:zTI8efW4sYYx ^^^4|ENFGЁѮ^IX,˗/@yy,Qje˖Rkժi.00077wiiix㮆wi3Щ,jw Cz}FFF;dVVVDDĆ d.LM:nׯ_UP  Bt BXY$9 .A1UVAdiK@mfyS #90*YV)S4?joE˄ZLL QVMh"hɒ%ܹs{ĺpcSRR@;@]dHYтgUyi'OLB<ԕA$N>?j(B~Ϟ=HDDD@~i)GU/*ƍє] ^fΜ};A2 ď Wf`K?WK-^X)&%UDFzVh~ QD_ЁM٭qZ j;7Vؚ]S tU777b6WvwҿB!B!B!B!D4WIENDB`ndoutils-1.4b9/docs/html/images/fig11.png0000755000175100017510000004631611253216103020333 0ustar baeckerhbaeckerhPNG  IHDR]A:LIDATx XT?rqrQD4D )t4v i&jV L%I.%(" (#kݞa<{ 3k]  x  0@AA"@AA"@AA"́>BAtr5k5jƝT)N>'M$H<==ʕ+/^m6:B gI,Y PFrr2:KW^~=;1$$3f X .<\pHuAa<8(\46c…s .pKr_ 7Jx]$ RxE|WQAtr>qS>b>O{!ʂt\>`Os4Ctǎ˗/JX/Kc8vֳvZX''=lC_999pupuѣ= p<؆vbnj@151bT"ɰ;wج74*%8d6AA@U|x. nԩSY=Ok &p";%+P ۅ[l:, ,Pk`:t6ҬfE8N@l6*..Ke }_6dee^6cĽlI m0Q-)J \?]@ƌ3}t777J @& U*++A`;w@eTpBx a˭W_ʡ DwTu˗/B+s{y}vTK #^K=<ۘG'> CBB0T ?;ڵ֭DPƍ*B*DP-3JA87%Ϛ5 ^L&ك}?2de[lxA#́l54??Ғ; 8uTQQ9VL/q\w0U46f\xbܣrymm-?{' Xt6҃fw>[6ˌB:6CK1 ]*!! @AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"Ͻ 4] 2B ! {w6vK!RPAtPh,  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S  S֡çr݊O!27vC#W~:c8<\+nx-С~9nE555S?|^jwO~<=j,lf ͕7jPes!jG_jUsgE]=9:r|߾{wbf춴5 _kN@ @nE'&Qŋ 륥32&<\)CNN/YkF uׯWi,sq1n\08pHO$/ gڵ映))rr-,,lonA@9q"c>..>>BsQQ̞lˉDx(0YˉYYS*k7 I$,+""BICCΝ߬ZiB~ܡO>)vG%Edfffdk@_0Qz?>ح ϓ{ Ĩzl7`E={ڼ $>~װaB{;.99Gܥٰa A} :.G{^z583.13{+F׮Ueffd|ᇫs&Lj``@A(ٶm #i[֬y6v[[lݸS㶊 ˵k׶n?1qKGxxcmw}-[7cnc8?7|]œ]v^cV]Bdo} iYYY˖vDBcȈD˖ݻϿKw'xyyEnE)Npሽ ۰!hŊff8EPĉz4vCGnn Ofj}?ڙ7oxDǴivK܎ycGoXbذ|w}ADt\]%ɓ';] !"%<~@>z0$J4:| 1vp7]p; 梢Y[ead| 7dH,o5h!px\Zɍv=GKuk6_T[8jd_=,DCQxy84߫,!Ѭ&IKxUr tsS 0]; v߾@eeJY9vlo@33Kɢ0xH"IG+6h>RyM\3kkQ@tk,+tO6ܽ[%=:v8:Bֈ?~il,U4w36d: Fcmm>tho,lhe:rfC-lݿO0S8 os_9sɓKm`ܠ_2Ѣ5LXX&!Ob F#l+#73 8٥S1uP_2I)˽{%`abw%aa||D7&bWPcXZ*LQ~~b cQVVfiiӽ 12ٵ^\ջGzkA* =[D,_0bVO^Ӧy"+2<+b`OMM}AMGPh777N!P7o=_S,03s!Z`:д5A(p&@ZLbv&D ^ [I@ C*-"Awwhxbff 6#/.N-С3aF\ܵEii>}<ɉ_CVK RLۓGBQ9 ]W'5'|rL0_QAA0#6TT\wPNqtJ/*,ζӫ㭃.jhx+8&Nmzyy6lmh,. c3\. 3aoNN֘*$/ؑS\|o`eX7L""m3DMWW^rݽ_c9#5 h瀍㽳Η~e*1{7F؆i{xqz"X%Xmhhh(-ѬQѸ=y$ٺuFYY᧟^n)Yf=hd2+xJ*-%$d-{f9;(ґ#sGǠ*Gp!d+޺ߵ72Y&@DJ9scA"5ۍGz(4nJkyX>1i^U6/7K;: *yc! @f͒H$p_knxx3۷%= ES qvn݆:;oR!ԩS0c ȷOHjDĉ0FG;,r<{+ Gy !6iYYNMv}j\X]_dz0iaa&g,p{ڞ}9Pp'Vv]͒DwPesSTTaG Ks+hoii('? slm5j.>}_w.s5( sNu$w~QGQz8^^tv; KKK#~A2A:q{xc,>R12h{.\3>$*z`qryNP(dǏo $wM Vʌ=޽vjCC޳gwЁvppN>  qR8{zAA¡C֭ްQ/hڴ{ѣc yƍԔUIIͅjF&UTTP[`dѽK>y:b!voL'"'k 7@@ ]?;"F %&>|xBQ#";.vے3?k\@Z5ID"ڵk׭[6 ?f(&L,6kLfip"(a3 qݺYI@rrv7bm: T4\phKoݒ ƟZcaSQP+WΜI iJyK=uyf```E2}ѣG'''{zzwNJʪ&K8WŬc..ya2 INQ^FTSكOmc7$xD4ɓ'&5/-*/63),7P"$AӖuBdL<`'YP;)DoZ)܏nrs ztN><,ls NL׫]ܼT*LcA {zrСu={57۷%ҽW)'>~11>GT@zw!yA) >^q.p[ ΀7(Ųyq/ZM~.&noaQ ̰ſ+q k68%̌C9rK0ldw2(*PeJJNmҥb4ztx({+J@hkII:yA}{ŁSS>;ùPôiʵ@Wv ;&#˭ .`;l /_~ =eb НZ9=re45vllp;S**gkMo0e:.eee"~rL--ʌm#3gnP(fǺNu bCЁʔc? fpDŽꘚWq@Xpb||0jzc:97n_}fC&k 3g[Xز!CBbÎ| 3rTCɓ-ݾ]t9#/oOD^8Kc2IKh?wm߾~rN Pc/pS$ Nđurp{ J:Ո;.EZPjbKB @sٳg&P޽-慉Dx;, 5)LYwM 9Ps-;Ѳ),$ݺYmѥQnD\V RD([HZEZX DhB55m@GMdi5lO+A EjcJcG5.DJ%}08otC;[p7jj.0=vo[e-<{А[VVfVL}5kk=Cr -ʪmVU,--j/_xj !ܧ{o.8&) Tr.PJe&Oo.٣Np_qB7uܹ\V^qAj2eAiЄj@d׵ H_q˖-nIBw1a{wv5h=K? 2,={J)SnYxւ8w""b24'Ovj߸ ־3*U֦WkBE-R;?mbG;\>;|0oeˢUퟷ#EcG.^_lj&Ή'bccy;w{wpеC;;d̶޽{wIw1X?rյV&#2"ɾ.eP3)`䤤E,iPuu<խCD}mػwk%IpꙋKcXbYy/q̺ [A. *o>ShPTSSmv݅uuptԖ\zw]>ۡwV{N!ܧ{o.5&Z6'Kw1sS ؂_vbKB,^=ܒPl|SѱeWLk>?YxM ܸ=aX>rƥ6;sX<_ ؘ`?Q~.Вe!=%&ƤA9Ұ!0$H RoCHȚfBmFBm,[+ok_{4 ֶ)Z8"vh\F\Bp1+Q9P{ߪS033"-oD!яVt#bI@3WesKrw3`3]hQbdJl:  ۔tJcUr6w!޶xHn0Ӄ,0ImXt𨦦۳'3Ex7>}|N\DSƎuz<@ fYU f%`uOvn빂%N^ep]`;w2qqv^W=7# Ԧ1itDEEmذA~kkǏzi#GNŎq'!Ǐoa$feWV;9GƁ'y&gmVmZZ+inNNX~8*PQLOWvD &:`iUUljm_qqQ>'%--Jcǎ7oُ޴QD6T(Sy7Gʪ?p"W}c{A8u7P݆iȺG7^r>z2r6x:q3Xg6tޏ\0_ 2qնi҆°;Sv={jkkP _~9\vn>KKEG[ ^Mڿ%f ^1//wӠ{w_{C(m_ $$@"n~1 + _TW:^|rzwO8ϿzG9tnIT} >g??p0wo+D0EEuu f灪4%ڊ ThC\K @_|w{wc&>M- +0yFX܏%7!xas_sC|3$P̈́7 ¸†峮}=CCO1>5kmbc`?OH>p닊c d!z@н+zetJ_$>--:{v;ͼy@Dɇco/..N7_%DSM1jDr7!6֭K=a'@5΅;џp@3qc8W\~5v 2@aZ6dtoZ˗7́au?zMRTVƼzXzKPGM2G 0o6a>2ԓ;/ ܛo 99 \,NmmN^7d-P 9=03Sssw X%IҐ!SWJ?ǎU~ КzWW2,#&ftϞ1A`*66XŋGB ))Ҵˏq֯? DFz&%I8k۶IZ.dI2lC;vDfg\3zHdu옔5C}}4M0. Cᶻ- YAҚ%!}{C6 aQ> =#JF Te =i)Ϧ\qqôB3~$́@Xi7~C f%2"A^VvY4ibq /s6$uq .~{,ֽCAlыl9[ 3}ׄ TbSUUfggrBɓzIq#;Opt . wWY)q L%LDnZO1%j2%-P-mA,4;`"XXtGɹ<3 Lhɒdp ϒ׌U6v01gcdKa LqqJqC9#%EF,ğ?$K#P 7}ɖ{c?8Ptl2N8|~=?nO/R-x]YcNfoI NtY/^V\I4 70 IW$ K(tT*5(p7/o2/4쪪k ͭG%Vbذa&@(oyywGa|@wƣpE 8LǧZ^2F@,.j,lҤ}%!!s |3f( Jdg &f<#VZ.B(n=K7 fv}.6ׁJKR!&%)oaaMVVh { $%-ү> d:B֭+M./|9_VR__׬gpsOKѬSdk}[ :8̄ ([L˖:xv Y=$©aן(\x< bٷm7Ϛ@X g샢ل !$ 2Y@8{07 ӗbx(/1yi[u }rlyy69PkTQqӆ.]̚.\KJJOϐ%K~q..w/H>.$f~k6M6p =Em%'+8M4H$f>p`ɞ x POD’? +ٷ/? 10йK@˗ϿzG7n.DP(𧴴Q57M"91I 캖VMCS6o-ZtF3oonOJpΜmjF~}XsT];mrd H 7a4<+%,M}K #C4Bd8;`/b WC\3q#{`C*)ml=ɴqff=m)+kZ`eP;@}]ɝQѧ+FG]3h(uaںU8n33 *X _q9Ǡ{5àBꪇGTsBDtaWuA6o2 kIIY{0I4 *oFdR"œ4ymx{3y-租9 5I 8DId(&@%FCÇ?|xjYKoڤ }7E/[X,fKO^d,OS af'd&`?3fǣAA+?HPdW9رuul>]G0)>ԃiZ%""bٲ͜Ґ g{  <@_KY2'ưE{p+W==Cή?觟އ^}>>mɊG}|G:qs@҃!C9iT] zzzR@4AtJȁL 1pyKܒ FXΝ|3\vy'ΟZ]]Եf}rVUoZ۹-ÇKeF>a x(_/~\n C-#ogdmF={Z/JD;h-ˇi9XVCSL9S!!I߿=++Az^)45؃2Zꃮ#:H$ih?p:.thO,,¶rЯ (7sٳ +48ܼkCESxe#\ܰحX[Y -;XOo ;tߜ=nB< &݊na <+bdeeϚSVV}9ܾ~nn~E퀀`3goonn{#Ҿe&?| c00%%׌(""¸-1@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"@AA"Y ~- P(4v+ =`^(@IENDB`ndoutils-1.4b9/docs/html/images/fig10.png0000755000175100017510000004334011253216103020324 0ustar baeckerhbaeckerhPNG  IHDRev=FIDATx \SW3ZYD `QR@EbQu:[[[G֥Rm B *bYDeFE;%I Y y͹{"ovY{Ϟ:rCB!%JCע; ] t,'t0tM:9X,&_={3 ]ObbҸe0WCפcaU Uqu 2t  #|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_a|TWgZ ݒ1/o.%:4Np !2W98x' '$^oee8gΝkiiQ2q68xDԯGvvQQ면iB$B@ox>}?`)MM, bbsqdrKvCj3䴷oNk2eq`gEqq2èB$BOC@ V0+DLÇ/;)"d\R׮٬̗9'V0?ʄ966=exF }WA< ?k 85,lmb$;}Hwջw,[DDl3d)6*>PfEtn8ͅxD'|I>ps-1"* ^$>5KNBmEoe$xQαt1O2Uµ [A*ܗ MxaƵ?VN_q)jbqp_F#7t (Mh9qᜩPک8  ҡ瓜*7"E/aD"=s4L~ FlfŦ)Ǐ={vttFGR㐐˴=zj*CWP r䡇O1%̋5_,!QR## VNۿN>Xs֬Y&F虘/9RRRiEӥɓL@羜p/M_q(a{UmCafQkgMY^B 7^̲,eJC aÆԽ{&J8p9s---<̓'O=LKK СMMK++;wF]aMMlgFF¨Qo߈Ht<+kOZ݅i,r(v̔4 j~d`ȰC̊ VH_5o ]/V/ }v˾ lHSsq33 Dgj%@vv}laa%d,>9U #lр,)a?8qb%=='hx2=Vu_@JRKdN|s e -.>Tog;"9Y Y??22g\hee5@* /o@ԌYY!KR ҡ瓘˥ ߒAi~{d_=߷sPZzڵ￿~Ӧy_~+toΜ9_dƖ:tQMjR9 $;pW% t#=m?ǎ-vq UrwO{z[Y9xf[S^KYlFG Yq &p-R@4ȗvڔz *>Dw9u>X6?\tGm}͂D´[ nO.I9*0,@fl)S>ER<<&.G!ܻ7/?Y; % 5똍BNv_C̸uNgbMʣp<>h`D`nM/;4m]惉˗SG^'?=Hik[Hz}{rA]2-\Hc ;\vQ8,URr), ]v6@N%7"\XQq*ݷohxWH$c .dţ؆+ɯ-H`vZ\FGGjdۍ#glz*Tlw3,,$38G o2sgKa)WNcc [oRK@ꌌWa(MT ';lYf dSJ++؃)#C4&NK&YCNMLܵdbvW=3dH47ܽ[!S]wwd"&vݾA*cU5^ZQYQq0/Y%;:2q%Rf|i躝K KFx2q(Mu֭qgTGxzNϸ|h 龾Q*7mxy6; Oy3'00_ / LO_ٳY/ッ"I&‘l0|WܺE.54n:OH#N駟jKMuɂK!|k\\ ȉ X<#2Ս beaCC%F̲Cv.D۷g .BxV bW4Di {YG!ev@ȗ~;]+Mia߼QQ{uTNϹs+;=?(hLkLYWRTjfփ"?n * M`863랕5+w.rbqYDz̽߈@*NVõuH enٲ%)) iڵ{Ԩ9_2FCC?ypܸ%s~)33~K/_>j(ԑ0V:2aDxQ$IyOrIϱ kks_ߞ@&Ǣ=Iw]<(Hj?){p_)SٳG>}ݺK&MXƂX\g j)q ;^~bAܢ={W$"JI./ٿP\\ka\t\q@?G$À<FYjY&Ty£UUDJ+*Յta%ܮ]{:8hmDS#;{﫯nTm?y~KKKY0:LđiiiN%Ñ{z Ez %"Ѭʬ {N.?>"##[;ɗSJ1t-{jݕ/ tذSSSi,6Vtɰ}~YDD?cw CjzvveZډ-83fΜ|I% :RX,޼7}Xkt"\xВݻ6̙3oYk6L( j筷T2$|߾`u%ueΝ;}ΜEExiƊ[m.?W&?Bp|1VMjkKT3f~~SSSg̘z-*hŊ7Ҧ۷ "Z0sfTR)%!!#kaFCΜ$_-e.X0磏BH ܼ9ק/ JKKk[[Mw4Y~1eʔdȕ+:aRhE.A[޶/\|I233kZ+OTT22Th9uB+hEwl9EVVȗ ))%8}!eyx>SRR!_Bse^tcs˗`>b#7ٝSL^k_xDp\=^ =;wӬBhU̜nٿK/ ~!Wj픤^曟/yUߴ7<23+/]~2kĩx2?^KSҥlT(kР/ws D!5i7mAU|82ri } AA--ŽׯRYyҁmzd#GY[RҰd7'zDKu0u^CNRrwO?N!>UeAWwFDx.^#gO#wʿ#}Æ,c´۲`[œ'֭'K7n|>Ɣ8+CB$ ?|a~ժ3jkK}4,oj>eArr2%KF'_?̘ᇇ@ׯK:,+*?~5 `mmDuxvS]]H;VVYnn=w< " MMj=o&_.%%%nnAx:/kw꫿7v ??kW˹kBΝUUEbq+8}>\eg%{y׮]|)'Nlvq ;dC$I+!(YUUŚd##yx/'2[]⇹S ]ـdgKǾ}{$ji Yo@Pj}04ϯӥivDYsbӏ?viiot17X)gnWPl ] K&Kյ>B]ۼ9J 5?GlYvjח?RKKa׮uuuenkk'?:ujJJ ?1)) 1Ylh_zjDI v!#Ȇ xkk YϞƶz:F4I2WA2@Pό^bx-h/B| 2_2t-$C ~8vre2$%E fELŋ..8niyj?yrvZ7q~= ~DaZt~Q6.k~,HMqΜ$w^#GOHW (#ԈSz٢EX 3~lyu_D8U>b/EwU!:,ee{ҴMs"T13^xK>L*Hd$DSQ Ka>'kI;D"QWt"е #ΚdSrݖo;%,!߯5sF/^Q\|¢رέN9CKqW ] pwu:"\&,4ihZk?h(hssٳg'%%577˜Eˡ1<Ε|V̬௕2"8SPdgW $$@z^fMիǶkU?rj+ 4t-$ d۷[8֭b6 VE}vtzDxaa uWaOOf;:zJQfff/KILLLMMMII399YX~X ZP iJe} *u1Z[:?22}P]iiCQtNvu/|c 8 ׼%_.7!\;RFƟL9sWW S>fHMer~v-SJQVřI޻nݹᯓ˫w1>dsquԨK4Q \ΝS~uǿyf-:SiV~=ʕ!C¸e⥃ߩX\z]WG$8uq~,B4Qzr4ȭZ~Ĉi/2̺hu{jZ) Ԁе0ȗ& |imAw1 ++wPS0 |iӹ{wܽ{K66o&_DG|i&]-oeOXKڵ붶h'/=h@ׯw% |IF,mmmRA %nm*bV $o>#$u3&~{0)>;Z)UA& D ޵bqLʭ[JP-,zx 8r4kAn@(wuV / - TV &H?5"?dV<_?ʌXn*2"&fd$rǬ؋_z^ Y0Y!aa q;?hVa/ -"BV(tup̖JG:R(++1 -|}#3 BRVHq}իdyaH  +V^b1^%|Ihn".ıYTTUU7vX,bV.Ĭc^d(gD ۱uŁ*-n;7 N DyʀXMqh !Y%V1>?Mq־K baaI&%pU>zk!BT_Y kd`D8xpc_ _f))x+2xWHf;^.Al6ܳgQ_<|d[}a/PSj%UŅ=ɒ vA$ML:ąp,ei# 3X?bu_倒̊?`lu:`󷅭m?u;APdYYlWɶI;6,._R[[*%N[w{):HQ%{Ǝ/>'Xvذ( +ZnBA/MGGN7ҹcGt~Ti.e{zq#䫤B\go{KɓG,1t-P 3Ϙѷ 05ȗ&CYFLhZ,0 6n<~UD*pvuK޾wAAkaںpcƒB $Q\|^^ˌr<#yqD'h?.z4r'!GR-N x&(>^p8+pѢd(311U/M333ss D6f–~]&?ܳg۱R ] l;[`11dBd~8į^^l_?^w[ZMZ)J,ਕ]ե>}ȑ#*s T?/iB$'[,XDXXX{X+F"/_-`_n¬%ץ5W $Y)PN~wTYZjEQE!3HGߟ:u Bƺkxeض-/#" K&/-50bEx-Kdk٩"/h E4 G”,ۻ`Ճ i!Z͉ 9a2bH 55ۺQ&R?Br, 32!*B4])J0#&VđPAc~q^ngdH Nd-xpŷX&ϟ %zY$PFjgcekvϿ7>hkU,w(_44To^…Sa"}i+>}?gp9 EcDX̣( 89 -qwФ'OZjj:/!еZGߴUeƶFpeR\0з߾wdԩ^ӦpS7oΆ&'^""LL̹!cn]__ =B>eכodJVp =vA 49Lo1o\@ >Ӣ"PC(ڵ66΃W6z@ґ{DWWt&Z2QfDIJ~ʀ8X: <8ToεJC_޹s_ڪAAttꙡF[>me H /0*(P~ ŷ˶ֳ-ګI‚]=O)|B镭Wٱi{Fa`˚RSS2hгڪA(f.Ν[__" T|iҌ3N$:41J5LO(gwիaac[% Yj#rȗs}ܸ3id-և 8HZ|iwo@01J=r䔔|[G,, [쯳gFС/^,++sFhN1CBcooH]j3d+WNˢ_P Rw/ AddO?/3Ը̙K^”!Y%!0!|҄ "Fu{'OZ~`mjO$K]C$$gh":xyz5],/󧙗4i&8ХꞋ Y[ ɗd1c]F СK_%DGLB;TUUjY֭;s֭\\&|IHg޽ߐ/=֭v*ǣ|Z&[pv9s.EE?zxjFMnwn쥑QKBBdde>di/$4ܾ}i& 9,5%>>EG/94A+4R+?rm`"KBP(7.T ws4Y_9v,AE_FGG)G Ѯ,(Pts?dRfQQmRRѣ,YX;E$ꫯȗT__Pek|u@S+_5٥==f f OL  $_O133xrڻm8h͜I;Y+FDJHgy䤤VVffn  }}%'$jf!"?**ANG~+*Vޯ!*o?URd}>c[~R'5+럽{o+ï>:>~\vv6#|K ٳg k_0)\JII >L`Ъ;))͏QG֐h߮}*Tvann͖_1!;t̋66B_$bff;HQK vؑ6 R'c9JDE۷\)4hPe*R#]x+,,d)P/[}CB-1!;^$\/THMM׿w^;99+ oL￿X^.<Co>4? L8ՕXPPpʕGFF*D!@uu~>~^防T@:]uN޽/y&^Ξ=T[WW|!gGܹH4EH'EvfemfHEș8Q&Lnq(%kDӣ/R$KB$UFڌ._~W_}U I@x`A~<pjXDIw36Dw!YH؀gR mJUp G}̊mq*k 'K{C'|iܰvWD*fɒG>c-UӴ >z=N(}Qw8Fim@ b48x_&Xd.; lg-|-j6w+PaD.RAh/ ۷lnnVUbUO|BEy:qbsl,Tg5N;{lͿ!^@s]`ff|[ii?n&˜1qwD2ޭi|M(s֬YaHt_HA$3)ٸAwow>;F|r.`xɲcB4tM×QGjȴo̘1C[- ZJBB1 "QˇelAUQQY(¢s͗BO쀐/;::mwU…Z .[Evږ:=" >L"Oaa6m@2 B:I:G9273T bP kߚV,gΜ/'Yv4' D &{uʝEW.Y-ʋ7d2ǃ,zNcrZ&hx#]vWP ,ܳg.Kyh'{wψ [+IeeѳwVa^^SBCװ9jԛNN7o\9uRVVf^wPcfփ?sV,>c>V|zņ9%;X8mOWsT)%drӉ #4%|2Ky);a{Fqm7 ]wގ?v츤;Np=:w ;vls_"75cbC$Z̩Y"[Ý/fge OP뽶eGտo vS/H>,!K UV;m N(ȑ#:R̴HLG^m LNJoj=Xй/OfIF{CuD%VD{=SOspc@a[Yɵ6^s,y~L_8{Yzӹ6߳ ȴz{{]622nz a"ȷ"ݹsgl޼y$K@du 5rCjbqp_F#7t H(Mh9qᜩPU[% FQ=/$&&Ci~wygq,;>z>ɬTfl+x+KYQ3ňk^,_:Z {cB, {y"Jej'Lk 'Kł*b}0څsܿ!ަ&TJK˯U͝] rVO?3Ҹй/= E֞ytdKܗOnsvfuqreѣu}/PLIIP(6OOO|^Ô\?$'Y:C,cJkVͿZ YBJ{ aG6Gf) 8!Ydw榿^Rh ooSN;w4mm=´E.M, rbiw4}šV MlH^Y`Vͩ*KF#?];? ZT(j#\:,AjGCdRlaٷo .xnuyy{X78N>/lL@3z Ȁpņs+ 97?ǮUF>e6 ؙb!NQ[[4wn`k~wkjtiG}H΁@rx @ɽD47*F)SDWXY| KL~֌YY Oe팂|T-9# Yd9eʧ?ؾ}xyyisvv1, KkSUuQ f 8q+&[liutU<*<0nzZd5Ddz6S2W 7޹s--m5U ~s+`ѐK0jk;0 :| D`g..Eb!KDcGdgY]aH1̊'Nu+/6Vl:d"6~ {qM8>th:w+7/]]V}S ?iz/.>ZVeifփ)%ʸItnȗAha~E.4A{ Kmdk)l5VCd)n,—2#C[Hhj6gDe+lIwĊS/nHčd*qq99!w#HAj]z/ &FZP\95L$=='}M+*2'tN# ͪ|@",1*Th7vwDHAݻ!OXՁu6)6`^GQxw4>֤ _M 6L ^BfgE 6HI]--q0uꧬEܙ"EDUY'ܹÇ/,+-,idA$B@/=-񬿓/sraDxOh%A7YkeevIIH9"OE9P)7,m)K[YI+diʐ/ 0 cރE(,< ?D m"dHAfĈkt=qb%C!ܹgkqL~Wנ>}p#Ξ3 RJCu00گcQ KDJceM%Abq ]6=N*QĉE.@ąE:TbAxD'QùScƬUSS- .o3.$k(߿Ϳ4ȗAh6=v`g}|b<='pa @^Rrꢗ ȏ-G},("yǯ 9+ ]_/B8eʧHǏ@IG}13boP/ _l'%-U^vQApvuLʔS !_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA%AA(|IA!_ArȗA.=mBf'KK 333Cׂ ӳͪU4t-:?6t0_<IENDB`ndoutils-1.4b9/docs/html/images/fig4.png0000755000175100017510000005722711253216103020260 0ustar baeckerhbaeckerhPNG  IHDR6;^^IDATx XU׹ `D#8D$WC$ Qbhb%D{HF+QohqX{A!bhHcQ4 18Dr3Cمaiii~X1cԩӂ F|ӦM;x𠺡(fΜ}*O7n?[Ȓ˗@Ncɕ&{t;6..(dqׯ˥Y`Dᵒ $ZTf@\.y|ᕡ!ތx6 "">/ۑ6 r>}` "@ lݙ$Ɉx~}eff"F}u>ސR,? vL͊ėhnذ=͍2fs&xBiiu~WZxzyUP_rEh/ 9кyXrcǎ'OƃE!E~o>iFFRGAλd1r*"(,,֭[ӧcvn: DTqljsKyx0 W]]3 HRKUռoKM6qqqX]p!䈊/rHj"?&|쥡עރˢGՋmHc 7^jlڴ ?\2h6X=44T oƳɂ!LJ:G>,'zFTX ]ua)[U6 @mUVd7gϖXjdp0b̙آI¹ wRSSg͚ Hv7[  |n/{$vevyҤI9n>vܐ.Aby `֭[z.ٛ;}G#)Dh'KL[D8벬^(!$$bYz= $^%w-xAI/" 1*p,@uGy0@${πV/  E‹BT^]6(P;K]5Cߏ"'"+Q(Ν;~z^~{QhT'R gϞia}ݧ6AŇN^Fbt(I!2Iڌ\ \"7ٿ?V%%%aҥKúrΝނ#F-"YN@$ qݻOYi`,ciӦi嚥6n ,~-*2SDp`ԁS KD.Z^/) =zT 0|)FÍ%؈S%ODj_(}P^rEDW $q)}Q-(a 2GW%AUIf=JD=9yaԦ16l%#Af͚%e/ׯR@ػwǰ P[5"#Ǵ9e{ EҪiӦ[GZ_͕rGO^"֣G|8Ld`%[ŵHR\9x4 q]A\>\OF,YdƌZg #6_sE5jdx xgyEDZ‚QX.#!iXQ]G [)lD ٞaUwv 7lGj+* m>BNZeVv8K #պAu !B̄ZB!fB-B!3!BPB!LEMIIɋSܹc!ܗzl+SoxͻC-Bmrrr;󟋨PR xvGvOw~wZ<4GmͶ˹pZY N=M!B̄ZB!fB-B!3!BPB!LE!b&"B1jB! !B̄ZB!fB-B!3!BPB!LE!b&"ْo~WѲy4QO|vmUk!nKݽ;뙒lt=8!&_>_xNQ':w&&Kk!nKݽ;ӎ$\6{I]a)jBd)r\k0LB܍xw6 $!]cvӷ6\+WoXo_0@l6kwAtz&@I݉a#ߝZSN;)c8@޿ }Ƅ~}Ol/<]eYdȎ,ۏJ17,~@0%q{vGPNʦG;u !nŸ/ړ C Jݑ>re^~{雇{<;䘲+ij_T2V977% ,?G.=:?~N.)Ao(@آ'mwݩOEq C[#;C^w9}zq6߼K^B~$Z5Cl3u%3#j{ Af7*جiÖ͛}eQaO@-Bx=B"S]QB T׮߬P}P) *QS[>:rih,#^ɠ[A;!ؾ}{S6"PF9קoL{$6J/u.'Ft e\i~dYki2TR-bccXm|w<jB܈?'2PW9/V?`,{!71/}d2ɽ?(1%Yꕫ7)((xg/]sݱ(|w<jB܋rpR7xg}z ؗ>GH\dJF e#F+׼w-8ƍg̘ѰaÜ .d[ZDP^:%ڢcu^X.|M!'vE7 6GmIj"\oY+1" R{GJ PQQy氰;wAb υZ_0\2GC3U~I= l/>SGI ղ S5>?5s/Ft DB,}ڱ8CIIILLLAA3-[Wu@ xݩkE1U(g8F?ĵ;nnZW7luhXu2Q}N.B>|۷zɓ'׿u4Os"x0y0\I5L?fEk&$$n:333,,ls ZfPTHέwBmq<+!G9DEEhljZ'5'"@-B!)Lw! !Yty`͛7{qgE!111ZBm222۷oܹsȑfCjB!6]vmfE!|Ͷx9"B DHC-B!ڵkڴit! !J^ze˖nݺ">!_<66OMMgE!ħ),,9r3g,Yd9!e׮]'Nlذ;d!> !(AdΝ;v4PbٟdzVT\v-k1grf[sԵǽ;7;"&&&M6f[Q=׿ul EAA>{ҥ:rwCwZEFFmE ۱c_{5m!nƍg̘Ѱa> :Nj՞s!{@0ve˖eddxV***W^ ͺsΠ -"PU̚5k͚5o&SVV=qTV-"PUhb(l 9t&t /`9!HHHIIIom!DrrrAjB؝;w.[EfCL"S! :ujzzʕ+9RRR2a:Z/$::Um۶%''Arss~m:Z䥗^y뭷Xk׮MHHhݺuff&$R5"x'C Aij*jߡ"..nQQQ"!މ/1=JJJbbb f̘l2Ze񉉉"^ry뭷&Ol9TjBT9wCP̚5 ZdiiifB\Oyy3 B<jBN(/_ΡӧOAx:"x9χYv-=&222۷oܹsȑfCH! ZfͬY؆,]t޼yv'E~Ν3ϠͱF<򸸸lq"x?C A^2e < 7MPL6M=oBPL2^CeŘ'BPg?KNNʊ6,山bESRR|MjOpȑgΜYdIRRRWP+hB?>ݟ]vM8aÆ.g" !>EzUVm qK/;ɸsΎ;m!u !>ʶXh${(A"/bzzu-Zd-DoB-BoE=s+ B|jB| <3ow***W^MPsK֬YCiH|jB|)S$&&"&q3f4l0'''22ls1 jB|????A$,,lΝAAAf[DP̚5k͚5/NKK3B ʯ!GiѢŐ!C222P4rܳz"XC-B2+Wf]6!!!zE]BCC  zrr2{ ꔊ͛7GEEA!="4/8YRRRSPP0cƌe˖QbZfȐ!aaaڔ)SXFÇ}6ɓ6wZ_KHH8ֈ֭[gffBm!n !Δ)S^{djBBZ_??fϞˏ;\D"mܸqoA-R{222y:<"qdHW_}׆KΛ7/88x֭t!IE!-qF{V3 -"c!Tұc5k̚5111sTO"%%%/Osنx?s_J~i 9sPߺu+ٶxAdΝ#G4B<O"999ڝEmdz;ҷSa~_ IȮ]BCC6SxiښmsҳfA <3[l UBB\kB2dH֭7l@-qA@-B/rBBBFF ÚO=v8qbÆ BK!|)S,\7,//_jUAAAllF/ҲeBCC!D8 !.Z=ܹӥK}dKf5M8,;pSSS B!knܸ믿6pȑgΜYdIRRUPB*2dJ\]odeeEGG(w}rE!H.SL2ѣG:tH&CBjB?/EٶFrrw}=z'N!u !{Ϙ1Eli ,`ҥK/ :RPBL1Թ/36JBBe Km۶g;mdh ^(+ɱ={>~!S@4lʙ3 iW^ђ?Ogy~~hx枟3繈"ǛC =Mۿuqƙm !>3#=i0ӎ@=,=K<c )rdWԾ8BDDx"_4KۉI~?qqR!@; &Wq~{4 {hqSR0?r֐+ӧg;~`:!vÖWAa`!U3';(BD]L Q_fMld+æ c1~~~׮*+٢EcmqG:C>:Ee{><}"S]$vS MoVBcx{_-wBP9-1ˈWMv 9\q! ν/իW AAA/;Gyf-8vHQQw_m!ķӎ7#v`̓+]kW 5K?IdY~ ?4H`@þ}d$.رchhh]@\N@Og͊d غgϜf[CA-R F˞S;es V=ꀬ?}.]*Xr+ Kߨ-w=S ?(1%rE?'OmxsSYY ?~=m}|""Ϗ葸"?=/đe#NZo$-,DGGjyy&~իՑ#ݻw +8{qܹ>}"۵/}:mڞCֻnoO5ks?:z8?\8~;s-$נ-h" CmQ7 :}t/,\Y\PB]}MC6QwRƼ E,v)W QF#--%O>qDjj]v cw=}+%8F| ed|}~ժ?^|GKv y>蜺ɆG\jӦYvPTja(kVn|x*|/3uT4Z}}c+Xg'>"q.~>ňiK߰vZ- ҤH 5򃞰fooO= 2Q"J4]}8p&8vӧ]6suQRr-?RQ翅 ޽% /Dk)SիoQwI'{pЃtj*`x:q~xxwܴүnKJ:0ujXqq u1f靗;jY{fs~IK ]7Ы؎ׯ.RTTTdgg?//[6 yj@^,Z_Fg̙;?ԻwjPoǥމeUes?BƆBqFzR .?ԩS.]ܬY?BsEQ3OX,D3u d4 F\ϿǧO۰<($yxxg55D;\ 1W2`@p>^|͛G9/1%pȑ;w^N:M>A' {w V Z=,xGBBBܳݼc\w̅Pz/CJKK{XZnݩSM6jw%PR= K<<_~avZĪR2{X̅jBj=a;M oE8< :XzX,byj!Nn 4{XC-BHb6;;=aca ѣDTTZxٟOms#Ͷ{ {>̵+W7nw|>E1sa)..>sÂ{X7Z$&&M6f[m76݂l'-;4Ɣ;2uԧ~Zzj4]`E\ >,x=EU(d޽{Xb֬YyڵkG}S=,}wܱaW=,2J{XoZ_ [RRO؂k( 7o̺u (++S*8{ԧOaQӿB4jB<qp60{(@ٺu+)6sL} "ӿ*"򚥵QFfS=ѬΞ=9~xx8*fX p7nܡC^^^^DD3?Ce3nݺz9s ҷ~1qmylqvϞ=}]zuj !W?^G, ˎcBjF7nܩS/_ܿ6a"E9;w޽{Q(ǣ.oOKKSoŊnUȡٶmۺu4Kܽ{w.3o<$کS>}HO>zL]jU@@$ߋ;i<([aFխTɟ/4xwM2w;?3Ξ=׹sgC/${Xq!.Aq偫-`0Çe;DÆ C&.`/J;sw$PDƍc9$$W=ztϞ=333oon+ǿ\ѣGC)͛7Y\ފ6nzРA ;zt)y ڵo߾;wBy!ĵ8"(\b]&qCիWm\+QlƷw!FkO)--A:yd)\-ZE;2#@R^z%KӦG,__8ӧ/Bd֭bۜ9sDNW`-SqwSTTt>|8) pBc}"'ѡV>}Z-C|d{B[P'^nR&a%SukH(9P4J,Z .i@ӻwo 9Tmۤ7ߠ.RIcTQZk67ei&q46S j }F eBDYbA@_~"Ua-J4[N iQ4wH.D)X!~_W6&$$Hk/iE!BαL˱EP/!1R pBR@+dffBgHY " ӫW\bRK) |@-yy-ŋرc! %gMpD՞ZG*wAomo'A YҳgOZ֭[n8jt!xwpyǪ ~It&օ&@Y4$(*F,XONho***Afخ %A=HRdee)UiQ.D {mׇpޱzyǪE39PPg5]׃ԃ,j1i={1zL> HOjjjG\N͂k[/d՚5"X$$Ԏ;)DPDڨQ#;hӧ"ݴiStta;ηXs<JW4KA5g̘텅߻g4OSRr'.W9'fvo"7oGTm+G( fRqiD;vl\\ɓ'ՠG(Ƥ]ksڷZP>Q2G.ZlT1bz|BBBbqDuzDXDpB ӧOw>.eСCQ98֭V}Ūɠl{* tѢEΞd:%K@-]=޸zS_vr9o3zt疕;6fZDߋkTC@ ,X 99yڴi  *84J(%/\Pe,/zA 44 JDՀ]+V%;uK>!NH쬙\Q%$8+*Rhȸq7ydV)0IGQN\ eeei!ϤI=DO@^,Ztp#mעEg]r  ZD:5MWF[E600o߾%Dѣj8LJ, LEz$Fe3 '.9J\ Bܢ?`\JCǫºuƎЏB3g$emذA?!RII5֙Wz5j}C]xiӦ"z#m^Lh+//6ljԨQvnݚ4ix6LA >֭vpS_i\\e]ZJeՃs׳g, 5zt|el#5Q =A6]{a,/Z"Gβ8͑-}le՝GuK?.eF|L-Ppp o`WGx`@ǫ gRptXGX9s&"8=fYoџn3AlFy@ @a@@^3f{Nav̙7oV(́+nk/GΝٴ͢Zڋ_NN\dd[{Qt W~o}{e"`:wR!N"=~+YԆ @rrJc޼y1#yV#̱ekLr v"'Wi1D\`Ǯf 2.MNp|4S ]?8Y\#Fj@RR'h# pGwٺ5{5Pzד&K *sK:q> 4fM(E KErXJJNDD Ν2kV$Ϊ! YիQ=Ȇ DZ.]s?\K.UYd6SڕϞ=;lX @6k'"fllx%dшSVVց>]&~'N\8z rA@̙$55D:V9Tj#ׯ=| X;?%EaCBĉݶ?q!6d)}&҇Cj'DOs& Pۧ`:6mڈ… !G:t ݻwsQgmf%nz U+ kS[,FI-b&^zG233 dː!C~k 6$rndW c90)Ҥ!&8GJ քVذa@` ~)7oVhNTXׯW򪉌 W}+P>8m䤥l~CmNV皥1q:3ҥK˖MFٕ{DWj(;r||<ӧoذ!//e }ZOuY 3))C{) RSSe.hҥF(ԥvUk( 'ǽD/:e 2t|+‘v"Hfo6'm6 si>5d6eeeؑ͜GE!8#˧KDa)pR5pW9IDQm9ֻѣ_@:hS)ݶԋ*OC9j Y-*[V~7j˭[,*GF;s{WشV9A(Lcȶݻ4>}3wn&KɎC&NꈑD!vvMދB%ثg8E$m 6} Pl2??_ߧ7!fPW/ςvwPl5y">>^i&= RեQ98lA?}t遒K3'xm޽d[hEBn݊_WSN &mZD|>|Xi&ς@)u1:E1i$q>C VXO|5 D)Ql0ܹs2ω~bT\)TH@@L"f(լmN BdK.]~=Gxx 6ςaA ~NҾ}8Q\g*ުUZocڵ aaa;w By3ϴnݚCRi0y֬YP~K.co@-q9PЊ#e"ݻkߟ̵j22RiBjj*ݻvw1uaֶ۬2 S?gRXҕRyquw͛7oɒ%I3x`+WtjB TDEE۷Ozd egf$Ātj!8LiߟJrez,{łJtc\7xgܰN@]{,3dݺRRP֔8p]KLL'_)/YzO?z9qLJS!}-d˖11okZœOz8,uPP3GTTRvÇ;V2r_\Z1jBܔz=((()i>~Oٷ_r'ۇ? .\+(|GGF+D;7BA}79{G 'O,J$?nƝ:h$({6HǵkwN,o!A΄k׮W))̶bZw gAVΜ9YgΔ{o`F6mw:+"5dΝW.Cs@|}eI͚5ڵτ ]ڴiqi qEq/s| MXFsNv?]"Vd98Uv8jhOeY,7hРW>XPX!&B-BY:qxQb6cZw㻻'l 8Z%B'B-Bj|wBDE1N!!QGBgA-B9)Pb6;!?"7j|;w9ls!dEWa|wBq+E?s|wB1jB 5{FFFǎ6BjBꃕ+WΞ=w'C-BH#C|ߝB PRp|wBq !uEEEEll}8;!8Z:A>cƌUVm!/"gyB3Pb8;!T jB\ w'B-B>| !:P8;! jB\w'C-^?Ν;f}))]w'@-^hwJ?a!^NH- !P6Q[r.\Vzp|wB="N!Zj !ąPR=8;!jBw'C-Bp|wB Eq N!u!U !! 8;!)"8Bw RPb^ziٲeߝBjBl !~!Ĉ}ĉ#"RP=ˇ !~!p|wBE|%_e&-h62=ڪ!2SP㻿['O6BE|jsgv8>1Թ/36JBBe OaaO>ymN! Oѐ)gΤ. 3]s7ד=e|wN!& 1`Wް޾aցv@M.ddd=aÆyyyߝBjSN;)c8@޿ }Ƅ~}Ol/<]eYH9?'v /"ۧ$N!C-@F|ўON}PT~WiGxoy1hM9+ij_ !"DNM/D|PFKSp8A [+u w'wZħ m )w9}zq6K /An1ly%Z5~"DeΤޏ Љ^MllִaM־2lꨰl9qD[b:"|x qE~Hz?A:߬P}P h^T|=:? A}tHh,#^7}-sŵ}w'wZTptiG?;KzI蕈Yӆ奈yW{,Zn\?rs"PmO:꺃_6g@1h_ޣҥ{!71/}S[LWMĔLȑ+WoԏyK(!"rpRsxg}z EE#qE&~"2 *z^#D.(F8?7*\߸I!jRIP[TbN %iTlW_,}`#1;#E-b%FD]U2kB!fA-ׯFfˆ~f_vzxχ[2SGIE7־2Luvz-by_uB,}՛*!ZG`臇W{M+f.7wBѫ'wBEH|Ĕ̃OڈU ͶBGB-B͠[xFB!"&@yvv_B!> !B̄ZB!fB-B!3!BPB!LE!b&"B1jB! !B̄ZB!fB-B!3!BPB!LE!b&"nO2l++W=mB*q/bbbڴic>App&BZĽ󋌌4 B!!BPB!L|H={͛7Сٶ@YYY-=qDVVVDDDppü=zX? HCaA=uTxxxnp.` oݺu}V !iiӦ|ɒ%t޼yFbf.=zŪȗ wxl4K|'ƍ2\nH%ϝ;*!x>E\Uf[Q=PzO4I ȅKb^DDD^^])k)G:wpEjm0\^XX\ٳf+V4nޚ6mBCCBDdsBjJPl7QVVv 7oDYe]NHu tz{pppF[0JKK׭[Qb5..Q6lP)vH-,WVf/ſwEL>‡ 54tAHbm@@Ro6];3w\,ϙ3ol^ !xEPq? UVӧ*ƌ겴`ׂ FCO4 e*HԛUq8Q'{FP DPH3u9qleŊE7D!^jRBC% ?wv;6222>>*(P@ܸqcR`iӦ(?PDIJJB-NٳR"DKq"j'JW YW^7d3>j%%`ѣr!Ui.*Jag~PcI.]t*~n$j(Q "GNY@PHL؋sٳ%{Q єC 8hVVX!TAn sSSSq墰 ڳ Yڢp… ˔ܠ &x1!>E4K+EEE(5"ǧ=P' ܽ{ R޳VP_.)k̔ '_g%ZGQVVAa:B;yd>y+ +e=Ҿ" z;Y$c]vŒիWKC(9ow ! i`ٳKWk-"]-IIIRϛ7|мysCjnn… P6Ǽ>}ztfmⳒǢED赈R vIYfɰ%H 0i1 5z3(Jn{_'YtRD*FQ/uDavʗ5O<ݻwڴi9H! D|/ -)))hD r5lZwXX\t5!/4K]cǎ]bE~~>*j EFjY,B -K|͡Y*(`LVVW6~Cmرc.8zh;lذ3gjw=-T,N)SLEJNgղD\^^98;VZ RB>EluܸqRngQ-_|֬Y(d8WҀ]@%^h}v0ŅSO*9fY~b!PkcKskůVKP|J# 餑 Q3]I[=[nWBP~-Ua7E=;)rk;!x >E6l *J 'Ȭ%M6Eq/PݻW ѨQ#J?~QQh0c {h}#|^!s۷N3:tE ԣGr֭[* aٳg֗1b e@'):~:Uܚ\ o"h9jw{=>({*}ćD2 ǰB|"RPhY׌YEư?( :{]3 c*#;:Xyu6xUW \{9NpB5|HB! !BPB!L?z IENDB`